aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-4.4/1239-mtd-extend-physmap_of-to-let-the-device-tree-specify.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-4.4/1239-mtd-extend-physmap_of-to-let-the-device-tree-specify.patch')
-rw-r--r--target/linux/layerscape/patches-4.4/1239-mtd-extend-physmap_of-to-let-the-device-tree-specify.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-4.4/1239-mtd-extend-physmap_of-to-let-the-device-tree-specify.patch b/target/linux/layerscape/patches-4.4/1239-mtd-extend-physmap_of-to-let-the-device-tree-specify.patch
new file mode 100644
index 0000000000..8254490bb0
--- /dev/null
+++ b/target/linux/layerscape/patches-4.4/1239-mtd-extend-physmap_of-to-let-the-device-tree-specify.patch
@@ -0,0 +1,90 @@
+From 6b54054c4053215fe4add195c67daca9a466ba92 Mon Sep 17 00:00:00 2001
+From: "ying.zhang" <ying.zhang22455@nxp.com>
+Date: Fri, 23 Dec 2016 22:21:22 +0800
+Subject: [PATCH] mtd: extend physmap_of to let the device tree specify the
+ parition probe
+
+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 | 46 ++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 45 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/maps/physmap_of.c b/drivers/mtd/maps/physmap_of.c
+index fef1d1b..e46b4e9 100644
+--- a/drivers/mtd/maps/physmap_of.c
++++ b/drivers/mtd/maps/physmap_of.c
+@@ -112,9 +112,47 @@ static struct mtd_info *obsolete_probe(struct platform_device *dev,
+ static const char * const part_probe_types_def[] = {
+ "cmdlinepart", "RedBoot", "ofpart", "ofoldpart", NULL };
+
++static const char * const *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);
++ if (!res)
++ return NULL;
++ count = 0;
++ while (cplen > 0) {
++ res[count] = cp;
++ l = strlen(cp) + 1;
++ cp += l;
++ cplen -= l;
++ count++;
++ }
++ return res;
++}
++
++static void of_free_probes(const char * const *probes)
++{
++ if (probes != part_probe_types_def)
++ kfree(probes);
++}
++
+ static const struct of_device_id of_flash_match[];
+ static int of_flash_probe(struct platform_device *dev)
+ {
++ const char * const *part_probe_types;
+ const struct of_device_id *match;
+ struct device_node *dp = dev->dev.of_node;
+ struct resource res;
+@@ -273,8 +311,14 @@ static int of_flash_probe(struct platform_device *dev)
+ goto err_out;
+
+ ppdata.of_node = dp;
+- mtd_device_parse_register(info->cmtd, part_probe_types_def, &ppdata,
++ part_probe_types = of_get_probes(dp);
++ if (!part_probe_types) {
++ err = -ENOMEM;
++ goto err_out;
++ }
++ mtd_device_parse_register(info->cmtd, part_probe_types, &ppdata,
+ NULL, 0);
++ of_free_probes(part_probe_types);
+
+ kfree(mtd_list);
+
+--
+1.7.9.5
+