spin_unlock_irqrestore(&vop->irq_lock, flags);
  }
  
 -static void vop_enable(struct drm_crtc *crtc)
+ /*
+  * (1) each frame starts at the start of the Vsync pulse which is signaled by
+  *     the "FRAME_SYNC" interrupt.
+  * (2) the active data region of each frame ends at dsp_vact_end
+  * (3) we should program this same number (dsp_vact_end) into dsp_line_frag_num,
+  *      to get "LINE_FLAG" interrupt at the end of the active on screen data.
+  *
+  * VOP_INTR_CTRL0.dsp_line_frag_num = VOP_DSP_VACT_ST_END.dsp_vact_end
+  * Interrupts
+  * LINE_FLAG -------------------------------+
+  * FRAME_SYNC ----+                         |
+  *                |                         |
+  *                v                         v
+  *                | Vsync | Vbp |  Vactive  | Vfp |
+  *                        ^     ^           ^     ^
+  *                        |     |           |     |
+  *                        |     |           |     |
+  * dsp_vs_end ------------+     |           |     |   VOP_DSP_VTOTAL_VS_END
+  * dsp_vact_start --------------+           |     |   VOP_DSP_VACT_ST_END
+  * dsp_vact_end ----------------------------+     |   VOP_DSP_VACT_ST_END
+  * dsp_total -------------------------------------+   VOP_DSP_VTOTAL_VS_END
+  */
+ static bool vop_line_flag_irq_is_enabled(struct vop *vop)
+ {
+       uint32_t line_flag_irq;
+       unsigned long flags;
+ 
+       spin_lock_irqsave(&vop->irq_lock, flags);
+ 
+       line_flag_irq = VOP_INTR_GET_TYPE(vop, enable, LINE_FLAG_INTR);
+ 
+       spin_unlock_irqrestore(&vop->irq_lock, flags);
+ 
+       return !!line_flag_irq;
+ }
+ 
+ static void vop_line_flag_irq_enable(struct vop *vop, int line_num)
+ {
+       unsigned long flags;
+ 
+       if (WARN_ON(!vop->is_enabled))
+               return;
+ 
+       spin_lock_irqsave(&vop->irq_lock, flags);
+ 
+       VOP_CTRL_SET(vop, line_flag_num[0], line_num);
+       VOP_INTR_SET_TYPE(vop, enable, LINE_FLAG_INTR, 1);
+ 
+       spin_unlock_irqrestore(&vop->irq_lock, flags);
+ }
+ 
+ static void vop_line_flag_irq_disable(struct vop *vop)
+ {
+       unsigned long flags;
+ 
+       if (WARN_ON(!vop->is_enabled))
+               return;
+ 
+       spin_lock_irqsave(&vop->irq_lock, flags);
+ 
+       VOP_INTR_SET_TYPE(vop, enable, LINE_FLAG_INTR, 0);
+ 
+       spin_unlock_irqrestore(&vop->irq_lock, flags);
+ }
+ 
 +static int vop_enable(struct drm_crtc *crtc)
  {
        struct vop *vop = to_vop(crtc);
        int ret;
        u16 vsync_len = adjusted_mode->vsync_end - adjusted_mode->vsync_start;
        u16 vact_st = adjusted_mode->vtotal - adjusted_mode->vsync_start;
        u16 vact_end = vact_st + vdisplay;
-       uint32_t val;
+       uint32_t pin_pol, val;
 +      int ret;
  
        WARN_ON(vop->event);