From 9c37b9f78463f4ba09ee9aa5b75f8418bbaa0c4c Mon Sep 17 00:00:00 2001 From: hjc Date: Tue, 19 Aug 2014 19:34:20 +0800 Subject: [PATCH] rk3036 lcdc: open interlace read mode when in 576i/480i and y_scale_fac over 2 --- drivers/video/rockchip/lcdc/rk3036_lcdc.c | 12 ++++++++++-- drivers/video/rockchip/lcdc/rk3036_lcdc.h | 2 ++ include/linux/rk_fb.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) mode change 100644 => 100755 drivers/video/rockchip/lcdc/rk3036_lcdc.h diff --git a/drivers/video/rockchip/lcdc/rk3036_lcdc.c b/drivers/video/rockchip/lcdc/rk3036_lcdc.c index bf0502fe7738..8389d5ec98ce 100755 --- a/drivers/video/rockchip/lcdc/rk3036_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3036_lcdc.c @@ -236,7 +236,8 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev, v_WIN0_FORMAT(win->fmt_cfg) | v_WIN0_RB_SWAP(win->swap_rb); lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val); - + lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_WIN0_INTERLACE_EN, + v_WIN0_INTERLACE_EN(win->interlace_read)); lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(win->scale_yrgb_x) | v_Y_SCL_FACTOR(win->scale_yrgb_y)); @@ -267,7 +268,8 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev, v_WIN1_FORMAT(win->fmt_cfg) | v_WIN1_RB_SWAP(win->swap_rb); lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val); - + lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_WIN1_INTERLACE_EN, + v_WIN1_INTERLACE_EN(win->interlace_read)); lcdc_writel(lcdc_dev, WIN1_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(win->scale_yrgb_x) | v_Y_SCL_FACTOR(win->scale_yrgb_y)); @@ -747,6 +749,12 @@ static int rk3036_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id) } win->scale_yrgb_x = calscale(win->area[0].xact, win->post_cfg.xsize); win->scale_yrgb_y = calscale(win->area[0].yact, win->post_cfg.ysize); + win->interlace_read = 0; + if((screen->mode.xres == 720) && + ((screen->mode.yres == 576) || (screen->mode.yres == 480))) { + if(win->scale_yrgb_y > 2*0x1000) + win->interlace_read = 1; + } switch (win->format) { case ARGB888: win->fmt_cfg = VOP_FORMAT_ARGB888; diff --git a/drivers/video/rockchip/lcdc/rk3036_lcdc.h b/drivers/video/rockchip/lcdc/rk3036_lcdc.h old mode 100644 new mode 100755 index 7919d38b4856..83d90299583f --- a/drivers/video/rockchip/lcdc/rk3036_lcdc.h +++ b/drivers/video/rockchip/lcdc/rk3036_lcdc.h @@ -61,6 +61,7 @@ #define m_DITHER_UP_EN (1<<9) #define m_INTERLACE_DSP_EN (1<<12) #define m_INTERLACE_DSP_POL (1<<13) + #define m_WIN0_INTERLACE_EN (1<<14) #define m_WIN1_INTERLACE_EN (1<<15) #define m_WIN0_YRGB_DEFLICK_EN (1<<16) #define m_WIN0_CBR_DEFLICK_EN (1<<17) @@ -83,6 +84,7 @@ #define v_DITHER_UP_EN(x) (((x)&1)<<9) #define v_INTERLACE_DSP_EN(x) (((x)&1)<<12) #define v_INTERLACE_DSP_POL(x) (((x)&1)<<13) + #define v_WIN0_INTERLACE_EN(x) (((x)&1)<<14) #define v_WIN1_INTERLACE_EN(x) (((x)&1)<<15) #define v_WIN0_YRGB_DEFLICK_EN(x) (((x)&1)<<16) #define v_WIN0_CBR_DEFLICK_EN(x) (((x)&1)<<17) diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index e95399432a8f..4388a8646423 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -382,6 +382,7 @@ struct rk_lcdc_win { u32 g_alpha_val; u32 color_key_val; u8 csc_mode; + u8 interlace_read; struct rk_lcdc_win_area area[RK_WIN_MAX_AREA]; struct rk_lcdc_post_cfg post_cfg; -- 2.34.1