vop: rk3288: update dither config for 10bit output mode
authorhjc <hjc@rock-chips.com>
Fri, 5 Jun 2015 07:03:05 +0000 (15:03 +0800)
committerhjc <hjc@rock-chips.com>
Fri, 5 Jun 2015 07:03:47 +0000 (15:03 +0800)
example for 10bit dual lvds output:
timing0 {
screen-type = <SCREEN_DUAL_LVDS>;
out-face    = <OUT_P101010>;
color-mode  = <COLOR_RGB>;
...
}

Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/lcdc/rk3288_lcdc.c
include/dt-bindings/rkfb/rk_fb.h
include/linux/rk_fb.h

index b6af8382737e12ad3fdb3ee25185986d4ac29a5f..8d333957aa3c1949e758a27ce2aad98a0136030e 100755 (executable)
@@ -1157,39 +1157,57 @@ static int rk3288_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                case OUT_P565:
                        face = OUT_P565;
                        mask = m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE |
-                           m_DITHER_DOWN_SEL;
+                           m_DITHER_DOWN_SEL | m_DITHER_UP_EN |
+                           m_PRE_DITHER_DOWN_EN;
                        val = v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(0) |
-                           v_DITHER_DOWN_SEL(1);
+                           v_DITHER_DOWN_SEL(1) | v_DITHER_UP_EN(1) |
+                           v_PRE_DITHER_DOWN_EN(1);
                        lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
                        break;
                case OUT_P666:
                        face = OUT_P666;
                        mask = m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE |
-                           m_DITHER_DOWN_SEL;
+                           m_DITHER_DOWN_SEL | m_DITHER_UP_EN |
+                           m_PRE_DITHER_DOWN_EN;
                        val = v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(1) |
-                           v_DITHER_DOWN_SEL(1);
+                           v_DITHER_DOWN_SEL(1) | v_DITHER_UP_EN(1) |
+                           v_PRE_DITHER_DOWN_EN(1);
                        lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
                        break;
                case OUT_D888_P565:
                        face = OUT_P888;
                        mask = m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE |
-                           m_DITHER_DOWN_SEL;
+                           m_DITHER_DOWN_SEL | m_DITHER_UP_EN |
+                           m_PRE_DITHER_DOWN_EN;
                        val = v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(0) |
-                           v_DITHER_DOWN_SEL(1);
+                           v_DITHER_DOWN_SEL(1) | v_DITHER_UP_EN(1) |
+                           v_PRE_DITHER_DOWN_EN(1);
                        lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
                        break;
                case OUT_D888_P666:
                        face = OUT_P888;
                        mask = m_DITHER_DOWN_EN | m_DITHER_DOWN_MODE |
-                           m_DITHER_DOWN_SEL;
+                           m_DITHER_DOWN_SEL | m_DITHER_UP_EN |
+                           m_PRE_DITHER_DOWN_EN;
                        val = v_DITHER_DOWN_EN(1) | v_DITHER_DOWN_MODE(1) |
-                           v_DITHER_DOWN_SEL(1);
+                           v_DITHER_DOWN_SEL(1) | v_DITHER_UP_EN(1) |
+                           v_PRE_DITHER_DOWN_EN(1);
                        lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
                        break;
                case OUT_P888:
                        face = OUT_P888;
-                       mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
-                       val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
+                       mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN |
+                               m_PRE_DITHER_DOWN_EN;
+                       val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(1) |
+                           v_PRE_DITHER_DOWN_EN(1);
+                       lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
+                       break;
+               case OUT_P101010:
+                       face = OUT_P101010;
+                       mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN |
+                               m_PRE_DITHER_DOWN_EN;
+                       val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(1) |
+                           v_PRE_DITHER_DOWN_EN(0);
                        lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
                        break;
                default:
@@ -1199,24 +1217,18 @@ static int rk3288_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                switch(screen->type){
                case SCREEN_RGB:
                case SCREEN_LVDS:
-               case SCREEN_DUAL_LVDS:                  
-                       mask = m_RGB_OUT_EN;
-                       val = v_RGB_OUT_EN(1);
-                       v = 1 << (3+16);
-                       v |= (lcdc_dev->id << 3);
-                       break;
+               case SCREEN_DUAL_LVDS:
                case SCREEN_LVDS_10BIT:
                case SCREEN_DUAL_LVDS_10BIT:
                        mask = m_RGB_OUT_EN;
                        val = v_RGB_OUT_EN(1);
                        v = 1 << (3+16);
                        v |= (lcdc_dev->id << 3);
-                       face = OUT_RGB_AAA;  /*RGB AAA output*/
                        break;
                case SCREEN_HDMI:
-                       face = OUT_RGB_AAA;
+                       face = OUT_P101010;/*RGB 101010 output*/
                        mask = m_HDMI_OUT_EN;
-                       val = v_HDMI_OUT_EN(1);         
+                       val = v_HDMI_OUT_EN(1);
                        break;
                case SCREEN_MIPI:
                        mask = m_MIPI_OUT_EN;
@@ -1227,12 +1239,9 @@ static int rk3288_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
                        val = v_MIPI_OUT_EN(1) | v_DOUB_CHANNEL_EN(1);  
                        break;
                case SCREEN_EDP:
-                       face = OUT_RGB_AAA;  /*RGB AAA output*/
-                       mask = m_DITHER_DOWN_EN | m_DITHER_UP_EN;
-                       val = v_DITHER_DOWN_EN(0) | v_DITHER_UP_EN(0);
-                       lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
+                       face = OUT_P101010;  /*RGB 101010 output*/
                        mask = m_EDP_OUT_EN;
-                       val = v_EDP_OUT_EN(1);          
+                       val = v_EDP_OUT_EN(1);
                        break;
                }
                lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
index e1daff3c1c69ca47cbbe22742c39d7a3ef2468cf..a6d7e8983ae69184d528b8dabec5de279532e810 100755 (executable)
@@ -21,6 +21,7 @@
 #define OUT_S888            8
 #define OUT_S888DUMY        12
 #define OUT_YUV_420        14
+#define OUT_P101010        15
 #define OUT_P16BPP4         24
 #define OUT_D888_P666       0x21       //18bit screen,connect to lcdc D2~D7, D10~D15, D18~D23
 #define OUT_D888_P565       0x22
index 386a124b18890ea7e4c0a358f4d5bb6e451b5081..a8dcfa03d8022b5affb5bb412d7902328792bc03 100755 (executable)
@@ -129,7 +129,7 @@ extern bool rk_fb_poll_wait_frame_complete(void);
 #define OUT_S888            8
 #define OUT_S888DUMY        12
 #define OUT_YUV_420        14
-#define OUT_RGB_AAA        15
+#define OUT_P101010        15
 #define OUT_P16BPP4         24
 #define OUT_D888_P666       0x21       //18bit screen,connect to lcdc D2~D7, D10~D15, D18~D23
 #define OUT_D888_P565       0x22