+ int win0_top = 0;
+ u32 mask, val;
+ enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
+ enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
+
+ int win0_alpha_en = ((win0_format == ARGB888) ||
+ (win0_format == ABGR888)) ? 1 : 0;
+ int win1_alpha_en = ((win1_format == ARGB888) ||
+ (win1_format == ABGR888)) ? 1 : 0;
+ int atv_layer_cnt = lcdc_dev->driver.win[0]->state +
+ lcdc_dev->driver.win[1]->state;
+ u32 *_pv = (u32 *)lcdc_dev->regsbak;
+
+ _pv += (DSP_CTRL0 >> 2);
+ win0_top = ((*_pv) & (m_WIN0_TOP)) >> 8;
+
+ if (win0_top && (atv_layer_cnt >= 2) && (win0_alpha_en)) {
+ mask = m_WIN0_ALPHA_EN | m_WIN1_ALPHA_EN |
+ m_WIN1_PREMUL_SCALE;
+ val = v_WIN0_ALPHA_EN(1) | v_WIN1_ALPHA_EN(0) |
+ v_WIN1_PREMUL_SCALE(0);
+ lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
+
+ mask = m_WIN0_ALPHA_MODE | m_PREMUL_ALPHA_ENABLE |
+ m_ALPHA_MODE_SEL1;
+ val = v_WIN0_ALPHA_MODE(1) | v_PREMUL_ALPHA_ENABLE(1) |
+ v_ALPHA_MODE_SEL1(0);
+ lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
+ } else if ((!win0_top) && (atv_layer_cnt >= 2) &&
+ (win1_alpha_en)) {
+ mask = m_WIN0_ALPHA_EN | m_WIN1_ALPHA_EN |
+ m_WIN1_PREMUL_SCALE;
+ val = v_WIN0_ALPHA_EN(0) | v_WIN1_ALPHA_EN(1) |
+ v_WIN1_PREMUL_SCALE(0);
+ lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
+
+ mask = m_WIN1_ALPHA_MODE | m_PREMUL_ALPHA_ENABLE |
+ m_ALPHA_MODE_SEL1;
+ val = v_WIN1_ALPHA_MODE(1) | v_PREMUL_ALPHA_ENABLE(1) |
+ v_ALPHA_MODE_SEL1(0);
+ lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
+ } else {
+ mask = m_WIN0_ALPHA_EN | m_WIN1_ALPHA_EN;
+ val = v_WIN0_ALPHA_EN(0) | v_WIN1_ALPHA_EN(0);
+ lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
+ }
+
+ if (lcdc_dev->driver.win[2]->state == 1) {
+ mask = m_HWC_ALPAH_EN;
+ val = v_HWC_ALPAH_EN(1);
+ lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
+
+ mask = m_HWC_ALPHA_MODE;
+ val = v_HWC_ALPHA_MODE(1);
+ lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
+ } else {
+ mask = m_HWC_ALPAH_EN;
+ val = v_HWC_ALPAH_EN(0);
+ lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
+ }
+