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 1a55b9ed15a804079933c84033b0c2277f3901e2..c816b3db4b28f4a09d1298b6cd5aeed9d36efee2 100644 (file)
@@ -341,7 +341,7 @@ static void scl_vop_cal_scl_fac(struct vop *vop, struct vop_win *win,
        uint16_t vsu_mode;
        uint16_t lb_mode;
        uint32_t val;
-       int vskiplines;
+       int vskiplines = 0;
 
        if (!win->phy->scl)
                return;
@@ -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,
@@ -1040,15 +1046,19 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
        switch (s->output_type) {
        case DRM_MODE_CONNECTOR_LVDS:
                VOP_CTRL_SET(vop, rgb_en, 1);
+               VOP_CTRL_SET(vop, rgb_pin_pol, val);
                break;
        case DRM_MODE_CONNECTOR_eDP:
                VOP_CTRL_SET(vop, edp_en, 1);
+               VOP_CTRL_SET(vop, edp_pin_pol, val);
                break;
        case DRM_MODE_CONNECTOR_HDMIA:
                VOP_CTRL_SET(vop, hdmi_en, 1);
+               VOP_CTRL_SET(vop, hdmi_pin_pol, val);
                break;
        case DRM_MODE_CONNECTOR_DSI:
                VOP_CTRL_SET(vop, mipi_en, 1);
+               VOP_CTRL_SET(vop, mipi_pin_pol, val);
                break;
        default:
                DRM_ERROR("unsupport connector_type[%d]\n", s->output_type);
@@ -1341,7 +1351,8 @@ static int vop_create_crtc(struct vop *vop)
                    win->type != DRM_PLANE_TYPE_CURSOR)
                        continue;
 
-               if (vop_plane_init(vop, win, 0))
+               ret = vop_plane_init(vop, win, 0);
+               if (ret)
                        goto err_cleanup_planes;
 
                plane = &win->base;
@@ -1370,7 +1381,8 @@ static int vop_create_crtc(struct vop *vop)
                if (win->type != DRM_PLANE_TYPE_OVERLAY)
                        continue;
 
-               if (vop_plane_init(vop, win, possible_crtcs))
+               ret = vop_plane_init(vop, win, possible_crtcs);
+               if (ret)
                        goto err_cleanup_crtc;
        }