video: rockchip: vop: 3399: fix layer0 perpixel alpha error
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / lcdc / rk322x_lcdc.c
index 386708e53f45a333087e0ecc6ce4a25bc23ddda8..112d53a3b03906566c32a2dc1ed88906a44a92b6 100644 (file)
@@ -1453,13 +1453,6 @@ static int vop_win_0_1_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
                val = V_WIN0_HS_FACTOR_CBR(win->scale_cbcr_x) |
                    V_WIN0_VS_FACTOR_CBR(win->scale_cbcr_y);
                vop_writel(vop_dev, WIN0_SCL_FACTOR_CBR + off, val);
-               if (win->alpha_en == 1) {
-                       vop_alpha_cfg(dev_drv, win_id);
-               } else {
-                       val = V_WIN0_SRC_ALPHA_EN(0);
-                       vop_msk_reg(vop_dev, WIN0_SRC_ALPHA_CTRL + off, val);
-               }
-
        } else {
                val = V_WIN0_EN(win->state);
                vop_msk_reg(vop_dev, WIN0_CTRL0 + off, val);
@@ -1593,13 +1586,6 @@ static int vop_win_2_3_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
                        val = V_WIN2_MST3_EN(0);
                        vop_msk_reg(vop_dev, WIN2_CTRL0 + off, val);
                }
-
-               if (win->alpha_en == 1) {
-                       vop_alpha_cfg(dev_drv, win_id);
-               } else {
-                       val = V_WIN2_SRC_ALPHA_EN(0);
-                       vop_msk_reg(vop_dev, WIN2_SRC_ALPHA_CTRL + off, val);
-               }
        } else {
                val = V_WIN2_EN(win->state) | V_WIN2_MST0_EN(0) |
                    V_WIN2_MST1_EN(0) | V_WIN2_MST2_EN(0) | V_WIN2_MST3_EN(0);
@@ -1644,13 +1630,6 @@ static int vop_hwc_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
                val = V_HWC_DSP_XST(win->area[0].dsp_stx) |
                    V_HWC_DSP_YST(win->area[0].dsp_sty);
                vop_msk_reg(vop_dev, HWC_DSP_ST, val);
-
-               if (win->alpha_en == 1) {
-                       vop_alpha_cfg(dev_drv, win_id);
-               } else {
-                       val = V_WIN2_SRC_ALPHA_EN(0);
-                       vop_msk_reg(vop_dev, HWC_SRC_ALPHA_CTRL, val);
-               }
        } else {
                val = V_HWC_EN(win->state);
                vop_msk_reg(vop_dev, HWC_CTRL0, val);
@@ -1808,6 +1787,10 @@ static int vop_config_timing(struct rk_lcdc_driver *dev_drv)
                vop_msk_reg(vop_dev, LINE_FLAG, val);
        }
        vop_post_cfg(dev_drv);
+       if ((x_res <= VOP_INPUT_MAX_WIDTH / 2) && (vop_dev->id == 0))
+               vop_msk_reg(vop_dev, SYS_CTRL, V_POST_LB_MODE(1));
+       else
+               vop_msk_reg(vop_dev, SYS_CTRL, V_POST_LB_MODE(0));
 
        return 0;
 }
@@ -2155,8 +2138,9 @@ static int vop_enable_irq(struct rk_lcdc_driver *dev_drv)
        val = INTR_FS | INTR_LINE_FLAG0 | INTR_BUS_ERROR | INTR_LINE_FLAG1 |
                INTR_WIN0_EMPTY | INTR_WIN1_EMPTY | INTR_HWC_EMPTY |
                INTR_POST_BUF_EMPTY;
+       val |= val << 16;
 
-       vop_mask_writel(vop_dev, INTR_EN0, INTR_MASK, val);
+       vop_msk_reg(vop_dev, INTR_EN0, val);
 
        return 0;
 }
@@ -4135,6 +4119,7 @@ static int vop_config_done(struct rk_lcdc_driver *dev_drv)
        vop_msk_reg(vop_dev, SYS_CTRL, V_VOP_STANDBY_EN(vop_dev->standby));
        for (i = 0; i < dev_drv->lcdc_win_num; i++) {
                win = dev_drv->win[i];
+               vop_alpha_cfg(dev_drv, i);
                fbdc_en |= win->area[0].fbdc_en;
                if ((win->state == 0) && (win->last_state == 1)) {
                        switch (win->id) {