rk fb:
authorzwl <zwl@rockchips.com>
Thu, 30 Oct 2014 09:58:06 +0000 (17:58 +0800)
committerzwl <zwl@rockchips.com>
Thu, 30 Oct 2014 10:00:57 +0000 (18:00 +0800)
* fix fence timeout when set hdmi scaler or switch hdmi resolution if at ONE_DUAL display mode

Signed-off-by: zwl <zwl@rock-chips.com>
Signed-off-by: xzj <xzj@rock-chips.com>
drivers/video/rockchip/rk_fb.c

index 0594723d566ed89da54284f12be5332082e33d8a..2db236f0762fb0188c1222d82b7c8da2650561d2 100755 (executable)
@@ -1770,6 +1770,25 @@ static void rk_fb_update_win(struct rk_lcdc_driver *dev_drv,
                                                 reg_win_data->reg_area_data[i].ysize *
                                                 cur_screen->mode.yres /
                                                 primary_screen.mode.yres;
+
+                                       /* recalc display size if set hdmi scaler when at ONE_DUAL mode */
+                                       if (inf->disp_mode == ONE_DUAL && hdmi_switch_complete) {
+                                               if (cur_screen->xsize > 0 &&
+                                                   cur_screen->xsize <= cur_screen->mode.xres) {
+                                                       win->area[i].xpos =
+                                                               ((cur_screen->mode.xres - cur_screen->xsize) >> 1) +
+                                                               cur_screen->xsize * win->area[i].xpos / cur_screen->mode.xres;
+                                                       win->area[i].xsize =
+                                                               win->area[i].xsize * cur_screen->xsize / cur_screen->mode.xres;
+                                               }
+                                               if (cur_screen->ysize > 0 && cur_screen->ysize <= cur_screen->mode.yres) {
+                                                       win->area[i].ypos =
+                                                               ((cur_screen->mode.yres - cur_screen->ysize) >> 1) +
+                                                               cur_screen->ysize * win->area[i].ypos / cur_screen->mode.yres;
+                                                       win->area[i].ysize =
+                                                               win->area[i].ysize * cur_screen->ysize / cur_screen->mode.yres;
+                                               }
+                                       }
                                 }
                                win->area[i].xact =
                                    reg_win_data->reg_area_data[i].xact;
@@ -2245,6 +2264,13 @@ static int rk_fb_set_win_buffer(struct fb_info *info,
                        }
                }
        }
+
+       /* record buffer information for rk_fb_disp_scale to prevent fence timeout
+        * because rk_fb_disp_scale will call function info->fbops->fb_set_par(info);
+        */
+       fix->smem_start = reg_win_data->reg_area_data[0].smem_start;
+       info->var.yoffset = yoffset;
+       info->var.xoffset = xoffset;
        return 0;
 }