From: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> It was already noticed in commit 9d42c77f126e ("devfs: take into account for the partitions check that mtd is different") that the partitioning info is stored differently for mtd devices. Instead of only getting the partion size from the right spot, use the right data completely. Fixes: 9d42c77f126e ("devfs: take into account for the partitions check that mtd is different") Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> --- drivers/of/partition.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/drivers/of/partition.c b/drivers/of/partition.c index d11e1d1690f9..598ac5240d79 100644 --- a/drivers/of/partition.c +++ b/drivers/of/partition.c @@ -267,18 +267,32 @@ int of_fixup_partitions(struct device_node *np, struct cdev *cdev) if (ret) return ret; - list_for_each_entry(partcdev, &cdev->partitions, partition_entry) { - loff_t partoffset; + if (cdev->mtd) { + struct mtd_info *mtdpart; + list_for_each_entry(mtdpart, &cdev->mtd->partitions, partitions_entry) { + const char *name = mtdpart->name; + + if (mtdpart->parent) { + const char *parentname = dev_name(&mtdpart->parent->dev); + size_t parentnamelen = strlen(parentname); + + if (!strncmp(parentname, name, parentnamelen) && name[parentnamelen] == '.') + name += parentnamelen + 1; + } + + ret = of_fixup_one_partition(partnode, mtdpart->master_offset, mtdpart->size, name, partcdev->flags); + if (ret) + return ret; + } + return 0; + } + + list_for_each_entry(partcdev, &cdev->partitions, partition_entry) { if (!(partcdev->flags & DEVFS_PARTITION_FROM_OF)) continue; - if (partcdev->mtd) - partoffset = partcdev->mtd->master_offset; - else - partoffset = partcdev->offset; - - ret = of_fixup_one_partition(partnode, partoffset, partcdev->size, partcdev->partname, partcdev->flags); + ret = of_fixup_one_partition(partnode, partcdev->offset, partcdev->size, partcdev->partname, partcdev->flags); if (ret) return ret; } -- 2.43.0