diff options
author | Ezequiel Garcia <ezequiel.garcia@free-electrons.com> | 2014-05-21 18:06:12 -0400 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2014-07-08 21:38:16 -0400 |
commit | 8471bb73ba10ed6788b4f1e9b8a0f9dc6bdb05b5 (patch) | |
tree | 12fdaa370ab34c38c4057ddca0a2bcd52b5744a8 /drivers/mtd | |
parent | 990a3af0c20590954be01a95c2c3fcef9360a836 (diff) |
mtd: Introduce mtd_block_isreserved()
In addition to mtd_block_isbad(), which checks if a block is bad or
reserved, it's needed to check if a block is reserved only (but not
bad). This commit adds an MTD interface for it, in a similar fashion to
mtd_block_isbad().
While here, fix mtd_block_isbad() so the out-of-bounds checking is done
before the callback check.
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Tested-by: Pekon Gupta <pekon@ti.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/mtdcore.c | 14 | ||||
-rw-r--r-- | drivers/mtd/mtdpart.c | 9 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 18 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_bbt.c | 14 |
4 files changed, 53 insertions, 2 deletions
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 11857faa0d96..e4831b4159db 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
@@ -1043,12 +1043,22 @@ int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len) | |||
1043 | } | 1043 | } |
1044 | EXPORT_SYMBOL_GPL(mtd_is_locked); | 1044 | EXPORT_SYMBOL_GPL(mtd_is_locked); |
1045 | 1045 | ||
1046 | int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) | 1046 | int mtd_block_isreserved(struct mtd_info *mtd, loff_t ofs) |
1047 | { | 1047 | { |
1048 | if (!mtd->_block_isbad) | 1048 | if (ofs < 0 || ofs > mtd->size) |
1049 | return -EINVAL; | ||
1050 | if (!mtd->_block_isreserved) | ||
1049 | return 0; | 1051 | return 0; |
1052 | return mtd->_block_isreserved(mtd, ofs); | ||
1053 | } | ||
1054 | EXPORT_SYMBOL_GPL(mtd_block_isreserved); | ||
1055 | |||
1056 | int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) | ||
1057 | { | ||
1050 | if (ofs < 0 || ofs > mtd->size) | 1058 | if (ofs < 0 || ofs > mtd->size) |
1051 | return -EINVAL; | 1059 | return -EINVAL; |
1060 | if (!mtd->_block_isbad) | ||
1061 | return 0; | ||
1052 | return mtd->_block_isbad(mtd, ofs); | 1062 | return mtd->_block_isbad(mtd, ofs); |
1053 | } | 1063 | } |
1054 | EXPORT_SYMBOL_GPL(mtd_block_isbad); | 1064 | EXPORT_SYMBOL_GPL(mtd_block_isbad); |
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 1ca9aec141ff..921e8c647884 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c | |||
@@ -290,6 +290,13 @@ static void part_resume(struct mtd_info *mtd) | |||
290 | part->master->_resume(part->master); | 290 | part->master->_resume(part->master); |
291 | } | 291 | } |
292 | 292 | ||
293 | static int part_block_isreserved(struct mtd_info *mtd, loff_t ofs) | ||
294 | { | ||
295 | struct mtd_part *part = PART(mtd); | ||
296 | ofs += part->offset; | ||
297 | return part->master->_block_isreserved(part->master, ofs); | ||
298 | } | ||
299 | |||
293 | static int part_block_isbad(struct mtd_info *mtd, loff_t ofs) | 300 | static int part_block_isbad(struct mtd_info *mtd, loff_t ofs) |
294 | { | 301 | { |
295 | struct mtd_part *part = PART(mtd); | 302 | struct mtd_part *part = PART(mtd); |
@@ -422,6 +429,8 @@ static struct mtd_part *allocate_partition(struct mtd_info *master, | |||
422 | slave->mtd._unlock = part_unlock; | 429 | slave->mtd._unlock = part_unlock; |
423 | if (master->_is_locked) | 430 | if (master->_is_locked) |
424 | slave->mtd._is_locked = part_is_locked; | 431 | slave->mtd._is_locked = part_is_locked; |
432 | if (master->_block_isreserved) | ||
433 | slave->mtd._block_isreserved = part_block_isreserved; | ||
425 | if (master->_block_isbad) | 434 | if (master->_block_isbad) |
426 | slave->mtd._block_isbad = part_block_isbad; | 435 | slave->mtd._block_isbad = part_block_isbad; |
427 | if (master->_block_markbad) | 436 | if (master->_block_markbad) |
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 41167e9e991e..0c505dd1f522 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -488,6 +488,23 @@ static int nand_check_wp(struct mtd_info *mtd) | |||
488 | * nand_block_checkbad - [GENERIC] Check if a block is marked bad | 488 | * nand_block_checkbad - [GENERIC] Check if a block is marked bad |
489 | * @mtd: MTD device structure | 489 | * @mtd: MTD device structure |
490 | * @ofs: offset from device start | 490 | * @ofs: offset from device start |
491 | * | ||
492 | * Check if the block is mark as reserved. | ||
493 | */ | ||
494 | static int nand_block_isreserved(struct mtd_info *mtd, loff_t ofs) | ||
495 | { | ||
496 | struct nand_chip *chip = mtd->priv; | ||
497 | |||
498 | if (!chip->bbt) | ||
499 | return 0; | ||
500 | /* Return info from the table */ | ||
501 | return nand_isreserved_bbt(mtd, ofs); | ||
502 | } | ||
503 | |||
504 | /** | ||
505 | * nand_block_checkbad - [GENERIC] Check if a block is marked bad | ||
506 | * @mtd: MTD device structure | ||
507 | * @ofs: offset from device start | ||
491 | * @getchip: 0, if the chip is already selected | 508 | * @getchip: 0, if the chip is already selected |
492 | * @allowbbt: 1, if its allowed to access the bbt area | 509 | * @allowbbt: 1, if its allowed to access the bbt area |
493 | * | 510 | * |
@@ -4111,6 +4128,7 @@ int nand_scan_tail(struct mtd_info *mtd) | |||
4111 | mtd->_unlock = NULL; | 4128 | mtd->_unlock = NULL; |
4112 | mtd->_suspend = nand_suspend; | 4129 | mtd->_suspend = nand_suspend; |
4113 | mtd->_resume = nand_resume; | 4130 | mtd->_resume = nand_resume; |
4131 | mtd->_block_isreserved = nand_block_isreserved; | ||
4114 | mtd->_block_isbad = nand_block_isbad; | 4132 | mtd->_block_isbad = nand_block_isbad; |
4115 | mtd->_block_markbad = nand_block_markbad; | 4133 | mtd->_block_markbad = nand_block_markbad; |
4116 | mtd->writebufsize = mtd->writesize; | 4134 | mtd->writebufsize = mtd->writesize; |
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c index 7f0c3b4c2a4f..443fa82cde6a 100644 --- a/drivers/mtd/nand/nand_bbt.c +++ b/drivers/mtd/nand/nand_bbt.c | |||
@@ -1311,6 +1311,20 @@ int nand_default_bbt(struct mtd_info *mtd) | |||
1311 | } | 1311 | } |
1312 | 1312 | ||
1313 | /** | 1313 | /** |
1314 | * nand_isreserved_bbt - [NAND Interface] Check if a block is reserved | ||
1315 | * @mtd: MTD device structure | ||
1316 | * @offs: offset in the device | ||
1317 | */ | ||
1318 | int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs) | ||
1319 | { | ||
1320 | struct nand_chip *this = mtd->priv; | ||
1321 | int block; | ||
1322 | |||
1323 | block = (int)(offs >> this->bbt_erase_shift); | ||
1324 | return bbt_get_entry(this, block) == BBT_BLOCK_RESERVED; | ||
1325 | } | ||
1326 | |||
1327 | /** | ||
1314 | * nand_isbad_bbt - [NAND Interface] Check if a block is bad | 1328 | * nand_isbad_bbt - [NAND Interface] Check if a block is bad |
1315 | * @mtd: MTD device structure | 1329 | * @mtd: MTD device structure |
1316 | * @offs: offset in the device | 1330 | * @offs: offset in the device |