On Fri, Jul 11, 2025 at 05:58:06PM -0700, Jessica Zhang wrote:
> Add a boolean to track whether the DP cable is physically plugged in.

I think there is more than that. Other drivers check that there is
actually something connected (so checking the sink count, etc.). See
Mediatek or IT6505 drivers, they have simple examples.

> Signed-off-by: Jessica Zhang <jessica.zh...@oss.qualcomm.com>
> ---
>  drivers/gpu/drm/msm/dp/dp_display.c | 11 ++++++++++-
>  drivers/gpu/drm/msm/dp/dp_display.h |  1 +
>  2 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
> b/drivers/gpu/drm/msm/dp/dp_display.c
> index d87d47cc7ec3..6945df782f7b 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.c
> +++ b/drivers/gpu/drm/msm/dp/dp_display.c
> @@ -531,6 +531,7 @@ static int 
> msm_dp_display_handle_port_status_changed(struct msm_dp_display_priva
>                       rc = msm_dp_display_process_hpd_high(dp);
>                       if (rc)
>                               dp->hpd_state = ST_DISCONNECTED;
> +                     dp->msm_dp_display.connected = true;
>               }
>       }
>  
> @@ -604,6 +605,8 @@ static int msm_dp_hpd_plug_handle(struct 
> msm_dp_display_private *dp, u32 data)
>               return 0;
>       }
>  
> +     dp->msm_dp_display.connected = true;
> +
>       if (state == ST_DISCONNECT_PENDING) {
>               /* wait until ST_DISCONNECTED */
>               msm_dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay = 1 */
> @@ -621,6 +624,7 @@ static int msm_dp_hpd_plug_handle(struct 
> msm_dp_display_private *dp, u32 data)
>       ret = msm_dp_display_usbpd_configure_cb(&pdev->dev);
>       if (ret) {      /* link train failed */
>               dp->hpd_state = ST_DISCONNECTED;
> +             dp->msm_dp_display.connected = false;
>               pm_runtime_put_sync(&pdev->dev);
>       } else {
>               dp->hpd_state = ST_MAINLINK_READY;
> @@ -662,6 +666,8 @@ static int msm_dp_hpd_unplug_handle(struct 
> msm_dp_display_private *dp, u32 data)
>       drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n",
>                       dp->msm_dp_display.connector_type, state);
>  
> +     dp->msm_dp_display.connected = false;
> +
>       /* unplugged, no more irq_hpd handle */
>       msm_dp_del_event(dp, EV_IRQ_HPD_INT);
>  
> @@ -680,6 +686,7 @@ static int msm_dp_hpd_unplug_handle(struct 
> msm_dp_display_private *dp, u32 data)
>               msm_dp_ctrl_off_link(dp->ctrl);
>               msm_dp_display_host_phy_exit(dp);
>               dp->hpd_state = ST_DISCONNECTED;
> +             dp->msm_dp_display.connected = false;
>               msm_dp_display_notify_disconnect(&dp->msm_dp_display.pdev->dev);
>               pm_runtime_put_sync(&pdev->dev);
>               mutex_unlock(&dp->event_mutex);
> @@ -1596,8 +1603,10 @@ void msm_dp_bridge_atomic_enable(struct drm_bridge 
> *drm_bridge,
>               return;
>       }
>  
> -     if (dp->is_edp)
> +     if (dp->is_edp) {
>               msm_dp_hpd_plug_handle(msm_dp_display, 0);
> +             dp->connected = true;
> +     }

So, are we returning 'disconnected' for eDP panels up to the
atomic_enable() point? Then nobody will ever enable it.

>  
>       mutex_lock(&msm_dp_display->event_mutex);
>       if (pm_runtime_resume_and_get(&dp->pdev->dev)) {
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.h 
> b/drivers/gpu/drm/msm/dp/dp_display.h
> index cc6e2cab36e9..68bd8be19463 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;
> +     bool connected;
>       bool link_ready;
>       bool audio_enabled;
>       bool power_on;
> 
> -- 
> 2.50.1
> 

-- 
With best wishes
Dmitry

Reply via email to