]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/video/uvesafb.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke...
[karo-tx-linux.git] / drivers / video / uvesafb.c
index 74ae75899009fe3ad831c37ec14868d467b97ad7..421770b5e6abb7bcb99cf7d86a0fc5786d7ad2ea 100644 (file)
@@ -55,6 +55,7 @@ static u16 maxvf      __devinitdata; /* maximum vertical frequency */
 static u16 maxhf       __devinitdata; /* maximum horizontal frequency */
 static u16 vbemode     __devinitdata; /* force use of a specific VBE mode */
 static char *mode_option __devinitdata;
+static u8  dac_width   = 6;
 
 static struct uvesafb_ktask *uvfb_tasks[UVESAFB_TASKS_MAX];
 static DEFINE_MUTEX(uvfb_lock);
@@ -189,7 +190,7 @@ static int uvesafb_exec(struct uvesafb_ktask *task)
        uvfb_tasks[seq] = task;
        mutex_unlock(&uvfb_lock);
 
-       err = cn_netlink_send(m, 0, gfp_any());
+       err = cn_netlink_send(m, 0, GFP_KERNEL);
        if (err == -ESRCH) {
                /*
                 * Try to start the userspace helper if sending
@@ -303,22 +304,10 @@ static void uvesafb_setup_var(struct fb_var_screeninfo *var,
                var->blue.offset   = 0;
                var->transp.offset = 0;
 
-               /*
-                * We're assuming that we can switch the DAC to 8 bits. If
-                * this proves to be incorrect, we'll update the fields
-                * later in set_par().
-                */
-               if (par->vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC) {
-                       var->red.length    = 8;
-                       var->green.length  = 8;
-                       var->blue.length   = 8;
-                       var->transp.length = 0;
-               } else {
-                       var->red.length    = 6;
-                       var->green.length  = 6;
-                       var->blue.length   = 6;
-                       var->transp.length = 0;
-               }
+               var->red.length    = 8;
+               var->green.length  = 8;
+               var->blue.length   = 8;
+               var->transp.length = 0;
        }
 }
 
@@ -850,14 +839,16 @@ static int __devinit uvesafb_vbe_init_mode(struct fb_info *info)
        if (vbemode) {
                for (i = 0; i < par->vbe_modes_cnt; i++) {
                        if (par->vbe_modes[i].mode_id == vbemode) {
+                               modeid = i;
+                               uvesafb_setup_var(&info->var, info,
+                                               &par->vbe_modes[modeid]);
                                fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60,
-                                                       &info->var, info);
+                                               &info->var, info);
                                /*
                                 * With pixclock set to 0, the default BIOS
                                 * timings will be used in set_par().
                                 */
                                info->var.pixclock = 0;
-                               modeid = i;
                                goto gotmode;
                        }
                }
@@ -904,8 +895,11 @@ static int __devinit uvesafb_vbe_init_mode(struct fb_info *info)
                        fb_videomode_to_var(&info->var, mode);
                } else {
                        modeid = par->vbe_modes[0].mode_id;
+                       uvesafb_setup_var(&info->var, info,
+                                       &par->vbe_modes[modeid]);
                        fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60,
-                                   &info->var, info);
+                                       &info->var, info);
+
                        goto gotmode;
                }
        }
@@ -917,9 +911,9 @@ static int __devinit uvesafb_vbe_init_mode(struct fb_info *info)
        if (modeid == -1)
                return -EINVAL;
 
-gotmode:
        uvesafb_setup_var(&info->var, info, &par->vbe_modes[modeid]);
 
+gotmode:
        /*
         * If we are not VBE3.0+ compliant, we're done -- the BIOS will
         * ignore our timings anyway.
@@ -1001,7 +995,7 @@ static int uvesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
                struct fb_info *info)
 {
        struct uvesafb_pal_entry entry;
-       int shift = 16 - info->var.green.length;
+       int shift = 16 - dac_width;
        int err = 0;
 
        if (regno >= info->cmap.len)
@@ -1050,7 +1044,7 @@ static int uvesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
 static int uvesafb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
 {
        struct uvesafb_pal_entry *entries;
-       int shift = 16 - info->var.green.length;
+       int shift = 16 - dac_width;
        int i, err = 0;
 
        if (info->var.bits_per_pixel == 8) {
@@ -1312,13 +1306,9 @@ setmode:
                err = uvesafb_exec(task);
                if (err || (task->t.regs.eax & 0xffff) != 0x004f ||
                    ((task->t.regs.ebx & 0xff00) >> 8) != 8) {
-                       /*
-                        * We've failed to set the DAC palette format -
-                        * time to correct var.
-                        */
-                       info->var.red.length    = 6;
-                       info->var.green.length  = 6;
-                       info->var.blue.length   = 6;
+                       dac_width = 6;
+               } else {
+                       dac_width = 8;
                }
        }
 
@@ -1552,7 +1542,7 @@ static void __devinit uvesafb_init_info(struct fb_info *info,
        }
 
        info->flags = FBINFO_FLAG_DEFAULT |
-                       (par->ypan) ? FBINFO_HWACCEL_YPAN : 0;
+                       (par->ypan ? FBINFO_HWACCEL_YPAN : 0);
 
        if (!par->ypan)
                info->fbops->fb_pan_display = NULL;