summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@free-electrons.com>2016-02-03 14:12:31 -0500
committerBoris Brezillon <boris.brezillon@free-electrons.com>2016-04-19 16:05:52 -0400
commitd30aae6d5630c27fa461f9da9ba2f40ae59e3287 (patch)
tree914beeaf3d989f212a1425d515951bf7ed581275
parentaa02fcf555c8d42836584783288b33a2a0d40481 (diff)
mtd: onenand: use mtd_ooblayout_xxx() helpers where appropriate
The mtd_ooblayout_xxx() helper functions have been added to avoid direct accesses to the ecclayout field, and thus ease for future reworks. Use these helpers in all places where the oobfree[] and eccpos[] arrays where directly accessed. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
-rw-r--r--drivers/mtd/onenand/onenand_base.c75
1 files changed, 15 insertions, 60 deletions
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
index af28bb3ae7cf..20fdf8cceae9 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -1024,34 +1024,15 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col
1024 int thislen) 1024 int thislen)
1025{ 1025{
1026 struct onenand_chip *this = mtd->priv; 1026 struct onenand_chip *this = mtd->priv;
1027 struct nand_oobfree *free; 1027 int ret;
1028 int readcol = column; 1028
1029 int readend = column + thislen; 1029 this->read_bufferram(mtd, ONENAND_SPARERAM, this->oob_buf, 0,
1030 int lastgap = 0; 1030 mtd->oobsize);
1031 unsigned int i; 1031 ret = mtd_ooblayout_get_databytes(mtd, buf, this->oob_buf,
1032 uint8_t *oob_buf = this->oob_buf; 1032 column, thislen);
1033 1033 if (ret)
1034 free = this->ecclayout->oobfree; 1034 return ret;
1035 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) { 1035
1036 if (readcol >= lastgap)
1037 readcol += free->offset - lastgap;
1038 if (readend >= lastgap)
1039 readend += free->offset - lastgap;
1040 lastgap = free->offset + free->length;
1041 }
1042 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1043 free = this->ecclayout->oobfree;
1044 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1045 int free_end = free->offset + free->length;
1046 if (free->offset < readend && free_end > readcol) {
1047 int st = max_t(int,free->offset,readcol);
1048 int ed = min_t(int,free_end,readend);
1049 int n = ed - st;
1050 memcpy(buf, oob_buf + st, n);
1051 buf += n;
1052 } else if (column == 0)
1053 break;
1054 }
1055 return 0; 1036 return 0;
1056} 1037}
1057 1038
@@ -1808,34 +1789,7 @@ static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
1808static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf, 1789static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
1809 const u_char *buf, int column, int thislen) 1790 const u_char *buf, int column, int thislen)
1810{ 1791{
1811 struct onenand_chip *this = mtd->priv; 1792 return mtd_ooblayout_set_databytes(mtd, buf, oob_buf, column, thislen);
1812 struct nand_oobfree *free;
1813 int writecol = column;
1814 int writeend = column + thislen;
1815 int lastgap = 0;
1816 unsigned int i;
1817
1818 free = this->ecclayout->oobfree;
1819 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1820 if (writecol >= lastgap)
1821 writecol += free->offset - lastgap;
1822 if (writeend >= lastgap)
1823 writeend += free->offset - lastgap;
1824 lastgap = free->offset + free->length;
1825 }
1826 free = this->ecclayout->oobfree;
1827 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1828 int free_end = free->offset + free->length;
1829 if (free->offset < writeend && free_end > writecol) {
1830 int st = max_t(int,free->offset,writecol);
1831 int ed = min_t(int,free_end,writeend);
1832 int n = ed - st;
1833 memcpy(oob_buf + st, buf, n);
1834 buf += n;
1835 } else if (column == 0)
1836 break;
1837 }
1838 return 0;
1839} 1793}
1840 1794
1841/** 1795/**
@@ -4037,10 +3991,11 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
4037 * The number of bytes available for a client to place data into 3991 * The number of bytes available for a client to place data into
4038 * the out of band area 3992 * the out of band area
4039 */ 3993 */
4040 mtd->oobavail = 0; 3994 ret = mtd_ooblayout_count_freebytes(mtd);
4041 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && 3995 if (ret < 0)
4042 this->ecclayout->oobfree[i].length; i++) 3996 ret = 0;
4043 mtd->oobavail += this->ecclayout->oobfree[i].length; 3997
3998 mtd->oobavail = ret;
4044 3999
4045 mtd->ecclayout = this->ecclayout; 4000 mtd->ecclayout = this->ecclayout;
4046 mtd->ecc_strength = 1; 4001 mtd->ecc_strength = 1;