omap: i2c: add a timeout to the busy waiting
[safe/jmp/linux-2.6] / drivers / video / platinumfb.c
index fdb33cd..8a204e7 100644 (file)
  *  more details.
  */
 
+#undef DEBUG
+
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
-#include <linux/slab.h>
 #include <linux/vmalloc.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/fb.h>
 #include <linux/init.h>
-#include <linux/pci.h>
 #include <linux/nvram.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/pgtable.h>
-#include <asm/of_device.h>
 
 #include "macmodes.h"
 #include "platinumfb.h"
@@ -52,7 +53,7 @@ struct fb_info_platinum {
        struct {
                __u8 red, green, blue;
        }                               palette[256];
-       u32                             pseudo_palette[17];
+       u32                             pseudo_palette[16];
        
        volatile struct cmap_regs       __iomem *cmap_regs;
        unsigned long                   cmap_regs_phys;
@@ -139,7 +140,9 @@ static int platinumfb_set_par (struct fb_info *info)
                offset = 0x10;
 
        info->screen_base = pinfo->frame_buffer + init->fb_offset + offset;
+       mutex_lock(&info->mm_lock);
        info->fix.smem_start = (pinfo->frame_buffer_phys) + init->fb_offset + offset;
+       mutex_unlock(&info->mm_lock);
        info->fix.visual = (pinfo->cmode == CMODE_8) ?
                FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
        info->fix.line_length = vmode_attrs[pinfo->vmode-1].hres * (1<<pinfo->cmode)
@@ -219,10 +222,14 @@ static int platinumfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
 
 static inline int platinum_vram_reqd(int video_mode, int color_mode)
 {
-       return vmode_attrs[video_mode-1].vres *
-              (vmode_attrs[video_mode-1].hres * (1<<color_mode) +
-               ((video_mode == VMODE_832_624_75) &&
-                (color_mode > CMODE_8)) ? 0x10 : 0x20) + 0x1000;
+       int baseval = vmode_attrs[video_mode-1].hres * (1<<color_mode);
+
+       if ((video_mode == VMODE_832_624_75) && (color_mode > CMODE_8))
+               baseval += 0x10;
+       else
+               baseval += 0x20;
+
+       return vmode_attrs[video_mode-1].vres * baseval + 0x1000;
 }
 
 #define STORE_D2(a, d) { \
@@ -535,33 +542,35 @@ static int __devinit platinumfb_probe(struct of_device* odev,
        volatile __u8           *fbuffer;
        int                     bank0, bank1, bank2, bank3, rc;
 
-       printk(KERN_INFO "platinumfb: Found Apple Platinum video hardware\n");
+       dev_info(&odev->dev, "Found Apple Platinum video hardware\n");
 
        info = framebuffer_alloc(sizeof(*pinfo), &odev->dev);
-       if (info == NULL)
+       if (info == NULL) {
+               dev_err(&odev->dev, "Failed to allocate fbdev !\n");
                return -ENOMEM;
+       }
        pinfo = info->par;
 
        if (of_address_to_resource(dp, 0, &pinfo->rsrc_reg) ||
            of_address_to_resource(dp, 1, &pinfo->rsrc_fb)) {
-               printk(KERN_ERR "platinumfb: Can't get resources\n");
-               framebuffer_release(info);
-               return -ENXIO;
-       }
-       if (!request_mem_region(pinfo->rsrc_reg.start,
-                               pinfo->rsrc_reg.start -
-                               pinfo->rsrc_reg.end + 1,
-                               "platinumfb registers")) {
+               dev_err(&odev->dev, "Can't get resources\n");
                framebuffer_release(info);
                return -ENXIO;
        }
+       dev_dbg(&odev->dev, " registers  : 0x%llx...0x%llx\n",
+               (unsigned long long)pinfo->rsrc_reg.start,
+               (unsigned long long)pinfo->rsrc_reg.end);
+       dev_dbg(&odev->dev, " framebuffer: 0x%llx...0x%llx\n",
+               (unsigned long long)pinfo->rsrc_fb.start,
+               (unsigned long long)pinfo->rsrc_fb.end);
+
+       /* Do not try to request register space, they overlap with the
+        * northbridge and that can fail. Only request framebuffer
+        */
        if (!request_mem_region(pinfo->rsrc_fb.start,
-                               pinfo->rsrc_fb.start
-                               - pinfo->rsrc_fb.end + 1,
+                               pinfo->rsrc_fb.end - pinfo->rsrc_fb.start + 1,
                                "platinumfb framebuffer")) {
-               release_mem_region(pinfo->rsrc_reg.start,
-                                  pinfo->rsrc_reg.end -
-                                  pinfo->rsrc_reg.start + 1);
+               printk(KERN_ERR "platinumfb: Can't request framebuffer !\n");
                framebuffer_release(info);
                return -ENXIO;
        }
@@ -600,7 +609,8 @@ static int __devinit platinumfb_probe(struct of_device* odev,
        bank2 = fbuffer[0x200000] == 0x56;
        bank3 = fbuffer[0x300000] == 0x78;
        pinfo->total_vram = (bank0 + bank1 + bank2 + bank3) * 0x100000;
-       printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n", (int) (pinfo->total_vram / 1024 / 1024),
+       printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n",
+              (unsigned int) (pinfo->total_vram / 1024 / 1024),
               bank3, bank2, bank1, bank0);
 
        /*
@@ -626,6 +636,9 @@ static int __devinit platinumfb_probe(struct of_device* odev,
        
        rc = platinum_init_fb(info);
        if (rc != 0) {
+               iounmap(pinfo->frame_buffer);
+               iounmap(pinfo->platinum_regs);
+               iounmap(pinfo->cmap_regs);
                dev_set_drvdata(&odev->dev, NULL);
                framebuffer_release(info);
        }
@@ -641,16 +654,15 @@ static int __devexit platinumfb_remove(struct of_device* odev)
         unregister_framebuffer (info);
        
        /* Unmap frame buffer and registers */
+       iounmap(pinfo->frame_buffer);
+       iounmap(pinfo->platinum_regs);
+       iounmap(pinfo->cmap_regs);
+
        release_mem_region(pinfo->rsrc_fb.start,
                           pinfo->rsrc_fb.end -
                           pinfo->rsrc_fb.start + 1);
-       release_mem_region(pinfo->rsrc_reg.start,
-                          pinfo->rsrc_reg.end -
-                          pinfo->rsrc_reg.start + 1);
-       iounmap(pinfo->frame_buffer);
-       iounmap(pinfo->platinum_regs);
+
        release_mem_region(pinfo->cmap_regs_phys, 0x1000);
-       iounmap(pinfo->cmap_regs);
 
        framebuffer_release(info);
 
@@ -682,14 +694,14 @@ static int __init platinumfb_init(void)
                return -ENODEV;
        platinumfb_setup(option);
 #endif
-       of_register_driver(&platinum_driver);
+       of_register_platform_driver(&platinum_driver);
 
        return 0;
 }
 
 static void __exit platinumfb_exit(void)
 {
-       of_unregister_driver(&platinum_driver); 
+       of_unregister_platform_driver(&platinum_driver);
 }
 
 MODULE_LICENSE("GPL");