From: hjc <hjc@rock-chips.com>
Date: Sat, 9 May 2015 08:16:52 +0000 (+0800)
Subject: rk3368 lcdc: update deflick config for interlace mode ouput
X-Git-Tag: firefly_0821_release~4158^2~94
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9067ef55f1640445b8ca2f1fdd17dc22915bbf98;p=firefly-linux-kernel-4.4.55.git

rk3368 lcdc: update deflick config for interlace mode ouput

Signed-off-by: hjc <hjc@rock-chips.com>
---

diff --git a/drivers/video/rockchip/lcdc/rk3368_lcdc.c b/drivers/video/rockchip/lcdc/rk3368_lcdc.c
index 85deb598ede5..b4202f2b777d 100755
--- a/drivers/video/rockchip/lcdc/rk3368_lcdc.c
+++ b/drivers/video/rockchip/lcdc/rk3368_lcdc.c
@@ -1242,6 +1242,15 @@ static int rk3368_win_0_1_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
 			lcdc_msk_reg(lcdc_dev, WIN0_SRC_ALPHA_CTRL + off,
 				     mask, val);
 		}
+
+		if (dev_drv->cur_screen->mode.vmode == FB_VMODE_INTERLACED) {
+			mask = m_WIN0_YRGB_DEFLICK | m_WIN0_CBR_DEFLICK;
+			if (win->area[0].yact == 2 * win->area[0].ysize)
+				val =v_WIN0_YRGB_DEFLICK(0) | v_WIN0_CBR_DEFLICK(0);
+			else
+				val =v_WIN0_YRGB_DEFLICK(1) | v_WIN0_CBR_DEFLICK(1);
+			lcdc_msk_reg(lcdc_dev, WIN0_CTRL0, mask, val);
+		}
 	} else {
 		mask = m_WIN0_EN;
 		val = v_WIN0_EN(win->state);
@@ -1631,16 +1640,16 @@ static int rk3368_config_timing(struct rk_lcdc_driver *dev_drv)
 		    m_WIN0_INTERLACE_READ | m_WIN0_YRGB_DEFLICK |
 		    m_WIN0_CBR_DEFLICK;
 		val =
-		    v_WIN0_INTERLACE_READ(1) | v_WIN0_YRGB_DEFLICK(1) |
-		    v_WIN0_CBR_DEFLICK(1);
+		    v_WIN0_INTERLACE_READ(1) | v_WIN0_YRGB_DEFLICK(0) |
+		    v_WIN0_CBR_DEFLICK(0);
 		lcdc_msk_reg(lcdc_dev, WIN0_CTRL0, mask, val);
 
 		mask =
 		    m_WIN1_INTERLACE_READ | m_WIN1_YRGB_DEFLICK |
 		    m_WIN1_CBR_DEFLICK;
 		val =
-		    v_WIN1_INTERLACE_READ(1) | v_WIN1_YRGB_DEFLICK(1) |
-		    v_WIN1_CBR_DEFLICK(1);
+		    v_WIN1_INTERLACE_READ(1) | v_WIN1_YRGB_DEFLICK(0) |
+		    v_WIN1_CBR_DEFLICK(0);
 		lcdc_msk_reg(lcdc_dev, WIN1_CTRL0, mask, val);
 
 		mask = m_WIN2_INTERLACE_READ;
@@ -2378,7 +2387,7 @@ static int rk3368_lcdc_pan_display(struct rk_lcdc_driver *dev_drv, int win_id)
 	return 0;
 }
 
-static int rk3368_lcdc_cal_scl_fac(struct rk_lcdc_win *win)
+static int rk3368_lcdc_cal_scl_fac(struct rk_lcdc_win *win, struct rk_screen *screen)
 {
 	u16 srcW;
 	u16 srcH;
@@ -2582,10 +2591,14 @@ static int rk3368_lcdc_cal_scl_fac(struct rk_lcdc_win *win)
 			__func__, win->win_lb_mode);
 		break;
 	}
-	if (win->mirror_en == 1) {	/*interlace mode must bill */
+	if (win->mirror_en == 1) {
 		win->yrgb_vsd_mode = SCALE_DOWN_BIL;
 	}
-
+	if (screen->mode.vmode == FB_VMODE_INTERLACED) {
+		/*interlace mode must bill */
+		win->yrgb_vsd_mode = SCALE_DOWN_BIL;
+		win->cbr_vsd_mode = SCALE_DOWN_BIL;
+	}
 	if ((win->yrgb_ver_scl_mode == SCALE_DOWN) &&
 	    (win->area[0].fbdc_en == 1)) {
 		/*in this pattern,use bil mode,not support souble scd,
@@ -2867,7 +2880,7 @@ static int win_0_1_set_par(struct lcdc_device *lcdc_dev,
 
 	spin_lock(&lcdc_dev->reg_lock);
 	if (likely(lcdc_dev->clk_on)) {
-		rk3368_lcdc_cal_scl_fac(win);	/*fac,lb,gt2,gt4 */
+		rk3368_lcdc_cal_scl_fac(win, screen);	/*fac,lb,gt2,gt4 */
 		switch (win->area[0].format) {
 		case FBDC_RGB_565:
 			fmt_cfg = 2;
@@ -3042,8 +3055,9 @@ static int win_2_3_set_par(struct lcdc_device *lcdc_dev,
 			win->area[i].dsp_sty =
 					dsp_y_pos(win->mirror_en, screen,
 						  &win->area[i]);
-			if ((win->area[i].xact != win->area[i].xsize) ||
-			    (win->area[i].yact != win->area[i].ysize)) {
+			if (((win->area[i].xact != win->area[i].xsize) ||
+			    (win->area[i].yact != win->area[i].ysize)) &&
+			    (screen->mode.vmode == FB_VMODE_NONINTERLACED)) {
                                 pr_err("win[%d]->area[%d],not support scale\n",
                                         win->id, i);
                                 pr_err("xact=%d,yact=%d,xsize=%d,ysize=%d\n",