video: lcdc: 3228: fix alpha when only one layer enable
authorMark Yao <mark.yao@rock-chips.com>
Wed, 14 Oct 2015 10:11:37 +0000 (18:11 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Mon, 19 Oct 2015 02:32:18 +0000 (10:32 +0800)
rk3228 not support ppixel_alpha mode when only one layer enable.

Change-Id: I4de3a46f2f876230932a09fd202f318b130a5709
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/video/rockchip/lcdc/rk3228_lcdc.c

index 4777bce9b7fb3d1efa4119ea951f1240284a257f..6f34233a8d0cb90233d608a982c6dd6b12425250 100644 (file)
@@ -763,6 +763,8 @@ static int vop_alpha_cfg(struct rk_lcdc_driver *dev_drv, int win_id)
        u64 val;
        int ppixel_alpha = 0, global_alpha = 0, i;
        u32 src_alpha_ctl, dst_alpha_ctl;
+       int alpha_en = 1;
+       int layer_count = 0;
 
        for (i = 0; i < win->area_num; i++) {
                ppixel_alpha |= ((win->area[i].format == ARGB888) ||
@@ -772,6 +774,16 @@ static int vop_alpha_cfg(struct rk_lcdc_driver *dev_drv, int win_id)
        }
 
        global_alpha = (win->g_alpha_val == 0) ? 0 : 1;
+
+       for (i = 0; i < dev_drv->lcdc_win_num; i++) {
+               if (dev_drv->win[i]->state)
+                       layer_count++;
+       }
+       /*
+        * vop not support ppixel_alpha mode when only enable 1 layer.
+        */
+       if (layer_count == 1)
+               ppixel_alpha = 0;
        alpha_config.src_global_alpha_val = win->g_alpha_val;
        win->alpha_mode = AB_SRC_OVER;
 
@@ -852,6 +864,8 @@ static int vop_alpha_cfg(struct rk_lcdc_driver *dev_drv, int win_id)
                alpha_config.src_global_alpha_mode = AA_PER_PIX;
        else if (global_alpha == 1)
                alpha_config.src_global_alpha_mode = AA_GLOBAL;
+       else
+               alpha_en = 0;
        alpha_config.src_alpha_mode = AA_STRAIGHT;
        alpha_config.src_alpha_cal_m0 = AA_NO_SAT;
 
@@ -871,7 +885,7 @@ static int vop_alpha_cfg(struct rk_lcdc_driver *dev_drv, int win_id)
        }
        val = V_WIN0_DST_FACTOR_MODE(alpha_config.dst_factor_mode);
        vop_msk_reg(vop_dev, dst_alpha_ctl, val);
-       val = V_WIN0_SRC_ALPHA_EN(1) |
+       val = V_WIN0_SRC_ALPHA_EN(alpha_en) |
            V_WIN0_SRC_COLOR_MODE(alpha_config.src_color_mode) |
            V_WIN0_SRC_ALPHA_MODE(alpha_config.src_alpha_mode) |
            V_WIN0_SRC_BLEND_MODE(alpha_config.src_global_alpha_mode) |