[PATCH v2 10/10] drm/bridge: analogix_dp: Handle HPD notification from downstream bridge
Damon Ding <[email protected]> Tue, 4 Aug 2026 16:17:17 +0800
| Newsgroups | org.infradead.lists.linux-rockchip,org.freedesktop.lists.dri-devel,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
When the display pipeline includes a display-connector bridge with hpd-gpios configured, the connector's hotplug status is managed by the display-connector bridge through its GPIO, not by the Analogix DP controller's native HPD. In this configuration, the DP controller's internal HPD polling in analogix_dp_detect_hpd() does not reflect the actual connection state. Implement the .hpd_notify bridge callback to receive connection status updates from downstream bridges. Cache the connection status in a connection_notified flag, and use it to short-circuit analogix_dp_detect_hpd() when a downstream bridge has already confirmed the connection. Signed-off-by: Damon Ding <[email protected]> --- .../gpu/drm/bridge/analogix/analogix_dp_core.c | 16 ++++++++++++++++ .../gpu/drm/bridge/analogix/analogix_dp_core.h | 1 + 2 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index a5a50b9ab8a7..f0476a60ece3 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -68,6 +68,13 @@ static int analogix_dp_detect_hpd(struct analogix_dp_device *dp) { int timeout_loop = 0; + /* + * Trust connection status from downstream bridge (e.g., + * display-connector with hpd-gpios). + */ + if (dp->plat_data->next_bridge && dp->connection_notified) + return 0; + while (timeout_loop < DP_TIMEOUT_LOOP_COUNT) { if (analogix_dp_get_plug_in_status(dp) == 0) return 0; @@ -1247,6 +1254,14 @@ static void analogix_dp_bridge_atomic_post_disable(struct drm_bridge *bridge, DRM_ERROR("Failed to enable psr (%d)\n", ret); } +static void analogix_dp_bridge_notify(struct drm_bridge *bridge, struct drm_connector *connector, + enum drm_connector_status status) +{ + struct analogix_dp_device *dp = to_dp(bridge); + + dp->connection_notified = (status == connector_status_connected); +} + static const struct drm_bridge_funcs analogix_dp_bridge_funcs = { .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, @@ -1259,6 +1274,7 @@ static const struct drm_bridge_funcs analogix_dp_bridge_funcs = { .attach = analogix_dp_bridge_attach, .edid_read = analogix_dp_bridge_edid_read, .detect = analogix_dp_bridge_detect, + .hpd_notify = analogix_dp_bridge_notify, }; static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h index bcb5674801a2..cd8a5d52f973 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h @@ -169,6 +169,7 @@ struct analogix_dp_device { bool fast_train_enable; bool psr_supported; bool last_bridge_is_panel; + bool connection_notified; u8 dpcd[DP_RECEIVER_CAP_SIZE]; -- 2.34.1 _______________________________________________ Linux-rockchip mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-rockchip