mtd: create an mtd_oobavail() helper and make use of it
authorBoris BREZILLON <boris.brezillon@free-electrons.com>
Mon, 7 Mar 2016 09:46:52 +0000 (10:46 +0100)
committerBrian Norris <computersforpeace@gmail.com>
Tue, 8 Mar 2016 00:23:09 +0000 (16:23 -0800)
Currently, all MTD drivers/sublayers exposing an OOB area are
doing the same kind of test to extract the available OOB size
based on the mtd_info and mtd_oob_ops structures.
Move this common logic into an inline function and make use of it.

Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Suggested-by: Priit Laes <plaes@plaes.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/mtdpart.c
drivers/mtd/nand/nand_base.c
drivers/mtd/onenand/onenand_base.c
include/linux/mtd/mtd.h

index 10bf304027dd90af54a7b82aff21ce15ed83fe6d..08de4b2cf0f5ec291ba4bfe9e43b8f8d083c0bbd 100644 (file)
@@ -126,10 +126,7 @@ static int part_read_oob(struct mtd_info *mtd, loff_t from,
        if (ops->oobbuf) {
                size_t len, pages;
 
-               if (ops->mode == MTD_OPS_AUTO_OOB)
-                       len = mtd->oobavail;
-               else
-                       len = mtd->oobsize;
+               len = mtd_oobavail(mtd, ops);
                pages = mtd_div_by_ws(mtd->size, mtd);
                pages -= mtd_div_by_ws(from, mtd);
                if (ops->ooboffs + ops->ooblen > pages * len)
index 53993df0c25a49f0566e0b7ad80781d99eda5d80..a36f15b314bac2fe5703513422b5e2184cedcce4 100644 (file)
@@ -1723,8 +1723,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
        int ret = 0;
        uint32_t readlen = ops->len;
        uint32_t oobreadlen = ops->ooblen;
-       uint32_t max_oobsize = ops->mode == MTD_OPS_AUTO_OOB ?
-               mtd->oobavail : mtd->oobsize;
+       uint32_t max_oobsize = mtd_oobavail(mtd, ops);
 
        uint8_t *bufpoi, *oob, *buf;
        int use_bufpoi;
@@ -2075,10 +2074,7 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
 
        stats = mtd->ecc_stats;
 
-       if (ops->mode == MTD_OPS_AUTO_OOB)
-               len = mtd->oobavail;
-       else
-               len = mtd->oobsize;
+       len = mtd_oobavail(mtd, ops);
 
        if (unlikely(ops->ooboffs >= len)) {
                pr_debug("%s: attempt to start read outside oob\n",
@@ -2575,8 +2571,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
        uint32_t writelen = ops->len;
 
        uint32_t oobwritelen = ops->ooblen;
-       uint32_t oobmaxlen = ops->mode == MTD_OPS_AUTO_OOB ?
-                               mtd->oobavail : mtd->oobsize;
+       uint32_t oobmaxlen = mtd_oobavail(mtd, ops);
 
        uint8_t *oob = ops->oobbuf;
        uint8_t *buf = ops->datbuf;
@@ -2766,10 +2761,7 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
        pr_debug("%s: to = 0x%08x, len = %i\n",
                         __func__, (unsigned int)to, (int)ops->ooblen);
 
-       if (ops->mode == MTD_OPS_AUTO_OOB)
-               len = mtd->oobavail;
-       else
-               len = mtd->oobsize;
+       len = mtd_oobavail(mtd, ops);
 
        /* Do not allow write past end of page */
        if ((ops->ooboffs + ops->ooblen) > len) {
index df47537d1feb4cf12145663a94ad1e3e1a4623ed..af28bb3ae7cfc56ccd68e0b0a9d6d05fc5e6296e 100644 (file)
@@ -1124,11 +1124,7 @@ static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
        pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
                        (int)len);
 
-       if (ops->mode == MTD_OPS_AUTO_OOB)
-               oobsize = mtd->oobavail;
-       else
-               oobsize = mtd->oobsize;
-
+       oobsize = mtd_oobavail(mtd, ops);
        oobcolumn = from & (mtd->oobsize - 1);
 
        /* Do not allow reads past end of device */
@@ -1229,11 +1225,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
        pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
                        (int)len);
 
-       if (ops->mode == MTD_OPS_AUTO_OOB)
-               oobsize = mtd->oobavail;
-       else
-               oobsize = mtd->oobsize;
-
+       oobsize = mtd_oobavail(mtd, ops);
        oobcolumn = from & (mtd->oobsize - 1);
 
        /* Do not allow reads past end of device */
@@ -1885,12 +1877,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
        /* Check zero length */
        if (!len)
                return 0;
-
-       if (ops->mode == MTD_OPS_AUTO_OOB)
-               oobsize = mtd->oobavail;
-       else
-               oobsize = mtd->oobsize;
-
+       oobsize = mtd_oobavail(mtd, ops);
        oobcolumn = to & (mtd->oobsize - 1);
 
        column = to & (mtd->writesize - 1);
index 9cf13c4bccc8c059e2c62ab434a6f065c9c71dcc..771272187316b3c1bc5e5f3cbd9b07072c7bd55c 100644 (file)
@@ -264,6 +264,11 @@ static inline struct device_node *mtd_get_of_node(struct mtd_info *mtd)
        return mtd->dev.of_node;
 }
 
+static inline int mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
+{
+       return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize;
+}
+
 int mtd_erase(struct mtd_info *mtd, struct erase_info *instr);
 int mtd_point(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
              void **virt, resource_size_t *phys);