Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: 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

authored by

Laurentiu Palcu and committed by
Lucas Stach
e7033bdf 9021c317

+42 -9
+14 -3
drivers/gpu/drm/imx/dcss/dcss-dev.c
··· 8 8 #include <linux/of_graph.h> 9 9 #include <linux/pm_runtime.h> 10 10 #include <linux/slab.h> 11 + #include <drm/drm_bridge_connector.h> 12 + #include <drm/drm_device.h> 11 13 #include <drm/drm_modeset_helper.h> 12 14 13 15 #include "dcss-dev.h" 16 + #include "dcss-kms.h" 14 17 15 18 static void dcss_clocks_enable(struct dcss_dev *dcss) 16 19 { ··· 250 247 int dcss_dev_suspend(struct device *dev) 251 248 { 252 249 struct dcss_dev *dcss = dcss_drv_dev_to_dcss(dev); 250 + struct drm_device *ddev = dcss_drv_dev_to_drm(dev); 251 + struct dcss_kms_dev *kms = container_of(ddev, struct dcss_kms_dev, base); 253 252 int ret; 254 253 255 - drm_mode_config_helper_suspend(dcss_drv_dev_to_drm(dev)); 254 + drm_bridge_connector_disable_hpd(kms->connector); 255 + 256 + drm_mode_config_helper_suspend(ddev); 256 257 257 258 if (pm_runtime_suspended(dev)) 258 259 return 0; ··· 273 266 int dcss_dev_resume(struct device *dev) 274 267 { 275 268 struct dcss_dev *dcss = dcss_drv_dev_to_dcss(dev); 269 + struct drm_device *ddev = dcss_drv_dev_to_drm(dev); 270 + struct dcss_kms_dev *kms = container_of(ddev, struct dcss_kms_dev, base); 276 271 277 272 if (pm_runtime_suspended(dev)) { 278 - drm_mode_config_helper_resume(dcss_drv_dev_to_drm(dev)); 273 + drm_mode_config_helper_resume(ddev); 279 274 return 0; 280 275 } 281 276 ··· 287 278 288 279 dcss_ctxld_resume(dcss->ctxld); 289 280 290 - drm_mode_config_helper_resume(dcss_drv_dev_to_drm(dev)); 281 + drm_mode_config_helper_resume(ddev); 282 + 283 + drm_bridge_connector_enable_hpd(kms->connector); 291 284 292 285 return 0; 293 286 }
+27 -6
drivers/gpu/drm/imx/dcss/dcss-kms.c
··· 5 5 6 6 #include <drm/drm_atomic.h> 7 7 #include <drm/drm_atomic_helper.h> 8 + #include <drm/drm_bridge_connector.h> 8 9 #include <drm/drm_drv.h> 9 10 #include <drm/drm_fb_helper.h> 10 11 #include <drm/drm_gem_cma_helper.h> ··· 75 74 .destroy = drm_encoder_cleanup, 76 75 }; 77 76 78 - static int dcss_kms_setup_encoder(struct dcss_kms_dev *kms) 77 + static int dcss_kms_bridge_connector_init(struct dcss_kms_dev *kms) 79 78 { 80 79 struct drm_device *ddev = &kms->base; 81 80 struct drm_encoder *encoder = &kms->encoder; ··· 104 103 return ret; 105 104 } 106 105 107 - return drm_bridge_attach(encoder, bridge, NULL, 0); 106 + ret = drm_bridge_attach(encoder, bridge, NULL, 107 + DRM_BRIDGE_ATTACH_NO_CONNECTOR); 108 + if (ret < 0) { 109 + dev_err(ddev->dev, "Unable to attach bridge %pOF\n", 110 + bridge->of_node); 111 + return ret; 112 + } 113 + 114 + kms->connector = drm_bridge_connector_init(ddev, encoder); 115 + if (IS_ERR(kms->connector)) { 116 + dev_err(ddev->dev, "Unable to create bridge connector.\n"); 117 + return PTR_ERR(kms->connector); 118 + } 119 + 120 + drm_connector_attach_encoder(kms->connector, encoder); 121 + 122 + return 0; 108 123 } 109 124 110 125 struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss) ··· 148 131 149 132 drm->irq_enabled = true; 150 133 134 + ret = dcss_kms_bridge_connector_init(kms); 135 + if (ret) 136 + goto cleanup_mode_config; 137 + 151 138 ret = dcss_crtc_init(crtc, drm); 152 139 if (ret) 153 140 goto cleanup_mode_config; 154 141 155 - ret = dcss_kms_setup_encoder(kms); 156 - if (ret) 157 - goto cleanup_crtc; 158 - 159 142 drm_mode_config_reset(drm); 160 143 161 144 drm_kms_helper_poll_init(drm); 145 + 146 + drm_bridge_connector_enable_hpd(kms->connector); 162 147 163 148 ret = drm_dev_register(drm, 0); 164 149 if (ret) ··· 171 152 return kms; 172 153 173 154 cleanup_crtc: 155 + drm_bridge_connector_disable_hpd(kms->connector); 174 156 drm_kms_helper_poll_fini(drm); 175 157 dcss_crtc_deinit(crtc, drm); 176 158 ··· 187 167 struct drm_device *drm = &kms->base; 188 168 189 169 drm_dev_unregister(drm); 170 + drm_bridge_connector_disable_hpd(kms->connector); 190 171 drm_kms_helper_poll_fini(drm); 191 172 drm_atomic_helper_shutdown(drm); 192 173 drm_crtc_vblank_off(&kms->crtc.base);
+1
drivers/gpu/drm/imx/dcss/dcss-kms.h
··· 29 29 struct drm_device base; 30 30 struct dcss_crtc crtc; 31 31 struct drm_encoder encoder; 32 + struct drm_connector *connector; 32 33 }; 33 34 34 35 struct dcss_kms_dev *dcss_kms_attach(struct dcss_dev *dcss);