--- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c @@ -626,6 +626,37 @@ int mtd_del_partition(struct mtd_info *m } EXPORT_SYMBOL_GPL(mtd_del_partition); +static int +run_parsers_by_type(struct mtd_part *slave, enum mtd_parser_type type) +{ + struct mtd_partition *parts; + int nr_parts; + int i; + + nr_parts = parse_mtd_partitions_by_type(&slave->mtd, type, &parts, + NULL); + if (nr_parts <= 0) + return nr_parts; + + if (WARN_ON(!parts)) + return 0; + + for (i = 0; i < nr_parts; i++) { + /* adjust partition offsets */ + parts[i].offset += slave->offset; + + __mtd_add_partition(slave->master, + parts[i].name, + parts[i].offset, + parts[i].size, + false); + } + + kfree(parts); + + return nr_parts; +} + static inline unsigned long mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len) { @@ -685,6 +716,10 @@ static void split_rootfs_data(struct mtd unsigned int split_size; int ret; + ret = run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS); + if (ret > 0) + return; + ret = split_squashfs(master, part->offset, &split_offset); if (ret) return; @@ -734,6 +769,12 @@ static void split_uimage(struct mtd_info static void split_firmware(struct mtd_info *master, struct mtd_part *part) { + int ret; + + ret = run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE); + if (ret > 0) + return; + if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT)) split_uimage(master, part); } --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h @@ -70,6 +70,8 @@ struct mtd_part_parser_data { enum mtd_parser_type { MTD_PARSER_TYPE_DEVICE = 0, + MTD_PARSER_TYPE_ROOTFS, + MTD_PARSER_TYPE_FIRMWARE, }; struct mtd_part_parser {