mtd: bcm63xxpart: Move NOR flash layout to a separate function
authorSimon Arlott <simon@fire.lp0.eu>
Sun, 13 Dec 2015 22:52:15 +0000 (22:52 +0000)
committerBrian Norris <computersforpeace@gmail.com>
Fri, 12 Feb 2016 18:34:16 +0000 (10:34 -0800)
Move the NOR flash layout to a separate function to allow the NAND flash
layout to be supported.

Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/bcm63xxpart.c

index 41aa202..26c38a1 100644 (file)
@@ -124,13 +124,11 @@ static int bcm63xx_read_image_tag(struct mtd_info *master, const char *name,
        return 1;
 }
 
-static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
-                                       const struct mtd_partition **pparts,
-                                       struct mtd_part_parser_data *data)
+static int bcm63xx_parse_cfe_nor_partitions(struct mtd_info *master,
+       const struct mtd_partition **pparts, struct bcm963xx_nvram *nvram)
 {
        /* CFE, NVRAM and global Linux are always present */
        int nrparts = 3, curpart = 0;
-       struct bcm963xx_nvram *nvram = NULL;
        struct bcm_tag *buf = NULL;
        struct mtd_partition *parts;
        int ret;
@@ -141,17 +139,6 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
        int i;
        bool rootfs_first = false;
 
-       if (bcm63xx_detect_cfe(master))
-               return -EINVAL;
-
-       nvram = vzalloc(sizeof(*nvram));
-       if (!nvram)
-               return -ENOMEM;
-
-       ret = bcm63xx_read_nvram(master, nvram);
-       if (ret)
-               goto out;
-
        cfe_erasesize = max_t(uint32_t, master->erasesize,
                              BCM963XX_CFE_BLOCK_SIZE);
 
@@ -159,12 +146,9 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
        nvramlen = nvram->psi_size * SZ_1K;
        nvramlen = roundup(nvramlen, cfe_erasesize);
 
-       /* Allocate memory for buffer */
        buf = vmalloc(sizeof(struct bcm_tag));
-       if (!buf) {
-               ret = -ENOMEM;
-               goto out;
-       }
+       if (!buf)
+               return -ENOMEM;
 
        /* Get the tag */
        ret = bcm63xx_read_image_tag(master, "rootfs", cfelen, buf);
@@ -234,7 +218,6 @@ invalid_tag:
        if (kernellen > 0)
                nrparts++;
 
-       /* Ask kernel for more memory */
        parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
        if (!parts) {
                ret = -ENOMEM;
@@ -292,13 +275,40 @@ invalid_tag:
        ret = 0;
 
 out:
-       vfree(nvram);
        vfree(buf);
 
        if (ret)
                return ret;
 
        return nrparts;
+}
+
+static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
+                                       const struct mtd_partition **pparts,
+                                       struct mtd_part_parser_data *data)
+{
+       struct bcm963xx_nvram *nvram = NULL;
+       int ret;
+
+       if (bcm63xx_detect_cfe(master))
+               return -EINVAL;
+
+       nvram = vzalloc(sizeof(*nvram));
+       if (!nvram)
+               return -ENOMEM;
+
+       ret = bcm63xx_read_nvram(master, nvram);
+       if (ret)
+               goto out;
+
+       if (!mtd_type_is_nand(master))
+               ret = bcm63xx_parse_cfe_nor_partitions(master, pparts, nvram);
+       else
+               ret = -EINVAL;
+
+out:
+       vfree(nvram);
+       return ret;
 };
 
 static struct mtd_part_parser bcm63xx_cfe_parser = {