Messages in this thread Patch in this message | | | Date | Thu, 18 Sep 2008 09:13:01 +0800 | From | "Conke Hu" <> | Subject | s3c24xx nand: add command line partition table parsing support (resend) |
| |
Add mtd id and command line partition table parsing support for s3c24xx nand driver.
Signed-off-by: Conke Hu <conke.hu@gmail.com> Signed-off-by: Linke Wang <linke.wang@gmail.com> ------------------ diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c index 556139e..bab7216 100644 --- a/drivers/mtd/nand/s3c2410.c +++ b/drivers/mtd/nand/s3c2410.c @@ -48,6 +48,8 @@ #include <asm/plat-s3c/regs-nand.h> #include <asm/plat-s3c/nand.h>
+#define S3C_NAND_NAME_LEN 16 + #ifdef CONFIG_MTD_NAND_S3C2410_HWECC static int hardware_ecc = 1; #else @@ -60,6 +62,9 @@ static int clock_stop = 1; static const int clock_stop = 0; #endif
+#ifdef CONFIG_MTD_PARTITIONS +static const char *s3c_part_probes[] = {"cmdlinepart", NULL}; +#endif
/* new oob placement block for use with hardware ecc generation */ @@ -649,6 +654,15 @@ static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info, struct s3c2410_nand_mtd *mtd, struct s3c2410_nand_set *set) { +#ifdef CONFIG_MTD_CMDLINE_PARTS + int nr_parts; + struct mtd_partition *partitions; + + nr_parts = parse_mtd_partitions(&mtd->mtd, s3c_part_probes, &partitions, 0); + if (nr_parts > 0 && partitions != NULL) + return add_mtd_partitions(&mtd->mtd, partitions, nr_parts); +#endif + if (set == NULL) return add_mtd_device(&mtd->mtd);
@@ -808,6 +822,7 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, int size; int nr_sets; int setno; + char *name;
pr_debug("s3c2410_nand_probe(%p)\n", pdev);
@@ -875,7 +890,7 @@ static int s3c24xx_nand_probe(struct platform_device *pdev,
/* allocate our information */
- size = nr_sets * sizeof(*info->mtds); + size = nr_sets * (sizeof(*info->mtds) + S3C_NAND_NAME_LEN); info->mtds = kmalloc(size, GFP_KERNEL); if (info->mtds == NULL) { dev_err(&pdev->dev, "failed to allocate mtd storage\n"); @@ -888,10 +903,15 @@ static int s3c24xx_nand_probe(struct platform_device *pdev, /* initialise all possible chips */
nmtd = info->mtds; + name = (char *)(info->mtds + nr_sets);
for (setno = 0; setno < nr_sets; setno++, nmtd++) { pr_debug("initialising set %d (%p, info %p)\n", setno, nmtd, info);
+ sprintf(name, "s3c_nand%d", setno); + nmtd->mtd.name = name; + name += S3C_NAND_NAME_LEN; + s3c2410_nand_init_chip(info, nmtd, sets);
nmtd->scan_res = nand_scan_ident(&nmtd->mtd,
| |