drm/msm/dp: Drop EV_USER_NOTIFICATION

Currently, we queue an event for signalling HPD connect/disconnect. This
can mean a delay in plug/unplug handling and notifying DRM core when a
hotplug happens.

Drop EV_USER_NOTIFICATION and signal the IRQ event as part of hotplug
handling.

Signed-off-by: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Acked-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Tested-by: Val Packett <val@packett.cool> # x1e80100-dell-latitude-7455
Tested-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> # Hamoa IOT EVK, QCS8300 Ride
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Patchwork: https://patchwork.freedesktop.org/patch/727607/
Link: https://lore.kernel.org/r/20260524-hpd-refactor-v6-5-cf3ab488dd7b@oss.qualcomm.com
This commit is contained in:
Jessica Zhang 2026-05-24 13:33:33 +03:00 committed by Dmitry Baryshkov
parent 6fe5a253d7
commit 168dacddc3
3 changed files with 11 additions and 20 deletions

View File

@ -58,7 +58,6 @@ enum {
EV_HPD_PLUG_INT,
EV_IRQ_HPD_INT,
EV_HPD_UNPLUG_INT,
EV_USER_NOTIFICATION,
};
#define EVENT_TIMEOUT (HZ/10) /* 100ms */
@ -344,17 +343,6 @@ static const struct component_ops msm_dp_display_comp_ops = {
.unbind = msm_dp_display_unbind,
};
static void msm_dp_display_send_hpd_event(struct msm_dp *msm_dp_display)
{
struct msm_dp_display_private *dp;
struct drm_connector *connector;
dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
connector = dp->msm_dp_display.connector;
drm_helper_hpd_irq_event(connector->dev);
}
static int msm_dp_display_send_hpd_notification(struct msm_dp_display_private *dp,
bool hpd)
{
@ -378,7 +366,11 @@ static int msm_dp_display_send_hpd_notification(struct msm_dp_display_private *d
drm_dbg_dp(dp->drm_dev, "type=%d hpd=%d\n",
dp->msm_dp_display.connector_type, hpd);
msm_dp_display_send_hpd_event(&dp->msm_dp_display);
drm_bridge_hpd_notify(dp->msm_dp_display.bridge,
hpd ?
connector_status_connected :
connector_status_disconnected);
return 0;
}
@ -438,7 +430,7 @@ static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp)
msm_dp_link_reset_phy_params_vx_px(dp->link);
msm_dp_add_event(dp, EV_USER_NOTIFICATION, true, 0);
msm_dp_display_send_hpd_notification(dp, true);
end:
return rc;
@ -507,7 +499,7 @@ static int msm_dp_display_notify_disconnect(struct device *dev)
{
struct msm_dp_display_private *dp = dev_get_dp_display_private(dev);
msm_dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
msm_dp_display_send_hpd_notification(dp, false);
return 0;
}
@ -528,7 +520,7 @@ static int msm_dp_display_handle_port_status_changed(struct msm_dp_display_priva
drm_dbg_dp(dp->drm_dev, "sink count is zero, nothing to do\n");
if (dp->hpd_state != ST_DISCONNECTED) {
dp->hpd_state = ST_DISCONNECT_PENDING;
msm_dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
msm_dp_display_send_hpd_notification(dp, false);
}
} else {
if (dp->hpd_state == ST_DISCONNECTED) {
@ -1122,10 +1114,6 @@ static int hpd_event_thread(void *data)
case EV_IRQ_HPD_INT:
msm_dp_irq_hpd_handle(msm_dp_priv, todo->data);
break;
case EV_USER_NOTIFICATION:
msm_dp_display_send_hpd_notification(msm_dp_priv,
todo->data);
break;
default:
break;
}

View File

@ -16,6 +16,7 @@ struct msm_dp {
struct platform_device *pdev;
struct drm_connector *connector;
struct drm_bridge *next_bridge;
struct drm_bridge *bridge;
bool link_ready;
bool audio_enabled;
bool power_on;

View File

@ -340,6 +340,8 @@ int msm_dp_bridge_init(struct msm_dp *msm_dp_display, struct drm_device *dev,
}
}
msm_dp_display->bridge = bridge;
return 0;
}