mtd: extend physmap_of to let the device tree specify the parition probe
authorJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Tue, 9 Mar 2010 19:27:56 +0000 (12:27 -0700)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Thu, 13 May 2010 23:32:30 +0000 (00:32 +0100)
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>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/maps/physmap_of.c

index bbdd219..36dbcee 100644 (file)
@@ -173,12 +173,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;
@@ -307,12 +348,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) {