rk fb: add win mirror pos config
authorhjc <hjc@rock-chips.com>
Tue, 23 Dec 2014 06:26:48 +0000 (14:26 +0800)
committerhjc <hjc@rock-chips.com>
Mon, 23 Mar 2015 03:01:21 +0000 (11:01 +0800)
Signed-off-by: hjc <hjc@rock-chips.com>
drivers/video/rockchip/rk_fb.c

index 5ae5a4c113a383c550a9c07fc91daa899920d876..b8d4c085b3df2292f256aa787ea2f38f326c6fae 100755 (executable)
@@ -1320,7 +1320,8 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
        }
 
        /* x y mirror ,jump line */
-       if (screen->y_mirror == 1) {
+       if ((screen->y_mirror == 1) ||
+           (win->mirror_en == 1)) {
                if (screen->interlace == 1) {
                        win->area[0].y_offset = yoffset * stride * 2 +
                            ((win->area[0].yact - 1) * 2 + 1) * stride +
@@ -1340,7 +1341,8 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var,
                }
        }
        if (is_pic_yuv == 1) {
-               if (screen->y_mirror == 1) {
+               if ((screen->y_mirror == 1) ||
+                   (win->mirror_en == 1)) {
                        if (screen->interlace == 1) {
                                win->area[0].c_offset =
                                    uv_y_off * uv_stride * 2 +
@@ -2874,51 +2876,6 @@ static int rk_fb_set_par(struct fb_info *info)
                break;
        }
 
-       /* x y mirror ,jump line */
-       if (screen->y_mirror == 1) {
-               if (screen->interlace == 1) {
-                       win->area[0].y_offset = yoffset * stride * 2 +
-                           ((win->area[0].yact - 1) * 2 + 1) * stride +
-                           xoffset * pixel_width / 8;
-               } else {
-                       win->area[0].y_offset = yoffset * stride +
-                           (win->area[0].yact - 1) * stride +
-                           xoffset * pixel_width / 8;
-               }
-       } else {
-               if (screen->interlace == 1) {
-                       win->area[0].y_offset =
-                           yoffset * stride * 2 + xoffset * pixel_width / 8;
-               } else {
-                       win->area[0].y_offset =
-                           yoffset * stride + xoffset * pixel_width / 8;
-               }
-       }
-       if (is_pic_yuv == 1) {
-               if (screen->y_mirror == 1) {
-                       if (screen->interlace == 1) {
-                               win->area[0].c_offset =
-                                   uv_y_off * uv_stride * 2 +
-                                   ((uv_y_act - 1) * 2 + 1) * uv_stride +
-                                   uv_x_off * pixel_width / 8;
-                       } else {
-                               win->area[0].c_offset = uv_y_off * uv_stride +
-                                   (uv_y_act - 1) * uv_stride +
-                                   uv_x_off * pixel_width / 8;
-                       }
-               } else {
-                       if (screen->interlace == 1) {
-                               win->area[0].c_offset =
-                                   uv_y_off * uv_stride * 2 +
-                                   uv_x_off * pixel_width / 8;
-                       } else {
-                               win->area[0].c_offset =
-                                   uv_y_off * uv_stride +
-                                   uv_x_off * pixel_width / 8;
-                       }
-               }
-       }
-
        win->area[0].format = fb_data_fmt;
        win->area[0].y_vir_stride = stride >> 2;
        win->area[0].uv_vir_stride = uv_stride >> 2;
@@ -3181,8 +3138,10 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
        if (rk_fb->disp_mode == ONE_DUAL) {
                if (dev_drv->ops->dsp_black)
                        dev_drv->ops->dsp_black(dev_drv, 1);
-               if (dev_drv->ops->set_screen_scaler)
-                       dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 0);
+               if ((dev_drv->ops->set_screen_scaler) &&
+                   (rk_fb->disp_mode == ONE_DUAL))
+                       dev_drv->ops->set_screen_scaler(dev_drv,
+                                                       dev_drv->screen0, 0);
        }
        if (dev_drv->uboot_logo && (screen->type != dev_drv->cur_screen->type))
                dev_drv->uboot_logo = 0;
@@ -3225,6 +3184,7 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
        } else {
                if (dev_drv->screen1)
                        dev_drv->cur_screen = dev_drv->screen1;
+
                memcpy(dev_drv->cur_screen, screen, sizeof(struct rk_screen));
                dev_drv->cur_screen->xsize = dev_drv->cur_screen->mode.xres;
                dev_drv->cur_screen->ysize = dev_drv->cur_screen->mode.yres;
@@ -3266,8 +3226,9 @@ int rk_fb_switch_screen(struct rk_screen *screen, int enable, int lcdc_id)
                dev_drv->uboot_logo = 0;
        }
        hdmi_switch_complete = 1;
-       if (rk_fb->disp_mode == ONE_DUAL) {
-               if (dev_drv->ops->set_screen_scaler)
+       if ((rk_fb->disp_mode == ONE_DUAL) || (rk_fb->disp_mode == NO_DUAL)) {
+               if ((dev_drv->ops->set_screen_scaler) &&
+                   (rk_fb->disp_mode == ONE_DUAL))
                        dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 1);
                if (dev_drv->ops->dsp_black)
                        dev_drv->ops->dsp_black(dev_drv, 0);