|
@@ -722,14 +722,30 @@ static void try_to_load(int fb)
|
|
|
int
|
|
|
fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)
|
|
|
{
|
|
|
+ struct fb_fix_screeninfo *fix = &info->fix;
|
|
|
int xoffset = var->xoffset;
|
|
|
int yoffset = var->yoffset;
|
|
|
- int err;
|
|
|
+ int err = 0, yres = info->var.yres;
|
|
|
+
|
|
|
+ if (var->yoffset > 0) {
|
|
|
+ if (var->vmode & FB_VMODE_YWRAP) {
|
|
|
+ if (!fix->ywrapstep || (var->yoffset % fix->ywrapstep))
|
|
|
+ err = -EINVAL;
|
|
|
+ else
|
|
|
+ yres = 0;
|
|
|
+ } else if (!fix->ypanstep || (var->yoffset % fix->ypanstep))
|
|
|
+ err = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (var->xoffset > 0 && (!fix->xpanstep ||
|
|
|
+ (var->xoffset % fix->xpanstep)))
|
|
|
+ err = -EINVAL;
|
|
|
+
|
|
|
+ if (err || !info->fbops->fb_pan_display || xoffset < 0 ||
|
|
|
+ yoffset < 0 || var->yoffset + yres > info->var.yres_virtual ||
|
|
|
+ var->xoffset + info->var.xres > info->var.xres_virtual)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- if (xoffset < 0 || yoffset < 0 || !info->fbops->fb_pan_display ||
|
|
|
- xoffset + info->var.xres > info->var.xres_virtual ||
|
|
|
- yoffset + info->var.yres > info->var.yres_virtual)
|
|
|
- return -EINVAL;
|
|
|
if ((err = info->fbops->fb_pan_display(var, info)))
|
|
|
return err;
|
|
|
info->var.xoffset = var->xoffset;
|