--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -12,6 +12,28 @@ menuconfig MTD
+@@ -12,6 +12,23 @@ menuconfig MTD
if MTD
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
-+config MTD_UIMAGE_SPLIT
-+ bool "Enable split support for firmware partitions containing a uImage"
-+ depends on MTD_SPLIT_FIRMWARE
-+ default y
-+
+endmenu
+
config MTD_TESTS
int mtd_del_partition(struct mtd_info *master, int partno)
{
struct mtd_part *slave, *next;
-@@ -614,6 +628,74 @@ int mtd_del_partition(struct mtd_info *m
+@@ -614,6 +628,35 @@ int mtd_del_partition(struct mtd_info *m
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
-+static inline unsigned long
-+mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
-+{
-+ unsigned long mask = mtd->erasesize - 1;
-+
-+ len += offset & mask;
-+ len = (len + mask) & ~mask;
-+ len -= offset & mask;
-+ return len;
-+}
-+
-+#define UBOOT_MAGIC 0x27051956
-+
-+static void split_uimage(struct mtd_info *master, struct mtd_part *part)
-+{
-+ struct {
-+ __be32 magic;
-+ __be32 pad[2];
-+ __be32 size;
-+ } hdr;
-+ size_t len;
-+
-+ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
-+ return;
-+
-+ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
-+ return;
-+
-+ len = be32_to_cpu(hdr.size) + 0x40;
-+ len = mtd_pad_erasesize(master, part->offset, len);
-+ if (len + master->erasesize > part->mtd.size)
-+ return;
-+
-+ __mtd_add_partition(master, "rootfs", part->offset + len,
-+ part->mtd.size - len, false);
-+}
-+
+#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#else
+
+static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+{
-+ if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
-+ split_uimage(master, part);
+}
+
+void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
/*
* 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
-@@ -643,6 +725,7 @@ int add_mtd_partitions(struct mtd_info *
+@@ -643,6 +686,7 @@ int add_mtd_partitions(struct mtd_info *
mutex_unlock(&mtd_partitions_mutex);
add_mtd_device(&slave->mtd);
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -755,6 +755,30 @@ static struct mtd_part_parser *get_parti
+@@ -716,6 +716,30 @@ static struct mtd_part_parser *get_parti
#define put_partition_parser(p) do { module_put((p)->owner); } while (0)
void register_mtd_parser(struct mtd_part_parser *p)
{
spin_lock(&part_parser_lock);
-@@ -828,6 +852,38 @@ int parse_mtd_partitions(struct mtd_info
+@@ -789,6 +813,38 @@ int parse_mtd_partitions(struct mtd_info
return ret;
}
+ return nr_parts;
+}
+
- static inline unsigned long
- mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
- {
-@@ -673,6 +704,12 @@ static void split_uimage(struct mtd_info
+ #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)
{
-+ 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);
++ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
}
-@@ -689,6 +726,12 @@ static void mtd_partition_split(struct m
+
+ 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;
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,11 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+config MTD_SPLIT
+ def_bool n
}
if (slave->offset == MTDPART_OFS_RETAIN) {
slave->offset = cur_offset;
-@@ -944,6 +942,24 @@ int mtd_is_partition(const struct mtd_in
+@@ -659,6 +657,17 @@ run_parsers_by_type(struct mtd_part *sla
+ return nr_parts;
+ }
+
++static inline unsigned long
++mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
++{
++ unsigned long mask = mtd->erasesize - 1;
++
++ len += offset & mask;
++ len = (len + mask) & ~mask;
++ len -= offset & mask;
++ return len;
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -900,6 +909,24 @@ int mtd_is_partition(const struct mtd_in
}
EXPORT_SYMBOL_GPL(mtd_is_partition);
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,8 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,8 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+source "drivers/mtd/mtdsplit/Kconfig"
+
--- /dev/null
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
++config MTD_UIMAGE_SPLIT
++ bool "Enable split support for firmware partitions containing a uImage"
++ depends on MTD_SPLIT_FIRMWARE
++ default y
++
+ source "drivers/mtd/mtdsplit/Kconfig"
+
+ config MTD_SPLIT
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -668,6 +668,32 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+ return len;
+ }
+
++#define UBOOT_MAGIC 0x27051956
++
++static void split_uimage(struct mtd_info *master, struct mtd_part *part)
++{
++ struct {
++ __be32 magic;
++ __be32 pad[2];
++ __be32 size;
++ } hdr;
++ size_t len;
++
++ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
++ return;
++
++ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
++ return;
++
++ len = be32_to_cpu(hdr.size) + 0x40;
++ len = mtd_pad_erasesize(master, part->offset, len);
++ if (len + master->erasesize > part->mtd.size)
++ return;
++
++ __mtd_add_partition(master, "rootfs", part->offset + len,
++ part->mtd.size - len, false);
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -676,7 +702,14 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+
+ static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+ {
+- run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
++ 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);
+ }
+
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -12,6 +12,28 @@ menuconfig MTD
+@@ -12,6 +12,23 @@ menuconfig MTD
if MTD
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
-+config MTD_UIMAGE_SPLIT
-+ bool "Enable split support for firmware partitions containing a uImage"
-+ depends on MTD_SPLIT_FIRMWARE
-+ default y
-+
+endmenu
+
config MTD_TESTS
int mtd_del_partition(struct mtd_info *master, int partno)
{
struct mtd_part *slave, *next;
-@@ -627,6 +641,74 @@ int mtd_del_partition(struct mtd_info *m
+@@ -627,6 +641,35 @@ int mtd_del_partition(struct mtd_info *m
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
-+static inline unsigned long
-+mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
-+{
-+ unsigned long mask = mtd->erasesize - 1;
-+
-+ len += offset & mask;
-+ len = (len + mask) & ~mask;
-+ len -= offset & mask;
-+ return len;
-+}
-+
-+#define UBOOT_MAGIC 0x27051956
-+
-+static void split_uimage(struct mtd_info *master, struct mtd_part *part)
-+{
-+ struct {
-+ __be32 magic;
-+ __be32 pad[2];
-+ __be32 size;
-+ } hdr;
-+ size_t len;
-+
-+ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
-+ return;
-+
-+ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
-+ return;
-+
-+ len = be32_to_cpu(hdr.size) + 0x40;
-+ len = mtd_pad_erasesize(master, part->offset, len);
-+ if (len + master->erasesize > part->mtd.size)
-+ return;
-+
-+ __mtd_add_partition(master, "rootfs", part->offset + len,
-+ part->mtd.size - len, false);
-+}
-+
+#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#else
+
+static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+{
-+ if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
-+ split_uimage(master, part);
+}
+
+void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
/*
* 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
-@@ -656,6 +738,7 @@ int add_mtd_partitions(struct mtd_info *
+@@ -656,6 +699,7 @@ int add_mtd_partitions(struct mtd_info *
mutex_unlock(&mtd_partitions_mutex);
add_mtd_device(&slave->mtd);
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -768,6 +768,30 @@ static struct mtd_part_parser *get_parti
+@@ -729,6 +729,30 @@ static struct mtd_part_parser *get_parti
#define put_partition_parser(p) do { module_put((p)->owner); } while (0)
void register_mtd_parser(struct mtd_part_parser *p)
{
spin_lock(&part_parser_lock);
-@@ -841,6 +865,38 @@ int parse_mtd_partitions(struct mtd_info
+@@ -802,6 +826,38 @@ int parse_mtd_partitions(struct mtd_info
return ret;
}
+ return nr_parts;
+}
+
- static inline unsigned long
- mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
- {
-@@ -686,6 +717,12 @@ static void split_uimage(struct mtd_info
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -649,6 +680,7 @@ EXPORT_SYMBOL_GPL(mtd_del_partition);
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);
++ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
}
-@@ -702,6 +739,12 @@ static void mtd_partition_split(struct m
+
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
+@@ -663,6 +695,12 @@ static void mtd_partition_split(struct m
if (rootfs_found)
return;
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,11 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+config MTD_SPLIT
+ def_bool n
}
if (slave->offset == MTDPART_OFS_RETAIN) {
slave->offset = cur_offset;
-@@ -957,6 +955,24 @@ int mtd_is_partition(const struct mtd_in
+@@ -672,6 +670,17 @@ run_parsers_by_type(struct mtd_part *sla
+ return nr_parts;
+ }
+
++static inline unsigned long
++mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
++{
++ unsigned long mask = mtd->erasesize - 1;
++
++ len += offset & mask;
++ len = (len + mask) & ~mask;
++ len -= offset & mask;
++ return len;
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -913,6 +922,24 @@ int mtd_is_partition(const struct mtd_in
}
EXPORT_SYMBOL_GPL(mtd_is_partition);
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,8 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,8 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+source "drivers/mtd/mtdsplit/Kconfig"
+
--- /dev/null
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
++config MTD_UIMAGE_SPLIT
++ bool "Enable split support for firmware partitions containing a uImage"
++ depends on MTD_SPLIT_FIRMWARE
++ default y
++
+ source "drivers/mtd/mtdsplit/Kconfig"
+
+ config MTD_SPLIT
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -681,6 +681,32 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+ return len;
+ }
+
++#define UBOOT_MAGIC 0x27051956
++
++static void split_uimage(struct mtd_info *master, struct mtd_part *part)
++{
++ struct {
++ __be32 magic;
++ __be32 pad[2];
++ __be32 size;
++ } hdr;
++ size_t len;
++
++ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
++ return;
++
++ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
++ return;
++
++ len = be32_to_cpu(hdr.size) + 0x40;
++ len = mtd_pad_erasesize(master, part->offset, len);
++ if (len + master->erasesize > part->mtd.size)
++ return;
++
++ __mtd_add_partition(master, "rootfs", part->offset + len,
++ part->mtd.size - len, false);
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -689,7 +715,14 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+
+ static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+ {
+- run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
++ 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);
+ }
+
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,