From: Laurentiu Palcu <laurentiu.pa...@nxp.com>

Make use of drm_bridge_connector API to have the connector initialized by the
display controller.

Signed-off-by: Laurentiu Palcu <laurentiu.pa...@nxp.com>
CC: Sam Ravnborg <s...@ravnborg.org>
CC: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
---
 drivers/gpu/drm/imx/dcss/dcss-dev.c | 17 +++++++++++++---
 drivers/gpu/drm/imx/dcss/dcss-kms.c | 31 ++++++++++++++++++++++++-----
 drivers/gpu/drm/imx/dcss/dcss-kms.h |  1 +
 3 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/imx/dcss/dcss-dev.c 
b/drivers/gpu/drm/imx/dcss/dcss-dev.c
index 83a4840435cf..c849533ca83e 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-dev.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-dev.c
@@ -8,9 +8,12 @@
 #include <linux/of_graph.h>
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
+#include <drm/drm_bridge_connector.h>
+#include <drm/drm_device.h>
 #include <drm/drm_modeset_helper.h>
 
 #include "dcss-dev.h"
+#include "dcss-kms.h"
 
 static void dcss_clocks_enable(struct dcss_dev *dcss)
 {
@@ -247,9 +250,13 @@ void dcss_dev_destroy(struct dcss_dev *dcss)
 int dcss_dev_suspend(struct device *dev)
 {
        struct dcss_dev *dcss = dcss_drv_dev_to_dcss(dev);
+       struct drm_device *ddev = dcss_drv_dev_to_drm(dev);
+       struct dcss_kms_dev *kms = container_of(ddev, struct dcss_kms_dev, 
base);
        int ret;
 
-       drm_mode_config_helper_suspend(dcss_drv_dev_to_drm(dev));
+       drm_bridge_connector_disable_hpd(kms->connector);
+
+       drm_mode_config_helper_suspend(ddev);
 
        if (pm_runtime_suspended(dev))
                return 0;
@@ -266,9 +273,11 @@ int dcss_dev_suspend(struct device *dev)
 int dcss_dev_resume(struct device *dev)
 {
        struct dcss_dev *dcss = dcss_drv_dev_to_dcss(dev);
+       struct drm_device *ddev = dcss_drv_dev_to_drm(dev);
+       struct dcss_kms_dev *kms = container_of(ddev, struct dcss_kms_dev, 
base);
 
        if (pm_runtime_suspended(dev)) {
-               drm_mode_config_helper_resume(dcss_drv_dev_to_drm(dev));
+               drm_mode_config_helper_resume(ddev);
                return 0;
        }
 
@@ -278,7 +287,9 @@ int dcss_dev_resume(struct device *dev)
 
        dcss_ctxld_resume(dcss->ctxld);
 
-       drm_mode_config_helper_resume(dcss_drv_dev_to_drm(dev));
+       drm_mode_config_helper_resume(ddev);
+
+       drm_bridge_connector_enable_hpd(kms->connector);
 
        return 0;
 }
diff --git a/drivers/gpu/drm/imx/dcss/dcss-kms.c 
b/drivers/gpu/drm/imx/dcss/dcss-kms.c
index 3ca49d0a3e61..135a62366ab8 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-kms.c
+++ b/drivers/gpu/drm/imx/dcss/dcss-kms.c
@@ -5,6 +5,7 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_bridge_connector.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -74,7 +75,7 @@ static const struct drm_encoder_funcs 
dcss_kms_simple_encoder_funcs = {
        .destroy = drm_encoder_cleanup,
 };
 
-static int dcss_kms_setup_encoder(struct dcss_kms_dev *kms)
+static int dcss_kms_bridge_connector_init(struct dcss_kms_dev *kms)
 {
        struct drm_device *ddev = &kms->base;
        struct drm_encoder *encoder = &kms->encoder;
@@ -103,7 +104,23 @@ static int dcss_kms_setup_encoder(struct dcss_kms_dev *kms)
                return ret;
        }
 
-       return drm_bridge_attach(encoder, bridge, NULL, 0);
+       ret = drm_bridge_attach(encoder, bridge, NULL,
+                               DRM_BRIDGE_ATTACH_NO_CONNECTOR);
+       if (ret < 0) {
+               dev_err(ddev->dev, "Unable to attach bridge %pOF\n",
+                       bridge->of_node);
+               return ret;
+       }
+
+       kms->connector = drm_bridge_connector_init(ddev, encoder);
+       if (IS_ERR(kms->connector)) {
+               dev_err(ddev->dev, "Unable to create bridge connector.\n");
+               return PTR_ERR(kms->connector);
+       }
+
+       drm_connector_attach_encoder(kms->connector, encoder);
+
+       return 0;
 }
 
 struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss)
@@ -131,18 +148,20 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev 
*dcss)
 
        drm->irq_enabled = true;
 
-       ret = dcss_crtc_init(crtc, drm);
+       ret = dcss_kms_bridge_connector_init(kms);
        if (ret)
                goto cleanup_mode_config;
 
-       ret = dcss_kms_setup_encoder(kms);
+       ret = dcss_crtc_init(crtc, drm);
        if (ret)
-               goto cleanup_crtc;
+               goto cleanup_mode_config;
 
        drm_mode_config_reset(drm);
 
        drm_kms_helper_poll_init(drm);
 
+       drm_bridge_connector_enable_hpd(kms->connector);
+
        ret = drm_dev_register(drm, 0);
        if (ret)
                goto cleanup_crtc;
@@ -152,6 +171,7 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss)
        return kms;
 
 cleanup_crtc:
+       drm_bridge_connector_disable_hpd(kms->connector);
        drm_kms_helper_poll_fini(drm);
        dcss_crtc_deinit(crtc, drm);
 
@@ -167,6 +187,7 @@ void dcss_kms_detach(struct dcss_kms_dev *kms)
        struct drm_device *drm = &kms->base;
 
        drm_dev_unregister(drm);
+       drm_bridge_connector_disable_hpd(kms->connector);
        drm_kms_helper_poll_fini(drm);
        drm_atomic_helper_shutdown(drm);
        drm_crtc_vblank_off(&kms->crtc.base);
diff --git a/drivers/gpu/drm/imx/dcss/dcss-kms.h 
b/drivers/gpu/drm/imx/dcss/dcss-kms.h
index 1f51c86c6986..dfe5dd99eea3 100644
--- a/drivers/gpu/drm/imx/dcss/dcss-kms.h
+++ b/drivers/gpu/drm/imx/dcss/dcss-kms.h
@@ -29,6 +29,7 @@ struct dcss_kms_dev {
        struct drm_device base;
        struct dcss_crtc crtc;
        struct drm_encoder encoder;
+       struct drm_connector *connector;
 };
 
 struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss);
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to