video: rk_fb: spilt mirror into x/y mirror
authorMark Yao <mark.yao@rock-chips.com>
Tue, 12 Jan 2016 07:02:47 +0000 (15:02 +0800)
committerHuang Jiachai <hjc@rock-chips.com>
Thu, 14 Jan 2016 05:59:49 +0000 (13:59 +0800)
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 <mark.yao@rock-chips.com>
drivers/video/rockchip/lcdc/rk3368_lcdc.c
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index 8c47829ba5efe03b78fb62cd550e28454d95f85e..c79f6e5da080d99bcd061ede1880b5dfb5e69b11 100644 (file)
@@ -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)) &&
index b1e075fb6377e11946fae30f423fbcd827be8a3b..cda6a811873cd4afed2bb0c5e992f2b12a2d09d5 100644 (file)
@@ -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;
 
index 40931041b5acc07578d8d89bb05a22b130593243..3ca797f09a827659adbb06896ac26aeba951ae99 100755 (executable)
@@ -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;