[PATCH 3/3] drm/mxsfb: add DRM_BRIDGE_ATTACH_NO_CONNECTOR flag to drm_bridge_attach
Dmitry Baryshkov
dmitry.baryshkov at linaro.org
Tue Dec 24 01:06:14 UTC 2024
On Tue, Dec 24, 2024 at 01:42:49AM +0100, Marek Vasut wrote:
> Commit a25b988ff83f ("drm/bridge: Extend bridge API to disable connector creation")
> added DRM_BRIDGE_ATTACH_NO_CONNECTOR bridge flag and all bridges handle
> this flag in some way since then.
> Newly added bridge drivers must no longer contain the connector creation and
> will fail probing if this flag isn't set.
>
> In order to be able to connect to those newly added bridges as well,
> make use of drm_bridge_connector API and have the connector initialized
> by the display controller.
>
> Based on 2e87bf389e13 ("drm/rockchip: add DRM_BRIDGE_ATTACH_NO_CONNECTOR flag to drm_bridge_attach")
>
> This makes LT9611 work with i.MX8M Mini.
>
> Signed-off-by: Marek Vasut <marex at denx.de>
> ---
> Cc: Andrzej Hajda <andrzej.hajda at intel.com>
> Cc: David Airlie <airlied at gmail.com>
> Cc: Fabio Estevam <festevam at gmail.com>
> Cc: Jernej Skrabec <jernej.skrabec at gmail.com>
> Cc: Jonas Karlman <jonas at kwiboo.se>
> Cc: Laurent Pinchart <Laurent.pinchart at ideasonboard.com>
> Cc: Liu Ying <victor.liu at nxp.com>
> Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> Cc: Maxime Ripard <mripard at kernel.org>
> Cc: Neil Armstrong <neil.armstrong at linaro.org>
> Cc: Pengutronix Kernel Team <kernel at pengutronix.de>
> Cc: Robert Foss <rfoss at kernel.org>
> Cc: Sascha Hauer <s.hauer at pengutronix.de>
> Cc: Shawn Guo <shawnguo at kernel.org>
> Cc: Simona Vetter <simona at ffwll.ch>
> Cc: Stefan Agner <stefan at agner.ch>
> Cc: Thomas Zimmermann <tzimmermann at suse.de>
> Cc: dri-devel at lists.freedesktop.org
> Cc: imx at lists.linux.dev
> Cc: linux-arm-kernel at lists.infradead.org
> ---
> drivers/gpu/drm/mxsfb/Kconfig | 1 +
> drivers/gpu/drm/mxsfb/mxsfb_drv.c | 36 +++++++++++++++++++++----------
> drivers/gpu/drm/mxsfb/mxsfb_drv.h | 2 +-
> drivers/gpu/drm/mxsfb/mxsfb_kms.c | 6 +++---
> 4 files changed, 30 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig
> index 07fb6901996ae..e67de148955b2 100644
> --- a/drivers/gpu/drm/mxsfb/Kconfig
> +++ b/drivers/gpu/drm/mxsfb/Kconfig
> @@ -12,6 +12,7 @@ config DRM_MXSFB
> select DRM_CLIENT_SELECTION
> select DRM_MXS
> select DRM_KMS_HELPER
> + select DRM_BRIDGE_CONNECTOR
> select DRM_GEM_DMA_HELPER
> select DRM_PANEL
> select DRM_PANEL_BRIDGE
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
> index 59020862cf65e..d034c21e186a4 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
> @@ -20,6 +20,7 @@
> #include <drm/clients/drm_client_setup.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_bridge.h>
> +#include <drm/drm_bridge_connector.h>
> #include <drm/drm_connector.h>
> #include <drm/drm_drv.h>
> #include <drm/drm_fbdev_dma.h>
> @@ -118,10 +119,10 @@ static const struct drm_mode_config_helper_funcs mxsfb_mode_config_helpers = {
>
> static int mxsfb_attach_bridge(struct mxsfb_drm_private *mxsfb)
> {
> + struct drm_connector *connector = &mxsfb->connector;
Drop the initialisation, it is useless.
> struct drm_device *drm = mxsfb->drm;
> - struct drm_connector_list_iter iter;
> - struct drm_panel *panel;
> struct drm_bridge *bridge;
> + struct drm_panel *panel;
> int ret;
>
> ret = drm_of_find_panel_or_bridge(drm->dev->of_node, 0, 0, &panel,
> @@ -139,21 +140,34 @@ static int mxsfb_attach_bridge(struct mxsfb_drm_private *mxsfb)
> if (!bridge)
> return -ENODEV;
>
> - ret = drm_bridge_attach(&mxsfb->encoder, bridge, NULL, 0);
> + ret = drm_bridge_attach(&mxsfb->encoder, bridge, NULL,
> + DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> if (ret)
> return dev_err_probe(drm->dev, ret, "Failed to attach bridge\n");
>
> - mxsfb->bridge = bridge;
> + connector = drm_bridge_connector_init(drm, &mxsfb->encoder);
> + if (IS_ERR(connector)) {
> + ret = PTR_ERR(connector);
> + dev_err_probe(drm->dev, ret,
> + "Failed to initialize bridge connector: %pe\n",
> + connector);
> + return ret;
> + }
>
> - /*
> - * Get hold of the connector. This is a bit of a hack, until the bridge
> - * API gives us bus flags and formats.
> - */
> - drm_connector_list_iter_begin(drm, &iter);
> - mxsfb->connector = drm_connector_list_iter_next(&iter);
> - drm_connector_list_iter_end(&iter);
> + ret = drm_connector_attach_encoder(connector, &mxsfb->encoder);
> + if (ret < 0) {
> + dev_err_probe(drm->dev, ret,
> + "Failed to attach encoder.\n");
> + goto err_cleanup_connector;
> + }
> +
> + mxsfb->bridge = bridge;
>
> return 0;
> +
> +err_cleanup_connector:
> + drm_connector_cleanup(connector);
> + return ret;
> }
>
> static irqreturn_t mxsfb_irq_handler(int irq, void *data)
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.h b/drivers/gpu/drm/mxsfb/mxsfb_drv.h
> index d160d921b25fc..7a24e96ab4263 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.h
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.h
> @@ -43,7 +43,7 @@ struct mxsfb_drm_private {
> } planes;
> struct drm_crtc crtc;
> struct drm_encoder encoder;
> - struct drm_connector *connector;
> + struct drm_connector connector;
This connector isn't getting used. How is this supposed to work? Store
the connector that you got from drm_bridge_connector_init() here
instead.
> struct drm_bridge *bridge;
>
> bool crc_active;
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> index 7ed2516b6de05..30584091e2aa8 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
> @@ -281,7 +281,7 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb,
> {
> struct drm_device *drm = mxsfb->crtc.dev;
> struct drm_display_mode *m = &mxsfb->crtc.state->adjusted_mode;
> - u32 bus_flags = mxsfb->connector->display_info.bus_flags;
> + u32 bus_flags = mxsfb->connector.display_info.bus_flags;
> int err;
>
> if (mxsfb->bridge && mxsfb->bridge->timings)
> @@ -378,8 +378,8 @@ static void mxsfb_crtc_atomic_enable(struct drm_crtc *crtc,
> }
>
> /* If there is no bridge, use bus format from connector */
> - if (!bus_format && mxsfb->connector->display_info.num_bus_formats)
> - bus_format = mxsfb->connector->display_info.bus_formats[0];
> + if (!bus_format && mxsfb->connector.display_info.num_bus_formats)
> + bus_format = mxsfb->connector.display_info.bus_formats[0];
>
> /* If all else fails, default to RGB888_1X24 */
> if (!bus_format)
> --
> 2.45.2
>
--
With best wishes
Dmitry
More information about the dri-devel
mailing list