* [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:12 ` [PATCH 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak Luca Ceresoli
` (12 more replies)
0 siblings, 13 replies; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli, stable
This series converts all DRM bridge drivers (*) from the now deprecated
of_drm_find_bridge() to its replacement of_drm_find_and_get_bridge() which
allows correct bridge refcounting. It also converts per-driver
"next_bridge" pointers to the unified drm_bridge::next_bridge which puts
the reference automatically on bridge deallocation.
This is part of the work to support hotplug of DRM bridges. The grand plan
was discussed in [0].
Here's the work breakdown (➜ marks the current series):
1. ➜ add refcounting to DRM bridges struct drm_bridge,
based on devm_drm_bridge_alloc()
A. ✔ add new alloc API and refcounting (v6.16)
B. ✔ convert all bridge drivers to new API (v6.17)
C. ✔ kunit tests (v6.17)
D. ✔ add get/put to drm_bridge_add/remove() + attach/detach()
and warn on old allocation pattern (v6.17)
E. ➜ add get/put on drm_bridge accessors
1. ✔ drm_bridge_chain_get_first_bridge(), add cleanup action (v6.18)
2. ✔ drm_bridge_get_prev_bridge() (v6.18)
3. ✔ drm_bridge_get_next_bridge() (v6.19)
4. ✔ drm_for_each_bridge_in_chain() (v6.19)
5. ✔ drm_bridge_connector_init (v6.19)
6. … protect encoder bridge chain with a mutex
7. ➜ of_drm_find_bridge
a. ✔… add of_drm_get_bridge(), convert basic direct users
(v6.20?, one driver still pending)
b. ➜ convert direct of_drm_get_bridge() users, part 2
c. convert direct of_drm_get_bridge() users, part 3
d. convert direct of_drm_get_bridge() users, part 4
e. convert bridge-only drm_of_find_panel_or_bridge() users
8. drm_of_find_panel_or_bridge, *_of_get_bridge
9. ✔ enforce drm_bridge_add before drm_bridge_attach (v6.19)
F. ✔ debugfs improvements
1. ✔ add top-level 'bridges' file (v6.16)
2. ✔ show refcount and list lingering bridges (v6.19)
2. … handle gracefully atomic updates during bridge removal
A. ✔ Add drm_dev_enter/exit() to protect device resources (v6.20?)
B. … protect private_obj removal from list
3. … DSI host-device driver interaction
4. ✔ removing the need for the "always-disconnected" connector
5. finish the hotplug bridge work, moving code to the core and potentially
removing the hotplug-bridge itself (this needs to be clarified as
points 1-3 are developed)
[0] https://lore.kernel.org/lkml/20250206-hotplug-drm-bridge-v6-0-9d6f2c9c3058@bootlin.com/#t
This work is a continuation of the work to correctly handle bridge
refcounting for existing of_drm_find_bridge(). The ground work is in:
- commit 293a8fd7721a ("drm/bridge: add of_drm_find_and_get_bridge()")
- commit 9da0e06abda8 ("drm/bridge: deprecate of_drm_find_bridge()")
- commit 3fdeae134ba9 ("drm/bridge: add next_bridge pointer to struct drm_bridge")
The whole conversion is split in multiple series to make the review process
a bit smoother. Parts 3 and 4 are converting non-bridge drivers (mostly
encoders).
(*) One bridge driver (synopsys/dw-hdmi) is converted in another series,
together with its (non-bridge) users. Additionally this series converts
drm_of_panel_bridge_remove() which is a special case, and has a bugfix
for it too.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
Luca Ceresoli (12):
drm: of: drm_of_panel_bridge_remove(): fix device_node leak
drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge()
drm/bridge: sii902x: convert to of_drm_find_and_get_bridge()
drm/bridge: thc63lvd1024: convert to of_drm_find_and_get_bridge()
drm/bridge: tfp410: convert to of_drm_find_and_get_bridge()
drm/bridge: tpd12s015: convert to of_drm_find_and_get_bridge()
drm/bridge: lt8912b: convert to of_drm_find_and_get_bridge()
drm/bridge: imx8mp-hdmi-pvi: convert to of_drm_find_and_get_bridge()
drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator
drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c | 15 +++++++-------
drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c | 3 ++-
drivers/gpu/drm/bridge/lontium-lt8912b.c | 31 ++++++++++++++--------------
drivers/gpu/drm/bridge/samsung-dsim.c | 28 ++++++++++++++++---------
drivers/gpu/drm/bridge/sii902x.c | 7 +++----
drivers/gpu/drm/bridge/thc63lvd1024.c | 7 +++----
drivers/gpu/drm/bridge/ti-tfp410.c | 27 ++++++++++++------------
drivers/gpu/drm/bridge/ti-tpd12s015.c | 8 +++----
include/drm/bridge/samsung-dsim.h | 1 -
include/drm/drm_of.h | 6 +++++-
10 files changed, 69 insertions(+), 64 deletions(-)
---
base-commit: 2bcba510a612cea32b8a536eedeabd7fcb413cd0
change-id: 20251223-drm-bridge-alloc-getput-drm_of_find_bridge-2-12c6bbcb6896
Best regards,
--
Luca Ceresoli <luca.ceresoli@bootlin.com>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:33 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge() Luca Ceresoli
` (11 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli, stable
drm_of_panel_bridge_remove() uses of_graph_get_remote_node() to get a
device_node but does not put the node reference.
Fixes: c70087e8f16f ("drm/drm_of: add drm_of_panel_bridge_remove function")
Cc: stable@vger.kernel.org # v4.15
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
include/drm/drm_of.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
index 7f0256dae3f1..f3e55ea2174c 100644
--- a/include/drm/drm_of.h
+++ b/include/drm/drm_of.h
@@ -5,6 +5,7 @@
#include <linux/err.h>
#include <linux/of_graph.h>
#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE)
+#include <linux/of.h>
#include <drm/drm_bridge.h>
#endif
@@ -173,6 +174,8 @@ static inline int drm_of_panel_bridge_remove(const struct device_node *np,
bridge = of_drm_find_bridge(remote);
drm_panel_bridge_remove(bridge);
+ of_node_put(remote);
+
return 0;
#else
return -EINVAL;
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
2026-01-07 13:12 ` [PATCH 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:34 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 03/12] drm/bridge: sii902x: " Luca Ceresoli
` (10 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
include/drm/drm_of.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
index f3e55ea2174c..f2f2bf82eff9 100644
--- a/include/drm/drm_of.h
+++ b/include/drm/drm_of.h
@@ -171,9 +171,10 @@ static inline int drm_of_panel_bridge_remove(const struct device_node *np,
if (!remote)
return -ENODEV;
- bridge = of_drm_find_bridge(remote);
+ bridge = of_drm_find_and_get_bridge(remote);
drm_panel_bridge_remove(bridge);
+ drm_bridge_put(bridge);
of_node_put(remote);
return 0;
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 03/12] drm/bridge: sii902x: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
2026-01-07 13:12 ` [PATCH 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak Luca Ceresoli
2026-01-07 13:12 ` [PATCH 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge() Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:38 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 04/12] drm/bridge: thc63lvd1024: " Luca Ceresoli
` (9 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done by using the drm_bridge::next_bridge pointer.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/sii902x.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c
index 1f0aba28ad1e..12497f5ce4ff 100644
--- a/drivers/gpu/drm/bridge/sii902x.c
+++ b/drivers/gpu/drm/bridge/sii902x.c
@@ -175,7 +175,6 @@ struct sii902x {
struct i2c_client *i2c;
struct regmap *regmap;
struct drm_bridge bridge;
- struct drm_bridge *next_bridge;
struct drm_connector connector;
struct gpio_desc *reset_gpio;
struct i2c_mux_core *i2cmux;
@@ -421,7 +420,7 @@ static int sii902x_bridge_attach(struct drm_bridge *bridge,
int ret;
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
- return drm_bridge_attach(encoder, sii902x->next_bridge,
+ return drm_bridge_attach(encoder, sii902x->bridge.next_bridge,
bridge, flags);
drm_connector_helper_add(&sii902x->connector,
@@ -1204,9 +1203,9 @@ static int sii902x_probe(struct i2c_client *client)
return -ENODEV;
}
- sii902x->next_bridge = of_drm_find_bridge(remote);
+ sii902x->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
of_node_put(remote);
- if (!sii902x->next_bridge)
+ if (!sii902x->bridge.next_bridge)
return dev_err_probe(dev, -EPROBE_DEFER,
"Failed to find remote bridge\n");
}
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 04/12] drm/bridge: thc63lvd1024: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (2 preceding siblings ...)
2026-01-07 13:12 ` [PATCH 03/12] drm/bridge: sii902x: " Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:38 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 05/12] drm/bridge: tfp410: " Luca Ceresoli
` (8 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done by using the drm_bridge::next_bridge pointer.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/thc63lvd1024.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/bridge/thc63lvd1024.c b/drivers/gpu/drm/bridge/thc63lvd1024.c
index 2cb7cd0c0608..c804222846c3 100644
--- a/drivers/gpu/drm/bridge/thc63lvd1024.c
+++ b/drivers/gpu/drm/bridge/thc63lvd1024.c
@@ -32,7 +32,6 @@ struct thc63_dev {
struct gpio_desc *oe;
struct drm_bridge bridge;
- struct drm_bridge *next;
struct drm_bridge_timings timings;
};
@@ -48,7 +47,7 @@ static int thc63_attach(struct drm_bridge *bridge,
{
struct thc63_dev *thc63 = to_thc63(bridge);
- return drm_bridge_attach(encoder, thc63->next, bridge, flags);
+ return drm_bridge_attach(encoder, thc63->bridge.next_bridge, bridge, flags);
}
static enum drm_mode_status thc63_mode_valid(struct drm_bridge *bridge,
@@ -132,9 +131,9 @@ static int thc63_parse_dt(struct thc63_dev *thc63)
return -ENODEV;
}
- thc63->next = of_drm_find_bridge(remote);
+ thc63->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
of_node_put(remote);
- if (!thc63->next)
+ if (!thc63->bridge.next_bridge)
return -EPROBE_DEFER;
endpoint = of_graph_get_endpoint_by_regs(thc63->dev->of_node,
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 05/12] drm/bridge: tfp410: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (3 preceding siblings ...)
2026-01-07 13:12 ` [PATCH 04/12] drm/bridge: thc63lvd1024: " Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:38 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 06/12] drm/bridge: tpd12s015: " Luca Ceresoli
` (7 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done by using the drm_bridge::next_bridge pointer.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/ti-tfp410.c | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c
index b80ee089f880..11b5bb50e9f4 100644
--- a/drivers/gpu/drm/bridge/ti-tfp410.c
+++ b/drivers/gpu/drm/bridge/ti-tfp410.c
@@ -30,7 +30,6 @@ struct tfp410 {
struct gpio_desc *powerdown;
struct drm_bridge_timings timings;
- struct drm_bridge *next_bridge;
struct device *dev;
};
@@ -53,8 +52,8 @@ static int tfp410_get_modes(struct drm_connector *connector)
const struct drm_edid *drm_edid;
int ret;
- if (dvi->next_bridge->ops & DRM_BRIDGE_OP_EDID) {
- drm_edid = drm_bridge_edid_read(dvi->next_bridge, connector);
+ if (dvi->bridge.next_bridge->ops & DRM_BRIDGE_OP_EDID) {
+ drm_edid = drm_bridge_edid_read(dvi->bridge.next_bridge, connector);
if (!drm_edid)
DRM_INFO("EDID read failed. Fallback to standard modes\n");
} else {
@@ -89,7 +88,7 @@ tfp410_connector_detect(struct drm_connector *connector, bool force)
{
struct tfp410 *dvi = drm_connector_to_tfp410(connector);
- return drm_bridge_detect(dvi->next_bridge, connector);
+ return drm_bridge_detect(dvi->bridge.next_bridge, connector);
}
static const struct drm_connector_funcs tfp410_con_funcs = {
@@ -126,7 +125,7 @@ static int tfp410_attach(struct drm_bridge *bridge,
struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
int ret;
- ret = drm_bridge_attach(encoder, dvi->next_bridge, bridge,
+ ret = drm_bridge_attach(encoder, dvi->bridge.next_bridge, bridge,
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret < 0)
return ret;
@@ -134,14 +133,14 @@ static int tfp410_attach(struct drm_bridge *bridge,
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
return 0;
- if (dvi->next_bridge->ops & DRM_BRIDGE_OP_DETECT)
+ if (dvi->bridge.next_bridge->ops & DRM_BRIDGE_OP_DETECT)
dvi->connector.polled = DRM_CONNECTOR_POLL_HPD;
else
dvi->connector.polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
- if (dvi->next_bridge->ops & DRM_BRIDGE_OP_HPD) {
+ if (dvi->bridge.next_bridge->ops & DRM_BRIDGE_OP_HPD) {
INIT_DELAYED_WORK(&dvi->hpd_work, tfp410_hpd_work_func);
- drm_bridge_hpd_enable(dvi->next_bridge, tfp410_hpd_callback,
+ drm_bridge_hpd_enable(dvi->bridge.next_bridge, tfp410_hpd_callback,
dvi);
}
@@ -149,8 +148,8 @@ static int tfp410_attach(struct drm_bridge *bridge,
&tfp410_con_helper_funcs);
ret = drm_connector_init_with_ddc(bridge->dev, &dvi->connector,
&tfp410_con_funcs,
- dvi->next_bridge->type,
- dvi->next_bridge->ddc);
+ dvi->bridge.next_bridge->type,
+ dvi->bridge.next_bridge->ddc);
if (ret) {
dev_err(dvi->dev, "drm_connector_init_with_ddc() failed: %d\n",
ret);
@@ -169,8 +168,8 @@ static void tfp410_detach(struct drm_bridge *bridge)
{
struct tfp410 *dvi = drm_bridge_to_tfp410(bridge);
- if (dvi->connector.dev && dvi->next_bridge->ops & DRM_BRIDGE_OP_HPD) {
- drm_bridge_hpd_disable(dvi->next_bridge);
+ if (dvi->connector.dev && dvi->bridge.next_bridge->ops & DRM_BRIDGE_OP_HPD) {
+ drm_bridge_hpd_disable(dvi->bridge.next_bridge);
cancel_delayed_work_sync(&dvi->hpd_work);
}
}
@@ -362,10 +361,10 @@ static int tfp410_init(struct device *dev, bool i2c)
if (!node)
return -ENODEV;
- dvi->next_bridge = of_drm_find_bridge(node);
+ dvi->bridge.next_bridge = of_drm_find_and_get_bridge(node);
of_node_put(node);
- if (!dvi->next_bridge)
+ if (!dvi->bridge.next_bridge)
return -EPROBE_DEFER;
/* Get the powerdown GPIO. */
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 06/12] drm/bridge: tpd12s015: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (4 preceding siblings ...)
2026-01-07 13:12 ` [PATCH 05/12] drm/bridge: tfp410: " Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:39 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 07/12] drm/bridge: lt8912b: " Luca Ceresoli
` (6 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done by using the drm_bridge::next_bridge pointer.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/ti-tpd12s015.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
index dcf686c4e73d..136e47ad1a10 100644
--- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
+++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
@@ -28,8 +28,6 @@ struct tpd12s015_device {
struct gpio_desc *ls_oe_gpio;
struct gpio_desc *hpd_gpio;
int hpd_irq;
-
- struct drm_bridge *next_bridge;
};
static inline struct tpd12s015_device *to_tpd12s015(struct drm_bridge *bridge)
@@ -47,7 +45,7 @@ static int tpd12s015_attach(struct drm_bridge *bridge,
if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
return -EINVAL;
- ret = drm_bridge_attach(encoder, tpd->next_bridge,
+ ret = drm_bridge_attach(encoder, tpd->bridge.next_bridge,
bridge, flags);
if (ret < 0)
return ret;
@@ -138,10 +136,10 @@ static int tpd12s015_probe(struct platform_device *pdev)
if (!node)
return -ENODEV;
- tpd->next_bridge = of_drm_find_bridge(node);
+ tpd->bridge.next_bridge = of_drm_find_and_get_bridge(node);
of_node_put(node);
- if (!tpd->next_bridge)
+ if (!tpd->bridge.next_bridge)
return -EPROBE_DEFER;
/* Get the control and HPD GPIOs. */
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 07/12] drm/bridge: lt8912b: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (5 preceding siblings ...)
2026-01-07 13:12 ` [PATCH 06/12] drm/bridge: tpd12s015: " Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:56 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 08/12] drm/bridge: imx8mp-hdmi-pvi: " Luca Ceresoli
` (5 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done by using the drm_bridge::next_bridge pointer.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/lontium-lt8912b.c | 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/bridge/lontium-lt8912b.c b/drivers/gpu/drm/bridge/lontium-lt8912b.c
index 342374cb8fc6..8a0b48efca58 100644
--- a/drivers/gpu/drm/bridge/lontium-lt8912b.c
+++ b/drivers/gpu/drm/bridge/lontium-lt8912b.c
@@ -35,7 +35,6 @@ struct lt8912 {
struct regmap *regmap[I2C_MAX_IDX];
struct device_node *host_node;
- struct drm_bridge *hdmi_port;
struct mipi_dsi_device *dsi;
@@ -407,8 +406,8 @@ lt8912_connector_detect(struct drm_connector *connector, bool force)
{
struct lt8912 *lt = connector_to_lt8912(connector);
- if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT)
- return drm_bridge_detect(lt->hdmi_port, connector);
+ if (lt->bridge.next_bridge->ops & DRM_BRIDGE_OP_DETECT)
+ return drm_bridge_detect(lt->bridge.next_bridge, connector);
return lt8912_check_cable_status(lt);
}
@@ -429,7 +428,7 @@ static int lt8912_connector_get_modes(struct drm_connector *connector)
u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24;
int ret, num;
- drm_edid = drm_bridge_edid_read(lt->hdmi_port, connector);
+ drm_edid = drm_bridge_edid_read(lt->bridge.next_bridge, connector);
drm_edid_connector_update(connector, drm_edid);
if (!drm_edid)
return 0;
@@ -519,8 +518,8 @@ static int lt8912_bridge_connector_init(struct drm_bridge *bridge)
struct lt8912 *lt = bridge_to_lt8912(bridge);
struct drm_connector *connector = <->connector;
- if (lt->hdmi_port->ops & DRM_BRIDGE_OP_HPD) {
- drm_bridge_hpd_enable(lt->hdmi_port, lt8912_bridge_hpd_cb, lt);
+ if (lt->bridge.next_bridge->ops & DRM_BRIDGE_OP_HPD) {
+ drm_bridge_hpd_enable(lt->bridge.next_bridge, lt8912_bridge_hpd_cb, lt);
connector->polled = DRM_CONNECTOR_POLL_HPD;
} else {
connector->polled = DRM_CONNECTOR_POLL_CONNECT |
@@ -529,7 +528,7 @@ static int lt8912_bridge_connector_init(struct drm_bridge *bridge)
ret = drm_connector_init(bridge->dev, connector,
<8912_connector_funcs,
- lt->hdmi_port->type);
+ lt->bridge.next_bridge->type);
if (ret)
goto exit;
@@ -549,7 +548,7 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,
struct lt8912 *lt = bridge_to_lt8912(bridge);
int ret;
- ret = drm_bridge_attach(encoder, lt->hdmi_port, bridge,
+ ret = drm_bridge_attach(encoder, lt->bridge.next_bridge, bridge,
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret < 0) {
dev_err(lt->dev, "Failed to attach next bridge (%d)\n", ret);
@@ -585,8 +584,8 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)
lt8912_hard_power_off(lt);
- if (lt->connector.dev && lt->hdmi_port->ops & DRM_BRIDGE_OP_HPD)
- drm_bridge_hpd_disable(lt->hdmi_port);
+ if (lt->connector.dev && lt->bridge.next_bridge->ops & DRM_BRIDGE_OP_HPD)
+ drm_bridge_hpd_disable(lt->bridge.next_bridge);
}
static enum drm_mode_status
@@ -611,8 +610,8 @@ lt8912_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
{
struct lt8912 *lt = bridge_to_lt8912(bridge);
- if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT)
- return drm_bridge_detect(lt->hdmi_port, connector);
+ if (lt->bridge.next_bridge->ops & DRM_BRIDGE_OP_DETECT)
+ return drm_bridge_detect(lt->bridge.next_bridge, connector);
return lt8912_check_cable_status(lt);
}
@@ -626,8 +625,8 @@ static const struct drm_edid *lt8912_bridge_edid_read(struct drm_bridge *bridge,
* edid must be read through the ddc bus but it must be
* given to the hdmi connector node.
*/
- if (lt->hdmi_port->ops & DRM_BRIDGE_OP_EDID)
- return drm_bridge_edid_read(lt->hdmi_port, connector);
+ if (lt->bridge.next_bridge->ops & DRM_BRIDGE_OP_EDID)
+ return drm_bridge_edid_read(lt->bridge.next_bridge, connector);
dev_warn(lt->dev, "The connected bridge does not supports DRM_BRIDGE_OP_EDID\n");
return NULL;
@@ -723,8 +722,8 @@ static int lt8912_parse_dt(struct lt8912 *lt)
goto err_free_host_node;
}
- lt->hdmi_port = of_drm_find_bridge(port_node);
- if (!lt->hdmi_port) {
+ lt->bridge.next_bridge = of_drm_find_and_get_bridge(port_node);
+ if (!lt->bridge.next_bridge) {
ret = -EPROBE_DEFER;
dev_err_probe(lt->dev, ret, "%s: Failed to get hdmi port\n", __func__);
goto err_free_host_node;
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 08/12] drm/bridge: imx8mp-hdmi-pvi: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (6 preceding siblings ...)
2026-01-07 13:12 ` [PATCH 07/12] drm/bridge: lt8912b: " Luca Ceresoli
@ 2026-01-07 13:12 ` Luca Ceresoli
2026-01-07 13:56 ` Maxime Ripard
2026-01-07 13:13 ` [PATCH 09/12] drm/bridge: imx8qxp-ldb: " Luca Ceresoli
` (4 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:12 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done by using the drm_bridge::next_bridge pointer.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c
index 3a6f8587a257..15fbb1be07cd 100644
--- a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c
+++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c
@@ -29,7 +29,6 @@
struct imx8mp_hdmi_pvi {
struct drm_bridge bridge;
struct device *dev;
- struct drm_bridge *next_bridge;
void __iomem *regs;
};
@@ -45,7 +44,7 @@ static int imx8mp_hdmi_pvi_bridge_attach(struct drm_bridge *bridge,
{
struct imx8mp_hdmi_pvi *pvi = to_imx8mp_hdmi_pvi(bridge);
- return drm_bridge_attach(encoder, pvi->next_bridge,
+ return drm_bridge_attach(encoder, pvi->bridge.next_bridge,
bridge, flags);
}
@@ -78,8 +77,8 @@ static void imx8mp_hdmi_pvi_bridge_enable(struct drm_bridge *bridge,
if (mode->flags & DRM_MODE_FLAG_PHSYNC)
val |= PVI_CTRL_OP_HSYNC_POL | PVI_CTRL_INP_HSYNC_POL;
- if (pvi->next_bridge->timings)
- bus_flags = pvi->next_bridge->timings->input_bus_flags;
+ if (pvi->bridge.next_bridge->timings)
+ bus_flags = pvi->bridge.next_bridge->timings->input_bus_flags;
else if (bridge_state)
bus_flags = bridge_state->input_bus_cfg.flags;
@@ -108,7 +107,7 @@ imx8mp_hdmi_pvi_bridge_get_input_bus_fmts(struct drm_bridge *bridge,
unsigned int *num_input_fmts)
{
struct imx8mp_hdmi_pvi *pvi = to_imx8mp_hdmi_pvi(bridge);
- struct drm_bridge *next_bridge = pvi->next_bridge;
+ struct drm_bridge *next_bridge = pvi->bridge.next_bridge;
struct drm_bridge_state *next_state;
if (!next_bridge->funcs->atomic_get_input_bus_fmts)
@@ -157,10 +156,10 @@ static int imx8mp_hdmi_pvi_probe(struct platform_device *pdev)
if (!remote)
return -EINVAL;
- pvi->next_bridge = of_drm_find_bridge(remote);
+ pvi->bridge.next_bridge = of_drm_find_and_get_bridge(remote);
of_node_put(remote);
- if (!pvi->next_bridge)
+ if (!pvi->bridge.next_bridge)
return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
"could not find next bridge\n");
@@ -168,7 +167,7 @@ static int imx8mp_hdmi_pvi_probe(struct platform_device *pdev)
/* Register the bridge. */
pvi->bridge.of_node = pdev->dev.of_node;
- pvi->bridge.timings = pvi->next_bridge->timings;
+ pvi->bridge.timings = pvi->bridge.next_bridge->timings;
drm_bridge_add(&pvi->bridge);
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 09/12] drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (7 preceding siblings ...)
2026-01-07 13:12 ` [PATCH 08/12] drm/bridge: imx8mp-hdmi-pvi: " Luca Ceresoli
@ 2026-01-07 13:13 ` Luca Ceresoli
2026-01-07 14:08 ` Maxime Ripard
2026-01-07 13:13 ` [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
` (3 subsequent siblings)
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:13 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
index 122502968927..6b80d798b27a 100644
--- a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
+++ b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
@@ -552,7 +552,7 @@ static int imx8qxp_ldb_parse_dt_companion(struct imx8qxp_ldb *imx8qxp_ldb)
goto out;
}
- imx8qxp_ldb->companion = of_drm_find_bridge(companion_port);
+ imx8qxp_ldb->companion = of_drm_find_and_get_bridge(companion_port);
if (!imx8qxp_ldb->companion) {
ret = -EPROBE_DEFER;
DRM_DEV_DEBUG_DRIVER(dev,
@@ -679,6 +679,7 @@ static void imx8qxp_ldb_remove(struct platform_device *pdev)
struct ldb *ldb = &imx8qxp_ldb->base;
ldb_remove_bridge_helper(ldb);
+ drm_bridge_put(imx8qxp_ldb->companion);
pm_runtime_disable(&pdev->dev);
}
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (8 preceding siblings ...)
2026-01-07 13:13 ` [PATCH 09/12] drm/bridge: imx8qxp-ldb: " Luca Ceresoli
@ 2026-01-07 13:13 ` Luca Ceresoli
2026-01-07 14:09 ` Maxime Ripard
2026-01-08 9:26 ` Marek Szyprowski
2026-01-07 13:13 ` [PATCH 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator Luca Ceresoli
` (2 subsequent siblings)
12 siblings, 2 replies; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:13 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
In preparation to handle refcounting of the out_bridge, we need to ensure
the out_bridge pointer contains either a valid bridge pointer or NULL, not
an ERR_PTR. Otherwise calls such as drm_bridge_get/put() would try to
redeference an ERR_PTR.
As a preliminary cleanup, add a temporary local 'next_bridge' pointer and
only copy it in dsi->out_bridge when returning successfully.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index eabc4c32f6ab..b3003aa49dc3 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -1886,6 +1886,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
{
struct samsung_dsim *dsi = host_to_dsi(host);
const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
+ struct drm_bridge *next_bridge;
struct device *dev = dsi->dev;
struct device_node *np = dev->of_node;
struct device_node *remote;
@@ -1924,17 +1925,17 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
panel = of_drm_find_panel(remote);
if (!IS_ERR(panel)) {
- dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel);
+ next_bridge = devm_drm_panel_bridge_add(dev, panel);
} else {
- dsi->out_bridge = of_drm_find_bridge(remote);
- if (!dsi->out_bridge)
- dsi->out_bridge = ERR_PTR(-EINVAL);
+ next_bridge = of_drm_find_bridge(remote);
+ if (!next_bridge)
+ next_bridge = ERR_PTR(-EINVAL);
}
of_node_put(remote);
- if (IS_ERR(dsi->out_bridge)) {
- ret = PTR_ERR(dsi->out_bridge);
+ if (IS_ERR(next_bridge)) {
+ ret = PTR_ERR(next_bridge);
DRM_DEV_ERROR(dev, "failed to find the bridge: %d\n", ret);
return ret;
}
@@ -1967,6 +1968,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
dsi->lanes = device->lanes;
dsi->format = device->format;
dsi->mode_flags = device->mode_flags;
+ dsi->out_bridge = next_bridge;
return 0;
}
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (9 preceding siblings ...)
2026-01-07 13:13 ` [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
@ 2026-01-07 13:13 ` Luca Ceresoli
2026-01-07 14:11 ` Maxime Ripard
2026-01-07 13:13 ` [PATCH 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
2026-01-07 23:48 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Marek Szyprowski
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:13 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
In preparation to handle refcounting of the out_bridge, we need to ensure
the out_bridge pointer contains either a valid bridge pointer or NULL, not
an ERR_PTR. Otherwise calls such as drm_bridge_get/put() would try to
redeference an ERR_PTR.
Stop using IS_ERR(next_bridge) as an indication of an error, and instead
use the 'ret' integer.
No functional change.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index b3003aa49dc3..d6ef64e68623 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -1891,7 +1891,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
struct device_node *np = dev->of_node;
struct device_node *remote;
struct drm_panel *panel;
- int ret;
+ int ret = 0;
/*
* Devices can also be child nodes when we also control that device
@@ -1926,16 +1926,17 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
panel = of_drm_find_panel(remote);
if (!IS_ERR(panel)) {
next_bridge = devm_drm_panel_bridge_add(dev, panel);
+ if (IS_ERR(next_bridge))
+ ret = PTR_ERR(next_bridge);
} else {
next_bridge = of_drm_find_bridge(remote);
if (!next_bridge)
- next_bridge = ERR_PTR(-EINVAL);
+ ret = -EINVAL;
}
of_node_put(remote);
- if (IS_ERR(next_bridge)) {
- ret = PTR_ERR(next_bridge);
+ if (ret) {
DRM_DEV_ERROR(dev, "failed to find the bridge: %d\n", ret);
return ret;
}
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (10 preceding siblings ...)
2026-01-07 13:13 ` [PATCH 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator Luca Ceresoli
@ 2026-01-07 13:13 ` Luca Ceresoli
2026-01-07 14:26 ` Maxime Ripard
2026-01-07 23:48 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Marek Szyprowski
12 siblings, 1 reply; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 13:13 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Philippe Cornu, benjamin.gaignard, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Adrien Grassein, Liu Ying, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Inki Dae,
Jagan Teki, Marek Szyprowski
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, Luca Ceresoli
of_drm_find_bridge() is deprecated. Move to its replacement
of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
is put when done. Also switch to the drm_bridge::next_bridge pointer.
This needs to handle both cases: when of_drm_find_panel() succeeds and when
it fails.
In the 'else' case (i.e. when of_drm_find_panel() fails), just switch to
of_drm_find_and_get_bridge() to ensure the bridge is not freed while in use
in the function tail, when it is stored in dsi->bridge.next_bridge.
In the 'then' case (i.e. when of_drm_find_panel() succeeds),
devm_drm_panel_bridge_add() already increments the refcount using devres
which ties the bridge allocation lifetime to the device lifetime, so we
would not need to do anything. However to have the same behaviour in both
branches take an additional reference here, so that the bridge needs to be
put whichever branch is taken without more complicated logic. Ensure to
clear the bridge pointer however, to avoid calling drm_bridge_put() on an
ERR_PTR.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 19 ++++++++++++-------
include/drm/bridge/samsung-dsim.h | 1 -
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index d6ef64e68623..e10c01672efd 100644
--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -1828,7 +1828,7 @@ static int samsung_dsim_attach(struct drm_bridge *bridge,
{
struct samsung_dsim *dsi = bridge_to_dsi(bridge);
- return drm_bridge_attach(encoder, dsi->out_bridge, bridge,
+ return drm_bridge_attach(encoder, dsi->bridge.next_bridge, bridge,
flags);
}
@@ -1886,7 +1886,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
{
struct samsung_dsim *dsi = host_to_dsi(host);
const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
- struct drm_bridge *next_bridge;
+ struct drm_bridge *next_bridge __free(drm_bridge_put) = NULL;
struct device *dev = dsi->dev;
struct device_node *np = dev->of_node;
struct device_node *remote;
@@ -1926,10 +1926,14 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
panel = of_drm_find_panel(remote);
if (!IS_ERR(panel)) {
next_bridge = devm_drm_panel_bridge_add(dev, panel);
- if (IS_ERR(next_bridge))
+ if (IS_ERR(next_bridge)) {
ret = PTR_ERR(next_bridge);
+ next_bridge = NULL; // Inhibit the cleanup action on an ERR_PTR
+ } else {
+ drm_bridge_get(next_bridge);
+ }
} else {
- next_bridge = of_drm_find_bridge(remote);
+ next_bridge = of_drm_find_and_get_bridge(remote);
if (!next_bridge)
ret = -EINVAL;
}
@@ -1969,7 +1973,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
dsi->lanes = device->lanes;
dsi->format = device->format;
dsi->mode_flags = device->mode_flags;
- dsi->out_bridge = next_bridge;
+ dsi->bridge.next_bridge = drm_bridge_get(next_bridge);
return 0;
}
@@ -1988,8 +1992,6 @@ static int samsung_dsim_host_detach(struct mipi_dsi_host *host,
struct samsung_dsim *dsi = host_to_dsi(host);
const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
- dsi->out_bridge = NULL;
-
if (pdata->host_ops && pdata->host_ops->detach)
pdata->host_ops->detach(dsi, device);
@@ -1997,6 +1999,9 @@ static int samsung_dsim_host_detach(struct mipi_dsi_host *host,
drm_bridge_remove(&dsi->bridge);
+ drm_bridge_put(dsi->bridge.next_bridge);
+ dsi->bridge.next_bridge = NULL;
+
return 0;
}
diff --git a/include/drm/bridge/samsung-dsim.h b/include/drm/bridge/samsung-dsim.h
index 31d7ed589233..03005e474704 100644
--- a/include/drm/bridge/samsung-dsim.h
+++ b/include/drm/bridge/samsung-dsim.h
@@ -100,7 +100,6 @@ struct samsung_dsim_plat_data {
struct samsung_dsim {
struct mipi_dsi_host dsi_host;
struct drm_bridge bridge;
- struct drm_bridge *out_bridge;
struct device *dev;
struct drm_display_mode mode;
--
2.52.0
^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak
2026-01-07 13:12 ` [PATCH 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak Luca Ceresoli
@ 2026-01-07 13:33 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:33 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
stable, Adrien Grassein, Andrzej Hajda, David Airlie,
Fabio Estevam, Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec,
Jonas Karlman, Laurent Pinchart, Liu Ying, Maarten Lankhorst,
Marek Szyprowski, Maxime Ripard, Neil Armstrong,
Pengutronix Kernel Team, Philippe Cornu, Robert Foss,
Sascha Hauer, Shawn Guo, Simona Vetter, Thomas Petazzoni,
Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:52 +0100, Luca Ceresoli wrote:
> drm_of_panel_bridge_remove() uses of_graph_get_remote_node() to get a
> device_node but does not put the node reference.
>
> Fixes: c70087e8f16f ("drm/drm_of: add drm_of_panel_bridge_remove function")
> Cc: stable@vger.kernel.org # v4.15
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge() Luca Ceresoli
@ 2026-01-07 13:34 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:34 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:53 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 03/12] drm/bridge: sii902x: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 03/12] drm/bridge: sii902x: " Luca Ceresoli
@ 2026-01-07 13:38 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:38 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:54 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done by using the drm_bridge::next_bridge pointer.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 04/12] drm/bridge: thc63lvd1024: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 04/12] drm/bridge: thc63lvd1024: " Luca Ceresoli
@ 2026-01-07 13:38 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:38 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:55 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done by using the drm_bridge::next_bridge pointer.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 05/12] drm/bridge: tfp410: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 05/12] drm/bridge: tfp410: " Luca Ceresoli
@ 2026-01-07 13:38 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:38 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:56 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done by using the drm_bridge::next_bridge pointer.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 06/12] drm/bridge: tpd12s015: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 06/12] drm/bridge: tpd12s015: " Luca Ceresoli
@ 2026-01-07 13:39 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:39 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:57 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done by using the drm_bridge::next_bridge pointer.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 07/12] drm/bridge: lt8912b: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 07/12] drm/bridge: lt8912b: " Luca Ceresoli
@ 2026-01-07 13:56 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:56 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:58 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done by using the drm_bridge::next_bridge pointer.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 08/12] drm/bridge: imx8mp-hdmi-pvi: convert to of_drm_find_and_get_bridge()
2026-01-07 13:12 ` [PATCH 08/12] drm/bridge: imx8mp-hdmi-pvi: " Luca Ceresoli
@ 2026-01-07 13:56 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 13:56 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:12:59 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done by using the drm_bridge::next_bridge pointer.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 09/12] drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
2026-01-07 13:13 ` [PATCH 09/12] drm/bridge: imx8qxp-ldb: " Luca Ceresoli
@ 2026-01-07 14:08 ` Maxime Ripard
2026-01-07 14:45 ` Luca Ceresoli
0 siblings, 1 reply; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 14:08 UTC (permalink / raw)
To: Luca Ceresoli
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
Philippe Cornu, benjamin.gaignard, Andrzej Hajda, Neil Armstrong,
Robert Foss, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Adrien Grassein, Liu Ying, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Inki Dae, Jagan Teki,
Marek Szyprowski, Hui Pu, Thomas Petazzoni, dri-devel,
linux-kernel, imx, linux-arm-kernel
[-- Attachment #1: Type: text/plain, Size: 1343 bytes --]
Hi,
On Wed, Jan 07, 2026 at 02:13:00PM +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> ---
> drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
> index 122502968927..6b80d798b27a 100644
> --- a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
> +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
> @@ -552,7 +552,7 @@ static int imx8qxp_ldb_parse_dt_companion(struct imx8qxp_ldb *imx8qxp_ldb)
> goto out;
> }
>
> - imx8qxp_ldb->companion = of_drm_find_bridge(companion_port);
> + imx8qxp_ldb->companion = of_drm_find_and_get_bridge(companion_port);
> if (!imx8qxp_ldb->companion) {
> ret = -EPROBE_DEFER;
> DRM_DEV_DEBUG_DRIVER(dev,
> @@ -679,6 +679,7 @@ static void imx8qxp_ldb_remove(struct platform_device *pdev)
> struct ldb *ldb = &imx8qxp_ldb->base;
>
> ldb_remove_bridge_helper(ldb);
> + drm_bridge_put(imx8qxp_ldb->companion);
the companion bridge is used in pretty much every KMS hook, we need to
put the reference in destroy.
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 273 bytes --]
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
2026-01-07 13:13 ` [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
@ 2026-01-07 14:09 ` Maxime Ripard
2026-01-08 9:26 ` Marek Szyprowski
1 sibling, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 14:09 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:13:01 +0100, Luca Ceresoli wrote:
> In preparation to handle refcounting of the out_bridge, we need to ensure
> the out_bridge pointer contains either a valid bridge pointer or NULL, not
> an ERR_PTR. Otherwise calls such as drm_bridge_get/put() would try to
> redeference an ERR_PTR.
>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator
2026-01-07 13:13 ` [PATCH 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator Luca Ceresoli
@ 2026-01-07 14:11 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 14:11 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:13:02 +0100, Luca Ceresoli wrote:
> In preparation to handle refcounting of the out_bridge, we need to ensure
> the out_bridge pointer contains either a valid bridge pointer or NULL, not
> an ERR_PTR. Otherwise calls such as drm_bridge_get/put() would try to
> redeference an ERR_PTR.
>
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
2026-01-07 13:13 ` [PATCH 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
@ 2026-01-07 14:26 ` Maxime Ripard
0 siblings, 0 replies; 29+ messages in thread
From: Maxime Ripard @ 2026-01-07 14:26 UTC (permalink / raw)
To: Luca Ceresoli
Cc: benjamin.gaignard, dri-devel, imx, linux-arm-kernel, linux-kernel,
Adrien Grassein, Andrzej Hajda, David Airlie, Fabio Estevam,
Hui Pu, Inki Dae, Jagan Teki, Jernej Skrabec, Jonas Karlman,
Laurent Pinchart, Liu Ying, Maarten Lankhorst, Marek Szyprowski,
Maxime Ripard, Neil Armstrong, Pengutronix Kernel Team,
Philippe Cornu, Robert Foss, Sascha Hauer, Shawn Guo,
Simona Vetter, Thomas Petazzoni, Thomas Zimmermann
On Wed, 7 Jan 2026 14:13:03 +0100, Luca Ceresoli wrote:
> of_drm_find_bridge() is deprecated. Move to its replacement
> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
> is put when done. Also switch to the drm_bridge::next_bridge pointer.
>
> This needs to handle both cases: when of_drm_find_panel() succeeds and when
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 09/12] drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
2026-01-07 14:08 ` Maxime Ripard
@ 2026-01-07 14:45 ` Luca Ceresoli
0 siblings, 0 replies; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-07 14:45 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
Philippe Cornu, benjamin.gaignard, Andrzej Hajda, Neil Armstrong,
Robert Foss, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Adrien Grassein, Liu Ying, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Inki Dae, Jagan Teki,
Marek Szyprowski, Hui Pu, Thomas Petazzoni, dri-devel,
linux-kernel, imx, linux-arm-kernel
Hi Maxime,
Thanks for the blazingly fast review of the entire series!
On Wed Jan 7, 2026 at 3:08 PM CET, Maxime Ripard wrote:
> Hi,
>
> On Wed, Jan 07, 2026 at 02:13:00PM +0100, Luca Ceresoli wrote:
>> of_drm_find_bridge() is deprecated. Move to its replacement
>> of_drm_find_and_get_bridge() which gets a bridge reference, and ensure it
>> is put when done.
>>
>> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>> ---
>> drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
>> index 122502968927..6b80d798b27a 100644
>> --- a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
>> +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
>> @@ -552,7 +552,7 @@ static int imx8qxp_ldb_parse_dt_companion(struct imx8qxp_ldb *imx8qxp_ldb)
>> goto out;
>> }
>>
>> - imx8qxp_ldb->companion = of_drm_find_bridge(companion_port);
>> + imx8qxp_ldb->companion = of_drm_find_and_get_bridge(companion_port);
>> if (!imx8qxp_ldb->companion) {
>> ret = -EPROBE_DEFER;
>> DRM_DEV_DEBUG_DRIVER(dev,
>> @@ -679,6 +679,7 @@ static void imx8qxp_ldb_remove(struct platform_device *pdev)
>> struct ldb *ldb = &imx8qxp_ldb->base;
>>
>> ldb_remove_bridge_helper(ldb);
>> + drm_bridge_put(imx8qxp_ldb->companion);
>
> the companion bridge is used in pretty much every KMS hook, we need to
> put the reference in destroy.
Ouch, indeed! Will fix in v2.
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (11 preceding siblings ...)
2026-01-07 13:13 ` [PATCH 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
@ 2026-01-07 23:48 ` Marek Szyprowski
12 siblings, 0 replies; 29+ messages in thread
From: Marek Szyprowski @ 2026-01-07 23:48 UTC (permalink / raw)
To: Luca Ceresoli, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Philippe Cornu,
benjamin.gaignard, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Adrien Grassein,
Liu Ying, Shawn Guo, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Inki Dae, Jagan Teki
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, stable
On 07.01.2026 14:12, Luca Ceresoli wrote:
> This series converts all DRM bridge drivers (*) from the now deprecated
> of_drm_find_bridge() to its replacement of_drm_find_and_get_bridge() which
> allows correct bridge refcounting. It also converts per-driver
> "next_bridge" pointers to the unified drm_bridge::next_bridge which puts
> the reference automatically on bridge deallocation.
>
> This is part of the work to support hotplug of DRM bridges. The grand plan
> was discussed in [0].
This patchset breaks Exynos DSI (Samsung-DSIM) driver operation on all
my test boards. I will try to debug it and provide more information
tomorrow though.
> Here's the work breakdown (➜ marks the current series):
>
> 1. ➜ add refcounting to DRM bridges struct drm_bridge,
> based on devm_drm_bridge_alloc()
> A. ✔ add new alloc API and refcounting (v6.16)
> B. ✔ convert all bridge drivers to new API (v6.17)
> C. ✔ kunit tests (v6.17)
> D. ✔ add get/put to drm_bridge_add/remove() + attach/detach()
> and warn on old allocation pattern (v6.17)
> E. ➜ add get/put on drm_bridge accessors
> 1. ✔ drm_bridge_chain_get_first_bridge(), add cleanup action (v6.18)
> 2. ✔ drm_bridge_get_prev_bridge() (v6.18)
> 3. ✔ drm_bridge_get_next_bridge() (v6.19)
> 4. ✔ drm_for_each_bridge_in_chain() (v6.19)
> 5. ✔ drm_bridge_connector_init (v6.19)
> 6. … protect encoder bridge chain with a mutex
> 7. ➜ of_drm_find_bridge
> a. ✔… add of_drm_get_bridge(), convert basic direct users
> (v6.20?, one driver still pending)
> b. ➜ convert direct of_drm_get_bridge() users, part 2
> c. convert direct of_drm_get_bridge() users, part 3
> d. convert direct of_drm_get_bridge() users, part 4
> e. convert bridge-only drm_of_find_panel_or_bridge() users
> 8. drm_of_find_panel_or_bridge, *_of_get_bridge
> 9. ✔ enforce drm_bridge_add before drm_bridge_attach (v6.19)
> F. ✔ debugfs improvements
> 1. ✔ add top-level 'bridges' file (v6.16)
> 2. ✔ show refcount and list lingering bridges (v6.19)
> 2. … handle gracefully atomic updates during bridge removal
> A. ✔ Add drm_dev_enter/exit() to protect device resources (v6.20?)
> B. … protect private_obj removal from list
> 3. … DSI host-device driver interaction
> 4. ✔ removing the need for the "always-disconnected" connector
> 5. finish the hotplug bridge work, moving code to the core and potentially
> removing the hotplug-bridge itself (this needs to be clarified as
> points 1-3 are developed)
>
> [0] https://lore.kernel.org/lkml/20250206-hotplug-drm-bridge-v6-0-9d6f2c9c3058@bootlin.com/#t
>
> This work is a continuation of the work to correctly handle bridge
> refcounting for existing of_drm_find_bridge(). The ground work is in:
>
> - commit 293a8fd7721a ("drm/bridge: add of_drm_find_and_get_bridge()")
> - commit 9da0e06abda8 ("drm/bridge: deprecate of_drm_find_bridge()")
> - commit 3fdeae134ba9 ("drm/bridge: add next_bridge pointer to struct drm_bridge")
>
> The whole conversion is split in multiple series to make the review process
> a bit smoother. Parts 3 and 4 are converting non-bridge drivers (mostly
> encoders).
>
> (*) One bridge driver (synopsys/dw-hdmi) is converted in another series,
> together with its (non-bridge) users. Additionally this series converts
> drm_of_panel_bridge_remove() which is a special case, and has a bugfix
> for it too.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> ---
> Luca Ceresoli (12):
> drm: of: drm_of_panel_bridge_remove(): fix device_node leak
> drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge()
> drm/bridge: sii902x: convert to of_drm_find_and_get_bridge()
> drm/bridge: thc63lvd1024: convert to of_drm_find_and_get_bridge()
> drm/bridge: tfp410: convert to of_drm_find_and_get_bridge()
> drm/bridge: tpd12s015: convert to of_drm_find_and_get_bridge()
> drm/bridge: lt8912b: convert to of_drm_find_and_get_bridge()
> drm/bridge: imx8mp-hdmi-pvi: convert to of_drm_find_and_get_bridge()
> drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
> drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
> drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator
> drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
>
> drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c | 15 +++++++-------
> drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c | 3 ++-
> drivers/gpu/drm/bridge/lontium-lt8912b.c | 31 ++++++++++++++--------------
> drivers/gpu/drm/bridge/samsung-dsim.c | 28 ++++++++++++++++---------
> drivers/gpu/drm/bridge/sii902x.c | 7 +++----
> drivers/gpu/drm/bridge/thc63lvd1024.c | 7 +++----
> drivers/gpu/drm/bridge/ti-tfp410.c | 27 ++++++++++++------------
> drivers/gpu/drm/bridge/ti-tpd12s015.c | 8 +++----
> include/drm/bridge/samsung-dsim.h | 1 -
> include/drm/drm_of.h | 6 +++++-
> 10 files changed, 69 insertions(+), 64 deletions(-)
> ---
> base-commit: 2bcba510a612cea32b8a536eedeabd7fcb413cd0
> change-id: 20251223-drm-bridge-alloc-getput-drm_of_find_bridge-2-12c6bbcb6896
>
> Best regards,
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
2026-01-07 13:13 ` [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
2026-01-07 14:09 ` Maxime Ripard
@ 2026-01-08 9:26 ` Marek Szyprowski
2026-01-08 13:33 ` Luca Ceresoli
1 sibling, 1 reply; 29+ messages in thread
From: Marek Szyprowski @ 2026-01-08 9:26 UTC (permalink / raw)
To: Luca Ceresoli, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Philippe Cornu,
benjamin.gaignard, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Adrien Grassein,
Liu Ying, Shawn Guo, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Inki Dae, Jagan Teki
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel
On 07.01.2026 14:13, Luca Ceresoli wrote:
> In preparation to handle refcounting of the out_bridge, we need to ensure
> the out_bridge pointer contains either a valid bridge pointer or NULL, not
> an ERR_PTR. Otherwise calls such as drm_bridge_get/put() would try to
> redeference an ERR_PTR.
>
> As a preliminary cleanup, add a temporary local 'next_bridge' pointer and
> only copy it in dsi->out_bridge when returning successfully.
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> ---
> drivers/gpu/drm/bridge/samsung-dsim.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
> index eabc4c32f6ab..b3003aa49dc3 100644
> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
> @@ -1886,6 +1886,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
> {
> struct samsung_dsim *dsi = host_to_dsi(host);
> const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
> + struct drm_bridge *next_bridge;
> struct device *dev = dsi->dev;
> struct device_node *np = dev->of_node;
> struct device_node *remote;
> @@ -1924,17 +1925,17 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
>
> panel = of_drm_find_panel(remote);
> if (!IS_ERR(panel)) {
> - dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel);
> + next_bridge = devm_drm_panel_bridge_add(dev, panel);
> } else {
> - dsi->out_bridge = of_drm_find_bridge(remote);
> - if (!dsi->out_bridge)
> - dsi->out_bridge = ERR_PTR(-EINVAL);
> + next_bridge = of_drm_find_bridge(remote);
> + if (!next_bridge)
> + next_bridge = ERR_PTR(-EINVAL);
> }
>
> of_node_put(remote);
>
> - if (IS_ERR(dsi->out_bridge)) {
> - ret = PTR_ERR(dsi->out_bridge);
> + if (IS_ERR(next_bridge)) {
> + ret = PTR_ERR(next_bridge);
> DRM_DEV_ERROR(dev, "failed to find the bridge: %d\n", ret);
> return ret;
> }
> @@ -1967,6 +1968,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
> dsi->lanes = device->lanes;
> dsi->format = device->format;
> dsi->mode_flags = device->mode_flags;
> + dsi->out_bridge = next_bridge;
>
This assignment is too late, dsi->out_bridge is used (indirectly, by
samsung_dsim_attach() called from drm_bridge_attach()) by
ret = pdata->host_ops->attach(dsi, device);
a few lines before this assignment, so the following fix has to be added:
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
b/drivers/gpu/drm/bridge/samsung-dsim.c index b3003aa49dc3..f88aa8ab2879
100644 --- a/drivers/gpu/drm/bridge/samsung-dsim.c +++
b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -1959,6 +1959,7 @@ static int
samsung_dsim_host_attach(struct mipi_dsi_host *host, return ret; } +
dsi->out_bridge = next_bridge; if (pdata->host_ops &&
pdata->host_ops->attach) { ret = pdata->host_ops->attach(dsi, device);
if (ret) @@ -1968,7 +1969,6 @@ static int
samsung_dsim_host_attach(struct mipi_dsi_host *host, dsi->lanes =
device->lanes; dsi->format = device->format; dsi->mode_flags =
device->mode_flags; - dsi->out_bridge = next_bridge; return 0; }
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
2026-01-08 9:26 ` Marek Szyprowski
@ 2026-01-08 13:33 ` Luca Ceresoli
0 siblings, 0 replies; 29+ messages in thread
From: Luca Ceresoli @ 2026-01-08 13:33 UTC (permalink / raw)
To: Marek Szyprowski, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Philippe Cornu,
benjamin.gaignard, Andrzej Hajda, Neil Armstrong, Robert Foss,
Laurent Pinchart, Jonas Karlman, Jernej Skrabec, Adrien Grassein,
Liu Ying, Shawn Guo, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Inki Dae, Jagan Teki
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel
Hi Marek,
On Thu Jan 8, 2026 at 10:26 AM CET, Marek Szyprowski wrote:
> On 07.01.2026 14:13, Luca Ceresoli wrote:
>> In preparation to handle refcounting of the out_bridge, we need to ensure
>> the out_bridge pointer contains either a valid bridge pointer or NULL, not
>> an ERR_PTR. Otherwise calls such as drm_bridge_get/put() would try to
>> redeference an ERR_PTR.
>>
>> As a preliminary cleanup, add a temporary local 'next_bridge' pointer and
>> only copy it in dsi->out_bridge when returning successfully.
>>
>> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>> ---
>> drivers/gpu/drm/bridge/samsung-dsim.c | 14 ++++++++------
>> 1 file changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
>> index eabc4c32f6ab..b3003aa49dc3 100644
>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c
>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c
>> @@ -1886,6 +1886,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
>> {
>> struct samsung_dsim *dsi = host_to_dsi(host);
>> const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
>> + struct drm_bridge *next_bridge;
>> struct device *dev = dsi->dev;
>> struct device_node *np = dev->of_node;
>> struct device_node *remote;
>> @@ -1924,17 +1925,17 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
>>
>> panel = of_drm_find_panel(remote);
>> if (!IS_ERR(panel)) {
>> - dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel);
>> + next_bridge = devm_drm_panel_bridge_add(dev, panel);
>> } else {
>> - dsi->out_bridge = of_drm_find_bridge(remote);
>> - if (!dsi->out_bridge)
>> - dsi->out_bridge = ERR_PTR(-EINVAL);
>> + next_bridge = of_drm_find_bridge(remote);
>> + if (!next_bridge)
>> + next_bridge = ERR_PTR(-EINVAL);
>> }
>>
>> of_node_put(remote);
>>
>> - if (IS_ERR(dsi->out_bridge)) {
>> - ret = PTR_ERR(dsi->out_bridge);
>> + if (IS_ERR(next_bridge)) {
>> + ret = PTR_ERR(next_bridge);
>> DRM_DEV_ERROR(dev, "failed to find the bridge: %d\n", ret);
>> return ret;
>> }
>> @@ -1967,6 +1968,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
>> dsi->lanes = device->lanes;
>> dsi->format = device->format;
>> dsi->mode_flags = device->mode_flags;
>> + dsi->out_bridge = next_bridge;
>>
>
> This assignment is too late, dsi->out_bridge is used (indirectly, by
> samsung_dsim_attach() called from drm_bridge_attach()) by
>
> ret = pdata->host_ops->attach(dsi, device);
Thanks for testing, reporting, and suggesting a solution. I'm not sure why
it worked on my setup, but this is indeed a bug.
> a few lines before this assignment, so the following fix has to be added:
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c
> b/drivers/gpu/drm/bridge/samsung-dsim.c index b3003aa49dc3..f88aa8ab2879
> 100644 --- a/drivers/gpu/drm/bridge/samsung-dsim.c +++
> b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -1959,6 +1959,7 @@ static int
> samsung_dsim_host_attach(struct mipi_dsi_host *host, return ret; } +
> dsi->out_bridge = next_bridge; if (pdata->host_ops &&
> pdata->host_ops->attach) { ret = pdata->host_ops->attach(dsi, device);
> if (ret) @@ -1968,7 +1969,6 @@ static int
> samsung_dsim_host_attach(struct mipi_dsi_host *host, dsi->lanes =
> device->lanes; dsi->format = device->format; dsi->mode_flags =
> device->mode_flags; - dsi->out_bridge = next_bridge; return 0; }
This needed a bit of demangling :) but it looks like a correct solution.
I took a moment to understand why this did not break my setup. The answer
is I have a fsl,imx8mp-mipi-dsim, which has no .attach set in its
samsung_dsim_host_ops.
Sorry for the inconvenience. I'm fixing this in v2.
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2026-01-08 13:33 UTC | newest]
Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20260107131333eucas1p2ee0b7afe47dc2fafa29e893e4283962b@eucas1p2.samsung.com>
2026-01-07 13:12 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
2026-01-07 13:12 ` [PATCH 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak Luca Ceresoli
2026-01-07 13:33 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge() Luca Ceresoli
2026-01-07 13:34 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 03/12] drm/bridge: sii902x: " Luca Ceresoli
2026-01-07 13:38 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 04/12] drm/bridge: thc63lvd1024: " Luca Ceresoli
2026-01-07 13:38 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 05/12] drm/bridge: tfp410: " Luca Ceresoli
2026-01-07 13:38 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 06/12] drm/bridge: tpd12s015: " Luca Ceresoli
2026-01-07 13:39 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 07/12] drm/bridge: lt8912b: " Luca Ceresoli
2026-01-07 13:56 ` Maxime Ripard
2026-01-07 13:12 ` [PATCH 08/12] drm/bridge: imx8mp-hdmi-pvi: " Luca Ceresoli
2026-01-07 13:56 ` Maxime Ripard
2026-01-07 13:13 ` [PATCH 09/12] drm/bridge: imx8qxp-ldb: " Luca Ceresoli
2026-01-07 14:08 ` Maxime Ripard
2026-01-07 14:45 ` Luca Ceresoli
2026-01-07 13:13 ` [PATCH 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
2026-01-07 14:09 ` Maxime Ripard
2026-01-08 9:26 ` Marek Szyprowski
2026-01-08 13:33 ` Luca Ceresoli
2026-01-07 13:13 ` [PATCH 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator Luca Ceresoli
2026-01-07 14:11 ` Maxime Ripard
2026-01-07 13:13 ` [PATCH 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
2026-01-07 14:26 ` Maxime Ripard
2026-01-07 23:48 ` [PATCH 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Marek Szyprowski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).