linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / video / acornfb.c
index d91a2f8..b058273 100644 (file)
@@ -26,7 +26,7 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/fb.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 
 #include <asm/hardware.h>
@@ -883,7 +883,7 @@ acornfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
  * Note that we are entered with the kernel locked.
  */
 static int
-acornfb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
+acornfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
        unsigned long off, start;
        u32 len;
@@ -909,7 +909,7 @@ acornfb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma
         * some updates to the screen occasionally, but process switches
         * should cause the caches and buffers to be flushed often enough.
         */
-       if (io_remap_page_range(vma, vma->vm_start, off,
+       if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT,
                                vma->vm_end - vma->vm_start,
                                vma->vm_page_prot))
                return -EAGAIN;
@@ -926,7 +926,6 @@ static struct fb_ops acornfb_ops = {
        .fb_copyarea    = cfb_copyarea,
        .fb_imageblit   = cfb_imageblit,
        .fb_mmap        = acornfb_mmap,
-       .fb_cursor      = soft_cursor,
 };
 
 /*
@@ -1010,7 +1009,7 @@ static void __init acornfb_init_fbinfo(void)
        first = 0;
 
        fb_info.fbops           = &acornfb_ops;
-       fb_info.flags           = FBINFO_FLAG_DEFAULT;
+       fb_info.flags           = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
        fb_info.pseudo_palette  = current_par.pseudo_palette;
 
        strcpy(fb_info.fix.id, "Acorn");
@@ -1246,6 +1245,8 @@ acornfb_detect_monitortype(void)
 
 /*
  * This enables the unused memory to be freed on older Acorn machines.
+ * We are freeing memory on behalf of the architecture initialisation
+ * code here.
  */
 static inline void
 free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
@@ -1268,7 +1269,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
                 */
                page = virt_to_page(virtual_start);
                ClearPageReserved(page);
-               atomic_set(&page->count, 1);
+               set_page_count(page, 1);
                free_page(virtual_start);
 
                virtual_start += PAGE_SIZE;
@@ -1278,21 +1279,20 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
        printk("acornfb: freed %dK memory\n", mb_freed);
 }
 
-static struct device acornfb_device = {
-       .bus_id                 = "acornfb",
-       .coherent_dma_mask      = 0xffffffff,
-};
-
-int __init
-acornfb_init(void)
+static int __init acornfb_probe(struct platform_device *dev)
 {
        unsigned long size;
        u_int h_sync, v_sync;
        int rc, i;
+       char *option = NULL;
+
+       if (fb_get_options("acornfb", &option))
+               return -ENODEV;
+       acornfb_setup(option);
 
        acornfb_init_fbinfo();
 
-       current_par.dev = &acornfb_device;
+       current_par.dev = &dev->dev;
 
        if (current_par.montype == -1)
                current_par.montype = acornfb_detect_monitortype();
@@ -1325,7 +1325,6 @@ acornfb_init(void)
                }
        }
 
-       fb_info.currcon        = -1;
        fb_info.screen_base    = (char *)SCREEN_BASE;
        fb_info.fix.smem_start = SCREEN_START;
        current_par.using_vram = 0;
@@ -1454,6 +1453,20 @@ acornfb_init(void)
        return 0;
 }
 
+static struct platform_driver acornfb_driver = {
+       .probe  = acornfb_probe,
+       .driver = {
+               .name   = "acornfb",
+       },
+};
+
+static int __init acornfb_init(void)
+{
+       return platform_driver_register(&acornfb_driver);
+}
+
+module_init(acornfb_init);
+
 MODULE_AUTHOR("Russell King");
 MODULE_DESCRIPTION("VIDC 1/1a/20 framebuffer driver");
 MODULE_LICENSE("GPL");