Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 263a8c86 authored by Adrian Hunter's avatar Adrian Hunter Committed by David Woodhouse
Browse files

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: default avatarAdrian Hunter <adrian.hunter@nokia.com>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent b7b1a29d
Loading
Loading
Loading
Loading
+12 −15
Original line number Original line Diff line number Diff line
@@ -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;