aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/mtdcore.c14
-rw-r--r--drivers/mtd/mtdpart.c9
-rw-r--r--drivers/mtd/nand/nand_base.c18
-rw-r--r--drivers/mtd/nand/nand_bbt.c14
-rw-r--r--include/linux/mtd/mtd.h2
-rw-r--r--include/linux/mtd/nand.h1
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}
1044EXPORT_SYMBOL_GPL(mtd_is_locked); 1044EXPORT_SYMBOL_GPL(mtd_is_locked);
1045 1045
1046int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) 1046int 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}
1054EXPORT_SYMBOL_GPL(mtd_block_isreserved);
1055
1056int 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}
1054EXPORT_SYMBOL_GPL(mtd_block_isbad); 1064EXPORT_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
293static 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
293static int part_block_isbad(struct mtd_info *mtd, loff_t ofs) 300static 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 */
494static 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 */
1318int 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)
302int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len); 303int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
303int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); 304int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
304int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len); 305int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len);
306int mtd_block_isreserved(struct mtd_info *mtd, loff_t ofs);
305int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs); 307int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs);
306int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs); 308int 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[];
810extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); 810extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd);
811extern int nand_default_bbt(struct mtd_info *mtd); 811extern int nand_default_bbt(struct mtd_info *mtd);
812extern int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs); 812extern int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs);
813extern int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs);
813extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); 814extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt);
814extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, 815extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
815 int allowbbt); 816 int allowbbt);