]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/video/tridentfb.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh64-2.6
[mv-sheeva.git] / drivers / video / tridentfb.c
index 14175cdb9c9c837ab097e915c7415cf3d1ae0b8d..c699864b6f4af1707efd1a3a2976b39f9b4a0a92 100644 (file)
@@ -976,7 +976,7 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
                return 1;
 
 
-       if (bpp==8) {
+       if (bpp == 8) {
                t_outb(0xFF,0x3C6);
                t_outb(regno,0x3C8);
 
@@ -984,19 +984,21 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green,
                t_outb(green>>10,0x3C9);
                t_outb(blue>>10,0x3C9);
 
-       } else if (bpp == 16) { /* RGB 565 */
-               u32 col;
+       } else if (regno < 16) {
+               if (bpp == 16) {        /* RGB 565 */
+                       u32 col;
 
-               col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
-                       ((blue & 0xF800) >> 11);
-               col |= col << 16;       
-               ((u32 *)(info->pseudo_palette))[regno] = col;
-       } else if (bpp == 32)           /* ARGB 8888 */
-               ((u32*)info->pseudo_palette)[regno] =
-                       ((transp & 0xFF00) <<16)        |
-                       ((red & 0xFF00) << 8)           |
-                       ((green & 0xFF00))              |
-                       ((blue & 0xFF00)>>8);
+                       col = (red & 0xF800) | ((green & 0xFC00) >> 5) |
+                               ((blue & 0xF800) >> 11);
+                       col |= col << 16;
+                       ((u32 *)(info->pseudo_palette))[regno] = col;
+               } else if (bpp == 32)           /* ARGB 8888 */
+                       ((u32*)info->pseudo_palette)[regno] =
+                               ((transp & 0xFF00) <<16)        |
+                               ((red & 0xFF00) << 8)           |
+                               ((green & 0xFF00))              |
+                               ((blue & 0xFF00)>>8);
+       }
 
 //     debug("exit\n");
        return 0;
@@ -1130,7 +1132,8 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_de
        
        if (!request_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len, "tridentfb")) {
                debug("request_mem_region failed!\n");
-               return -1;
+               err = -1;
+               goto out_unmap;
        }
 
        fb_info.screen_base = ioremap_nocache(tridentfb_fix.smem_start,
@@ -1139,7 +1142,8 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_de
        if (!fb_info.screen_base) {
                release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len);
                debug("ioremap failed\n");
-               return -1;
+               err = -1;
+               goto out_unmap;
        }
 
        output("%s board found\n", pci_name(dev));
@@ -1162,8 +1166,10 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_de
 #endif
        fb_info.pseudo_palette = pseudo_pal;
 
-       if (!fb_find_mode(&default_var,&fb_info,mode,NULL,0,NULL,bpp))
-               return -EINVAL;
+       if (!fb_find_mode(&default_var,&fb_info,mode,NULL,0,NULL,bpp)) {
+               err = -EINVAL;
+               goto out_unmap;
+       }
        fb_alloc_cmap(&fb_info.cmap,256,0);
        if (defaultaccel && acc)
                default_var.accel_flags |= FB_ACCELF_TEXT;
@@ -1174,12 +1180,20 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_de
        fb_info.device = &dev->dev;
        if (register_framebuffer(&fb_info) < 0) {
                printk(KERN_ERR "tridentfb: could not register Trident framebuffer\n");
-               return -EINVAL;
+               err = -EINVAL;
+               goto out_unmap;
        }
        output("fb%d: %s frame buffer device %dx%d-%dbpp\n",
           fb_info.node, fb_info.fix.id,default_var.xres,
           default_var.yres,default_var.bits_per_pixel);
        return 0;
+
+out_unmap:
+       if (default_par.io_virt)
+               iounmap(default_par.io_virt);
+       if (fb_info.screen_base)
+               iounmap(fb_info.screen_base);
+       return err;
 }
 
 static void __devexit trident_pci_remove(struct pci_dev * dev)