Commit 11eb3b0d authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.infradead.org/mtd-2.6

* git://git.infradead.org/mtd-2.6:
  [MTD] [NAND] cs553x_nand: command line partitioning support
parents baf8532a 641f4366
...@@ -13,9 +13,12 @@ ...@@ -13,9 +13,12 @@
* Overview: * Overview:
* This is a device driver for the NAND flash controller found on * This is a device driver for the NAND flash controller found on
* the AMD CS5535/CS5536 companion chipsets for the Geode processor. * 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/slab.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -244,6 +247,8 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) ...@@ -244,6 +247,8 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
goto out_ior; goto out_ior;
} }
new_mtd->name = kasprintf(GFP_KERNEL, "cs553x_nand_cs%d", cs);
cs553x_mtd[cs] = new_mtd; cs553x_mtd[cs] = new_mtd;
goto out; goto out;
...@@ -272,12 +277,21 @@ static int is_geode(void) ...@@ -272,12 +277,21 @@ static int is_geode(void)
return 0; return 0;
} }
#ifdef CONFIG_MTD_PARTITIONS
const char *part_probes[] = { "cmdlinepart", NULL };
#endif
static int __init cs553x_init(void) static int __init cs553x_init(void)
{ {
int err = -ENXIO; int err = -ENXIO;
int i; int i;
uint64_t val; uint64_t val;
int mtd_parts_nb = 0;
struct mtd_partition *mtd_parts = NULL;
/* If the CPU isn't a Geode GX or LX, abort */ /* If the CPU isn't a Geode GX or LX, abort */
if (!is_geode()) if (!is_geode())
return -ENXIO; return -ENXIO;
...@@ -290,7 +304,7 @@ static int __init cs553x_init(void) ...@@ -290,7 +304,7 @@ static int __init cs553x_init(void)
/* If it doesn't have the NAND controller enabled, abort */ /* If it doesn't have the NAND controller enabled, abort */
rdmsrl(MSR_DIVIL_BALL_OPTS, val); 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"); printk(KERN_INFO "CS553x NAND controller: Flash I/O not enabled in MSR_DIVIL_BALL_OPTS.\n");
return -ENXIO; return -ENXIO;
} }
...@@ -306,9 +320,19 @@ static int __init cs553x_init(void) ...@@ -306,9 +320,19 @@ static int __init cs553x_init(void)
do mtdconcat etc. if we want to. */ do mtdconcat etc. if we want to. */
for (i = 0; i < NR_CS553X_CONTROLLERS; i++) { for (i = 0; i < NR_CS553X_CONTROLLERS; i++) {
if (cs553x_mtd[i]) { if (cs553x_mtd[i]) {
add_mtd_device(cs553x_mtd[i]);
/* If any devices registered, return success. Else the last error. */ /* 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; err = 0;
} }
} }
...@@ -328,13 +352,14 @@ static void __exit cs553x_cleanup(void) ...@@ -328,13 +352,14 @@ static void __exit cs553x_cleanup(void)
void __iomem *mmio_base; void __iomem *mmio_base;
if (!mtd) if (!mtd)
break; continue;
this = cs553x_mtd[i]->priv; this = cs553x_mtd[i]->priv;
mmio_base = this->IO_ADDR_R; mmio_base = this->IO_ADDR_R;
/* Release resources, unregister device */ /* Release resources, unregister device */
nand_release(cs553x_mtd[i]); nand_release(cs553x_mtd[i]);
kfree(cs553x_mtd[i]->name);
cs553x_mtd[i] = NULL; cs553x_mtd[i] = NULL;
/* unmap physical address */ /* unmap physical address */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment