kernel: add pending mtd patches adding NVMEM support
It's meant to provide upstream support for mtd & NVMEM. It's required
e.g. for reading MAC address from mtd partition content. It seems to be
in a final shape so it's worth testing.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
(cherry picked from commit e90e75b12c)
			
			
This commit is contained in:
		| @@ -0,0 +1,69 @@ | ||||
| From 2d751203aacf86a1b301a188d8551c7da91043ab Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||
| Date: Tue, 2 Mar 2021 20:00:12 +0100 | ||||
| Subject: [PATCH] mtd: parsers: ofpart: limit parsing of deprecated DT syntax | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
|  | ||||
| For backward compatibility ofpart still supports the old syntax like: | ||||
| spi-flash@0 { | ||||
| 	compatible = "jedec,spi-nor"; | ||||
| 	reg = <0x0>; | ||||
|  | ||||
| 	partition@0 { | ||||
| 		label = "bootloader"; | ||||
| 		reg = <0x0 0x100000>; | ||||
| 	}; | ||||
| }; | ||||
| (without "partitions" subnode). | ||||
|  | ||||
| There is no reason however to support nested partitions without a clear | ||||
| "compatible" string like: | ||||
| partitions { | ||||
| 	compatible = "fixed-partitions"; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
|  | ||||
| 	partition@0 { | ||||
| 		label = "bootloader"; | ||||
| 		reg = <0x0 0x100000>; | ||||
|  | ||||
| 		partition@0 { | ||||
| 			label = "config"; | ||||
| 			reg = <0x80000 0x80000>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| (we never officially supported or documented that). | ||||
|  | ||||
| Make sure ofpart doesn't attempt to parse above. | ||||
|  | ||||
| Cc: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||
| Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> | ||||
| Link: https://lore.kernel.org/linux-mtd/20210302190012.1255-1-zajec5@gmail.com | ||||
| --- | ||||
|  drivers/mtd/parsers/ofpart_core.c | 4 +++- | ||||
|  1 file changed, 3 insertions(+), 1 deletion(-) | ||||
|  | ||||
| --- a/drivers/mtd/parsers/ofpart_core.c | ||||
| +++ b/drivers/mtd/parsers/ofpart_core.c | ||||
| @@ -53,7 +53,7 @@ static int parse_fixed_partitions(struct | ||||
|  		return 0; | ||||
|   | ||||
|  	ofpart_node = of_get_child_by_name(mtd_node, "partitions"); | ||||
| -	if (!ofpart_node) { | ||||
| +	if (!ofpart_node && !mtd_is_partition(master)) { | ||||
|  		/* | ||||
|  		 * We might get here even when ofpart isn't used at all (e.g., | ||||
|  		 * when using another parser), so don't be louder than | ||||
| @@ -64,6 +64,8 @@ static int parse_fixed_partitions(struct | ||||
|  		ofpart_node = mtd_node; | ||||
|  		dedicated = false; | ||||
|  	} | ||||
| +	if (!ofpart_node) | ||||
| +		return 0; | ||||
|   | ||||
|  	of_id = of_match_node(parse_ofpart_match_table, ofpart_node); | ||||
|  	if (dedicated && !of_id) { | ||||
| @@ -0,0 +1,38 @@ | ||||
| From a5d83d6e2bc747b13f347962d4b335d70b23559b Mon Sep 17 00:00:00 2001 | ||||
| From: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| Date: Fri, 12 Mar 2021 07:28:19 +0100 | ||||
| Subject: [PATCH] mtd: core: add nvmem-cells compatible to parse mtd as nvmem | ||||
|  cells | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
|  | ||||
| Partitions that contains the nvmem-cells compatible will register | ||||
| their direct subonodes as nvmem cells and the node will be treated as a | ||||
| nvmem provider. | ||||
|  | ||||
| Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| Tested-by: Rafał Miłecki <rafal@milecki.pl> | ||||
| --- | ||||
|  drivers/mtd/mtdcore.c | 3 ++- | ||||
|  1 file changed, 2 insertions(+), 1 deletion(-) | ||||
|  | ||||
| --- a/drivers/mtd/mtdcore.c | ||||
| +++ b/drivers/mtd/mtdcore.c | ||||
| @@ -559,6 +559,7 @@ static int mtd_nvmem_reg_read(void *priv | ||||
|   | ||||
|  static int mtd_nvmem_add(struct mtd_info *mtd) | ||||
|  { | ||||
| +	struct device_node *node = mtd_get_of_node(mtd); | ||||
|  	struct nvmem_config config = {}; | ||||
|   | ||||
|  	config.id = -1; | ||||
| @@ -571,7 +572,7 @@ static int mtd_nvmem_add(struct mtd_info | ||||
|  	config.stride = 1; | ||||
|  	config.read_only = true; | ||||
|  	config.root_only = true; | ||||
| -	config.no_of_node = true; | ||||
| +	config.no_of_node = !of_device_is_compatible(node, "nvmem-cells"); | ||||
|  	config.priv = mtd; | ||||
|   | ||||
|  	mtd->nvmem = nvmem_register(&config); | ||||
| @@ -0,0 +1,25 @@ | ||||
| From 42645976c3289b03a12f1bd2bc131fd98fc27170 Mon Sep 17 00:00:00 2001 | ||||
| From: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| Date: Fri, 12 Mar 2021 07:28:20 +0100 | ||||
| Subject: [PATCH] devicetree: nvmem: nvmem: drop $nodename restriction | ||||
|  | ||||
| Drop $nodename restriction as now mtd partition can also be used as | ||||
| nvmem provider. | ||||
|  | ||||
| Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| --- | ||||
|  Documentation/devicetree/bindings/nvmem/nvmem.yaml | 3 --- | ||||
|  1 file changed, 3 deletions(-) | ||||
|  | ||||
| --- a/Documentation/devicetree/bindings/nvmem/nvmem.yaml | ||||
| +++ b/Documentation/devicetree/bindings/nvmem/nvmem.yaml | ||||
| @@ -20,9 +20,6 @@ description: | | ||||
|    storage device. | ||||
|   | ||||
|  properties: | ||||
| -  $nodename: | ||||
| -    pattern: "^(eeprom|efuse|nvram)(@.*|-[0-9a-f])*$" | ||||
| - | ||||
|    "#address-cells": | ||||
|      const: 1 | ||||
|   | ||||
| @@ -0,0 +1,117 @@ | ||||
| From 377aa0135dc8489312edd3184d143ce3a89ff7ee Mon Sep 17 00:00:00 2001 | ||||
| From: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| Date: Fri, 12 Mar 2021 07:28:21 +0100 | ||||
| Subject: [PATCH] dt-bindings: mtd: Document use of nvmem-cells compatible | ||||
|  | ||||
| Document nvmem-cells compatible used to treat mtd partitions as a | ||||
| nvmem provider. | ||||
|  | ||||
| Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| Reviewed-by: Rob Herring <robh@kernel.org> | ||||
| --- | ||||
|  .../bindings/mtd/partitions/nvmem-cells.yaml  | 99 +++++++++++++++++++ | ||||
|  1 file changed, 99 insertions(+) | ||||
|  create mode 100644 Documentation/devicetree/bindings/mtd/partitions/nvmem-cells.yaml | ||||
|  | ||||
| --- /dev/null | ||||
| +++ b/Documentation/devicetree/bindings/mtd/partitions/nvmem-cells.yaml | ||||
| @@ -0,0 +1,99 @@ | ||||
| +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause | ||||
| +%YAML 1.2 | ||||
| +--- | ||||
| +$id: http://devicetree.org/schemas/mtd/partitions/nvmem-cells.yaml# | ||||
| +$schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| + | ||||
| +title: Nvmem cells | ||||
| + | ||||
| +description: | | ||||
| +  Any partition containing the compatible "nvmem-cells" will register as a | ||||
| +  nvmem provider. | ||||
| +  Each direct subnodes represents a nvmem cell following the nvmem binding. | ||||
| +  Nvmem binding to declare nvmem-cells can be found in: | ||||
| +  Documentation/devicetree/bindings/nvmem/nvmem.yaml | ||||
| + | ||||
| +maintainers: | ||||
| +  - Ansuel Smith <ansuelsmth@gmail.com> | ||||
| + | ||||
| +allOf: | ||||
| +  - $ref: /schemas/nvmem/nvmem.yaml# | ||||
| + | ||||
| +properties: | ||||
| +  compatible: | ||||
| +    const: nvmem-cells | ||||
| + | ||||
| +required: | ||||
| +  - compatible | ||||
| + | ||||
| +additionalProperties: true | ||||
| + | ||||
| +examples: | ||||
| +  - | | ||||
| +    partitions { | ||||
| +      compatible = "fixed-partitions"; | ||||
| +      #address-cells = <1>; | ||||
| +      #size-cells = <1>; | ||||
| + | ||||
| +      /* ... */ | ||||
| + | ||||
| +      }; | ||||
| +      art: art@1200000 { | ||||
| +        compatible = "nvmem-cells"; | ||||
| +        reg = <0x1200000 0x0140000>; | ||||
| +        label = "art"; | ||||
| +        read-only; | ||||
| +        #address-cells = <1>; | ||||
| +        #size-cells = <1>; | ||||
| + | ||||
| +        macaddr_gmac1: macaddr_gmac1@0 { | ||||
| +          reg = <0x0 0x6>; | ||||
| +        }; | ||||
| + | ||||
| +        macaddr_gmac2: macaddr_gmac2@6 { | ||||
| +          reg = <0x6 0x6>; | ||||
| +        }; | ||||
| + | ||||
| +        pre_cal_24g: pre_cal_24g@1000 { | ||||
| +          reg = <0x1000 0x2f20>; | ||||
| +        }; | ||||
| + | ||||
| +        pre_cal_5g: pre_cal_5g@5000{ | ||||
| +          reg = <0x5000 0x2f20>; | ||||
| +        }; | ||||
| +      }; | ||||
| +  - | | ||||
| +    partitions { | ||||
| +        compatible = "fixed-partitions"; | ||||
| +        #address-cells = <1>; | ||||
| +        #size-cells = <1>; | ||||
| + | ||||
| +        partition@0 { | ||||
| +            label = "bootloader"; | ||||
| +            reg = <0x000000 0x100000>; | ||||
| +            read-only; | ||||
| +        }; | ||||
| + | ||||
| +        firmware@100000 { | ||||
| +            compatible = "brcm,trx"; | ||||
| +            label = "firmware"; | ||||
| +            reg = <0x100000 0xe00000>; | ||||
| +        }; | ||||
| + | ||||
| +        calibration@f00000 { | ||||
| +            compatible = "nvmem-cells"; | ||||
| +            label = "calibration"; | ||||
| +            reg = <0xf00000 0x100000>; | ||||
| +            ranges = <0 0xf00000 0x100000>; | ||||
| +            #address-cells = <1>; | ||||
| +            #size-cells = <1>; | ||||
| + | ||||
| +            wifi0@0 { | ||||
| +                reg = <0x000000 0x080000>; | ||||
| +            }; | ||||
| + | ||||
| +            wifi1@80000 { | ||||
| +                reg = <0x080000 0x080000>; | ||||
| +            }; | ||||
| +        }; | ||||
| +    }; | ||||
| @@ -20,7 +20,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | ||||
|  #include <linux/nvmem-provider.h> | ||||
|   | ||||
|  #include <linux/mtd/mtd.h> | ||||
| @@ -698,6 +699,15 @@ int add_mtd_device(struct mtd_info *mtd) | ||||
| @@ -699,6 +700,15 @@ int add_mtd_device(struct mtd_info *mtd) | ||||
|  	   of this try_ nonsense, and no bitching about it | ||||
|  	   either. :) */ | ||||
|  	__module_get(THIS_MODULE); | ||||
|   | ||||
| @@ -17,7 +17,7 @@ Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> | ||||
|  | ||||
| --- a/drivers/mtd/mtdcore.c | ||||
| +++ b/drivers/mtd/mtdcore.c | ||||
| @@ -1049,6 +1049,44 @@ out_unlock: | ||||
| @@ -1050,6 +1050,44 @@ out_unlock: | ||||
|  } | ||||
|  EXPORT_SYMBOL_GPL(get_mtd_device_nm); | ||||
|   | ||||
|   | ||||
| @@ -22,7 +22,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org> | ||||
|  	const char *partname; | ||||
|  	struct device_node *pp; | ||||
|  	int nr_parts, i, ret = 0; | ||||
| @@ -124,9 +127,15 @@ static int parse_fixed_partitions(struct | ||||
| @@ -126,9 +129,15 @@ static int parse_fixed_partitions(struct | ||||
|  		parts[i].size = of_read_number(reg + a_cells, s_cells); | ||||
|  		parts[i].of_node = pp; | ||||
|   | ||||
| @@ -41,7 +41,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org> | ||||
|  		parts[i].name = partname; | ||||
|   | ||||
|  		if (of_get_property(pp, "read-only", &len)) | ||||
| @@ -239,6 +248,18 @@ static int __init ofpart_parser_init(voi | ||||
| @@ -241,6 +250,18 @@ static int __init ofpart_parser_init(voi | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
|   | ||||
| @@ -48,7 +48,7 @@ | ||||
|   | ||||
|  	/* Pull of_node from the master device node */ | ||||
|  	mtd_node = mtd_get_of_node(master); | ||||
| @@ -86,7 +120,9 @@ static int parse_fixed_partitions(struct | ||||
| @@ -88,7 +122,9 @@ static int parse_fixed_partitions(struct | ||||
|  		return 0; | ||||
|   | ||||
|  	parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL); | ||||
| @@ -59,7 +59,7 @@ | ||||
|  		return -ENOMEM; | ||||
|   | ||||
|  	i = 0; | ||||
| @@ -135,6 +171,11 @@ static int parse_fixed_partitions(struct | ||||
| @@ -137,6 +173,11 @@ static int parse_fixed_partitions(struct | ||||
|  		if (of_get_property(pp, "lock", &len)) | ||||
|  			parts[i].mask_flags |= MTD_POWERUP_LOCK; | ||||
|   | ||||
| @@ -71,7 +71,7 @@ | ||||
|  		i++; | ||||
|  	} | ||||
|   | ||||
| @@ -144,6 +185,11 @@ static int parse_fixed_partitions(struct | ||||
| @@ -146,6 +187,11 @@ static int parse_fixed_partitions(struct | ||||
|  	if (quirks && quirks->post_parse) | ||||
|  		quirks->post_parse(master, parts, nr_parts); | ||||
|   | ||||
| @@ -83,7 +83,7 @@ | ||||
|  	*pparts = parts; | ||||
|  	return nr_parts; | ||||
|   | ||||
| @@ -154,6 +200,7 @@ ofpart_fail: | ||||
| @@ -156,6 +202,7 @@ ofpart_fail: | ||||
|  ofpart_none: | ||||
|  	of_node_put(pp); | ||||
|  	kfree(parts); | ||||
|   | ||||
| @@ -22,7 +22,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org> | ||||
|  	struct device_node *pp; | ||||
|  	int nr_parts, i, ret = 0; | ||||
|  	bool dedicated = true; | ||||
| @@ -124,9 +127,13 @@ static int parse_fixed_partitions(struct | ||||
| @@ -126,9 +129,13 @@ static int parse_fixed_partitions(struct | ||||
|  		parts[i].size = of_read_number(reg + a_cells, s_cells); | ||||
|  		parts[i].of_node = pp; | ||||
|   | ||||
| @@ -39,7 +39,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org> | ||||
|  		parts[i].name = partname; | ||||
|   | ||||
|  		if (of_get_property(pp, "read-only", &len)) | ||||
| @@ -239,6 +246,18 @@ static int __init ofpart_parser_init(voi | ||||
| @@ -241,6 +248,18 @@ static int __init ofpart_parser_init(voi | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
|   | ||||
| @@ -34,7 +34,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com> | ||||
|  	mtd->type = MTD_NORFLASH; | ||||
| --- a/drivers/mtd/mtdcore.c | ||||
| +++ b/drivers/mtd/mtdcore.c | ||||
| @@ -778,6 +778,17 @@ out_error: | ||||
| @@ -779,6 +779,17 @@ out_error: | ||||
|   */ | ||||
|  static void mtd_set_dev_defaults(struct mtd_info *mtd) | ||||
|  { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Rafał Miłecki
					Rafał Miłecki