From e4405c819bcb473f60e55c7f9295fcb256a23e8b Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Thu, 11 Aug 2022 18:56:40 +0800 Subject: [PATCH] drm/bridge: synopsys: dw-hdmi-qp: Workaround for Hisense TV This patch workaround for no sound issue on Hisense TV which seems to need AUDI ACR packet when initial stage. Signed-off-by: Sugar Zhang Change-Id: I192b631b29d33ad6571f70e062788c45b917803c --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c index 4fd1868f3ee9..63f8d538b564 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -568,6 +568,36 @@ void dw_hdmi_qp_set_channel_allocation(struct dw_hdmi_qp *hdmi, unsigned int ca) } EXPORT_SYMBOL_GPL(dw_hdmi_qp_set_channel_allocation); +static int dw_hdmi_qp_init_audio_infoframe(struct dw_hdmi_qp *hdmi) +{ + struct hdmi_audio_infoframe frame; + u8 infoframe_buf[HDMI_INFOFRAME_SIZE(AUDIO)]; + int ret = 0; + + hdmi_audio_infoframe_init(&frame); + + frame.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; + frame.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; + frame.sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM; + frame.channels = 2; + + ret = hdmi_audio_infoframe_pack(&frame, infoframe_buf, + sizeof(infoframe_buf)); + if (ret < 0) { + dev_err(hdmi->dev, "%s: Failed to pack audio infoframe: %d\n", + __func__, ret); + return ret; + } + + regmap_bulk_write(hdmi->regm, PKT_AUDI_CONTENTS1, &infoframe_buf[3], 2); + hdmi_modb(hdmi, + PKTSCHED_ACR_TX_EN | PKTSCHED_AUDI_TX_EN, + PKTSCHED_ACR_TX_EN | PKTSCHED_AUDI_TX_EN, + PKTSCHED_PKT_EN); + + return 0; +} + void dw_hdmi_qp_set_audio_infoframe(struct dw_hdmi_qp *hdmi, struct hdmi_codec_params *hparms) { @@ -2334,6 +2364,9 @@ static void dw_hdmi_qp_bridge_atomic_enable(struct drm_bridge *bridge, hdmi->dclk_en = true; mutex_unlock(&hdmi->audio_mutex); } + dw_hdmi_qp_init_audio_infoframe(hdmi); + dw_hdmi_qp_audio_enable(hdmi); + hdmi_clk_regenerator_update_pixel_clock(hdmi); extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, true); handle_plugged_change(hdmi, true);