Patchwork mtd: Extend physmap_of to let the device tree specify the parition probe

login
register
mail settings
Submitter Jason Gunthorpe
Date March 9, 2010, 7:27 p.m.
Message ID <20100309192756.GC30462@obsidianresearch.com>
Download mbox | patch
Permalink /patch/47179/
State New
Headers show

Comments

Jason Gunthorpe - March 9, 2010, 7:27 p.m.
This is to support custom partitioning schemes for embedded PPC. To use
define your own mtd_part_parser and then add something like:
   linux,part-probe = "my_probe", "cmdlinepart";
To the board's dts file.

If linux,part-probe is not specified then this behaves the same as before.

Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
---
 drivers/mtd/maps/physmap_of.c |   53 +++++++++++++++++++++++++++++++++++++----
 1 files changed, 48 insertions(+), 5 deletions(-)
Artem Bityutskiy - April 6, 2010, 8:44 a.m.
On Tue, 2010-03-09 at 12:27 -0700, Jason Gunthorpe wrote:
> This is to support custom partitioning schemes for embedded PPC. To use
> define your own mtd_part_parser and then add something like:
>    linux,part-probe = "my_probe", "cmdlinepart";
> To the board's dts file.
> 
> If linux,part-probe is not specified then this behaves the same as before.
> 
> Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>

Taken to my l2-mtd-2.6.git / dunno
Jason Gunthorpe - April 12, 2010, 9:20 p.m.
On Tue, Apr 06, 2010 at 11:44:38AM +0300, Artem Bityutskiy wrote:
> On Tue, 2010-03-09 at 12:27 -0700, Jason Gunthorpe wrote:
> > This is to support custom partitioning schemes for embedded PPC. To use
> > define your own mtd_part_parser and then add something like:
> >    linux,part-probe = "my_probe", "cmdlinepart";
> > To the board's dts file.
> > 
> > If linux,part-probe is not specified then this behaves the same as before.
> > 
> > Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
> 
> Taken to my l2-mtd-2.6.git / dunno

Thanks Artem, not sure what that means? Do you need anything
additional from me?

Jason
Artem Bityutskiy - April 27, 2010, 12:53 p.m.
On Mon, 2010-04-12 at 15:20 -0600, Jason Gunthorpe wrote:
> On Tue, Apr 06, 2010 at 11:44:38AM +0300, Artem Bityutskiy wrote:
> > On Tue, 2010-03-09 at 12:27 -0700, Jason Gunthorpe wrote:
> > > This is to support custom partitioning schemes for embedded PPC. To use
> > > define your own mtd_part_parser and then add something like:
> > >    linux,part-probe = "my_probe", "cmdlinepart";
> > > To the board's dts file.
> > > 
> > > If linux,part-probe is not specified then this behaves the same as before.
> > > 
> > > Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
> > 
> > Taken to my l2-mtd-2.6.git / dunno
> 
> Thanks Artem, not sure what that means? Do you need anything
> additional from me?

This means that this patch will most probably not forgotten by David
Woodhouse. So for nothing is required from you. But if you do not see
your patch in 2.6.35, then you should probably sent a question.

Patch

diff --git a/drivers/mtd/maps/physmap_of.c b/drivers/mtd/maps/physmap_of.c
index 61e4eb4..fe4438c 100644
--- a/drivers/mtd/maps/physmap_of.c
+++ b/drivers/mtd/maps/physmap_of.c
@@ -172,12 +172,53 @@  static struct mtd_info * __devinit obsolete_probe(struct of_device *dev,
 	}
 }
 
+#ifdef CONFIG_MTD_PARTITIONS
+/* When partitions are set we look for a linux,part-probe property which
+   specifies the list of partition probers to use. If none is given then the
+   default is use. These take precedence over other device tree
+   information. */
+static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot", NULL };
+static const char ** __devinit of_get_probes(struct device_node *dp)
+{
+	const char *cp;
+	int cplen;
+	unsigned int l;
+	unsigned int count;
+	const char **res;
+
+	cp = of_get_property(dp, "linux,part-probe", &cplen);
+	if (cp == NULL)
+		return part_probe_types_def;
+
+	count = 0;
+	for (l = 0; l != cplen; l++)
+		if (cp[l] == 0)
+			count++;
+
+	res = kzalloc((count + 1)*sizeof(*res), GFP_KERNEL);
+	count = 0;
+	while (cplen > 0) {
+		res[count] = cp;
+		l = strlen(cp) + 1;
+		cp += l;
+		cplen -= l;
+		count++;
+	}
+	return res;
+}
+
+static void __devinit of_free_probes(const char **probes)
+{
+	if (probes != part_probe_types_def)
+		kfree(probes);
+}
+#endif
+
 static int __devinit of_flash_probe(struct of_device *dev,
 				    const struct of_device_id *match)
 {
 #ifdef CONFIG_MTD_PARTITIONS
-	static const char *part_probe_types[]
-		= { "cmdlinepart", "RedBoot", NULL };
+	const char **part_probe_types;
 #endif
 	struct device_node *dp = dev->node;
 	struct resource res;
@@ -306,12 +347,14 @@  static int __devinit of_flash_probe(struct of_device *dev,
 		goto err_out;
 
 #ifdef CONFIG_MTD_PARTITIONS
-	/* First look for RedBoot table or partitions on the command
-	 * line, these take precedence over device tree information */
+	part_probe_types = of_get_probes(dp);
 	err = parse_mtd_partitions(info->cmtd, part_probe_types,
 				   &info->parts, 0);
-	if (err < 0)
+	if (err < 0) {
+		of_free_probes(part_probe_types);
 		return err;
+	}
+	of_free_probes(part_probe_types);
 
 #ifdef CONFIG_MTD_OF_PARTS
 	if (err == 0) {