diff options
| author | Ajay Singh Parmar <aparmar@codeaurora.org> | 2014-09-03 16:28:46 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:33:42 -0700 |
| commit | 076e7000c9963dad8dd5aeb8fdde6efd3e71c03d (patch) | |
| tree | 0906a7ea53cdd1c3c44e8741edd297ffe21e1292 /drivers/video/fbdev | |
| parent | 2694dff22bb50110f15e99f472070aa5d6afa468 (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.c | 67 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_util.h | 3 |
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, |
