On Tue, Dec 31, 2024 at 08:28:50PM +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 Plus.
> 
> Reviewed-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
> 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
> ---
> V2: Add RB from Dmitry
> V3: - Select DRM_DISPLAY_HELPER
>     - Use return dev_err_probe() directly
>     - Add missing of_node_put(ep)
>     - Add test using drm_bridge_get_next_bridge() to try and determine
>       if the HDMI connector was missing in DT or not, and if it was
>       missing, if it was created by the HDMI bridge driver.
> ---
>  drivers/gpu/drm/mxsfb/Kconfig     |  2 ++
>  drivers/gpu/drm/mxsfb/lcdif_drv.c | 30 ++++++++++++++++++++++++++++--
>  2 files changed, 30 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig
> index 264e74f455547..fe98674d5a298 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

Shouldn't this chunk go to another patch?

>       select DRM_GEM_DMA_HELPER
>       select DRM_PANEL
>       select DRM_PANEL_BRIDGE
> @@ -28,6 +29,7 @@ config DRM_IMX_LCDIF
>       depends on COMMON_CLK
>       depends on ARCH_MXC || COMPILE_TEST
>       select DRM_CLIENT_SELECTION
> +     select DRM_DISPLAY_HELPER
>       select DRM_MXS
>       select DRM_KMS_HELPER
>       select DRM_GEM_DMA_HELPER
> diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c 
> b/drivers/gpu/drm/mxsfb/lcdif_drv.c
> index 8ee00f59ca821..dc39adabb3cd9 100644
> --- a/drivers/gpu/drm/mxsfb/lcdif_drv.c
> +++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c
> @@ -17,6 +17,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_drv.h>
>  #include <drm/drm_encoder.h>
>  #include <drm/drm_fbdev_dma.h>
> @@ -48,8 +49,10 @@ static const struct drm_encoder_funcs lcdif_encoder_funcs 
> = {
>  static int lcdif_attach_bridge(struct lcdif_drm_private *lcdif)
>  {
>       struct device *dev = lcdif->drm->dev;
> +     struct drm_device *drm = lcdif->drm;
> +     struct drm_connector *connector;
>       struct device_node *ep;
> -     struct drm_bridge *bridge;
> +     struct drm_bridge *bridge, *nextbridge;
>       int ret;
>  
>       for_each_endpoint_of_node(dev->of_node, ep) {
> @@ -97,13 +100,36 @@ static int lcdif_attach_bridge(struct lcdif_drm_private 
> *lcdif)
>                       return ret;
>               }
>  
> -             ret = drm_bridge_attach(encoder, bridge, NULL, 0);
> +             ret = drm_bridge_attach(encoder, bridge, NULL,
> +                                     DRM_BRIDGE_ATTACH_NO_CONNECTOR);
>               if (ret) {
>                       of_node_put(ep);
>                       return dev_err_probe(dev, ret,
>                                            "Failed to attach bridge for 
> endpoint%u\n",
>                                            of_ep.id);
>               }
> +
> +             nextbridge = drm_bridge_get_next_bridge(bridge);
> +             nextbridge = drm_bridge_get_next_bridge(nextbridge);
> +             /* Test if connector node in DT, if not, it was created already 
> */

By whom? And why? There is no display-connector bridge, but there is a
normal bridge chain, you have passed DRM_BRIDGE_ATTACH_NO_CONNECTOR, so
now it's a proper time to create drm_bridge_connector. You have added
the next_bridge_optional flag, but it should just prevent the dw driver
from returning the error if there is no next_bridge.

> +             if (!nextbridge)
> +                     continue;
> +
> +             connector = drm_bridge_connector_init(drm, encoder);
> +             if (IS_ERR(connector)) {
> +                     of_node_put(ep);
> +                     return dev_err_probe(drm->dev, PTR_ERR(connector),
> +                                          "Failed to initialize bridge 
> connector: %pe\n",
> +                                          connector);
> +             }
> +
> +             ret = drm_connector_attach_encoder(connector, encoder);
> +             if (ret < 0) {
> +                     of_node_put(ep);
> +                     drm_connector_cleanup(connector);
> +                     return dev_err_probe(drm->dev, ret,
> +                                          "Failed to attach encoder.\n");
> +             }
>       }
>  
>       return 0;
> -- 
> 2.45.2
> 

-- 
With best wishes
Dmitry

Reply via email to