Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / video / sgivwfb.c
index 8413907..2e6df1f 100644 (file)
@@ -18,6 +18,8 @@
 #include <linux/fb.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
+#include <linux/platform_device.h>
+
 #include <asm/io.h>
 #include <asm/mtrr.h>
 
@@ -113,7 +115,7 @@ static int sgivwfb_set_par(struct fb_info *info);
 static int sgivwfb_setcolreg(u_int regno, u_int red, u_int green,
                             u_int blue, u_int transp,
                             struct fb_info *info);
-static int sgivwfb_mmap(struct fb_info *info, struct file *file,
+static int sgivwfb_mmap(struct fb_info *info,
                        struct vm_area_struct *vma);
 
 static struct fb_ops sgivwfb_ops = {
@@ -124,7 +126,6 @@ static struct fb_ops sgivwfb_ops = {
        .fb_fillrect    = cfb_fillrect,
        .fb_copyarea    = cfb_copyarea,
        .fb_imageblit   = cfb_imageblit,
-       .fb_cursor      = soft_cursor,
        .fb_mmap        = sgivwfb_mmap,
 };
 
@@ -705,7 +706,7 @@ static int sgivwfb_setcolreg(u_int regno, u_int red, u_int green,
        return 0;
 }
 
-static int sgivwfb_mmap(struct fb_info *info, struct file *file,
+static int sgivwfb_mmap(struct fb_info *info,
                        struct vm_area_struct *vma)
 {
        unsigned long size = vma->vm_end - vma->vm_start;
@@ -722,7 +723,6 @@ static int sgivwfb_mmap(struct fb_info *info, struct file *file,
        if (remap_pfn_range(vma, vma->vm_start, offset >> PAGE_SHIFT,
                                                size, vma->vm_page_prot))
                return -EAGAIN;
-       vma->vm_file = file;
        printk(KERN_DEBUG "sgivwfb: mmap framebuffer P(%lx)->V(%lx)\n",
               offset, vma->vm_start);
        return 0;
@@ -749,13 +749,8 @@ int __init sgivwfb_setup(char *options)
 /*
  *  Initialisation
  */
-static void sgivwfb_release(struct device *device)
-{
-}
-
-static int __init sgivwfb_probe(struct device *device)
+static int __init sgivwfb_probe(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(device);
        struct sgivw_par *par;
        struct fb_info *info;
        char *monitor;
@@ -816,7 +811,7 @@ static int __init sgivwfb_probe(struct device *device)
                goto fail_register_framebuffer;
        }
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO "fb%d: SGI DBE frame buffer device, using %ldK of video memory at %#lx\n",      
                info->node, sgivwfb_mem_size >> 10, sgivwfb_mem_phys);
@@ -834,9 +829,9 @@ fail_ioremap_regs:
        return -ENXIO;
 }
 
-static int sgivwfb_remove(struct device *device)
+static int sgivwfb_remove(struct platform_device *dev)
 {
-       struct fb_info *info = dev_get_drvdata(device);
+       struct fb_info *info = platform_get_drvdata(dev);
 
        if (info) {
                struct sgivw_par *par = info->par;
@@ -850,20 +845,15 @@ static int sgivwfb_remove(struct device *device)
        return 0;
 }
 
-static struct device_driver sgivwfb_driver = {
-       .name   = "sgivwfb",
-       .bus    = &platform_bus_type,
+static struct platform_driver sgivwfb_driver = {
        .probe  = sgivwfb_probe,
        .remove = sgivwfb_remove,
+       .driver = {
+               .name   = "sgivwfb",
+       },
 };
 
-static struct platform_device sgivwfb_device = {
-       .name   = "sgivwfb",
-       .id     = 0,
-       .dev    = {
-               .release = sgivwfb_release,
-       }
-};
+static struct platform_device *sgivwfb_device;
 
 int __init sgivwfb_init(void)
 {
@@ -876,11 +866,17 @@ int __init sgivwfb_init(void)
                return -ENODEV;
        sgivwfb_setup(option);
 #endif
-       ret = driver_register(&sgivwfb_driver);
+       ret = platform_driver_register(&sgivwfb_driver);
        if (!ret) {
-               ret = platform_device_register(&sgivwfb_device);
-               if (ret)
-                       driver_unregister(&sgivwfb_driver);
+               sgivwfb_device = platform_device_alloc("sgivwfb", 0);
+               if (sgivwfb_device) {
+                       ret = platform_device_add(sgivwfb_device);
+               } else
+                       ret = -ENOMEM;
+               if (ret) {
+                       platform_driver_unregister(&sgivwfb_driver);
+                       platform_device_put(sgivwfb_device);
+               }
        }
        return ret;
 }
@@ -892,8 +888,8 @@ MODULE_LICENSE("GPL");
 
 static void __exit sgivwfb_exit(void)
 {
-       platform_device_unregister(&sgivwfb_device);
-       driver_unregister(&sgivwfb_driver);
+       platform_device_unregister(sgivwfb_device);
+       platform_driver_unregister(&sgivwfb_driver);
 }
 
 module_exit(sgivwfb_exit);