Intel FB: force even line count in interlaced mode
authorKrzysztof Halasa <khc@pm.waw.pl>
Tue, 16 Oct 2007 08:29:33 +0000 (01:29 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 16 Oct 2007 16:43:20 +0000 (09:43 -0700)
Intel FB: the chip adds two halflines automatically in interlaced mode,
force even line count for the right timings.

Signed-off-by: Krzysztof Halasa <khc@pm.waw.pl>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Cc: <sylvain.meyer@worldonline.fr>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/intelfb/intelfbhw.c

index 270f6552603cadedd37d623f519338657d387f58..a02ee24f36681890e89450935ab33c25bb30a8da 100644 (file)
@@ -317,6 +317,14 @@ int intelfbhw_validate_mode(struct intelfb_info *dinfo,
                        var->yres, VACTIVE_MASK + 1);
                return 1;
        }
+       if (var->xres < 4) {
+               WRN_MSG("X resolution too small (%d vs 4).\n", var->xres);
+               return 1;
+       }
+       if (var->yres < 4) {
+               WRN_MSG("Y resolution too small (%d vs 4).\n", var->yres);
+               return 1;
+       }
 
        /* Check for doublescan modes. */
        if (var->vmode & FB_VMODE_DOUBLE) {
@@ -324,6 +332,11 @@ int intelfbhw_validate_mode(struct intelfb_info *dinfo,
                return 1;
        }
 
+       if ((var->vmode & FB_VMODE_INTERLACED) && (var->yres & 1)) {
+               WRN_MSG("Odd number of lines in interlaced mode\n");
+               return 1;
+       }
+
        /* Check if clock is OK. */
        tmp = 1000000000 / var->pixclock;
        if (tmp < MIN_CLOCK) {
@@ -1127,6 +1140,8 @@ int intelfbhw_mode_to_hw(struct intelfb_info *dinfo,
                hblank_end);
 
        vactive = var->yres;
+       if (var->vmode & FB_VMODE_INTERLACED)
+               vactive--; /* the chip adds 2 halflines automatically */
        vsync_start = vactive + var->lower_margin;
        vsync_end = vsync_start + var->vsync_len;
        vtotal = vsync_end + var->upper_margin;