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:
parent
2694dff22b
commit
076e7000c9
2 changed files with 70 additions and 0 deletions
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue