video: rockchip: vop: 3366: writeback function test ok
authorHuang Jiachai <hjc@rock-chips.com>
Mon, 14 Mar 2016 13:01:29 +0000 (21:01 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Fri, 18 Mar 2016 06:14:52 +0000 (14:14 +0800)
Change-Id: I560a714a86dad83f277d380c3650d4ed7827d80b
Signed-off-by: Huang Jiachai <hjc@rock-chips.com>
drivers/video/rockchip/lcdc/rk3368_lcdc.c
drivers/video/rockchip/lcdc/rk3368_lcdc.h

index 335226404cd1a5980332c754a3a8a5f0dc41fa9f..7814dfa53dd6d27b006656509fce1497aaf55820 100644 (file)
@@ -4688,51 +4688,72 @@ static int rk3368_lcdc_set_wb(struct rk_lcdc_driver *dev_drv)
        struct rk_fb_reg_wb_data *wb_data;
        u32 src_w, src_h, dst_w, dst_h, fmt_cfg;
        u32 xscale_en = 0, x_scale_fac = 0, y_throw = 0;
+       u32 csc_mode = 0, rgb2yuv = 0, dither_en = 0;
 
        if (unlikely(!lcdc_dev->clk_on)) {
                pr_info("%s,clk_on = %d\n", __func__, lcdc_dev->clk_on);
                return 0;
        }
        wb_data = &dev_drv->wb_data;
-       src_w = dev_drv->cur_screen->xsize;
-       src_h = dev_drv->cur_screen->ysize;
-       dst_w = dev_drv->wb_data.xsize;
-       dst_h = dev_drv->wb_data.ysize;
+       if ((wb_data->xsize == 0) || (wb_data->ysize == 0))
+               return 0;
+
+       src_w = dev_drv->cur_screen->mode.xres;
+       src_h = dev_drv->cur_screen->mode.yres;
+       dst_w = wb_data->xsize;
+       dst_h = wb_data->ysize;
+       if (!IS_ALIGNED(dst_w, RK3366_WB_ALIGN))
+               pr_info("dst_w: %d not align 16 pixel\n", dst_w);
+
        if (src_w > dst_w)
                xscale_en = 1;
+       else if (src_w < dst_w)
+               dst_w = src_w;
        else
                xscale_en = 0;
        if (wb_data->state && xscale_en)
                x_scale_fac = GET_SCALE_FACTOR_BILI_DN(src_w, dst_w);
-       if (src_h >= 2 * dst_h)
+       if ((src_h >= 2 * dst_h) && (dst_h != 0))
                y_throw = 1;
        else
                y_throw = 0;
-
        switch (wb_data->data_format) {
-       case ARGB888:
+       case XRGB888:
+       case XBGR888:
                fmt_cfg = 0;
                break;
        case RGB888:
+       case BGR888:
                fmt_cfg = 1;
                break;
        case RGB565:
+       case BGR565:
                fmt_cfg = 2;
+               dither_en = 1;
                break;
        case YUV420:
-               fmt_cfg = 8;
+               fmt_cfg = 4;
+               if (dev_drv->overlay_mode == VOP_RGB_DOMAIN)
+                       rgb2yuv = 1;
+               if ((src_w < 1280) && (src_h < 720))
+                       csc_mode = VOP_R2Y_CSC_BT601;
+               else
+                       csc_mode = VOP_R2Y_CSC_BT709;
                break;
        default:
+               fmt_cfg = 0;
                pr_info("unsupport fmt: %d\n", wb_data->data_format);
                break;
        }
        spin_lock(&lcdc_dev->reg_lock);
        lcdc_msk_reg(lcdc_dev, WB_CTRL0,
                     m_WB_EN | m_WB_FMT | m_WB_XPSD_BIL_EN |
-                    m_WB_YTHROW_EN,
+                    m_WB_YTHROW_EN | m_WB_RGB2YUV_EN | m_WB_RGB2YUV_MODE |
+                    m_WB_DITHER_EN,
                     v_WB_EN(wb_data->state) | v_WB_FMT(fmt_cfg) |
                     v_WB_XPSD_BIL_EN(xscale_en) |
-                    v_WB_YTHROW_EN(y_throw));
+                    v_WB_YTHROW_EN(y_throw) | v_WB_RGB2YUV_EN(rgb2yuv) |
+                    v_WB_RGB2YUV_MODE(csc_mode) | v_WB_DITHER_EN(dither_en));
        lcdc_msk_reg(lcdc_dev, WB_CTRL1,
                     m_WB_WIDTH | m_WB_XPSD_BIL_FACTOR,
                     v_WB_WIDTH(dst_w) |
index 56cc96ce863eecddaa9b3a2128f1bfeb7d89d08e..4826d1486321944199e09e47a74c0d5acbc84550 100755 (executable)
 #define RK3366_GRF_VOP_IOVOL_SEL(x)    (((x) << 0) | (1 << (0 + 16)))
 #define RK3368_GRF_VOP_IOVOL_SEL(x)    (((x) << 5) | (1 << (5 + 16)))
 
+#define RK3366_WB_ALIGN                        16
+
 enum lb_mode {
        LB_YUV_3840X5 = 0x0,
        LB_YUV_2560X8 = 0x1,