drm: Add old state pointer to CRTC .enable() helper function
[linux-2.6-block.git] / drivers / gpu / drm / rockchip / rockchip_drm_vop.c
index 45589d6ce65ed0fd0a7e1be60f83dd03bd3d47b5..bb59f7410634e07160a2f99741b81fca874950c5 100644 (file)
@@ -468,7 +468,7 @@ static bool vop_line_flag_irq_is_enabled(struct vop *vop)
        return !!line_flag_irq;
 }
 
-static void vop_line_flag_irq_enable(struct vop *vop, int line_num)
+static void vop_line_flag_irq_enable(struct vop *vop)
 {
        unsigned long flags;
 
@@ -477,7 +477,6 @@ static void vop_line_flag_irq_enable(struct vop *vop, int line_num)
 
        spin_lock_irqsave(&vop->irq_lock, flags);
 
-       VOP_CTRL_SET(vop, line_flag_num[0], line_num);
        VOP_INTR_SET_TYPE(vop, clear, LINE_FLAG_INTR, 1);
        VOP_INTR_SET_TYPE(vop, enable, LINE_FLAG_INTR, 1);
 
@@ -872,7 +871,8 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
        return true;
 }
 
-static void vop_crtc_enable(struct drm_crtc *crtc)
+static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *old_state)
 {
        struct vop *vop = to_vop(crtc);
        const struct vop_data *vop_data = vop->data;
@@ -989,6 +989,8 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
        VOP_CTRL_SET(vop, vact_st_end, val);
        VOP_CTRL_SET(vop, vpost_st_end, val);
 
+       VOP_CTRL_SET(vop, line_flag_num[0], vact_end);
+
        clk_set_rate(vop->dclk, adjusted_mode->clock * 1000);
 
        VOP_CTRL_SET(vop, standby, 0);
@@ -1078,11 +1080,11 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc,
 }
 
 static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
-       .enable = vop_crtc_enable,
        .disable = vop_crtc_disable,
        .mode_fixup = vop_crtc_mode_fixup,
        .atomic_flush = vop_crtc_atomic_flush,
        .atomic_begin = vop_crtc_atomic_begin,
+       .atomic_enable = vop_crtc_atomic_enable,
 };
 
 static void vop_crtc_destroy(struct drm_crtc *crtc)
@@ -1125,16 +1127,17 @@ static void vop_crtc_destroy_state(struct drm_crtc *crtc,
 #ifdef CONFIG_DRM_ANALOGIX_DP
 static struct drm_connector *vop_get_edp_connector(struct vop *vop)
 {
-       struct drm_crtc *crtc = &vop->crtc;
        struct drm_connector *connector;
+       struct drm_connector_list_iter conn_iter;
 
-       mutex_lock(&crtc->dev->mode_config.mutex);
-       drm_for_each_connector(connector, crtc->dev)
+       drm_connector_list_iter_begin(vop->drm_dev, &conn_iter);
+       drm_for_each_connector_iter(connector, &conn_iter) {
                if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
-                       mutex_unlock(&crtc->dev->mode_config.mutex);
+                       drm_connector_list_iter_end(&conn_iter);
                        return connector;
                }
-       mutex_unlock(&crtc->dev->mode_config.mutex);
+       }
+       drm_connector_list_iter_end(&conn_iter);
 
        return NULL;
 }
@@ -1515,19 +1518,16 @@ static void vop_win_init(struct vop *vop)
 }
 
 /**
- * rockchip_drm_wait_line_flag - acqiure the give line flag event
+ * rockchip_drm_wait_vact_end
  * @crtc: CRTC to enable line flag
- * @line_num: interested line number
  * @mstimeout: millisecond for timeout
  *
- * Driver would hold here until the interested line flag interrupt have
- * happened or timeout to wait.
+ * Wait for vact_end line flag irq or timeout.
  *
  * Returns:
  * Zero on success, negative errno on failure.
  */
-int rockchip_drm_wait_line_flag(struct drm_crtc *crtc, unsigned int line_num,
-                               unsigned int mstimeout)
+int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout)
 {
        struct vop *vop = to_vop(crtc);
        unsigned long jiffies_left;
@@ -1535,14 +1535,14 @@ int rockchip_drm_wait_line_flag(struct drm_crtc *crtc, unsigned int line_num,
        if (!crtc || !vop->is_enabled)
                return -ENODEV;
 
-       if (line_num > crtc->mode.vtotal || mstimeout <= 0)
+       if (mstimeout <= 0)
                return -EINVAL;
 
        if (vop_line_flag_irq_is_enabled(vop))
                return -EBUSY;
 
        reinit_completion(&vop->line_flag_completion);
-       vop_line_flag_irq_enable(vop, line_num);
+       vop_line_flag_irq_enable(vop);
 
        jiffies_left = wait_for_completion_timeout(&vop->line_flag_completion,
                                                   msecs_to_jiffies(mstimeout));
@@ -1555,7 +1555,7 @@ int rockchip_drm_wait_line_flag(struct drm_crtc *crtc, unsigned int line_num,
 
        return 0;
 }
-EXPORT_SYMBOL(rockchip_drm_wait_line_flag);
+EXPORT_SYMBOL(rockchip_drm_wait_vact_end);
 
 static int vop_bind(struct device *dev, struct device *master, void *data)
 {