kernel: bump 4.9 to 4.9.206
[openwrt/openwrt.git] / target / linux / generic / pending-4.9 / 400-mtd-add-rootfs-split-support.patch
index 9ca70e7892fb7f7a172b5cb87ff19a1d92578078..4369ed3f4ffab7d7e2f40c31a666ef97e2ab2699 100644 (file)
@@ -9,8 +9,6 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  include/linux/mtd/partitions.h |  2 ++
  3 files changed, 54 insertions(+)
 
-diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
-index 5a2d71729b9a..f5ac04e288eb 100644
 --- a/drivers/mtd/Kconfig
 +++ b/drivers/mtd/Kconfig
 @@ -12,6 +12,23 @@ menuconfig MTD
@@ -37,24 +35,23 @@ index 5a2d71729b9a..f5ac04e288eb 100644
  config MTD_TESTS
        tristate "MTD tests support (DANGEROUS)"
        depends on m
-diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
-index dd86b430e46e..33d152d1876a 100644
 --- a/drivers/mtd/mtdpart.c
 +++ b/drivers/mtd/mtdpart.c
-@@ -29,10 +29,12 @@
+@@ -29,11 +29,13 @@
  #include <linux/kmod.h>
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/partitions.h>
 +#include <linux/magic.h>
  #include <linux/of.h>
  #include <linux/err.h>
+ #include <linux/of.h>
  
  #include "mtdcore.h"
 +#include "mtdsplit/mtdsplit.h"
  
  /* Our partition linked list */
  static LIST_HEAD(mtd_partitions);
-@@ -52,6 +54,8 @@ struct mtd_part {
+@@ -53,6 +55,8 @@ struct mtd_part {
        struct list_head list;
  };
  
@@ -63,15 +60,15 @@ index dd86b430e46e..33d152d1876a 100644
  /*
   * Given a pointer to the MTD object in the mtd_part structure, we can retrieve
   * the pointer to that structure.
-@@ -678,6 +682,7 @@ int mtd_add_partition(struct mtd_info *parent, const char *name,
-       mutex_unlock(&mtd_partitions_mutex);
+@@ -653,6 +657,7 @@ int mtd_add_partition(struct mtd_info *p
+       if (ret)
+               goto err_remove_part;
  
-       add_mtd_device(&new->mtd);
 +      mtd_partition_split(parent, new);
        mtd_add_partition_attrs(new);
  
-@@ -756,6 +761,35 @@ int mtd_del_partition(struct mtd_info *mtd, int partno)
+       return 0;
+@@ -739,6 +744,29 @@ int mtd_del_partition(struct mtd_info *m
  }
  EXPORT_SYMBOL_GPL(mtd_del_partition);
  
@@ -85,11 +82,6 @@ index dd86b430e46e..33d152d1876a 100644
 +{
 +}
 +
-+void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
-+                                int offset, int size)
-+{
-+}
-+
 +static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part)
 +{
 +      static int rootfs_found = 0;
@@ -97,36 +89,20 @@ index dd86b430e46e..33d152d1876a 100644
 +      if (rootfs_found)
 +              return;
 +
-+      if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
-+          IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
++      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))
 +              split_firmware(master, part);
-+
-+      arch_split_mtd_part(master, part->mtd.name, part->offset,
-+                          part->mtd.size);
 +}
++
  /*
   * This function, given a master MTD object and a partition table, creates
   * and registers slave MTD objects which are bound to the master according to
-@@ -787,6 +821,7 @@ int add_mtd_partitions(struct mtd_info *master,
-               mutex_unlock(&mtd_partitions_mutex);
+@@ -779,6 +807,7 @@ int add_mtd_partitions(struct mtd_info *
+                       goto err_del_partitions;
+               }
  
-               add_mtd_device(&slave->mtd);
 +              mtd_partition_split(master, slave);
                mtd_add_partition_attrs(slave);
-               if (parts[i].types)
-                       mtd_parse_part(slave, parts[i].types);
-diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
-index c4beb70dacbd..320a791290c5 100644
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -109,5 +109,7 @@ int mtd_add_partition(struct mtd_info *master, const char *name,
-                     long long offset, long long length);
- int mtd_del_partition(struct mtd_info *master, int partno);
- uint64_t mtd_get_device_size(const struct mtd_info *mtd);
-+extern void __weak arch_split_mtd_part(struct mtd_info *master,
-+                                     const char *name, int offset, int size);
- #endif
--- 
-2.11.0
-
+               /* Look for subpartitions */
+               parse_mtd_partitions(&slave->mtd, parts[i].types, NULL);