+ return nr_parts;
+}
+
- static inline unsigned long
- mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -636,6 +667,7 @@ EXPORT_SYMBOL_GPL(mtd_del_partition);
+
+ static void split_firmware(struct mtd_info *master, struct mtd_part *part)
{
-@@ -660,6 +691,10 @@ static void split_rootfs_data(struct mtd
- unsigned int split_size;
- int ret;
++ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
+ }
-+ ret = run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS);
-+ if (ret > 0)
-+ return;
-+
- ret = split_squashfs(master, part->offset, &split_offset);
- if (ret)
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
+@@ -650,6 +682,12 @@ static void mtd_partition_split(struct m
+ if (rootfs_found)
return;
-@@ -709,6 +744,12 @@ static void split_uimage(struct mtd_info
- static void split_firmware(struct mtd_info *master, struct mtd_part *part)
- {
-+ int ret;
++ if (!strcmp(part->mtd.name, "rootfs")) {
++ run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS);
+
-+ ret = run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
-+ if (ret > 0)
-+ return;
++ rootfs_found = 1;
++ }
+
- if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
- split_uimage(master, part);
- }
+ if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
+ config_enabled(CONFIG_MTD_SPLIT_FIRMWARE))
+ split_firmware(master, part);
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
@@ -70,6 +70,8 @@ struct mtd_part_parser_data {