summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJessica Zhang <jessica.zhang@oss.qualcomm.com>2026-05-24 13:33:33 +0300
committerDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>2026-05-29 14:58:52 +0300
commit168dacddc3f41ba593e2a297ab1b93bf0d8dbe9f (patch)
tree135e67de41f8c2bb071f43572061ab3f37e0c8ae
parent6fe5a253d7ea94e6926f61f360c785a1d8c2d9f7 (diff)
downloadlinux-next-168dacddc3f41ba593e2a297ab1b93bf0d8dbe9f.tar.gz
linux-next-168dacddc3f41ba593e2a297ab1b93bf0d8dbe9f.zip
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
-rw-r--r--drivers/gpu/drm/msm/dp/dp_display.c28
-rw-r--r--drivers/gpu/drm/msm/dp/dp_display.h1
-rw-r--r--drivers/gpu/drm/msm/dp/dp_drm.c2
3 files changed, 11 insertions, 20 deletions
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 1745735b3eb2..8bf8c4099bbc 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -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;
}
diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h
index cc6e2cab36e9..60094061c102 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.h
+++ b/drivers/gpu/drm/msm/dp/dp_display.h
@@ -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;
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
index e4622c85fb66..f935093c4df4 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.c
+++ b/drivers/gpu/drm/msm/dp/dp_drm.c
@@ -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;
}