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); }