* suspend/resume support
        * DPMS support
 
-Text mode is supported even in higher resolutions, but there is limitation
-to lower pixclocks (maximum between 50-60 MHz, depending on specific hardware).
-This limitation is not enforced by driver. Text mode supports 8bit wide fonts
-only (hardware limitation) and 16bit tall fonts (driver limitation).
+Text mode is supported even in higher resolutions, but there is limitation to
+lower pixclocks (maximum usually between 50-60 MHz, depending on specific
+hardware, i get best results from plain S3 Trio32 card - about 75 MHz). This
+limitation is not enforced by driver. Text mode supports 8bit wide fonts only
+(hardware limitation) and 16bit tall fonts (driver limitation). Text mode
+support is broken on S3 Trio64 V2/DX.
 
 There are two 4 bpp modes. First mode (selected if nonstd == 0) is mode with
 packed pixels, high nibble first. Second mode (selected if nonstd == 1) is mode
 ==========
 
        * cursor disable in text mode doesn't work
+       * text mode broken on S3 Trio64 V2/DX
+
 
 --
 Ondrej Zajicek <santiago@crfreenet.org>
 
 
 
 static const struct svga_pll s3_pll = {3, 129, 3, 33, 0, 3,
-       60000, 240000, 14318};
+       35000, 240000, 14318};
 
 static const int s3_memsizes[] = {4096, 0, 3072, 8192, 2048, 6144, 1024, 512};
 
 {
        u16 m, n, r;
        u8 regval;
+       int rv;
 
-       svga_compute_pll(&s3_pll, 1000000000 / pixclock, &m, &n, &r, info->node);
+       rv = svga_compute_pll(&s3_pll, 1000000000 / pixclock, &m, &n, &r, info->node);
+       if (rv < 0) {
+               printk(KERN_ERR "fb%d: cannot set requested pixclock, keeping old value\n", info->node);
+               return;
+       }
 
        /* Set VGA misc register  */
        regval = vga_r(NULL, VGA_MIS_R);
                break;
        case 16:
                if (regno >= 16)
-                       return -EINVAL;
+                       return 0;
 
                if (fb->var.green.length == 5)
                        ((u32*)fb->pseudo_palette)[regno] = ((red & 0xF800) >> 1) |
        case 24:
        case 32:
                if (regno >= 16)
-                       return -EINVAL;
+                       return 0;
 
-               ((u32*)fb->pseudo_palette)[regno] = ((transp & 0xFF00) << 16) | ((red & 0xFF00) << 8) |
+               ((u32*)fb->pseudo_palette)[regno] = ((red & 0xFF00) << 8) |
                        (green & 0xFF00) | ((blue & 0xFF00) >> 8);
                break;
        default:
 
        unsigned int offset;
 
-       /* Validate the offsets */
-       if ((var->xoffset + var->xres) > var->xres_virtual)
-               return -EINVAL;
-       if ((var->yoffset + var->yres) > var->yres_virtual)
-               return -EINVAL;
-
        /* Calculate the offset */
        if (var->bits_per_pixel == 0) {
                offset = (var->yoffset / 16) * (var->xres_virtual / 2) + (var->xoffset / 2);