linux-renesas-soc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/26] drm/bridge: add drm_of_find_bridge(), deprecate of_drm_find_bridge()
@ 2025-11-28 16:50 Luca Ceresoli
  2025-11-28 16:50 ` [PATCH v2 01/26] drm/bridge: add of_drm_get_bridge() Luca Ceresoli
                   ` (25 more replies)
  0 siblings, 26 replies; 29+ messages in thread
From: Luca Ceresoli @ 2025-11-28 16:50 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, Maarten Lankhorst, Maxime Ripard,
	Thomas Zimmermann, David Airlie, Simona Vetter, Jonathan Corbet,
	Alexey Brodkin, Phong LE, Liu Ying, Shawn Guo, Sascha Hauer,
	Pengutronix Kernel Team, Fabio Estevam, Adrien Grassein,
	Laurent Pinchart, Tomi Valkeinen, Kieran Bingham,
	Geert Uytterhoeven, Magnus Damm, Kevin Hilman, Jerome Brunet,
	Martin Blumenstingl, Chun-Kuang Hu, Philipp Zabel,
	Matthias Brugger, AngeloGioacchino Del Regno, Anitha Chrisanthus,
	Inki Dae, Seung-Woo Kim, Kyungmin Park, Krzysztof Kozlowski,
	Alim Akhtar
  Cc: Hui Pu, Thomas Petazzoni, Louis Chauvet, dri-devel, linux-kernel,
	linux-doc, imx, linux-arm-kernel, linux-renesas-soc,
	linux-amlogic, linux-mediatek, linux-samsung-soc, Luca Ceresoli

This series deprecated of_drm_find_bridge(), adds a replacement which
handles bridge refcounting, and converts most of the direct users.

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 most direct users
	  b. convert other direct users
	  c. 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
    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

Almost all the functions returning a struct drm_bridge pointer have been
modified to drm_bridge_get() the returned bridge, and their users updated
to drm_bridge_put() it. See items 1.E.{1-6} above.

of_drm_find_bridge() could be modified easily in the same way, but it has a
lot of (direct + indirect) callers, and most notably
drm_of_find_panel_or_bridge() which is very hard to adapt without reowrking
the panel_bridge lifetime.

This has been discussed in [1] and Maxime proposed an incremental approach:

> So maybe we can just create drm_of_find_bridge() that takes a reference,
> make of_drm_find_bridge() deprecated in favour of drm_of_find_bridge(),
> add a TODO, and call it a day. People will gradually switch to the new
> API over time.

That proposal is implemented by this series. Most of the direct callers are
also converted: they are all trivial conversions except for one, which is
handled by the last 3 patches.

Follow-up series will:
- convert remaining direct callers of of_drm_find_bridge()
- convert simple cases of drm_of_find_panel_or_bridge()

[1] https://lore.kernel.org/dri-devel/20250319-stylish-lime-mongoose-0a18ad@houat/

Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
Changes in v2:
- All patches: renamed drm_of_find_bridge() -> of_drm_get_bridge()
- Various fixes and improvements to patches 1-6, see individual patches
  changelog
- Removed bouncing recipient: Edmund Dea <edmund.j.dea@intel.com>
- Link to v1: https://lore.kernel.org/r/20251119-drm-bridge-alloc-getput-drm_of_find_bridge-v1-0-0db98a7fe474@bootlin.com

---
Luca Ceresoli (26):
      drm/bridge: add of_drm_get_bridge()
      drm/bridge: deprecate of_drm_find_bridge()
      drm/todo: add entry about converting to of_drm_get_bridge()
      drm/bridge: make of_drm_find_bridge() a wrapper of of_drm_get_bridge()
      drm/arcpgu: convert to of_drm_get_bridge()
      drm/bridge: add devm_of_drm_get_bridge
      drm/bridge: ite-it66121: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: imx8qxp-pixel-combiner: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: simple-bridge: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: tpd12s015: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: thc63lvd1024: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: imx8qxp-pxl2dpi: use devm_of_drm_get_bridge() to put the next and companion bridges
      drm/bridge: lt8912b: use devm_of_drm_get_bridge() to put the hdmi bridge
      drm/bridge: tfp410: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: imx8qxp-ldb: use devm_of_drm_get_bridge() to put the companion bridge
      drm/rcar-du: lvds: use devm_of_drm_get_bridge() to put the next bridge
      drm/meson: encoder_*: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: sii902x: use devm_of_drm_get_bridge() to put the next bridge
      drm/mediatek: use devm_of_drm_get_bridge() to put the next bridge
      drm/kmb: dsi: use devm_of_drm_get_bridge() to put the next bridge
      drm/imx/ipuv3: use devm_of_drm_get_bridge() to put the next bridge
      drm/exynos: hdmi: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: dw-hdmi: use devm_of_drm_get_bridge() to put the next bridge
      drm/bridge: imx8qxp-pixel-link: simplify logic to find next bridge
      drm/bridge: imx8qxp-pixel-link: simplify freeing of the remote device_node
      drm/bridge: imx8qxp-pixel-link: convert to of_drm_get_bridge()

 Documentation/gpu/todo.rst                         | 16 ++++
 drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c           |  2 +-
 .../gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c    |  2 +-
 drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c    | 37 +++++----
 drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c       |  4 +-
 drivers/gpu/drm/bridge/ite-it66121.c               |  2 +-
 drivers/gpu/drm/bridge/lontium-lt8912b.c           |  2 +-
 drivers/gpu/drm/bridge/sii902x.c                   |  2 +-
 drivers/gpu/drm/bridge/simple-bridge.c             |  2 +-
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c          |  2 +-
 drivers/gpu/drm/bridge/thc63lvd1024.c              |  2 +-
 drivers/gpu/drm/bridge/ti-tfp410.c                 |  2 +-
 drivers/gpu/drm/bridge/ti-tpd12s015.c              |  2 +-
 drivers/gpu/drm/drm_bridge.c                       | 91 ++++++++++++++++++----
 drivers/gpu/drm/exynos/exynos_hdmi.c               |  2 +-
 drivers/gpu/drm/imx/ipuv3/dw_hdmi-imx.c            |  2 +-
 drivers/gpu/drm/kmb/kmb_dsi.c                      |  2 +-
 drivers/gpu/drm/mediatek/mtk_hdmi.c                |  2 +-
 drivers/gpu/drm/meson/meson_encoder_cvbs.c         |  2 +-
 drivers/gpu/drm/meson/meson_encoder_dsi.c          |  2 +-
 drivers/gpu/drm/meson/meson_encoder_hdmi.c         |  2 +-
 drivers/gpu/drm/renesas/rcar-du/rcar_lvds.c        |  2 +-
 drivers/gpu/drm/tiny/arcpgu.c                      |  4 +-
 include/drm/drm_bridge.h                           | 10 +++
 24 files changed, 143 insertions(+), 55 deletions(-)
---
base-commit: e85e9ccf3f8404007f62dff9a02273fcdeb44206
change-id: 20251117-drm-bridge-alloc-getput-drm_of_find_bridge-74903367448d

Best regards,
-- 
Luca Ceresoli <luca.ceresoli@bootlin.com>


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

end of thread, other threads:[~2025-11-30 13:09 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-28 16:50 [PATCH v2 00/26] drm/bridge: add drm_of_find_bridge(), deprecate of_drm_find_bridge() Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 01/26] drm/bridge: add of_drm_get_bridge() Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 02/26] drm/bridge: deprecate of_drm_find_bridge() Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 03/26] drm/todo: add entry about converting to of_drm_get_bridge() Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 04/26] drm/bridge: make of_drm_find_bridge() a wrapper of of_drm_get_bridge() Luca Ceresoli
2025-11-28 21:50   ` Randy Dunlap
2025-11-28 16:50 ` [PATCH v2 05/26] drm/arcpgu: convert to of_drm_get_bridge() Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 06/26] drm/bridge: add devm_of_drm_get_bridge Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 07/26] drm/bridge: ite-it66121: use devm_of_drm_get_bridge() to put the next bridge Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 08/26] drm/bridge: imx8qxp-pixel-combiner: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 09/26] drm/bridge: simple-bridge: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 10/26] drm/bridge: tpd12s015: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 11/26] drm/bridge: thc63lvd1024: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 12/26] drm/bridge: imx8qxp-pxl2dpi: use devm_of_drm_get_bridge() to put the next and companion bridges Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 13/26] drm/bridge: lt8912b: use devm_of_drm_get_bridge() to put the hdmi bridge Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 14/26] drm/bridge: tfp410: use devm_of_drm_get_bridge() to put the next bridge Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 15/26] drm/bridge: imx8qxp-ldb: use devm_of_drm_get_bridge() to put the companion bridge Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 16/26] drm/rcar-du: lvds: use devm_of_drm_get_bridge() to put the next bridge Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 17/26] drm/meson: encoder_*: " Luca Ceresoli
2025-11-30 13:09   ` Martin Blumenstingl
2025-11-28 16:50 ` [PATCH v2 18/26] drm/bridge: sii902x: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 19/26] drm/mediatek: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 20/26] drm/kmb: dsi: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 21/26] drm/imx/ipuv3: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 22/26] drm/exynos: hdmi: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 23/26] drm/bridge: dw-hdmi: " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 24/26] drm/bridge: imx8qxp-pixel-link: simplify logic to find " Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 25/26] drm/bridge: imx8qxp-pixel-link: simplify freeing of the remote device_node Luca Ceresoli
2025-11-28 16:50 ` [PATCH v2 26/26] drm/bridge: imx8qxp-pixel-link: convert to of_drm_get_bridge() Luca Ceresoli

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).