[PATCH v8 3/5] drm/imx/dcss: use drm_bridge_connector API
From: Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
Date: 2020-07-24 09:08:34
Also in:
dri-devel, lkml
Subsystem:
drm drivers, drm drivers and misc gpu patches, nxp i.mx 8mq dcss driver, the rest · Maintainers:
David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Laurentiu Palcu, Linus Torvalds
From: Laurentiu Palcu <redacted> Make use of drm_bridge_connector API to have the connector initialized by the display controller. Signed-off-by: Laurentiu Palcu <redacted> CC: Sam Ravnborg <redacted> CC: Laurent Pinchart <laurent.pinchart@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
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel