summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorAjay Singh Parmar <aparmar@codeaurora.org>2014-09-03 16:28:46 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:33:42 -0700
commit076e7000c9963dad8dd5aeb8fdde6efd3e71c03d (patch)
tree0906a7ea53cdd1c3c44e8741edd297ffe21e1292 /drivers/video/fbdev
parent2694dff22bb50110f15e99f472070aa5d6afa468 (diff)
msm: mdss: hdmi: tear down audio at bootup if already started
Shutdown the audio session while booting up if already started as part of continuous splash screen. Change-Id: I0db7edba6dd3726721d827c0375574fb77809b93 Signed-off-by: Ajay Singh Parmar <aparmar@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_tx.c67
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_util.h3
2 files changed, 70 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_tx.c b/drivers/video/fbdev/msm/mdss_hdmi_tx.c
index a2af3756be4e..d026c8fa3923 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_tx.c
+++ b/drivers/video/fbdev/msm/mdss_hdmi_tx.c
@@ -55,6 +55,8 @@
#define AUDIO_POLL_SLEEP_US (5 * 1000)
#define AUDIO_POLL_TIMEOUT_US (AUDIO_POLL_SLEEP_US * 1000)
+#define LPA_DMA_IDLE_MAX 200
+
#define IFRAME_CHECKSUM_32(d) \
((d & 0xff) + ((d >> 8) & 0xff) + \
((d >> 16) & 0xff) + ((d >> 24) & 0xff))
@@ -4068,6 +4070,69 @@ error:
return rc;
} /* hdmi_tx_get_dt_data */
+static void hdmi_tx_audio_tear_down(struct hdmi_tx_ctrl *hdmi_ctrl)
+{
+ struct dss_io_data *io;
+ u32 audio_pkt_ctrl;
+ u32 audio_eng_cfg;
+
+ if (!hdmi_ctrl) {
+ DEV_ERR("%s: invalid input\n", __func__);
+ return;
+ }
+
+ io = &hdmi_ctrl->pdata.io[HDMI_TX_CORE_IO];
+ if (!io->base) {
+ DEV_ERR("%s: Core io is not initialized\n", __func__);
+ return;
+ }
+
+ audio_pkt_ctrl = DSS_REG_R(io, HDMI_AUDIO_PKT_CTRL);
+ audio_eng_cfg = DSS_REG_R(io, HDMI_AUDIO_CFG);
+
+ if ((audio_pkt_ctrl & BIT(0)) || (audio_eng_cfg & BIT(0))) {
+ u32 lpa_dma, i = 0;
+
+ void __iomem *lpa_base = ioremap(LPASS_LPAIF_RDDMA_CTL0, 0xFF);
+
+ lpa_dma = readl_relaxed(lpa_base + LPASS_LPAIF_RDDMA_PER_CNT0);
+
+ /* Disable audio packet transmission */
+ DSS_REG_W(io, HDMI_AUDIO_PKT_CTRL,
+ DSS_REG_R(io, HDMI_AUDIO_PKT_CTRL) & ~BIT(0));
+
+ /* Wait for LPA DMA Engine to be idle */
+ while (i < LPA_DMA_IDLE_MAX) {
+ u32 val;
+
+ /*
+ * sleep for minimum HW recommended time
+ * for HW status to update.
+ */
+ msleep(20);
+
+ val = readl_relaxed(lpa_base +
+ LPASS_LPAIF_RDDMA_PER_CNT0);
+ if (val == lpa_dma)
+ break;
+
+ lpa_dma = val;
+ i++;
+ }
+
+ DEV_DBG("%s: LPA DMA idle after %d ms\n", __func__, i * 20);
+
+ /* Disable audio engine */
+ DSS_REG_W(io, HDMI_AUDIO_CFG,
+ DSS_REG_R(io, HDMI_AUDIO_CFG) & ~BIT(0));
+
+ /* Disable LPA DMA Engine */
+ writel_relaxed(readl_relaxed(lpa_base) & ~BIT(0), lpa_base);
+
+ iounmap(lpa_base);
+ }
+}
+
static int hdmi_tx_probe(struct platform_device *pdev)
{
int rc = 0, i;
@@ -4171,6 +4236,8 @@ static int hdmi_tx_probe(struct platform_device *pdev)
hdmi_ctrl->pdata.power_data[i].clk_config,
hdmi_ctrl->pdata.power_data[i].num_clk, 1);
}
+
+ hdmi_tx_audio_tear_down(hdmi_ctrl);
}
return rc;
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_util.h b/drivers/video/fbdev/msm/mdss_hdmi_util.h
index aa6c9cfca881..1cfec593005c 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_util.h
+++ b/drivers/video/fbdev/msm/mdss_hdmi_util.h
@@ -229,6 +229,9 @@
#define FRAME_PACKING 0x20
#define SIDE_BY_SIDE_HALF 0x40
+#define LPASS_LPAIF_RDDMA_CTL0 (0xFE152000)
+#define LPASS_LPAIF_RDDMA_PER_CNT0 (0x00000014)
+
enum hdmi_tx_feature_type {
HDMI_TX_FEAT_EDID,
HDMI_TX_FEAT_HDCP,