diff options
author | Boris Brezillon <boris.brezillon@free-electrons.com> | 2016-02-03 14:12:31 -0500 |
---|---|---|
committer | Boris Brezillon <boris.brezillon@free-electrons.com> | 2016-04-19 16:05:52 -0400 |
commit | d30aae6d5630c27fa461f9da9ba2f40ae59e3287 (patch) | |
tree | 914beeaf3d989f212a1425d515951bf7ed581275 | |
parent | aa02fcf555c8d42836584783288b33a2a0d40481 (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.c | 75 |
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, | |||
1808 | static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf, | 1789 | static 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; |