Initialize a connector by calling drm_bridge_connector_init() for
each encoder so that down stream bridge drivers don't need to create
connectors any more.
Signed-off-by: Liu Ying <victor.liu@nxp.com>
---
drivers/gpu/drm/mxsfb/Kconfig | 1 +
drivers/gpu/drm/mxsfb/lcdif_drv.c | 17 ++++++++++++++++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig
index 264e74f45554..06c95e556380 100644
--- a/drivers/gpu/drm/mxsfb/Kconfig
+++ b/drivers/gpu/drm/mxsfb/Kconfig
@@ -27,6 +27,7 @@ config DRM_IMX_LCDIF
depends on DRM && OF
depends on COMMON_CLK
depends on ARCH_MXC || COMPILE_TEST
+ select DRM_BRIDGE_CONNECTOR
select DRM_CLIENT_SELECTION
select DRM_MXS
select DRM_KMS_HELPER
diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c
index 58ccad9c425d..d4521da6675e 100644
--- a/drivers/gpu/drm/mxsfb/lcdif_drv.c
+++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c
@@ -16,7 +16,9 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
+#include <drm/drm_bridge_connector.h>
#include <drm/drm_client_setup.h>
+#include <drm/drm_connector.h>
#include <drm/drm_drv.h>
#include <drm/drm_encoder.h>
#include <drm/drm_fbdev_dma.h>
@@ -56,6 +58,7 @@ static int lcdif_attach_bridge(struct lcdif_drm_private *lcdif)
struct device_node *remote;
struct of_endpoint of_ep;
struct drm_encoder *encoder;
+ struct drm_connector *connector;
remote = of_graph_get_remote_port_parent(ep);
if (!of_device_is_available(remote)) {
@@ -97,13 +100,25 @@ 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(lcdif->drm, encoder);
+ if (IS_ERR(connector)) {
+ ret = PTR_ERR(connector);
+ dev_err(dev, "Failed to initialize bridge connector: %d\n",
+ ret);
+ of_node_put(ep);
+ return ret;
+ }
+
+ drm_connector_attach_encoder(connector, encoder);
}
return 0;
--
2.34.1
On Fri, Oct 18, 2024 at 02:48:13PM +0800, Liu Ying wrote: > Initialize a connector by calling drm_bridge_connector_init() for > each encoder so that down stream bridge drivers don't need to create > connectors any more. > > Signed-off-by: Liu Ying <victor.liu@nxp.com> > --- > drivers/gpu/drm/mxsfb/Kconfig | 1 + > drivers/gpu/drm/mxsfb/lcdif_drv.c | 17 ++++++++++++++++- > 2 files changed, 17 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig > index 264e74f45554..06c95e556380 100644 > --- a/drivers/gpu/drm/mxsfb/Kconfig > +++ b/drivers/gpu/drm/mxsfb/Kconfig > @@ -27,6 +27,7 @@ config DRM_IMX_LCDIF > depends on DRM && OF > depends on COMMON_CLK > depends on ARCH_MXC || COMPILE_TEST > + select DRM_BRIDGE_CONNECTOR > select DRM_CLIENT_SELECTION Missing `select DRM_DISPLAY_HELPER`. LGTM otherwise. > select DRM_MXS > select DRM_KMS_HELPER > diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c > index 58ccad9c425d..d4521da6675e 100644 > --- a/drivers/gpu/drm/mxsfb/lcdif_drv.c > +++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c > @@ -16,7 +16,9 @@ > > #include <drm/drm_atomic_helper.h> > #include <drm/drm_bridge.h> > +#include <drm/drm_bridge_connector.h> > #include <drm/drm_client_setup.h> > +#include <drm/drm_connector.h> > #include <drm/drm_drv.h> > #include <drm/drm_encoder.h> > #include <drm/drm_fbdev_dma.h> > @@ -56,6 +58,7 @@ static int lcdif_attach_bridge(struct lcdif_drm_private *lcdif) > struct device_node *remote; > struct of_endpoint of_ep; > struct drm_encoder *encoder; > + struct drm_connector *connector; > > remote = of_graph_get_remote_port_parent(ep); > if (!of_device_is_available(remote)) { > @@ -97,13 +100,25 @@ 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(lcdif->drm, encoder); > + if (IS_ERR(connector)) { > + ret = PTR_ERR(connector); > + dev_err(dev, "Failed to initialize bridge connector: %d\n", > + ret); > + of_node_put(ep); > + return ret; > + } > + > + drm_connector_attach_encoder(connector, encoder); > } > > return 0; > -- > 2.34.1 > -- With best wishes Dmitry
On 10/18/2024, Dmitry Baryshkov wrote: > On Fri, Oct 18, 2024 at 02:48:13PM +0800, Liu Ying wrote: >> Initialize a connector by calling drm_bridge_connector_init() for >> each encoder so that down stream bridge drivers don't need to create >> connectors any more. >> >> Signed-off-by: Liu Ying <victor.liu@nxp.com> >> --- >> drivers/gpu/drm/mxsfb/Kconfig | 1 + >> drivers/gpu/drm/mxsfb/lcdif_drv.c | 17 ++++++++++++++++- >> 2 files changed, 17 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig >> index 264e74f45554..06c95e556380 100644 >> --- a/drivers/gpu/drm/mxsfb/Kconfig >> +++ b/drivers/gpu/drm/mxsfb/Kconfig >> @@ -27,6 +27,7 @@ config DRM_IMX_LCDIF >> depends on DRM && OF >> depends on COMMON_CLK >> depends on ARCH_MXC || COMPILE_TEST >> + select DRM_BRIDGE_CONNECTOR >> select DRM_CLIENT_SELECTION > > Missing `select DRM_DISPLAY_HELPER`. LGTM otherwise. Ack. > >> select DRM_MXS >> select DRM_KMS_HELPER >> diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c >> index 58ccad9c425d..d4521da6675e 100644 >> --- a/drivers/gpu/drm/mxsfb/lcdif_drv.c >> +++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c >> @@ -16,7 +16,9 @@ >> >> #include <drm/drm_atomic_helper.h> >> #include <drm/drm_bridge.h> >> +#include <drm/drm_bridge_connector.h> >> #include <drm/drm_client_setup.h> >> +#include <drm/drm_connector.h> >> #include <drm/drm_drv.h> >> #include <drm/drm_encoder.h> >> #include <drm/drm_fbdev_dma.h> >> @@ -56,6 +58,7 @@ static int lcdif_attach_bridge(struct lcdif_drm_private *lcdif) >> struct device_node *remote; >> struct of_endpoint of_ep; >> struct drm_encoder *encoder; >> + struct drm_connector *connector; >> >> remote = of_graph_get_remote_port_parent(ep); >> if (!of_device_is_available(remote)) { >> @@ -97,13 +100,25 @@ 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(lcdif->drm, encoder); >> + if (IS_ERR(connector)) { >> + ret = PTR_ERR(connector); >> + dev_err(dev, "Failed to initialize bridge connector: %d\n", >> + ret); >> + of_node_put(ep); >> + return ret; >> + } >> + >> + drm_connector_attach_encoder(connector, encoder); >> } >> >> return 0; >> -- >> 2.34.1 >> > -- Regards, Liu Ying
Hi, Am Freitag, 18. Oktober 2024, 08:48:13 CEST schrieb Liu Ying: > Initialize a connector by calling drm_bridge_connector_init() for > each encoder so that down stream bridge drivers don't need to create > connectors any more. > > Signed-off-by: Liu Ying <victor.liu@nxp.com> I've tested this using HDMI output. HPD and CEC is still working. Also output using a DSI->DP bridge (tc358767) also works. My platform: imx8mp-tqma8mpql-mba8mpxl.dts Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com> > --- > drivers/gpu/drm/mxsfb/Kconfig | 1 + > drivers/gpu/drm/mxsfb/lcdif_drv.c | 17 ++++++++++++++++- > 2 files changed, 17 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig > index 264e74f45554..06c95e556380 100644 > --- a/drivers/gpu/drm/mxsfb/Kconfig > +++ b/drivers/gpu/drm/mxsfb/Kconfig > @@ -27,6 +27,7 @@ config DRM_IMX_LCDIF > depends on DRM && OF > depends on COMMON_CLK > depends on ARCH_MXC || COMPILE_TEST > + select DRM_BRIDGE_CONNECTOR > select DRM_CLIENT_SELECTION > select DRM_MXS > select DRM_KMS_HELPER > diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c > index 58ccad9c425d..d4521da6675e 100644 > --- a/drivers/gpu/drm/mxsfb/lcdif_drv.c > +++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c > @@ -16,7 +16,9 @@ > > #include <drm/drm_atomic_helper.h> > #include <drm/drm_bridge.h> > +#include <drm/drm_bridge_connector.h> > #include <drm/drm_client_setup.h> > +#include <drm/drm_connector.h> > #include <drm/drm_drv.h> > #include <drm/drm_encoder.h> > #include <drm/drm_fbdev_dma.h> > @@ -56,6 +58,7 @@ static int lcdif_attach_bridge(struct lcdif_drm_private *lcdif) > struct device_node *remote; > struct of_endpoint of_ep; > struct drm_encoder *encoder; > + struct drm_connector *connector; > > remote = of_graph_get_remote_port_parent(ep); > if (!of_device_is_available(remote)) { > @@ -97,13 +100,25 @@ 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(lcdif->drm, encoder); > + if (IS_ERR(connector)) { > + ret = PTR_ERR(connector); > + dev_err(dev, "Failed to initialize bridge connector: %d\n", > + ret); > + of_node_put(ep); > + return ret; > + } > + > + drm_connector_attach_encoder(connector, encoder); > } > > return 0; > -- TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany Amtsgericht München, HRB 105018 Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider http://www.tq-group.com/
© 2016 - 2024 Red Hat, Inc.