mtd: OneNAND: OMAP2/3: add support for command line partitioning

Add the ability to parse MTD partition information from the
kernel command line.

Note that a pointless BUG_ON is removed, as are redundant
calls to 'del_mtd_partitions()' and 'del_mtd_device()'
because they are also done by 'onenand_release()'.

Finally note that 'add_mtd_device()' returns 1 on failure
so the error condition was incorrect.

Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
Adrian Hunter 2009-12-30 07:40:16 +01:00 коммит произвёл David Woodhouse
Родитель b7b1a29d94
Коммит 263a8c8635
1 изменённых файлов: 12 добавлений и 15 удалений

Просмотреть файл

@ -65,6 +65,10 @@ struct omap2_onenand {
int (*setup)(void __iomem *base, int freq); int (*setup)(void __iomem *base, int freq);
}; };
#ifdef CONFIG_MTD_PARTITIONS
static const char *part_probes[] = { "cmdlinepart", NULL, };
#endif
static void omap2_onenand_dma_cb(int lch, u16 ch_status, void *data) static void omap2_onenand_dma_cb(int lch, u16 ch_status, void *data)
{ {
struct omap2_onenand *c = data; struct omap2_onenand *c = data;
@ -730,13 +734,15 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
} }
#ifdef CONFIG_MTD_PARTITIONS #ifdef CONFIG_MTD_PARTITIONS
if (pdata->parts != NULL) r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0);
r = add_mtd_partitions(&c->mtd, pdata->parts, if (r > 0)
pdata->nr_parts); r = add_mtd_partitions(&c->mtd, c->parts, r);
else if (pdata->parts != NULL)
r = add_mtd_partitions(&c->mtd, pdata->parts, pdata->nr_parts);
else else
#endif #endif
r = add_mtd_device(&c->mtd); r = add_mtd_device(&c->mtd);
if (r < 0) if (r)
goto err_release_onenand; goto err_release_onenand;
platform_set_drvdata(pdev, c); platform_set_drvdata(pdev, c);
@ -760,6 +766,7 @@ err_release_mem_region:
err_free_cs: err_free_cs:
gpmc_cs_free(c->gpmc_cs); gpmc_cs_free(c->gpmc_cs);
err_kfree: err_kfree:
kfree(c->parts);
kfree(c); kfree(c);
return r; return r;
@ -769,17 +776,6 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev)
{ {
struct omap2_onenand *c = dev_get_drvdata(&pdev->dev); struct omap2_onenand *c = dev_get_drvdata(&pdev->dev);
BUG_ON(c == NULL);
#ifdef CONFIG_MTD_PARTITIONS
if (c->parts)
del_mtd_partitions(&c->mtd);
else
del_mtd_device(&c->mtd);
#else
del_mtd_device(&c->mtd);
#endif
onenand_release(&c->mtd); onenand_release(&c->mtd);
if (c->dma_channel != -1) if (c->dma_channel != -1)
omap_free_dma(c->dma_channel); omap_free_dma(c->dma_channel);
@ -792,6 +788,7 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev)
iounmap(c->onenand.base); iounmap(c->onenand.base);
release_mem_region(c->phys_base, ONENAND_IO_SIZE); release_mem_region(c->phys_base, ONENAND_IO_SIZE);
gpmc_cs_free(c->gpmc_cs); gpmc_cs_free(c->gpmc_cs);
kfree(c->parts);
kfree(c); kfree(c);
return 0; return 0;