rk fb: define data format for fbdc
authorhjc <hjc@rock-chips.com>
Fri, 26 Dec 2014 10:57:32 +0000 (18:57 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 31 Dec 2014 10:20:13 +0000 (18:20 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/lcdc/rk3368_lcdc.c
drivers/video/rockchip/rk_fb.c
drivers/video/rockchip/rkfb_sysfs.c [changed mode: 0755->0644]
include/linux/rk_fb.h

index 30a4289fc07f9c3ed70c2c1b00bb573aaf28dc74..a00729c10bfddb9d2bc2c84b7621c15a80074be8 100644 (file)
@@ -619,6 +619,7 @@ static int rk3368_lcdc_alpha_cfg(struct rk_lcdc_driver *dev_drv, int win_id)
 
        for (i = 0; i < win->area_num; i++) {
                ppixel_alpha |= ((win->area[i].format == ARGB888) ||
+                                (win->area[i].format == FBDC_ARGB_888) ||
                                 (win->area[i].format == ABGR888)) ? 1 : 0;
        }
        global_alpha = (win->g_alpha_val == 0) ? 0 : 1;
@@ -991,7 +992,6 @@ static int rk3368_init_fbdc_config(struct rk_lcdc_driver *dev_drv, int win_id)
                    (fbdc_mb_yst * fbdc_mb_vir_width) + fbdc_mb_xst;
        }
        /*fbdc fmt maybe need to change*/
-       win->area[0].fbdc_fmt_cfg = win->area[0].fbdc_data_format;
        win->area[0].fbdc_dsp_width_ratio = fbdc_dsp_width_ratio;
        win->area[0].fbdc_mb_vir_width = fbdc_mb_vir_width;
        win->area[0].fbdc_mb_vir_height = fbdc_mb_vir_height;
@@ -1052,8 +1052,13 @@ static int rk3368_win_0_1_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
 
        if (win->state == 1) {
                rk3368_lcdc_csc_mode(lcdc_dev, win);
-               if (win->area[0].fbdc_en)
+               if (win->area[0].fbdc_en) {
                        rk3368_fbdc_reg_update(&lcdc_dev->driver, win_id);
+               } else {
+                       mask = m_IFBDC_CTRL_FBDC_EN;
+                       val = v_IFBDC_CTRL_FBDC_EN(0);
+                       lcdc_msk_reg(lcdc_dev, IFBDC_CTRL, mask, val);
+               }
                mask = m_WIN0_EN | m_WIN0_DATA_FMT | m_WIN0_FMT_10 |
                    m_WIN0_LB_MODE | m_WIN0_RB_SWAP | m_WIN0_X_MIRROR |
                    m_WIN0_Y_MIRROR | m_WIN0_CSC_MODE;
@@ -1145,8 +1150,13 @@ static int rk3368_win_2_3_reg_update(struct rk_lcdc_driver *dev_drv, int win_id)
 
        if (win->state == 1) {
                rk3368_lcdc_csc_mode(lcdc_dev, win);
-               if (win->area[0].fbdc_en)
+               if (win->area[0].fbdc_en) {
                        rk3368_fbdc_reg_update(&lcdc_dev->driver, win_id);
+               } else {
+                       mask = m_IFBDC_CTRL_FBDC_EN;
+                       val = v_IFBDC_CTRL_FBDC_EN(0);
+                       lcdc_msk_reg(lcdc_dev, IFBDC_CTRL, mask, val);
+               }
 
                mask = m_WIN2_EN | m_WIN2_CSC_MODE;
                val = v_WIN2_EN(1) | v_WIN1_CSC_MODE(win->csc_mode);
@@ -2591,6 +2601,24 @@ static int win_0_1_set_par(struct lcdc_device *lcdc_dev,
        if (likely(lcdc_dev->clk_on)) {
                rk3368_lcdc_cal_scl_fac(win);   /*fac,lb,gt2,gt4 */
                switch (win->area[0].format) {
+               case FBDC_RGB_565:
+                       fmt_cfg = 2;
+                       swap_rb = 0;
+                       win->fmt_10 = 0;
+                       win->area[0].fbdc_fmt_cfg = 0x05;
+                       break;
+               case FBDC_ARGB_888:
+                       fmt_cfg = 0;
+                       swap_rb = 0;
+                       win->fmt_10 = 0;
+                       win->area[0].fbdc_fmt_cfg = 0x0c;
+                       break;
+               case FBDC_RGBX_888:
+                       fmt_cfg = 0;
+                       swap_rb = 0;
+                       win->fmt_10 = 0;
+                       win->area[0].fbdc_fmt_cfg = 0x3a;
+                       break;
                case ARGB888:
                        fmt_cfg = 0;
                        swap_rb = 0;
@@ -2685,6 +2713,24 @@ static int win_2_3_set_par(struct lcdc_device *lcdc_dev,
                DBG(2, "lcdc[%d]:win[%d]>>\n>\n", lcdc_dev->id, win->id);
                for (i = 0; i < win->area_num; i++) {
                        switch (win->area[i].format) {
+                       case FBDC_RGB_565:
+                               fmt_cfg = 2;
+                               swap_rb = 0;
+                               win->fmt_10 = 0;
+                               win->area[0].fbdc_fmt_cfg = 0x05;
+                               break;
+                       case FBDC_ARGB_888:
+                               fmt_cfg = 0;
+                               swap_rb = 0;
+                               win->fmt_10 = 0;
+                               win->area[0].fbdc_fmt_cfg = 0x0c;
+                               break;
+                       case FBDC_RGBX_888:
+                               fmt_cfg = 0;
+                               swap_rb = 0;
+                               win->fmt_10 = 0;
+                               win->area[0].fbdc_fmt_cfg = 0x3a;
+                               break;
                        case ARGB888:
                                fmt_cfg = 0;
                                swap_rb = 0;
index a5c6a3c29baacfb826e7162fae0fa75d6fd55e10..9ba1230d55285f60cfdab57ce68a098c0593f9bb 100644 (file)
@@ -147,12 +147,15 @@ int rk_fb_pixel_width(int data_format)
        case XBGR888:
        case ABGR888:
        case ARGB888:
+       case FBDC_ARGB_888:
+       case FBDC_RGBX_888:
                pixel_width = 4 * 8;
                break;
        case RGB888:
                pixel_width = 3 * 8;
                break;
        case RGB565:
+       case FBDC_RGB_565:
                pixel_width = 2 * 8;
                break;
        case YUV422:
@@ -211,6 +214,15 @@ static int rk_fb_data_fmt(int data_format, int bits_per_pixel)
                case HAL_PIXEL_FORMAT_YCrCb_420_SP_10:  /* yuv444 */
                        fb_data_fmt = YUV444_A;
                        break;
+               case HAL_PIXEL_FORMAT_FBDC_RGB565:      /* fbdc rgb565*/
+                       fb_data_fmt = FBDC_RGB_565;
+                       break;
+               case HAL_PIXEL_FORMAT_FBDC_U8U8U8U8:    /* fbdc argb888 */
+                       fb_data_fmt = FBDC_ARGB_888;
+                       break;
+               case HAL_PIXEL_FORMAT_FBDC_U8U8U8:      /* fbdc rgb888 */
+                       fb_data_fmt = FBDC_RGBX_888;
+                       break;
                default:
                        printk(KERN_WARNING "%s:un supported format:0x%x\n",
                               __func__, data_format);
@@ -528,6 +540,15 @@ char *get_format_string(enum data_format format, char *fmt)
        case ABGR888:
                strcpy(fmt, "ABGR888");
                break;
+       case FBDC_RGB_565:
+               strcpy(fmt, "FBDC_RGB_565");
+               break;
+       case FBDC_ARGB_888:
+               strcpy(fmt, "FBDC_ARGB_888");
+               break;
+       case FBDC_RGBX_888:
+               strcpy(fmt, "FBDC_RGBX_888");
+               break;
        default:
                strcpy(fmt, "invalid");
                break;
@@ -2261,11 +2282,6 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
 
        rk_fb_get_prmry_screen(&primary_screen);
        reg_win_data->mirror_en = win_par->mirror_en;
-       reg_win_data->reg_area_data[0].fbdc_en = win_par->area_par[0].fbdc_en;
-       reg_win_data->reg_area_data[0].fbdc_cor_en =
-               win_par->area_par[0].fbdc_cor_en;
-       reg_win_data->reg_area_data[0].fbdc_data_format =
-               win_par->area_par[0].fbdc_data_format;
        for (i = 0; i < reg_win_data->area_num; i++) {
                if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
                        rk_fb_check_config_var(&win_par->area_par[i], screen);
@@ -2274,9 +2290,17 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
 
                fb_data_fmt = rk_fb_data_fmt(win_par->area_par[i].data_format, 0);
                reg_win_data->reg_area_data[i].data_format = fb_data_fmt;
+               if (fb_data_fmt >= FBDC_RGB_565) {
+                       reg_win_data->reg_area_data[i].fbdc_en = 1;
+                       reg_win_data->reg_area_data[i].fbdc_cor_en = 1;
+               } else {
+                       reg_win_data->reg_area_data[i].fbdc_en = 0;
+                       reg_win_data->reg_area_data[i].fbdc_cor_en = 0;
+               }
                pixel_width = rk_fb_pixel_width(fb_data_fmt);
 
                ppixel_a |= ((fb_data_fmt == ARGB888) ||
+                            (fb_data_fmt == FBDC_ARGB_888) ||
                             (fb_data_fmt == ABGR888)) ? 1 : 0;
                /* visiable pos in panel */
                reg_win_data->reg_area_data[i].xpos = win_par->area_par[i].xpos;
@@ -3214,6 +3238,13 @@ static int rk_fb_set_par(struct fb_info *info)
        }
 
        fb_data_fmt = rk_fb_data_fmt(data_format, var->bits_per_pixel);
+       if (fb_data_fmt >= FBDC_RGB_565) {
+               win->area[0].fbdc_en = 1;
+               win->area[0].fbdc_cor_en = 1;
+       } else {
+               win->area[0].fbdc_en = 0;
+               win->area[0].fbdc_cor_en = 0;
+       }
        pixel_width = rk_fb_pixel_width(fb_data_fmt);
        vir_width_bit = pixel_width * xvir;
        /* pixel_width = byte_num * 8 */
@@ -3277,6 +3308,7 @@ static int rk_fb_set_par(struct fb_info *info)
        win->area_num = 1;
        win->alpha_mode = 4;    /* AB_SRC_OVER; */
        win->alpha_en = ((win->area[0].format == ARGB888) ||
+                        (win->area[0].format == FBDC_ARGB_888) ||
                         (win->area[0].format == ABGR888)) ? 1 : 0;
        win->g_alpha_val = 0;
 
old mode 100755 (executable)
new mode 100644 (file)
index da80013..477d718
@@ -65,6 +65,14 @@ static char *get_format_str(enum data_format format)
                return "XBGR888";
        case ABGR888:
                return "ABGR888";
+       case FBDC_RGB_565:
+               return "FBDC_RGB_565";
+       case FBDC_ARGB_888:
+               return "FBDC_ARGB_888";
+       case FBDC_RGBX_888:
+               return "FBDC_RGBX_888";
+       default:
+               break;
        }
 
        return "invalid";
index c4da932d07d861ad9e8e214e04a84b61a53f911d..b1ad85a314f4c5eae1a87862d072c0c3a1d71c65 100644 (file)
@@ -196,8 +196,9 @@ enum {
        HAL_PIXEL_FORMAT_YCrCb_420_SP_10        = 0x24, //YUV444_1obit
 
        HAL_PIXEL_FORMAT_YCrCb_444 = 0x25,      //yuv444
-       
-
+       HAL_PIXEL_FORMAT_FBDC_RGB565    = 0x26,
+       HAL_PIXEL_FORMAT_FBDC_U8U8U8U8  = 0x27, /*ARGB888*/
+       HAL_PIXEL_FORMAT_FBDC_U8U8U8    = 0x28, /*RGBP888*/
 };
 
 //display data format
@@ -213,7 +214,10 @@ enum data_format {
        ABGR888,
        YUV420_A = 10,
        YUV422_A,
-       YUV444_A,       
+       YUV444_A,
+       FBDC_RGB_565 = 0x26,
+       FBDC_ARGB_888,
+       FBDC_RGBX_888,
 };
 
 enum