|
@@ -888,6 +888,9 @@ static int fb_check_var(struct fb_var_screeninfo *var,
|
|
|
struct fb_info *info)
|
|
|
{
|
|
|
int err = 0;
|
|
|
+ struct da8xx_fb_par *par = info->par;
|
|
|
+ int bpp = var->bits_per_pixel >> 3;
|
|
|
+ unsigned long line_size = var->xres_virtual * bpp;
|
|
|
|
|
|
if (var->bits_per_pixel > 16 && lcd_revision == LCD_VERSION_1)
|
|
|
return -EINVAL;
|
|
@@ -955,6 +958,21 @@ static int fb_check_var(struct fb_var_screeninfo *var,
|
|
|
var->green.msb_right = 0;
|
|
|
var->blue.msb_right = 0;
|
|
|
var->transp.msb_right = 0;
|
|
|
+
|
|
|
+ if (line_size * var->yres_virtual > par->vram_size)
|
|
|
+ var->yres_virtual = par->vram_size / line_size;
|
|
|
+
|
|
|
+ if (var->yres > var->yres_virtual)
|
|
|
+ var->yres = var->yres_virtual;
|
|
|
+
|
|
|
+ if (var->xres > var->xres_virtual)
|
|
|
+ var->xres = var->xres_virtual;
|
|
|
+
|
|
|
+ if (var->xres + var->xoffset > var->xres_virtual)
|
|
|
+ var->xoffset = var->xres_virtual - var->xres;
|
|
|
+ if (var->yres + var->yoffset > var->yres_virtual)
|
|
|
+ var->yoffset = var->yres_virtual - var->yres;
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|