Merge remote branch 'kumar/merge' into merge
[pandora-kernel.git] / drivers / mtd / nand / cs553x_nand.c
index 19e1594..71c35a0 100644 (file)
  *  Overview:
  *   This is a device driver for the NAND flash controller found on
  *   the AMD CS5535/CS5536 companion chipsets for the Geode processor.
+ *   mtd-id for command line partitioning is cs553x_nand_cs[0-3]
+ *   where 0-3 reflects the chip select for NAND.
  *
  */
 
+#include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/module.h>
@@ -238,12 +241,14 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
        /* Enable the following for a flash based bad block table */
        this->options = NAND_USE_FLASH_BBT | NAND_NO_AUTOINCR;
 
-       /* Scan to find existance of the device */
+       /* Scan to find existence of the device */
        if (nand_scan(new_mtd, 1)) {
                err = -ENXIO;
                goto out_ior;
        }
 
+       new_mtd->name = kasprintf(GFP_KERNEL, "cs553x_nand_cs%d", cs);
+
        cs553x_mtd[cs] = new_mtd;
        goto out;
 
@@ -272,12 +277,23 @@ static int is_geode(void)
        return 0;
 }
 
+
+#ifdef CONFIG_MTD_PARTITIONS
+static const char *part_probes[] = { "cmdlinepart", NULL };
+#endif
+
+
 static int __init cs553x_init(void)
 {
        int err = -ENXIO;
        int i;
        uint64_t val;
 
+#ifdef CONFIG_MTD_PARTITIONS
+       int mtd_parts_nb = 0;
+       struct mtd_partition *mtd_parts = NULL;
+#endif
+
        /* If the CPU isn't a Geode GX or LX, abort */
        if (!is_geode())
                return -ENXIO;
@@ -290,7 +306,7 @@ static int __init cs553x_init(void)
 
        /* If it doesn't have the NAND controller enabled, abort */
        rdmsrl(MSR_DIVIL_BALL_OPTS, val);
-       if (val & 1) {
+       if (val & PIN_OPT_IDE) {
                printk(KERN_INFO "CS553x NAND controller: Flash I/O not enabled in MSR_DIVIL_BALL_OPTS.\n");
                return -ENXIO;
        }
@@ -306,9 +322,19 @@ static int __init cs553x_init(void)
           do mtdconcat etc. if we want to. */
        for (i = 0; i < NR_CS553X_CONTROLLERS; i++) {
                if (cs553x_mtd[i]) {
-                       add_mtd_device(cs553x_mtd[i]);
 
                        /* If any devices registered, return success. Else the last error. */
+#ifdef CONFIG_MTD_PARTITIONS
+                       mtd_parts_nb = parse_mtd_partitions(cs553x_mtd[i], part_probes, &mtd_parts, 0);
+                       if (mtd_parts_nb > 0) {
+                               printk(KERN_NOTICE "Using command line partition definition\n");
+                               add_mtd_partitions(cs553x_mtd[i], mtd_parts, mtd_parts_nb);
+                       } else {
+                               add_mtd_device(cs553x_mtd[i]);
+                       }
+#else
+                       add_mtd_device(cs553x_mtd[i]);
+#endif
                        err = 0;
                }
        }
@@ -328,13 +354,14 @@ static void __exit cs553x_cleanup(void)
                void __iomem *mmio_base;
 
                if (!mtd)
-                       break;
+                       continue;
 
                this = cs553x_mtd[i]->priv;
                mmio_base = this->IO_ADDR_R;
 
                /* Release resources, unregister device */
                nand_release(cs553x_mtd[i]);
+               kfree(cs553x_mtd[i]->name);
                cs553x_mtd[i] = NULL;
 
                /* unmap physical address */