rk3036 lcdc: open interlace read mode when in 576i/480i and y_scale_fac over 2
authorhjc <hjc@rock-chips.com>
Tue, 19 Aug 2014 11:34:20 +0000 (19:34 +0800)
committerhjc <hjc@rock-chips.com>
Tue, 19 Aug 2014 11:56:34 +0000 (19:56 +0800)
drivers/video/rockchip/lcdc/rk3036_lcdc.c
drivers/video/rockchip/lcdc/rk3036_lcdc.h [changed mode: 0644->0755]
include/linux/rk_fb.h

index bf0502fe77382afe5341bfbb02c29f1bbabbe852..8389d5ec98ce6a35a9a13734f5a0647cd616b9a1 100755 (executable)
@@ -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;
old mode 100644 (file)
new mode 100755 (executable)
index 7919d38..83d9029
@@ -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)
index e95399432a8f57fee402d545824ae025df14b295..4388a8646423b8b8ded62e4caac382345d8edf27 100755 (executable)
@@ -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;