Commit e7033bdf authored by Laurentiu Palcu's avatar Laurentiu Palcu Committed by Lucas Stach

drm/imx/dcss: use drm_bridge_connector API

Make use of drm_bridge_connector API to have the connector initialized by the
display controller.
Signed-off-by: default avatarLaurentiu Palcu <laurentiu.palcu@nxp.com>
Signed-off-by: default avatarLucas Stach <l.stach@pengutronix.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20200731081836.3048-4-laurentiu.palcu@oss.nxp.com
parent 9021c317
...@@ -8,9 +8,12 @@ ...@@ -8,9 +8,12 @@
#include <linux/of_graph.h> #include <linux/of_graph.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <drm/drm_bridge_connector.h>
#include <drm/drm_device.h>
#include <drm/drm_modeset_helper.h> #include <drm/drm_modeset_helper.h>
#include "dcss-dev.h" #include "dcss-dev.h"
#include "dcss-kms.h"
static void dcss_clocks_enable(struct dcss_dev *dcss) static void dcss_clocks_enable(struct dcss_dev *dcss)
{ {
...@@ -247,9 +250,13 @@ void dcss_dev_destroy(struct dcss_dev *dcss) ...@@ -247,9 +250,13 @@ void dcss_dev_destroy(struct dcss_dev *dcss)
int dcss_dev_suspend(struct device *dev) int dcss_dev_suspend(struct device *dev)
{ {
struct dcss_dev *dcss = dcss_drv_dev_to_dcss(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; 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)) if (pm_runtime_suspended(dev))
return 0; return 0;
...@@ -266,9 +273,11 @@ int dcss_dev_suspend(struct device *dev) ...@@ -266,9 +273,11 @@ int dcss_dev_suspend(struct device *dev)
int dcss_dev_resume(struct device *dev) int dcss_dev_resume(struct device *dev)
{ {
struct dcss_dev *dcss = dcss_drv_dev_to_dcss(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)) { if (pm_runtime_suspended(dev)) {
drm_mode_config_helper_resume(dcss_drv_dev_to_drm(dev)); drm_mode_config_helper_resume(ddev);
return 0; return 0;
} }
...@@ -278,7 +287,9 @@ int dcss_dev_resume(struct device *dev) ...@@ -278,7 +287,9 @@ int dcss_dev_resume(struct device *dev)
dcss_ctxld_resume(dcss->ctxld); 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; return 0;
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <drm/drm_atomic.h> #include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h> #include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge_connector.h>
#include <drm/drm_drv.h> #include <drm/drm_drv.h>
#include <drm/drm_fb_helper.h> #include <drm/drm_fb_helper.h>
#include <drm/drm_gem_cma_helper.h> #include <drm/drm_gem_cma_helper.h>
...@@ -74,7 +75,7 @@ static const struct drm_encoder_funcs dcss_kms_simple_encoder_funcs = { ...@@ -74,7 +75,7 @@ static const struct drm_encoder_funcs dcss_kms_simple_encoder_funcs = {
.destroy = drm_encoder_cleanup, .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_device *ddev = &kms->base;
struct drm_encoder *encoder = &kms->encoder; struct drm_encoder *encoder = &kms->encoder;
...@@ -103,7 +104,23 @@ static int dcss_kms_setup_encoder(struct dcss_kms_dev *kms) ...@@ -103,7 +104,23 @@ static int dcss_kms_setup_encoder(struct dcss_kms_dev *kms)
return ret; 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) 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) ...@@ -131,18 +148,20 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss)
drm->irq_enabled = true; drm->irq_enabled = true;
ret = dcss_crtc_init(crtc, drm); ret = dcss_kms_bridge_connector_init(kms);
if (ret) if (ret)
goto cleanup_mode_config; goto cleanup_mode_config;
ret = dcss_kms_setup_encoder(kms); ret = dcss_crtc_init(crtc, drm);
if (ret) if (ret)
goto cleanup_crtc; goto cleanup_mode_config;
drm_mode_config_reset(drm); drm_mode_config_reset(drm);
drm_kms_helper_poll_init(drm); drm_kms_helper_poll_init(drm);
drm_bridge_connector_enable_hpd(kms->connector);
ret = drm_dev_register(drm, 0); ret = drm_dev_register(drm, 0);
if (ret) if (ret)
goto cleanup_crtc; goto cleanup_crtc;
...@@ -152,6 +171,7 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) ...@@ -152,6 +171,7 @@ struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss)
return kms; return kms;
cleanup_crtc: cleanup_crtc:
drm_bridge_connector_disable_hpd(kms->connector);
drm_kms_helper_poll_fini(drm); drm_kms_helper_poll_fini(drm);
dcss_crtc_deinit(crtc, drm); dcss_crtc_deinit(crtc, drm);
...@@ -167,6 +187,7 @@ void dcss_kms_detach(struct dcss_kms_dev *kms) ...@@ -167,6 +187,7 @@ void dcss_kms_detach(struct dcss_kms_dev *kms)
struct drm_device *drm = &kms->base; struct drm_device *drm = &kms->base;
drm_dev_unregister(drm); drm_dev_unregister(drm);
drm_bridge_connector_disable_hpd(kms->connector);
drm_kms_helper_poll_fini(drm); drm_kms_helper_poll_fini(drm);
drm_atomic_helper_shutdown(drm); drm_atomic_helper_shutdown(drm);
drm_crtc_vblank_off(&kms->crtc.base); drm_crtc_vblank_off(&kms->crtc.base);
......
...@@ -29,6 +29,7 @@ struct dcss_kms_dev { ...@@ -29,6 +29,7 @@ struct dcss_kms_dev {
struct drm_device base; struct drm_device base;
struct dcss_crtc crtc; struct dcss_crtc crtc;
struct drm_encoder encoder; struct drm_encoder encoder;
struct drm_connector *connector;
}; };
struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss); struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment