drm/rockchip: vop: use new crtc state on atomic check
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / rockchip / rockchip_drm_vop.c
index 544a51cfccb0b51dc066c30a0f725db7fae65ae5..c816b3db4b28f4a09d1298b6cd5aeed9d36efee2 100644 (file)
@@ -358,9 +358,9 @@ static void scl_vop_cal_scl_fac(struct vop *vop, struct vop_win *win,
                            scl_cal_scale2(src_h, dst_h));
                if (is_yuv) {
                        VOP_SCL_SET(vop, win, scale_cbcr_x,
-                                   scl_cal_scale2(src_w, dst_w));
+                                   scl_cal_scale2(cbcr_src_w, dst_w));
                        VOP_SCL_SET(vop, win, scale_cbcr_y,
-                                   scl_cal_scale2(src_h, dst_h));
+                                   scl_cal_scale2(cbcr_src_h, dst_h));
                }
                return;
        }
@@ -468,12 +468,6 @@ static void vop_enable(struct drm_crtc *crtc)
        if (vop->is_enabled)
                return;
 
-       ret = pm_runtime_get_sync(vop->dev);
-       if (ret < 0) {
-               dev_err(vop->dev, "failed to get pm runtime: %d\n", ret);
-               return;
-       }
-
        ret = clk_enable(vop->hclk);
        if (ret < 0) {
                dev_err(vop->dev, "failed to enable hclk - %d\n", ret);
@@ -492,6 +486,12 @@ static void vop_enable(struct drm_crtc *crtc)
                goto err_disable_dclk;
        }
 
+       ret = pm_runtime_get_sync(vop->dev);
+       if (ret < 0) {
+               dev_err(vop->dev, "failed to get pm runtime: %d\n", ret);
+               return;
+       }
+
        /*
         * Slave iommu shares power, irq and clock with vop.  It was associated
         * automatically with this master device via common driver code.
@@ -582,10 +582,10 @@ static void vop_crtc_disable(struct drm_crtc *crtc)
         */
        rockchip_drm_dma_detach_device(vop->drm_dev, vop->dev);
 
+       pm_runtime_put(vop->dev);
        clk_disable(vop->dclk);
        clk_disable(vop->aclk);
        clk_disable(vop->hclk);
-       pm_runtime_put(vop->dev);
 }
 
 static void vop_plane_destroy(struct drm_plane *plane)
@@ -616,6 +616,7 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
        struct drm_framebuffer *fb = state->fb;
        struct vop_win *win = to_vop_win(plane);
        struct vop_plane_state *vop_plane_state = to_vop_plane_state(state);
+       struct drm_crtc_state *crtc_state;
        bool visible;
        int ret;
        struct drm_rect *dest = &vop_plane_state->dest;
@@ -632,6 +633,11 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
         */
        if (!crtc || !fb)
                goto out_disable;
+
+       crtc_state = drm_atomic_get_crtc_state(state->state, crtc);
+       if (IS_ERR(crtc_state))
+               return PTR_ERR(crtc_state);
+
        src->x1 = state->src_x;
        src->y1 = state->src_y;
        src->x2 = state->src_x + state->src_w;
@@ -643,8 +649,8 @@ static int vop_plane_atomic_check(struct drm_plane *plane,
 
        clip.x1 = 0;
        clip.y1 = 0;
-       clip.x2 = crtc->mode.hdisplay;
-       clip.y2 = crtc->mode.vdisplay;
+       clip.x2 = crtc_state->mode.hdisplay;
+       clip.y2 = crtc_state->mode.vdisplay;
 
        ret = drm_plane_helper_check_update(plane, crtc, state->fb,
                                            src, dest, &clip,