diff --git a/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_avp.c b/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_avp.c index 1dfccffa5..42a0b6e46 100644 --- a/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_avp.c +++ b/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_avp.c @@ -811,6 +811,12 @@ int dw_audio_on(void) struct dw_hdmi_dev_s *hdmi = dw_get_hdmi(); struct dw_audio_s *audio = &hdmi->audio_dev; + if (!dw_sink_support_audio()) { + hdmi_inf("sink does not advertise audio, skip audio enable\n"); + hdmi->audio_on = 0; + return 0; + } + _dw_audio_param_print(audio); ret = dw_hdmi_ctrl_update(); @@ -826,7 +832,7 @@ int dw_audio_on(void) } if (_dw_audio_check_params() == false) { - hdmi_err("dw audio check params is invalid!\n"); + hdmi_wrn("dw audio check params is invalid, skip audio path\n"); goto exit; } diff --git a/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.c b/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.c index 04e4bdc05..c9773ba77 100644 --- a/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.c +++ b/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.c @@ -981,6 +981,25 @@ bool dw_sink_support_scdc(void) return sink->edid_mHdmiForumvsdb.mSCDC_Present; } +int dw_sink_support_audio(void) +{ + struct sink_info_s *sink = dw_get_sink(); + + if (IS_ERR_OR_NULL(sink)) { + shdmi_err(sink); + return 0; + } + + /* + * Prefer CTA basic-audio bit, and fallback to SAD entries for sinks + * that only expose detailed audio descriptors. + */ + if (sink->edid_mBasicAudioSupport || sink->edid_mSadIndex > 0) + return 1; + + return 0; +} + int dw_sink_support_only_yuv420(u32 vic) { struct sink_info_s *sink = dw_get_sink(); diff --git a/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.h b/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.h index c97dc1eaa..1e644d435 100644 --- a/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.h +++ b/bsp/drivers/drm/sunxi_device/hardware/lowlevel_hdmi20/dw_edid.h @@ -51,6 +51,8 @@ int dw_sink_support_cea_vic(u32 code); bool dw_sink_support_scdc(void); +int dw_sink_support_audio(void); + int dw_edid_exit(void); int dw_edid_init(void);