OSDN Git Service

mtd: core: try to find OF node for every MTD partition
authorRafał Miłecki <rafal@milecki.pl>
Tue, 4 Oct 2022 08:37:10 +0000 (10:37 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Mon, 7 Nov 2022 16:07:56 +0000 (17:07 +0100)
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

index 6ad62ff..20fcedc 100644 (file)
@@ -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,7 +563,10 @@ static void mtd_check_of_node(struct mtd_info *mtd)
        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;
 
@@ -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);