Commit 66338feee458cb2b04e8f2b515b8d660e49ba29a
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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
Showing 7 changed files Side-by-side Diff
drivers/gpu/drm/exynos/exynos_dp_core.c
... | ... | @@ -1355,13 +1355,8 @@ |
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 = { |
drivers/gpu/drm/exynos/exynos_drm_crtc.c
... | ... | @@ -71,13 +71,16 @@ |
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) |
drivers/gpu/drm/exynos/exynos_drm_dpi.c
... | ... | @@ -338,13 +338,9 @@ |
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); |
drivers/gpu/drm/exynos/exynos_drm_drv.c
... | ... | @@ -87,16 +87,12 @@ |
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); |
103 | 99 | |
104 | 100 | |
105 | 101 | |
... | ... | @@ -106,16 +102,17 @@ |
106 | 102 | /* Try to bind all sub drivers. */ |
107 | 103 | ret = component_bind_all(dev->dev, dev); |
108 | 104 | if (ret) |
109 | - goto err_cleanup_vblank; | |
105 | + goto err_mode_config_cleanup; | |
110 | 106 | |
107 | + ret = drm_vblank_init(dev, dev->mode_config.num_crtc); | |
108 | + if (ret) | |
109 | + goto err_unbind_all; | |
110 | + | |
111 | 111 | /* Probe non kms sub drivers and virtual display driver. */ |
112 | 112 | ret = exynos_drm_device_subdrv_probe(dev); |
113 | 113 | if (ret) |
114 | - goto err_unbind_all; | |
114 | + goto err_cleanup_vblank; | |
115 | 115 | |
116 | - /* force connectors detection */ | |
117 | - drm_helper_hpd_irq_event(dev); | |
118 | - | |
119 | 116 | /* |
120 | 117 | * enable drm irq mode. |
121 | 118 | * - with irq_enabled = true, we can use the vblank feature. |
122 | 119 | |
123 | 120 | |
... | ... | @@ -133,12 +130,18 @@ |
133 | 130 | */ |
134 | 131 | dev->vblank_disable_allowed = true; |
135 | 132 | |
133 | + /* init kms poll for handling hpd */ | |
134 | + drm_kms_helper_poll_init(dev); | |
135 | + | |
136 | + /* force connectors detection */ | |
137 | + drm_helper_hpd_irq_event(dev); | |
138 | + | |
136 | 139 | return 0; |
137 | 140 | |
138 | -err_unbind_all: | |
139 | - component_unbind_all(dev->dev, dev); | |
140 | 141 | err_cleanup_vblank: |
141 | 142 | drm_vblank_cleanup(dev); |
143 | +err_unbind_all: | |
144 | + component_unbind_all(dev->dev, dev); | |
142 | 145 | err_mode_config_cleanup: |
143 | 146 | drm_mode_config_cleanup(dev); |
144 | 147 | drm_release_iommu_mapping(dev); |
145 | 148 | |
... | ... | @@ -155,8 +158,8 @@ |
155 | 158 | exynos_drm_fbdev_fini(dev); |
156 | 159 | drm_kms_helper_poll_fini(dev); |
157 | 160 | |
158 | - component_unbind_all(dev->dev, dev); | |
159 | 161 | drm_vblank_cleanup(dev); |
162 | + component_unbind_all(dev->dev, dev); | |
160 | 163 | drm_mode_config_cleanup(dev); |
161 | 164 | drm_release_iommu_mapping(dev); |
162 | 165 | |
... | ... | @@ -191,8 +194,12 @@ |
191 | 194 | |
192 | 195 | drm_modeset_lock_all(dev); |
193 | 196 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
194 | - if (connector->funcs->dpms) | |
195 | - connector->funcs->dpms(connector, connector->dpms); | |
197 | + if (connector->funcs->dpms) { | |
198 | + int dpms = connector->dpms; | |
199 | + | |
200 | + connector->dpms = DRM_MODE_DPMS_OFF; | |
201 | + connector->funcs->dpms(connector, dpms); | |
202 | + } | |
196 | 203 | } |
197 | 204 | drm_modeset_unlock_all(dev); |
198 | 205 |
drivers/gpu/drm/exynos/exynos_drm_dsi.c
... | ... | @@ -1660,12 +1660,8 @@ |
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 | } |
drivers/gpu/drm/exynos/exynos_drm_vidi.c
... | ... | @@ -630,7 +630,6 @@ |
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); |
... | ... | @@ -638,9 +637,6 @@ |
638 | 637 | |
639 | 638 | return -EINVAL; |
640 | 639 | } |
641 | - | |
642 | - encoder->funcs->destroy(encoder); | |
643 | - drm_connector_cleanup(&ctx->connector); | |
644 | 640 | |
645 | 641 | return 0; |
646 | 642 | } |
drivers/gpu/drm/exynos/exynos_hdmi.c
... | ... | @@ -2312,12 +2312,6 @@ |
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 = { |