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