Am 17.09.21 um 20:09 schrieb Maxime Ripard: > By depending on devm_drm_panel_bridge_add(), devm_drm_of_get_bridge() > introduces a circular dependency between the modules drm (where > devm_drm_of_get_bridge() ends up) and drm_kms_helper (where > devm_drm_panel_bridge_add() is). > > Fix this by moving devm_drm_of_get_bridge() to bridge/panel.c and thus > drm_kms_helper. > > Fixes: 87ea95808d53 ("drm/bridge: Add a function to abstract away panels") > Reported-by: Stephen Rothwell > Signed-off-by: Maxime Ripard Acked-by: Thomas Zimmermann > > --- > > Hi Stephen, > > I think it fixes the issue, but couldn't reproduce it here with my > config for some reason. > > Let me know if it works for you. > > Maxime > --- > drivers/gpu/drm/bridge/panel.c | 36 ++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_bridge.c | 34 -------------------------------- > 2 files changed, 36 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c > index c916f4b8907e..285a079cdef5 100644 > --- a/drivers/gpu/drm/bridge/panel.c > +++ b/drivers/gpu/drm/bridge/panel.c > @@ -332,3 +332,39 @@ struct drm_connector *drm_panel_bridge_connector(struct drm_bridge *bridge) > return &panel_bridge->connector; > } > EXPORT_SYMBOL(drm_panel_bridge_connector); > + > +#ifdef CONFIG_OF > +/** > + * devm_drm_of_get_bridge - Return next bridge in the chain > + * @dev: 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 > + * > + * 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 pointer to the bridge if successful, or an error pointer > + * otherwise. > + */ > +struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, > + 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 = devm_drm_panel_bridge_add(dev, panel); > + > + return bridge; > +} > +EXPORT_SYMBOL(devm_drm_of_get_bridge); > +#endif > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c > index 4c68733fa660..7ee29f073857 100644 > --- a/drivers/gpu/drm/drm_bridge.c > +++ b/drivers/gpu/drm/drm_bridge.c > @@ -1232,40 +1232,6 @@ struct drm_bridge *of_drm_find_bridge(struct device_node *np) > return NULL; > } > EXPORT_SYMBOL(of_drm_find_bridge); > - > -/** > - * devm_drm_of_get_bridge - Return next bridge in the chain > - * @dev: 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 > - * > - * 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 pointer to the bridge if successful, or an error pointer > - * otherwise. > - */ > -struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, > - 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 = devm_drm_panel_bridge_add(dev, panel); > - > - return bridge; > -} > -EXPORT_SYMBOL(devm_drm_of_get_bridge); > #endif > > MODULE_AUTHOR("Ajay Kumar "); > -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Maxfeldstr. 5, 90409 Nürnberg, Germany (HRB 36809, AG Nürnberg) Geschäftsführer: Felix Imendörffer