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,