Loading drivers/mtd/nand/cs553x_nand.c +28 −3 Original line number Diff line number Diff line Loading @@ -13,9 +13,12 @@ * 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> Loading Loading @@ -244,6 +247,8 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) goto out_ior; } new_mtd->name = kasprintf(GFP_KERNEL, "cs553x_nand_cs%d", cs); cs553x_mtd[cs] = new_mtd; goto out; Loading Loading @@ -272,12 +277,21 @@ static int is_geode(void) return 0; } #ifdef CONFIG_MTD_PARTITIONS const char *part_probes[] = { "cmdlinepart", NULL }; #endif static int __init cs553x_init(void) { int err = -ENXIO; int i; 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 (!is_geode()) return -ENXIO; Loading @@ -290,7 +304,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; } Loading @@ -306,9 +320,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; } } Loading @@ -328,13 +352,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 */ Loading Loading
drivers/mtd/nand/cs553x_nand.c +28 −3 Original line number Diff line number Diff line Loading @@ -13,9 +13,12 @@ * 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> Loading Loading @@ -244,6 +247,8 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) goto out_ior; } new_mtd->name = kasprintf(GFP_KERNEL, "cs553x_nand_cs%d", cs); cs553x_mtd[cs] = new_mtd; goto out; Loading Loading @@ -272,12 +277,21 @@ static int is_geode(void) return 0; } #ifdef CONFIG_MTD_PARTITIONS const char *part_probes[] = { "cmdlinepart", NULL }; #endif static int __init cs553x_init(void) { int err = -ENXIO; int i; 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 (!is_geode()) return -ENXIO; Loading @@ -290,7 +304,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; } Loading @@ -306,9 +320,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; } } Loading @@ -328,13 +352,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 */ Loading