fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / mtd / maps / pci.c
index 8baca24..d2ab1ba 100644 (file)
@@ -7,8 +7,8 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- *  $Id: pci.c,v 1.5 2003/05/20 20:59:31 dwmw2 Exp $
- * 
+ *  $Id: pci.c,v 1.14 2005/11/17 08:20:27 dwmw2 Exp $
+ *
  * Generic PCI memory map driver.  We support the following boards:
  *  - Intel IQ80310 ATU.
  *  - Intel EBSA285 (blank rom programming mode). Tested working 27/09/2001
@@ -17,6 +17,7 @@
 #include <linux/kernel.h>
 #include <linux/pci.h>
 #include <linux/init.h>
+#include <linux/slab.h>
 
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
@@ -33,11 +34,79 @@ struct mtd_pci_info {
 
 struct map_pci_info {
        struct map_info map;
-       void *base;
+       void __iomem *base;
        void (*exit)(struct pci_dev *dev, struct map_pci_info *map);
        unsigned long (*translate)(struct map_pci_info *map, unsigned long ofs);
        struct pci_dev *dev;
-};     
+};
+
+static map_word mtd_pci_read8(struct map_info *_map, unsigned long ofs)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+       map_word val;
+       val.x[0]= readb(map->base + map->translate(map, ofs));
+//     printk("read8 : %08lx => %02x\n", ofs, val.x[0]);
+       return val;
+}
+
+#if 0
+static map_word mtd_pci_read16(struct map_info *_map, unsigned long ofs)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+       map_word val;
+       val.x[0] = readw(map->base + map->translate(map, ofs));
+//     printk("read16: %08lx => %04x\n", ofs, val.x[0]);
+       return val;
+}
+#endif
+static map_word mtd_pci_read32(struct map_info *_map, unsigned long ofs)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+       map_word val;
+       val.x[0] = readl(map->base + map->translate(map, ofs));
+//     printk("read32: %08lx => %08x\n", ofs, val.x[0]);
+       return val;
+}
+
+static void mtd_pci_copyfrom(struct map_info *_map, void *to, unsigned long from, ssize_t len)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+       memcpy_fromio(to, map->base + map->translate(map, from), len);
+}
+
+static void mtd_pci_write8(struct map_info *_map, map_word val, unsigned long ofs)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+//     printk("write8 : %08lx <= %02x\n", ofs, val.x[0]);
+       writeb(val.x[0], map->base + map->translate(map, ofs));
+}
+
+#if 0
+static void mtd_pci_write16(struct map_info *_map, map_word val, unsigned long ofs)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+//     printk("write16: %08lx <= %04x\n", ofs, val.x[0]);
+       writew(val.x[0], map->base + map->translate(map, ofs));
+}
+#endif
+static void mtd_pci_write32(struct map_info *_map, map_word val, unsigned long ofs)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+//     printk("write32: %08lx <= %08x\n", ofs, val.x[0]);
+       writel(val.x[0], map->base + map->translate(map, ofs));
+}
+
+static void mtd_pci_copyto(struct map_info *_map, unsigned long to, const void *from, ssize_t len)
+{
+       struct map_pci_info *map = (struct map_pci_info *)_map;
+       memcpy_toio(map->base + map->translate(map, to), from, len);
+}
+
+static const struct map_info mtd_pci_map = {
+       .phys =         NO_XIP,
+       .copy_from =    mtd_pci_copyfrom,
+       .copy_to =      mtd_pci_copyto,
+};
 
 /*
  * Intel IOP80310 Flash driver
@@ -48,7 +117,10 @@ intel_iq80310_init(struct pci_dev *dev, struct map_pci_info *map)
 {
        u32 win_base;
 
-       map->map.buswidth = 1;
+       map->map.bankwidth = 1;
+       map->map.read = mtd_pci_read8,
+       map->map.write = mtd_pci_write8,
+
        map->map.size     = 0x00800000;
        map->base         = ioremap_nocache(pci_resource_start(dev, 0),
                                            pci_resource_len(dev, 0));
@@ -72,7 +144,7 @@ static void
 intel_iq80310_exit(struct pci_dev *dev, struct map_pci_info *map)
 {
        if (map->base)
-               iounmap((void *)map->base);
+               iounmap(map->base);
        pci_write_config_dword(dev, 0x44, map->map.map_priv_2);
 }
 
@@ -134,9 +206,9 @@ intel_dc21285_init(struct pci_dev *dev, struct map_pci_info *map)
                 * or simply enabling it?
                 */
                if (!(pci_resource_flags(dev, PCI_ROM_RESOURCE) &
-                    PCI_ROM_ADDRESS_ENABLE)) {
+                                   IORESOURCE_ROM_ENABLE)) {
                        u32 val;
-                       pci_resource_flags(dev, PCI_ROM_RESOURCE) |= PCI_ROM_ADDRESS_ENABLE;
+                       pci_resource_flags(dev, PCI_ROM_RESOURCE) |= IORESOURCE_ROM_ENABLE;
                        pci_read_config_dword(dev, PCI_ROM_ADDRESS, &val);
                        val |= PCI_ROM_ADDRESS_ENABLE;
                        pci_write_config_dword(dev, PCI_ROM_ADDRESS, val);
@@ -147,7 +219,9 @@ intel_dc21285_init(struct pci_dev *dev, struct map_pci_info *map)
        if (!len || !base)
                return -ENXIO;
 
-       map->map.buswidth = 4;
+       map->map.bankwidth = 4;
+       map->map.read = mtd_pci_read32,
+       map->map.write = mtd_pci_write32,
        map->map.size     = len;
        map->base         = ioremap_nocache(base, len);
 
@@ -163,12 +237,12 @@ intel_dc21285_exit(struct pci_dev *dev, struct map_pci_info *map)
        u32 val;
 
        if (map->base)
-               iounmap((void *)map->base);
+               iounmap(map->base);
 
        /*
         * We need to undo the PCI BAR2/PCI ROM BAR address alteration.
         */
-       pci_resource_flags(dev, PCI_ROM_RESOURCE) &= ~PCI_ROM_ADDRESS_ENABLE;
+       pci_resource_flags(dev, PCI_ROM_RESOURCE) &= ~IORESOURCE_ROM_ENABLE;
        pci_read_config_dword(dev, PCI_ROM_ADDRESS, &val);
        val &= ~PCI_ROM_ADDRESS_ENABLE;
        pci_write_config_dword(dev, PCI_ROM_ADDRESS, val);
@@ -215,75 +289,6 @@ static struct pci_device_id mtd_pci_ids[] = {
  * Generic code follows.
  */
 
-static u8 mtd_pci_read8(struct map_info *_map, unsigned long ofs)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-       u8 val = readb(map->base + map->translate(map, ofs));
-//     printk("read8 : %08lx => %02x\n", ofs, val);
-       return val;
-}
-
-static u16 mtd_pci_read16(struct map_info *_map, unsigned long ofs)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-       u16 val = readw(map->base + map->translate(map, ofs));
-//     printk("read16: %08lx => %04x\n", ofs, val);
-       return val;
-}
-
-static u32 mtd_pci_read32(struct map_info *_map, unsigned long ofs)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-       u32 val = readl(map->base + map->translate(map, ofs));
-//     printk("read32: %08lx => %08x\n", ofs, val);
-       return val;
-}
-
-static void mtd_pci_copyfrom(struct map_info *_map, void *to, unsigned long from, ssize_t len)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-       memcpy_fromio(to, map->base + map->translate(map, from), len);
-}
-
-static void mtd_pci_write8(struct map_info *_map, u8 val, unsigned long ofs)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-//     printk("write8 : %08lx <= %02x\n", ofs, val);
-       writeb(val, map->base + map->translate(map, ofs));
-}
-
-static void mtd_pci_write16(struct map_info *_map, u16 val, unsigned long ofs)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-//     printk("write16: %08lx <= %04x\n", ofs, val);
-       writew(val, map->base + map->translate(map, ofs));
-}
-
-static void mtd_pci_write32(struct map_info *_map, u32 val, unsigned long ofs)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-//     printk("write32: %08lx <= %08x\n", ofs, val);
-       writel(val, map->base + map->translate(map, ofs));
-}
-
-static void mtd_pci_copyto(struct map_info *_map, unsigned long to, const void *from, ssize_t len)
-{
-       struct map_pci_info *map = (struct map_pci_info *)_map;
-       memcpy_toio(map->base + map->translate(map, to), from, len);
-}
-
-static struct map_info mtd_pci_map = {
-       .phys =         NO_XIP,
-       .read8 =        mtd_pci_read8,
-       .read16 =       mtd_pci_read16,
-       .read32 =       mtd_pci_read32,
-       .copy_from =    mtd_pci_copyfrom,
-       .write8 =       mtd_pci_write8,
-       .write16 =      mtd_pci_write16,
-       .write32 =      mtd_pci_write32,
-       .copy_to =      mtd_pci_copyto,
-};
-
 static int __devinit
 mtd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
@@ -329,9 +334,6 @@ mtd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
        return 0;
 
 release:
-       if (mtd)
-               map_destroy(mtd);
-
        if (map) {
                map->exit(dev, map);
                kfree(map);
@@ -366,7 +368,7 @@ static struct pci_driver mtd_pci_driver = {
 
 static int __init mtd_pci_maps_init(void)
 {
-       return pci_module_init(&mtd_pci_driver);
+       return pci_register_driver(&mtd_pci_driver);
 }
 
 static void __exit mtd_pci_maps_exit(void)