From d14bc670a6bf418da0b2ecd3ea1e68f55f4c72a3 Mon Sep 17 00:00:00 2001 From: Mark Yao Date: Tue, 12 Jan 2016 15:02:47 +0800 Subject: [PATCH] video: rk_fb: spilt mirror into x/y mirror Uboot logo need ymirror function, but now only have mirror_en to enable both xmirror and ymirror. Change-Id: Ic676c4451817db2127327a1a56addeccb2436f21 Signed-off-by: Mark Yao --- drivers/video/rockchip/lcdc/rk3368_lcdc.c | 22 ++++++++++++---------- drivers/video/rockchip/rk_fb.c | 12 +++++++++--- include/linux/rk_fb.h | 3 ++- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/drivers/video/rockchip/lcdc/rk3368_lcdc.c b/drivers/video/rockchip/lcdc/rk3368_lcdc.c index 8c47829ba5ef..c79f6e5da080 100644 --- a/drivers/video/rockchip/lcdc/rk3368_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3368_lcdc.c @@ -948,7 +948,8 @@ static int rk3368_fbdc_reg_update(struct rk_lcdc_driver *dev_drv, int win_id) val = v_IFBDC_CTRL_FBDC_EN(win->area[0].fbdc_en) | v_IFBDC_CTRL_FBDC_COR_EN(win->area[0].fbdc_cor_en) | v_IFBDC_CTRL_FBDC_WIN_SEL(win->id) | - v_IFBDC_CTRL_FBDC_ROTATION_MODE(win->mirror_en << 1) | + v_IFBDC_CTRL_FBDC_ROTATION_MODE((win->xmirror && + win->ymirror) << 1) | v_IFBDC_CTRL_FBDC_FMT(win->area[0].fbdc_fmt_cfg) | v_IFBDC_CTRL_WIDTH_RATIO(win->area[0].fbdc_dsp_width_ratio); lcdc_msk_reg(lcdc_dev, IFBDC_CTRL, mask, val); @@ -1072,7 +1073,7 @@ static int rk3368_init_fbdc_config(struct rk_lcdc_driver *dev_drv, int win_id) break; } */ - if ((win->mirror_en) && ((win_id == 2) || (win_id == 3))) { + if (win->xmirror && win->ymirror && ((win_id == 2) || (win_id == 3))) { fbdc_cmp_index_init = ((fbdc_mb_yst + (fbdc_mb_height - 1)) * fbdc_mb_vir_width) + (fbdc_mb_xst + (fbdc_mb_width - 1)); @@ -1211,8 +1212,8 @@ static int rk3368_win_0_1_reg_update(struct rk_lcdc_driver *dev_drv, int win_id) v_WIN0_FMT_10(win->fmt_10) | v_WIN0_LB_MODE(win->win_lb_mode) | v_WIN0_RB_SWAP(win->area[0].swap_rb) | - v_WIN0_X_MIRROR(win->mirror_en) | - v_WIN0_Y_MIRROR(win->mirror_en) | + v_WIN0_X_MIRROR(win->xmirror) | + v_WIN0_Y_MIRROR(win->ymirror) | v_WIN0_CSC_MODE(win->csc_mode) | v_WIN0_UV_SWAP(win->area[0].swap_uv); lcdc_msk_reg(lcdc_dev, WIN0_CTRL0 + off, mask, val); @@ -1851,6 +1852,7 @@ static int rk3368_post_dspbuf(struct rk_lcdc_driver *dev_drv, u32 rgb_mst, lcdc_writel(lcdc_dev, WIN0_YRGB_MST, rgb_mst); lcdc_cfg_done(lcdc_dev); + win->ymirror = ymirror; win->state = 1; win->last_state = 1; @@ -2640,7 +2642,7 @@ static int rk3368_lcdc_cal_scl_fac(struct rk_lcdc_win *win, __func__, win->win_lb_mode); break; } - if (win->mirror_en == 1) + if (win->ymirror == 1) win->yrgb_vsd_mode = SCALE_DOWN_BIL; if (screen->mode.vmode & FB_VMODE_INTERLACED) { @@ -2924,8 +2926,8 @@ static int win_0_1_set_par(struct lcdc_device *lcdc_dev, u8 fmt_cfg = 0, swap_rb, swap_uv = 0; char fmt[9] = "NULL"; - xpos = dsp_x_pos(win->mirror_en, screen, &win->area[0]); - ypos = dsp_y_pos(win->mirror_en, screen, &win->area[0]); + xpos = dsp_x_pos(win->xmirror, screen, &win->area[0]); + ypos = dsp_y_pos(win->ymirror, screen, &win->area[0]); spin_lock(&lcdc_dev->reg_lock); if (likely(lcdc_dev->clk_on)) { @@ -3049,7 +3051,7 @@ static int win_2_3_set_par(struct lcdc_device *lcdc_dev, u8 fmt_cfg, swap_rb; char fmt[9] = "NULL"; - if (win->mirror_en) + if (win->ymirror) pr_err("win[%d] not support y mirror\n", win->id); spin_lock(&lcdc_dev->reg_lock); if (likely(lcdc_dev->clk_on)) { @@ -3099,10 +3101,10 @@ static int win_2_3_set_par(struct lcdc_device *lcdc_dev, win->area[i].fmt_cfg = fmt_cfg; win->area[i].swap_rb = swap_rb; win->area[i].dsp_stx = - dsp_x_pos(win->mirror_en, screen, + dsp_x_pos(win->xmirror, screen, &win->area[i]); win->area[i].dsp_sty = - dsp_y_pos(win->mirror_en, screen, + dsp_y_pos(win->ymirror, screen, &win->area[i]); if (((win->area[i].xact != win->area[i].xsize) || (win->area[i].yact != win->area[i].ysize)) && diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index b1e075fb6377..cda6a811873c 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -1348,7 +1348,7 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, /* x y mirror ,jump line */ if ((screen->y_mirror == 1) || - (win->mirror_en == 1)) { + (win->xmirror && win->ymirror)) { if (screen->interlace == 1) { win->area[0].y_offset = yoffset * stride * 2 + ((win->area[0].yact - 1) * 2 + 1) * stride + @@ -1369,7 +1369,7 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, } if (is_pic_yuv == 1) { if ((screen->y_mirror == 1) || - (win->mirror_en == 1)) { + (win->xmirror && win->ymirror)) { if (screen->interlace == 1) { win->area[0].c_offset = uv_y_off * uv_stride * 2 + @@ -1577,7 +1577,12 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv, win->alpha_en = reg_win_data->alpha_en; win->alpha_mode = reg_win_data->alpha_mode; win->g_alpha_val = reg_win_data->g_alpha_val; - win->mirror_en = reg_win_data->mirror_en; + /* + * reg_win_data mirror_en means that xmirror ymirror all + * enabled. + */ + win->xmirror = reg_win_data->mirror_en ? 1 : 0; + win->ymirror = reg_win_data->mirror_en ? 1 : 0; win->colorspace = reg_win_data->colorspace; win->area[0].fbdc_en = reg_win_data->reg_area_data[0].fbdc_en; @@ -3157,6 +3162,7 @@ static int rk_fb_set_par(struct fb_info *info) win->area[0].yvir = var->yres_virtual; win->area[0].xoff = xoffset; win->area[0].yoff = yoffset; + win->ymirror = 0; win->state = 1; win->last_state = 1; diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index 40931041b5ac..3ca797f09a82 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -422,9 +422,10 @@ struct rk_lcdc_win { u8 alpha_en; u8 alpha_mode; u16 g_alpha_val; - u8 mirror_en; u32 color_key_val; u8 csc_mode; + u8 xmirror; + u8 ymirror; struct rk_lcdc_win_area area[RK_WIN_MAX_AREA]; struct rk_lcdc_post_cfg post_cfg; -- 2.34.1