From f93e3bcf22f3afe97b66728872be13a89f15a02d Mon Sep 17 00:00:00 2001 From: hjc Date: Fri, 26 Dec 2014 18:57:32 +0800 Subject: [PATCH] rk fb: define data format for fbdc Signed-off-by: hjc --- drivers/video/rockchip/lcdc/rk3368_lcdc.c | 52 +++++++++++++++++++++-- drivers/video/rockchip/rk_fb.c | 42 +++++++++++++++--- drivers/video/rockchip/rkfb_sysfs.c | 8 ++++ include/linux/rk_fb.h | 10 +++-- 4 files changed, 101 insertions(+), 11 deletions(-) mode change 100755 => 100644 drivers/video/rockchip/rkfb_sysfs.c diff --git a/drivers/video/rockchip/lcdc/rk3368_lcdc.c b/drivers/video/rockchip/lcdc/rk3368_lcdc.c index 30a4289fc07f..a00729c10bfd 100644 --- a/drivers/video/rockchip/lcdc/rk3368_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3368_lcdc.c @@ -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; diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index a5c6a3c29baa..9ba1230d5528 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -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; diff --git a/drivers/video/rockchip/rkfb_sysfs.c b/drivers/video/rockchip/rkfb_sysfs.c old mode 100755 new mode 100644 index da80013612d7..477d718c61ac --- a/drivers/video/rockchip/rkfb_sysfs.c +++ b/drivers/video/rockchip/rkfb_sysfs.c @@ -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"; diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index c4da932d07d8..b1ad85a314f4 100644 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -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 -- 2.34.1