* [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver
@ 2025-12-17 9:33 Damon Ding
2025-12-17 9:33 ` [PATCH v8 01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities Damon Ding
` (16 more replies)
0 siblings, 17 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
PATCH 1 is to ensure the last bridge declares OP_EDID or OP_MODES or both.
PATCH 2 is a small format optimization for struct analogid_dp_device.
PATCH 3 is to perform mode setting in &drm_bridge_funcs.atomic_enable.
PATCH 4 is to add a new parameter to store the point of next bridge.
PATCH 5 is to make legacy bridge driver more universal.
PATCH 6-11 are preparations for apply drm_bridge_connector helper.
PATCH 12 is to apply the drm_bridge_connector helper.
PATCH 13-15 are to move the panel/bridge parsing to the Analogix side.
PATCH 16 is to attach the next bridge on Analogix side uniformly.
PATCH 17-18 are to apply the panel_bridge helper.
The following reviewed commits, which to make codes more concise, are
rebased to the front of this patch series:
https://lore.kernel.org/all/20251110085823.1197472-1-damon.ding@rock-chips.com/
https://lore.kernel.org/all/20251111022103.1350183-1-damon.ding@rock-chips.com/
Damon Ding (18):
drm/display: bridge_connector: Ensure last bridge determines
EDID/modes detection capabilities
drm/bridge: analogix_dp: Formalize the struct analogix_dp_device
drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to
&drm_bridge_funcs.atomic_enable
drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge
drm/bridge: Move legacy bridge driver out of imx directory for
multi-platform use
drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge
drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector
drm/exynos: exynos_dp: Apply of-display-mode-bridge to parse the
display-timings node
drm/bridge: analogix_dp: Remove redundant
&analogix_dp_plat_data.skip_connector
drm/bridge: analogix_dp: Move the color format check to
.atomic_check() for Rockchip platforms
drm/bridge: analogix_dp: Remove unused
&analogix_dp_plat_data.get_modes()
drm/bridge: analogix_dp: Apply drm_bridge_connector helper
drm/bridge: analogix_dp: Add new API analogix_dp_finish_probe()
drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe()
drm/exynos: exynos_dp: Apply analogix_dp_finish_probe()
drm/bridge: analogix_dp: Attach the next bridge in
analogix_dp_bridge_attach()
drm/bridge: analogix_dp: Remove bridge disabing and panel unpreparing
in analogix_dp_unbind()
drm/bridge: analogix_dp: Apply panel_bridge helper
drivers/gpu/drm/bridge/Kconfig | 10 +
drivers/gpu/drm/bridge/Makefile | 1 +
drivers/gpu/drm/bridge/analogix/Kconfig | 1 +
.../drm/bridge/analogix/analogix_dp_core.c | 395 +++++++++---------
.../drm/bridge/analogix/analogix_dp_core.h | 5 +-
drivers/gpu/drm/bridge/imx/Kconfig | 10 -
drivers/gpu/drm/bridge/imx/Makefile | 1 -
.../gpu/drm/bridge/imx/imx-legacy-bridge.c | 91 ----
.../gpu/drm/bridge/of-display-mode-bridge.c | 93 +++++
.../gpu/drm/display/drm_bridge_connector.c | 18 +-
drivers/gpu/drm/exynos/Kconfig | 2 +
drivers/gpu/drm/exynos/exynos_dp.c | 110 ++---
drivers/gpu/drm/imx/ipuv3/Kconfig | 4 +-
drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 6 +-
drivers/gpu/drm/imx/ipuv3/parallel-display.c | 5 +-
drivers/gpu/drm/rockchip/Kconfig | 1 +
.../gpu/drm/rockchip/analogix_dp-rockchip.c | 67 +--
include/drm/bridge/analogix_dp.h | 8 +-
include/drm/bridge/imx.h | 17 -
include/drm/bridge/of-display-mode-bridge.h | 17 +
20 files changed, 391 insertions(+), 471 deletions(-)
delete mode 100644 drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c
create mode 100644 drivers/gpu/drm/bridge/of-display-mode-bridge.c
delete mode 100644 include/drm/bridge/imx.h
create mode 100644 include/drm/bridge/of-display-mode-bridge.h
---
Changes in v2:
- Update Exynos DP driver synchronously.
- Move the panel/bridge parsing to the Analogix side.
Changes in v3:
- Rebase for the existing devm_drm_bridge_alloc() applying commit.
- Fix the typographical error of panel/bridge check in exynos_dp_bind().
- Squash all commits related to skip_connector deletion in both Exynos and
Analogix code into one.
- Apply panel_bridge helper to make the codes more concise.
- Fix the handing of bridge in analogix_dp_bridge_get_modes().
- Remove unnecessary parameter struct drm_connector* for callback
&analogix_dp_plat_data.attach().
- In order to decouple the connector driver and the bridge driver, move
the bridge connector initilization to the Rockchip and Exynos sides.
Changes in v4:
- Rebase for the applied &drm_bridge_funcs.detect() modification commit.
- Rename analogix_dp_find_panel_or_bridge() to analogix_dp_finish_probe().
- Drop the drmm_encoder_init() modification commit.
- Rename the &analogix_dp_plat_data.bridge to
&analogix_dp_plat_data.next_bridge.
Changes in v5:
- Add legacy bridge to parse the display-timings node under the dp node
for Exynos side.
- Move color format check to &drm_connector_helper_funcs.atomic_check()
in order to get rid of &analogix_dp_plat_data.get_modes().
- Remove unused callback &analogix_dp_plat_data.get_modes().
- Distinguish the &drm_bridge->ops of Analogix bridge based on whether
the downstream device is a panel, a bridge or neither.
- Select DRM_DISPLAY_DP_AUX_BUS for DRM_ANALOGIX_DP, and remove it for
ROCKCHIP_ANALOGIX_DP.
- Apply rockchip_dp_attach() to support the next bridge attachment for
the Rockchip side.
- Move next_bridge attachment from Analogix side to Rockchip/Exynos sides.
Changes in v6:
- Move legacy bridge driver out of imx directory for multi-platform use.
- Apply DRM legacy bridge to parse display timings intead of implementing
the same codes only for Exynos DP.
- Ensure last bridge determines EDID/modes detection capabilities in DRM
bridge_connector driver.
- Remove unnecessary drm_bridge_get_modes() in
analogix_dp_bridge_get_modes().
- Simplify analogix_dp_bridge_edid_read().
- If the next is a bridge, set DRM_BRIDGE_OP_DETECT and return
connector_status_connected in analogix_dp_bridge_detect().
- Set flag DRM_BRIDGE_ATTACH_NO_CONNECTOR for bridge attachment while
binding. Meanwhile, make DRM_BRIDGE_ATTACH_NO_CONNECTOR unsuppported
in analogix_dp_bridge_attach().
- Move the next bridge attachment to the Analogix side rather than
scattered on Rockchip and Exynos sides.
- Remove the unnecessary analogix_dp_bridge_get_modes().
- Squash [PATCH v5 15/17] into [PATCH v5 17/17].
- Fix the &drm_bridge->ops to DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT.
Changes in v7:
- As Luca suggested, simplify the code and related comment for bridge_connector
modifications. Additionally, move the commit related to bridge_connector to
the top of this patch series.
- Rename legacy-bridge driver to of-display-mode-bridge driver.
- Remove unnecessary API drm_bridge_is_legacy() and apply a temporary flag
&exynos_dp_device.has_of_bridge instead, which will be removed finally.
- Remove exynos_dp_legacy_bridge_init() and inline API
devm_drm_of_display_mode_bridge().
Changes in v8:
- Adapt the related modifications to the newest bridge_connector driver.
--
2.34.1
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH v8 01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-31 10:50 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 02/18] drm/bridge: analogix_dp: Formalize the struct analogix_dp_device Damon Ding
` (15 subsequent siblings)
16 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
When multiple bridges are present, EDID detection capability
(DRM_BRIDGE_OP_EDID) takes precedence over modes detection
(DRM_BRIDGE_OP_MODES). To ensure the above two capabilities are
determined by the last bridge in the chain, we handle three cases:
Case 1: The later bridge declares only DRM_BRIDGE_OP_MODES
- If the previous bridge declares DRM_BRIDGE_OP_EDID, set
&drm_bridge_connector.bridge_edid to NULL and set
&drm_bridge_connector.bridge_modes to the later bridge.
- Ensure modes detection capability of the later bridge will not
be ignored.
Case 2: The later bridge declares only DRM_BRIDGE_OP_EDID
- If the previous bridge declares DRM_BRIDGE_OP_MODES, set
&drm_bridge_connector.bridge_modes to NULL and set
&drm_bridge_connector.bridge_edid to the later bridge.
- Although EDID detection capability has higher priority, this
operation is for balance and makes sense.
Case 3: the later bridge declares both of them
- Assign later bridge as &drm_bridge_connector.bridge_edid and
and &drm_bridge_connector.bridge_modes to this bridge.
- Just leave transfer of these two capabilities as before.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
Changes in v7:
- As Luca suggested, simplify the code and related comment.
Changes in v8:
- Adapt the modifications to the newest bridge_connector driver.
---
drivers/gpu/drm/display/drm_bridge_connector.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
index a2d30cf9e06d..92b9e8ec520d 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -690,9 +690,19 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
if (!bridge->ycbcr_420_allowed)
connector->ycbcr_420_allowed = false;
- if (bridge->ops & DRM_BRIDGE_OP_EDID) {
+ /*
+ * Ensure the last bridge declares OP_EDID or OP_MODES or both.
+ */
+ if (bridge->ops & DRM_BRIDGE_OP_EDID || bridge->ops & DRM_BRIDGE_OP_MODES) {
drm_bridge_put(bridge_connector->bridge_edid);
- bridge_connector->bridge_edid = drm_bridge_get(bridge);
+ bridge_connector->bridge_edid = NULL;
+ drm_bridge_put(bridge_connector->bridge_modes);
+ bridge_connector->bridge_modes = NULL;
+
+ if (bridge->ops & DRM_BRIDGE_OP_EDID)
+ bridge_connector->bridge_edid = drm_bridge_get(bridge);
+ if (bridge->ops & DRM_BRIDGE_OP_MODES)
+ bridge_connector->bridge_modes = drm_bridge_get(bridge);
}
if (bridge->ops & DRM_BRIDGE_OP_HPD) {
drm_bridge_put(bridge_connector->bridge_hpd);
@@ -702,10 +712,6 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
drm_bridge_put(bridge_connector->bridge_detect);
bridge_connector->bridge_detect = drm_bridge_get(bridge);
}
- if (bridge->ops & DRM_BRIDGE_OP_MODES) {
- drm_bridge_put(bridge_connector->bridge_modes);
- bridge_connector->bridge_modes = drm_bridge_get(bridge);
- }
if (bridge->ops & DRM_BRIDGE_OP_HDMI) {
if (bridge_connector->bridge_hdmi)
return ERR_PTR(-EBUSY);
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 02/18] drm/bridge: analogix_dp: Formalize the struct analogix_dp_device
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
2025-12-17 9:33 ` [PATCH v8 01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2026-01-31 12:52 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 03/18] drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to &drm_bridge_funcs.atomic_enable Damon Ding
` (14 subsequent siblings)
16 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
Use the tap instead of the space for &analogix_dp_device.aux and
&analogix_dp_device.force_hpd.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/gpu/drm/bridge/analogix/analogix_dp_core.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
index b86e93f30ed6..91b215c6a0cf 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -156,7 +156,7 @@ struct analogix_dp_device {
struct drm_device *drm_dev;
struct drm_connector connector;
struct drm_bridge bridge;
- struct drm_dp_aux aux;
+ struct drm_dp_aux aux;
struct clk *clock;
unsigned int irq;
void __iomem *reg_base;
@@ -166,7 +166,7 @@ struct analogix_dp_device {
struct phy *phy;
int dpms_mode;
struct gpio_desc *hpd_gpiod;
- bool force_hpd;
+ bool force_hpd;
bool fast_train_enable;
bool psr_supported;
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 03/18] drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to &drm_bridge_funcs.atomic_enable
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
2025-12-17 9:33 ` [PATCH v8 01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities Damon Ding
2025-12-17 9:33 ` [PATCH v8 02/18] drm/bridge: analogix_dp: Formalize the struct analogix_dp_device Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2026-01-31 12:50 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge Damon Ding
` (13 subsequent siblings)
16 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
According to the include/drm/drm_bridge.h, the callback
&drm_bridge_funcs.mode_set is deprecated and it should be better to
include the mode setting in the &drm_bridge_funcs.atomic_enable instead.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
.../drm/bridge/analogix/analogix_dp_core.c | 161 +++++++++---------
1 file changed, 82 insertions(+), 79 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 1e834d3656c1..3caa47d31649 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1086,12 +1086,88 @@ static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
return ret;
}
+static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge,
+ const struct drm_display_mode *mode)
+{
+ struct analogix_dp_device *dp = to_dp(bridge);
+ struct drm_display_info *display_info = &dp->connector.display_info;
+ struct video_info *video = &dp->video_info;
+ struct device_node *dp_node = dp->dev->of_node;
+ int vic;
+
+ /* Input video interlaces & hsync pol & vsync pol */
+ video->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
+ video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);
+ video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC);
+
+ /* Input video dynamic_range & colorimetry */
+ vic = drm_match_cea_mode(mode);
+ if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) ||
+ (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) {
+ video->dynamic_range = CEA;
+ video->ycbcr_coeff = COLOR_YCBCR601;
+ } else if (vic) {
+ video->dynamic_range = CEA;
+ video->ycbcr_coeff = COLOR_YCBCR709;
+ } else {
+ video->dynamic_range = VESA;
+ video->ycbcr_coeff = COLOR_YCBCR709;
+ }
+
+ /* Input vide bpc and color_formats */
+ switch (display_info->bpc) {
+ case 12:
+ video->color_depth = COLOR_12;
+ break;
+ case 10:
+ video->color_depth = COLOR_10;
+ break;
+ case 8:
+ video->color_depth = COLOR_8;
+ break;
+ case 6:
+ video->color_depth = COLOR_6;
+ break;
+ default:
+ video->color_depth = COLOR_8;
+ break;
+ }
+ if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR444)
+ video->color_space = COLOR_YCBCR444;
+ else if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422)
+ video->color_space = COLOR_YCBCR422;
+ else
+ video->color_space = COLOR_RGB;
+
+ /*
+ * NOTE: those property parsing code is used for providing backward
+ * compatibility for samsung platform.
+ * Due to we used the "of_property_read_u32" interfaces, when this
+ * property isn't present, the "video_info" can keep the original
+ * values and wouldn't be modified.
+ */
+ of_property_read_u32(dp_node, "samsung,color-space",
+ &video->color_space);
+ of_property_read_u32(dp_node, "samsung,dynamic-range",
+ &video->dynamic_range);
+ of_property_read_u32(dp_node, "samsung,ycbcr-coeff",
+ &video->ycbcr_coeff);
+ of_property_read_u32(dp_node, "samsung,color-depth",
+ &video->color_depth);
+ if (of_property_read_bool(dp_node, "hsync-active-high"))
+ video->h_sync_polarity = true;
+ if (of_property_read_bool(dp_node, "vsync-active-high"))
+ video->v_sync_polarity = true;
+ if (of_property_read_bool(dp_node, "interlaced"))
+ video->interlaced = true;
+}
+
static void analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge,
struct drm_atomic_state *old_state)
{
struct analogix_dp_device *dp = to_dp(bridge);
struct drm_crtc *crtc;
- struct drm_crtc_state *old_crtc_state;
+ struct drm_crtc_state *old_crtc_state, *new_crtc_state;
int timeout_loop = 0;
int ret;
@@ -1099,6 +1175,11 @@ static void analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge,
if (!crtc)
return;
+ new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc);
+ if (!new_crtc_state)
+ return;
+ analogix_dp_bridge_mode_set(bridge, &new_crtc_state->adjusted_mode);
+
old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc);
/* Not a full enable, just disable PSR and continue */
if (old_crtc_state && old_crtc_state->self_refresh_active) {
@@ -1205,83 +1286,6 @@ 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_mode_set(struct drm_bridge *bridge,
- const struct drm_display_mode *orig_mode,
- const struct drm_display_mode *mode)
-{
- struct analogix_dp_device *dp = to_dp(bridge);
- struct drm_display_info *display_info = &dp->connector.display_info;
- struct video_info *video = &dp->video_info;
- struct device_node *dp_node = dp->dev->of_node;
- int vic;
-
- /* Input video interlaces & hsync pol & vsync pol */
- video->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
- video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);
- video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC);
-
- /* Input video dynamic_range & colorimetry */
- vic = drm_match_cea_mode(mode);
- if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) ||
- (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) {
- video->dynamic_range = CEA;
- video->ycbcr_coeff = COLOR_YCBCR601;
- } else if (vic) {
- video->dynamic_range = CEA;
- video->ycbcr_coeff = COLOR_YCBCR709;
- } else {
- video->dynamic_range = VESA;
- video->ycbcr_coeff = COLOR_YCBCR709;
- }
-
- /* Input vide bpc and color_formats */
- switch (display_info->bpc) {
- case 12:
- video->color_depth = COLOR_12;
- break;
- case 10:
- video->color_depth = COLOR_10;
- break;
- case 8:
- video->color_depth = COLOR_8;
- break;
- case 6:
- video->color_depth = COLOR_6;
- break;
- default:
- video->color_depth = COLOR_8;
- break;
- }
- if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR444)
- video->color_space = COLOR_YCBCR444;
- else if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422)
- video->color_space = COLOR_YCBCR422;
- else
- video->color_space = COLOR_RGB;
-
- /*
- * NOTE: those property parsing code is used for providing backward
- * compatibility for samsung platform.
- * Due to we used the "of_property_read_u32" interfaces, when this
- * property isn't present, the "video_info" can keep the original
- * values and wouldn't be modified.
- */
- of_property_read_u32(dp_node, "samsung,color-space",
- &video->color_space);
- of_property_read_u32(dp_node, "samsung,dynamic-range",
- &video->dynamic_range);
- of_property_read_u32(dp_node, "samsung,ycbcr-coeff",
- &video->ycbcr_coeff);
- of_property_read_u32(dp_node, "samsung,color-depth",
- &video->color_depth);
- if (of_property_read_bool(dp_node, "hsync-active-high"))
- video->h_sync_polarity = true;
- if (of_property_read_bool(dp_node, "vsync-active-high"))
- video->v_sync_polarity = true;
- if (of_property_read_bool(dp_node, "interlaced"))
- video->interlaced = true;
-}
-
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,
@@ -1290,7 +1294,6 @@ static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
.atomic_enable = analogix_dp_bridge_atomic_enable,
.atomic_disable = analogix_dp_bridge_atomic_disable,
.atomic_post_disable = analogix_dp_bridge_atomic_post_disable,
- .mode_set = analogix_dp_bridge_mode_set,
.attach = analogix_dp_bridge_attach,
};
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (2 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 03/18] drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to &drm_bridge_funcs.atomic_enable Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-31 11:11 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use Damon Ding
` (12 subsequent siblings)
16 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
In order to move the panel/bridge parsing and attachmenet to the
Analogix side, add component struct drm_bridge *next_bridge to
platform data struct analogix_dp_plat_data.
The movement makes sense because the panel/bridge should logically
be positioned behind the Analogix bridge in the display pipeline.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
Changes in v4:
- Rename the &analogix_dp_plat_data.bridge to
&analogix_dp_plat_data.next_bridge
---
include/drm/bridge/analogix_dp.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index cf17646c1310..582357c20640 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -27,6 +27,7 @@ static inline bool is_rockchip(enum analogix_dp_devtype type)
struct analogix_dp_plat_data {
enum analogix_dp_devtype dev_type;
struct drm_panel *panel;
+ struct drm_bridge *next_bridge;
struct drm_encoder *encoder;
struct drm_connector *connector;
bool skip_connector;
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (3 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2026-01-31 12:33 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 06/18] drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge Damon Ding
` (11 subsequent siblings)
16 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
As suggested by Dmitry, the DRM legacy bridge driver can be pulled
out of imx/ subdir for multi-platform use. The driver is also renamed
to make it more generic and suitable for platforms other than i.MX.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
Changes in v7:
- Rename legacy-bridge to of-display-mode-bridge.
- Remove unnecessary API drm_bridge_is_legacy().
---
drivers/gpu/drm/bridge/Kconfig | 10 ++
drivers/gpu/drm/bridge/Makefile | 1 +
drivers/gpu/drm/bridge/imx/Kconfig | 10 --
drivers/gpu/drm/bridge/imx/Makefile | 1 -
.../gpu/drm/bridge/imx/imx-legacy-bridge.c | 91 ------------------
.../gpu/drm/bridge/of-display-mode-bridge.c | 93 +++++++++++++++++++
drivers/gpu/drm/imx/ipuv3/Kconfig | 4 +-
drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 6 +-
drivers/gpu/drm/imx/ipuv3/parallel-display.c | 5 +-
include/drm/bridge/imx.h | 17 ----
include/drm/bridge/of-display-mode-bridge.h | 17 ++++
11 files changed, 129 insertions(+), 126 deletions(-)
delete mode 100644 drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c
create mode 100644 drivers/gpu/drm/bridge/of-display-mode-bridge.c
delete mode 100644 include/drm/bridge/imx.h
create mode 100644 include/drm/bridge/of-display-mode-bridge.h
diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
index a250afd8d662..65784f6db797 100644
--- a/drivers/gpu/drm/bridge/Kconfig
+++ b/drivers/gpu/drm/bridge/Kconfig
@@ -244,6 +244,16 @@ config DRM_NXP_PTN3460
help
NXP PTN3460 eDP-LVDS bridge chip driver.
+config DRM_OF_DISPLAY_MODE_BRIDGE
+ tristate
+ depends on DRM_BRIDGE && OF
+ help
+ This is a DRM bridge implementation that uses of_get_drm_display_mode
+ to acquire display mode.
+
+ Newer designs should not use this bridge and should use proper panel
+ driver instead.
+
config DRM_PARADE_PS8622
tristate "Parade eDP/LVDS bridge"
depends on OF
diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile
index c7dc03182e59..41146faef91a 100644
--- a/drivers/gpu/drm/bridge/Makefile
+++ b/drivers/gpu/drm/bridge/Makefile
@@ -20,6 +20,7 @@ obj-$(CONFIG_DRM_LVDS_CODEC) += lvds-codec.o
obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += megachips-stdpxxxx-ge-b850v3-fw.o
obj-$(CONFIG_DRM_MICROCHIP_LVDS_SERIALIZER) += microchip-lvds.o
obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o
+obj-$(CONFIG_DRM_OF_DISPLAY_MODE_BRIDGE) += of-display-mode-bridge.o
obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o
obj-$(CONFIG_DRM_PARADE_PS8640) += parade-ps8640.o
obj-$(CONFIG_DRM_SAMSUNG_DSIM) += samsung-dsim.o
diff --git a/drivers/gpu/drm/bridge/imx/Kconfig b/drivers/gpu/drm/bridge/imx/Kconfig
index b9028a5e5a06..8877b9789868 100644
--- a/drivers/gpu/drm/bridge/imx/Kconfig
+++ b/drivers/gpu/drm/bridge/imx/Kconfig
@@ -3,16 +3,6 @@ if ARCH_MXC || COMPILE_TEST
config DRM_IMX_LDB_HELPER
tristate
-config DRM_IMX_LEGACY_BRIDGE
- tristate
- depends on DRM_IMX
- help
- This is a DRM bridge implementation for the DRM i.MX IPUv3 driver,
- that uses of_get_drm_display_mode to acquire display mode.
-
- Newer designs should not use this bridge and should use proper panel
- driver instead.
-
config DRM_IMX8MP_DW_HDMI_BRIDGE
tristate "Freescale i.MX8MP HDMI-TX bridge support"
depends on OF
diff --git a/drivers/gpu/drm/bridge/imx/Makefile b/drivers/gpu/drm/bridge/imx/Makefile
index 8d01fda25451..69d9f9abbe36 100644
--- a/drivers/gpu/drm/bridge/imx/Makefile
+++ b/drivers/gpu/drm/bridge/imx/Makefile
@@ -1,5 +1,4 @@
obj-$(CONFIG_DRM_IMX_LDB_HELPER) += imx-ldb-helper.o
-obj-$(CONFIG_DRM_IMX_LEGACY_BRIDGE) += imx-legacy-bridge.o
obj-$(CONFIG_DRM_IMX8MP_DW_HDMI_BRIDGE) += imx8mp-hdmi-tx.o
obj-$(CONFIG_DRM_IMX8MP_HDMI_PAI) += imx8mp-hdmi-pai.o
obj-$(CONFIG_DRM_IMX8MP_HDMI_PVI) += imx8mp-hdmi-pvi.o
diff --git a/drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c b/drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c
deleted file mode 100644
index 0e31d5000e7c..000000000000
--- a/drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c
+++ /dev/null
@@ -1,91 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Freescale i.MX drm driver
- *
- * bridge driver for legacy DT bindings, utilizing display-timings node
- */
-
-#include <linux/export.h>
-
-#include <drm/drm_bridge.h>
-#include <drm/drm_modes.h>
-#include <drm/drm_probe_helper.h>
-#include <drm/bridge/imx.h>
-
-#include <video/of_display_timing.h>
-#include <video/of_videomode.h>
-
-struct imx_legacy_bridge {
- struct drm_bridge base;
-
- struct drm_display_mode mode;
- u32 bus_flags;
-};
-
-#define to_imx_legacy_bridge(bridge) container_of(bridge, struct imx_legacy_bridge, base)
-
-static int imx_legacy_bridge_attach(struct drm_bridge *bridge,
- struct drm_encoder *encoder,
- enum drm_bridge_attach_flags flags)
-{
- if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
- return -EINVAL;
-
- return 0;
-}
-
-static int imx_legacy_bridge_get_modes(struct drm_bridge *bridge,
- struct drm_connector *connector)
-{
- struct imx_legacy_bridge *imx_bridge = to_imx_legacy_bridge(bridge);
- int ret;
-
- ret = drm_connector_helper_get_modes_fixed(connector, &imx_bridge->mode);
- if (ret)
- return ret;
-
- connector->display_info.bus_flags = imx_bridge->bus_flags;
-
- return 0;
-}
-
-struct drm_bridge_funcs imx_legacy_bridge_funcs = {
- .attach = imx_legacy_bridge_attach,
- .get_modes = imx_legacy_bridge_get_modes,
-};
-
-struct drm_bridge *devm_imx_drm_legacy_bridge(struct device *dev,
- struct device_node *np,
- int type)
-{
- struct imx_legacy_bridge *imx_bridge;
- int ret;
-
- imx_bridge = devm_drm_bridge_alloc(dev, struct imx_legacy_bridge,
- base, &imx_legacy_bridge_funcs);
- if (IS_ERR(imx_bridge))
- return ERR_CAST(imx_bridge);
-
- ret = of_get_drm_display_mode(np,
- &imx_bridge->mode,
- &imx_bridge->bus_flags,
- OF_USE_NATIVE_MODE);
- if (ret)
- return ERR_PTR(ret);
-
- imx_bridge->mode.type |= DRM_MODE_TYPE_DRIVER;
-
- imx_bridge->base.of_node = np;
- imx_bridge->base.ops = DRM_BRIDGE_OP_MODES;
- imx_bridge->base.type = type;
-
- ret = devm_drm_bridge_add(dev, &imx_bridge->base);
- if (ret)
- return ERR_PTR(ret);
-
- return &imx_bridge->base;
-}
-EXPORT_SYMBOL_GPL(devm_imx_drm_legacy_bridge);
-
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Freescale i.MX DRM bridge driver for legacy DT bindings");
diff --git a/drivers/gpu/drm/bridge/of-display-mode-bridge.c b/drivers/gpu/drm/bridge/of-display-mode-bridge.c
new file mode 100644
index 000000000000..cb15713f3a79
--- /dev/null
+++ b/drivers/gpu/drm/bridge/of-display-mode-bridge.c
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2012 Sascha Hauer, Pengutronix
+ *
+ * bridge driver for legacy DT bindings, utilizing display-timings node
+ *
+ * Author: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
+ */
+
+#include <linux/export.h>
+
+#include <drm/drm_bridge.h>
+#include <drm/drm_modes.h>
+#include <drm/drm_probe_helper.h>
+#include <drm/bridge/of-display-mode-bridge.h>
+
+#include <video/of_display_timing.h>
+#include <video/of_videomode.h>
+
+struct of_display_mode_bridge {
+ struct drm_bridge base;
+
+ struct drm_display_mode mode;
+ u32 bus_flags;
+};
+
+#define to_of_display_mode_bridge(bridge) container_of(bridge, struct of_display_mode_bridge, base)
+
+static int of_display_mode_bridge_attach(struct drm_bridge *bridge,
+ struct drm_encoder *encoder,
+ enum drm_bridge_attach_flags flags)
+{
+ if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
+ return -EINVAL;
+
+ return 0;
+}
+
+static int of_display_mode_bridge_get_modes(struct drm_bridge *bridge,
+ struct drm_connector *connector)
+{
+ struct of_display_mode_bridge *of_bridge = to_of_display_mode_bridge(bridge);
+ int ret;
+
+ ret = drm_connector_helper_get_modes_fixed(connector, &of_bridge->mode);
+ if (ret)
+ return ret;
+
+ connector->display_info.bus_flags = of_bridge->bus_flags;
+
+ return 0;
+}
+
+struct drm_bridge_funcs of_display_mode_bridge_funcs = {
+ .attach = of_display_mode_bridge_attach,
+ .get_modes = of_display_mode_bridge_get_modes,
+};
+
+struct drm_bridge *devm_drm_of_display_mode_bridge(struct device *dev,
+ struct device_node *np,
+ int type)
+{
+ struct of_display_mode_bridge *of_bridge;
+ int ret;
+
+ of_bridge = devm_drm_bridge_alloc(dev, struct of_display_mode_bridge,
+ base, &of_display_mode_bridge_funcs);
+ if (IS_ERR(of_bridge))
+ return ERR_CAST(of_bridge);
+
+ ret = of_get_drm_display_mode(np,
+ &of_bridge->mode,
+ &of_bridge->bus_flags,
+ OF_USE_NATIVE_MODE);
+ if (ret)
+ return ERR_PTR(ret);
+
+ of_bridge->mode.type |= DRM_MODE_TYPE_DRIVER;
+
+ of_bridge->base.of_node = np;
+ of_bridge->base.ops = DRM_BRIDGE_OP_MODES;
+ of_bridge->base.type = type;
+
+ ret = devm_drm_bridge_add(dev, &of_bridge->base);
+ if (ret)
+ return ERR_PTR(ret);
+
+ return &of_bridge->base;
+}
+EXPORT_SYMBOL_GPL(devm_drm_of_display_mode_bridge);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("DRM bridge driver for legacy DT bindings");
diff --git a/drivers/gpu/drm/imx/ipuv3/Kconfig b/drivers/gpu/drm/imx/ipuv3/Kconfig
index acaf25089001..e98f8d35efaa 100644
--- a/drivers/gpu/drm/imx/ipuv3/Kconfig
+++ b/drivers/gpu/drm/imx/ipuv3/Kconfig
@@ -15,7 +15,7 @@ config DRM_IMX_PARALLEL_DISPLAY
depends on DRM_IMX
select DRM_BRIDGE
select DRM_BRIDGE_CONNECTOR
- select DRM_IMX_LEGACY_BRIDGE
+ select DRM_OF_DISPLAY_MODE_BRIDGE
select DRM_PANEL_BRIDGE
select VIDEOMODE_HELPERS
@@ -36,7 +36,7 @@ config DRM_IMX_LDB
select DRM_BRIDGE
select DRM_BRIDGE_CONNECTOR
select DRM_PANEL_BRIDGE
- select DRM_IMX_LEGACY_BRIDGE
+ select DRM_OF_DISPLAY_MODE_BRIDGE
help
Choose this to enable the internal LVDS Display Bridge (LDB)
found on i.MX53 and i.MX6 processors.
diff --git a/drivers/gpu/drm/imx/ipuv3/imx-ldb.c b/drivers/gpu/drm/imx/ipuv3/imx-ldb.c
index 626d410d9150..730caf883e83 100644
--- a/drivers/gpu/drm/imx/ipuv3/imx-ldb.c
+++ b/drivers/gpu/drm/imx/ipuv3/imx-ldb.c
@@ -28,7 +28,7 @@
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_simple_kms_helper.h>
-#include <drm/bridge/imx.h>
+#include <drm/bridge/of-display-mode-bridge.h>
#include "imx-drm.h"
@@ -605,8 +605,8 @@ static int imx_ldb_probe(struct platform_device *pdev)
* checking the bus_format property.
*/
if (!channel->bridge) {
- channel->bridge = devm_imx_drm_legacy_bridge(dev, child,
- DRM_MODE_CONNECTOR_LVDS);
+ channel->bridge = devm_drm_of_display_mode_bridge(dev, child,
+ DRM_MODE_CONNECTOR_LVDS);
if (IS_ERR(channel->bridge)) {
ret = PTR_ERR(channel->bridge);
goto free_child;
diff --git a/drivers/gpu/drm/imx/ipuv3/parallel-display.c b/drivers/gpu/drm/imx/ipuv3/parallel-display.c
index 61fab3698807..b17d2b06b0e6 100644
--- a/drivers/gpu/drm/imx/ipuv3/parallel-display.c
+++ b/drivers/gpu/drm/imx/ipuv3/parallel-display.c
@@ -19,7 +19,7 @@
#include <drm/drm_of.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_simple_kms_helper.h>
-#include <drm/bridge/imx.h>
+#include <drm/bridge/of-display-mode-bridge.h>
#include "imx-drm.h"
@@ -235,7 +235,8 @@ static int imx_pd_probe(struct platform_device *pdev)
/* port@1 is the output port */
imxpd->next_bridge = devm_drm_of_get_bridge(dev, np, 1, 0);
if (imxpd->next_bridge == ERR_PTR(-ENODEV))
- imxpd->next_bridge = devm_imx_drm_legacy_bridge(dev, np, DRM_MODE_CONNECTOR_DPI);
+ imxpd->next_bridge = devm_drm_of_display_mode_bridge(dev, np,
+ DRM_MODE_CONNECTOR_DPI);
if (IS_ERR(imxpd->next_bridge)) {
ret = PTR_ERR(imxpd->next_bridge);
return ret;
diff --git a/include/drm/bridge/imx.h b/include/drm/bridge/imx.h
deleted file mode 100644
index b93f719fe0e7..000000000000
--- a/include/drm/bridge/imx.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright (C) 2012 Sascha Hauer, Pengutronix
- */
-
-#ifndef DRM_IMX_BRIDGE_H
-#define DRM_IMX_BRIDGE_H
-
-struct device;
-struct device_node;
-struct drm_bridge;
-
-struct drm_bridge *devm_imx_drm_legacy_bridge(struct device *dev,
- struct device_node *np,
- int type);
-
-#endif
diff --git a/include/drm/bridge/of-display-mode-bridge.h b/include/drm/bridge/of-display-mode-bridge.h
new file mode 100644
index 000000000000..89fcfedf68d8
--- /dev/null
+++ b/include/drm/bridge/of-display-mode-bridge.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2012 Sascha Hauer, Pengutronix
+ */
+
+#ifndef DRM_OF_DISPLAY_MODE_BRIDGE_H
+#define DRM_OF_DISPLAY_MODE_BRIDGE_H
+
+struct device;
+struct device_node;
+struct drm_bridge;
+
+struct drm_bridge *devm_drm_of_display_mode_bridge(struct device *dev,
+ struct device_node *np,
+ int type);
+
+#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 06/18] drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (4 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2026-01-31 13:41 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 07/18] drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector Damon Ding
` (10 subsequent siblings)
16 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
Use &analogix_dp_plat_data.bridge instead of &exynos_dp_device.ptn_bridge
directly.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
------
Changes in v3:
- Fix the typographical error for &dp->plat_data.bridge.
Changes in v4:
- Rename the &analogix_dp_plat_data.bridge to
&analogix_dp_plat_data.next_bridge.
---
drivers/gpu/drm/exynos/exynos_dp.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index 5bcf41e0bd04..f469ac5b3c2a 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -36,7 +36,6 @@
struct exynos_dp_device {
struct drm_encoder encoder;
struct drm_connector *connector;
- struct drm_bridge *ptn_bridge;
struct drm_device *drm_dev;
struct device *dev;
@@ -106,8 +105,8 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
dp->connector = connector;
/* Pre-empt DP connector creation if there's a bridge */
- if (dp->ptn_bridge) {
- ret = drm_bridge_attach(&dp->encoder, dp->ptn_bridge, bridge,
+ if (plat_data->next_bridge) {
+ ret = drm_bridge_attach(&dp->encoder, plat_data->next_bridge, bridge,
0);
if (ret)
return ret;
@@ -155,7 +154,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
dp->drm_dev = drm_dev;
- if (!dp->plat_data.panel && !dp->ptn_bridge) {
+ if (!dp->plat_data.panel && !dp->plat_data.next_bridge) {
ret = exynos_dp_dt_parse_panel(dp);
if (ret)
return ret;
@@ -232,6 +231,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
/* The remote port can be either a panel or a bridge */
dp->plat_data.panel = panel;
+ dp->plat_data.next_bridge = bridge;
dp->plat_data.dev_type = EXYNOS_DP;
dp->plat_data.power_on = exynos_dp_poweron;
dp->plat_data.power_off = exynos_dp_poweroff;
@@ -239,8 +239,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
dp->plat_data.get_modes = exynos_dp_get_modes;
dp->plat_data.skip_connector = !!bridge;
- dp->ptn_bridge = bridge;
-
out:
dp->adp = analogix_dp_probe(dev, &dp->plat_data);
if (IS_ERR(dp->adp))
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 07/18] drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (5 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 06/18] drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2026-01-31 13:40 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 08/18] drm/exynos: exynos_dp: Apply of-display-mode-bridge to parse the display-timings node Damon Ding
` (9 subsequent siblings)
16 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
The &exynos_dp_device.connector is assigned in exynos_dp_bridge_attach()
but never used. It should make sense to remove it.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
Changes in v5:
- Fix the 'drm/bridge' to 'drm/exynos' in commit message.
---
drivers/gpu/drm/exynos/exynos_dp.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index f469ac5b3c2a..e20513164032 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -35,7 +35,6 @@
struct exynos_dp_device {
struct drm_encoder encoder;
- struct drm_connector *connector;
struct drm_device *drm_dev;
struct device *dev;
@@ -102,8 +101,6 @@ static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
struct exynos_dp_device *dp = to_dp(plat_data);
int ret;
- dp->connector = connector;
-
/* Pre-empt DP connector creation if there's a bridge */
if (plat_data->next_bridge) {
ret = drm_bridge_attach(&dp->encoder, plat_data->next_bridge, bridge,
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 08/18] drm/exynos: exynos_dp: Apply of-display-mode-bridge to parse the display-timings node
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (6 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 07/18] drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-17 9:33 ` [PATCH v8 09/18] drm/bridge: analogix_dp: Remove redundant &analogix_dp_plat_data.skip_connector Damon Ding
` (8 subsequent siblings)
16 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
If there is neither a panel nor a bridge, the display timing can be
parsed from the display-timings node under the dp node.
In order to get rid of &analogix_dp_plat_data.get_modes() and make
the codes more consistent, apply DRM of-display-mode-bridge to parse
display timings.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
------
Changes in v6:
- Apply DRM legacy bridge to parse display timings instead of
implementing the same codes only for Exynos DP.
Changes in v7:
- Use temporary flag &exynos_dp_device.has_of_bridge, which will be
removed in the following patch, instead of applying API
drm_bridge_is_legacy().
- Remove exynos_dp_legacy_bridge_init() and inline API
devm_drm_of_display_mode_bridge().
---
drivers/gpu/drm/exynos/Kconfig | 1 +
drivers/gpu/drm/exynos/exynos_dp.c | 66 ++++++++----------------------
2 files changed, 17 insertions(+), 50 deletions(-)
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig
index 0d13828e7d9e..380d9a8ce259 100644
--- a/drivers/gpu/drm/exynos/Kconfig
+++ b/drivers/gpu/drm/exynos/Kconfig
@@ -72,6 +72,7 @@ config DRM_EXYNOS_DP
select DRM_ANALOGIX_DP
select DRM_DISPLAY_DP_HELPER
default DRM_EXYNOS
+ select DRM_OF_DISPLAY_MODE_BRIDGE
select DRM_PANEL
help
This enables support for DP device.
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index e20513164032..ac16138a22fe 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -19,6 +19,7 @@
#include <video/videomode.h>
#include <drm/bridge/analogix_dp.h>
+#include <drm/bridge/of-display-mode-bridge.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_crtc.h>
@@ -38,9 +39,10 @@ struct exynos_dp_device {
struct drm_device *drm_dev;
struct device *dev;
- struct videomode vm;
struct analogix_dp_device *adp;
struct analogix_dp_plat_data plat_data;
+
+ bool has_of_bridge;
};
static int exynos_dp_crtc_clock_enable(struct analogix_dp_plat_data *plat_data,
@@ -67,44 +69,20 @@ static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data)
return exynos_dp_crtc_clock_enable(plat_data, false);
}
-static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data,
- struct drm_connector *connector)
-{
- struct exynos_dp_device *dp = to_dp(plat_data);
- struct drm_display_mode *mode;
-
- if (dp->plat_data.panel)
- return 0;
-
- mode = drm_mode_create(connector->dev);
- if (!mode) {
- DRM_DEV_ERROR(dp->dev,
- "failed to create a new display mode.\n");
- return 0;
- }
-
- drm_display_mode_from_videomode(&dp->vm, mode);
- connector->display_info.width_mm = mode->width_mm;
- connector->display_info.height_mm = mode->height_mm;
-
- mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
- drm_mode_set_name(mode);
- drm_mode_probed_add(connector, mode);
-
- return 1;
-}
-
static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
struct drm_bridge *bridge,
struct drm_connector *connector)
{
struct exynos_dp_device *dp = to_dp(plat_data);
+ enum drm_bridge_attach_flags flags = 0;
int ret;
/* Pre-empt DP connector creation if there's a bridge */
if (plat_data->next_bridge) {
- ret = drm_bridge_attach(&dp->encoder, plat_data->next_bridge, bridge,
- 0);
+ if (dp->has_of_bridge)
+ flags = DRM_BRIDGE_ATTACH_NO_CONNECTOR;
+
+ ret = drm_bridge_attach(&dp->encoder, plat_data->next_bridge, bridge, flags);
if (ret)
return ret;
}
@@ -129,19 +107,6 @@ static const struct drm_encoder_helper_funcs exynos_dp_encoder_helper_funcs = {
.disable = exynos_dp_nop,
};
-static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp)
-{
- int ret;
-
- ret = of_get_videomode(dp->dev->of_node, &dp->vm, OF_USE_NATIVE_MODE);
- if (ret) {
- DRM_DEV_ERROR(dp->dev,
- "failed: of_get_videomode() : %d\n", ret);
- return ret;
- }
- return 0;
-}
-
static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
{
struct exynos_dp_device *dp = dev_get_drvdata(dev);
@@ -151,12 +116,6 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
dp->drm_dev = drm_dev;
- if (!dp->plat_data.panel && !dp->plat_data.next_bridge) {
- ret = exynos_dp_dt_parse_panel(dp);
- if (ret)
- return ret;
- }
-
drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
drm_encoder_helper_add(encoder, &exynos_dp_encoder_helper_funcs);
@@ -223,6 +182,14 @@ static int exynos_dp_probe(struct platform_device *pdev)
}
ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &panel, &bridge);
+ if (ret == -ENODEV) {
+ dp->plat_data.next_bridge = devm_drm_of_display_mode_bridge(dp->dev,
+ dp->dev->of_node,
+ DRM_MODE_CONNECTOR_eDP);
+ ret = IS_ERR(dp->plat_data.next_bridge) ? PTR_ERR(dp->plat_data.next_bridge) : 0;
+ if (!ret)
+ dp->has_of_bridge = true;
+ }
if (ret)
return ret;
@@ -233,7 +200,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
dp->plat_data.power_on = exynos_dp_poweron;
dp->plat_data.power_off = exynos_dp_poweroff;
dp->plat_data.attach = exynos_dp_bridge_attach;
- dp->plat_data.get_modes = exynos_dp_get_modes;
dp->plat_data.skip_connector = !!bridge;
out:
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 09/18] drm/bridge: analogix_dp: Remove redundant &analogix_dp_plat_data.skip_connector
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (7 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 08/18] drm/exynos: exynos_dp: Apply of-display-mode-bridge to parse the display-timings node Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-17 9:33 ` [PATCH v8 10/18] drm/bridge: analogix_dp: Move the color format check to .atomic_check() for Rockchip platforms Damon Ding
` (7 subsequent siblings)
16 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
The &analogix_dp_plat_data.skip_connector related check can be replaced
by &analogix_dp_plat_data.bridge.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
------
Changes in v3:
- Squash the Exynos side commit and the Analogix side commit together.
Changes in v4:
- Rename the &analogix_dp_plat_data.bridge to
&analogix_dp_plat_data.next_bridge.
---
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 2 +-
drivers/gpu/drm/exynos/exynos_dp.c | 1 -
include/drm/bridge/analogix_dp.h | 1 -
3 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 3caa47d31649..4606ecc3f480 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -959,7 +959,7 @@ static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
return -EINVAL;
}
- if (!dp->plat_data->skip_connector) {
+ if (!dp->plat_data->next_bridge) {
connector = &dp->connector;
connector->polled = DRM_CONNECTOR_POLL_HPD;
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index ac16138a22fe..1eeb0b15f99a 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -200,7 +200,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
dp->plat_data.power_on = exynos_dp_poweron;
dp->plat_data.power_off = exynos_dp_poweroff;
dp->plat_data.attach = exynos_dp_bridge_attach;
- dp->plat_data.skip_connector = !!bridge;
out:
dp->adp = analogix_dp_probe(dev, &dp->plat_data);
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index 582357c20640..f06da105d8f2 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -30,7 +30,6 @@ struct analogix_dp_plat_data {
struct drm_bridge *next_bridge;
struct drm_encoder *encoder;
struct drm_connector *connector;
- bool skip_connector;
int (*power_on)(struct analogix_dp_plat_data *);
int (*power_off)(struct analogix_dp_plat_data *);
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 10/18] drm/bridge: analogix_dp: Move the color format check to .atomic_check() for Rockchip platforms
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (8 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 09/18] drm/bridge: analogix_dp: Remove redundant &analogix_dp_plat_data.skip_connector Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-17 9:33 ` [PATCH v8 11/18] drm/bridge: analogix_dp: Remove unused &analogix_dp_plat_data.get_modes() Damon Ding
` (6 subsequent siblings)
16 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
For Rockchip platforms, the YUV color formats are currently unsupported.
This compatibility check was previously implemented in
&analogix_dp_plat_data.get_modes().
Moving color format check to &drm_connector_helper_funcs.atomic_check()
would get rid of &analogix_dp_plat_data.get_modes() and be more
reasonable than before.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
.../gpu/drm/bridge/analogix/analogix_dp_core.c | 11 +++++++++++
.../gpu/drm/rockchip/analogix_dp-rockchip.c | 18 ------------------
2 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 4606ecc3f480..5bf41b364aba 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -894,8 +894,19 @@ static int analogix_dp_atomic_check(struct drm_connector *connector,
struct drm_atomic_state *state)
{
struct analogix_dp_device *dp = to_dp(connector);
+ struct drm_display_info *di = &connector->display_info;
struct drm_connector_state *conn_state;
struct drm_crtc_state *crtc_state;
+ u32 mask = DRM_COLOR_FORMAT_YCBCR444 | DRM_COLOR_FORMAT_YCBCR422;
+
+ if (is_rockchip(dp->plat_data->dev_type)) {
+ if ((di->color_formats & mask)) {
+ DRM_DEBUG_KMS("Swapping display color format from YUV to RGB\n");
+ di->color_formats &= ~mask;
+ di->color_formats |= DRM_COLOR_FORMAT_RGB444;
+ di->bpc = 8;
+ }
+ }
conn_state = drm_atomic_get_new_connector_state(state, connector);
if (WARN_ON(!conn_state))
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index fdab71d51e2a..70fe5ae69e2e 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -166,23 +166,6 @@ static int rockchip_dp_powerdown(struct analogix_dp_plat_data *plat_data)
return 0;
}
-static int rockchip_dp_get_modes(struct analogix_dp_plat_data *plat_data,
- struct drm_connector *connector)
-{
- struct drm_display_info *di = &connector->display_info;
- /* VOP couldn't output YUV video format for eDP rightly */
- u32 mask = DRM_COLOR_FORMAT_YCBCR444 | DRM_COLOR_FORMAT_YCBCR422;
-
- if ((di->color_formats & mask)) {
- DRM_DEBUG_KMS("Swapping display color format from YUV to RGB\n");
- di->color_formats &= ~mask;
- di->color_formats |= DRM_COLOR_FORMAT_RGB444;
- di->bpc = 8;
- }
-
- return 0;
-}
-
static bool
rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder,
const struct drm_display_mode *mode,
@@ -481,7 +464,6 @@ static int rockchip_dp_probe(struct platform_device *pdev)
dp->plat_data.dev_type = dp->data->chip_type;
dp->plat_data.power_on = rockchip_dp_poweron;
dp->plat_data.power_off = rockchip_dp_powerdown;
- dp->plat_data.get_modes = rockchip_dp_get_modes;
ret = rockchip_dp_of_probe(dp);
if (ret < 0)
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 11/18] drm/bridge: analogix_dp: Remove unused &analogix_dp_plat_data.get_modes()
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (9 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 10/18] drm/bridge: analogix_dp: Move the color format check to .atomic_check() for Rockchip platforms Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-17 9:33 ` [PATCH v8 12/18] drm/bridge: analogix_dp: Apply drm_bridge_connector helper Damon Ding
` (5 subsequent siblings)
16 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
The callback &analogix_dp_plat_data.get_modes() is not implemented
by either Rockchip side or Exynos side.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 3 ---
include/drm/bridge/analogix_dp.h | 2 --
2 files changed, 5 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 5bf41b364aba..b0bc96693fdb 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -875,9 +875,6 @@ static int analogix_dp_get_modes(struct drm_connector *connector)
}
}
- if (dp->plat_data->get_modes)
- num_modes += dp->plat_data->get_modes(dp->plat_data, connector);
-
return num_modes;
}
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index f06da105d8f2..3301392eda5f 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -35,8 +35,6 @@ struct analogix_dp_plat_data {
int (*power_off)(struct analogix_dp_plat_data *);
int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *,
struct drm_connector *);
- int (*get_modes)(struct analogix_dp_plat_data *,
- struct drm_connector *);
};
int analogix_dp_resume(struct analogix_dp_device *dp);
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 12/18] drm/bridge: analogix_dp: Apply drm_bridge_connector helper
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (10 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 11/18] drm/bridge: analogix_dp: Remove unused &analogix_dp_plat_data.get_modes() Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-17 9:33 ` [PATCH v8 13/18] drm/bridge: analogix_dp: Add new API analogix_dp_finish_probe() Damon Ding
` (4 subsequent siblings)
16 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
Apply drm_bridge_connector helper for Analogix DP driver.
The following changes have been made:
- Apply drm_bridge_connector helper to get rid of &drm_connector_funcs
and &drm_connector_helper_funcs.
- Remove unnecessary parameter struct drm_connector* for callback
&analogix_dp_plat_data.attach.
- Remove &analogix_dp_device.connector.
- Convert analogix_dp_atomic_check()/analogix_dp_detect() to
&drm_bridge_funcs.atomic_check()/&drm_bridge_funcs.detect().
- Split analogix_dp_get_modes() into &drm_bridge_funcs.get_modes() and
&drm_bridge_funcs.edid_read().
- Set flag DRM_BRIDGE_ATTACH_NO_CONNECTOR for bridge attachment while
binding. Meanwhile, make DRM_BRIDGE_ATTACH_NO_CONNECTOR unsuppported
in analogix_dp_bridge_attach().
- Set &drm_bridge.ops according to different cases.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
------
Changes in v2:
- For &drm_bridge.ops, remove DRM_BRIDGE_OP_HPD and add
DRM_BRIDGE_OP_EDID.
- Add analogix_dp_bridge_edid_read().
- Move &analogix_dp_plat_data.skip_connector deletion to the previous
patches.
Changes in v3:
- Rebase with the new devm_drm_bridge_alloc() related commit
48f05c3b4b70 ("drm/bridge: analogix_dp: Use devm_drm_bridge_alloc()
API").
- Expand the commit message.
- Call drm_bridge_get_modes() in analogix_dp_bridge_get_modes() if the
bridge is available.
- Remove unnecessary parameter struct drm_connector* for callback
&analogix_dp_plat_data.attach.
- In order to decouple the connector driver and the bridge driver, move
the bridge connector initilization to the Rockchip and Exynos sides.
Changes in v4:
- Expand analogix_dp_bridge_detect() parameters to &drm_bridge and
&drm_connector.
- Rename the &analogix_dp_plat_data.bridge to
&analogix_dp_plat_data.next_bridge.
Changes in v5:
- Set the flag fo drm_bridge_attach() to DRM_BRIDGE_ATTACH_NO_CONNECTOR
for next bridge attachment of Exynos side.
- Distinguish the &drm_bridge->ops of Analogix bridge based on whether
the downstream device is a panel, a bridge or neither.
- Remove the calls to &analogix_dp_plat_data.get_modes().
Changes in v6:
- Select DRM_BRIDGE_CONNECTOR for both Rockchip and Exynos sides.
- Remove unnecessary drm_bridge_get_modes() in
analogix_dp_bridge_get_modes().
- Simplify analogix_dp_bridge_edid_read().
- If the next is a bridge, set DRM_BRIDGE_OP_DETECT and return
connector_status_connected in analogix_dp_bridge_detect().
- Set flag DRM_BRIDGE_ATTACH_NO_CONNECTOR for bridge attachment while
binding. Meanwhile, make DRM_BRIDGE_ATTACH_NO_CONNECTOR unsuppported
in analogix_dp_bridge_attach().
- Simplify the check of bridge capabilities.
Changes in v7:
- Remove temporary flag &exynos_dp_device.has_of_bridge.
---
.../drm/bridge/analogix/analogix_dp_core.c | 148 ++++++++----------
.../drm/bridge/analogix/analogix_dp_core.h | 1 -
drivers/gpu/drm/exynos/Kconfig | 1 +
drivers/gpu/drm/exynos/exynos_dp.c | 29 ++--
drivers/gpu/drm/rockchip/Kconfig | 1 +
.../gpu/drm/rockchip/analogix_dp-rockchip.c | 11 +-
include/drm/bridge/analogix_dp.h | 3 +-
7 files changed, 90 insertions(+), 104 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index b0bc96693fdb..81c6e81dd352 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -856,44 +856,32 @@ static int analogix_dp_disable_psr(struct analogix_dp_device *dp)
return analogix_dp_send_psr_spd(dp, &psr_vsc, true);
}
-static int analogix_dp_get_modes(struct drm_connector *connector)
+static int analogix_dp_bridge_get_modes(struct drm_bridge *bridge, struct drm_connector *connector)
{
- struct analogix_dp_device *dp = to_dp(connector);
- const struct drm_edid *drm_edid;
+ struct analogix_dp_device *dp = to_dp(bridge);
int num_modes = 0;
- if (dp->plat_data->panel) {
+ if (dp->plat_data->panel)
num_modes += drm_panel_get_modes(dp->plat_data->panel, connector);
- } else {
- drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc);
-
- drm_edid_connector_update(&dp->connector, drm_edid);
-
- if (drm_edid) {
- num_modes += drm_edid_connector_add_modes(&dp->connector);
- drm_edid_free(drm_edid);
- }
- }
return num_modes;
}
-static struct drm_encoder *
-analogix_dp_best_encoder(struct drm_connector *connector)
+static const struct drm_edid *analogix_dp_bridge_edid_read(struct drm_bridge *bridge,
+ struct drm_connector *connector)
{
- struct analogix_dp_device *dp = to_dp(connector);
+ struct analogix_dp_device *dp = to_dp(bridge);
- return dp->encoder;
+ return drm_edid_read_ddc(connector, &dp->aux.ddc);
}
-
-static int analogix_dp_atomic_check(struct drm_connector *connector,
- struct drm_atomic_state *state)
+static int analogix_dp_bridge_atomic_check(struct drm_bridge *bridge,
+ struct drm_bridge_state *bridge_state,
+ struct drm_crtc_state *crtc_state,
+ struct drm_connector_state *conn_state)
{
- struct analogix_dp_device *dp = to_dp(connector);
- struct drm_display_info *di = &connector->display_info;
- struct drm_connector_state *conn_state;
- struct drm_crtc_state *crtc_state;
+ struct analogix_dp_device *dp = to_dp(bridge);
+ struct drm_display_info *di = &conn_state->connector->display_info;
u32 mask = DRM_COLOR_FORMAT_YCBCR444 | DRM_COLOR_FORMAT_YCBCR422;
if (is_rockchip(dp->plat_data->dev_type)) {
@@ -905,38 +893,21 @@ static int analogix_dp_atomic_check(struct drm_connector *connector,
}
}
- conn_state = drm_atomic_get_new_connector_state(state, connector);
- if (WARN_ON(!conn_state))
- return -ENODEV;
-
conn_state->self_refresh_aware = true;
- if (!conn_state->crtc)
- return 0;
-
- crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
- if (!crtc_state)
- return 0;
-
if (crtc_state->self_refresh_active && !dp->psr_supported)
return -EINVAL;
return 0;
}
-static const struct drm_connector_helper_funcs analogix_dp_connector_helper_funcs = {
- .get_modes = analogix_dp_get_modes,
- .best_encoder = analogix_dp_best_encoder,
- .atomic_check = analogix_dp_atomic_check,
-};
-
static enum drm_connector_status
-analogix_dp_detect(struct drm_connector *connector, bool force)
+analogix_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{
- struct analogix_dp_device *dp = to_dp(connector);
+ struct analogix_dp_device *dp = to_dp(bridge);
enum drm_connector_status status = connector_status_disconnected;
- if (dp->plat_data->panel)
+ if (dp->plat_data->panel || dp->plat_data->next_bridge)
return connector_status_connected;
if (!analogix_dp_detect_hpd(dp))
@@ -945,53 +916,20 @@ analogix_dp_detect(struct drm_connector *connector, bool force)
return status;
}
-static const struct drm_connector_funcs analogix_dp_connector_funcs = {
- .fill_modes = drm_helper_probe_single_connector_modes,
- .detect = analogix_dp_detect,
- .destroy = drm_connector_cleanup,
- .reset = drm_atomic_helper_connector_reset,
- .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
- .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
struct drm_encoder *encoder,
enum drm_bridge_attach_flags flags)
{
struct analogix_dp_device *dp = to_dp(bridge);
- struct drm_connector *connector = NULL;
int ret = 0;
- if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
- DRM_ERROR("Fix bridge driver to make connector optional!");
+ if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
+ DRM_ERROR("Unsupported connector creation\n");
return -EINVAL;
}
- if (!dp->plat_data->next_bridge) {
- connector = &dp->connector;
- connector->polled = DRM_CONNECTOR_POLL_HPD;
-
- ret = drm_connector_init(dp->drm_dev, connector,
- &analogix_dp_connector_funcs,
- DRM_MODE_CONNECTOR_eDP);
- if (ret) {
- DRM_ERROR("Failed to initialize connector with drm\n");
- return ret;
- }
-
- drm_connector_helper_add(connector,
- &analogix_dp_connector_helper_funcs);
- drm_connector_attach_encoder(connector, encoder);
- }
-
- /*
- * NOTE: the connector registration is implemented in analogix
- * platform driver, that to say connector would be exist after
- * plat_data->attch return, that's why we record the connector
- * point after plat attached.
- */
if (dp->plat_data->attach) {
- ret = dp->plat_data->attach(dp->plat_data, bridge, connector);
+ ret = dp->plat_data->attach(dp->plat_data, bridge);
if (ret) {
DRM_ERROR("Failed at platform attach func\n");
return ret;
@@ -1095,14 +1033,21 @@ static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
}
static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge,
+ struct drm_atomic_state *state,
const struct drm_display_mode *mode)
{
struct analogix_dp_device *dp = to_dp(bridge);
- struct drm_display_info *display_info = &dp->connector.display_info;
struct video_info *video = &dp->video_info;
struct device_node *dp_node = dp->dev->of_node;
+ struct drm_connector *connector;
+ struct drm_display_info *display_info;
int vic;
+ connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
+ if (!connector)
+ return;
+ display_info = &connector->display_info;
+
/* Input video interlaces & hsync pol & vsync pol */
video->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);
@@ -1186,7 +1131,7 @@ static void analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge,
new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc);
if (!new_crtc_state)
return;
- analogix_dp_bridge_mode_set(bridge, &new_crtc_state->adjusted_mode);
+ analogix_dp_bridge_mode_set(bridge, old_state, &new_crtc_state->adjusted_mode);
old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc);
/* Not a full enable, just disable PSR and continue */
@@ -1302,7 +1247,11 @@ static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
.atomic_enable = analogix_dp_bridge_atomic_enable,
.atomic_disable = analogix_dp_bridge_atomic_disable,
.atomic_post_disable = analogix_dp_bridge_atomic_post_disable,
+ .atomic_check = analogix_dp_bridge_atomic_check,
.attach = analogix_dp_bridge_attach,
+ .get_modes = analogix_dp_bridge_get_modes,
+ .edid_read = analogix_dp_bridge_edid_read,
+ .detect = analogix_dp_bridge_detect,
};
static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp)
@@ -1532,6 +1481,7 @@ EXPORT_SYMBOL_GPL(analogix_dp_resume);
int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
{
+ struct drm_bridge *bridge = &dp->bridge;
int ret;
dp->drm_dev = drm_dev;
@@ -1545,7 +1495,18 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
return ret;
}
- ret = drm_bridge_attach(dp->encoder, &dp->bridge, NULL, 0);
+ if (dp->plat_data->panel)
+ bridge->ops = DRM_BRIDGE_OP_MODES | DRM_BRIDGE_OP_DETECT;
+ else
+ bridge->ops = DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT;
+
+ bridge->of_node = dp->dev->of_node;
+ bridge->type = DRM_MODE_CONNECTOR_eDP;
+ ret = devm_drm_bridge_add(dp->dev, &dp->bridge);
+ if (ret)
+ goto err_unregister_aux;
+
+ ret = drm_bridge_attach(dp->encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret) {
DRM_ERROR("failed to create bridge (%d)\n", ret);
goto err_unregister_aux;
@@ -1563,7 +1524,6 @@ EXPORT_SYMBOL_GPL(analogix_dp_bind);
void analogix_dp_unbind(struct analogix_dp_device *dp)
{
analogix_dp_bridge_disable(&dp->bridge);
- dp->connector.funcs->destroy(&dp->connector);
drm_panel_unprepare(dp->plat_data->panel);
@@ -1573,7 +1533,8 @@ EXPORT_SYMBOL_GPL(analogix_dp_unbind);
int analogix_dp_start_crc(struct drm_connector *connector)
{
- struct analogix_dp_device *dp = to_dp(connector);
+ struct analogix_dp_device *dp;
+ struct drm_bridge *bridge;
if (!connector->state->crtc) {
DRM_ERROR("Connector %s doesn't currently have a CRTC.\n",
@@ -1581,13 +1542,26 @@ int analogix_dp_start_crc(struct drm_connector *connector)
return -EINVAL;
}
+ bridge = drm_bridge_chain_get_first_bridge(connector->encoder);
+ if (bridge->type != DRM_MODE_CONNECTOR_eDP)
+ return -EINVAL;
+
+ dp = to_dp(bridge);
+
return drm_dp_start_crc(&dp->aux, connector->state->crtc);
}
EXPORT_SYMBOL_GPL(analogix_dp_start_crc);
int analogix_dp_stop_crc(struct drm_connector *connector)
{
- struct analogix_dp_device *dp = to_dp(connector);
+ struct analogix_dp_device *dp;
+ struct drm_bridge *bridge;
+
+ bridge = drm_bridge_chain_get_first_bridge(connector->encoder);
+ if (bridge->type != DRM_MODE_CONNECTOR_eDP)
+ return -EINVAL;
+
+ dp = to_dp(bridge);
return drm_dp_stop_crc(&dp->aux);
}
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
index 91b215c6a0cf..17347448c6b0 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -154,7 +154,6 @@ struct analogix_dp_device {
struct drm_encoder *encoder;
struct device *dev;
struct drm_device *drm_dev;
- struct drm_connector connector;
struct drm_bridge bridge;
struct drm_dp_aux aux;
struct clk *clock;
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig
index 380d9a8ce259..38bf070866f6 100644
--- a/drivers/gpu/drm/exynos/Kconfig
+++ b/drivers/gpu/drm/exynos/Kconfig
@@ -70,6 +70,7 @@ config DRM_EXYNOS_DP
bool "Exynos specific extensions for Analogix DP driver"
depends on DRM_EXYNOS_FIMD || DRM_EXYNOS7_DECON
select DRM_ANALOGIX_DP
+ select DRM_BRIDGE_CONNECTOR
select DRM_DISPLAY_DP_HELPER
default DRM_EXYNOS
select DRM_OF_DISPLAY_MODE_BRIDGE
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index 1eeb0b15f99a..478eaa6f3175 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -22,6 +22,7 @@
#include <drm/bridge/of-display-mode-bridge.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
+#include <drm/drm_bridge_connector.h>
#include <drm/drm_crtc.h>
#include <drm/drm_of.h>
#include <drm/drm_panel.h>
@@ -41,8 +42,6 @@ struct exynos_dp_device {
struct analogix_dp_device *adp;
struct analogix_dp_plat_data plat_data;
-
- bool has_of_bridge;
};
static int exynos_dp_crtc_clock_enable(struct analogix_dp_plat_data *plat_data,
@@ -70,19 +69,15 @@ static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data)
}
static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
- struct drm_bridge *bridge,
- struct drm_connector *connector)
+ struct drm_bridge *bridge)
{
struct exynos_dp_device *dp = to_dp(plat_data);
- enum drm_bridge_attach_flags flags = 0;
int ret;
/* Pre-empt DP connector creation if there's a bridge */
if (plat_data->next_bridge) {
- if (dp->has_of_bridge)
- flags = DRM_BRIDGE_ATTACH_NO_CONNECTOR;
-
- ret = drm_bridge_attach(&dp->encoder, plat_data->next_bridge, bridge, flags);
+ ret = drm_bridge_attach(&dp->encoder, plat_data->next_bridge, bridge,
+ DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret)
return ret;
}
@@ -112,6 +107,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
struct exynos_dp_device *dp = dev_get_drvdata(dev);
struct drm_encoder *encoder = &dp->encoder;
struct drm_device *drm_dev = data;
+ struct drm_connector *connector;
int ret;
dp->drm_dev = drm_dev;
@@ -127,10 +123,19 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
dp->plat_data.encoder = encoder;
ret = analogix_dp_bind(dp->adp, dp->drm_dev);
- if (ret)
+ if (ret) {
dp->encoder.funcs->destroy(&dp->encoder);
+ return ret;
+ }
+
+ connector = drm_bridge_connector_init(dp->drm_dev, dp->plat_data.encoder);
+ if (IS_ERR(connector)) {
+ ret = PTR_ERR(connector);
+ dev_err(dp->dev, "Failed to initialize bridge_connector\n");
+ return ret;
+ }
- return ret;
+ return drm_connector_attach_encoder(connector, dp->plat_data.encoder);
}
static void exynos_dp_unbind(struct device *dev, struct device *master,
@@ -187,8 +192,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
dp->dev->of_node,
DRM_MODE_CONNECTOR_eDP);
ret = IS_ERR(dp->plat_data.next_bridge) ? PTR_ERR(dp->plat_data.next_bridge) : 0;
- if (!ret)
- dp->has_of_bridge = true;
}
if (ret)
return ret;
diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index b7b025814e72..61e95a3ca6ab 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -43,6 +43,7 @@ config ROCKCHIP_VOP2
config ROCKCHIP_ANALOGIX_DP
bool "Rockchip specific extensions for Analogix DP driver"
depends on ROCKCHIP_VOP
+ select DRM_BRIDGE_CONNECTOR
select DRM_DISPLAY_HELPER
select DRM_DISPLAY_DP_HELPER
help
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 70fe5ae69e2e..7fa17ba26c46 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -25,6 +25,7 @@
#include <drm/display/drm_dp_helper.h>
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
+#include <drm/drm_bridge_connector.h>
#include <drm/bridge/analogix_dp.h>
#include <drm/drm_of.h>
#include <drm/drm_panel.h>
@@ -369,6 +370,7 @@ static int rockchip_dp_bind(struct device *dev, struct device *master,
{
struct rockchip_dp_device *dp = dev_get_drvdata(dev);
struct drm_device *drm_dev = data;
+ struct drm_connector *connector;
int ret;
dp->drm_dev = drm_dev;
@@ -388,7 +390,14 @@ static int rockchip_dp_bind(struct device *dev, struct device *master,
if (ret)
goto err_cleanup_encoder;
- return 0;
+ connector = drm_bridge_connector_init(dp->drm_dev, dp->plat_data.encoder);
+ if (IS_ERR(connector)) {
+ ret = PTR_ERR(connector);
+ dev_err(dp->dev, "Failed to initialize bridge_connector\n");
+ goto err_cleanup_encoder;
+ }
+
+ return drm_connector_attach_encoder(connector, dp->plat_data.encoder);
err_cleanup_encoder:
dp->encoder.encoder.funcs->destroy(&dp->encoder.encoder);
return ret;
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index 3301392eda5f..3428ffff24c5 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -33,8 +33,7 @@ struct analogix_dp_plat_data {
int (*power_on)(struct analogix_dp_plat_data *);
int (*power_off)(struct analogix_dp_plat_data *);
- int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *,
- struct drm_connector *);
+ int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *);
};
int analogix_dp_resume(struct analogix_dp_device *dp);
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 13/18] drm/bridge: analogix_dp: Add new API analogix_dp_finish_probe()
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (11 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 12/18] drm/bridge: analogix_dp: Apply drm_bridge_connector helper Damon Ding
@ 2025-12-17 9:33 ` Damon Ding
2025-12-17 9:59 ` [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe() Damon Ding
` (3 subsequent siblings)
16 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:33 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
Since the panel/bridge should logically be positioned behind the
Analogix bridge in the display pipeline, it makes sense to handle
the panel/bridge parsing on the Analogix side. Therefore, we add
a new API analogix_dp_finish_probe(), which combines the panel/bridge
parsing with component addition, to do it.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
Changes in v4:
- Rename the &analogix_dp_plat_data.bridge to
&analogix_dp_plat_data.next_bridge.
- Remame API analogix_dp_find_panel_or_bridge() to
analogix_dp_finish_probe().
Changes in v5:
- Select DRM_DISPLAY_DP_AUX_BUS for DRM_ANALOGIX_DP.
---
drivers/gpu/drm/bridge/analogix/Kconfig | 1 +
.../drm/bridge/analogix/analogix_dp_core.c | 48 +++++++++++++++++++
include/drm/bridge/analogix_dp.h | 2 +
3 files changed, 51 insertions(+)
diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig
index 4846b2e9be7c..964122b5bd39 100644
--- a/drivers/gpu/drm/bridge/analogix/Kconfig
+++ b/drivers/gpu/drm/bridge/analogix/Kconfig
@@ -29,6 +29,7 @@ config DRM_ANALOGIX_ANX78XX
config DRM_ANALOGIX_DP
tristate
depends on DRM
+ select DRM_DISPLAY_DP_AUX_BUS
config DRM_ANALOGIX_ANX7625
tristate "Analogix Anx7625 MIPI to DP interface support"
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 81c6e81dd352..933f1843777f 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -20,12 +20,14 @@
#include <linux/platform_device.h>
#include <drm/bridge/analogix_dp.h>
+#include <drm/display/drm_dp_aux_bus.h>
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_crtc.h>
#include <drm/drm_device.h>
#include <drm/drm_edid.h>
+#include <drm/drm_of.h>
#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
@@ -1581,6 +1583,52 @@ struct drm_dp_aux *analogix_dp_get_aux(struct analogix_dp_device *dp)
}
EXPORT_SYMBOL_GPL(analogix_dp_get_aux);
+static int analogix_dp_aux_done_probing(struct drm_dp_aux *aux)
+{
+ struct analogix_dp_device *dp = to_dp(aux);
+ struct analogix_dp_plat_data *plat_data = dp->plat_data;
+ int port = plat_data->dev_type == EXYNOS_DP ? 0 : 1;
+ int ret;
+
+ /*
+ * If drm_of_find_panel_or_bridge() returns -ENODEV, there may be no valid panel
+ * or bridge nodes. The driver should go on for the driver-free bridge or the DP
+ * mode applications.
+ */
+ ret = drm_of_find_panel_or_bridge(dp->dev->of_node, port, 0,
+ &plat_data->panel, &plat_data->next_bridge);
+ if (ret && ret != -ENODEV)
+ return ret;
+
+ return component_add(dp->dev, plat_data->ops);
+}
+
+int analogix_dp_finish_probe(struct analogix_dp_device *dp)
+{
+ int ret;
+
+ ret = devm_of_dp_aux_populate_bus(&dp->aux, analogix_dp_aux_done_probing);
+ if (ret) {
+ /*
+ * If devm_of_dp_aux_populate_bus() returns -ENODEV, the done_probing() will
+ * not be called because there are no EP devices. Then the callback function
+ * analogix_dp_aux_done_probing() will be called directly in order to support
+ * the other valid DT configurations.
+ *
+ * NOTE: The devm_of_dp_aux_populate_bus() is allowed to return -EPROBE_DEFER.
+ */
+ if (ret != -ENODEV) {
+ dev_err(dp->dev, "failed to populate aux bus\n");
+ return ret;
+ }
+
+ return analogix_dp_aux_done_probing(&dp->aux);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(analogix_dp_finish_probe);
+
MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
MODULE_DESCRIPTION("Analogix DP Core Driver");
MODULE_LICENSE("GPL v2");
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index 3428ffff24c5..bae969dec63a 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -30,6 +30,7 @@ struct analogix_dp_plat_data {
struct drm_bridge *next_bridge;
struct drm_encoder *encoder;
struct drm_connector *connector;
+ const struct component_ops *ops;
int (*power_on)(struct analogix_dp_plat_data *);
int (*power_off)(struct analogix_dp_plat_data *);
@@ -49,5 +50,6 @@ int analogix_dp_stop_crc(struct drm_connector *connector);
struct analogix_dp_plat_data *analogix_dp_aux_to_plat_data(struct drm_dp_aux *aux);
struct drm_dp_aux *analogix_dp_get_aux(struct analogix_dp_device *dp);
+int analogix_dp_finish_probe(struct analogix_dp_device *dp);
#endif /* _ANALOGIX_DP_H_ */
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe()
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (12 preceding siblings ...)
2025-12-17 9:33 ` [PATCH v8 13/18] drm/bridge: analogix_dp: Add new API analogix_dp_finish_probe() Damon Ding
@ 2025-12-17 9:59 ` Damon Ding
2025-12-17 9:59 ` [PATCH v8 15/18] drm/exynos: exynos_dp: " Damon Ding
` (3 more replies)
2026-01-17 7:45 ` [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (2 subsequent siblings)
16 siblings, 4 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:59 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
Apply analogix_dp_finish_probe() in order to move the panel/bridge
parsing from Rockchip side to the Analogix side.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
Changes in v4:
- Rename analogix_dp_find_panel_or_bridge() to
analogix_dp_finish_probe().
Changes in v5:
- Remove DRM_DISPLAY_DP_AUX_BUS for ROCKCHIP_ANALOGIX_DP
---
.../gpu/drm/rockchip/analogix_dp-rockchip.c | 38 +------------------
1 file changed, 2 insertions(+), 36 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 7fa17ba26c46..832e9766bef0 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -21,14 +21,12 @@
#include <video/of_videomode.h>
#include <video/videomode.h>
-#include <drm/display/drm_dp_aux_bus.h>
#include <drm/display/drm_dp_helper.h>
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge_connector.h>
#include <drm/bridge/analogix_dp.h>
#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_simple_kms_helper.h>
@@ -417,24 +415,6 @@ static const struct component_ops rockchip_dp_component_ops = {
.unbind = rockchip_dp_unbind,
};
-static int rockchip_dp_link_panel(struct drm_dp_aux *aux)
-{
- struct analogix_dp_plat_data *plat_data = analogix_dp_aux_to_plat_data(aux);
- struct rockchip_dp_device *dp = pdata_encoder_to_dp(plat_data);
- int ret;
-
- /*
- * If drm_of_find_panel_or_bridge() returns -ENODEV, there may be no valid panel
- * or bridge nodes. The driver should go on for the driver-free bridge or the DP
- * mode applications.
- */
- ret = drm_of_find_panel_or_bridge(dp->dev->of_node, 1, 0, &plat_data->panel, NULL);
- if (ret && ret != -ENODEV)
- return ret;
-
- return component_add(dp->dev, &rockchip_dp_component_ops);
-}
-
static int rockchip_dp_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -473,6 +453,7 @@ static int rockchip_dp_probe(struct platform_device *pdev)
dp->plat_data.dev_type = dp->data->chip_type;
dp->plat_data.power_on = rockchip_dp_poweron;
dp->plat_data.power_off = rockchip_dp_powerdown;
+ dp->plat_data.ops = &rockchip_dp_component_ops;
ret = rockchip_dp_of_probe(dp);
if (ret < 0)
@@ -484,22 +465,7 @@ static int rockchip_dp_probe(struct platform_device *pdev)
if (IS_ERR(dp->adp))
return PTR_ERR(dp->adp);
- ret = devm_of_dp_aux_populate_bus(analogix_dp_get_aux(dp->adp), rockchip_dp_link_panel);
- if (ret) {
- /*
- * If devm_of_dp_aux_populate_bus() returns -ENODEV, the done_probing() will not
- * be called because there are no EP devices. Then the rockchip_dp_link_panel()
- * will be called directly in order to support the other valid DT configurations.
- *
- * NOTE: The devm_of_dp_aux_populate_bus() is allowed to return -EPROBE_DEFER.
- */
- if (ret != -ENODEV)
- return dev_err_probe(dp->dev, ret, "failed to populate aux bus\n");
-
- return rockchip_dp_link_panel(analogix_dp_get_aux(dp->adp));
- }
-
- return 0;
+ return analogix_dp_finish_probe(dp->adp);
}
static void rockchip_dp_remove(struct platform_device *pdev)
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 15/18] drm/exynos: exynos_dp: Apply analogix_dp_finish_probe()
2025-12-17 9:59 ` [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe() Damon Ding
@ 2025-12-17 9:59 ` Damon Ding
2025-12-17 9:59 ` [PATCH v8 16/18] drm/bridge: analogix_dp: Attach the next bridge in analogix_dp_bridge_attach() Damon Ding
` (2 subsequent siblings)
3 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:59 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
Apply analogix_dp_finish_probe() in order to move the panel/bridge
parsing from Exynos side to the Analogix side.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
Changes in v4:
- Rename analogix_dp_find_panel_or_bridge() to
analogix_dp_finish_probe().
Changes in v7:
- Remove exynos_dp_legacy_bridge_init() and inline API
devm_drm_of_display_mode_bridge().
- If the panel or the next_bridge is parsed from DT, use ptr validity
to check whether to call component_add() directly at the end of
probing.
---
drivers/gpu/drm/exynos/exynos_dp.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index 478eaa6f3175..6126820aad3b 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -157,9 +157,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct device_node *np;
struct exynos_dp_device *dp;
- struct drm_panel *panel;
- struct drm_bridge *bridge;
- int ret;
dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
GFP_KERNEL);
@@ -186,30 +183,30 @@ static int exynos_dp_probe(struct platform_device *pdev)
goto out;
}
- ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &panel, &bridge);
- if (ret == -ENODEV) {
+ if (of_get_display_timings(dev->of_node)) {
dp->plat_data.next_bridge = devm_drm_of_display_mode_bridge(dp->dev,
dp->dev->of_node,
DRM_MODE_CONNECTOR_eDP);
- ret = IS_ERR(dp->plat_data.next_bridge) ? PTR_ERR(dp->plat_data.next_bridge) : 0;
+ if (IS_ERR(dp->plat_data.next_bridge))
+ return PTR_ERR(dp->plat_data.next_bridge);
}
- if (ret)
- return ret;
/* The remote port can be either a panel or a bridge */
- dp->plat_data.panel = panel;
- dp->plat_data.next_bridge = bridge;
dp->plat_data.dev_type = EXYNOS_DP;
dp->plat_data.power_on = exynos_dp_poweron;
dp->plat_data.power_off = exynos_dp_poweroff;
dp->plat_data.attach = exynos_dp_bridge_attach;
+ dp->plat_data.ops = &exynos_dp_ops;
out:
dp->adp = analogix_dp_probe(dev, &dp->plat_data);
if (IS_ERR(dp->adp))
return PTR_ERR(dp->adp);
- return component_add(&pdev->dev, &exynos_dp_ops);
+ if (dp->plat_data.panel || dp->plat_data.next_bridge)
+ return component_add(&pdev->dev, &exynos_dp_ops);
+ else
+ return analogix_dp_finish_probe(dp->adp);
}
static void exynos_dp_remove(struct platform_device *pdev)
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 16/18] drm/bridge: analogix_dp: Attach the next bridge in analogix_dp_bridge_attach()
2025-12-17 9:59 ` [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe() Damon Ding
2025-12-17 9:59 ` [PATCH v8 15/18] drm/exynos: exynos_dp: " Damon Ding
@ 2025-12-17 9:59 ` Damon Ding
2026-01-31 13:34 ` Luca Ceresoli
2025-12-17 9:59 ` [PATCH v8 17/18] drm/bridge: analogix_dp: Remove bridge disabing and panel unpreparing in analogix_dp_unbind() Damon Ding
2025-12-17 9:59 ` [PATCH v8 18/18] drm/bridge: analogix_dp: Apply panel_bridge helper Damon Ding
3 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:59 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
Uniformly, move the next bridge attachment to the Analogix side
rather than scattered on Rockchip and Exynos sides. It can also
help get rid of the callback &analogix_dp_plat_data.attach() and
make codes more concise.
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
------
Changes in v6:
- Move the next bridge attachment to the Analogix side rather than
scattered on Rockchip and Exynos sides.
---
.../gpu/drm/bridge/analogix/analogix_dp_core.c | 7 ++++---
drivers/gpu/drm/exynos/exynos_dp.c | 18 ------------------
include/drm/bridge/analogix_dp.h | 1 -
3 files changed, 4 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 933f1843777f..a6c5601e16ff 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -930,10 +930,11 @@ static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
return -EINVAL;
}
- if (dp->plat_data->attach) {
- ret = dp->plat_data->attach(dp->plat_data, bridge);
+ if (dp->plat_data->next_bridge) {
+ ret = drm_bridge_attach(dp->encoder, dp->plat_data->next_bridge, bridge,
+ DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret) {
- DRM_ERROR("Failed at platform attach func\n");
+ dev_err(dp->dev, "failed to attach following panel or bridge (%d)\n", ret);
return ret;
}
}
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index 6126820aad3b..6884ea6d04eb 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -68,23 +68,6 @@ static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data)
return exynos_dp_crtc_clock_enable(plat_data, false);
}
-static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
- struct drm_bridge *bridge)
-{
- struct exynos_dp_device *dp = to_dp(plat_data);
- int ret;
-
- /* Pre-empt DP connector creation if there's a bridge */
- if (plat_data->next_bridge) {
- ret = drm_bridge_attach(&dp->encoder, plat_data->next_bridge, bridge,
- DRM_BRIDGE_ATTACH_NO_CONNECTOR);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
static void exynos_dp_mode_set(struct drm_encoder *encoder,
struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
@@ -195,7 +178,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
dp->plat_data.dev_type = EXYNOS_DP;
dp->plat_data.power_on = exynos_dp_poweron;
dp->plat_data.power_off = exynos_dp_poweroff;
- dp->plat_data.attach = exynos_dp_bridge_attach;
dp->plat_data.ops = &exynos_dp_ops;
out:
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index bae969dec63a..854af692229b 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -34,7 +34,6 @@ struct analogix_dp_plat_data {
int (*power_on)(struct analogix_dp_plat_data *);
int (*power_off)(struct analogix_dp_plat_data *);
- int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *);
};
int analogix_dp_resume(struct analogix_dp_device *dp);
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 17/18] drm/bridge: analogix_dp: Remove bridge disabing and panel unpreparing in analogix_dp_unbind()
2025-12-17 9:59 ` [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe() Damon Ding
2025-12-17 9:59 ` [PATCH v8 15/18] drm/exynos: exynos_dp: " Damon Ding
2025-12-17 9:59 ` [PATCH v8 16/18] drm/bridge: analogix_dp: Attach the next bridge in analogix_dp_bridge_attach() Damon Ding
@ 2025-12-17 9:59 ` Damon Ding
2025-12-17 9:59 ` [PATCH v8 18/18] drm/bridge: analogix_dp: Apply panel_bridge helper Damon Ding
3 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:59 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
The analogix_dp_unbind() should be balanced with analogix_dp_bind().
There are no bridge enabling and panel preparing in analogix_dp_bind(),
so it should be reasonable to remove the bridge disabing and panel
unpreparing in analogix_dp_unbind().
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index a6c5601e16ff..7e3e9d4f4ea2 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1526,10 +1526,6 @@ EXPORT_SYMBOL_GPL(analogix_dp_bind);
void analogix_dp_unbind(struct analogix_dp_device *dp)
{
- analogix_dp_bridge_disable(&dp->bridge);
-
- drm_panel_unprepare(dp->plat_data->panel);
-
drm_dp_aux_unregister(&dp->aux);
}
EXPORT_SYMBOL_GPL(analogix_dp_unbind);
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH v8 18/18] drm/bridge: analogix_dp: Apply panel_bridge helper
2025-12-17 9:59 ` [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe() Damon Ding
` (2 preceding siblings ...)
2025-12-17 9:59 ` [PATCH v8 17/18] drm/bridge: analogix_dp: Remove bridge disabing and panel unpreparing in analogix_dp_unbind() Damon Ding
@ 2025-12-17 9:59 ` Damon Ding
3 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2025-12-17 9:59 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip, Damon Ding
In order to unify the handling of the panel and bridge, apply
panel_bridge helpers for Analogix DP driver. With this patch, the
bridge support will also become available.
The following changes have ben made:
- Apply plane_bridge helper to wrap the panel as the bridge.
- Remove the explicit panel APIs calls, which can be replaced with
the automic bridge APIs calls wrapped by the panel.
- Remove the unnecessary analogix_dp_bridge_get_modes().
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
Changes in v4:
- Rename the &analogix_dp_plat_data.bridge to
&analogix_dp_plat_data.next_bridge.
Changes in v5:
- Move panel_bridge addition a little forward.
- Move next_bridge attachment from Analogix side to Rockchip/Exynos
side.
Changes in v6
- Remove the unnecessary analogix_dp_bridge_get_modes().
- Not to set DRM_BRIDGE_OP_MODES if the next is a panel.
- Squash [PATCH v5 15/17]drm/bridge: analogix_dp: Remove panel
disabling and enabling in analogix_dp_set_bridge() into this
commit.
- Fix the &drm_bridge->ops to DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT.
---
.../drm/bridge/analogix/analogix_dp_core.c | 41 +++++--------------
1 file changed, 11 insertions(+), 30 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 7e3e9d4f4ea2..d2ea93e1c9a3 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -749,9 +749,6 @@ static int analogix_dp_commit(struct analogix_dp_device *dp)
{
int ret;
- /* Keep the panel disabled while we configure video */
- drm_panel_disable(dp->plat_data->panel);
-
ret = analogix_dp_train_link(dp);
if (ret) {
dev_err(dp->dev, "unable to do link train, ret=%d\n", ret);
@@ -771,9 +768,6 @@ static int analogix_dp_commit(struct analogix_dp_device *dp)
return ret;
}
- /* Safe to enable the panel now */
- drm_panel_enable(dp->plat_data->panel);
-
/* Check whether panel supports fast training */
ret = analogix_dp_fast_link_train_detection(dp);
if (ret)
@@ -858,17 +852,6 @@ static int analogix_dp_disable_psr(struct analogix_dp_device *dp)
return analogix_dp_send_psr_spd(dp, &psr_vsc, true);
}
-static int analogix_dp_bridge_get_modes(struct drm_bridge *bridge, struct drm_connector *connector)
-{
- struct analogix_dp_device *dp = to_dp(bridge);
- int num_modes = 0;
-
- if (dp->plat_data->panel)
- num_modes += drm_panel_get_modes(dp->plat_data->panel, connector);
-
- return num_modes;
-}
-
static const struct drm_edid *analogix_dp_bridge_edid_read(struct drm_bridge *bridge,
struct drm_connector *connector)
{
@@ -909,7 +892,7 @@ analogix_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *conne
struct analogix_dp_device *dp = to_dp(bridge);
enum drm_connector_status status = connector_status_disconnected;
- if (dp->plat_data->panel || dp->plat_data->next_bridge)
+ if (dp->plat_data->next_bridge)
return connector_status_connected;
if (!analogix_dp_detect_hpd(dp))
@@ -995,8 +978,6 @@ static void analogix_dp_bridge_atomic_pre_enable(struct drm_bridge *bridge,
/* Don't touch the panel if we're coming back from PSR */
if (old_crtc_state && old_crtc_state->self_refresh_active)
return;
-
- drm_panel_prepare(dp->plat_data->panel);
}
static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
@@ -1168,16 +1149,12 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
if (dp->dpms_mode != DRM_MODE_DPMS_ON)
return;
- drm_panel_disable(dp->plat_data->panel);
-
disable_irq(dp->irq);
analogix_dp_set_analog_power_down(dp, POWER_ALL, 1);
pm_runtime_put_sync(dp->dev);
- drm_panel_unprepare(dp->plat_data->panel);
-
dp->fast_train_enable = false;
dp->psr_supported = false;
dp->dpms_mode = DRM_MODE_DPMS_OFF;
@@ -1252,7 +1229,6 @@ static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
.atomic_post_disable = analogix_dp_bridge_atomic_post_disable,
.atomic_check = analogix_dp_bridge_atomic_check,
.attach = analogix_dp_bridge_attach,
- .get_modes = analogix_dp_bridge_get_modes,
.edid_read = analogix_dp_bridge_edid_read,
.detect = analogix_dp_bridge_detect,
};
@@ -1498,17 +1474,22 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
return ret;
}
- if (dp->plat_data->panel)
- bridge->ops = DRM_BRIDGE_OP_MODES | DRM_BRIDGE_OP_DETECT;
- else
- bridge->ops = DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT;
-
+ bridge->ops = DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT;
bridge->of_node = dp->dev->of_node;
bridge->type = DRM_MODE_CONNECTOR_eDP;
ret = devm_drm_bridge_add(dp->dev, &dp->bridge);
if (ret)
goto err_unregister_aux;
+ if (dp->plat_data->panel) {
+ dp->plat_data->next_bridge = devm_drm_panel_bridge_add(dp->dev,
+ dp->plat_data->panel);
+ if (IS_ERR(dp->plat_data->next_bridge)) {
+ ret = PTR_ERR(bridge);
+ goto err_unregister_aux;
+ }
+ }
+
ret = drm_bridge_attach(dp->encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret) {
DRM_ERROR("failed to create bridge (%d)\n", ret);
--
2.34.1
^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: [PATCH v8 01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities
2025-12-17 9:33 ` [PATCH v8 01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities Damon Ding
@ 2025-12-31 10:50 ` Luca Ceresoli
0 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2025-12-31 10:50 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> When multiple bridges are present, EDID detection capability
> (DRM_BRIDGE_OP_EDID) takes precedence over modes detection
> (DRM_BRIDGE_OP_MODES). To ensure the above two capabilities are
> determined by the last bridge in the chain, we handle three cases:
>
> Case 1: The later bridge declares only DRM_BRIDGE_OP_MODES
> - If the previous bridge declares DRM_BRIDGE_OP_EDID, set
> &drm_bridge_connector.bridge_edid to NULL and set
> &drm_bridge_connector.bridge_modes to the later bridge.
> - Ensure modes detection capability of the later bridge will not
> be ignored.
>
> Case 2: The later bridge declares only DRM_BRIDGE_OP_EDID
> - If the previous bridge declares DRM_BRIDGE_OP_MODES, set
> &drm_bridge_connector.bridge_modes to NULL and set
> &drm_bridge_connector.bridge_edid to the later bridge.
> - Although EDID detection capability has higher priority, this
> operation is for balance and makes sense.
>
> Case 3: the later bridge declares both of them
> - Assign later bridge as &drm_bridge_connector.bridge_edid and
> and &drm_bridge_connector.bridge_modes to this bridge.
> - Just leave transfer of these two capabilities as before.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge
2025-12-17 9:33 ` [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge Damon Ding
@ 2025-12-31 11:11 ` Luca Ceresoli
2026-01-04 2:51 ` Damon Ding
0 siblings, 1 reply; 41+ messages in thread
From: Luca Ceresoli @ 2025-12-31 11:11 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hello Damon,
On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> In order to move the panel/bridge parsing and attachmenet to the
> Analogix side, add component struct drm_bridge *next_bridge to
> platform data struct analogix_dp_plat_data.
>
> The movement makes sense because the panel/bridge should logically
> be positioned behind the Analogix bridge in the display pipeline.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>
> ---
>
> Changes in v4:
> - Rename the &analogix_dp_plat_data.bridge to
> &analogix_dp_plat_data.next_bridge
> ---
> include/drm/bridge/analogix_dp.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
> index cf17646c1310..582357c20640 100644
> --- a/include/drm/bridge/analogix_dp.h
> +++ b/include/drm/bridge/analogix_dp.h
> @@ -27,6 +27,7 @@ static inline bool is_rockchip(enum analogix_dp_devtype type)
> struct analogix_dp_plat_data {
> enum analogix_dp_devtype dev_type;
> struct drm_panel *panel;
> + struct drm_bridge *next_bridge;
> struct drm_encoder *encoder;
> struct drm_connector *connector;
> bool skip_connector;
It took a while to understand why you are adding the next_bridge pointer in
struct analogix_dp_plat_data instead of struct analogix_dp_device, where it
would be more natural. I found an answer in patch 16: with current code you
need to place next_bridge in struct analogix_dp_plat_data because it is
used by user drivers to attach, and those drivers have no access to struct
analogix_dp_device. However patch 16 (which looks a very good cleanup BTW)
next_bridge can be moved to struct analogix_dp_device.
So I'd suggest to move patch 16 before this one if it easily doable, so
that you can introduce next_bridge in struct analogix_dp_device from the
beginning. Should that be impossible, you can send a separate patch to move
next_bridge, after patch 16.
Best regards,
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge
2025-12-31 11:11 ` Luca Ceresoli
@ 2026-01-04 2:51 ` Damon Ding
2026-01-07 2:36 ` Damon Ding
0 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2026-01-04 2:51 UTC (permalink / raw)
To: Luca Ceresoli, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hi Luca,
On 12/31/2025 7:11 PM, Luca Ceresoli wrote:
> Hello Damon,
>
> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
>> In order to move the panel/bridge parsing and attachmenet to the
>> Analogix side, add component struct drm_bridge *next_bridge to
>> platform data struct analogix_dp_plat_data.
>>
>> The movement makes sense because the panel/bridge should logically
>> be positioned behind the Analogix bridge in the display pipeline.
>>
>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>
>> ---
>>
>> Changes in v4:
>> - Rename the &analogix_dp_plat_data.bridge to
>> &analogix_dp_plat_data.next_bridge
>> ---
>> include/drm/bridge/analogix_dp.h | 1 +
>> 1 file changed, 1 insertion(+)
>>
>> diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
>> index cf17646c1310..582357c20640 100644
>> --- a/include/drm/bridge/analogix_dp.h
>> +++ b/include/drm/bridge/analogix_dp.h
>> @@ -27,6 +27,7 @@ static inline bool is_rockchip(enum analogix_dp_devtype type)
>> struct analogix_dp_plat_data {
>> enum analogix_dp_devtype dev_type;
>> struct drm_panel *panel;
>> + struct drm_bridge *next_bridge;
>> struct drm_encoder *encoder;
>> struct drm_connector *connector;
>> bool skip_connector;
>
> It took a while to understand why you are adding the next_bridge pointer in
> struct analogix_dp_plat_data instead of struct analogix_dp_device, where it
> would be more natural. I found an answer in patch 16: with current code you
> need to place next_bridge in struct analogix_dp_plat_data because it is
> used by user drivers to attach, and those drivers have no access to struct
> analogix_dp_device. However patch 16 (which looks a very good cleanup BTW)
> next_bridge can be moved to struct analogix_dp_device.
>
> So I'd suggest to move patch 16 before this one if it easily doable, so
> that you can introduce next_bridge in struct analogix_dp_device from the
> beginning. Should that be impossible, you can send a separate patch to move
> next_bridge, after patch 16.
>
>
Thanks for your nice suggestion! After patch 16, bridge attachment is
unified to the Analogix side, which acts as a common bridge driver for
both the Rockchip and Exynos sides, so moving next_bridge there makes
perfect sense. I will add a separate patch to move next_bridge in v9.
Best regards,
Damon
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge
2026-01-04 2:51 ` Damon Ding
@ 2026-01-07 2:36 ` Damon Ding
2026-01-31 13:41 ` Luca Ceresoli
0 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2026-01-07 2:36 UTC (permalink / raw)
To: Luca Ceresoli, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hi Luca,
On 1/4/2026 10:51 AM, Damon Ding wrote:
> Hi Luca,
>
> On 12/31/2025 7:11 PM, Luca Ceresoli wrote:
>> Hello Damon,
>>
>> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
>>> In order to move the panel/bridge parsing and attachmenet to the
>>> Analogix side, add component struct drm_bridge *next_bridge to
>>> platform data struct analogix_dp_plat_data.
>>>
>>> The movement makes sense because the panel/bridge should logically
>>> be positioned behind the Analogix bridge in the display pipeline.
>>>
>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>>
>>> ---
>>>
>>> Changes in v4:
>>> - Rename the &analogix_dp_plat_data.bridge to
>>> &analogix_dp_plat_data.next_bridge
>>> ---
>>> include/drm/bridge/analogix_dp.h | 1 +
>>> 1 file changed, 1 insertion(+)
>>>
>>> diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/
>>> analogix_dp.h
>>> index cf17646c1310..582357c20640 100644
>>> --- a/include/drm/bridge/analogix_dp.h
>>> +++ b/include/drm/bridge/analogix_dp.h
>>> @@ -27,6 +27,7 @@ static inline bool is_rockchip(enum
>>> analogix_dp_devtype type)
>>> struct analogix_dp_plat_data {
>>> enum analogix_dp_devtype dev_type;
>>> struct drm_panel *panel;
>>> + struct drm_bridge *next_bridge;
>>> struct drm_encoder *encoder;
>>> struct drm_connector *connector;
>>> bool skip_connector;
>>
>> It took a while to understand why you are adding the next_bridge
>> pointer in
>> struct analogix_dp_plat_data instead of struct analogix_dp_device,
>> where it
>> would be more natural. I found an answer in patch 16: with current
>> code you
>> need to place next_bridge in struct analogix_dp_plat_data because it is
>> used by user drivers to attach, and those drivers have no access to
>> struct
>> analogix_dp_device. However patch 16 (which looks a very good cleanup
>> BTW)
>> next_bridge can be moved to struct analogix_dp_device.
>>
>> So I'd suggest to move patch 16 before this one if it easily doable, so
>> that you can introduce next_bridge in struct analogix_dp_device from the
>> beginning. Should that be impossible, you can send a separate patch to
>> move
>> next_bridge, after patch 16.
>>
>>
>
> Thanks for your nice suggestion! After patch 16, bridge attachment is
> unified to the Analogix side, which acts as a common bridge driver for
> both the Rockchip and Exynos sides, so moving next_bridge there makes
> perfect sense. I will add a separate patch to move next_bridge in v9.
>
>
My apologies for reversing the plan to move next_bridge to the Analogix
side in v9 -- I only considered the Rockchip side before.
When I tried modifying the code based on your suggestion, I found it
better to keep &analogix_plat_data.next_bridge as is. This is because
the Exynos side needs to maintain compatibility with the legacy method
of parsing panels and bridges, so the next bridge isn't always parsed by
the common Analogix side driver.
This patch series has been pending for ages, and I'm even a bit fuzzy on
the details myself. ;-)
Best regards,
Damon
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (13 preceding siblings ...)
2025-12-17 9:59 ` [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe() Damon Ding
@ 2026-01-17 7:45 ` Damon Ding
2026-01-19 16:06 ` Heiko Stübner
2026-02-03 11:53 ` (subset) " Luca Ceresoli
16 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2026-01-17 7:45 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel,
dri-devel, imx, linux-arm-kernel, linux-samsung-soc,
linux-rockchip
Ping......
On 12/17/2025 5:33 PM, Damon Ding wrote:
> PATCH 1 is to ensure the last bridge declares OP_EDID or OP_MODES or both.
> PATCH 2 is a small format optimization for struct analogid_dp_device.
> PATCH 3 is to perform mode setting in &drm_bridge_funcs.atomic_enable.
> PATCH 4 is to add a new parameter to store the point of next bridge.
> PATCH 5 is to make legacy bridge driver more universal.
> PATCH 6-11 are preparations for apply drm_bridge_connector helper.
> PATCH 12 is to apply the drm_bridge_connector helper.
> PATCH 13-15 are to move the panel/bridge parsing to the Analogix side.
> PATCH 16 is to attach the next bridge on Analogix side uniformly.
> PATCH 17-18 are to apply the panel_bridge helper.
>
> The following reviewed commits, which to make codes more concise, are
> rebased to the front of this patch series:
>
> https://lore.kernel.org/all/20251110085823.1197472-1-damon.ding@rock-chips.com/
> https://lore.kernel.org/all/20251111022103.1350183-1-damon.ding@rock-chips.com/
>
> Damon Ding (18):
> drm/display: bridge_connector: Ensure last bridge determines
> EDID/modes detection capabilities
> drm/bridge: analogix_dp: Formalize the struct analogix_dp_device
> drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to
> &drm_bridge_funcs.atomic_enable
> drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge
> drm/bridge: Move legacy bridge driver out of imx directory for
> multi-platform use
> drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge
> drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector
> drm/exynos: exynos_dp: Apply of-display-mode-bridge to parse the
> display-timings node
> drm/bridge: analogix_dp: Remove redundant
> &analogix_dp_plat_data.skip_connector
> drm/bridge: analogix_dp: Move the color format check to
> .atomic_check() for Rockchip platforms
> drm/bridge: analogix_dp: Remove unused
> &analogix_dp_plat_data.get_modes()
> drm/bridge: analogix_dp: Apply drm_bridge_connector helper
> drm/bridge: analogix_dp: Add new API analogix_dp_finish_probe()
> drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe()
> drm/exynos: exynos_dp: Apply analogix_dp_finish_probe()
> drm/bridge: analogix_dp: Attach the next bridge in
> analogix_dp_bridge_attach()
> drm/bridge: analogix_dp: Remove bridge disabing and panel unpreparing
> in analogix_dp_unbind()
> drm/bridge: analogix_dp: Apply panel_bridge helper
>
> drivers/gpu/drm/bridge/Kconfig | 10 +
> drivers/gpu/drm/bridge/Makefile | 1 +
> drivers/gpu/drm/bridge/analogix/Kconfig | 1 +
> .../drm/bridge/analogix/analogix_dp_core.c | 395 +++++++++---------
> .../drm/bridge/analogix/analogix_dp_core.h | 5 +-
> drivers/gpu/drm/bridge/imx/Kconfig | 10 -
> drivers/gpu/drm/bridge/imx/Makefile | 1 -
> .../gpu/drm/bridge/imx/imx-legacy-bridge.c | 91 ----
> .../gpu/drm/bridge/of-display-mode-bridge.c | 93 +++++
> .../gpu/drm/display/drm_bridge_connector.c | 18 +-
> drivers/gpu/drm/exynos/Kconfig | 2 +
> drivers/gpu/drm/exynos/exynos_dp.c | 110 ++---
> drivers/gpu/drm/imx/ipuv3/Kconfig | 4 +-
> drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 6 +-
> drivers/gpu/drm/imx/ipuv3/parallel-display.c | 5 +-
> drivers/gpu/drm/rockchip/Kconfig | 1 +
> .../gpu/drm/rockchip/analogix_dp-rockchip.c | 67 +--
> include/drm/bridge/analogix_dp.h | 8 +-
> include/drm/bridge/imx.h | 17 -
> include/drm/bridge/of-display-mode-bridge.h | 17 +
> 20 files changed, 391 insertions(+), 471 deletions(-)
> delete mode 100644 drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c
> create mode 100644 drivers/gpu/drm/bridge/of-display-mode-bridge.c
> delete mode 100644 include/drm/bridge/imx.h
> create mode 100644 include/drm/bridge/of-display-mode-bridge.h
>
> ---
>
> Changes in v2:
> - Update Exynos DP driver synchronously.
> - Move the panel/bridge parsing to the Analogix side.
>
> Changes in v3:
> - Rebase for the existing devm_drm_bridge_alloc() applying commit.
> - Fix the typographical error of panel/bridge check in exynos_dp_bind().
> - Squash all commits related to skip_connector deletion in both Exynos and
> Analogix code into one.
> - Apply panel_bridge helper to make the codes more concise.
> - Fix the handing of bridge in analogix_dp_bridge_get_modes().
> - Remove unnecessary parameter struct drm_connector* for callback
> &analogix_dp_plat_data.attach().
> - In order to decouple the connector driver and the bridge driver, move
> the bridge connector initilization to the Rockchip and Exynos sides.
>
> Changes in v4:
> - Rebase for the applied &drm_bridge_funcs.detect() modification commit.
> - Rename analogix_dp_find_panel_or_bridge() to analogix_dp_finish_probe().
> - Drop the drmm_encoder_init() modification commit.
> - Rename the &analogix_dp_plat_data.bridge to
> &analogix_dp_plat_data.next_bridge.
>
> Changes in v5:
> - Add legacy bridge to parse the display-timings node under the dp node
> for Exynos side.
> - Move color format check to &drm_connector_helper_funcs.atomic_check()
> in order to get rid of &analogix_dp_plat_data.get_modes().
> - Remove unused callback &analogix_dp_plat_data.get_modes().
> - Distinguish the &drm_bridge->ops of Analogix bridge based on whether
> the downstream device is a panel, a bridge or neither.
> - Select DRM_DISPLAY_DP_AUX_BUS for DRM_ANALOGIX_DP, and remove it for
> ROCKCHIP_ANALOGIX_DP.
> - Apply rockchip_dp_attach() to support the next bridge attachment for
> the Rockchip side.
> - Move next_bridge attachment from Analogix side to Rockchip/Exynos sides.
>
> Changes in v6:
> - Move legacy bridge driver out of imx directory for multi-platform use.
> - Apply DRM legacy bridge to parse display timings intead of implementing
> the same codes only for Exynos DP.
> - Ensure last bridge determines EDID/modes detection capabilities in DRM
> bridge_connector driver.
> - Remove unnecessary drm_bridge_get_modes() in
> analogix_dp_bridge_get_modes().
> - Simplify analogix_dp_bridge_edid_read().
> - If the next is a bridge, set DRM_BRIDGE_OP_DETECT and return
> connector_status_connected in analogix_dp_bridge_detect().
> - Set flag DRM_BRIDGE_ATTACH_NO_CONNECTOR for bridge attachment while
> binding. Meanwhile, make DRM_BRIDGE_ATTACH_NO_CONNECTOR unsuppported
> in analogix_dp_bridge_attach().
> - Move the next bridge attachment to the Analogix side rather than
> scattered on Rockchip and Exynos sides.
> - Remove the unnecessary analogix_dp_bridge_get_modes().
> - Squash [PATCH v5 15/17] into [PATCH v5 17/17].
> - Fix the &drm_bridge->ops to DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_DETECT.
>
> Changes in v7:
> - As Luca suggested, simplify the code and related comment for bridge_connector
> modifications. Additionally, move the commit related to bridge_connector to
> the top of this patch series.
> - Rename legacy-bridge driver to of-display-mode-bridge driver.
> - Remove unnecessary API drm_bridge_is_legacy() and apply a temporary flag
> &exynos_dp_device.has_of_bridge instead, which will be removed finally.
> - Remove exynos_dp_legacy_bridge_init() and inline API
> devm_drm_of_display_mode_bridge().
>
> Changes in v8:
> - Adapt the related modifications to the newest bridge_connector driver.
>
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (14 preceding siblings ...)
2026-01-17 7:45 ` [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
@ 2026-01-19 16:06 ` Heiko Stübner
2026-02-02 1:33 ` Damon Ding
2026-02-03 11:11 ` Luca Ceresoli
2026-02-03 11:53 ` (subset) " Luca Ceresoli
16 siblings, 2 replies; 41+ messages in thread
From: Heiko Stübner @ 2026-01-19 16:06 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss, Damon Ding
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, andy.yan, dmitry.baryshkov, dianders,
m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel, dri-devel,
imx, linux-arm-kernel, linux-samsung-soc, linux-rockchip,
Damon Ding
Hi Damon,
Am Mittwoch, 17. Dezember 2025, 10:33:03 Mitteleuropäische Normalzeit schrieb Damon Ding:
> PATCH 1 is to ensure the last bridge declares OP_EDID or OP_MODES or both.
> PATCH 2 is a small format optimization for struct analogid_dp_device.
> PATCH 3 is to perform mode setting in &drm_bridge_funcs.atomic_enable.
> PATCH 4 is to add a new parameter to store the point of next bridge.
> PATCH 5 is to make legacy bridge driver more universal.
> PATCH 6-11 are preparations for apply drm_bridge_connector helper.
> PATCH 12 is to apply the drm_bridge_connector helper.
> PATCH 13-15 are to move the panel/bridge parsing to the Analogix side.
> PATCH 16 is to attach the next bridge on Analogix side uniformly.
> PATCH 17-18 are to apply the panel_bridge helper.
On top of all the recent bridge-related commits, this series still works
on my rk3588-eDP board - when the display is plugged in on boot.
As that is the current state we also had before, this series:
Tested-by: Heiko Stuebner <heiko@sntech.de> on rk3588
======
!!! The following should not hold up this series though, because the
analogix-dp not handling hotplug, is also the current state already!!!
======
However, actually hotplugging the device does not seem to work.
With the hpd-gpio inside a dp-connector node.
(1) When booting connected and unplugging the display I get:
[ 42.725888] rockchip-dp fdec0000.edp: Rx Max Link Rate is abnormal :0 !
[ 42.733325] rockchip-dp fdec0000.edp: Rx Max Lane count is abnormal :0 !
[ 42.764853] rockchip-dp fdec0000.edp: LT link start failed!
[ 42.771105] rockchip-dp fdec0000.edp: eDP link training failed (-110)
[ 42.778329] rockchip-dp fdec0000.edp: unable to do link train, ret=-110
[ 42.785747] [drm:analogix_dp_bridge_atomic_enable] *ERROR* dp commit error, ret = -110
( ... repeasts a bunch of times ... )
[ 43.284897] rockchip-dp fdec0000.edp: failed to set bridge, retry: 4
[ 43.292045] rockchip-dp fdec0000.edp: too many times retry set bridge, give it up
plugging the eDP back in reenables the display successfully though.
(2) Booting with the display unplugged
Same messages as above, but plugging the display in for the first time
does not create an output.
I'll try to dig more, but if you have an idea, what I should look at, I'd,
be really grateful.
Thanks
Heiko
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use
2025-12-17 9:33 ` [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use Damon Ding
@ 2026-01-31 12:33 ` Luca Ceresoli
2026-02-02 2:54 ` Damon Ding
0 siblings, 1 reply; 41+ messages in thread
From: Luca Ceresoli @ 2026-01-31 12:33 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hello Damon, Dmitry,
On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> As suggested by Dmitry, the DRM legacy bridge driver can be pulled
> out of imx/ subdir for multi-platform use. The driver is also renamed
> to make it more generic and suitable for platforms other than i.MX.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>
> ---
>
> Changes in v7:
> - Rename legacy-bridge to of-display-mode-bridge.
> - Remove unnecessary API drm_bridge_is_legacy().
...
> --- a/drivers/gpu/drm/bridge/Kconfig
> +++ b/drivers/gpu/drm/bridge/Kconfig
> @@ -244,6 +244,16 @@ config DRM_NXP_PTN3460
> help
> NXP PTN3460 eDP-LVDS bridge chip driver.
>
> +config DRM_OF_DISPLAY_MODE_BRIDGE
> + tristate
> + depends on DRM_BRIDGE && OF
> + help
> + This is a DRM bridge implementation that uses of_get_drm_display_mode
> + to acquire display mode.
> +
> + Newer designs should not use this bridge and should use proper panel
> + driver instead.
"Newer designs should not use this bridge", but in patch 8 you are
introducing a new use ot devm_drm_of_display_mode_bridge(). Shouldn't you
instead "use proper panel driver instead" in patch 8?
Can you point to the conversation where the converstaion where Dmitry
suggested this change? Maybe it already contains the answer to my
qustion. Also adding a link to that conversation in the commit message
woule be useful.
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 03/18] drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to &drm_bridge_funcs.atomic_enable
2025-12-17 9:33 ` [PATCH v8 03/18] drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to &drm_bridge_funcs.atomic_enable Damon Ding
@ 2026-01-31 12:50 ` Luca Ceresoli
0 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-01-31 12:50 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> According to the include/drm/drm_bridge.h, the callback
> &drm_bridge_funcs.mode_set is deprecated and it should be better to
> include the mode setting in the &drm_bridge_funcs.atomic_enable instead.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 02/18] drm/bridge: analogix_dp: Formalize the struct analogix_dp_device
2025-12-17 9:33 ` [PATCH v8 02/18] drm/bridge: analogix_dp: Formalize the struct analogix_dp_device Damon Ding
@ 2026-01-31 12:52 ` Luca Ceresoli
0 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-01-31 12:52 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> Use the tap instead of the space for &analogix_dp_device.aux and
tab
(no need to resend yust to fix this minor typo)
> &analogix_dp_device.force_hpd.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 16/18] drm/bridge: analogix_dp: Attach the next bridge in analogix_dp_bridge_attach()
2025-12-17 9:59 ` [PATCH v8 16/18] drm/bridge: analogix_dp: Attach the next bridge in analogix_dp_bridge_attach() Damon Ding
@ 2026-01-31 13:34 ` Luca Ceresoli
0 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-01-31 13:34 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed Dec 17, 2025 at 10:59 AM CET, Damon Ding wrote:
> Uniformly, move the next bridge attachment to the Analogix side
> rather than scattered on Rockchip and Exynos sides. It can also
> help get rid of the callback &analogix_dp_plat_data.attach() and
> make codes more concise.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 07/18] drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector
2025-12-17 9:33 ` [PATCH v8 07/18] drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector Damon Ding
@ 2026-01-31 13:40 ` Luca Ceresoli
0 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-01-31 13:40 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> The &exynos_dp_device.connector is assigned in exynos_dp_bridge_attach()
> but never used. It should make sense to remove it.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge
2026-01-07 2:36 ` Damon Ding
@ 2026-01-31 13:41 ` Luca Ceresoli
0 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-01-31 13:41 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed Jan 7, 2026 at 3:36 AM CET, Damon Ding wrote:
> Hi Luca,
>
> On 1/4/2026 10:51 AM, Damon Ding wrote:
>> Hi Luca,
>>
>> On 12/31/2025 7:11 PM, Luca Ceresoli wrote:
>>> Hello Damon,
>>>
>>> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
>>>> In order to move the panel/bridge parsing and attachmenet to the
>>>> Analogix side, add component struct drm_bridge *next_bridge to
>>>> platform data struct analogix_dp_plat_data.
>>>>
>>>> The movement makes sense because the panel/bridge should logically
>>>> be positioned behind the Analogix bridge in the display pipeline.
>>>>
>>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
>>>> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>>>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>>>
>>>> ---
>>>>
>>>> Changes in v4:
>>>> - Rename the &analogix_dp_plat_data.bridge to
>>>> &analogix_dp_plat_data.next_bridge
>>>> ---
>>>> include/drm/bridge/analogix_dp.h | 1 +
>>>> 1 file changed, 1 insertion(+)
>>>>
>>>> diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/
>>>> analogix_dp.h
>>>> index cf17646c1310..582357c20640 100644
>>>> --- a/include/drm/bridge/analogix_dp.h
>>>> +++ b/include/drm/bridge/analogix_dp.h
>>>> @@ -27,6 +27,7 @@ static inline bool is_rockchip(enum
>>>> analogix_dp_devtype type)
>>>> struct analogix_dp_plat_data {
>>>> enum analogix_dp_devtype dev_type;
>>>> struct drm_panel *panel;
>>>> + struct drm_bridge *next_bridge;
>>>> struct drm_encoder *encoder;
>>>> struct drm_connector *connector;
>>>> bool skip_connector;
>>>
>>> It took a while to understand why you are adding the next_bridge
>>> pointer in
>>> struct analogix_dp_plat_data instead of struct analogix_dp_device,
>>> where it
>>> would be more natural. I found an answer in patch 16: with current
>>> code you
>>> need to place next_bridge in struct analogix_dp_plat_data because it is
>>> used by user drivers to attach, and those drivers have no access to
>>> struct
>>> analogix_dp_device. However patch 16 (which looks a very good cleanup
>>> BTW)
>>> next_bridge can be moved to struct analogix_dp_device.
>>>
>>> So I'd suggest to move patch 16 before this one if it easily doable, so
>>> that you can introduce next_bridge in struct analogix_dp_device from the
>>> beginning. Should that be impossible, you can send a separate patch to
>>> move
>>> next_bridge, after patch 16.
>>>
>>>
>>
>> Thanks for your nice suggestion! After patch 16, bridge attachment is
>> unified to the Analogix side, which acts as a common bridge driver for
>> both the Rockchip and Exynos sides, so moving next_bridge there makes
>> perfect sense. I will add a separate patch to move next_bridge in v9.
>>
>>
>
> My apologies for reversing the plan to move next_bridge to the Analogix
> side in v9 -- I only considered the Rockchip side before.
>
> When I tried modifying the code based on your suggestion, I found it
> better to keep &analogix_plat_data.next_bridge as is. This is because
> the Exynos side needs to maintain compatibility with the legacy method
> of parsing panels and bridges, so the next bridge isn't always parsed by
> the common Analogix side driver.
>
> This patch series has been pending for ages, and I'm even a bit fuzzy on
> the details myself. ;-)
OK, makes sense.
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 06/18] drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge
2025-12-17 9:33 ` [PATCH v8 06/18] drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge Damon Ding
@ 2026-01-31 13:41 ` Luca Ceresoli
0 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-01-31 13:41 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> Use &analogix_dp_plat_data.bridge instead of &exynos_dp_device.ptn_bridge
> directly.
>
> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver
2026-01-19 16:06 ` Heiko Stübner
@ 2026-02-02 1:33 ` Damon Ding
2026-02-03 11:11 ` Luca Ceresoli
1 sibling, 0 replies; 41+ messages in thread
From: Damon Ding @ 2026-02-02 1:33 UTC (permalink / raw)
To: Heiko Stübner, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, andy.yan, dmitry.baryshkov, dianders,
m.szyprowski, luca.ceresoli, jani.nikula, linux-kernel, dri-devel,
imx, linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hi Heiko,
On 1/20/2026 12:06 AM, Heiko Stübner wrote:
> Hi Damon,
>
> Am Mittwoch, 17. Dezember 2025, 10:33:03 Mitteleuropäische Normalzeit schrieb Damon Ding:
>> PATCH 1 is to ensure the last bridge declares OP_EDID or OP_MODES or both.
>> PATCH 2 is a small format optimization for struct analogid_dp_device.
>> PATCH 3 is to perform mode setting in &drm_bridge_funcs.atomic_enable.
>> PATCH 4 is to add a new parameter to store the point of next bridge.
>> PATCH 5 is to make legacy bridge driver more universal.
>> PATCH 6-11 are preparations for apply drm_bridge_connector helper.
>> PATCH 12 is to apply the drm_bridge_connector helper.
>> PATCH 13-15 are to move the panel/bridge parsing to the Analogix side.
>> PATCH 16 is to attach the next bridge on Analogix side uniformly.
>> PATCH 17-18 are to apply the panel_bridge helper.
>
> On top of all the recent bridge-related commits, this series still works
> on my rk3588-eDP board - when the display is plugged in on boot.
>
> As that is the current state we also had before, this series:
> Tested-by: Heiko Stuebner <heiko@sntech.de> on rk3588
>
>
> ======
> !!! The following should not hold up this series though, because the
> analogix-dp not handling hotplug, is also the current state already!!!
> ======
>
> However, actually hotplugging the device does not seem to work.
>
> With the hpd-gpio inside a dp-connector node.
>
>
> (1) When booting connected and unplugging the display I get:
>
> [ 42.725888] rockchip-dp fdec0000.edp: Rx Max Link Rate is abnormal :0 !
> [ 42.733325] rockchip-dp fdec0000.edp: Rx Max Lane count is abnormal :0 !
> [ 42.764853] rockchip-dp fdec0000.edp: LT link start failed!
> [ 42.771105] rockchip-dp fdec0000.edp: eDP link training failed (-110)
> [ 42.778329] rockchip-dp fdec0000.edp: unable to do link train, ret=-110
> [ 42.785747] [drm:analogix_dp_bridge_atomic_enable] *ERROR* dp commit error, ret = -110
> ( ... repeasts a bunch of times ... )
> [ 43.284897] rockchip-dp fdec0000.edp: failed to set bridge, retry: 4
> [ 43.292045] rockchip-dp fdec0000.edp: too many times retry set bridge, give it up
>
> plugging the eDP back in reenables the display successfully though.
>
> (2) Booting with the display unplugged
>
> Same messages as above, but plugging the display in for the first time
> does not create an output.
>
> I'll try to dig more, but if you have an idea, what I should look at, I'd,
> be really grateful.
>
Sorry for the late reply. I've been heavily occupied with the downstream
work recently.
I can reproduce the same issue on my RK3576 IOTEST board, which is
equipped with a standard DP receptacle for eDP interface.
(BTW: The RK3576 Analogix DP functions properly with a set of targeted
changes, and I plan to upstream these modifications later. :-))
Regarding the eDP HPD exception, several functional patches for HPD
handling have not yet been synced to the upstream. I will verify these
changes and submit them when time permits.
Best regards,
Damon
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use
2026-01-31 12:33 ` Luca Ceresoli
@ 2026-02-02 2:54 ` Damon Ding
2026-02-03 1:31 ` Damon Ding
0 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2026-02-02 2:54 UTC (permalink / raw)
To: Luca Ceresoli, andrzej.hajda, neil.armstrong, rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hi Luca,
On 1/31/2026 8:33 PM, Luca Ceresoli wrote:
> Hello Damon, Dmitry,
>
> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
>> As suggested by Dmitry, the DRM legacy bridge driver can be pulled
>> out of imx/ subdir for multi-platform use. The driver is also renamed
>> to make it more generic and suitable for platforms other than i.MX.
>>
>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
>> Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>
>> ---
>>
>> Changes in v7:
>> - Rename legacy-bridge to of-display-mode-bridge.
>> - Remove unnecessary API drm_bridge_is_legacy().
>
> ...
>
>> --- a/drivers/gpu/drm/bridge/Kconfig
>> +++ b/drivers/gpu/drm/bridge/Kconfig
>> @@ -244,6 +244,16 @@ config DRM_NXP_PTN3460
>> help
>> NXP PTN3460 eDP-LVDS bridge chip driver.
>>
>> +config DRM_OF_DISPLAY_MODE_BRIDGE
>> + tristate
>> + depends on DRM_BRIDGE && OF
>> + help
>> + This is a DRM bridge implementation that uses of_get_drm_display_mode
>> + to acquire display mode.
>> +
>> + Newer designs should not use this bridge and should use proper panel
>> + driver instead.
>
> "Newer designs should not use this bridge", but in patch 8 you are
> introducing a new use ot devm_drm_of_display_mode_bridge(). Shouldn't you
> instead "use proper panel driver instead" in patch 8?
>
> Can you point to the conversation where the converstaion where Dmitry
> suggested this change? Maybe it already contains the answer to my
> qustion. Also adding a link to that conversation in the commit message
> woule be useful.
>
First of all, thanks for your reviews on this patch series.
link:
https://lore.kernel.org/all/xwenycscalzdlpuxytorbiyvej3k7pv3lhxwtadilxq65ipwsv@x5rxm53w5e22/
I think it may be a misleading issue caused by directly copying the
previous Kconfig description. Now that the new
devm_drm_of_display_mode_bridge() helper has been added, drivers using
the panel-bridge framework can rely on it to maintain compatibility with
legacy display mode parsing.
It would be better to update the comment as follows:
This is a DRM bridge implementation that uses of_get_drm_display_mode to
acquire display mode.
It exists for compatibility with legacy display mode parsing, in order
to conform to the panel-bridge framework.
Best regards,
Damon
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use
2026-02-02 2:54 ` Damon Ding
@ 2026-02-03 1:31 ` Damon Ding
2026-02-03 10:11 ` Luca Ceresoli
0 siblings, 1 reply; 41+ messages in thread
From: Damon Ding @ 2026-02-03 1:31 UTC (permalink / raw)
To: Luca Ceresoli, andrzej.hajda, neil.armstrong, rfoss,
dmitry.baryshkov
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dianders, m.szyprowski,
jani.nikula, linux-kernel, dri-devel, imx, linux-arm-kernel,
linux-samsung-soc, linux-rockchip
Hi,
On 2/2/2026 10:54 AM, Damon Ding wrote:
> Hi Luca,
>
> On 1/31/2026 8:33 PM, Luca Ceresoli wrote:
>> Hello Damon, Dmitry,
>>
>> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
>>> As suggested by Dmitry, the DRM legacy bridge driver can be pulled
>>> out of imx/ subdir for multi-platform use. The driver is also renamed
>>> to make it more generic and suitable for platforms other than i.MX.
>>>
>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
>>> Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>>
>>> ---
>>>
>>> Changes in v7:
>>> - Rename legacy-bridge to of-display-mode-bridge.
>>> - Remove unnecessary API drm_bridge_is_legacy().
>>
>> ...
>>
>>> --- a/drivers/gpu/drm/bridge/Kconfig
>>> +++ b/drivers/gpu/drm/bridge/Kconfig
>>> @@ -244,6 +244,16 @@ config DRM_NXP_PTN3460
>>> help
>>> NXP PTN3460 eDP-LVDS bridge chip driver.
>>>
>>> +config DRM_OF_DISPLAY_MODE_BRIDGE
>>> + tristate
>>> + depends on DRM_BRIDGE && OF
>>> + help
>>> + This is a DRM bridge implementation that uses
>>> of_get_drm_display_mode
>>> + to acquire display mode.
>>> +
>>> + Newer designs should not use this bridge and should use proper
>>> panel
>>> + driver instead.
>>
>> "Newer designs should not use this bridge", but in patch 8 you are
>> introducing a new use ot devm_drm_of_display_mode_bridge(). Shouldn't you
>> instead "use proper panel driver instead" in patch 8?
>>
>> Can you point to the conversation where the converstaion where Dmitry
>> suggested this change? Maybe it already contains the answer to my
>> qustion. Also adding a link to that conversation in the commit message
>> woule be useful.
>>
>
> First of all, thanks for your reviews on this patch series.
>
> link: https://lore.kernel.org/all/
> xwenycscalzdlpuxytorbiyvej3k7pv3lhxwtadilxq65ipwsv@x5rxm53w5e22/
>
> I think it may be a misleading issue caused by directly copying the
> previous Kconfig description. Now that the new
> devm_drm_of_display_mode_bridge() helper has been added, drivers using
> the panel-bridge framework can rely on it to maintain compatibility with
> legacy display mode parsing.
>
> It would be better to update the comment as follows:
>
> This is a DRM bridge implementation that uses of_get_drm_display_mode to
> acquire display mode.
>
> It exists for compatibility with legacy display mode parsing, in order
> to conform to the panel-bridge framework.
>
Dmitry, what's you take on this?
Best regards,
Damon
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use
2026-02-03 1:31 ` Damon Ding
@ 2026-02-03 10:11 ` Luca Ceresoli
2026-02-03 14:09 ` Laurent Pinchart
2026-02-04 1:09 ` Damon Ding
0 siblings, 2 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-02-03 10:11 UTC (permalink / raw)
To: Damon Ding, andrzej.hajda, neil.armstrong, rfoss,
dmitry.baryshkov
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dianders, m.szyprowski,
jani.nikula, linux-kernel, dri-devel, imx, linux-arm-kernel,
linux-samsung-soc, linux-rockchip
Hello Damon,
On Tue Feb 3, 2026 at 2:31 AM CET, Damon Ding wrote:
> Hi,
>
> On 2/2/2026 10:54 AM, Damon Ding wrote:
>> Hi Luca,
>>
>> On 1/31/2026 8:33 PM, Luca Ceresoli wrote:
>>> Hello Damon, Dmitry,
>>>
>>> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
>>>> As suggested by Dmitry, the DRM legacy bridge driver can be pulled
>>>> out of imx/ subdir for multi-platform use. The driver is also renamed
>>>> to make it more generic and suitable for platforms other than i.MX.
>>>>
>>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
>>>> Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>>>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>>>
>>>> ---
>>>>
>>>> Changes in v7:
>>>> - Rename legacy-bridge to of-display-mode-bridge.
>>>> - Remove unnecessary API drm_bridge_is_legacy().
>>>
>>> ...
>>>
>>>> --- a/drivers/gpu/drm/bridge/Kconfig
>>>> +++ b/drivers/gpu/drm/bridge/Kconfig
>>>> @@ -244,6 +244,16 @@ config DRM_NXP_PTN3460
>>>> help
>>>> NXP PTN3460 eDP-LVDS bridge chip driver.
>>>>
>>>> +config DRM_OF_DISPLAY_MODE_BRIDGE
>>>> + tristate
>>>> + depends on DRM_BRIDGE && OF
>>>> + help
>>>> + This is a DRM bridge implementation that uses
>>>> of_get_drm_display_mode
>>>> + to acquire display mode.
>>>> +
>>>> + Newer designs should not use this bridge and should use proper
>>>> panel
>>>> + driver instead.
>>>
>>> "Newer designs should not use this bridge", but in patch 8 you are
>>> introducing a new use ot devm_drm_of_display_mode_bridge(). Shouldn't you
>>> instead "use proper panel driver instead" in patch 8?
>>>
>>> Can you point to the conversation where the converstaion where Dmitry
>>> suggested this change? Maybe it already contains the answer to my
>>> qustion. Also adding a link to that conversation in the commit message
>>> woule be useful.
>>>
>>
>> First of all, thanks for your reviews on this patch series.
>>
>> link: https://lore.kernel.org/all/
>> xwenycscalzdlpuxytorbiyvej3k7pv3lhxwtadilxq65ipwsv@x5rxm53w5e22/
>>
>> I think it may be a misleading issue caused by directly copying the
>> previous Kconfig description. Now that the new
>> devm_drm_of_display_mode_bridge() helper has been added, drivers using
>> the panel-bridge framework can rely on it to maintain compatibility with
>> legacy display mode parsing.
Ah, I think I got the point: the mode description in device tree is legacy,
but the driver itself is not legacy and will be current until we need to
support legacy device tree. Correct?
If that's correct, this patch looks OK to me with a new Kconfig help text.
>> It would be better to update the comment as follows:
>>
>> This is a DRM bridge implementation that uses of_get_drm_display_mode to
>> acquire display mode.
>>
>> It exists for compatibility with legacy display mode parsing, in order
>> to conform to the panel-bridge framework.
>>
>
> Dmitry, what's you take on this?
Dmitry's opinion would be much more relevant than mine. I don't know much
myself about this driver.
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver
2026-01-19 16:06 ` Heiko Stübner
2026-02-02 1:33 ` Damon Ding
@ 2026-02-03 11:11 ` Luca Ceresoli
2026-02-04 1:52 ` Damon Ding
1 sibling, 1 reply; 41+ messages in thread
From: Luca Ceresoli @ 2026-02-03 11:11 UTC (permalink / raw)
To: Heiko Stübner, andrzej.hajda, neil.armstrong, rfoss,
Damon Ding
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, andy.yan, dmitry.baryshkov, dianders,
m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hello Heiko, Damon,
On Mon Jan 19, 2026 at 5:06 PM CET, Heiko Stübner wrote:
> Hi Damon,
>
> Am Mittwoch, 17. Dezember 2025, 10:33:03 Mitteleuropäische Normalzeit schrieb Damon Ding:
>> PATCH 1 is to ensure the last bridge declares OP_EDID or OP_MODES or both.
>> PATCH 2 is a small format optimization for struct analogid_dp_device.
>> PATCH 3 is to perform mode setting in &drm_bridge_funcs.atomic_enable.
>> PATCH 4 is to add a new parameter to store the point of next bridge.
>> PATCH 5 is to make legacy bridge driver more universal.
>> PATCH 6-11 are preparations for apply drm_bridge_connector helper.
>> PATCH 12 is to apply the drm_bridge_connector helper.
>> PATCH 13-15 are to move the panel/bridge parsing to the Analogix side.
>> PATCH 16 is to attach the next bridge on Analogix side uniformly.
>> PATCH 17-18 are to apply the panel_bridge helper.
>
> On top of all the recent bridge-related commits, this series still works
> on my rk3588-eDP board - when the display is plugged in on boot.
>
> As that is the current state we also had before, this series:
> Tested-by: Heiko Stuebner <heiko@sntech.de> on rk3588
I'm appplying patches 1-3 and got a checkpatch warning for each patch:
WARNING: Unexpected content after email: 'Heiko Stuebner <heiko@sntech.de> on rk3588', should be: 'Heiko Stuebner <heiko@sntech.de> (on rk3588)'
I'm fixing it while applying those 3 patches.
Damon, can you fix that for the remaining patches before sending a new
iteration?
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: (subset) [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
` (15 preceding siblings ...)
2026-01-19 16:06 ` Heiko Stübner
@ 2026-02-03 11:53 ` Luca Ceresoli
16 siblings, 0 replies; 41+ messages in thread
From: Luca Ceresoli @ 2026-02-03 11:53 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss, Damon Ding
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dmitry.baryshkov,
dianders, m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
On Wed, 17 Dec 2025 17:33:03 +0800, Damon Ding wrote:
> PATCH 1 is to ensure the last bridge declares OP_EDID or OP_MODES or both.
> PATCH 2 is a small format optimization for struct analogid_dp_device.
> PATCH 3 is to perform mode setting in &drm_bridge_funcs.atomic_enable.
> PATCH 4 is to add a new parameter to store the point of next bridge.
> PATCH 5 is to make legacy bridge driver more universal.
> PATCH 6-11 are preparations for apply drm_bridge_connector helper.
> PATCH 12 is to apply the drm_bridge_connector helper.
> PATCH 13-15 are to move the panel/bridge parsing to the Analogix side.
> PATCH 16 is to attach the next bridge on Analogix side uniformly.
> PATCH 17-18 are to apply the panel_bridge helper.
>
> [...]
Applied, thanks!
[01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities
commit: 3c05e956b85e70cbd5042e03f615b23ca4635385
[02/18] drm/bridge: analogix_dp: Formalize the struct analogix_dp_device
commit: 10a2694fde68ba214eca7d24229094fc2427fddd
[03/18] drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to &drm_bridge_funcs.atomic_enable
commit: cff3f89ffbdd4b6c43a117c01aaf5b290ff80803
Best regards,
--
Luca Ceresoli <luca.ceresoli@bootlin.com>
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use
2026-02-03 10:11 ` Luca Ceresoli
@ 2026-02-03 14:09 ` Laurent Pinchart
2026-02-04 1:09 ` Damon Ding
1 sibling, 0 replies; 41+ messages in thread
From: Laurent Pinchart @ 2026-02-03 14:09 UTC (permalink / raw)
To: Luca Ceresoli
Cc: Damon Ding, andrzej.hajda, neil.armstrong, rfoss,
dmitry.baryshkov, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dianders, m.szyprowski,
jani.nikula, linux-kernel, dri-devel, imx, linux-arm-kernel,
linux-samsung-soc, linux-rockchip
On Tue, Feb 03, 2026 at 11:11:50AM +0100, Luca Ceresoli wrote:
> On Tue Feb 3, 2026 at 2:31 AM CET, Damon Ding wrote:
> > On 2/2/2026 10:54 AM, Damon Ding wrote:
> >> On 1/31/2026 8:33 PM, Luca Ceresoli wrote:
> >>> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
> >>>> As suggested by Dmitry, the DRM legacy bridge driver can be pulled
> >>>> out of imx/ subdir for multi-platform use. The driver is also renamed
> >>>> to make it more generic and suitable for platforms other than i.MX.
> >>>>
> >>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
> >>>> Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> >>>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
> >>>>
> >>>> ---
> >>>>
> >>>> Changes in v7:
> >>>> - Rename legacy-bridge to of-display-mode-bridge.
> >>>> - Remove unnecessary API drm_bridge_is_legacy().
> >>>
> >>> ...
> >>>
> >>>> --- a/drivers/gpu/drm/bridge/Kconfig
> >>>> +++ b/drivers/gpu/drm/bridge/Kconfig
> >>>> @@ -244,6 +244,16 @@ config DRM_NXP_PTN3460
> >>>> help
> >>>> NXP PTN3460 eDP-LVDS bridge chip driver.
> >>>>
> >>>> +config DRM_OF_DISPLAY_MODE_BRIDGE
> >>>> + tristate
> >>>> + depends on DRM_BRIDGE && OF
> >>>> + help
> >>>> + This is a DRM bridge implementation that uses
> >>>> of_get_drm_display_mode
> >>>> + to acquire display mode.
> >>>> +
> >>>> + Newer designs should not use this bridge and should use proper
> >>>> panel
> >>>> + driver instead.
> >>>
> >>> "Newer designs should not use this bridge", but in patch 8 you are
> >>> introducing a new use ot devm_drm_of_display_mode_bridge(). Shouldn't you
> >>> instead "use proper panel driver instead" in patch 8?
> >>>
> >>> Can you point to the conversation where the converstaion where Dmitry
> >>> suggested this change? Maybe it already contains the answer to my
> >>> qustion. Also adding a link to that conversation in the commit message
> >>> woule be useful.
> >>>
> >>
> >> First of all, thanks for your reviews on this patch series.
> >>
> >> link: https://lore.kernel.org/all/
> >> xwenycscalzdlpuxytorbiyvej3k7pv3lhxwtadilxq65ipwsv@x5rxm53w5e22/
> >>
> >> I think it may be a misleading issue caused by directly copying the
> >> previous Kconfig description. Now that the new
> >> devm_drm_of_display_mode_bridge() helper has been added, drivers using
> >> the panel-bridge framework can rely on it to maintain compatibility with
> >> legacy display mode parsing.
>
> Ah, I think I got the point: the mode description in device tree is legacy,
> but the driver itself is not legacy and will be current until we need to
> support legacy device tree. Correct?
>
> If that's correct, this patch looks OK to me with a new Kconfig help text.
The devm_drm_of_display_mode_bridge() function needs documentation
though, with a warning that tells it must not be used in new drivers.
Catching new users in checkpatch.pl (or somewhere else) would be ideal.
I would also not create a separate module for this and move the function
to drm_bridge.c, but I don't mind that much if the consensus is that a
separate module is better.
> >> It would be better to update the comment as follows:
> >>
> >> This is a DRM bridge implementation that uses of_get_drm_display_mode to
> >> acquire display mode.
> >>
> >> It exists for compatibility with legacy display mode parsing, in order
> >> to conform to the panel-bridge framework.
> >>
> >
> > Dmitry, what's you take on this?
>
> Dmitry's opinion would be much more relevant than mine. I don't know much
> myself about this driver.
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use
2026-02-03 10:11 ` Luca Ceresoli
2026-02-03 14:09 ` Laurent Pinchart
@ 2026-02-04 1:09 ` Damon Ding
1 sibling, 0 replies; 41+ messages in thread
From: Damon Ding @ 2026-02-04 1:09 UTC (permalink / raw)
To: Luca Ceresoli, andrzej.hajda, neil.armstrong, rfoss,
dmitry.baryshkov
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, heiko, andy.yan, dianders, m.szyprowski,
jani.nikula, linux-kernel, dri-devel, imx, linux-arm-kernel,
linux-samsung-soc, linux-rockchip
Hi Luca,
On 2/3/2026 6:11 PM, Luca Ceresoli wrote:
> Hello Damon,
>
> On Tue Feb 3, 2026 at 2:31 AM CET, Damon Ding wrote:
>> Hi,
>>
>> On 2/2/2026 10:54 AM, Damon Ding wrote:
>>> Hi Luca,
>>>
>>> On 1/31/2026 8:33 PM, Luca Ceresoli wrote:
>>>> Hello Damon, Dmitry,
>>>>
>>>> On Wed Dec 17, 2025 at 10:33 AM CET, Damon Ding wrote:
>>>>> As suggested by Dmitry, the DRM legacy bridge driver can be pulled
>>>>> out of imx/ subdir for multi-platform use. The driver is also renamed
>>>>> to make it more generic and suitable for platforms other than i.MX.
>>>>>
>>>>> Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
>>>>> Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
>>>>> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>>>>>
>>>>> ---
>>>>>
>>>>> Changes in v7:
>>>>> - Rename legacy-bridge to of-display-mode-bridge.
>>>>> - Remove unnecessary API drm_bridge_is_legacy().
>>>>
>>>> ...
>>>>
>>>>> --- a/drivers/gpu/drm/bridge/Kconfig
>>>>> +++ b/drivers/gpu/drm/bridge/Kconfig
>>>>> @@ -244,6 +244,16 @@ config DRM_NXP_PTN3460
>>>>> help
>>>>> NXP PTN3460 eDP-LVDS bridge chip driver.
>>>>>
>>>>> +config DRM_OF_DISPLAY_MODE_BRIDGE
>>>>> + tristate
>>>>> + depends on DRM_BRIDGE && OF
>>>>> + help
>>>>> + This is a DRM bridge implementation that uses
>>>>> of_get_drm_display_mode
>>>>> + to acquire display mode.
>>>>> +
>>>>> + Newer designs should not use this bridge and should use proper
>>>>> panel
>>>>> + driver instead.
>>>>
>>>> "Newer designs should not use this bridge", but in patch 8 you are
>>>> introducing a new use ot devm_drm_of_display_mode_bridge(). Shouldn't you
>>>> instead "use proper panel driver instead" in patch 8?
>>>>
>>>> Can you point to the conversation where the converstaion where Dmitry
>>>> suggested this change? Maybe it already contains the answer to my
>>>> qustion. Also adding a link to that conversation in the commit message
>>>> woule be useful.
>>>>
>>>
>>> First of all, thanks for your reviews on this patch series.
>>>
>>> link: https://lore.kernel.org/all/
>>> xwenycscalzdlpuxytorbiyvej3k7pv3lhxwtadilxq65ipwsv@x5rxm53w5e22/
>>>
>>> I think it may be a misleading issue caused by directly copying the
>>> previous Kconfig description. Now that the new
>>> devm_drm_of_display_mode_bridge() helper has been added, drivers using
>>> the panel-bridge framework can rely on it to maintain compatibility with
>>> legacy display mode parsing.
>
> Ah, I think I got the point: the mode description in device tree is legacy,
> but the driver itself is not legacy and will be current until we need to
> support legacy device tree. Correct?
>
> If that's correct, this patch looks OK to me with a new Kconfig help text.
Right. I want to apply the advanced panel-bridge framework for Exynos DP
driver, and this newly added API helps handle the legacy device tree
that it supports.
The v9 will come soon.
>
>>> It would be better to update the comment as follows:
>>>
>>> This is a DRM bridge implementation that uses of_get_drm_display_mode to
>>> acquire display mode.
>>>
>>> It exists for compatibility with legacy display mode parsing, in order
>>> to conform to the panel-bridge framework.
>>>
>>
>> Dmitry, what's you take on this?
>
> Dmitry's opinion would be much more relevant than mine. I don't know much
> myself about this driver.
>
Best regards,
Damon
^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver
2026-02-03 11:11 ` Luca Ceresoli
@ 2026-02-04 1:52 ` Damon Ding
0 siblings, 0 replies; 41+ messages in thread
From: Damon Ding @ 2026-02-04 1:52 UTC (permalink / raw)
To: Luca Ceresoli, Heiko Stübner, andrzej.hajda, neil.armstrong,
rfoss
Cc: Laurent.pinchart, jonas, jernej.skrabec, maarten.lankhorst,
mripard, tzimmermann, airlied, simona, shawnguo, s.hauer, kernel,
festevam, inki.dae, sw0312.kim, kyungmin.park, krzk, alim.akhtar,
jingoohan1, p.zabel, hjc, andy.yan, dmitry.baryshkov, dianders,
m.szyprowski, jani.nikula, linux-kernel, dri-devel, imx,
linux-arm-kernel, linux-samsung-soc, linux-rockchip
Hi Luca,
On 2/3/2026 7:11 PM, Luca Ceresoli wrote:
> Hello Heiko, Damon,
>
> On Mon Jan 19, 2026 at 5:06 PM CET, Heiko Stübner wrote:
>> Hi Damon,
>>
>> Am Mittwoch, 17. Dezember 2025, 10:33:03 Mitteleuropäische Normalzeit schrieb Damon Ding:
>>> PATCH 1 is to ensure the last bridge declares OP_EDID or OP_MODES or both.
>>> PATCH 2 is a small format optimization for struct analogid_dp_device.
>>> PATCH 3 is to perform mode setting in &drm_bridge_funcs.atomic_enable.
>>> PATCH 4 is to add a new parameter to store the point of next bridge.
>>> PATCH 5 is to make legacy bridge driver more universal.
>>> PATCH 6-11 are preparations for apply drm_bridge_connector helper.
>>> PATCH 12 is to apply the drm_bridge_connector helper.
>>> PATCH 13-15 are to move the panel/bridge parsing to the Analogix side.
>>> PATCH 16 is to attach the next bridge on Analogix side uniformly.
>>> PATCH 17-18 are to apply the panel_bridge helper.
>>
>> On top of all the recent bridge-related commits, this series still works
>> on my rk3588-eDP board - when the display is plugged in on boot.
>>
>> As that is the current state we also had before, this series:
>> Tested-by: Heiko Stuebner <heiko@sntech.de> on rk3588
>
> I'm appplying patches 1-3 and got a checkpatch warning for each patch:
>
> WARNING: Unexpected content after email: 'Heiko Stuebner <heiko@sntech.de> on rk3588', should be: 'Heiko Stuebner <heiko@sntech.de> (on rk3588)'
>
> I'm fixing it while applying those 3 patches.
>
> Damon, can you fix that for the remaining patches before sending a new
> iteration?
>
Yes, will fix in v9.
Best regards,
Damon
^ permalink raw reply [flat|nested] 41+ messages in thread
end of thread, other threads:[~2026-02-04 4:39 UTC | newest]
Thread overview: 41+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-17 9:33 [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
2025-12-17 9:33 ` [PATCH v8 01/18] drm/display: bridge_connector: Ensure last bridge determines EDID/modes detection capabilities Damon Ding
2025-12-31 10:50 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 02/18] drm/bridge: analogix_dp: Formalize the struct analogix_dp_device Damon Ding
2026-01-31 12:52 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 03/18] drm/bridge: analogix_dp: Move &drm_bridge_funcs.mode_set to &drm_bridge_funcs.atomic_enable Damon Ding
2026-01-31 12:50 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 04/18] drm/bridge: analogix_dp: Add &analogix_dp_plat_data.next_bridge Damon Ding
2025-12-31 11:11 ` Luca Ceresoli
2026-01-04 2:51 ` Damon Ding
2026-01-07 2:36 ` Damon Ding
2026-01-31 13:41 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 05/18] drm/bridge: Move legacy bridge driver out of imx directory for multi-platform use Damon Ding
2026-01-31 12:33 ` Luca Ceresoli
2026-02-02 2:54 ` Damon Ding
2026-02-03 1:31 ` Damon Ding
2026-02-03 10:11 ` Luca Ceresoli
2026-02-03 14:09 ` Laurent Pinchart
2026-02-04 1:09 ` Damon Ding
2025-12-17 9:33 ` [PATCH v8 06/18] drm/exynos: exynos_dp: Remove &exynos_dp_device.ptn_bridge Damon Ding
2026-01-31 13:41 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 07/18] drm/exynos: exynos_dp: Remove unused &exynos_dp_device.connector Damon Ding
2026-01-31 13:40 ` Luca Ceresoli
2025-12-17 9:33 ` [PATCH v8 08/18] drm/exynos: exynos_dp: Apply of-display-mode-bridge to parse the display-timings node Damon Ding
2025-12-17 9:33 ` [PATCH v8 09/18] drm/bridge: analogix_dp: Remove redundant &analogix_dp_plat_data.skip_connector Damon Ding
2025-12-17 9:33 ` [PATCH v8 10/18] drm/bridge: analogix_dp: Move the color format check to .atomic_check() for Rockchip platforms Damon Ding
2025-12-17 9:33 ` [PATCH v8 11/18] drm/bridge: analogix_dp: Remove unused &analogix_dp_plat_data.get_modes() Damon Ding
2025-12-17 9:33 ` [PATCH v8 12/18] drm/bridge: analogix_dp: Apply drm_bridge_connector helper Damon Ding
2025-12-17 9:33 ` [PATCH v8 13/18] drm/bridge: analogix_dp: Add new API analogix_dp_finish_probe() Damon Ding
2025-12-17 9:59 ` [PATCH v8 14/18] drm/rockchip: analogix_dp: Apply analogix_dp_finish_probe() Damon Ding
2025-12-17 9:59 ` [PATCH v8 15/18] drm/exynos: exynos_dp: " Damon Ding
2025-12-17 9:59 ` [PATCH v8 16/18] drm/bridge: analogix_dp: Attach the next bridge in analogix_dp_bridge_attach() Damon Ding
2026-01-31 13:34 ` Luca Ceresoli
2025-12-17 9:59 ` [PATCH v8 17/18] drm/bridge: analogix_dp: Remove bridge disabing and panel unpreparing in analogix_dp_unbind() Damon Ding
2025-12-17 9:59 ` [PATCH v8 18/18] drm/bridge: analogix_dp: Apply panel_bridge helper Damon Ding
2026-01-17 7:45 ` [PATCH v8 00/18] Apply drm_bridge_connector and panel_bridge helper for the Analogix DP driver Damon Ding
2026-01-19 16:06 ` Heiko Stübner
2026-02-02 1:33 ` Damon Ding
2026-02-03 11:11 ` Luca Ceresoli
2026-02-04 1:52 ` Damon Ding
2026-02-03 11:53 ` (subset) " Luca Ceresoli
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox