Commit 2df11f00 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Miquel Raynal
Browse files

mtd: core: try to find OF node for every MTD partition



So far this feature was limited to the top-level "nvmem-cells" node.
There are multiple parsers creating partitions and subpartitions
dynamically. Extend that code to handle them too.

This allows finding partition-* node for every MTD (sub)partition.

Random example:

partitions {
	compatible = "brcm,bcm947xx-cfe-partitions";

	partition-firmware {
		compatible = "brcm,trx";

		partition-loader {
		};
	};
};

Cc: Christian Marangi <ansuelsmth@gmail.com>
Signed-off-by: default avatarRafał Miłecki <rafal@milecki.pl>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-2-zajec5@gmail.com
parent c5f5d0cd
Loading
Loading
Loading
Loading
+5 −12
Original line number Diff line number Diff line
@@ -551,13 +551,11 @@ static void mtd_check_of_node(struct mtd_info *mtd)
	struct device_node *partitions, *parent_dn, *mtd_dn = NULL;
	const char *pname, *prefix = "partition-";
	int plen, mtd_name_len, offset, prefix_len;
	bool found = false;

	/* Check if MTD already has a device node */
	if (mtd_get_of_node(mtd))
		return;

	/* Check if a partitions node exist */
	if (!mtd_is_partition(mtd))
		return;

@@ -565,6 +563,9 @@ static void mtd_check_of_node(struct mtd_info *mtd)
	if (!parent_dn)
		return;

	if (mtd_is_partition(mtd->parent))
		partitions = of_node_get(parent_dn);
	else
		partitions = of_get_child_by_name(parent_dn, "partitions");
	if (!partitions)
		goto exit_parent;
@@ -589,19 +590,11 @@ static void mtd_check_of_node(struct mtd_info *mtd)
		plen = strlen(pname) - offset;
		if (plen == mtd_name_len &&
		    !strncmp(mtd->name, pname + offset, plen)) {
			found = true;
			mtd_set_of_node(mtd, mtd_dn);
			break;
		}
	}

	if (!found)
		goto exit_partitions;

	/* Set of_node only for nvmem */
	if (of_device_is_compatible(mtd_dn, "nvmem-cells"))
		mtd_set_of_node(mtd, mtd_dn);

exit_partitions:
	of_node_put(partitions);
exit_parent:
	of_node_put(parent_dn);