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