]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/video/s3c2410fb.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/net-2.6
[linux-2.6-omap-h63xx.git] / drivers / video / s3c2410fb.c
index fd05231f0c08eb55567cdf734a649d4c71cf1c97..5857ccf5f6b15208f64a7221405063f280b2d44a 100644 (file)
@@ -56,7 +56,7 @@
  *     - Add support for different devices
  *     - Backlight support
  *
- * 2004-09-05: Herbert Pötzl <herbert@13thfloor.at>
+ * 2004-09-05: Herbert Pötzl <herbert@13thfloor.at>
  *     - added clock (de-)allocation code
  *     - added fixem fbmem option
  *
@@ -64,7 +64,7 @@
  *     - code cleanup
  *     - added a forgotten return in h1940fb_init
  *
- * 2004-07-19: Herbert Pötzl <herbert@13thfloor.at>
+ * 2004-07-19: Herbert Pötzl <herbert@13thfloor.at>
  *     - code cleanup and extended debugging
  *
  * 2004-07-15: Arnaud Patard <arnaud.patard@rtp-net.org>
@@ -172,19 +172,28 @@ static int s3c2410fb_check_var(struct fb_var_screeninfo *var,
        struct s3c2410fb_info *fbi = info->par;
        struct s3c2410fb_mach_info *mach_info = fbi->dev->platform_data;
        struct s3c2410fb_display *display = NULL;
+       struct s3c2410fb_display *default_display = mach_info->displays +
+                                                   mach_info->default_display;
+       int type = default_display->type;
        unsigned i;
 
        dprintk("check_var(var=%p, info=%p)\n", var, info);
 
        /* validate x/y resolution */
-
-       for (i = 0; i < mach_info->num_displays; i++)
-               if (var->yres == mach_info->displays[i].yres &&
-                   var->xres == mach_info->displays[i].xres &&
-                   var->bits_per_pixel == mach_info->displays[i].bpp) {
-                       display = mach_info->displays + i;
-                       break;
-               }
+       /* choose default mode if possible */
+       if (var->yres == default_display->yres &&
+           var->xres == default_display->xres &&
+           var->bits_per_pixel == default_display->bpp)
+               display = default_display;
+       else
+               for (i = 0; i < mach_info->num_displays; i++)
+                       if (type == mach_info->displays[i].type &&
+                           var->yres == mach_info->displays[i].yres &&
+                           var->xres == mach_info->displays[i].xres &&
+                           var->bits_per_pixel == mach_info->displays[i].bpp) {
+                               display = mach_info->displays + i;
+                               break;
+                       }
 
        if (!display) {
                dprintk("wrong resolution or depth %dx%d at %d bpp\n",
@@ -207,11 +216,9 @@ static int s3c2410fb_check_var(struct fb_var_screeninfo *var,
        var->vsync_len = display->vsync_len;
        var->hsync_len = display->hsync_len;
 
-       fbi->regs.lcdcon1 = display->lcdcon1;
        fbi->regs.lcdcon5 = display->lcdcon5;
        /* set display type */
-       fbi->regs.lcdcon1 &= ~S3C2410_LCDCON1_TFT;
-       fbi->regs.lcdcon1 |= display->type;
+       fbi->regs.lcdcon1 = display->type;
 
        var->transp.offset = 0;
        var->transp.length = 0;
@@ -301,8 +308,6 @@ static void s3c2410fb_calculate_stn_lcd_regs(const struct fb_info *info,
        if (type != S3C2410_LCDCON1_STN4)
                hs >>= 1;
 
-       regs->lcdcon1 &= ~S3C2410_LCDCON1_MODEMASK;
-
        switch (var->bits_per_pixel) {
        case 1:
                regs->lcdcon1 |= S3C2410_LCDCON1_STN1BPP;
@@ -356,8 +361,6 @@ static void s3c2410fb_calculate_tft_lcd_regs(const struct fb_info *info,
        const struct s3c2410fb_info *fbi = info->par;
        const struct fb_var_screeninfo *var = &info->var;
 
-       regs->lcdcon1 &= ~S3C2410_LCDCON1_MODEMASK;
-
        switch (var->bits_per_pixel) {
        case 1:
                regs->lcdcon1 |= S3C2410_LCDCON1_TFT1BPP;
@@ -437,7 +440,6 @@ static void s3c2410fb_activate_var(struct fb_info *info)
                        clkdiv = 2;
        }
 
-       fbi->regs.lcdcon1 &= ~S3C2410_LCDCON1_CLKVAL(0x3ff);
        fbi->regs.lcdcon1 |=  S3C2410_LCDCON1_CLKVAL(clkdiv);
 
        /* write new registers */