* [PATCH v2 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge() Luca Ceresoli
` (11 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 03/12] drm/bridge: sii902x: " Luca Ceresoli
` (10 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 03/12] drm/bridge: sii902x: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge() Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 04/12] drm/bridge: thc63lvd1024: " Luca Ceresoli
` (9 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 04/12] drm/bridge: thc63lvd1024: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (2 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 03/12] drm/bridge: sii902x: " Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 05/12] drm/bridge: tfp410: " Luca Ceresoli
` (8 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 05/12] drm/bridge: tfp410: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (3 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 04/12] drm/bridge: thc63lvd1024: " Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 06/12] drm/bridge: tpd12s015: " Luca Ceresoli
` (7 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 06/12] drm/bridge: tpd12s015: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (4 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 05/12] drm/bridge: tfp410: " Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 07/12] drm/bridge: lt8912b: " Luca Ceresoli
` (6 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 07/12] drm/bridge: lt8912b: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (5 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 06/12] drm/bridge: tpd12s015: " Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 08/12] drm/bridge: imx8mp-hdmi-pvi: " Luca Ceresoli
` (5 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 08/12] drm/bridge: imx8mp-hdmi-pvi: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (6 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 07/12] drm/bridge: lt8912b: " Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 7:31 ` [PATCH v2 09/12] drm/bridge: imx8qxp-ldb: " Luca Ceresoli
` (4 subsequent siblings)
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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] 20+ messages in thread* [PATCH v2 09/12] drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (7 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 08/12] drm/bridge: imx8mp-hdmi-pvi: " Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-13 15:18 ` Maxime Ripard
2026-01-09 7:31 ` [PATCH v2 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; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Since the companion bridge pointer is used by many bridge funcs, putting
its reference in the remove function would be dangerous. Use .destroy to
put it on final deallocation.
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
Changes in v2:
- put in .destroy, not in remove
---
drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c | 12 +++++++++++-
1 file changed, 11 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..675995cbeb6b 100644
--- a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
+++ b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c
@@ -62,6 +62,15 @@ static inline struct imx8qxp_ldb *base_to_imx8qxp_ldb(struct ldb *base)
return container_of(base, struct imx8qxp_ldb, base);
}
+static void imx8qxp_ldb_bridge_destroy(struct drm_bridge *bridge)
+{
+ struct ldb_channel *ldb_ch = bridge->driver_private;
+ struct ldb *ldb = ldb_ch->ldb;
+ struct imx8qxp_ldb *imx8qxp_ldb = base_to_imx8qxp_ldb(ldb);
+
+ drm_bridge_put(imx8qxp_ldb->companion);
+}
+
static void imx8qxp_ldb_set_phy_cfg(struct imx8qxp_ldb *imx8qxp_ldb,
unsigned long di_clk, bool is_split,
struct phy_configure_opts_lvds *phy_cfg)
@@ -391,6 +400,7 @@ imx8qxp_ldb_bridge_mode_valid(struct drm_bridge *bridge,
}
static const struct drm_bridge_funcs imx8qxp_ldb_bridge_funcs = {
+ .destroy = imx8qxp_ldb_bridge_destroy,
.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
.atomic_reset = drm_atomic_helper_bridge_reset,
@@ -552,7 +562,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,
--
2.52.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 09/12] drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 ` [PATCH v2 09/12] drm/bridge: imx8qxp-ldb: " Luca Ceresoli
@ 2026-01-13 15:18 ` Maxime Ripard
0 siblings, 0 replies; 20+ messages in thread
From: Maxime Ripard @ 2026-01-13 15:18 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 Fri, 9 Jan 2026 08:31:40 +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.
>
> Since the companion bridge pointer is used by many bridge funcs, putting
>
> [ ... ]
Acked-by: Maxime Ripard <mripard@kernel.org>
Thanks!
Maxime
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (8 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 09/12] drm/bridge: imx8qxp-ldb: " Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 8:49 ` Marek Szyprowski
2026-01-13 15:42 ` Maxime Ripard
2026-01-09 7:31 ` [PATCH v2 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; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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 as late as possible, i.e. just before
calling pdata->host_ops->attach() which uses it (only in the exynos
driver).
Not strictly needed, but for symmetry move the clearing of dsi->out_bridge
in samsung_dsim_host_detach() to after pdata->host_ops->detach().
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
Changes in v2:
- fix "pointer set too late" bug (NULL pointer deref in the exynos case)
- *not* add Acked-by: Maxime as the patch has changed
---
drivers/gpu/drm/bridge/samsung-dsim.c | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index eabc4c32f6ab..8dd058124e93 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;
}
@@ -1958,10 +1959,13 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
return ret;
}
+ // The next bridge can be used by host_ops->attach
+ dsi->out_bridge = next_bridge;
+
if (pdata->host_ops && pdata->host_ops->attach) {
ret = pdata->host_ops->attach(dsi, device);
if (ret)
- return ret;
+ goto err_release_next_bridge;
}
dsi->lanes = device->lanes;
@@ -1969,6 +1973,10 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
dsi->mode_flags = device->mode_flags;
return 0;
+
+err_release_next_bridge:
+ dsi->out_bridge = NULL;
+ return ret;
}
static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi)
@@ -1985,11 +1993,11 @@ 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);
+ dsi->out_bridge = NULL;
+
samsung_dsim_unregister_te_irq(dsi);
drm_bridge_remove(&dsi->bridge);
--
2.52.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
2026-01-09 7:31 ` [PATCH v2 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
@ 2026-01-09 8:49 ` Marek Szyprowski
2026-01-13 15:42 ` Maxime Ripard
1 sibling, 0 replies; 20+ messages in thread
From: Marek Szyprowski @ 2026-01-09 8:49 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 09.01.2026 08:31, 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 as late as possible, i.e. just before
> calling pdata->host_ops->attach() which uses it (only in the exynos
> driver).
>
> Not strictly needed, but for symmetry move the clearing of dsi->out_bridge
> in samsung_dsim_host_detach() to after pdata->host_ops->detach().
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
>
> Changes in v2:
> - fix "pointer set too late" bug (NULL pointer deref in the exynos case)
> - *not* add Acked-by: Maxime as the patch has changed
> ---
> drivers/gpu/drm/bridge/samsung-dsim.c | 26 +++++++++++++++++---------
> 1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
> index eabc4c32f6ab..8dd058124e93 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;
> }
> @@ -1958,10 +1959,13 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
> return ret;
> }
>
> + // The next bridge can be used by host_ops->attach
> + dsi->out_bridge = next_bridge;
> +
> if (pdata->host_ops && pdata->host_ops->attach) {
> ret = pdata->host_ops->attach(dsi, device);
> if (ret)
> - return ret;
> + goto err_release_next_bridge;
> }
>
> dsi->lanes = device->lanes;
> @@ -1969,6 +1973,10 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
> dsi->mode_flags = device->mode_flags;
>
> return 0;
> +
> +err_release_next_bridge:
> + dsi->out_bridge = NULL;
> + return ret;
> }
>
> static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi)
> @@ -1985,11 +1993,11 @@ 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);
>
> + dsi->out_bridge = NULL;
> +
> samsung_dsim_unregister_te_irq(dsi);
>
> drm_bridge_remove(&dsi->bridge);
>
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v2 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
2026-01-09 7:31 ` [PATCH v2 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
2026-01-09 8:49 ` Marek Szyprowski
@ 2026-01-13 15:42 ` Maxime Ripard
1 sibling, 0 replies; 20+ messages in thread
From: Maxime Ripard @ 2026-01-13 15:42 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 Fri, 9 Jan 2026 08:31:41 +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] 20+ messages in thread
* [PATCH v2 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (9 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 8:49 ` Marek Szyprowski
2026-01-09 7:31 ` [PATCH v2 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
2026-01-20 14:15 ` [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
12 siblings, 1 reply; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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.
Acked-by: Maxime Ripard <mripard@kernel.org>
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 8dd058124e93..afaa63c4d3f7 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] 20+ messages in thread* Re: [PATCH v2 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator
2026-01-09 7:31 ` [PATCH v2 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator Luca Ceresoli
@ 2026-01-09 8:49 ` Marek Szyprowski
0 siblings, 0 replies; 20+ messages in thread
From: Marek Szyprowski @ 2026-01-09 8:49 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 09.01.2026 08:31, 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.
>
> Stop using IS_ERR(next_bridge) as an indication of an error, and instead
> use the 'ret' integer.
>
> No functional change.
>
> Acked-by: Maxime Ripard <mripard@kernel.org>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.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 8dd058124e93..afaa63c4d3f7 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;
> }
>
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (10 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator Luca Ceresoli
@ 2026-01-09 7:31 ` Luca Ceresoli
2026-01-09 8:50 ` Marek Szyprowski
2026-01-13 15:44 ` Maxime Ripard
2026-01-20 14:15 ` [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
12 siblings, 2 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-09 7:31 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>
---
Changes in v2:
- updated after "pointer set too late" fix inprevious patch
- *not* add Acked-by: Maxime as the patch has changed
---
drivers/gpu/drm/bridge/samsung-dsim.c | 20 +++++++++++++-------
include/drm/bridge/samsung-dsim.h | 1 -
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
index afaa63c4d3f7..1d85e706c74b 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;
}
@@ -1961,7 +1965,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
}
// The next bridge can be used by host_ops->attach
- dsi->out_bridge = next_bridge;
+ dsi->bridge.next_bridge = drm_bridge_get(next_bridge);
if (pdata->host_ops && pdata->host_ops->attach) {
ret = pdata->host_ops->attach(dsi, device);
@@ -1976,7 +1980,8 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
return 0;
err_release_next_bridge:
- dsi->out_bridge = NULL;
+ drm_bridge_put(dsi->bridge.next_bridge);
+ dsi->bridge.next_bridge = NULL;
return ret;
}
@@ -1997,7 +2002,8 @@ static int samsung_dsim_host_detach(struct mipi_dsi_host *host,
if (pdata->host_ops && pdata->host_ops->detach)
pdata->host_ops->detach(dsi, device);
- dsi->out_bridge = NULL;
+ drm_bridge_put(dsi->bridge.next_bridge);
+ dsi->bridge.next_bridge = NULL;
samsung_dsim_unregister_te_irq(dsi);
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] 20+ messages in thread* Re: [PATCH v2 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 ` [PATCH v2 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
@ 2026-01-09 8:50 ` Marek Szyprowski
2026-01-13 15:44 ` Maxime Ripard
1 sibling, 0 replies; 20+ messages in thread
From: Marek Szyprowski @ 2026-01-09 8:50 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 09.01.2026 08:31, 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
> 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>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
>
> Changes in v2:
> - updated after "pointer set too late" fix inprevious patch
> - *not* add Acked-by: Maxime as the patch has changed
> ---
> drivers/gpu/drm/bridge/samsung-dsim.c | 20 +++++++++++++-------
> include/drm/bridge/samsung-dsim.h | 1 -
> 2 files changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c
> index afaa63c4d3f7..1d85e706c74b 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;
> }
> @@ -1961,7 +1965,7 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
> }
>
> // The next bridge can be used by host_ops->attach
> - dsi->out_bridge = next_bridge;
> + dsi->bridge.next_bridge = drm_bridge_get(next_bridge);
>
> if (pdata->host_ops && pdata->host_ops->attach) {
> ret = pdata->host_ops->attach(dsi, device);
> @@ -1976,7 +1980,8 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
> return 0;
>
> err_release_next_bridge:
> - dsi->out_bridge = NULL;
> + drm_bridge_put(dsi->bridge.next_bridge);
> + dsi->bridge.next_bridge = NULL;
> return ret;
> }
>
> @@ -1997,7 +2002,8 @@ static int samsung_dsim_host_detach(struct mipi_dsi_host *host,
> if (pdata->host_ops && pdata->host_ops->detach)
> pdata->host_ops->detach(dsi, device);
>
> - dsi->out_bridge = NULL;
> + drm_bridge_put(dsi->bridge.next_bridge);
> + dsi->bridge.next_bridge = NULL;
>
> samsung_dsim_unregister_te_irq(dsi);
>
> 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;
>
>
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v2 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
2026-01-09 7:31 ` [PATCH v2 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
2026-01-09 8:50 ` Marek Szyprowski
@ 2026-01-13 15:44 ` Maxime Ripard
1 sibling, 0 replies; 20+ messages in thread
From: Maxime Ripard @ 2026-01-13 15:44 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 Fri, 9 Jan 2026 08:31:43 +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] 20+ messages in thread
* Re: [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2
2026-01-09 7:31 [PATCH v2 00/12] drm/bridge: convert users of of_drm_find_bridge(), part 2 Luca Ceresoli
` (11 preceding siblings ...)
2026-01-09 7:31 ` [PATCH v2 12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge() Luca Ceresoli
@ 2026-01-20 14:15 ` Luca Ceresoli
12 siblings, 0 replies; 20+ messages in thread
From: Luca Ceresoli @ 2026-01-20 14:15 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, Luca Ceresoli
Cc: Hui Pu, Thomas Petazzoni, dri-devel, linux-kernel, imx,
linux-arm-kernel, stable
On Fri, 09 Jan 2026 08:31:31 +0100, 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].
>
> [...]
Applied, thanks!
[01/12] drm: of: drm_of_panel_bridge_remove(): fix device_node leak
commit: a4b4385d0523e39a7c058cb5a6c8269e513126ca
[02/12] drm: of: drm_of_panel_bridge_remove(): convert to of_drm_find_and_get_bridge()
commit: f675a276b84488e78287dd22c2e9461e4c008c66
[03/12] drm/bridge: sii902x: convert to of_drm_find_and_get_bridge()
commit: d07490fb23958006bcecd6f2ba411571c099d104
[04/12] drm/bridge: thc63lvd1024: convert to of_drm_find_and_get_bridge()
commit: 9d34e1a8cf7b643bca058a65f3441d90099b297f
[05/12] drm/bridge: tfp410: convert to of_drm_find_and_get_bridge()
commit: 35dd5e1c089b6fd9f503bb15ebc1138d5a3f887e
[06/12] drm/bridge: tpd12s015: convert to of_drm_find_and_get_bridge()
commit: 0bbca46cd50a527bded903ffe7f32e3761e825bd
[07/12] drm/bridge: lt8912b: convert to of_drm_find_and_get_bridge()
commit: 31cb3cd7e7149983e279f3d6da3ae5757a965ea5
[08/12] drm/bridge: imx8mp-hdmi-pvi: convert to of_drm_find_and_get_bridge()
commit: 7654c807f20701ebd1dc7e967270d017dcc36730
[09/12] drm/bridge: imx8qxp-ldb: convert to of_drm_find_and_get_bridge()
commit: 32529d384cea3a9b939ff1b56aa30a13f8370129
[10/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: use a temporary variable for the next bridge
commit: e5e1a0000746ded4d9fa16fceda0748aec2b6e6a
[11/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: don't use the bridge pointer as an error indicator
commit: 33f86ac63031d0593e48eb0a738f2d1b1ee29879
[12/12] drm/bridge: samsung-dsim: samsung_dsim_host_attach: convert to of_drm_find_and_get_bridge()
commit: 685d0dfc37d081e56374852165afc8ab3b3e8d5b
Best regards,
--
Luca Ceresoli <luca.ceresoli@bootlin.com>
^ permalink raw reply [flat|nested] 20+ messages in thread