From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C09B415F06 for ; Thu, 3 Sep 2026 08:11:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423109; cv=none; b=UlJXQBh0Hp3LwWFokzAIUh/xk7IQAKVlpPTItYnht+IF2OUWU39h/87vR7BLRliCAoxjwNxpfcEg1fbkrvxVgeJOlW7hpZCMMIOVdXASVk0P9CZhIp6nk3CdlkX+LX9947q8KyQpNNQaJH21gvZRz2dKGT41uHWeq7eddn+2UDg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423109; c=relaxed/simple; bh=ykgHUGUzN8UjzUKiuL/28UmAzhU1ozIUeTJD2vthkUU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EIAGVGEqTAO7xpy3otVpO3FrB3AG73L/8vJ0dUhHBanFTOIqZQrTB9y5LFxfwLQLbvUd7jcqRllfUrljr2PXGudcSU97HqpuAb00ExnQRnvpXWEvHQiKz+T0iL3qGBvWuStIYsDR8buSAwme0SDetSaRwA58npIkThj3bGb/aJQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=BJlLrS9Y; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="BJlLrS9Y" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 1FD231A1985; Thu, 3 Sep 2026 08:11:44 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E6CD5602B8; Thu, 3 Sep 2026 08:11:43 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 3CE0211C791C9; Thu, 3 Sep 2026 10:11:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423098; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=05b7F7Hrky5smdfqg7ON/5g4roZyfLJRD1uAubvwvFU=; b=BJlLrS9Y0b0D8X08SmF5OOd7NP0AX3nMr348qxVtJmSdgn+uEyAd8VAcTSfIlrjQ7Z8k0L aO1DjCPkJlyQn+vz2rxNZ1G/CpR8pwDYnx49TypXSfpoxRIe2eLpDGEgTobXZZYMHhdqux 9BW4Vw260E0fkPrvB2nR3/0aYkrD+cSZGWSeggbkjkO94NQndlZBL+J0SsvJXUppatc+Z5 72+yzRMYBKFdZmNzVjcHDOtzx5pfoP7j131VVcfOEcqo38QDPQtEx4l2HTlam+CZ87cyn5 EmkpsSQuHbxHBtLxyKNbb1QEFXLWuX8KKYpZczHyLEAW0D3JAlhRgtLQ9PEdcQ== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:04 +0200 Subject: [PATCH RFC v2 01/19] drm: of: move drm_of_find_panel_or_bridge() from drm_of.c to bridge/panel.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-1-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 We want to move drm_panel.o from the main drm module to a new drm_panel module, but there is one function in the drm module that calls into drm_panel.c code: drm_of_find_panel_or_bridge() (in drm_of.c, drm module) -> calls of_drm_find_panel (in drm_panel.c, would-be the new drm_panel= module) Avoid this issue by moving drm_of_find_panel_or_bridge() to bridge/panel.c (which is currently in the drm_kms_helper module). As a result drm_kms_helper will depend on the new drm_panel module, which is fine because there is no dependency of drm_panel on drm_kms_helper. After this change, all drivers using drm_of_find_panel_or_bridge() will have to select DRM_PANEL_BRIDGE (and DRM_PANEL, recursively). Add that for affected drivers. While there, also add DRM_PANEL on drivers selecting DRM_PANEL_BRIDGE. No functional changes, just moving code around. [AI used to add 'select DRM_PANEL[_BRIDGE]' for affected drivers] Assisted-by: opencode:deepseek-v4-flash-0731 Signed-off-by: Luca Ceresoli --- drivers/gpu/drm/bridge/Kconfig | 2 ++ drivers/gpu/drm/bridge/analogix/Kconfig | 4 +++ drivers/gpu/drm/bridge/panel.c | 63 +++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/drm_of.c | 63 -----------------------------= ---- drivers/gpu/drm/fsl-dcu/Kconfig | 1 + drivers/gpu/drm/imx/dcss/Kconfig | 2 ++ drivers/gpu/drm/ingenic/Kconfig | 1 + drivers/gpu/drm/logicvc/Kconfig | 2 ++ drivers/gpu/drm/mcde/Kconfig | 1 + drivers/gpu/drm/pl111/Kconfig | 1 + drivers/gpu/drm/renesas/rcar-du/Kconfig | 1 + drivers/gpu/drm/rockchip/Kconfig | 4 +++ drivers/gpu/drm/stm/Kconfig | 1 + drivers/gpu/drm/sun4i/Kconfig | 1 + drivers/gpu/drm/tegra/Kconfig | 1 + drivers/gpu/drm/tidss/Kconfig | 2 ++ drivers/gpu/drm/tve200/Kconfig | 1 + include/drm/drm_bridge.h | 12 +++++++ include/drm/drm_of.h | 12 ------- 19 files changed, 100 insertions(+), 75 deletions(-) diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index f2db7f60d40f..89e87460aefc 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -151,6 +151,7 @@ config DRM_LONTIUM_LT8912B config DRM_LONTIUM_LT9211 tristate "Lontium LT9211 DSI/LVDS/DPI bridge" depends on OF + select DRM_PANEL select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select DRM_MIPI_DSI @@ -498,6 +499,7 @@ config DRM_WAVESHARE_BRIDGE tristate "Waveshare DSI bridge" depends on OF depends on BACKLIGHT_CLASS_DEVICE + select DRM_PANEL select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select DRM_MIPI_DSI diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/brid= ge/analogix/Kconfig index 57bb2daa5aaf..d07431788fcb 100644 --- a/drivers/gpu/drm/bridge/analogix/Kconfig +++ b/drivers/gpu/drm/bridge/analogix/Kconfig @@ -6,6 +6,8 @@ config DRM_ANALOGIX_ANX6345 select DRM_DISPLAY_DP_HELPER select DRM_DISPLAY_HELPER select DRM_KMS_HELPER + select DRM_PANEL + select DRM_PANEL_BRIDGE select REGMAP_I2C help ANX6345 is an ultra-low power Full-HD DisplayPort/eDP @@ -32,6 +34,8 @@ config DRM_ANALOGIX_DP depends on DRM depends on OF select DRM_DISPLAY_DP_AUX_BUS + select DRM_PANEL + select DRM_PANEL_BRIDGE =20 config DRM_ANALOGIX_ANX7625 tristate "Analogix Anx7625 MIPI to DP interface support" diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c index 02388a3de626..83be09641582 100644 --- a/drivers/gpu/drm/bridge/panel.c +++ b/drivers/gpu/drm/bridge/panel.c @@ -560,4 +560,67 @@ struct drm_bridge *drmm_of_get_bridge(struct drm_devic= e *drm, } EXPORT_SYMBOL(drmm_of_get_bridge); =20 +/** + * drm_of_find_panel_or_bridge - return connected panel or bridge device + * @np: device tree node containing encoder output ports + * @port: port in the device tree node + * @endpoint: endpoint in the device tree node + * @panel: pointer to hold returned drm_panel, must not be NULL. On success + * the caller must call drm_panel_put() when done with the panel + * @bridge: pointer to hold returned drm_bridge + * + * Given a DT node's port and endpoint number, find the connected node and + * return either the associated struct drm_panel or drm_bridge device. + * + * This function is deprecated and should not be used in new drivers. Use + * of_drm_get_bridge_by_endpoint() instead when not looking for a panel, or + * devm_drm_of_get_bridge() otherwise. + * + * Returns zero if successful, or one of the standard error codes if it fa= ils. + */ +int drm_of_find_panel_or_bridge(const struct device_node *np, + int port, int endpoint, + struct drm_panel **panel, + struct drm_bridge **bridge) +{ + if (WARN_ON(!panel)) + return -EINVAL; + + *panel =3D NULL; + if (bridge) + *bridge =3D NULL; + + /* + * of_graph_get_remote_node() produces a noisy error message if port + * node isn't found and the absence of the port is a legit case here, + * so at first we silently check whether a graph is present in the + * device-tree node. + */ + if (!of_graph_is_present(np)) + return -ENODEV; + + struct device_node *remote __free(device_node) =3D + of_graph_get_remote_node(np, port, endpoint); + if (!remote) + return -ENODEV; + + *panel =3D of_drm_find_panel(remote); + if (!IS_ERR(*panel)) + return 0; + + *panel =3D NULL; + + if (bridge) { + /* No panel found yet, check for a bridge next. */ + *bridge =3D of_drm_find_bridge(remote); + if (*bridge) + return 0; + + *bridge =3D NULL; + } + + return -EPROBE_DEFER; +} +EXPORT_SYMBOL_GPL(drm_of_find_panel_or_bridge); + #endif diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c index 2b53124ded68..411f258d9f91 100644 --- a/drivers/gpu/drm/drm_of.c +++ b/drivers/gpu/drm/drm_of.c @@ -264,69 +264,6 @@ int drm_of_get_panel_orientation(const struct device_n= ode *np, } EXPORT_SYMBOL_GPL(drm_of_get_panel_orientation); =20 -/** - * drm_of_find_panel_or_bridge - return connected panel or bridge device - * @np: device tree node containing encoder output ports - * @port: port in the device tree node - * @endpoint: endpoint in the device tree node - * @panel: pointer to hold returned drm_panel, must not be NULL. On success - * the caller must call drm_panel_put() when done with the panel - * @bridge: pointer to hold returned drm_bridge - * - * Given a DT node's port and endpoint number, find the connected node and - * return either the associated struct drm_panel or drm_bridge device. - * - * This function is deprecated and should not be used in new drivers. Use - * of_drm_get_bridge_by_endpoint() instead when not looking for a panel, or - * devm_drm_of_get_bridge() otherwise. - * - * Returns zero if successful, or one of the standard error codes if it fa= ils. - */ -int drm_of_find_panel_or_bridge(const struct device_node *np, - int port, int endpoint, - struct drm_panel **panel, - struct drm_bridge **bridge) -{ - if (WARN_ON(!panel)) - return -EINVAL; - - *panel =3D NULL; - if (bridge) - *bridge =3D NULL; - - /* - * of_graph_get_remote_node() produces a noisy error message if port - * node isn't found and the absence of the port is a legit case here, - * so at first we silently check whether a graph is present in the - * device-tree node. - */ - if (!of_graph_is_present(np)) - return -ENODEV; - - struct device_node *remote __free(device_node) =3D - of_graph_get_remote_node(np, port, endpoint); - if (!remote) - return -ENODEV; - - *panel =3D of_drm_find_panel(remote); - if (!IS_ERR(*panel)) - return 0; - - *panel =3D NULL; - - if (bridge) { - /* No panel found yet, check for a bridge next. */ - *bridge =3D of_drm_find_bridge(remote); - if (*bridge) - return 0; - - *bridge =3D NULL; - } - - return -EPROBE_DEFER; -} -EXPORT_SYMBOL_GPL(drm_of_find_panel_or_bridge); - enum drm_of_lvds_pixels { DRM_OF_LVDS_EVEN =3D BIT(0), DRM_OF_LVDS_ODD =3D BIT(1), diff --git a/drivers/gpu/drm/fsl-dcu/Kconfig b/drivers/gpu/drm/fsl-dcu/Kcon= fig index 0e0f910ceb9f..7f0e851e8508 100644 --- a/drivers/gpu/drm/fsl-dcu/Kconfig +++ b/drivers/gpu/drm/fsl-dcu/Kconfig @@ -7,6 +7,7 @@ config DRM_FSL_DCU select DRM_GEM_DMA_HELPER select DRM_KMS_HELPER select DRM_PANEL + select DRM_PANEL_BRIDGE select REGMAP_MMIO select VIDEOMODE_HELPERS select MFD_SYSCON if SOC_LS1021A diff --git a/drivers/gpu/drm/imx/dcss/Kconfig b/drivers/gpu/drm/imx/dcss/Kc= onfig index e014ed3ae66c..aa2a20ef5910 100644 --- a/drivers/gpu/drm/imx/dcss/Kconfig +++ b/drivers/gpu/drm/imx/dcss/Kconfig @@ -6,6 +6,8 @@ config DRM_IMX_DCSS select DRM_DISPLAY_HELPER select DRM_BRIDGE_CONNECTOR select DRM_GEM_DMA_HELPER + select DRM_PANEL + select DRM_PANEL_BRIDGE select VIDEOMODE_HELPERS depends on DRM && ((ARCH_MXC && ARM64) || COMPILE_TEST) help diff --git a/drivers/gpu/drm/ingenic/Kconfig b/drivers/gpu/drm/ingenic/Kcon= fig index 04ecfb0c5dd6..987ed42f6f7a 100644 --- a/drivers/gpu/drm/ingenic/Kconfig +++ b/drivers/gpu/drm/ingenic/Kconfig @@ -7,6 +7,7 @@ config DRM_INGENIC depends on COMMON_CLK select DRM_BRIDGE select DRM_CLIENT_SELECTION + select DRM_PANEL select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select DRM_DISPLAY_HELPER diff --git a/drivers/gpu/drm/logicvc/Kconfig b/drivers/gpu/drm/logicvc/Kcon= fig index 579a358ed5cf..7d2c0a460eec 100644 --- a/drivers/gpu/drm/logicvc/Kconfig +++ b/drivers/gpu/drm/logicvc/Kconfig @@ -6,6 +6,8 @@ config DRM_LOGICVC select DRM_KMS_HELPER select DRM_KMS_DMA_HELPER select DRM_GEM_DMA_HELPER + select DRM_PANEL + select DRM_PANEL_BRIDGE select REGMAP select REGMAP_MMIO help diff --git a/drivers/gpu/drm/mcde/Kconfig b/drivers/gpu/drm/mcde/Kconfig index 3516c8d2a5d9..6ebfb930cbfa 100644 --- a/drivers/gpu/drm/mcde/Kconfig +++ b/drivers/gpu/drm/mcde/Kconfig @@ -9,6 +9,7 @@ config DRM_MCDE select DRM_CLIENT_SELECTION select DRM_MIPI_DSI select DRM_BRIDGE + select DRM_PANEL select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select DRM_GEM_DMA_HELPER diff --git a/drivers/gpu/drm/pl111/Kconfig b/drivers/gpu/drm/pl111/Kconfig index 82e918820950..20201ec20aa7 100644 --- a/drivers/gpu/drm/pl111/Kconfig +++ b/drivers/gpu/drm/pl111/Kconfig @@ -9,6 +9,7 @@ config DRM_PL111 select DRM_KMS_HELPER select DRM_GEM_DMA_HELPER select DRM_BRIDGE + select DRM_PANEL select DRM_PANEL_BRIDGE help Choose this option for DRM support for the PL111 CLCD controller. diff --git a/drivers/gpu/drm/renesas/rcar-du/Kconfig b/drivers/gpu/drm/rene= sas/rcar-du/Kconfig index 840305fdeb49..051b0967008c 100644 --- a/drivers/gpu/drm/renesas/rcar-du/Kconfig +++ b/drivers/gpu/drm/renesas/rcar-du/Kconfig @@ -47,6 +47,7 @@ config DRM_RCAR_LVDS depends on PM select DRM_KMS_HELPER select DRM_PANEL + select DRM_PANEL_BRIDGE select RESET_CONTROLLER =20 config DRM_RCAR_USE_MIPI_DSI diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kc= onfig index e7f49fe845ea..0b20f472dbd1 100644 --- a/drivers/gpu/drm/rockchip/Kconfig +++ b/drivers/gpu/drm/rockchip/Kconfig @@ -124,6 +124,8 @@ config ROCKCHIP_LVDS depends on PINCTRL && OF select DRM_DISPLAY_HELPER select DRM_BRIDGE_CONNECTOR + select DRM_PANEL + select DRM_PANEL_BRIDGE help Choose this option to enable support for Rockchip LVDS controllers. Rockchip rk3288 SoC has LVDS TX Controller can be used, and it @@ -136,6 +138,8 @@ config ROCKCHIP_RGB depends on PINCTRL select DRM_DISPLAY_HELPER select DRM_BRIDGE_CONNECTOR + select DRM_PANEL + select DRM_PANEL_BRIDGE help Choose this option to enable support for Rockchip RGB output. Some Rockchip CRTCs, like rv1108, can directly output parallel diff --git a/drivers/gpu/drm/stm/Kconfig b/drivers/gpu/drm/stm/Kconfig index 635be0ac00af..1e3205aa2c7e 100644 --- a/drivers/gpu/drm/stm/Kconfig +++ b/drivers/gpu/drm/stm/Kconfig @@ -6,6 +6,7 @@ config DRM_STM select DRM_CLIENT_SELECTION select DRM_KMS_HELPER select DRM_GEM_DMA_HELPER + select DRM_PANEL select DRM_PANEL_BRIDGE select VIDEOMODE_HELPERS select FB_PROVIDE_GET_FB_UNMAPPED_AREA if FB diff --git a/drivers/gpu/drm/sun4i/Kconfig b/drivers/gpu/drm/sun4i/Kconfig index b56ba00aabca..32c30e08cf5c 100644 --- a/drivers/gpu/drm/sun4i/Kconfig +++ b/drivers/gpu/drm/sun4i/Kconfig @@ -7,6 +7,7 @@ config DRM_SUN4I select DRM_GEM_DMA_HELPER select DRM_KMS_HELPER select DRM_PANEL + select DRM_PANEL_BRIDGE select REGMAP_MMIO select VIDEOMODE_HELPERS help diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig index 8a3b16aac5d6..fdcb10a4c7b5 100644 --- a/drivers/gpu/drm/tegra/Kconfig +++ b/drivers/gpu/drm/tegra/Kconfig @@ -14,6 +14,7 @@ config DRM_TEGRA select DRM_KMS_HELPER select DRM_MIPI_DSI select DRM_PANEL + select DRM_PANEL_BRIDGE select FB_DMAMEM_HELPERS if DRM_FBDEV_EMULATION select TEGRA_HOST1X select INTERCONNECT diff --git a/drivers/gpu/drm/tidss/Kconfig b/drivers/gpu/drm/tidss/Kconfig index 31ad582b7602..863930ecda1e 100644 --- a/drivers/gpu/drm/tidss/Kconfig +++ b/drivers/gpu/drm/tidss/Kconfig @@ -7,6 +7,8 @@ config DRM_TIDSS select DRM_DISPLAY_HELPER select DRM_BRIDGE_CONNECTOR select DRM_GEM_DMA_HELPER + select DRM_PANEL + select DRM_PANEL_BRIDGE help The TI Keystone family SoCs introduced a new generation of Display SubSystem. There is currently three Keystone family diff --git a/drivers/gpu/drm/tve200/Kconfig b/drivers/gpu/drm/tve200/Kconfig index a9d6fe535d88..c0746ae8f703 100644 --- a/drivers/gpu/drm/tve200/Kconfig +++ b/drivers/gpu/drm/tve200/Kconfig @@ -7,6 +7,7 @@ config DRM_TVE200 depends on OF select DRM_BRIDGE select DRM_CLIENT_SELECTION + select DRM_PANEL select DRM_PANEL_BRIDGE select DRM_KMS_HELPER select DRM_GEM_DMA_HELPER diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 58fff047f43b..c5b82e6946f5 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1507,6 +1507,10 @@ struct drm_bridge *devm_drm_of_get_bridge(struct dev= ice *dev, struct device_node u32 port, u32 endpoint); struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm, struct devic= e_node *node, u32 port, u32 endpoint); +int drm_of_find_panel_or_bridge(const struct device_node *np, + int port, int endpoint, + struct drm_panel **panel, + struct drm_bridge **bridge); #else static inline struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, struct device_node *node, @@ -1523,6 +1527,14 @@ static inline struct drm_bridge *drmm_of_get_bridge(= struct drm_device *drm, { return ERR_PTR(-ENODEV); } + +static inline int drm_of_find_panel_or_bridge(const struct device_node *np, + int port, int endpoint, + struct drm_panel **panel, + struct drm_bridge **bridge) +{ + return -EINVAL; +} #endif =20 void devm_drm_put_bridge(struct device *dev, struct drm_bridge *bridge); diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h index ebebed14c611..402f5db11e47 100644 --- a/include/drm/drm_of.h +++ b/include/drm/drm_of.h @@ -51,10 +51,6 @@ int drm_of_encoder_active_endpoint(struct device_node *n= ode, struct of_endpoint *endpoint); int drm_of_get_panel_orientation(const struct device_node *np, enum drm_panel_orientation *orientation); -int drm_of_find_panel_or_bridge(const struct device_node *np, - int port, int endpoint, - struct drm_panel **panel, - struct drm_bridge **bridge); int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, const struct device_node *port2); int drm_of_lvds_get_dual_link_pixel_order_sink(struct device_node *port1, @@ -112,14 +108,6 @@ static inline int drm_of_get_panel_orientation(const s= truct device_node *np, return -EINVAL; } =20 -static inline int drm_of_find_panel_or_bridge(const struct device_node *np, - int port, int endpoint, - struct drm_panel **panel, - struct drm_bridge **bridge) -{ - return -EINVAL; -} - static inline int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, const struct device_node *port2) --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7DB0E41A919 for ; Thu, 3 Sep 2026 08:11:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423115; cv=none; b=G4Olf86NLjBZykPac8G2y2kK5BAtszu4x3/ATbhebmD7vRKZBtYfwX/soNqkU2m3lyOEBFayihpvVhhrNZrQKKeAE0dZ/blXAhOA5i8IapdKZwECUJb+lWichNgm6TecAtTsrALxMeS57psaVN2fUbDzkYFx4vXWl4/6smCwgwA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423115; c=relaxed/simple; bh=mCdoJ+gXRoWub4ocfEOMUmij2bzfKaQvP6Y8JOXFbfQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LsYd4ve+1VyTO3q06pz9+ZuZ00U5VFPkpVociLGQOKEfY8uB9dmzZMbkQ13uftH3oHSEVHDIQl5nNWZmZWIQ0ME/9RaRwmQPcCWL8ksM/igcy66+rQ2yVAtwH2uUivHzAMWaU/FGyk91cbiUf78hRlgJtbfXHwhbPeH9OwK4aVM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Kv5ck8ug; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Kv5ck8ug" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id BD2E51A1987; Thu, 3 Sep 2026 08:11:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 880FD602B8; Thu, 3 Sep 2026 08:11:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 1AED611C79F4D; Thu, 3 Sep 2026 10:11:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423106; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=9WQOccbPaT9UPCqLuBrVXtuan/Bg0V6ruJZaFOpIPn4=; b=Kv5ck8ug0QwFbHH4HaQ9Ei0/+5XB/kC56I+vVB6DBFSlTkYdCVrfmE5vkyJEr6rhjsAIW/ MymigWh6ke5KnofiSc3Gy0M8XsMHQr1+Wma7xSZFOi47D1eWiYLnGCQIiZ8cxP9l0DFmR7 2v4ukdYujoo+0GnGLVp46TV+543k6xvuKxMTtreZPsoCMETuLpi4M2JqWefD16w59p3zXQ VqctvQscWJ4nal1GLas2ERWGj0wfJeo2O/4U4Fbo0x6fJakGN2gxIOdiv1ZqM8xmIJ4Hti sjAr1Npv+7/VzAFZ0ave4iPrtkzhkT+I8oUJ+9300ZI7SCRynn0SlrzcNDXqxw== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:05 +0200 Subject: [PATCH RFC v2 02/19] drm/bridge: panel: move to a new module Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-2-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 Work is in progress for every drm_panel to embed a drm_bridge, which will make the drm_panel code (currently in the drm module) depend on the drm_kms_helper module. However that would create a dependency loop: * the panel_bridge code in bridge/panel.c [drm_kms_helper module] already depends on the drm_panel.c code (it manipulates a drm_panel) * additionally, the drm_panel.c code, in order to create a drm_bridge, will depend on the helpers in drm_atomic_helper and drm_probe_helper code [drm_kms_helper module] Prevent the loop by moving the panel bridge out to its own module. Signed-off-by: Luca Ceresoli --- drivers/gpu/drm/Makefile | 3 ++- drivers/gpu/drm/bridge/Kconfig | 2 +- drivers/gpu/drm/bridge/panel.c | 3 +++ include/drm/drm_bridge.h | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index e635fcffd379..c4509e7fd248 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -156,10 +156,11 @@ drm_kms_helper-y :=3D \ drm_self_refresh_helper.o \ drm_simple_kms_helper.o \ drm_vblank_helper.o -drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) +=3D bridge/panel.o drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) +=3D drm_fb_helper.o obj-$(CONFIG_DRM_KMS_HELPER) +=3D drm_kms_helper.o =20 +obj-$(CONFIG_DRM_PANEL_BRIDGE) +=3D bridge/panel.o + # # Drivers and the rest # diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index 89e87460aefc..0a1689f8209d 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -6,7 +6,7 @@ config DRM_BRIDGE Bridge registration and lookup framework. =20 config DRM_PANEL_BRIDGE - def_bool y + def_tristate y depends on DRM_BRIDGE select DRM_PANEL help diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c index 83be09641582..40e3970e8b76 100644 --- a/drivers/gpu/drm/bridge/panel.c +++ b/drivers/gpu/drm/bridge/panel.c @@ -624,3 +624,6 @@ int drm_of_find_panel_or_bridge(const struct device_nod= e *np, EXPORT_SYMBOL_GPL(drm_of_find_panel_or_bridge); =20 #endif + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Panel bridge helper"); diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index c5b82e6946f5..9f2294957669 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1473,7 +1473,7 @@ void drm_bridge_hpd_disable(struct drm_bridge *bridge= ); void drm_bridge_hpd_notify(struct drm_bridge *bridge, enum drm_connector_status status); =20 -#ifdef CONFIG_DRM_PANEL_BRIDGE +#if IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE) bool drm_bridge_is_panel(const struct drm_bridge *bridge); struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel); struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel, @@ -1502,7 +1502,7 @@ static inline int drm_panel_bridge_set_orientation(st= ruct drm_connector *connect } #endif =20 -#if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL_BRIDGE) +#if defined(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE) struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, struct devic= e_node *node, u32 port, u32 endpoint); struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm, struct devic= e_node *node, --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2ACDC4279F9 for ; Thu, 3 Sep 2026 08:12:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423126; cv=none; b=UU0njlsuRmfcSOo+zKqw8tUlQO5x/9tBA8LVpXD0i2ny21XZaN2OlFE/gT9bLxCWK7aLS/YIxFCepTi/lqos3tXwgSKK6vUE2bQuqBCpWEswfIfL5xMgWWcXXcbnQlBkQrKdmCf15k4RA/tYYLDXbG6/r7LW9zhfnY1yLD7cQ9M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423126; c=relaxed/simple; bh=nULUGA3n2BmBShdjsrB4wzJd34gxRhOiUYqbAmjy7Qg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jqK8EqSxQzclAqMH6zLK7iEAZ+AKBaNkj6IQ4E16XBr/WkwbmCV8RqhbubkIoR0Jr9SidKcdK+6monchl1yzzQK9zp2rM24kLGsxHIqjgu5yPRypYmbgO1BvfRRkEUgD+ySBn+LtlVnk5jl18+GH7BvsKCp7mGI94r69k0aYINs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=fXn6Z+tM; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="fXn6Z+tM" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 79D571A1987; Thu, 3 Sep 2026 08:11:59 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4B7E9602B8; Thu, 3 Sep 2026 08:11:59 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9A9EB11C79FA7; Thu, 3 Sep 2026 10:11:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423114; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Ac6U1uxwnHyqeacioJQ51BQAAM/qss/MivOMoo/pCxg=; b=fXn6Z+tMM6gsvXei6kOvXN66XIeWZZvoQbXMrd/EKBqeFsiXIUNvYpiOgwVPQRH+cEovmL wc9lfJauwFxuWHF2y+CeyZcr5Sz9qb3qHiFzZAQHNFwKuLbCmSI6UeB+mjngpU5hJyvvPv Qbl9iwpvTAvHge6+6Bv49ZJeG99/KuDP7ttfhBp0ci5bOC6M95ahlcW9Uk/f/iLuKxw8Ys 5qFoZiQcE4hF82VKYcIefC1oUftn6nDPDh+UdOObWsoCL3gupa8Wu4R9SGG3a0pzSoi/gt NcNVVHXXVPIO2Y2izkhhrDgZEcVVHdS4a3VHk8oJaiRfLHYEFt0Cl3jJQsThAg== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:06 +0200 Subject: [PATCH RFC v2 03/19] drm/panel: move to a new module Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-3-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 Work is in progress for every drm_panel to embed a drm_bridge, which will make the drm_panel code (currently in the drm module) depend on the drm_kms_helper module. To avoid the main drm module to depend on other drm modules and create a depepdency loop, move drm_panel.o to a new drm_panel module, so the module dependency will be drm_panel -> drm_kms_helper instead. Signed-off-by: Luca Ceresoli Reviewed-by: Maxime Ripard --- drivers/gpu/drm/Makefile | 2 +- drivers/gpu/drm/panel/Kconfig | 2 +- include/drm/drm_panel.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index c4509e7fd248..9a8df14ef628 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -79,7 +79,6 @@ drm-$(CONFIG_DRM_CLIENT) +=3D \ drm_client_modeset.o \ drm_client_sysrq.o drm-$(CONFIG_COMPAT) +=3D drm_ioc32.o -drm-$(CONFIG_DRM_PANEL) +=3D drm_panel.o drm-$(CONFIG_OF) +=3D drm_of.o drm-$(CONFIG_PCI) +=3D drm_pci.o drm-$(CONFIG_DEBUG_FS) +=3D \ @@ -96,6 +95,7 @@ drm-$(CONFIG_DRM_PANIC_SCREEN_QR_CODE) +=3D drm_panic_qr.o drm-$(CONFIG_DRM_RAS) +=3D drm_ras.o drm_ras_nl.o drm_ras_genl_family.o obj-$(CONFIG_DRM) +=3D drm.o =20 +obj-$(CONFIG_DRM_PANEL) +=3D drm_panel.o obj-$(CONFIG_DRM_PANEL_ORIENTATION_QUIRKS) +=3D drm_panel_orientation_quir= ks.o obj-$(CONFIG_DRM_PANEL_BACKLIGHT_QUIRKS) +=3D drm_panel_backlight_quirks.o =20 diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index 747f47347521..0a79a0558101 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only config DRM_PANEL - bool + tristate depends on DRM help Panel registration and lookup framework. diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h index b87323443f49..08949d41d743 100644 --- a/include/drm/drm_panel.h +++ b/include/drm/drm_panel.h @@ -335,7 +335,7 @@ void drm_panel_disable(struct drm_panel *panel); =20 int drm_panel_get_modes(struct drm_panel *panel, struct drm_connector *con= nector); =20 -#if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) +#if defined(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL) struct drm_panel *of_drm_find_panel(const struct device_node *np); #else static inline struct drm_panel *of_drm_find_panel(const struct device_node= *np) @@ -344,7 +344,7 @@ static inline struct drm_panel *of_drm_find_panel(const= struct device_node *np) } #endif =20 -#if defined(CONFIG_DRM_PANEL) +#if IS_ENABLED(CONFIG_DRM_PANEL) bool drm_is_panel_follower(struct device *dev); int drm_panel_add_follower(struct device *follower_dev, struct drm_panel_follower *follower); --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 976C542B327 for ; Thu, 3 Sep 2026 08:12:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423131; cv=none; b=X+4pL6WBF64ATGZNlTpCeGgS/LGEu7+L5rhazf+JmpUwzLYJh7EtLXCl5VPZlcNaLNK1uaF7Hg9WtAbZGz6MkXDqKPORnUKmKyfvguATBcvAvCTsQdS10Sctqjsnje7g9fCpqSSdzICGF5ToGN0LOqWyerjoSc2ijK895riyyMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423131; c=relaxed/simple; bh=qzbvgtAzkE606tnCLKbUVIPm5A0hlnGf6s9jhgt84Hg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oSUI3dzct1BAPT1pfGyHF8qVjDz+TLHQDRm2gy4gkLuD68dyFgMgRdtp10aiaCB+XshxF/Cs21PTVAp/SCc3jpTIlucsT+T4gZmLK49ReltAM00fubyVJnxkHML+spnnhbJ+qPBH7FKKN4vOvyiVFOBYZt1/PLYTcToIzzwujjM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=fZjUcWN2; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="fZjUcWN2" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 924234E414EF; Thu, 3 Sep 2026 08:12:07 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 63FD1602B8; Thu, 3 Sep 2026 08:12:07 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 56B6111C79B6F; Thu, 3 Sep 2026 10:11:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423121; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=3+q8zzzDphveu7bIj+tmklM+ZbtSGClka2kHOxOdEUE=; b=fZjUcWN2SEaG5+lt/vdkn6/7ZrRGBZ9m7nW/1FAKSqjxzAxS4eIn3QSPZGiciofBKXyw1/ HtsDTZg8oBVZxqcTVGQtzsSwuK/lzAcKVTkkBAqqlU23frjCS6qK1OLULxaSIPAGr+pWKE oEN05SWtGm6AwdKRmBUcu56gZNMpYXs6XI8alp5qd43txVCZmAsPy7lbfOsSp5vDrSO71u BduyBPdHWksMT6YMJgPjnCFe2Z8ufY7tXDSKecqypiWJn8X13UPmwk75wwmJszKwMQrEK4 Xkp/vWK5I5QJGlu92tqphgT4AF2D/t+qlXrAwFtx54DdqZ/UIFS/pbkhuedHwA== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:07 +0200 Subject: [PATCH RFC v2 04/19] drm/bridge: panel: rename drm_bridge_is_panel() -> drm_bridge_is_panel_bridge() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-4-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 Work is in progress for every drm_panel to embed a drm_bridge, and for that a function will be needed in the drm_panel API to tell whether a bridge represents a panel or something else. The ideal name for that will be drm_bridge_is_panel(), which however is already in use by the panel_bridge. Rename the current function in the panel_bridge API to drm_bridge_is_panel_bridge(), which is more precise and frees up the drm_bridge_is_panel() for future use in the drm_panel API. No functional changes, just renaming a function treewide. Signed-off-by: Luca Ceresoli Reviewed-by: Albert Esteve --- drivers/gpu/drm/bridge/panel.c | 8 ++++---- drivers/gpu/drm/display/drm_bridge_connector.c | 2 +- include/drm/drm_bridge.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c index 40e3970e8b76..0582c708957c 100644 --- a/drivers/gpu/drm/bridge/panel.c +++ b/drivers/gpu/drm/bridge/panel.c @@ -221,17 +221,17 @@ static const struct drm_bridge_funcs panel_bridge_bri= dge_funcs =3D { }; =20 /** - * drm_bridge_is_panel - Checks if a drm_bridge is a panel_bridge. + * drm_bridge_is_panel_bridge - Checks if a drm_bridge is a panel_bridge. * * @bridge: The drm_bridge to be checked. * * Returns true if the bridge is a panel bridge, or false otherwise. */ -bool drm_bridge_is_panel(const struct drm_bridge *bridge) +bool drm_bridge_is_panel_bridge(const struct drm_bridge *bridge) { return bridge->funcs =3D=3D &panel_bridge_bridge_funcs; } -EXPORT_SYMBOL(drm_bridge_is_panel); +EXPORT_SYMBOL(drm_bridge_is_panel_bridge); =20 /** * drm_panel_bridge_add - Creates a &drm_bridge and &drm_connector that @@ -321,7 +321,7 @@ void drm_panel_bridge_remove(struct drm_bridge *bridge) if (!bridge) return; =20 - if (!drm_bridge_is_panel(bridge)) { + if (!drm_bridge_is_panel_bridge(bridge)) { drm_warn(bridge->dev, "%s: called on non-panel bridge!\n", __func__); return; } diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 00feb73e63d7..5de9b76f345b 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -983,7 +983,7 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, if (bridge->ddc) ddc =3D bridge->ddc; =20 - if (drm_bridge_is_panel(bridge)) { + if (drm_bridge_is_panel_bridge(bridge)) { drm_bridge_put(panel_bridge); panel_bridge =3D drm_bridge_get(bridge); } diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 9f2294957669..b29096d624d5 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1474,7 +1474,7 @@ void drm_bridge_hpd_notify(struct drm_bridge *bridge, enum drm_connector_status status); =20 #if IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE) -bool drm_bridge_is_panel(const struct drm_bridge *bridge); +bool drm_bridge_is_panel_bridge(const struct drm_bridge *bridge); struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel); struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel, u32 connector_type); @@ -1490,7 +1490,7 @@ struct drm_bridge *drmm_panel_bridge_add(struct drm_d= evice *drm, struct drm_panel *panel); struct drm_connector *drm_panel_bridge_connector(struct drm_bridge *bridge= ); #else -static inline bool drm_bridge_is_panel(const struct drm_bridge *bridge) +static inline bool drm_bridge_is_panel_bridge(const struct drm_bridge *bri= dge) { return false; } --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2BF323C585C for ; Thu, 3 Sep 2026 08:12:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423135; cv=none; b=utqauI1QgiRqY0iJgB6jEEKRuKAvEovZ4VjSWklAQB0XdNT/jibvfYg29ShjQHRCml1b8tGuN0jGjRHc9RZRuC2LjeHZwI2cigNyHQc9dURqaaGZ/TRfAJfztmfQTnnAHPc7fzFVKwnnV0cDGwEgbwY2Kmty39g9CAWTq91GHmU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423135; c=relaxed/simple; bh=e92KqPQ5/nx/5Yn0ZvK26lweTavp1F/vqZw9jYHJwXA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lCG/kU0x4jysqM4cQYPCO9A+PniLQsc3Ee9hLkiO9I30MgOIWIQVMpJXY/LmHRHO/OfZZI0jOZsW5w6kZZhT2MF2GrdT9rklaUOxhcWdkcNQMJ6Ul80w1EEMcuzRC8cOLGiY7u4N9tfMlF2tQ+4i+1k1XrIusGs7fe+c5Krv3ns= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=xLP5uURk; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="xLP5uURk" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id AE7871A198B; Thu, 3 Sep 2026 08:12:11 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 7A8C0602B8; Thu, 3 Sep 2026 08:12:11 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8E2CA11C79FA7; Thu, 3 Sep 2026 10:12:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423130; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=9usQOCNh8tbKobnfgQCJWyMdDIV74e743x42Do9+b3E=; b=xLP5uURkfDLQA88pEkKxt/t1utv4Kcnh7YN0slRTO0Qukg+W56cyxxYd0fq52h2T2/6PRD K1WizumhXXUD57GLpzXbgpOseg1JWaD+CcQvftlkO39BTQnsoCt1m5pH/yvV9Rk85Ma82O 02Lj3IbWSOQMiuD92O+aGCbztP8L5+INW7zHaFYERDoQz2Qk3FwwWgL0K73bvsaboaCSG2 2Qc5Qx4nyTOYrneGeC5R17KAeG/cGCKhOoyu46ujPom1igMwQ04RIuypvfRBKF23CksW+N N/EFppol7l3tDRceTLulxpCY9BpADkswvG8IOFth7h/KMYfrdz+hYyGpq82mxA== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:08 +0200 Subject: [PATCH RFC v2 05/19] drm/panel: embed a drm_bridge into every drm_panel Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-5-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 Adding a drm_panel does currently not add a panel_bridge wrapping it. Usually the panel_bridge creation happens later, when some other driver (e.g. the previous bridge or the encoder) calls *_of_get_bridge() and the following element in the pipeline is a panel. This has some drawbacks: * the bridge API is currently the best practice to access various components of the pipeline, especially with complex cards where bridges can be combined in different ways on different hardware * the panel_bridge is not created in the context of the driver of the underlying physical device (the panel driver), but of some other driver * that other driver is not aware of whether the returned drm_bridge pointer is a panel_bridge created on the fly, a pre-existing panel_bridge or a non-panel bridge * removal of a panel_bridge requires calling drm_panel_bridge_remove(), but that other driver doesn't know whether this is needed because it doesn't know whether it has created a panel_bridge or not Other drivers call [a variant of] drm_panel_bridge_add(), which also has some of the above drawbacks. So far the current approach was working mostly because devm and drmm ensure the panel bridge would be dealloacted at some later point. However with the upcoming implementation of bridge hotplug and dynamic bridge lifetime this will get more complicated. Switch to the new approach: embed a drm_bridge inside every drm_panel, which behaves just like the current drm_panel_bridge. Do this by copying and adapting the code from bridge/panel.c, using function names that are more suitable within drm_panel.c and doing the minimal adaptation needed. Currently drm_bridge and drm_panel have independent refcounted allocation. As they now become a single struct, just change drm_panel_get/put() to get/put the bridge. As a result, the refcount for a drm_bridge embedded in a drm_panel is: bridge.refcount =3D=3D number of drm_bridge_get() calls + number of drm_panel_get() calls - number of drm_bridge_put() calls - number of drm_panel_put() calls Signed-off-by: Luca Ceresoli --- This patch is new in v2, and replaces "drm/bridge: panel: add a panel_bridge to every panel" which was based on a different approach. --- drivers/gpu/drm/drm_panel.c | 258 ++++++++++++++++++++++++++++++++++++++++= +--- include/drm/drm_panel.h | 33 ++++-- 2 files changed, 266 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c index f8f6082e637f..9b86195f9f66 100644 --- a/drivers/gpu/drm/drm_panel.c +++ b/drivers/gpu/drm/drm_panel.c @@ -22,15 +22,19 @@ */ =20 #include +#include #include #include #include #include =20 +#include #include +#include #include #include #include +#include =20 static DEFINE_MUTEX(panel_lock); static LIST_HEAD(panel_list); @@ -46,6 +50,18 @@ static LIST_HEAD(panel_list); * take look at drm_panel_bridge_add() and devm_drm_panel_bridge_add(). */ =20 +static inline struct drm_panel * +drm_bridge_to_panel(const struct drm_bridge *bridge) +{ + return container_of(bridge, struct drm_panel, bridge); +} + +static inline struct drm_panel * +drm_connector_to_panel(const struct drm_connector *connector) +{ + return container_of(connector, struct drm_panel, connector); +} + /** * drm_panel_init - initialize a panel * @panel: DRM panel @@ -86,6 +102,7 @@ void drm_panel_add(struct drm_panel *panel) mutex_lock(&panel_lock); list_add_tail(&panel->list, &panel_list); mutex_unlock(&panel_lock); + drm_bridge_add(&panel->bridge); } EXPORT_SYMBOL(drm_panel_add); =20 @@ -97,6 +114,7 @@ EXPORT_SYMBOL(drm_panel_add); */ void drm_panel_remove(struct drm_panel *panel) { + drm_bridge_remove(&panel->bridge); mutex_lock(&panel_lock); list_del_init(&panel->list); mutex_unlock(&panel_lock); @@ -370,13 +388,198 @@ int drm_panel_get_modes(struct drm_panel *panel, } EXPORT_SYMBOL(drm_panel_get_modes); =20 -static void __drm_panel_free(struct kref *kref) +static int drm_panel_bridge_connector_get_modes(struct drm_connector *conn= ector) +{ + struct drm_panel *drm_panel =3D drm_connector_to_panel(connector); + + return drm_panel_get_modes(drm_panel, connector); +} + +/** + * drm_bridge_set_connector_orientation - Set the connector panel + * orientation from the bridge that can be transformed to drm_panel. + * + * @bridge: The drm_bridge for a drm_panel. + * @connector: The connector to be set panel orientation. + * + * Returns 0 on success, negative errno on failure. + */ +int drm_bridge_set_connector_orientation(const struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + + return drm_connector_set_orientation_from_panel(connector, panel); +} +EXPORT_SYMBOL(drm_bridge_set_connector_orientation); + +static const struct drm_connector_helper_funcs +drm_panel_bridge_connector_helper_funcs =3D { + .get_modes =3D drm_panel_bridge_connector_get_modes, +}; + +static const struct drm_connector_funcs drm_panel_bridge_connector_funcs = =3D { + .reset =3D drm_atomic_helper_connector_reset, + .fill_modes =3D drm_helper_probe_single_connector_modes, + .destroy =3D drm_connector_cleanup, + .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, +}; + +static int drm_panel_bridge_attach(struct drm_bridge *bridge, + struct drm_encoder *encoder, + enum drm_bridge_attach_flags flags) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + struct drm_connector *connector =3D &panel->connector; + int ret; + + if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) + return 0; + + drm_connector_helper_add(connector, + &drm_panel_bridge_connector_helper_funcs); + + ret =3D drm_connector_init(bridge->dev, connector, + &drm_panel_bridge_connector_funcs, + panel->connector_type); + if (ret) { + DRM_ERROR("Failed to initialize connector\n"); + return ret; + } + + drm_bridge_set_connector_orientation(bridge, connector); + + drm_connector_attach_encoder(connector, encoder); + + if (bridge->dev->registered) { + if (connector->funcs->reset) + connector->funcs->reset(connector); + drm_connector_register(connector); + } + + return 0; +} + +static void drm_panel_bridge_detach(struct drm_bridge *bridge) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + struct drm_connector *connector =3D &panel->connector; + + /* Cleanup the connector if we know it was initialized */ + if (connector->dev) + drm_connector_cleanup(connector); +} + +static void drm_panel_bridge_atomic_pre_enable(struct drm_bridge *bridge, + struct drm_atomic_commit *atomic_commit) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + struct drm_encoder *encoder =3D bridge->encoder; + struct drm_crtc *crtc; + struct drm_crtc_state *old_crtc_state; + + crtc =3D drm_atomic_get_new_crtc_for_encoder(atomic_commit, encoder); + if (!crtc) + return; + + old_crtc_state =3D drm_atomic_get_old_crtc_state(atomic_commit, crtc); + if (old_crtc_state && old_crtc_state->self_refresh_active) + return; + + drm_panel_prepare(panel); +} + +static void drm_panel_bridge_atomic_enable(struct drm_bridge *bridge, + struct drm_atomic_commit *atomic_commit) { - struct drm_panel *panel =3D container_of(kref, struct drm_panel, refcount= ); + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + struct drm_encoder *encoder =3D bridge->encoder; + struct drm_crtc *crtc; + struct drm_crtc_state *old_crtc_state; =20 - kfree(panel->container); + crtc =3D drm_atomic_get_new_crtc_for_encoder(atomic_commit, encoder); + if (!crtc) + return; + + old_crtc_state =3D drm_atomic_get_old_crtc_state(atomic_commit, crtc); + if (old_crtc_state && old_crtc_state->self_refresh_active) + return; + + drm_panel_enable(panel); +} + +static void drm_panel_bridge_atomic_disable(struct drm_bridge *bridge, + struct drm_atomic_commit *atomic_commit) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + struct drm_encoder *encoder =3D bridge->encoder; + struct drm_crtc *crtc; + struct drm_crtc_state *new_crtc_state; + + crtc =3D drm_atomic_get_old_crtc_for_encoder(atomic_commit, encoder); + if (!crtc) + return; + + new_crtc_state =3D drm_atomic_get_new_crtc_state(atomic_commit, crtc); + if (new_crtc_state && new_crtc_state->self_refresh_active) + return; + + drm_panel_disable(panel); } =20 +static void drm_panel_bridge_atomic_post_disable(struct drm_bridge *bridge, + struct drm_atomic_commit *atomic_commit) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + struct drm_encoder *encoder =3D bridge->encoder; + struct drm_crtc *crtc; + struct drm_crtc_state *new_crtc_state; + + crtc =3D drm_atomic_get_old_crtc_for_encoder(atomic_commit, encoder); + if (!crtc) + return; + + new_crtc_state =3D drm_atomic_get_new_crtc_state(atomic_commit, crtc); + if (new_crtc_state && new_crtc_state->self_refresh_active) + return; + + drm_panel_unprepare(panel); +} + +static int drm_panel_bridge_get_modes(struct drm_bridge *bridge, + struct drm_connector *connector) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + + return drm_panel_get_modes(panel, connector); +} + +static void drm_panel_bridge_debugfs_init(struct drm_bridge *bridge, + struct dentry *root) +{ + struct drm_panel *panel =3D drm_bridge_to_panel(bridge); + + root =3D debugfs_create_dir("panel", root); + if (panel->funcs->debugfs_init) + panel->funcs->debugfs_init(panel, root); +} + +static const struct drm_bridge_funcs drm_panel_bridge_funcs =3D { + .attach =3D drm_panel_bridge_attach, + .detach =3D drm_panel_bridge_detach, + .atomic_pre_enable =3D drm_panel_bridge_atomic_pre_enable, + .atomic_enable =3D drm_panel_bridge_atomic_enable, + .atomic_disable =3D drm_panel_bridge_atomic_disable, + .atomic_post_disable =3D drm_panel_bridge_atomic_post_disable, + .get_modes =3D drm_panel_bridge_get_modes, + .atomic_create_state =3D drm_atomic_helper_bridge_create_state, + .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, + .atomic_get_input_bus_fmts =3D drm_atomic_helper_bridge_propagate_bus_fmt, + .debugfs_init =3D drm_panel_bridge_debugfs_init, +}; + /** * drm_panel_get - Acquire a panel reference * @panel: DRM panel @@ -387,10 +590,8 @@ static void __drm_panel_free(struct kref *kref) */ struct drm_panel *drm_panel_get(struct drm_panel *panel) { - if (!panel) - return panel; - - kref_get(&panel->refcount); + if (panel) + drm_bridge_get(&panel->bridge); =20 return panel; } @@ -406,7 +607,7 @@ EXPORT_SYMBOL(drm_panel_get); void drm_panel_put(struct drm_panel *panel) { if (panel) - kref_put(&panel->refcount, __drm_panel_free); + drm_bridge_put(&panel->bridge); } EXPORT_SYMBOL(drm_panel_put); =20 @@ -429,8 +630,22 @@ void *__devm_drm_panel_alloc(struct device *dev, size_= t size, size_t offset, const struct drm_panel_funcs *funcs, int connector_type) { - void *container; + /* + * Struct embedding and offsets: + * + * |--------------- user container struct ------------| + * : |---------- struct drm_panel ------------| + * : : |----- struct drm_bridge ------| + * A B C + * + * B - A =3D offset (passed as argument) + * C - B =3D panel_bridge_offset + * C - A =3D alloc_bridge_offset + */ + const size_t panel_bridge_offset =3D offsetof(struct drm_panel, bridge); + const size_t alloc_bridge_offset =3D offset + panel_bridge_offset; struct drm_panel *panel; + void *container; int err; =20 if (!funcs) { @@ -438,14 +653,16 @@ void *__devm_drm_panel_alloc(struct device *dev, size= _t size, size_t offset, return ERR_PTR(-EINVAL); } =20 - container =3D kzalloc(size, GFP_KERNEL); - if (!container) - return ERR_PTR(-ENOMEM); + container =3D __devm_drm_bridge_alloc(dev, size, alloc_bridge_offset, + &drm_panel_bridge_funcs); + if (IS_ERR(container)) + return container; =20 panel =3D container + offset; - panel->container =3D container; panel->funcs =3D funcs; - kref_init(&panel->refcount); + panel->bridge.of_node =3D dev->of_node; + + drm_panel_get(panel); =20 err =3D devm_add_action_or_reset(dev, drm_panel_put_void, panel); if (err) @@ -457,6 +674,19 @@ void *__devm_drm_panel_alloc(struct device *dev, size_= t size, size_t offset, } EXPORT_SYMBOL(__devm_drm_panel_alloc); =20 +/** + * drm_bridge_is_panel - Tell if a drm_bridge is a panel. + * + * @bridge: The drm_bridge to be checked. + * + * Returns true if the bridge is a panel, or false otherwise. + */ +bool drm_bridge_is_panel(const struct drm_bridge *bridge) +{ + return bridge->funcs =3D=3D &drm_panel_bridge_funcs; +} +EXPORT_SYMBOL(drm_bridge_is_panel); + #ifdef CONFIG_OF /** * of_drm_find_panel - look up and reference a panel by device tree node diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h index 08949d41d743..7fe2f3160b2a 100644 --- a/include/drm/drm_panel.h +++ b/include/drm/drm_panel.h @@ -30,6 +30,8 @@ #include #include =20 +#include + struct backlight_device; struct dentry; struct device_node; @@ -228,6 +230,22 @@ struct drm_panel { */ const struct drm_panel_funcs *funcs; =20 + /** + * @bridge: + * + * Bridge to access the panel features through the drm_bridge API. + */ + struct drm_bridge bridge; + + /** + * @connector: + * + * Connector instantiated by the bridge (only for legacy code not + * yet using the drm_bridge_connector and + * DRM_BRIDGE_ATTACH_NO_CONNECTOR). + */ + struct drm_connector connector; + /** * @connector_type: * @@ -281,17 +299,6 @@ struct drm_panel { * If true then the panel has been enabled. */ bool enabled; - - /** - * @container: Pointer to the private driver struct embedding this - * @struct drm_panel. - */ - void *container; - - /** - * @refcount: reference count of users referencing this panel. - */ - struct kref refcount; }; =20 void *__devm_drm_panel_alloc(struct device *dev, size_t size, size_t offse= t, @@ -327,6 +334,10 @@ void drm_panel_add(struct drm_panel *panel); void drm_panel_remove(struct drm_panel *panel); int devm_drm_panel_add(struct device *dev, struct drm_panel *panel); =20 +bool drm_bridge_is_panel(const struct drm_bridge *bridge); +int drm_bridge_set_connector_orientation(const struct drm_bridge *bridge, + struct drm_connector *connector); + void drm_panel_prepare(struct drm_panel *panel); void drm_panel_unprepare(struct drm_panel *panel); =20 --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D78142E420 for ; Thu, 3 Sep 2026 08:12:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423137; cv=none; b=OD8tGmuNzRjLNWh3EfFmOv0bW6etZDTFLxe96fOmHpqW6eWOrHccCuA/XN7ej1OVXNIR2eH/Suwkave7rzC1m9779C2z0OrEpXFZaqXr6iOxYUU4htZvDEd6vmNyeEyS4k9XobT14htKlbVLvKa77TW9ev1CF8wFHEqwDF4u4nI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423137; c=relaxed/simple; bh=XKvq1RoCgb1S9HBF+1bJlKK6xQBLPMDN+3TWwxvZn68=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lPzMqqyXnbUimXlbhvazBB1DEaRxvlt3ccocLpNMfniUejIGVWwTQRw2HF1tILlBOoHr0UXZfz7+bRKJddGTIcXUYzHaplBDrKXkoGjbh7+JHK+HUHZHvKxvG1Giv4fS0SLdq0IP4vjn1KKIi51+uibOUBqJXhyvvXelhG5v4es= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=cfHL4z7r; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="cfHL4z7r" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 11C4E1A198C; Thu, 3 Sep 2026 08:12:15 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D8FEB602B8; Thu, 3 Sep 2026 08:12:14 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8877711C791C9; Thu, 3 Sep 2026 10:12:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423133; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=izOHNCuOScQ6mZ5l83A+QNH+LuTo1/OO5QFZoLW7y14=; b=cfHL4z7rNtUmxH+wP37bXSIIkyHFZz0eFPpMChIDqtCjooIe4eZWy7U4YqGZl5mCYTYvt1 kqe9Q9zgpZXolopQ5U05gBj+8u3Ti4Sz8+GaRdxzh6hxlUj921M9IhzNcEm/cyZN+N98Gy d9J9Hl+Oj6NBCrsUWabvFGsLt9b9GrHtoIUIsOd8QeikQZlHRloIgDy9bb0ucWXwD+/kA2 ADpXp/BW30PO1fN4eQf/Q5FF32zZzt2bK7yZ2iErlTstwfX5ki+XikQKnzNffE14vqzL6t Eia9xaoKt58Yn1dMICXr+vqxRLS4o4QILuv9fsuEYjoOOkVAs+/TIDIF04s5pQ== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:09 +0200 Subject: [PATCH RFC v2 06/19] drm/bridge: tc358767: don't create a panel_bridge Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-6-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 Now a panel_bridge is automatically created for every drm_panel, so calls to devm_drm_panel_bridge_add() would lead to creating a second panel_bridge for the same panel. Update and simplify the code by just getting a reference to the already-existing bridge using of_drm_get_bridge_by_endpoint(). As of_drm_get_bridge_by_endpoint() returns a refcounted bridge, take care of putting the bridge reference by using bridge->next_bridge. Signed-off-by: Luca Ceresoli --- drivers/gpu/drm/bridge/Kconfig | 2 -- drivers/gpu/drm/bridge/tc358767.c | 64 ++++++++++++-----------------------= ---- 2 files changed, 20 insertions(+), 46 deletions(-) diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index 0a1689f8209d..30f71654eaeb 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -402,8 +402,6 @@ config DRM_TOSHIBA_TC358767 select DRM_KMS_HELPER select REGMAP_I2C select DRM_MIPI_DSI - select DRM_PANEL - select DRM_PANEL_BRIDGE help Toshiba TC358767 eDP bridge chip driver. =20 diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc3= 58767.c index ac83af7902cd..51f4baa62a53 100644 --- a/drivers/gpu/drm/bridge/tc358767.c +++ b/drivers/gpu/drm/bridge/tc358767.c @@ -35,7 +35,6 @@ #include #include #include -#include #include #include =20 @@ -370,7 +369,6 @@ struct tc_data { struct drm_dp_aux aux; =20 struct drm_bridge bridge; - struct drm_bridge *panel_bridge; struct drm_connector connector; =20 struct mipi_dsi_device *dsi; @@ -1742,8 +1740,8 @@ static int tc_connector_get_modes(struct drm_connecto= r *connector) return 0; } =20 - if (tc->panel_bridge) { - num_modes =3D drm_bridge_get_modes(tc->panel_bridge, connector); + if (tc->bridge.next_bridge) { + num_modes =3D drm_bridge_get_modes(tc->bridge.next_bridge, connector); if (num_modes > 0) return num_modes; } @@ -1788,7 +1786,7 @@ tc_connector_detect(struct drm_connector *connector, = bool force) if (tc->hpd_pin >=3D 0) return tc_bridge_detect(&tc->bridge, connector); =20 - if (tc->panel_bridge) + if (tc->bridge.next_bridge) return connector_status_connected; else return connector_status_unknown; @@ -1809,10 +1807,10 @@ static int tc_dpi_bridge_attach(struct drm_bridge *= bridge, { struct tc_data *tc =3D bridge_to_tc(bridge); =20 - if (!tc->panel_bridge) + if (!tc->bridge.next_bridge) return 0; =20 - return drm_bridge_attach(tc->bridge.encoder, tc->panel_bridge, + return drm_bridge_attach(tc->bridge.encoder, tc->bridge.next_bridge, &tc->bridge, flags); } =20 @@ -1825,9 +1823,9 @@ static int tc_edp_bridge_attach(struct drm_bridge *br= idge, struct drm_device *drm =3D bridge->dev; int ret; =20 - if (tc->panel_bridge) { + if (tc->bridge.next_bridge) { /* If a connector is required then this driver shall create it */ - ret =3D drm_bridge_attach(tc->bridge.encoder, tc->panel_bridge, + ret =3D drm_bridge_attach(tc->bridge.encoder, tc->bridge.next_bridge, &tc->bridge, flags | DRM_BRIDGE_ATTACH_NO_CONNECTOR); if (ret) return ret; @@ -2318,53 +2316,31 @@ static int tc_probe_dpi_bridge_endpoint(struct tc_d= ata *tc) { struct device *dev =3D tc->dev; struct drm_bridge *bridge; - struct drm_panel *panel; - int ret; =20 /* port@1 is the DPI input/output port */ - ret =3D drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, &bridge); - if (ret && ret !=3D -ENODEV) - return dev_err_probe(dev, ret, - "Could not find DPI panel or bridge\n"); - - if (panel) { - bridge =3D devm_drm_panel_bridge_add(dev, panel); - drm_panel_put(panel); - if (IS_ERR(bridge)) - return PTR_ERR(bridge); - } - - if (bridge) { - tc->panel_bridge =3D bridge; - tc->bridge.type =3D DRM_MODE_CONNECTOR_DPI; + bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1, 0); + if (IS_ERR(bridge)) + return dev_err_probe(dev, PTR_ERR(bridge), + "Could not find DPI bridge\n"); =20 - return 0; - } + tc->bridge.next_bridge =3D bridge; + tc->bridge.type =3D DRM_MODE_CONNECTOR_DPI; =20 - return ret; + return 0; } =20 static int tc_probe_edp_bridge_endpoint(struct tc_data *tc) { struct device *dev =3D tc->dev; - struct drm_panel *panel; - int ret; + struct drm_bridge *bridge; =20 /* port@2 is the output port */ - ret =3D drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, NULL); - if (ret && ret !=3D -ENODEV) - return dev_err_probe(dev, ret, - "Could not find DSI panel or bridge\n"); - - if (panel) { - struct drm_bridge *panel_bridge; - - panel_bridge =3D devm_drm_panel_bridge_add(dev, panel); - drm_panel_put(panel); - if (IS_ERR(panel_bridge)) - return PTR_ERR(panel_bridge); + bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 2, 0); + if (IS_ERR(bridge) && PTR_ERR(bridge) !=3D -ENODEV) + return dev_err_probe(dev, PTR_ERR(bridge), "Could not find DSI bridge\n"= ); =20 - tc->panel_bridge =3D panel_bridge; + if (!IS_ERR(bridge)) { + tc->bridge.next_bridge =3D bridge; tc->bridge.type =3D DRM_MODE_CONNECTOR_eDP; } else { tc->bridge.type =3D DRM_MODE_CONNECTOR_DisplayPort; --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C15A419304 for ; Thu, 3 Sep 2026 08:12:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423142; cv=none; b=AdDM9RgF58GXZWMbEm+Ni8ryXsJ36Ip0lSJca6HTkSKG+TT/humOum2uGLmqpW2Lrk8bVPxlfd3440BsWv+p8JzRSn8TsAj1fTUjCAhjM4BGVUE/lkbJh7JheDxfZKEiWzml3FCe5tG3muvhEgQfxRD++ioGt3lXLv2YrUzLfOQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423142; c=relaxed/simple; bh=sbS7BPCMYyqCO+Qn7zpLxIOerE/Dp2fAYuLT+8QlNGo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fc7wz52q7R6O5f20koUfhThbdGRlYvgKQLZyIIVHyUw+3Xrz28hyB3SutNTm8mm6TgW1E9NppaGSrWPZeN3J1oD5y5+q4b2ThhJsYBgMGCJ07/mPWgoQdPrVxf1VTLl/kBJKIh22NpszWeU6uMP6GwAfP5Oe54G/lTVXHv4Lx/8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=B0hdNk1h; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="B0hdNk1h" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id EFC4E1A198D; Thu, 3 Sep 2026 08:12:18 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id C2ACF602B8; Thu, 3 Sep 2026 08:12:18 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E96A311C79FFE; Thu, 3 Sep 2026 10:12:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423137; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=qrl7+kbklONvZ1AqswtkUlrd6of2RCwJAsuQPOn1hyY=; b=B0hdNk1htDpeVEYT429cabUl0ivfFt5yfh/qmVW5njp8XYf4R0GAbJoF/eNG8pmaaTr8p4 pHqHjHwrTU4rgzOWcxywfyzYs+OsSkeLYy5KfDQZu1OtWv1KKJob2Wn1lRsKRLha6ucwyf wIy/Orv+WxGD9BgdsNac8Jr1yKxKAnAuv2x387yvfmt1bzcka/UN4zb6a4NOVpMfhoZjWG RKWsODspw+ceYb/h9EJrAd+H0DUWFOqbIScXQ86Vu69kiDjwqcoOhJi7WE3NnrGywrMydG DCXqbqAHHvpUY1XAKYzlotHjaqMIBTX/FZhWg42y5OqvJhnI/SGDsO6gt5cE3Q== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:10 +0200 Subject: [PATCH RFC v2 07/19] drm/bridge: waveshare-dsi: don't create a panel_bridge Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-7-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 Now a panel_bridge is automatically created for every drm_panel, so this call to devm_drm_panel_bridge_add() would lead to creating a second panel_bridge for the same panel. Update and simplify the code by just getting a reference to the already-existing bridge using of_drm_get_bridge_by_endpoint(). As of_drm_get_bridge_by_endpoint() returns a refcounted bridge, take care of putting the bridge reference by using bridge->next_bridge. Signed-off-by: Luca Ceresoli --- drivers/gpu/drm/bridge/waveshare-dsi.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/bridge/waveshare-dsi.c b/drivers/gpu/drm/bridg= e/waveshare-dsi.c index 420f3b870a74..2c40bfef2b45 100644 --- a/drivers/gpu/drm/bridge/waveshare-dsi.c +++ b/drivers/gpu/drm/bridge/waveshare-dsi.c @@ -16,11 +16,9 @@ #include #include #include -#include =20 struct ws_bridge { struct drm_bridge bridge; - struct drm_bridge *next_bridge; struct backlight_device *backlight; struct device *dev; struct regmap *reg_map; @@ -89,7 +87,7 @@ static int ws_bridge_bridge_attach(struct drm_bridge *bri= dge, { struct ws_bridge *ws =3D bridge_to_ws_bridge(bridge); =20 - return drm_bridge_attach(encoder, ws->next_bridge, + return drm_bridge_attach(encoder, ws->bridge.next_bridge, &ws->bridge, flags); } =20 @@ -150,7 +148,6 @@ static struct backlight_device *ws_bridge_create_backli= ght(struct ws_bridge *ws) static int ws_bridge_probe(struct i2c_client *i2c) { struct device *dev =3D &i2c->dev; - struct drm_panel *panel; struct ws_bridge *ws; int ret; =20 @@ -164,14 +161,10 @@ static int ws_bridge_probe(struct i2c_client *i2c) if (IS_ERR(ws->reg_map)) return dev_err_probe(dev, PTR_ERR(ws->reg_map), "Failed to allocate regm= ap\n"); =20 - ret =3D drm_of_find_panel_or_bridge(dev->of_node, 1, -1, &panel, NULL); - if (ret) - return dev_err_probe(dev, ret, "Failed to find remote panel\n"); - - ws->next_bridge =3D devm_drm_panel_bridge_add(dev, panel); - drm_panel_put(panel); - if (IS_ERR(ws->next_bridge)) - return PTR_ERR(ws->next_bridge); + ws->bridge.next_bridge =3D of_drm_get_bridge_by_endpoint(dev->of_node, 1,= -1); + if (IS_ERR(ws->bridge.next_bridge)) + return dev_err_probe(dev, PTR_ERR(ws->bridge.next_bridge), + "Failed to find remote bridge\n"); =20 ws->backlight =3D ws_bridge_create_backlight(ws); if (IS_ERR(ws->backlight)) { --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B89F242E420 for ; Thu, 3 Sep 2026 08:12:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423145; cv=none; b=b6+W44k7ndsxLO963FPDeHd8/cdXd+clWizJKEKXORwYj4nrJjjNGFnIXmgkfa/Q6UMxOatXutLzLE1s9n228he9joUvp33zCo2wX72wzl2sN1hTBRn7qZMQRjlT6tLslNDCI7TNDL0rNjIgHPd1Z+Ql++e3p8jnizWkGSMOlJU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423145; c=relaxed/simple; bh=KpPb45TZcVjYZv41RAyyBFmb8YZ1rSpyHDXoeZKKK1I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WAotj6r5LQzFYo33UcoUQgLeud054PbuwlNPTjArSmNoeL/lUXrBub5GXbI2AXuWutgO093edZH1pAmpbzijRSoeFnfRyM45c2aSNP4jAOHx1p46+Rle3iH8/PTSOPk3CwXld8NGEUtUCZJhq1uX2NgBUbHx6h3qHuZWyiI5Zzo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=1o2PoOZo; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="1o2PoOZo" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 1D3CE1A198F; Thu, 3 Sep 2026 08:12:22 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id DC319602B8; Thu, 3 Sep 2026 08:12:21 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 8465211C79F4D; Thu, 3 Sep 2026 10:12:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423140; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=pPgqqB8slFMQr5Kpl6JRMxMiHaZVEfJqqUfrSa3/Ilg=; b=1o2PoOZo+DtGsRxxzjrT/1G89edmkPpDh1cVQRxL3uqGp4HuRlWG43GBHQ6f1btv/8gp9U MiMJhkdNDKNRs2FSbDVqT4kxgHHGaBmi1N1qVNT9tSy5y4sm4Un+heWEE+W8NpWgkp6DXj MrQPO1F9zB2tGWr3iKlRxla1yVDcaTKHjJ3L3Ois+9XuEAs1GNsV7lDesKpvtaoOmJLCnT dFwfAXiuANQfmJFCbcz2iLm8DQEN/tIIxtJjxRBmc4AaEP6BmpCd3l0nQS2dmvyKqjzfs7 Vnj0T4/37iuVTWbZOWjBez2Fb2c/N8lbqOiaHTdM/5DN6CXwYUk6s3ny94JUKA== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:11 +0200 Subject: [PATCH RFC v2 08/19] drm/mcde: dsi: simplify device_node management using scoped for_each variant Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-8-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 Before further modifying this function, simpify the struct device_node management using the scoped variat of for_each_available_child_of_node(). Reviewed-by: Maxime Ripard Reviewed-by: Linus Walleij Signed-off-by: Luca Ceresoli --- drivers/gpu/drm/mcde/mcde_dsi.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_ds= i.c index 694372581840..ce078aa3910f 100644 --- a/drivers/gpu/drm/mcde/mcde_dsi.c +++ b/drivers/gpu/drm/mcde/mcde_dsi.c @@ -1076,7 +1076,6 @@ static int mcde_dsi_bind(struct device *dev, struct d= evice *master, struct drm_device *drm =3D data; struct mcde *mcde =3D to_mcde(drm); struct mcde_dsi *d =3D dev_get_drvdata(dev); - struct device_node *child; struct drm_panel *panel =3D NULL; struct drm_bridge *bridge __free(drm_bridge_put) =3D NULL; =20 @@ -1104,7 +1103,7 @@ static int mcde_dsi_bind(struct device *dev, struct d= evice *master, } =20 /* Look for a panel as a child to this node */ - for_each_available_child_of_node(dev->of_node, child) { + for_each_available_child_of_node_scoped(dev->of_node, child) { panel =3D of_drm_find_panel(child); if (IS_ERR(panel)) { dev_err(dev, "failed to find panel try bridge (%ld)\n", @@ -1114,15 +1113,12 @@ static int mcde_dsi_bind(struct device *dev, struct= device *master, bridge =3D of_drm_find_and_get_bridge(child); if (!bridge) { dev_err(dev, "failed to find bridge\n"); - of_node_put(child); return -EINVAL; } } =20 - if (panel || bridge) { - of_node_put(child); + if (panel || bridge) break; - } } if (panel) { bridge =3D drm_panel_bridge_add_typed(panel, --=20 2.55.0 From nobody Sat Sep 26 07:55:26 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4AB6429818 for ; Thu, 3 Sep 2026 08:12:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423150; cv=none; b=AIkMbRS5YHUE8A3aIwLIm3F9Abh6DWnOFaquj2d3470deuXDzVNyx/VnvupomZOTaqVzPhwaQcpmeSZX7f6dyzyVOUZ2BUq2iSvHDTSa4ahC095FCWp4uw094rBz2KqsTQ0blGiebo1YtSZaX7muSlZYTKAmff68NMtrW/8zAec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788423150; c=relaxed/simple; bh=Npe/PkexqQkZbnpl0luiiB7MgJaTBmo3xxd0ijpJOjI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NhpNPi7AVia7UpFO2DcJODcf3pVId3TCfFUU3Ju7Hg4FxnUBNe//RKkbED4Q9Qq6zB/Nmzypui/eXxH7cp1URKtYA4BzqTBgwYgR2UAjonA4mcfgk3VSYPGdBJjxhpyXytK3smXkd8qUEa+Ua2UNWs876Qv0a4dCgDpSPXq6gEA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=dLUncXhm; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="dLUncXhm" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 2D2F41A1990; Thu, 3 Sep 2026 08:12:27 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id E92A96057F; Thu, 3 Sep 2026 08:12:26 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id E3F7C11C7A03F; Thu, 3 Sep 2026 10:12:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1788423144; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=uzHFdnJ9YPRPA9nGrh7ulAEZnrzGbXJbec5Chdit+Zg=; b=dLUncXhm5sG8BzsByBLKL8FY+kz8ST/wcXw/Ad1l0089CcnNuY7+0BE+4nU1HFfHAsAy7K zu1lGgQQU7YacN6w802YXVKGadFihpokWFiy2RUXFslJrzSmBrNZIC7VMaLLayTL6huouN 9nnpV6piK6AdvWiY+alqEF7zcd+7k6c1VtsUQ+xECq7gbz0mu4vjm9zAedldd7sD2BS7Fs GPXrcEdOztlCBuAvG4vgoBKpZ3IyiLzDuHXAwvQzuu54nqeVlwYQRxoK8nARxrwwETpKvA dQcMOeouCwMMkvZknp+tCAU+lJxO9Z7k3P7XnQx+7zoIjtwkhBnoTASz6+GlNA== From: Luca Ceresoli Date: Thu, 03 Sep 2026 10:11:12 +0200 Subject: [PATCH RFC v2 09/19] drm/mcde: dsi: remove unused includes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260903-drm-bridge-every-panel-v2-9-2ab8ee24538e@bootlin.com> References: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Jessica Zhang , Linus Walleij , Inki Dae , Jagan Teki , Marek Szyprowski Cc: Albert Esteve , Anusha Srivatsa , Dmitry Baryshkov , Hui Pu , Ian Ray , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Luca Ceresoli X-Mailer: b4 0.16.0 X-Last-TLS-Session-Version: TLSv1.3 The helpers are included but unused. Signed-off-by: Luca Ceresoli --- New patch in v2 --- drivers/gpu/drm/mcde/mcde_dsi.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_ds= i.c index ce078aa3910f..747886dfa17a 100644 --- a/drivers/gpu/drm/mcde/mcde_dsi.c +++ b/drivers/gpu/drm/mcde/mcde_dsi.c @@ -11,17 +11,14 @@ #include #include