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@canb.auug.org.au Signed-off-by: Maxime Ripard maxime@cerno.tech
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@sntech.de
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@samsung.com");