fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / mtd / maps / sbc8240.c
index 225cdd9..b8c1331 100644 (file)
@@ -18,7 +18,6 @@
  * Both parts are JEDEC compatible.
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
@@ -66,7 +65,7 @@ static struct map_info sbc8240_map[2] = {
        }
 };
 
-#define NUM_FLASH_BANKS        (sizeof(sbc8240_map) / sizeof(struct map_info))
+#define NUM_FLASH_BANKS        ARRAY_SIZE(sbc8240_map)
 
 /*
  * The following defines the partition layout of SBC8240 boards.
@@ -125,8 +124,6 @@ static struct mtd_partition sbc8240_fs_partitions [] = {
        }
 };
 
-#define NB_OF(x) (sizeof (x) / sizeof (x[0]))
-
 /* trivial struct to describe partition information */
 struct mtd_part_def
 {
@@ -159,7 +156,7 @@ int __init init_sbc8240_mtd (void)
        };
 
        int devicesfound = 0;
-       int i;
+       int i,j;
 
        for (i = 0; i < NUM_FLASH_BANKS; i++) {
                printk (KERN_NOTICE MSG_PREFIX
@@ -169,6 +166,10 @@ int __init init_sbc8240_mtd (void)
                        (unsigned long) ioremap (pt[i].addr, pt[i].size);
                if (!sbc8240_map[i].map_priv_1) {
                        printk (MSG_PREFIX "failed to ioremap\n");
+                       for (j = 0; j < i; j++) {
+                               iounmap((void *) sbc8240_map[j].map_priv_1);
+                               sbc8240_map[j].map_priv_1 = 0;
+                       }
                        return -EIO;
                }
                simple_map_init(&sbc8240_mtd[i]);
@@ -178,6 +179,11 @@ int __init init_sbc8240_mtd (void)
                if (sbc8240_mtd[i]) {
                        sbc8240_mtd[i]->module = THIS_MODULE;
                        devicesfound++;
+               } else {
+                       if (sbc8240_map[i].map_priv_1) {
+                               iounmap((void *) sbc8240_map[i].map_priv_1);
+                               sbc8240_map[i].map_priv_1 = 0;
+                       }
                }
        }
 
@@ -190,10 +196,10 @@ int __init init_sbc8240_mtd (void)
 #ifdef CONFIG_MTD_PARTITIONS
        sbc8240_part_banks[0].mtd_part   = sbc8240_uboot_partitions;
        sbc8240_part_banks[0].type       = "static image";
-       sbc8240_part_banks[0].nums       = NB_OF(sbc8240_uboot_partitions);
+       sbc8240_part_banks[0].nums       = ARRAY_SIZE(sbc8240_uboot_partitions);
        sbc8240_part_banks[1].mtd_part   = sbc8240_fs_partitions;
        sbc8240_part_banks[1].type       = "static file system";
-       sbc8240_part_banks[1].nums       = NB_OF(sbc8240_fs_partitions);
+       sbc8240_part_banks[1].nums       = ARRAY_SIZE(sbc8240_fs_partitions);
 
        for (i = 0; i < NUM_FLASH_BANKS; i++) {