Re: [PATCH] drm/bridge: Move devm_drm_of_get_bridge to bridge/panel.c
On Mon, Sep 20, 2021 at 10:49:55PM +0200, Heiko Stübner wrote: > 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 > > Signed-off-by: Maxime Ripard > > 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 > #include > #include > +#include > #include > #include > #include > > > I obviously also ran into the circular dependency-issue right now, > so with the above addition: > > Tested-by: Heiko Stuebner I'm not sure how I missed that, thanks for testing :) I've just pushed the patch with your fix to drm-misc-fixes Maxime signature.asc Description: PGP signature
Re: [PATCH] drm/bridge: Move devm_drm_of_get_bridge to bridge/panel.c
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 > Signed-off-by: Maxime Ripard 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 #include #include +#include #include #include #include I obviously also ran into the circular dependency-issue right now, so with the above addition: Tested-by: Heiko Stuebner 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 _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, > + , ); > + 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, > - , ); > - if (ret) > -
Re: [PATCH] drm/bridge: Move devm_drm_of_get_bridge to bridge/panel.c
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 _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, + , ); + 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, - , ); - 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 OpenPGP_signature Description: OpenPGP digital signature
[PATCH] drm/bridge: Move devm_drm_of_get_bridge to bridge/panel.c
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 --- 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 _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, + , ); + 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, - , ); - 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 "); -- 2.31.1