kernel: Add missing includes mtdsplit_*.c
[openwrt/staging/blogic.git] / target / linux / generic / files / drivers / mtd / mtdsplit / mtdsplit_seama.c
index 228b8997ad7e09cd7c8a37638fbceb8750bdd816..5d49171b1f7476bf493f2d55e337d1cda13436d3 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/byteorder/generic.h>
+#include <linux/of.h>
 
 #include "mtdsplit.h"
 
@@ -26,16 +27,18 @@ struct seama_header {
        __be16  reserved;       /* reserved for  */
        __be16  metasize;       /* size of the META data */
        __be32  size;           /* size of the image */
+       u8      md5[16];        /* digest */
 };
 
 static int mtdsplit_parse_seama(struct mtd_info *master,
-                               struct mtd_partition **pparts,
+                               const struct mtd_partition **pparts,
                                struct mtd_part_parser_data *data)
 {
        struct seama_header hdr;
        size_t hdr_len, retlen, kernel_ent_size;
        size_t rootfs_offset;
        struct mtd_partition *parts;
+       enum mtdsplit_part_type type;
        int err;
 
        hdr_len = sizeof(hdr);
@@ -56,7 +59,7 @@ static int mtdsplit_parse_seama(struct mtd_info *master,
                return -EINVAL;
 
        /* Check for the rootfs right after Seama entity with a kernel. */
-       err = mtd_check_rootfs_magic(master, kernel_ent_size, NULL);
+       err = mtd_check_rootfs_magic(master, kernel_ent_size, &type);
        if (!err) {
                rootfs_offset = kernel_ent_size;
        } else {
@@ -67,7 +70,7 @@ static int mtdsplit_parse_seama(struct mtd_info *master,
                 * Start the search from an arbitrary offset.
                 */
                err = mtd_find_rootfs_from(master, SEAMA_MIN_ROOTFS_OFFS,
-                                          master->size, &rootfs_offset, NULL);
+                                          master->size, &rootfs_offset, &type);
                if (err)
                        return err;
        }
@@ -77,10 +80,13 @@ static int mtdsplit_parse_seama(struct mtd_info *master,
                return -ENOMEM;
 
        parts[0].name = KERNEL_PART_NAME;
-       parts[0].offset = 0;
-       parts[0].size = rootfs_offset;
+       parts[0].offset = sizeof hdr + be16_to_cpu(hdr.metasize);
+       parts[0].size = rootfs_offset - parts[0].offset;
 
-       parts[1].name = ROOTFS_PART_NAME;
+       if (type == MTDSPLIT_PART_TYPE_UBI)
+               parts[1].name = UBI_PART_NAME;
+       else
+               parts[1].name = ROOTFS_PART_NAME;
        parts[1].offset = rootfs_offset;
        parts[1].size = master->size - rootfs_offset;
 
@@ -88,9 +94,16 @@ static int mtdsplit_parse_seama(struct mtd_info *master,
        return SEAMA_NR_PARTS;
 }
 
+static const struct of_device_id mtdsplit_seama_of_match_table[] = {
+       { .compatible = "seama" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, mtdsplit_seama_of_match_table);
+
 static struct mtd_part_parser mtdsplit_seama_parser = {
        .owner = THIS_MODULE,
        .name = "seama-fw",
+       .of_match_table = mtdsplit_seama_of_match_table,
        .parse_fn = mtdsplit_parse_seama,
        .type = MTD_PARSER_TYPE_FIRMWARE,
 };