From 1cdd3036b1bfee5abf5c1cee1b5289fb12eb27dd Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Mon, 21 Feb 2022 17:46:03 +0800 Subject: [PATCH] drm/bridge: analogix_dp: Send hotplug uevent on modeset failure Signed-off-by: Wyon Bi Change-Id: Ib5db167aff5d8685b021790dcb7d79b63fbedebf --- drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 14 ++++++++++++++ drivers/gpu/drm/bridge/analogix/analogix_dp_core.h | 1 + 2 files changed, 15 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index 62d4e8f1ddbe..6740d0f67e21 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -1450,6 +1450,15 @@ out_dp_init: return ret; } +static void analogix_dp_modeset_retry_work_fn(struct work_struct *work) +{ + struct analogix_dp_device *dp = + container_of(work, typeof(*dp), modeset_retry_work); + + /* Send Hotplug uevent so userspace can reprobe */ + drm_kms_helper_hotplug_event(dp->bridge.dev); +} + static void analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) @@ -1488,6 +1497,9 @@ analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge, usleep_range(10, 11); } dev_err(dp->dev, "too many times retry set bridge, give it up\n"); + + /* Schedule a Hotplug Uevent to userspace to start modeset */ + schedule_work(&dp->modeset_retry_work); } static void analogix_dp_bridge_disable(struct drm_bridge *bridge) @@ -1872,6 +1884,7 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data) dp->dev = &pdev->dev; dp->dpms_mode = DRM_MODE_DPMS_OFF; + INIT_WORK(&dp->modeset_retry_work, analogix_dp_modeset_retry_work_fn); mutex_init(&dp->panel_lock); dp->panel_is_prepared = false; @@ -2010,6 +2023,7 @@ EXPORT_SYMBOL_GPL(analogix_dp_unbind); void analogix_dp_remove(struct analogix_dp_device *dp) { + cancel_work_sync(&dp->modeset_retry_work); } EXPORT_SYMBOL_GPL(analogix_dp_remove); diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h index 15fcce9a165f..322672b63dde 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -182,6 +182,7 @@ struct analogix_dp_device { bool force_hpd; bool fast_train_enable; bool psr_supported; + struct work_struct modeset_retry_work; struct mutex panel_lock; bool panel_is_prepared;