drm/bridge: analogix_dp: Send hotplug uevent on modeset failure

Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
Change-Id: Ib5db167aff5d8685b021790dcb7d79b63fbedebf
This commit is contained in:
Wyon Bi
2022-02-21 17:46:03 +08:00
committed by Tao Huang
parent 8e62d08c49
commit 1cdd3036b1
2 changed files with 15 additions and 0 deletions

View File

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

View File

@@ -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;