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 <ma...@denx.de>
> ---
> Cc: Andrzej Hajda <andrzej.ha...@intel.com>
> Cc: David Airlie <airl...@gmail.com>
> Cc: Fabio Estevam <feste...@gmail.com>
> Cc: Jernej Skrabec <jernej.skra...@gmail.com>
> Cc: Jonas Karlman <jo...@kwiboo.se>
> Cc: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> Cc: Liu Ying <victor....@nxp.com>
> Cc: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
> Cc: Maxime Ripard <mrip...@kernel.org>
> Cc: Neil Armstrong <neil.armstr...@linaro.org>
> Cc: Pengutronix Kernel Team <ker...@pengutronix.de>
> Cc: Robert Foss <rf...@kernel.org>
> Cc: Sascha Hauer <s.ha...@pengutronix.de>
> Cc: Shawn Guo <shawn...@kernel.org>
> Cc: Simona Vetter <sim...@ffwll.ch>
> Cc: Stefan Agner <ste...@agner.ch>
> Cc: Thomas Zimmermann <tzimmerm...@suse.de>
> Cc: dri-devel@lists.freedesktop.org
> Cc: i...@lists.linux.dev
> Cc: linux-arm-ker...@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

Reply via email to