Merge branch 'exynos-drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-fixes

This pull-request includes some bug fixes and code cleanups.
Especially, this fixes the bind failure issue occurred when it tries
to re-bind Exynos drm driver after unbound, and the modetest failure
issue incurred by not having a pair to vblank on and off requests.

* 'exynos-drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos:
drm/exynos: correct connector->dpms field before resuming
drm/exynos: enable vblank after DPMS on
drm/exynos: init kms poll at the end of initialization
drm/exynos: propagate plane initialization errors
drm/exynos: vidi: fix build warning
drm/exynos: remove explicit encoder/connector de-initialization
drm/exynos: init vblank with real number of crtcs

-5
drivers/gpu/drm/exynos/exynos_dp_core.c
··· 1355 void *data) 1356 { 1357 struct exynos_drm_display *display = dev_get_drvdata(dev); 1358 - struct exynos_dp_device *dp = display->ctx; 1359 - struct drm_encoder *encoder = dp->encoder; 1360 1361 exynos_dp_dpms(display, DRM_MODE_DPMS_OFF); 1362 - 1363 - exynos_dp_connector_destroy(&dp->connector); 1364 - encoder->funcs->destroy(encoder); 1365 } 1366 1367 static const struct component_ops exynos_dp_ops = {
··· 1355 void *data) 1356 { 1357 struct exynos_drm_display *display = dev_get_drvdata(dev); 1358 1359 exynos_dp_dpms(display, DRM_MODE_DPMS_OFF); 1360 } 1361 1362 static const struct component_ops exynos_dp_ops = {
+4 -1
drivers/gpu/drm/exynos/exynos_drm_crtc.c
··· 71 !atomic_read(&exynos_crtc->pending_flip), 72 HZ/20)) 73 atomic_set(&exynos_crtc->pending_flip, 0); 74 - drm_vblank_off(crtc->dev, exynos_crtc->pipe); 75 } 76 77 if (manager->ops->dpms) 78 manager->ops->dpms(manager, mode); 79 80 exynos_crtc->dpms = mode; 81 } 82 83 static void exynos_drm_crtc_prepare(struct drm_crtc *crtc)
··· 71 !atomic_read(&exynos_crtc->pending_flip), 72 HZ/20)) 73 atomic_set(&exynos_crtc->pending_flip, 0); 74 + drm_crtc_vblank_off(crtc); 75 } 76 77 if (manager->ops->dpms) 78 manager->ops->dpms(manager, mode); 79 80 exynos_crtc->dpms = mode; 81 + 82 + if (mode == DRM_MODE_DPMS_ON) 83 + drm_crtc_vblank_on(crtc); 84 } 85 86 static void exynos_drm_crtc_prepare(struct drm_crtc *crtc)
-4
drivers/gpu/drm/exynos/exynos_drm_dpi.c
··· 338 339 int exynos_dpi_remove(struct device *dev) 340 { 341 - struct drm_encoder *encoder = exynos_dpi_display.encoder; 342 struct exynos_dpi *ctx = exynos_dpi_display.ctx; 343 344 exynos_dpi_dpms(&exynos_dpi_display, DRM_MODE_DPMS_OFF); 345 - 346 - exynos_dpi_connector_destroy(&ctx->connector); 347 - encoder->funcs->destroy(encoder); 348 349 if (ctx->panel) 350 drm_panel_detach(ctx->panel);
··· 338 339 int exynos_dpi_remove(struct device *dev) 340 { 341 struct exynos_dpi *ctx = exynos_dpi_display.ctx; 342 343 exynos_dpi_dpms(&exynos_dpi_display, DRM_MODE_DPMS_OFF); 344 345 if (ctx->panel) 346 drm_panel_detach(ctx->panel);
+25 -18
drivers/gpu/drm/exynos/exynos_drm_drv.c
··· 87 88 plane = exynos_plane_init(dev, possible_crtcs, 89 DRM_PLANE_TYPE_OVERLAY); 90 - if (IS_ERR(plane)) 91 - goto err_mode_config_cleanup; 92 - } 93 94 - /* init kms poll for handling hpd */ 95 - drm_kms_helper_poll_init(dev); 96 - 97 - ret = drm_vblank_init(dev, MAX_CRTC); 98 - if (ret) 99 goto err_mode_config_cleanup; 100 101 /* setup possible_clones. */ 102 exynos_drm_encoder_setup(dev); ··· 102 /* Try to bind all sub drivers. */ 103 ret = component_bind_all(dev->dev, dev); 104 if (ret) 105 - goto err_cleanup_vblank; 106 107 /* Probe non kms sub drivers and virtual display driver. */ 108 ret = exynos_drm_device_subdrv_probe(dev); 109 if (ret) 110 - goto err_unbind_all; 111 - 112 - /* force connectors detection */ 113 - drm_helper_hpd_irq_event(dev); 114 115 /* 116 * enable drm irq mode. ··· 130 */ 131 dev->vblank_disable_allowed = true; 132 133 return 0; 134 135 - err_unbind_all: 136 - component_unbind_all(dev->dev, dev); 137 err_cleanup_vblank: 138 drm_vblank_cleanup(dev); 139 err_mode_config_cleanup: 140 drm_mode_config_cleanup(dev); 141 drm_release_iommu_mapping(dev); ··· 158 exynos_drm_fbdev_fini(dev); 159 drm_kms_helper_poll_fini(dev); 160 161 - component_unbind_all(dev->dev, dev); 162 drm_vblank_cleanup(dev); 163 drm_mode_config_cleanup(dev); 164 drm_release_iommu_mapping(dev); 165 ··· 194 195 drm_modeset_lock_all(dev); 196 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 197 - if (connector->funcs->dpms) 198 - connector->funcs->dpms(connector, connector->dpms); 199 } 200 drm_modeset_unlock_all(dev); 201
··· 87 88 plane = exynos_plane_init(dev, possible_crtcs, 89 DRM_PLANE_TYPE_OVERLAY); 90 + if (!IS_ERR(plane)) 91 + continue; 92 93 + ret = PTR_ERR(plane); 94 goto err_mode_config_cleanup; 95 + } 96 97 /* setup possible_clones. */ 98 exynos_drm_encoder_setup(dev); ··· 106 /* Try to bind all sub drivers. */ 107 ret = component_bind_all(dev->dev, dev); 108 if (ret) 109 + goto err_mode_config_cleanup; 110 + 111 + ret = drm_vblank_init(dev, dev->mode_config.num_crtc); 112 + if (ret) 113 + goto err_unbind_all; 114 115 /* Probe non kms sub drivers and virtual display driver. */ 116 ret = exynos_drm_device_subdrv_probe(dev); 117 if (ret) 118 + goto err_cleanup_vblank; 119 120 /* 121 * enable drm irq mode. ··· 133 */ 134 dev->vblank_disable_allowed = true; 135 136 + /* init kms poll for handling hpd */ 137 + drm_kms_helper_poll_init(dev); 138 + 139 + /* force connectors detection */ 140 + drm_helper_hpd_irq_event(dev); 141 + 142 return 0; 143 144 err_cleanup_vblank: 145 drm_vblank_cleanup(dev); 146 + err_unbind_all: 147 + component_unbind_all(dev->dev, dev); 148 err_mode_config_cleanup: 149 drm_mode_config_cleanup(dev); 150 drm_release_iommu_mapping(dev); ··· 155 exynos_drm_fbdev_fini(dev); 156 drm_kms_helper_poll_fini(dev); 157 158 drm_vblank_cleanup(dev); 159 + component_unbind_all(dev->dev, dev); 160 drm_mode_config_cleanup(dev); 161 drm_release_iommu_mapping(dev); 162 ··· 191 192 drm_modeset_lock_all(dev); 193 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 194 + if (connector->funcs->dpms) { 195 + int dpms = connector->dpms; 196 + 197 + connector->dpms = DRM_MODE_DPMS_OFF; 198 + connector->funcs->dpms(connector, dpms); 199 + } 200 } 201 drm_modeset_unlock_all(dev); 202
-4
drivers/gpu/drm/exynos/exynos_drm_dsi.c
··· 1660 void *data) 1661 { 1662 struct exynos_dsi *dsi = exynos_dsi_display.ctx; 1663 - struct drm_encoder *encoder = dsi->encoder; 1664 1665 exynos_dsi_dpms(&exynos_dsi_display, DRM_MODE_DPMS_OFF); 1666 - 1667 - exynos_dsi_connector_destroy(&dsi->connector); 1668 - encoder->funcs->destroy(encoder); 1669 1670 mipi_dsi_host_unregister(&dsi->dsi_host); 1671 }
··· 1660 void *data) 1661 { 1662 struct exynos_dsi *dsi = exynos_dsi_display.ctx; 1663 1664 exynos_dsi_dpms(&exynos_dsi_display, DRM_MODE_DPMS_OFF); 1665 1666 mipi_dsi_host_unregister(&dsi->dsi_host); 1667 }
-4
drivers/gpu/drm/exynos/exynos_drm_vidi.c
··· 630 { 631 struct exynos_drm_manager *mgr = platform_get_drvdata(pdev); 632 struct vidi_context *ctx = mgr->ctx; 633 - struct drm_encoder *encoder = ctx->encoder; 634 635 if (ctx->raw_edid != (struct edid *)fake_edid_info) { 636 kfree(ctx->raw_edid); ··· 637 638 return -EINVAL; 639 } 640 - 641 - encoder->funcs->destroy(encoder); 642 - drm_connector_cleanup(&ctx->connector); 643 644 return 0; 645 }
··· 630 { 631 struct exynos_drm_manager *mgr = platform_get_drvdata(pdev); 632 struct vidi_context *ctx = mgr->ctx; 633 634 if (ctx->raw_edid != (struct edid *)fake_edid_info) { 635 kfree(ctx->raw_edid); ··· 638 639 return -EINVAL; 640 } 641 642 return 0; 643 }
-6
drivers/gpu/drm/exynos/exynos_hdmi.c
··· 2312 2313 static void hdmi_unbind(struct device *dev, struct device *master, void *data) 2314 { 2315 - struct exynos_drm_display *display = get_hdmi_display(dev); 2316 - struct drm_encoder *encoder = display->encoder; 2317 - struct hdmi_context *hdata = display->ctx; 2318 - 2319 - hdmi_connector_destroy(&hdata->connector); 2320 - encoder->funcs->destroy(encoder); 2321 } 2322 2323 static const struct component_ops hdmi_component_ops = {
··· 2312 2313 static void hdmi_unbind(struct device *dev, struct device *master, void *data) 2314 { 2315 } 2316 2317 static const struct component_ops hdmi_component_ops = {