From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 736CDC433EF for ; Mon, 20 Sep 2021 20:50:12 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8146E61100 for ; Mon, 20 Sep 2021 20:50:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 8146E61100 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sntech.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9DD946E856; Mon, 20 Sep 2021 20:50:09 +0000 (UTC) Received: from gloria.sntech.de (gloria.sntech.de [185.11.138.130]) by gabe.freedesktop.org (Postfix) with ESMTPS id 418536E856 for ; Mon, 20 Sep 2021 20:50:08 +0000 (UTC) Received: from ip5f5a6e92.dynamic.kabel-deutschland.de ([95.90.110.146] helo=diego.localnet) by gloria.sntech.de with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mSQEe-00073i-MT; Mon, 20 Sep 2021 22:49:56 +0200 From: Heiko =?ISO-8859-1?Q?St=FCbner?= To: Daniel Vetter , David Airlie , Maarten Lankhorst , Thomas Zimmermann , Maxime Ripard , dri-devel@lists.freedesktop.org Cc: dri-devel@lists.freedesktop.org, Stephen Rothwell , Maxime Ripard Subject: Re: [PATCH] drm/bridge: Move devm_drm_of_get_bridge to bridge/panel.c Date: Mon, 20 Sep 2021 22:49:55 +0200 Message-ID: <4266046.upgBnu7FSg@diego> In-Reply-To: <20210917180925.2602266-1-maxime@cerno.tech> References: <20210917180925.2602266-1-maxime@cerno.tech> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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). >=20 > Fix this by moving devm_drm_of_get_bridge() to bridge/panel.c and thus > drm_kms_helper. >=20 > 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 =2D e46ad85acd90 ("MAINTAINERS: add Andrey as the DRM GPU scheduler maintai= ner") with your patch on top, I end up with: make[1]: Verzeichnis =E2=80=9E/home/devel/hstuebner/02_drm/linux/_build-arm= 64=E2=80=9C 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 =2E./drivers/gpu/drm/bridge/panel.c: In function =E2=80=98devm_drm_of_get_b= ridge=E2=80=99: =2E./drivers/gpu/drm/bridge/panel.c:359:8: error: implicit declaration of f= unction =E2=80=98drm_of_find_panel_or_bridge=E2=80=99 [-Werror=3Dimplicit-f= unction-declaration] 359 | ret =3D 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 =2D-- 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(-) >=20 > diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/pane= l.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(str= uct 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 =3D drm_of_find_panel_or_bridge(np, port, endpoint, > + &panel, &bridge); > + if (ret) > + return ERR_PTR(ret); > + > + if (panel) > + bridge =3D 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 devic= e_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 =3D drm_of_find_panel_or_bridge(np, port, endpoint, > - &panel, &bridge); > - if (ret) > - return ERR_PTR(ret); > - > - if (panel) > - bridge =3D devm_drm_panel_bridge_add(dev, panel); > - > - return bridge; > -} > -EXPORT_SYMBOL(devm_drm_of_get_bridge); > #endif > =20 > MODULE_AUTHOR("Ajay Kumar "); >=20