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) {
                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) {
                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;