From c1754005a359e74faade0f27d3e2bf4402a8f40f Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Tue, 10 May 2022 06:41:06 +0000 Subject: [PATCH] drm/bridge: analogix_dp: Support split mode for bridge chain Signed-off-by: Wyon Bi Change-Id: I22ec16f8b12213d3adf1929bd49e2437085b2485 --- .../gpu/drm/bridge/analogix/analogix_dp_core.c | 15 ++++++++++++++- drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index 158107745419..e1e292626250 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -1147,6 +1147,9 @@ static int analogix_dp_get_modes(struct drm_connector *connector) if (dp->plat_data->panel) num_modes += drm_panel_get_modes(dp->plat_data->panel, connector); + if (dp->plat_data->bridge) + num_modes += drm_bridge_get_modes(dp->plat_data->bridge, connector); + if (!num_modes) { ret = analogix_dp_phy_power_on(dp); if (ret) @@ -1251,6 +1254,13 @@ analogix_dp_detect(struct analogix_dp_device *dp) status = connector_status_connected; } + if (dp->plat_data->bridge) { + struct drm_bridge *next_bridge = dp->plat_data->bridge; + + if (next_bridge->ops & DRM_BRIDGE_OP_DETECT) + status = drm_bridge_detect(next_bridge); + } + out: analogix_dp_phy_power_off(dp); @@ -1734,8 +1744,11 @@ static int analogix_dp_bridge_init(struct analogix_dp_device *dp) if (dp->plat_data->right) { struct analogix_dp_device *secondary = dp->plat_data->right; + struct drm_bridge *last_bridge = + list_last_entry(&bridge->encoder->bridge_chain, + struct drm_bridge, chain_node); - ret = drm_bridge_attach(dp->encoder, &secondary->bridge, bridge, + ret = drm_bridge_attach(dp->encoder, &secondary->bridge, last_bridge, DRM_BRIDGE_ATTACH_NO_CONNECTOR); if (ret) return ret; diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 0e83f9e59a0e..cd044af50ea2 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -251,6 +251,9 @@ static bool rockchip_dp_skip_connector(struct drm_bridge *bridge) if (of_device_is_compatible(bridge->of_node, "dp-connector")) return false; + if (bridge->ops & DRM_BRIDGE_OP_MODES) + return false; + return true; }