From: Luca Ceresoli <luca.ceresoli@bootlin.com>
To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>,
Simona Vetter <simona@ffwll.ch>,
Andrzej Hajda <andrzej.hajda@intel.com>,
Neil Armstrong <neil.armstrong@linaro.org>,
Robert Foss <rfoss@kernel.org>,
Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
Jonas Karlman <jonas@kwiboo.se>,
Jernej Skrabec <jernej.skrabec@gmail.com>,
Jessica Zhang <jesszhan0024@gmail.com>,
Linus Walleij <linusw@kernel.org>,
Inki Dae <inki.dae@samsung.com>,
Jagan Teki <jagan@amarulasolutions.com>,
Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Albert Esteve <aesteve@redhat.com>,
Anusha Srivatsa <asrivats@redhat.com>,
Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>,
Hui Pu <Hui.Pu@gehealthcare.com>,
Ian Ray <ian.ray@gehealthcare.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Luca Ceresoli <luca.ceresoli@bootlin.com>
Subject: [PATCH RFC v2 19/19] drm/bridge: analogix_dp: don't create a panel_bridge
Date: Thu, 03 Sep 2026 10:11:22 +0200 [thread overview]
Message-ID: <20260903-drm-bridge-every-panel-v2-19-2ab8ee24538e@bootlin.com> (raw)
In-Reply-To: <20260903-drm-bridge-every-panel-v2-0-2ab8ee24538e@bootlin.com>
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 bridge
for the same panel.
Update and simplify the code by just getting a reference to the
already-existing bridge.
as of_drm_get_bridge_by_endpoint() returns a refcounted bridge, take care
of putting the bridge reference. This is not easily done in the remove path
due to the different probe paths of the user drivers, so add a devm action
to ensure the reference is put only when it was taken.
Assisted-by: opencode:deepseek-v4-flash-0731
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
drivers/gpu/drm/bridge/analogix/Kconfig | 2 --
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 40 +++++++++++++---------
drivers/gpu/drm/exynos/exynos_dp.c | 36 ++-----------------
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 9 -----
include/drm/bridge/analogix_dp.h | 1 -
5 files changed, 25 insertions(+), 63 deletions(-)
diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig
index d07431788fcb..1e7726c76361 100644
--- a/drivers/gpu/drm/bridge/analogix/Kconfig
+++ b/drivers/gpu/drm/bridge/analogix/Kconfig
@@ -34,8 +34,6 @@ config DRM_ANALOGIX_DP
depends on DRM
depends on OF
select DRM_DISPLAY_DP_AUX_BUS
- select DRM_PANEL
- select DRM_PANEL_BRIDGE
config DRM_ANALOGIX_ANX7625
tristate "Analogix Anx7625 MIPI to DP interface support"
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 566f1e5eb8cd..233bdaea8012 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -29,7 +29,6 @@
#include <drm/drm_device.h>
#include <drm/drm_edid.h>
#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
@@ -1491,15 +1490,6 @@ int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
if (ret)
goto err_unregister_aux;
- if (dp->plat_data->panel) {
- dp->plat_data->next_bridge = devm_drm_panel_bridge_add(dp->dev,
- dp->plat_data->panel);
- if (IS_ERR(dp->plat_data->next_bridge)) {
- ret = PTR_ERR(dp->plat_data->next_bridge);
- goto err_unregister_aux;
- }
- }
-
ret = drm_bridge_attach(dp->encoder, bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (ret) {
DRM_ERROR("failed to create bridge (%d)\n", ret);
@@ -1571,6 +1561,11 @@ struct drm_dp_aux *analogix_dp_get_aux(struct analogix_dp_device *dp)
}
EXPORT_SYMBOL_GPL(analogix_dp_get_aux);
+static void analogix_dp_put_bridge(void *data)
+{
+ drm_bridge_put(data);
+}
+
static int analogix_dp_aux_done_probing(struct drm_dp_aux *aux)
{
struct analogix_dp_device *dp = to_dp(aux);
@@ -1579,14 +1574,25 @@ static int analogix_dp_aux_done_probing(struct drm_dp_aux *aux)
int ret;
/*
- * If drm_of_find_panel_or_bridge() returns -ENODEV, there may be no valid panel
- * or bridge nodes. The driver should go on for the driver-free bridge or the DP
- * mode applications.
+ * If of_drm_get_bridge_by_endpoint() returns -ENODEV, there may be no
+ * valid panel or bridge nodes. The driver should go on for the
+ * driver-free bridge or the DP mode applications.
*/
- ret = drm_of_find_panel_or_bridge(dp->dev->of_node, port, 0,
- &plat_data->panel, &plat_data->next_bridge);
- if (ret && ret != -ENODEV)
- return ret;
+ plat_data->next_bridge = of_drm_get_bridge_by_endpoint(dp->dev->of_node,
+ port, 0);
+ if (IS_ERR(plat_data->next_bridge)) {
+ if (PTR_ERR(plat_data->next_bridge) == -ENODEV)
+ plat_data->next_bridge = NULL;
+ else
+ return PTR_ERR(plat_data->next_bridge);
+ }
+
+ if (plat_data->next_bridge) {
+ ret = devm_add_action_or_reset(dp->dev, analogix_dp_put_bridge,
+ plat_data->next_bridge);
+ if (ret)
+ return ret;
+ }
return component_add(dp->dev, plat_data->ops);
}
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index e1c9e2946b8a..82c238829921 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -26,7 +26,6 @@
#include <drm/drm_crtc.h>
#include <drm/drm_encoder.h>
#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
#include <drm/exynos_drm.h>
@@ -147,7 +146,6 @@ static const struct component_ops exynos_dp_ops = {
static int exynos_dp_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
- struct device_node *np;
struct exynos_dp_device *dp;
dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
@@ -163,18 +161,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
*/
platform_set_drvdata(pdev, dp);
- /* This is for the backward compatibility. */
- np = of_parse_phandle(dev->of_node, "panel", 0);
- if (np) {
- dp->plat_data.panel = of_drm_find_panel(np);
-
- of_node_put(np);
- if (IS_ERR(dp->plat_data.panel))
- return PTR_ERR(dp->plat_data.panel);
-
- goto out;
- }
-
if (of_get_display_timings(dev->of_node)) {
dp->plat_data.next_bridge = devm_drm_of_display_mode_bridge(dp->dev,
dp->dev->of_node,
@@ -189,19 +175,11 @@ static int exynos_dp_probe(struct platform_device *pdev)
dp->plat_data.power_off = exynos_dp_poweroff;
dp->plat_data.ops = &exynos_dp_ops;
-out:
dp->adp = analogix_dp_probe(dev, &dp->plat_data);
- if (IS_ERR(dp->adp)) {
- /*
- * The driver core does not invoke remove() for failed probes,
- * so release the probe-time panel reference here.
- */
- if (dp->plat_data.panel)
- drm_panel_put(dp->plat_data.panel);
+ if (IS_ERR(dp->adp))
return PTR_ERR(dp->adp);
- }
- if (dp->plat_data.panel || dp->plat_data.next_bridge)
+ if (dp->plat_data.next_bridge)
return component_add(&pdev->dev, &exynos_dp_ops);
else
return analogix_dp_finish_probe(dp->adp);
@@ -209,16 +187,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
static void exynos_dp_remove(struct platform_device *pdev)
{
- struct exynos_dp_device *dp = platform_get_drvdata(pdev);
-
- /*
- * Release the probe-time reference from of_drm_find_panel(). If bind
- * ran, the panel_bridge holds a second reference that devm cleanup
- * will release when the bridge is destroyed after remove() returns.
- */
- if (dp->plat_data.panel)
- drm_panel_put(dp->plat_data.panel);
-
component_del(&pdev->dev, &exynos_dp_ops);
}
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 587e60232ec7..071d31aa5288 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -28,7 +28,6 @@
#include <drm/drm_bridge_connector.h>
#include <drm/bridge/analogix_dp.h>
#include <drm/drm_of.h>
-#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
@@ -488,14 +487,6 @@ static void rockchip_dp_remove(struct platform_device *pdev)
{
struct rockchip_dp_device *dp = platform_get_drvdata(pdev);
- /*
- * Release the probe-time reference from of_drm_find_panel(). If bind
- * ran, the panel_bridge holds a second reference that devm cleanup
- * will release when the bridge is destroyed after remove() returns.
- */
- if (dp->plat_data.panel)
- drm_panel_put(dp->plat_data.panel);
-
component_del(&pdev->dev, &rockchip_dp_component_ops);
}
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
index 0e0b87abee59..6033137b651e 100644
--- a/include/drm/bridge/analogix_dp.h
+++ b/include/drm/bridge/analogix_dp.h
@@ -35,7 +35,6 @@ static inline bool analogix_dp_is_rockchip(enum analogix_dp_devtype type)
struct analogix_dp_plat_data {
enum analogix_dp_devtype dev_type;
- struct drm_panel *panel;
struct drm_bridge *next_bridge;
struct drm_encoder *encoder;
struct drm_connector *connector;
--
2.55.0
prev parent reply other threads:[~2026-09-03 8:14 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 8:11 [PATCH RFC v2 00/19] drm/panel: embed a drm_bridge into every drm_panel Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 01/19] drm: of: move drm_of_find_panel_or_bridge() from drm_of.c to bridge/panel.c Luca Ceresoli
2026-09-03 9:51 ` Maxime Ripard
2026-09-03 13:42 ` Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 02/19] drm/bridge: panel: move to a new module Luca Ceresoli
2026-09-03 9:59 ` Maxime Ripard
2026-09-03 8:11 ` [PATCH RFC v2 03/19] drm/panel: " Luca Ceresoli
2026-09-03 9:59 ` Maxime Ripard
2026-09-03 8:11 ` [PATCH RFC v2 04/19] drm/bridge: panel: rename drm_bridge_is_panel() -> drm_bridge_is_panel_bridge() Luca Ceresoli
2026-09-03 13:59 ` Albert Esteve
2026-09-03 15:38 ` Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 05/19] drm/panel: embed a drm_bridge into every drm_panel Luca Ceresoli
2026-09-03 10:22 ` Maxime Ripard
2026-09-03 13:37 ` Luca Ceresoli
2026-09-08 15:21 ` Maxime Ripard
2026-09-09 7:59 ` Luca Ceresoli
2026-09-08 16:18 ` Jani Nikula
2026-09-09 7:52 ` Luca Ceresoli
2026-09-09 9:57 ` Maxime Ripard
2026-09-09 14:02 ` Jani Nikula
2026-09-09 14:28 ` Maxime Ripard
2026-09-09 15:57 ` Jani Nikula
2026-09-10 7:03 ` Maxime Ripard
2026-09-03 8:11 ` [PATCH RFC v2 06/19] drm/bridge: tc358767: don't create a panel_bridge Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 07/19] drm/bridge: waveshare-dsi: " Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 08/19] drm/mcde: dsi: simplify device_node management using scoped for_each variant Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 09/19] drm/mcde: dsi: remove unused includes Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 10/19] drm/mcde: dsi: don't create a panel_bridge Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 11/19] drm/bridge: fsl-ldb: " Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 12/19] drm/bridge: samsung-dsim: " Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 13/19] drm/bridge: tc358768: " Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 14/19] drm/bridge: ssd2825: " Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 15/19] drm/omap: dsi: remove unused includes Luca Ceresoli
2026-09-03 10:24 ` Maxime Ripard
2026-09-03 8:11 ` [PATCH RFC v2 16/19] drm/omap: dss: don't create a panel_bridge Luca Ceresoli
2026-09-03 8:11 ` [PATCH RFC v2 17/19] drm/tve200: remove unused includes Luca Ceresoli
2026-09-03 10:25 ` Maxime Ripard
2026-09-03 8:11 ` [PATCH RFC v2 18/19] drm/tve200: don't create a panel_bridge Luca Ceresoli
2026-09-03 8:11 ` Luca Ceresoli [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260903-drm-bridge-every-panel-v2-19-2ab8ee24538e@bootlin.com \
--to=luca.ceresoli@bootlin.com \
--cc=Hui.Pu@gehealthcare.com \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=aesteve@redhat.com \
--cc=airlied@gmail.com \
--cc=andrzej.hajda@intel.com \
--cc=asrivats@redhat.com \
--cc=dmitry.baryshkov@oss.qualcomm.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=ian.ray@gehealthcare.com \
--cc=inki.dae@samsung.com \
--cc=jagan@amarulasolutions.com \
--cc=jernej.skrabec@gmail.com \
--cc=jesszhan0024@gmail.com \
--cc=jonas@kwiboo.se \
--cc=linusw@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=rfoss@kernel.org \
--cc=simona@ffwll.ch \
--cc=thomas.petazzoni@bootlin.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.