Message ID | 20241224014701.253490-2-marex@denx.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2,1/3] drm/bridge: imx8mp-hdmi-tx: switch to bridge DRM_BRIDGE_ATTACH_NO_CONNECTOR | expand |
On 12/24/2024, 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.baryshkov@linaro.org> > Signed-off-by: Marek Vasut <marex@denx.de> > --- > Cc: Andrzej Hajda <andrzej.hajda@intel.com> > Cc: David Airlie <airlied@gmail.com> > Cc: Fabio Estevam <festevam@gmail.com> > Cc: Jernej Skrabec <jernej.skrabec@gmail.com> > Cc: Jonas Karlman <jonas@kwiboo.se> > Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com> > Cc: Liu Ying <victor.liu@nxp.com> > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > Cc: Maxime Ripard <mripard@kernel.org> > Cc: Neil Armstrong <neil.armstrong@linaro.org> > Cc: Pengutronix Kernel Team <kernel@pengutronix.de> > Cc: Robert Foss <rfoss@kernel.org> > Cc: Sascha Hauer <s.hauer@pengutronix.de> > Cc: Shawn Guo <shawnguo@kernel.org> > Cc: Simona Vetter <simona@ffwll.ch> > Cc: Stefan Agner <stefan@agner.ch> > Cc: Thomas Zimmermann <tzimmermann@suse.de> > Cc: dri-devel@lists.freedesktop.org > Cc: imx@lists.linux.dev > Cc: linux-arm-kernel@lists.infradead.org > --- > V2: Add RB from Dmitry > --- > drivers/gpu/drm/mxsfb/Kconfig | 1 + > drivers/gpu/drm/mxsfb/lcdif_drv.c | 23 ++++++++++++++++++++++- > 2 files changed, 23 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig > index 264e74f455547..07fb6901996ae 100644 > --- a/drivers/gpu/drm/mxsfb/Kconfig > +++ b/drivers/gpu/drm/mxsfb/Kconfig > @@ -30,6 +30,7 @@ config DRM_IMX_LCDIF > select DRM_CLIENT_SELECTION > select DRM_MXS > select DRM_KMS_HELPER > + select DRM_BRIDGE_CONNECTOR Select DRM_DISPLAY_HELPER. > select DRM_GEM_DMA_HELPER > select DRM_PANEL > select DRM_PANEL_BRIDGE > diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c > index 8ee00f59ca821..40dfbc3e6118e 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,6 +49,8 @@ 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; > int ret; > @@ -97,13 +100,31 @@ 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); > } > + > + connector = drm_bridge_connector_init(drm, encoder); > + if (IS_ERR(connector)) { of_node_put(ep); > + ret = PTR_ERR(connector); > + dev_err_probe(drm->dev, ret, > + "Failed to initialize bridge connector: %pe\n", > + connector); return dev_err_probe(dev, PTR_ERR(connector), "Failed to initialize bridge connector: %pe\n", connector); > + return ret; > + } > + > + ret = drm_connector_attach_encoder(connector, encoder); > + if (ret < 0) { of_node_put(ep); > + dev_err_probe(drm->dev, ret, > + "Failed to attach encoder.\n"); It looks like no one else calls dev_err_probe() when drm_connector_attach_encoder() fails, plus drm_connector_attach_encoder() doesn't return -EPROBE_DEFER at all. > + drm_connector_cleanup(connector); > + return ret; > + } > } > > return 0;
On 12/30/24 8:18 AM, Liu Ying wrote: [...] >> diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig >> index 264e74f455547..07fb6901996ae 100644 >> --- a/drivers/gpu/drm/mxsfb/Kconfig >> +++ b/drivers/gpu/drm/mxsfb/Kconfig >> @@ -30,6 +30,7 @@ config DRM_IMX_LCDIF >> select DRM_CLIENT_SELECTION >> select DRM_MXS >> select DRM_KMS_HELPER >> + select DRM_BRIDGE_CONNECTOR > > Select DRM_DISPLAY_HELPER. Without select DRM_BRIDGE_CONNECTOR, the drm_bridge_connector_init() is not defined .
On Mon, Dec 30, 2024 at 11:11:35PM +0100, Marek Vasut wrote: > On 12/30/24 8:18 AM, Liu Ying wrote: > > [...] > > > > diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig > > > index 264e74f455547..07fb6901996ae 100644 > > > --- a/drivers/gpu/drm/mxsfb/Kconfig > > > +++ b/drivers/gpu/drm/mxsfb/Kconfig > > > @@ -30,6 +30,7 @@ config DRM_IMX_LCDIF > > > select DRM_CLIENT_SELECTION > > > select DRM_MXS > > > select DRM_KMS_HELPER > > > + select DRM_BRIDGE_CONNECTOR > > > > Select DRM_DISPLAY_HELPER. > Without select DRM_BRIDGE_CONNECTOR, the drm_bridge_connector_init() is not > defined . You need both.
diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig index 264e74f455547..07fb6901996ae 100644 --- a/drivers/gpu/drm/mxsfb/Kconfig +++ b/drivers/gpu/drm/mxsfb/Kconfig @@ -30,6 +30,7 @@ config DRM_IMX_LCDIF 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/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c index 8ee00f59ca821..40dfbc3e6118e 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,6 +49,8 @@ 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; int ret; @@ -97,13 +100,31 @@ 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); } + + connector = drm_bridge_connector_init(drm, 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; + } + + ret = drm_connector_attach_encoder(connector, encoder); + if (ret < 0) { + dev_err_probe(drm->dev, ret, + "Failed to attach encoder.\n"); + drm_connector_cleanup(connector); + return ret; + } } return 0;