diff options
Diffstat (limited to 'target/linux/generic/pending-4.19/161-mtd-part-add-generic-parsing-of-linux-part-probe.patch')
-rw-r--r-- | target/linux/generic/pending-4.19/161-mtd-part-add-generic-parsing-of-linux-part-probe.patch | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/target/linux/generic/pending-4.19/161-mtd-part-add-generic-parsing-of-linux-part-probe.patch b/target/linux/generic/pending-4.19/161-mtd-part-add-generic-parsing-of-linux-part-probe.patch new file mode 100644 index 0000000000..9625a51129 --- /dev/null +++ b/target/linux/generic/pending-4.19/161-mtd-part-add-generic-parsing-of-linux-part-probe.patch @@ -0,0 +1,172 @@ +From: Hauke Mehrtens <hauke@hauke-m.de> +Subject: mtd: part: add generic parsing of linux,part-probe + +This moves the linux,part-probe device tree parsing code from +physmap_of.c to mtdpart.c. Now all drivers can use this feature by just +providing a reference to their device tree node in struct +mtd_part_parser_data. + +THIS METHOD HAS BEEN DEPRECATED + +Linux supports "compatible" property in the "partitions" subnode now. It +should be used to specify partitions format (and trigger proper parser +usage) if needed. + +Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> +--- + Documentation/devicetree/bindings/mtd/nand.txt | 16 +++++++++ + drivers/mtd/maps/physmap_of.c | 46 +------------------------- + drivers/mtd/mtdpart.c | 45 +++++++++++++++++++++++++ + 3 files changed, 62 insertions(+), 45 deletions(-) + +--- a/Documentation/devicetree/bindings/mtd/nand.txt ++++ b/Documentation/devicetree/bindings/mtd/nand.txt +@@ -44,6 +44,22 @@ Optional NAND chip properties: + used by the upper layers, and you want to make your NAND + as reliable as possible. + ++- linux,part-probe: list of name as strings of the partition parser ++ which should be used to parse the partition table. ++ They will be tried in the specified ordering and ++ the next one will be used if the previous one ++ failed. ++ ++ Example: linux,part-probe = "cmdlinepart", "ofpart"; ++ ++ This is also the default value, which will be used ++ if this attribute is not specified. It could be ++ that the flash driver in use overwrote the default ++ value and uses some other default. ++ ++ Possible values are: bcm47xxpart, afs, ar7part, ++ ofoldpart, ofpart, bcm63xxpart, RedBoot, cmdlinepart ++ + The ECC strength and ECC step size properties define the correction capability + of a controller. Together, they say a controller can correct "{strength} bit + errors per {size} bytes". +--- a/drivers/mtd/maps/physmap_of_core.c ++++ b/drivers/mtd/maps/physmap_of_core.c +@@ -114,37 +114,9 @@ static struct mtd_info *obsolete_probe(s + 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 **res; +- int count; +- +- count = of_property_count_strings(dp, "linux,part-probe"); +- if (count < 0) +- return part_probe_types_def; +- +- res = kzalloc((count + 1) * sizeof(*res), GFP_KERNEL); +- if (!res) +- return NULL; +- +- count = of_property_read_string_array(dp, "linux,part-probe", res, +- count); +- if (count < 0) +- return NULL; +- +- 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; +@@ -310,14 +282,8 @@ static int of_flash_probe(struct platfor + + info->cmtd->dev.parent = &dev->dev; + mtd_set_of_node(info->cmtd, dp); +- 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, NULL, ++ mtd_device_parse_register(info->cmtd, part_probe_types_def, NULL, + NULL, 0); +- of_free_probes(part_probe_types); + + kfree(mtd_list); + +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -29,6 +29,7 @@ + #include <linux/kmod.h> + #include <linux/mtd/mtd.h> + #include <linux/mtd/partitions.h> ++#include <linux/of.h> + #include <linux/err.h> + #include <linux/of.h> + +@@ -844,6 +845,37 @@ void deregister_mtd_parser(struct mtd_pa + } + EXPORT_SYMBOL_GPL(deregister_mtd_parser); + ++#include <linux/version.h> ++ ++/* ++ * Parses the linux,part-probe device tree property. ++ * When a non null value is returned it has to be freed with kfree() by ++ * the caller. ++ */ ++static const char * const *of_get_probes(struct device_node *dp) ++{ ++ const char **res; ++ int count; ++ ++ count = of_property_count_strings(dp, "linux,part-probe"); ++ if (count < 0) ++ return NULL; ++ ++ res = kzalloc((count + 1) * sizeof(*res), GFP_KERNEL); ++ if (!res) ++ return NULL; ++ ++ count = of_property_read_string_array(dp, "linux,part-probe", res, ++ count); ++ if (count < 0) ++ return NULL; ++ ++ pr_warn("Support for the generic \"linux,part-probe\" has been deprecated and will be removed soon"); ++ BUILD_BUG_ON(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)); ++ ++ return res; ++} ++ + /* + * Do not forget to update 'parse_mtd_partitions()' kerneldoc comment if you + * are changing this array! +@@ -993,6 +1025,13 @@ int parse_mtd_partitions(struct mtd_info + struct mtd_partitions pparts = { }; + struct mtd_part_parser *parser; + int ret, err = 0; ++ const char *const *types_of = NULL; ++ ++ if (mtd_get_of_node(master)) { ++ types_of = of_get_probes(mtd_get_of_node(master)); ++ if (types_of != NULL) ++ types = types_of; ++ } + + if (!types) + types = mtd_is_partition(master) ? default_subpartition_types : +@@ -1034,6 +1073,7 @@ int parse_mtd_partitions(struct mtd_info + if (ret < 0 && !err) + err = ret; + } ++ kfree(types_of); + return err; + } + |