mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/3] drm: remove drmm_of_get_bridge()
@ 2026-11-06 16:17 Luca Ceresoli
  2026-11-06 16:17 ` [PATCH 1/3] drm: adp: stop using deprecated drmm_of_get_bridge() Luca Ceresoli
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Luca Ceresoli @ 2026-11-06 16:17 UTC (permalink / raw)
  To: Sasha Finkelstein, Janne Grunau, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
	Neil Armstrong, Jessica Zhang, Jonathan Corbet, Shuah Khan,
	Randy Dunlap, Dmitry Baryshkov
  Cc: Hui Pu, Ian Ray, Thomas Petazzoni, dri-devel, asahi,
	linux-kernel, linux-doc, Luca Ceresoli

drmm_of_get_bridge() is deprecated. By now it is just a complicated wrapper
to of_drm_get_bridge_by_endpoint(), and it does not implement bridge
refcounting. Replace the only user and remove it.

== Grand plan

This is part of the work to support hotplug of DRM bridges.

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 (v7.2)
       7. ✔ of_drm_find_bridge
          a. ✔ add of_drm_get_bridge() (v7.0),
               convert basic direct users (v7.0-v7.1)
          b. ✔ convert direct of_drm_get_bridge() users, part 2 (v7.0)
          c. ✔ convert direct of_drm_get_bridge() users, part 3 (v7.0)
          d. ✔ convert direct of_drm_get_bridge() users, part 4 (v7.1-v7.2)
          e. ✔ bridge-only drm_of_find_panel_or_bridge() users (v7.2)
       8. ➜ panel_bridge lifetime
          a. ✔ cleanup DRM_PANEL in bridge drivers (v7.4)
	  b. ✔ embed a drm_bridge in every drm_panel (v7.4)
	  c. ✔ remove *_of_get_bridge(): non-OF drivers (v7.5)
	  d. ➜ remove drmm_of_get_bridge()
	  e.   remove devm_drm_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_bridge_enter/exit() to protect device resources (v7.0)
    B. ✔ Add drm_bridge_clear_and_put() (v7.1)
 3. ✕ DSI host-device driver interaction
 4. ✔ removing the need for the "always-disconnected" connector
 5. ✔ Migrate i.MX LCDIF driver to bridge-connector (v7.2)
 6. … DRM bridge hotplug
    A. … Bridge hotplug management in the DRM core
       1. ✔ bridge-connector: attach encoder to the connector (v7.2)
       2. … drm bridge hotplug
    B.   Device tree description

Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
Luca Ceresoli (3):
      drm: adp: stop using deprecated drmm_of_get_bridge()
      drm/panel: remove drmm_of_get_bridge()
      drm/todo: remove drmm_of_get_bridge()

 Documentation/gpu/todo.rst    |  1 -
 drivers/gpu/drm/adp/adp_drv.c | 13 +++++++++----
 drivers/gpu/drm/drm_panel.c   | 40 ----------------------------------------
 include/drm/drm_panel.h       | 10 ----------
 4 files changed, 9 insertions(+), 55 deletions(-)
---
base-commit: 4524052b65a75166c1c557921c786bd82302de13
change-id: 20261106-drm-panel_bridge-remove-drmm_of_get_bridge-791bd0f0ad97

Best regards,
--  
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] drm: adp: stop using deprecated drmm_of_get_bridge()
  2026-11-06 16:17 [PATCH 0/3] drm: remove drmm_of_get_bridge() Luca Ceresoli
@ 2026-11-06 16:17 ` Luca Ceresoli
  2026-11-06 16:17 ` [PATCH 2/3] drm/panel: remove drmm_of_get_bridge() Luca Ceresoli
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Luca Ceresoli @ 2026-11-06 16:17 UTC (permalink / raw)
  To: Sasha Finkelstein, Janne Grunau, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
	Neil Armstrong, Jessica Zhang, Jonathan Corbet, Shuah Khan,
	Randy Dunlap, Dmitry Baryshkov
  Cc: Hui Pu, Ian Ray, Thomas Petazzoni, dri-devel, asahi,
	linux-kernel, linux-doc, Luca Ceresoli

drmm_of_get_bridge() is deprecated, switch to
of_drm_get_bridge_by_endpoint(). As of_drm_get_bridge_by_endpoint() returns
a refcounted bridge, ensure the reference is put on later bind error and on
unbind.

Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
 drivers/gpu/drm/adp/adp_drv.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/adp/adp_drv.c b/drivers/gpu/drm/adp/adp_drv.c
index fdf0e6316175..1c4c39695e42 100644
--- a/drivers/gpu/drm/adp/adp_drv.c
+++ b/drivers/gpu/drm/adp/adp_drv.c
@@ -517,7 +517,7 @@ static int adp_drm_bind(struct device *dev)
 
 	writel(ADP_CTRL_FIFO_ON, adp->fe + ADP_CTRL);
 
-	adp->next_bridge = drmm_of_get_bridge(&adp->drm, dev->of_node, 0, 0);
+	adp->next_bridge = of_drm_get_bridge_by_endpoint(dev->of_node, 0, 0);
 	if (IS_ERR(adp->next_bridge)) {
 		dev_err(dev, "failed to find next bridge");
 		return PTR_ERR(adp->next_bridge);
@@ -525,17 +525,21 @@ static int adp_drm_bind(struct device *dev)
 
 	err = adp_setup_mode_config(adp);
 	if (err < 0)
-		return err;
+		goto err_put_next_bridge;
 
 	err = request_irq(adp->fe_irq, adp_fe_irq, 0, "adp-fe", adp);
 	if (err)
-		return err;
+		goto err_put_next_bridge;
 
 	err = drm_dev_register(&adp->drm, 0);
 	if (err)
-		return err;
+		goto err_put_next_bridge;
 
 	return 0;
+
+err_put_next_bridge:
+	drm_bridge_clear_and_put(&adp->next_bridge);
+	return err;
 }
 
 static void adp_drm_unbind(struct device *dev)
@@ -546,6 +550,7 @@ static void adp_drm_unbind(struct device *dev)
 	drm_dev_unregister(drm);
 	drm_atomic_helper_shutdown(drm);
 	free_irq(adp->fe_irq, adp);
+	drm_bridge_clear_and_put(&adp->next_bridge);
 }
 
 static const struct component_master_ops adp_master_ops = {

-- 
2.56.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/3] drm/panel: remove drmm_of_get_bridge()
  2026-11-06 16:17 [PATCH 0/3] drm: remove drmm_of_get_bridge() Luca Ceresoli
  2026-11-06 16:17 ` [PATCH 1/3] drm: adp: stop using deprecated drmm_of_get_bridge() Luca Ceresoli
@ 2026-11-06 16:17 ` Luca Ceresoli
  2026-11-06 16:17 ` [PATCH 3/3] drm/todo: " Luca Ceresoli
  2026-11-08 17:26 ` [PATCH 0/3] drm: " Joshua Peisach
  3 siblings, 0 replies; 5+ messages in thread
From: Luca Ceresoli @ 2026-11-06 16:17 UTC (permalink / raw)
  To: Sasha Finkelstein, Janne Grunau, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
	Neil Armstrong, Jessica Zhang, Jonathan Corbet, Shuah Khan,
	Randy Dunlap, Dmitry Baryshkov
  Cc: Hui Pu, Ian Ray, Thomas Petazzoni, dri-devel, asahi,
	linux-kernel, linux-doc, Luca Ceresoli

This function is deprecated and has no remaining users.

Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
 drivers/gpu/drm/drm_panel.c | 40 ----------------------------------------
 include/drm/drm_panel.h     | 10 ----------
 2 files changed, 50 deletions(-)

diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index 560ea57591bd..3a633beed090 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -526,46 +526,6 @@ struct drm_bridge *devm_drm_of_get_bridge(struct device *dev,
 }
 EXPORT_SYMBOL(devm_drm_of_get_bridge);
 
-/**
- * drmm_of_get_bridge - Return next bridge in the chain
- * @drm: device to tie the bridge lifetime to
- * @np: device tree node containing encoder output ports
- * @port: port in the device tree node
- * @endpoint: endpoint in the device tree node
- *
- * This function is deprecated. A drm_bridge is embedded into every panel.
- * Don't use it in new drivers and convert your driver to
- * of_drm_get_bridge_by_endpoint().
- *
- * Given a DT node's port and endpoint number, finds the connected node
- * and returns the associated bridge if any, or creates and returns a
- * drm panel bridge instance if a panel is connected.
- *
- * Returns a drmm managed pointer to the bridge if successful, or an error
- * pointer otherwise.
- */
-struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm,
-				      struct device_node *np,
-				      u32 port, u32 endpoint)
-{
-	struct drm_bridge *bridge;
-	struct drm_panel *panel;
-	int ret;
-
-	ret = drm_of_find_panel_or_bridge(np, port, endpoint,
-					  &panel, &bridge);
-	if (ret)
-		return ERR_PTR(ret);
-
-	if (panel) {
-		bridge = drmm_panel_bridge_add(drm, panel);
-		drm_panel_put(panel);
-	}
-
-	return bridge;
-}
-EXPORT_SYMBOL(drmm_of_get_bridge);
-
 #endif
 
 /**
diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
index 58113ea7d63a..28ecbf2c8a29 100644
--- a/include/drm/drm_panel.h
+++ b/include/drm/drm_panel.h
@@ -434,8 +434,6 @@ static inline int drm_panel_bridge_set_orientation(struct drm_connector *connect
 #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL_BRIDGE)
 struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, struct device_node *node,
 					  u32 port, u32 endpoint);
-struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm, struct device_node *node,
-				      u32 port, u32 endpoint);
 #else
 static inline struct drm_bridge *devm_drm_of_get_bridge(struct device *dev,
 							struct device_node *node,
@@ -444,14 +442,6 @@ static inline struct drm_bridge *devm_drm_of_get_bridge(struct device *dev,
 {
 	return ERR_PTR(-ENODEV);
 }
-
-static inline struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm,
-						    struct device_node *node,
-						    u32 port,
-						    u32 endpoint)
-{
-	return ERR_PTR(-ENODEV);
-}
 #endif
 
 #endif

-- 
2.56.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 3/3] drm/todo: remove drmm_of_get_bridge()
  2026-11-06 16:17 [PATCH 0/3] drm: remove drmm_of_get_bridge() Luca Ceresoli
  2026-11-06 16:17 ` [PATCH 1/3] drm: adp: stop using deprecated drmm_of_get_bridge() Luca Ceresoli
  2026-11-06 16:17 ` [PATCH 2/3] drm/panel: remove drmm_of_get_bridge() Luca Ceresoli
@ 2026-11-06 16:17 ` Luca Ceresoli
  2026-11-08 17:26 ` [PATCH 0/3] drm: " Joshua Peisach
  3 siblings, 0 replies; 5+ messages in thread
From: Luca Ceresoli @ 2026-11-06 16:17 UTC (permalink / raw)
  To: Sasha Finkelstein, Janne Grunau, Maarten Lankhorst,
	Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter,
	Neil Armstrong, Jessica Zhang, Jonathan Corbet, Shuah Khan,
	Randy Dunlap, Dmitry Baryshkov
  Cc: Hui Pu, Ian Ray, Thomas Petazzoni, dri-devel, asahi,
	linux-kernel, linux-doc, Luca Ceresoli

This function has been removed.

Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
 Documentation/gpu/todo.rst | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
index e6d36f8da086..de4de6f7a0b4 100644
--- a/Documentation/gpu/todo.rst
+++ b/Documentation/gpu/todo.rst
@@ -477,7 +477,6 @@ transparently, and the are deprecated.
 The funcions to remove are:
  - drm_panel_bridge_add_typed()
  - devm_drm_of_get_bridge()
- - drmm_of_get_bridge()
  - drm_panel_bridge_remove()
  - drmm_drm_panel_bridge_release()
  - devm_drm_panel_bridge_release()

-- 
2.56.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/3] drm: remove drmm_of_get_bridge()
  2026-11-06 16:17 [PATCH 0/3] drm: remove drmm_of_get_bridge() Luca Ceresoli
                   ` (2 preceding siblings ...)
  2026-11-06 16:17 ` [PATCH 3/3] drm/todo: " Luca Ceresoli
@ 2026-11-08 17:26 ` Joshua Peisach
  3 siblings, 0 replies; 5+ messages in thread
From: Joshua Peisach @ 2026-11-08 17:26 UTC (permalink / raw)
  To: Luca Ceresoli, Sasha Finkelstein, Janne Grunau,
	Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	David Airlie, Simona Vetter, Neil Armstrong, Jessica Zhang,
	Jonathan Corbet, Shuah Khan, Randy Dunlap, Dmitry Baryshkov
  Cc: Hui Pu, Ian Ray, Thomas Petazzoni, dri-devel, asahi,
	linux-kernel, linux-doc

On Fri Nov 6, 2026 at 11:17 AM EST, Luca Ceresoli wrote:
> drmm_of_get_bridge() is deprecated. By now it is just a complicated wrapper
> to of_drm_get_bridge_by_endpoint(), and it does not implement bridge
> refcounting. Replace the only user and remove it.
>
> == Grand plan
>
> This is part of the work to support hotplug of DRM bridges.
>
> 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 (v7.2)
>        7. ✔ of_drm_find_bridge
>           a. ✔ add of_drm_get_bridge() (v7.0),
>                convert basic direct users (v7.0-v7.1)
>           b. ✔ convert direct of_drm_get_bridge() users, part 2 (v7.0)
>           c. ✔ convert direct of_drm_get_bridge() users, part 3 (v7.0)
>           d. ✔ convert direct of_drm_get_bridge() users, part 4 (v7.1-v7.2)
>           e. ✔ bridge-only drm_of_find_panel_or_bridge() users (v7.2)
>        8. ➜ panel_bridge lifetime
>           a. ✔ cleanup DRM_PANEL in bridge drivers (v7.4)
> 	  b. ✔ embed a drm_bridge in every drm_panel (v7.4)
> 	  c. ✔ remove *_of_get_bridge(): non-OF drivers (v7.5)
> 	  d. ➜ remove drmm_of_get_bridge()
> 	  e.   remove devm_drm_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_bridge_enter/exit() to protect device resources (v7.0)
>     B. ✔ Add drm_bridge_clear_and_put() (v7.1)
>  3. ✕ DSI host-device driver interaction
>  4. ✔ removing the need for the "always-disconnected" connector
>  5. ✔ Migrate i.MX LCDIF driver to bridge-connector (v7.2)
>  6. … DRM bridge hotplug
>     A. … Bridge hotplug management in the DRM core
>        1. ✔ bridge-connector: attach encoder to the connector (v7.2)
>        2. … drm bridge hotplug
>     B.   Device tree description
>
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> ---
> Luca Ceresoli (3):
>       drm: adp: stop using deprecated drmm_of_get_bridge()
>       drm/panel: remove drmm_of_get_bridge()
>       drm/todo: remove drmm_of_get_bridge()
>
>  Documentation/gpu/todo.rst    |  1 -
>  drivers/gpu/drm/adp/adp_drv.c | 13 +++++++++----
>  drivers/gpu/drm/drm_panel.c   | 40 ----------------------------------------
>  include/drm/drm_panel.h       | 10 ----------
>  4 files changed, 9 insertions(+), 55 deletions(-)
> ---
> base-commit: 4524052b65a75166c1c557921c786bd82302de13
> change-id: 20261106-drm-panel_bridge-remove-drmm_of_get_bridge-791bd0f0ad97
>
> Best regards,
> --  
> Luca Ceresoli, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com

Looks good

Reviewed-by: Joshua Peisach <jpeisach@ubuntu.com>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-11-08 17:26 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-06 16:17 [PATCH 0/3] drm: remove drmm_of_get_bridge() Luca Ceresoli
2026-11-06 16:17 ` [PATCH 1/3] drm: adp: stop using deprecated drmm_of_get_bridge() Luca Ceresoli
2026-11-06 16:17 ` [PATCH 2/3] drm/panel: remove drmm_of_get_bridge() Luca Ceresoli
2026-11-06 16:17 ` [PATCH 3/3] drm/todo: " Luca Ceresoli
2026-11-08 17:26 ` [PATCH 0/3] drm: " Joshua Peisach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®