diff options
-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 | ||||
-rw-r--r-- | include/linux/mtd/mtd.h | 2 | ||||
-rw-r--r-- | include/linux/mtd/nand.h | 1 |
6 files changed, 56 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 |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index a1b0b4c8fd79..031ff3a9a0bd 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -222,6 +222,7 @@ struct mtd_info { | |||
222 | int (*_lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); | 222 | int (*_lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
223 | int (*_unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); | 223 | int (*_unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
224 | int (*_is_locked) (struct mtd_info *mtd, loff_t ofs, uint64_t len); | 224 | int (*_is_locked) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
225 | int (*_block_isreserved) (struct mtd_info *mtd, loff_t ofs); | ||
225 | int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs); | 226 | int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs); |
226 | int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs); | 227 | int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs); |
227 | int (*_suspend) (struct mtd_info *mtd); | 228 | int (*_suspend) (struct mtd_info *mtd); |
@@ -302,6 +303,7 @@ static inline void mtd_sync(struct mtd_info *mtd) | |||
302 | int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len); | 303 | int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len); |
303 | int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); | 304 | int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); |
304 | int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len); | 305 | int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len); |
306 | int mtd_block_isreserved(struct mtd_info *mtd, loff_t ofs); | ||
305 | int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs); | 307 | int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs); |
306 | int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs); | 308 | int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs); |
307 | 309 | ||
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 2f0af2891f0f..1cff329ae13d 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
@@ -810,6 +810,7 @@ extern struct nand_manufacturers nand_manuf_ids[]; | |||
810 | extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); | 810 | extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); |
811 | extern int nand_default_bbt(struct mtd_info *mtd); | 811 | extern int nand_default_bbt(struct mtd_info *mtd); |
812 | extern int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs); | 812 | extern int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs); |
813 | extern int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs); | ||
813 | extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); | 814 | extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); |
814 | extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, | 815 | extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, |
815 | int allowbbt); | 816 | int allowbbt); |