From f6800c8bd6b5dca1ef6021e58815116c8d740510 Mon Sep 17 00:00:00 2001 From: Shunqing Chen Date: Thu, 15 Oct 2020 09:30:23 +0800 Subject: [PATCH] drm: bridge: dw-hdmi: Fix the issue of EXTCON_DISP_HDMI state error First, echo off > sys/class/drm/card0-HDMI-A-1/status, the EXTCON_DISP_HDMI state is 0. Then, echo detect > sys/class/drm/card0-HDMI-A-1/status, the EXTCON_DISP_HDMI state still is 0. As a result, HDMI has no sound. Signed-off-by: Shunqing Chen Change-Id: I6d7904cb75fec21899389dbaba8acbd266dac7cd --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index b40a5b84ff74..d70f0eb4c5e6 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -373,8 +373,6 @@ static void repo_hpd_event(struct work_struct *p_work) ktime_get()); #endif } - - extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, hdmi->hpd_state); } static bool check_hdmi_irq(struct dw_hdmi *hdmi, int intr_stat, @@ -2621,6 +2619,7 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force) { struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, connector); + int connect_status; mutex_lock(&hdmi->mutex); hdmi->force = DRM_FORCE_UNSPECIFIED; @@ -2628,7 +2627,13 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force) dw_hdmi_update_phy_mask(hdmi); mutex_unlock(&hdmi->mutex); - return hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); + connect_status = hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); + if (connect_status == connector_status_connected) + extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, true); + else + extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, false); + + return connect_status; } static int @@ -2817,11 +2822,11 @@ static void dw_hdmi_connector_force(struct drm_connector *connector) mutex_lock(&hdmi->mutex); - if (!hdmi->disabled && hdmi->force != connector->force) { - if (connector->force == DRM_FORCE_OFF) + if (hdmi->force != connector->force) { + if (!hdmi->disabled && connector->force == DRM_FORCE_OFF) extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, false); - else if (connector->force == DRM_FORCE_ON) + else if (hdmi->disabled && connector->force == DRM_FORCE_ON) extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, true); }