xref: /OK3568_Linux_fs/kernel/drivers/rkflash/sfc_nand_mtd.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */
4 
5 #ifndef _SFC_NAND_MTD_H
6 #define _SFC_NAND_MTD_H
7 
8 #define CONFIG_MTD_NAND_BBT_USING_FLASH
9 
10 #ifndef nand_bbt_block_status
11 /* BBT related functions */
12 enum nand_bbt_block_status {
13 	NAND_BBT_BLOCK_STATUS_UNKNOWN,
14 	NAND_BBT_BLOCK_GOOD,
15 	NAND_BBT_BLOCK_WORN,
16 	NAND_BBT_BLOCK_RESERVED,
17 	NAND_BBT_BLOCK_FACTORY_BAD,
18 	NAND_BBT_BLOCK_NUM_STATUS,
19 };
20 #endif
21 
22 /* nand_bbt option */
23 #define NANDDEV_BBT_USE_FLASH		BIT(0)
24 #define NANDDEV_BBT_SCANNED		BIT(1)
25 
26 /* The maximum number of blocks to scan for a bbt */
27 #define NANDDEV_BBT_SCAN_MAXBLOCKS	4
28 
29 struct snand_bbt {
30 	unsigned long *cache;
31 	unsigned int option;
32 	unsigned int version;
33 };
34 
35 struct snand_mtd_dev {
36 	struct SFNAND_DEV *snand;
37 	struct mutex	*lock; /* to lock this object */
38 	struct mtd_info mtd;
39 	u8 *dma_buf;
40 	struct snand_bbt bbt;
41 };
42 
snanddev_neraseblocks(const struct snand_mtd_dev * nand)43 static inline unsigned int snanddev_neraseblocks(const struct snand_mtd_dev *nand)
44 {
45 	unsigned int ret = nand->mtd.size >> nand->mtd.erasesize_shift;
46 
47 	return ret;
48 }
49 
snanddev_bbt_is_initialized(struct snand_mtd_dev * nand)50 static inline bool snanddev_bbt_is_initialized(struct snand_mtd_dev *nand)
51 {
52 	return !!nand->bbt.cache;
53 }
54 
snanddev_bbt_pos_to_entry(struct snand_mtd_dev * nand,const loff_t pos)55 static inline unsigned int snanddev_bbt_pos_to_entry(struct snand_mtd_dev *nand,
56 						     const loff_t pos)
57 {
58 	return (unsigned int)(pos >> nand->mtd.erasesize_shift);
59 }
60 
snanddev_to_mtd(struct snand_mtd_dev * nand)61 static inline struct mtd_info *snanddev_to_mtd(struct snand_mtd_dev *nand)
62 {
63 	return &nand->mtd;
64 }
65 
mtd_to_snanddev(struct mtd_info * mtd)66 static inline struct snand_mtd_dev *mtd_to_snanddev(struct mtd_info *mtd)
67 {
68 	return mtd->priv;
69 }
70 
71 int snanddev_bbt_init(struct snand_mtd_dev *nand);
72 void snanddev_bbt_cleanup(struct snand_mtd_dev *nand);
73 int snanddev_bbt_update(struct snand_mtd_dev *nand);
74 int snanddev_bbt_get_block_status(const struct snand_mtd_dev *nand,
75 				  unsigned int entry);
76 int snanddev_bbt_set_block_status(struct snand_mtd_dev *nand, unsigned int entry,
77 				  enum nand_bbt_block_status status);
78 
79 int sfc_nand_isbad_mtd(struct mtd_info *mtd, loff_t ofs);
80 int sfc_nand_erase_mtd(struct mtd_info *mtd, u32 addr);
81 
82 #endif
83