{
        struct tridentfb_par *par = info->par;
        int bpp = var->bits_per_pixel;
+       int ramdac = 230000; /* 230MHz for most 3D chips */
        debug("enter\n");
 
        /* check color depth */
        /* check whether resolution fits on panel and in memory */
        if (par->flatpanel && nativex && var->xres > nativex)
                return -EINVAL;
+       /* various resolution checks */
+       var->xres = (var->xres + 7) & ~0x7;
+       if (var->xres != var->xres_virtual)
+               var->xres_virtual = var->xres;
+       if (var->yres > var->yres_virtual)
+               var->yres_virtual = var->yres;
        if (var->xres * var->yres_virtual * bpp / 8 > info->fix.smem_len)
                return -EINVAL;
 
        default:
                return -EINVAL;
        }
+
+       if (is_xp(par->chip_id))
+               ramdac = 350000;
+
+       switch (par->chip_id) {
+       case TGUI9440:
+               ramdac = 90000;
+               break;
+       case CYBER9320:
+       case TGUI9660:
+               ramdac = 135000;
+               break;
+       case PROVIDIA9685:
+       case CYBER9388:
+       case CYBER9382:
+       case CYBER9385:
+               ramdac = 170000;
+               break;
+       }
+
+       /* The clock is doubled for 32 bpp */
+       if (bpp == 32)
+               ramdac /= 2;
+
+       if (PICOS2KHZ(var->pixclock) > ramdac)
+               return -EINVAL;
+
        debug("exit\n");
 
        return 0;