/branches/18.06.1/target/linux/generic/pending-4.14/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch |
@@ -10,15 +10,52 @@ |
|
--- a/drivers/mtd/mtdpart.c |
+++ b/drivers/mtd/mtdpart.c |
@@ -793,6 +793,7 @@ run_parsers_by_type(struct mtd_part *sla |
@@ -741,6 +741,36 @@ 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, (const struct mtd_partition **)&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->parent, |
+ parts[i].name, |
+ parts[i].offset, |
+ parts[i].size); |
+ } |
+ |
+ kfree(parts); |
+ |
+ return nr_parts; |
+} |
+ |
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME |
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME |
#else |
@@ -749,6 +779,7 @@ EXPORT_SYMBOL_GPL(mtd_del_partition); |
|
static void split_firmware(struct mtd_info *master, struct mtd_part *part) |
{ |
+ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE); |
} |
|
static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part) |
@@ -802,6 +803,12 @@ static void mtd_partition_split(struct m |
void __weak arch_split_mtd_part(struct mtd_info *master, const char *name, |
@@ -763,6 +794,12 @@ static void mtd_partition_split(struct m |
if (rootfs_found) |
return; |
|
@@ -28,12 +65,12 @@ |
+ rootfs_found = 1; |
+ } |
+ |
if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && |
!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && |
!of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL)) |
if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) && |
IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE)) |
split_firmware(master, part); |
--- a/include/linux/mtd/partitions.h |
+++ b/include/linux/mtd/partitions.h |
@@ -75,6 +75,8 @@ struct mtd_part_parser_data { |
@@ -74,6 +74,8 @@ struct mtd_part_parser_data { |
|
enum mtd_parser_type { |
MTD_PARSER_TYPE_DEVICE = 0, |