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 / mtd / maps / ixp2000.c
index c5b5f44..2c9cc7f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: ixp2000.c,v 1.5 2004/11/16 17:15:48 dsaxena Exp $
+ * $Id: ixp2000.c,v 1.9 2005/11/07 11:14:27 gleixner Exp $
  *
  * drivers/mtd/maps/ixp2000.c
  *
@@ -14,7 +14,7 @@
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
- * 
+ *
  */
 
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/partitions.h>
-#include <linux/ioport.h>
-#include <linux/device.h>
 
 #include <asm/io.h>
 #include <asm/hardware.h>
-#include <asm/mach-types.h>
 #include <asm/mach/flash.h>
 
 #include <linux/reboot.h>
@@ -44,8 +46,8 @@ struct ixp2000_flash_info {
 };
 
 static inline unsigned long flash_bank_setup(struct map_info *map, unsigned long ofs)
-{      
-       unsigned long (*set_bank)(unsigned long) = 
+{
+       unsigned long (*set_bank)(unsigned long) =
                (unsigned long(*)(unsigned long))map->map_priv_2;
 
        return (set_bank ? set_bank(ofs) : ofs);
@@ -53,8 +55,8 @@ static inline unsigned long flash_bank_setup(struct map_info *map, unsigned long
 
 #ifdef __ARMEB__
 /*
- * Rev A0 and A1 of IXP2400 silicon have a broken addressing unit which 
- * causes the lower address bits to be XORed with 0x11 on 8 bit accesses 
+ * Rev A0 and A1 of IXP2400 silicon have a broken addressing unit which
+ * causes the lower address bits to be XORed with 0x11 on 8 bit accesses
  * and XORed with 0x10 on 16 bit accesses. See the spec update, erratum 44.
  */
 static int erratum44_workaround = 0;
@@ -88,7 +90,7 @@ static void ixp2000_flash_copy_from(struct map_info *map, void *to,
                              unsigned long from, ssize_t len)
 {
        from = flash_bank_setup(map, from);
-       while(len--) 
+       while(len--)
                *(__u8 *) to++ = *(__u8 *)(map->map_priv_1 + from++);
 }
 
@@ -109,13 +111,12 @@ static void ixp2000_flash_copy_to(struct map_info *map, unsigned long to,
 }
 
 
-static int ixp2000_flash_remove(struct device *_dev)
+static int ixp2000_flash_remove(struct platform_device *dev)
 {
-       struct platform_device *dev = to_platform_device(_dev);
        struct flash_platform_data *plat = dev->dev.platform_data;
-       struct ixp2000_flash_info *info = dev_get_drvdata(&dev->dev);
+       struct ixp2000_flash_info *info = platform_get_drvdata(dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       platform_set_drvdata(dev, NULL);
 
        if(!info)
                return 0;
@@ -127,8 +128,7 @@ static int ixp2000_flash_remove(struct device *_dev)
        if (info->map.map_priv_1)
                iounmap((void *) info->map.map_priv_1);
 
-       if (info->partitions) {
-               kfree(info->partitions); }
+       kfree(info->partitions);
 
        if (info->res) {
                release_resource(info->res);
@@ -142,16 +142,15 @@ static int ixp2000_flash_remove(struct device *_dev)
 }
 
 
-static int ixp2000_flash_probe(struct device *_dev)
+static int ixp2000_flash_probe(struct platform_device *dev)
 {
        static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
-       struct platform_device *dev = to_platform_device(_dev);
        struct ixp2000_flash_data *ixp_data = dev->dev.platform_data;
-       struct flash_platform_data *plat; 
+       struct flash_platform_data *plat;
        struct ixp2000_flash_info *info;
        unsigned long window_size;
        int err = -1;
-       
+
        if (!ixp_data)
                return -ENODEV;
 
@@ -160,12 +159,12 @@ static int ixp2000_flash_probe(struct device *_dev)
                return -ENODEV;
 
        window_size = dev->resource->end - dev->resource->start + 1;
-       dev_info(_dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n", 
-                       ixp_data->nr_banks, ((u32)window_size >> 20));
+       dev_info(&dev->dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n",
+                ixp_data->nr_banks, ((u32)window_size >> 20));
 
        if (plat->width != 1) {
-               dev_err(_dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n",
-                               plat->width * 8);
+               dev_err(&dev->dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n",
+                       plat->width * 8);
                return -EIO;
        }
 
@@ -173,17 +172,17 @@ static int ixp2000_flash_probe(struct device *_dev)
        if(!info) {
                err = -ENOMEM;
                goto Error;
-       }       
+       }
        memzero(info, sizeof(struct ixp2000_flash_info));
 
-       dev_set_drvdata(&dev->dev, info);
+       platform_set_drvdata(dev, info);
 
        /*
         * Tell the MTD layer we're not 1:1 mapped so that it does
         * not attempt to do a direct access on us.
         */
        info->map.phys = NO_XIP;
-       
+
        info->nr_banks = ixp_data->nr_banks;
        info->map.size = ixp_data->nr_banks * window_size;
        info->map.bankwidth = 1;
@@ -191,7 +190,7 @@ static int ixp2000_flash_probe(struct device *_dev)
        /*
         * map_priv_2 is used to store a ptr to to the bank_setup routine
         */
-       info->map.map_priv_2 = (void __iomem *) ixp_data->bank_setup;
+       info->map.map_priv_2 = (unsigned long) ixp_data->bank_setup;
 
        info->map.name = dev->dev.bus_id;
        info->map.read = ixp2000_flash_read8;
@@ -199,41 +198,36 @@ static int ixp2000_flash_probe(struct device *_dev)
        info->map.copy_from = ixp2000_flash_copy_from;
        info->map.copy_to = ixp2000_flash_copy_to;
 
-       info->res = request_mem_region(dev->resource->start, 
-                       dev->resource->end - dev->resource->start + 1, 
+       info->res = request_mem_region(dev->resource->start,
+                       dev->resource->end - dev->resource->start + 1,
                        dev->dev.bus_id);
        if (!info->res) {
-               dev_err(_dev, "Could not reserve memory region\n");
+               dev_err(&dev->dev, "Could not reserve memory region\n");
                err = -ENOMEM;
                goto Error;
        }
 
-       info->map.map_priv_1 = ioremap(dev->resource->start, 
+       info->map.map_priv_1 = (unsigned long) ioremap(dev->resource->start,
                                dev->resource->end - dev->resource->start + 1);
        if (!info->map.map_priv_1) {
-               dev_err(_dev, "Failed to ioremap flash region\n");
+               dev_err(&dev->dev, "Failed to ioremap flash region\n");
                err = -EIO;
                goto Error;
        }
 
-       /*
-        * Setup read mode for FLASH
-        */
-       *IXP2000_SLOWPORT_FRM = 1;
-
 #if defined(__ARMEB__)
        /*
         * Enable erratum 44 workaround for NPUs with broken slowport
         */
 
        erratum44_workaround = ixp2000_has_broken_slowport();
-       dev_info(_dev, "Erratum 44 workaround %s\n",
+       dev_info(&dev->dev, "Erratum 44 workaround %s\n",
               erratum44_workaround ? "enabled" : "disabled");
 #endif
 
        info->mtd = do_map_probe(plat->map_name, &info->map);
        if (!info->mtd) {
-               dev_err(_dev, "map_probe failed\n");
+               dev_err(&dev->dev, "map_probe failed\n");
                err = -ENXIO;
                goto Error;
        }
@@ -243,7 +237,7 @@ static int ixp2000_flash_probe(struct device *_dev)
        if (err > 0) {
                err = add_mtd_partitions(info->mtd, info->partitions, err);
                if(err)
-                       dev_err(_dev, "Could not parse partitions\n");
+                       dev_err(&dev->dev, "Could not parse partitions\n");
        }
 
        if (err)
@@ -252,25 +246,26 @@ static int ixp2000_flash_probe(struct device *_dev)
        return 0;
 
 Error:
-       ixp2000_flash_remove(_dev);
+       ixp2000_flash_remove(dev);
        return err;
 }
 
-static struct device_driver ixp2000_flash_driver = {
-       .name           = "IXP2000-Flash",
-       .bus            = &platform_bus_type,
-       .probe          = &ixp2000_flash_probe,
-       .remove         = &ixp2000_flash_remove
+static struct platform_driver ixp2000_flash_driver = {
+       .probe          = ixp2000_flash_probe,
+       .remove         = ixp2000_flash_remove,
+       .driver         = {
+               .name   = "IXP2000-Flash",
+       },
 };
 
 static int __init ixp2000_flash_init(void)
 {
-       return driver_register(&ixp2000_flash_driver);
+       return platform_driver_register(&ixp2000_flash_driver);
 }
 
 static void __exit ixp2000_flash_exit(void)
 {
-       driver_unregister(&ixp2000_flash_driver);
+       platform_driver_unregister(&ixp2000_flash_driver);
 }
 
 module_init(ixp2000_flash_init);