drm/imx/dcss: use drm_bridge_connector API
authorLaurentiu Palcu <laurentiu.palcu@nxp.com>
Fri, 31 Jul 2020 08:18:31 +0000 (11:18 +0300)
committerLucas Stach <l.stach@pengutronix.de>
Wed, 9 Sep 2020 14:39:49 +0000 (16:39 +0200)
Make use of drm_bridge_connector API to have the connector initialized by the
display controller.

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20200731081836.3048-4-laurentiu.palcu@oss.nxp.com
drivers/gpu/drm/imx/dcss/dcss-dev.c
drivers/gpu/drm/imx/dcss/dcss-kms.c
drivers/gpu/drm/imx/dcss/dcss-kms.h

index 83a4840..c849533 100644 (file)
@@ -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;
 }
index 3ca49d0..135a623 100644 (file)
@@ -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);
index 1f51c86..dfe5dd9 100644 (file)
@@ -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);