cirrusfb: fix clock doubling
Krzysztof Helt [Tue, 31 Mar 2009 22:25:14 +0000 (15:25 -0700)]
Cirrus' Alpine and Picasso4 chips uses DAC clock doubling to achieve full
range of pixclock frequencies.

[akpm@linux-foundation.org: fix spelling, use usual comment layout]
Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

drivers/video/cirrusfb.c

index 65a1831..15e2e6b 100644 (file)
@@ -470,10 +470,25 @@ static int cirrusfb_check_pixclock(const struct fb_var_screeninfo *var,
        /* If the frequency is greater than we can support, we might be able
         * to use multiplexing for the video mode */
        if (freq > maxclock) {
+               dev_err(info->device,
+                       "Frequency greater than maxclock (%ld kHz)\n",
+                       maxclock);
+               return -EINVAL;
+       }
+       /*
+        * Additional constraint: 8bpp uses DAC clock doubling to allow maximum
+        * pixel clock
+        */
+       if (var->bits_per_pixel == 8) {
                switch (cinfo->btype) {
                case BT_ALPINE:
+               case BT_PICASSO4:
+                       if (freq > 85500)
+                               cinfo->multiplexing = 1;
+                       break;
                case BT_GD5480:
-                       cinfo->multiplexing = 1;
+                       if (freq > 135100)
+                               cinfo->multiplexing = 1;
                        break;
 
                default:
@@ -815,6 +830,8 @@ static int cirrusfb_set_par_foo(struct fb_info *info)
        freq = PICOS2KHZ(var->pixclock);
        if (cinfo->btype == BT_ALPINE && var->bits_per_pixel == 24)
                freq *= 3;
+       if (cinfo->multiplexing)
+               freq /= 2;
 
        bestclock(freq, &nom, &den, &div);