|
@@ -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,
|
|
static int __devinit of_flash_probe(struct of_device *dev,
|
|
const struct of_device_id *match)
|
|
const struct of_device_id *match)
|
|
{
|
|
{
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
- static const char *part_probe_types[]
|
|
|
|
- = { "cmdlinepart", "RedBoot", NULL };
|
|
|
|
|
|
+ const char **part_probe_types;
|
|
#endif
|
|
#endif
|
|
struct device_node *dp = dev->node;
|
|
struct device_node *dp = dev->node;
|
|
struct resource res;
|
|
struct resource res;
|
|
@@ -307,12 +348,14 @@ static int __devinit of_flash_probe(struct of_device *dev,
|
|
goto err_out;
|
|
goto err_out;
|
|
|
|
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
#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,
|
|
err = parse_mtd_partitions(info->cmtd, part_probe_types,
|
|
&info->parts, 0);
|
|
&info->parts, 0);
|
|
- if (err < 0)
|
|
|
|
|
|
+ if (err < 0) {
|
|
|
|
+ of_free_probes(part_probe_types);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
|
|
+ of_free_probes(part_probe_types);
|
|
|
|
|
|
#ifdef CONFIG_MTD_OF_PARTS
|
|
#ifdef CONFIG_MTD_OF_PARTS
|
|
if (err == 0) {
|
|
if (err == 0) {
|