Lines Matching full:nand
10 #define pr_fmt(fmt) "nand-bbt: " fmt
12 #include <linux/mtd/nand.h>
34 * @nand: NAND device
43 static int nanddev_read_bbt(struct nand_device *nand, u32 block, bool update) in nanddev_read_bbt() argument
46 unsigned int nblocks = nanddev_neraseblocks(nand); in nanddev_read_bbt()
48 BITS_PER_LONG) * sizeof(*nand->bbt.cache); in nanddev_read_bbt()
49 struct mtd_info *mtd = nanddev_to_mtd(nand); in nanddev_read_bbt()
57 if (!nand->bbt.cache) in nanddev_read_bbt()
101 if (update && version > nand->bbt.version) { in nanddev_read_bbt()
102 memcpy(nand->bbt.cache, data_buf, nbytes); in nanddev_read_bbt()
103 nand->bbt.version = version; in nanddev_read_bbt()
113 static int nanddev_write_bbt(struct nand_device *nand, u32 block) in nanddev_write_bbt() argument
116 unsigned int nblocks = nanddev_neraseblocks(nand); in nanddev_write_bbt()
118 BITS_PER_LONG) * sizeof(*nand->bbt.cache); in nanddev_write_bbt()
119 struct mtd_info *mtd = nanddev_to_mtd(nand); in nanddev_write_bbt()
127 BBT_DBG("write_bbt to blk=%d ver=%d\n", block, nand->bbt.version); in nanddev_write_bbt()
128 if (!nand->bbt.cache) in nanddev_write_bbt()
151 memcpy(data_buf, nand->bbt.cache, nbytes); in nanddev_write_bbt()
153 bbt_info->version = nand->bbt.version; in nanddev_write_bbt()
156 nanddev_offs_to_pos(nand, block * mtd->erasesize, &pos); in nanddev_write_bbt()
157 ret = nand->ops->erase(nand, &pos); in nanddev_write_bbt()
177 static __maybe_unused int nanddev_bbt_format(struct nand_device *nand) in nanddev_bbt_format() argument
179 unsigned int nblocks = nanddev_neraseblocks(nand); in nanddev_bbt_format()
180 struct mtd_info *mtd = nanddev_to_mtd(nand); in nanddev_bbt_format()
187 nanddev_offs_to_pos(nand, block * mtd->erasesize, &pos); in nanddev_bbt_format()
188 if (nanddev_isbad(nand, &pos)) in nanddev_bbt_format()
189 nanddev_bbt_set_block_status(nand, block, in nanddev_bbt_format()
194 if (nanddev_bbt_get_block_status(nand, start_block + block) == in nanddev_bbt_format()
196 nanddev_bbt_set_block_status(nand, start_block + block, in nanddev_bbt_format()
203 static int nanddev_scan_bbt(struct nand_device *nand) in nanddev_scan_bbt() argument
205 unsigned int nblocks = nanddev_neraseblocks(nand); in nanddev_scan_bbt()
209 nand->bbt.version = 0; in nanddev_scan_bbt()
212 nanddev_read_bbt(nand, start_block + block, true); in nanddev_scan_bbt()
214 nand->bbt.option |= NANDDEV_BBT_SCANNED; in nanddev_scan_bbt()
216 if (nand->bbt.version == 0) { in nanddev_scan_bbt()
217 nanddev_bbt_format(nand); in nanddev_scan_bbt()
218 ret = nanddev_bbt_update(nand); in nanddev_scan_bbt()
220 nand->bbt.option = 0; in nanddev_scan_bbt()
232 * @nand: NAND device
238 int nanddev_bbt_init(struct nand_device *nand) in nanddev_bbt_init() argument
241 unsigned int nblocks = nanddev_neraseblocks(nand); in nanddev_bbt_init()
245 nand->bbt.cache = kcalloc(nwords, sizeof(*nand->bbt.cache), in nanddev_bbt_init()
247 if (!nand->bbt.cache) in nanddev_bbt_init()
256 * @nand: NAND device
260 void nanddev_bbt_cleanup(struct nand_device *nand) in nanddev_bbt_cleanup() argument
262 kfree(nand->bbt.cache); in nanddev_bbt_cleanup()
268 * @nand: nand device
275 int nanddev_bbt_update(struct nand_device *nand) in nanddev_bbt_update() argument
278 if (nand->bbt.cache && in nanddev_bbt_update()
279 nand->bbt.option & NANDDEV_BBT_USE_FLASH) { in nanddev_bbt_update()
280 unsigned int nblocks = nanddev_neraseblocks(nand); in nanddev_bbt_update()
288 ret = nanddev_bbt_get_block_status(nand, start_block + block); in nanddev_bbt_update()
293 ret = nanddev_read_bbt(nand, start_block + block, in nanddev_bbt_update()
313 nand->bbt.version++; in nanddev_bbt_update()
314 ret = nanddev_write_bbt(nand, block_des); in nanddev_bbt_update()
339 * @nand: nand device
345 int nanddev_bbt_get_block_status(const struct nand_device *nand, in nanddev_bbt_get_block_status() argument
349 unsigned long *pos = nand->bbt.cache + in nanddev_bbt_get_block_status()
355 if (nand->bbt.option & NANDDEV_BBT_USE_FLASH && in nanddev_bbt_get_block_status()
356 !(nand->bbt.option & NANDDEV_BBT_SCANNED)) in nanddev_bbt_get_block_status()
357 nanddev_scan_bbt((struct nand_device *)nand); in nanddev_bbt_get_block_status()
360 if (entry >= nanddev_neraseblocks(nand)) in nanddev_bbt_get_block_status()
374 * @nand: nand device
379 * the NAND you should call nanddev_bbt_update().
384 int nanddev_bbt_set_block_status(struct nand_device *nand, unsigned int entry, in nanddev_bbt_set_block_status() argument
388 unsigned long *pos = nand->bbt.cache + in nanddev_bbt_set_block_status()
393 if (entry >= nanddev_neraseblocks(nand)) in nanddev_bbt_set_block_status()