From e514e77bdc086fa2c582e9fca5743e041dc29419 Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Thu, 10 Jan 2019 09:22:49 +0800 Subject: [PATCH] drm/bridge: synopsys: dw-hdmi: audio software reset after setup When playing NLPCM audio, such as AC3, HDMI is pluged in, it's better to reset audio fifo and sync audio clock by reselect audio input interface. Or sink may not recognize NLPCM format. Change-Id: I9112bc9aa1f57041e15b5be563ecb96c44644807 Signed-off-by: Zheng Yang --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 13 +++++++++++++ drivers/gpu/drm/bridge/synopsys/dw-hdmi.h | 1 + 2 files changed, 14 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 7fe1e681880c..68d998526071 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -2171,6 +2171,19 @@ static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi) val = hdmi_readb(hdmi, HDMI_FC_INVIDCONF); for (i = 0; i < count; i++) hdmi_writeb(hdmi, val, HDMI_FC_INVIDCONF); + + /* Audio software reset */ + if (hdmi->sink_has_audio) { + val = hdmi_readb(hdmi, HDMI_AUD_CONF0); + val &= HDMI_AUD_CONF0_I2S_SELECT_MASK; + hdmi_modb(hdmi, ~val, HDMI_AUD_CONF0_I2S_SELECT_MASK, + HDMI_AUD_CONF0); + udelay(10); + hdmi_modb(hdmi, val | HDMI_AUD_CONF0_SW_RESET, + HDMI_AUD_CONF0_SW_RESET | + HDMI_AUD_CONF0_I2S_SELECT_MASK, + HDMI_AUD_CONF0); + } } static void hdmi_enable_overflow_interrupts(struct dw_hdmi *hdmi) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h index 099b621f8ce3..bb53a5c0d804 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h @@ -976,6 +976,7 @@ enum { /* AUD_CONF0 field values */ HDMI_AUD_CONF0_SW_RESET = 0x80, + HDMI_AUD_CONF0_I2S_SELECT_MASK = 0x20, HDMI_AUD_CONF0_I2S_2CHANNEL_ENABLE = 0x21, HDMI_AUD_CONF0_I2S_4CHANNEL_ENABLE = 0x23, HDMI_AUD_CONF0_I2S_6CHANNEL_ENABLE = 0x27,