85 lines
2.3 KiB
Diff
85 lines
2.3 KiB
Diff
From ddb8cefb7af288950447ca6eeeafb09977dab56f Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
|
Date: Tue, 4 Oct 2022 10:37:10 +0200
|
|
Subject: [PATCH] mtd: core: try to find OF node for every MTD partition
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
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: Rafał Miłecki <rafal@milecki.pl>
|
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-2-zajec5@gmail.com
|
|
---
|
|
drivers/mtd/mtdcore.c | 18 ++++++------------
|
|
1 file changed, 6 insertions(+), 12 deletions(-)
|
|
|
|
--- a/drivers/mtd/mtdcore.c
|
|
+++ b/drivers/mtd/mtdcore.c
|
|
@@ -551,20 +551,22 @@ static void mtd_check_of_node(struct 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;
|
|
+
|
|
parent_dn = of_node_get(mtd_get_of_node(mtd->parent));
|
|
if (!parent_dn)
|
|
return;
|
|
|
|
- partitions = of_get_child_by_name(parent_dn, "partitions");
|
|
+ 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;
|
|
|
|
@@ -588,19 +590,11 @@ static void mtd_check_of_node(struct 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);
|