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>
This commit is contained in:
Ajay Singh Parmar 2014-09-03 16:28:46 -07:00 committed by David Keitel
parent 2694dff22b
commit 076e7000c9
2 changed files with 70 additions and 0 deletions

View file

@ -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;

View file

@ -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,