[PATCH 00/11] drm/panel: add a panel_bridge to every panel

Luca Ceresoli <[email protected]>
Newsgroups gmane.linux.kernel,gmane.comp.video.dri.devel
Message-ID <[email protected]>
This series makes every drm_panel create a drm_panel_bridge wrapping it, as
previously discussed [1][2].

A panel_bridge is currently created only afterwards by the component
accessing it (such as the previous bridge), but that creates a mismatch
between the panel and the panel_bridge lifetimes and devm ownership.

== Series outline

 1. The most common pattern for panel_bridge creation is:

      | drm_of_find_panel_or_bridge(..., &panel, &bridge);
      | if (panel)
      |     bridge = drm_panel_bridge_add();

    Adapt drm_of_find_panel_or_bridge() so it prioritizes the bridge, not
    the panel. With this small change all drivers using the above pattern
    get ready in advance for when every panel will have a bridge
    (a few commits below).

      drm: of: drm_of_find_panel_or_bridge: simplify freeing the remote node pointer
      drm: of: drm_of_find_panel_or_bridge: simplify error return paths
      drm: of: drm_of_find_panel_or_bridge: prioritize the bridge, not the panel

 2. Address circular module dependency that would arise in the following
    commit [RFC!]
 
      drm/panel: merge the drm_kms_helper module into the drm module

 3. The main commit

      drm/bridge: panel: add a panel_bridge to every panel

 4. After the previous commit, many drivers not using the pattern in (1.)
    will unconditionally create a second panel_bridge for the same panel.
    Being an RFC, fix *some* of them as an example; if the approach will
    be acked, all of them will be converted in a later iteration.
    
      drm/bridge: tc358767: don't create a panel_bridge
      drm/bridge: waveshare-dsi: don't create a panel_bridge
      drm/mcde: dsi: simplify device_node management using scoped for_each variant
      drm/mcde: dsi: don't create a panel_bridge
      drm/bridge: fsl-ldb: don't create a panel_bridge
      drm/bridge: samsung-dsim: don't create a panel_bridge

== Grand plan

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 (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
	  b. ➜ add a panel_bridge to every panel
       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

[0] https://lore.kernel.org/lkml/[email protected]/#t

[1] https://lore.kernel.org/all/emuj2innmp6zmzd7pyakqzjqpdzhly6qfhakya3ydwmd63pl26@5jwxaidpikjw/
[2] https://lore.kernel.org/lkml/[email protected]/

Signed-off-by: Luca Ceresoli <[email protected]>
---
Luca Ceresoli (11):
      drm: of: drm_of_find_panel_or_bridge: simplify freeing the remote node pointer
      drm: of: drm_of_find_panel_or_bridge: simplify error return paths
      drm: of: drm_of_find_panel_or_bridge: prioritize the bridge, not the panel
      drm/panel: merge the drm_kms_helper module into the drm module
      drm/bridge: panel: add a panel_bridge to every panel
      drm/bridge: tc358767: don't create a panel_bridge
      drm/bridge: waveshare-dsi: don't create a panel_bridge
      drm/mcde: dsi: simplify device_node management using scoped for_each variant
      drm/mcde: dsi: don't create a panel_bridge
      drm/bridge: fsl-ldb: don't create a panel_bridge
      drm/bridge: samsung-dsim: don't create a panel_bridge

 drivers/gpu/drm/Makefile               |  7 +++--
 drivers/gpu/drm/bridge/fsl-ldb.c       | 18 ++++---------
 drivers/gpu/drm/bridge/panel.c         | 47 +++++++++++++++++-----------------
 drivers/gpu/drm/bridge/samsung-dsim.c  | 19 +++-----------
 drivers/gpu/drm/bridge/tc358767.c      | 22 +++++-----------
 drivers/gpu/drm/bridge/waveshare-dsi.c | 16 ++++--------
 drivers/gpu/drm/drm_of.c               | 36 ++++++++++++--------------
 drivers/gpu/drm/drm_panel.c            |  3 +++
 drivers/gpu/drm/mcde/mcde_dsi.c        | 47 ++++++++--------------------------
 include/drm/drm_panel.h                |  8 ++++++
 10 files changed, 83 insertions(+), 140 deletions(-)
---
base-commit: c0f5782834718a69465a7169112062d4412856e4
change-id: 20260812-drm-bridge-every-panel-a1596d6efea4

Best regards,
--  
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.