Hi Maxime, Am Freitag, 17. September 2021, 20:09:25 CEST 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 <sfr@xxxxxxxxxxxxxxxx> > Signed-off-by: Maxime Ripard <maxime@xxxxxxxxxx> I started with drm-misc-next at - e46ad85acd90 ("MAINTAINERS: add Andrey as the DRM GPU scheduler maintainer") with your patch on top, I end up with: make[1]: Verzeichnis „/home/devel/hstuebner/02_drm/linux/_build-arm64“ wird betreten GEN Makefile CALL ../scripts/atomic/check-atomics.sh CALL ../scripts/checksyscalls.sh CC [M] drivers/gpu/drm/bridge/panel.o CC [M] drivers/gpu/drm/drm_bridge.o LD [M] drivers/gpu/drm/drm.o ../drivers/gpu/drm/bridge/panel.c: In function ‘devm_drm_of_get_bridge’: ../drivers/gpu/drm/bridge/panel.c:359:8: error: implicit declaration of function ‘drm_of_find_panel_or_bridge’ [-Werror=implicit-function-declaration] 359 | ret = drm_of_find_panel_or_bridge(np, port, endpoint, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ adding the following makes it compile again: diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c index 285a079cdef5..b32295abd9e7 100644 --- a/drivers/gpu/drm/bridge/panel.c +++ b/drivers/gpu/drm/bridge/panel.c @@ -9,6 +9,7 @@ #include <drm/drm_connector.h> #include <drm/drm_encoder.h> #include <drm/drm_modeset_helper_vtables.h> +#include <drm/drm_of.h> #include <drm/drm_panel.h> #include <drm/drm_print.h> #include <drm/drm_probe_helper.h> I obviously also ran into the circular dependency-issue right now, so with the above addition: Tested-by: Heiko Stuebner <heiko@xxxxxxxxx> Heiko > --- > 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 <ajaykumar.rs@xxxxxxxxxxx>"); >