Some drivers like exynos need the crtc to be able to disable the plane,
so set it before calling disable_plane.

Signed-off-by: St?phane Marchesin <marcheu at chromium.org>
---
 drivers/gpu/drm/drm_crtc.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 3b7d32d..0943316 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1947,10 +1947,21 @@ int drm_mode_setplane(struct drm_device *dev, void 
*data,
        }
        plane = obj_to_plane(obj);

+       obj = drm_mode_object_find(dev, plane_req->crtc_id,
+                                  DRM_MODE_OBJECT_CRTC);
+       if (!obj) {
+               DRM_DEBUG_KMS("Unknown crtc ID %d\n",
+                             plane_req->crtc_id);
+               ret = -ENOENT;
+               goto out;
+       }
+       crtc = obj_to_crtc(obj);
+
        /* No fb means shut it down */
        if (!plane_req->fb_id) {
                drm_modeset_lock_all(dev);
                old_fb = plane->fb;
+               plane->crtc = crtc;
                plane->funcs->disable_plane(plane);
                plane->crtc = NULL;
                plane->fb = NULL;
@@ -1958,16 +1969,6 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
                goto out;
        }

-       obj = drm_mode_object_find(dev, plane_req->crtc_id,
-                                  DRM_MODE_OBJECT_CRTC);
-       if (!obj) {
-               DRM_DEBUG_KMS("Unknown crtc ID %d\n",
-                             plane_req->crtc_id);
-               ret = -ENOENT;
-               goto out;
-       }
-       crtc = obj_to_crtc(obj);
-
        fb = drm_framebuffer_lookup(dev, plane_req->fb_id);
        if (!fb) {
                DRM_DEBUG_KMS("Unknown framebuffer ID %d\n",
-- 
1.9.0.279.gdc9e3eb

Reply via email to