···391391 pxafb_set_pixfmt(var, mode->depth);392392}393393394394+static int pxafb_adjust_timing(struct pxafb_info *fbi,395395+ struct fb_var_screeninfo *var)396396+{397397+ int line_length;398398+399399+ var->xres = max_t(int, var->xres, MIN_XRES);400400+ var->yres = max_t(int, var->yres, MIN_YRES);401401+402402+ if (!(fbi->lccr0 & LCCR0_LCDT)) {403403+ clamp_val(var->hsync_len, 1, 64);404404+ clamp_val(var->vsync_len, 1, 64);405405+ clamp_val(var->left_margin, 1, 255);406406+ clamp_val(var->right_margin, 1, 255);407407+ clamp_val(var->upper_margin, 1, 255);408408+ clamp_val(var->lower_margin, 1, 255);409409+ }410410+411411+ /* make sure each line is aligned on word boundary */412412+ line_length = var->xres * var->bits_per_pixel / 8;413413+ line_length = ALIGN(line_length, 4);414414+ var->xres = line_length * 8 / var->bits_per_pixel;415415+416416+ /* we don't support xpan, force xres_virtual to be equal to xres */417417+ var->xres_virtual = var->xres;418418+419419+ if (var->accel_flags & FB_ACCELF_TEXT)420420+ var->yres_virtual = fbi->fb.fix.smem_len / line_length;421421+ else422422+ var->yres_virtual = max(var->yres_virtual, var->yres);423423+424424+ /* check for limits */425425+ if (var->xres > MAX_XRES || var->yres > MAX_YRES)426426+ return -EINVAL;427427+428428+ if (var->yres > var->yres_virtual)429429+ return -EINVAL;430430+431431+ return 0;432432+}433433+394434/*395435 * pxafb_check_var():396436 * Get the video params out of 'var'. If a value doesn't fit, round it up,···446406 struct pxafb_mach_info *inf = fbi->dev->platform_data;447407 int err;448408449449- if (var->xres < MIN_XRES)450450- var->xres = MIN_XRES;451451- if (var->yres < MIN_YRES)452452- var->yres = MIN_YRES;453453-454409 if (inf->fixed_modes) {455410 struct pxafb_mode_info *mode;456411···453418 if (!mode)454419 return -EINVAL;455420 pxafb_setmode(var, mode);456456- } else {457457- if (var->xres > inf->modes->xres)458458- return -EINVAL;459459- if (var->yres > inf->modes->yres)460460- return -EINVAL;461461- if (var->bits_per_pixel > inf->modes->bpp)462462- return -EINVAL;463421 }464464-465465- /* we don't support xpan, force xres_virtual to be equal to xres */466466- var->xres_virtual = var->xres;467467-468468- if (var->accel_flags & FB_ACCELF_TEXT)469469- var->yres_virtual = fbi->fb.fix.smem_len /470470- (var->xres_virtual * var->bits_per_pixel / 8);471471- else472472- var->yres_virtual = max(var->yres_virtual, var->yres);473422474423 /* do a test conversion to BPP fields to check the color formats */475424 err = pxafb_var_to_bpp(var);···461442 return err;462443463444 pxafb_set_pixfmt(var, var_to_depth(var));445445+446446+ err = pxafb_adjust_timing(fbi, var);447447+ if (err)448448+ return err;464449465450#ifdef CONFIG_CPU_FREQ466451 pr_debug("pxafb: dma period = %d ps\n",···971948{972949 u_long flags;973950974974-#if DEBUG_VAR975975- if (!(fbi->lccr0 & LCCR0_LCDT)) {976976- if (var->xres < 16 || var->xres > 1024)977977- printk(KERN_ERR "%s: invalid xres %d\n",978978- fbi->fb.fix.id, var->xres);979979- switch (var->bits_per_pixel) {980980- case 1:981981- case 2:982982- case 4:983983- case 8:984984- case 16:985985- case 24:986986- case 32:987987- break;988988- default:989989- printk(KERN_ERR "%s: invalid bit depth %d\n",990990- fbi->fb.fix.id, var->bits_per_pixel);991991- break;992992- }993993-994994- if (var->hsync_len < 1 || var->hsync_len > 64)995995- printk(KERN_ERR "%s: invalid hsync_len %d\n",996996- fbi->fb.fix.id, var->hsync_len);997997- if (var->left_margin < 1 || var->left_margin > 255)998998- printk(KERN_ERR "%s: invalid left_margin %d\n",999999- fbi->fb.fix.id, var->left_margin);10001000- if (var->right_margin < 1 || var->right_margin > 255)10011001- printk(KERN_ERR "%s: invalid right_margin %d\n",10021002- fbi->fb.fix.id, var->right_margin);10031003- if (var->yres < 1 || var->yres > 1024)10041004- printk(KERN_ERR "%s: invalid yres %d\n",10051005- fbi->fb.fix.id, var->yres);10061006- if (var->vsync_len < 1 || var->vsync_len > 64)10071007- printk(KERN_ERR "%s: invalid vsync_len %d\n",10081008- fbi->fb.fix.id, var->vsync_len);10091009- if (var->upper_margin < 0 || var->upper_margin > 255)10101010- printk(KERN_ERR "%s: invalid upper_margin %d\n",10111011- fbi->fb.fix.id, var->upper_margin);10121012- if (var->lower_margin < 0 || var->lower_margin > 255)10131013- printk(KERN_ERR "%s: invalid lower_margin %d\n",10141014- fbi->fb.fix.id, var->lower_margin);10151015- }10161016-#endif1017951 /* Update shadow copy atomically */1018952 local_irq_save(flags);1019953
+6
drivers/video/pxafb.h
···145145#define MIN_XRES 64146146#define MIN_YRES 64147147148148+/* maximum X and Y resolutions - note these are limits from the register149149+ * bits length instead of the real ones150150+ */151151+#define MAX_XRES 1024152152+#define MAX_YRES 1024153153+148154#endif /* __PXAFB_H__ */