From: Harald Welte <[email protected]>

This patch allows commandline partition processing
to work with the s3c2410 nand platform driver.

I adapted Harald's original patch slightly to use the
bitfield style in s3c2410_nand_set that is already
in use there.

cc: Ben Dooks <[email protected]>
Signed-off-by: Andy Green <[email protected]>
---

 arch/arm/plat-s3c/include/plat/nand.h |    1 +
 drivers/mtd/nand/s3c2410.c            |   29 +++++++++++++++++++++++------
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/arch/arm/plat-s3c/include/plat/nand.h 
b/arch/arm/plat-s3c/include/plat/nand.h
index f4dcd14..882b88d 100644
--- a/arch/arm/plat-s3c/include/plat/nand.h
+++ b/arch/arm/plat-s3c/include/plat/nand.h
@@ -23,6 +23,7 @@
 
 struct s3c2410_nand_set {
        unsigned int            disable_ecc : 1;
+       unsigned int            use_bbt : 1;
 
        int                     nr_chips;
        int                     nr_partitions;
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 8e375d5..26b86e9 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -22,7 +22,9 @@
 */
 
 #ifdef CONFIG_MTD_NAND_S3C2410_DEBUG
-#define DEBUG
+#ifndef DEBUG
+#define DEBUG 1
+#endif
 #endif
 
 #include <linux/module.h>
@@ -231,8 +233,6 @@ static int s3c2410_nand_setrate(struct s3c2410_nand_info 
*info)
                BUG();
        }
 
-       dev_dbg(info->device, "NF_CONF is 0x%lx\n", cfg);
-
        local_irq_save(flags);
 
        cfg = readl(info->regs + S3C2410_NFCONF);
@@ -438,7 +438,7 @@ static int s3c2410_nand_correct_data(struct mtd_info *mtd, 
u_char *dat,
        if ((diff0 & ~(1<<fls(diff0))) == 0)
                return 1;
 
-       return -1;
+       return -EBADMSG;
 }
 
 /* ECC functions
@@ -645,17 +645,31 @@ static int s3c2410_nand_remove(struct platform_device 
*pdev)
 }
 
 #ifdef CONFIG_MTD_PARTITIONS
+const char *part_probes[] = { "cmdlinepart", NULL };
 static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,
                                      struct s3c2410_nand_mtd *mtd,
                                      struct s3c2410_nand_set *set)
 {
+       struct mtd_partition *part_info;
+       int nr_part = 0;
+
        if (set == NULL)
                return add_mtd_device(&mtd->mtd);
 
-       if (set->nr_partitions > 0 && set->partitions != NULL) {
-               return add_mtd_partitions(&mtd->mtd, set->partitions, 
set->nr_partitions);
+       if (set->nr_partitions == 0) {
+               mtd->mtd.name = set->name;
+               nr_part = parse_mtd_partitions(&mtd->mtd, part_probes,
+                                               &part_info, 0);
+       } else {
+               if (set->nr_partitions > 0 && set->partitions != NULL) {
+                       nr_part = set->nr_partitions;
+                       part_info = set->partitions;
+               }
        }
 
+       if (nr_part > 0 && part_info)
+               return add_mtd_partitions(&mtd->mtd, part_info, nr_part);
+
        return add_mtd_device(&mtd->mtd);
 }
 #else
@@ -687,6 +701,9 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info 
*info,
        chip->options      = 0;
        chip->controller   = &info->controller;
 
+       if (set->use_bbt)
+               chip->options |= NAND_USE_FLASH_BBT;
+
        switch (info->cpu_type) {
        case TYPE_S3C2410:
                chip->IO_ADDR_W = regs + S3C2410_NFDATA;


Reply via email to