xref: /linux-6.15/include/linux/mtd/onenand.h (revision 87c2ce3b)
1 /*
2  *  linux/include/linux/mtd/onenand.h
3  *
4  *  Copyright (C) 2005 Samsung Electronics
5  *  Kyungmin Park <[email protected]>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 
12 #ifndef __LINUX_MTD_ONENAND_H
13 #define __LINUX_MTD_ONENAND_H
14 
15 #include <linux/spinlock.h>
16 #include <linux/mtd/onenand_regs.h>
17 #include <linux/mtd/bbm.h>
18 
19 #define MAX_BUFFERRAM		2
20 
21 /* Scan and identify a OneNAND device */
22 extern int onenand_scan(struct mtd_info *mtd, int max_chips);
23 /* Free resources held by the OneNAND device */
24 extern void onenand_release(struct mtd_info *mtd);
25 
26 /**
27  * onenand_state_t - chip states
28  * Enumeration for OneNAND flash chip state
29  */
30 typedef enum {
31 	FL_READY,
32 	FL_READING,
33 	FL_WRITING,
34 	FL_ERASING,
35 	FL_SYNCING,
36 	FL_UNLOCKING,
37 	FL_LOCKING,
38 	FL_PM_SUSPENDED,
39 } onenand_state_t;
40 
41 /**
42  * struct onenand_bufferram - OneNAND BufferRAM Data
43  * @param block		block address in BufferRAM
44  * @param page		page address in BufferRAM
45  * @param valid		valid flag
46  */
47 struct onenand_bufferram {
48 	int block;
49 	int page;
50 	int valid;
51 };
52 
53 /**
54  * struct onenand_chip - OneNAND Private Flash Chip Data
55  * @param base		[BOARDSPECIFIC] address to access OneNAND
56  * @param chipsize	[INTERN] the size of one chip for multichip arrays
57  * @param device_id	[INTERN] device ID
58  * @param verstion_id	[INTERN] version ID
59  * @param options	[BOARDSPECIFIC] various chip options. They can partly be set to inform onenand_scan about
60  * @param erase_shift	[INTERN] number of address bits in a block
61  * @param page_shift	[INTERN] number of address bits in a page
62  * @param ppb_shift	[INTERN] number of address bits in a pages per block
63  * @param page_mask	[INTERN] a page per block mask
64  * @param bufferam_index	[INTERN] BufferRAM index
65  * @param bufferam	[INTERN] BufferRAM info
66  * @param readw		[REPLACEABLE] hardware specific function for read short
67  * @param writew	[REPLACEABLE] hardware specific function for write short
68  * @param command	[REPLACEABLE] hardware specific function for writing commands to the chip
69  * @param wait		[REPLACEABLE] hardware specific function for wait on ready
70  * @param read_bufferram	[REPLACEABLE] hardware specific function for BufferRAM Area
71  * @param write_bufferram	[REPLACEABLE] hardware specific function for BufferRAM Area
72  * @param read_word	[REPLACEABLE] hardware specific function for read register of OneNAND
73  * @param write_word	[REPLACEABLE] hardware specific function for write register of OneNAND
74  * @param scan_bbt	[REPLACEALBE] hardware specific function for scaning Bad block Table
75  * @param chip_lock	[INTERN] spinlock used to protect access to this structure and the chip
76  * @param wq		[INTERN] wait queue to sleep on if a OneNAND operation is in progress
77  * @param state		[INTERN] the current state of the OneNAND device
78  * @param autooob	[REPLACEABLE] the default (auto)placement scheme
79  * @param bbm		[REPLACEABLE] pointer to Bad Block Management
80  * @param priv		[OPTIONAL] pointer to private chip date
81  */
82 struct onenand_chip {
83 	void __iomem		*base;
84 	unsigned int		chipsize;
85 	unsigned int		device_id;
86 	unsigned int		density_mask;
87 	unsigned int		options;
88 
89 	unsigned int		erase_shift;
90 	unsigned int		page_shift;
91 	unsigned int		ppb_shift;	/* Pages per block shift */
92 	unsigned int		page_mask;
93 
94 	unsigned int		bufferram_index;
95 	struct onenand_bufferram	bufferram[MAX_BUFFERRAM];
96 
97 	int (*command)(struct mtd_info *mtd, int cmd, loff_t address, size_t len);
98 	int (*wait)(struct mtd_info *mtd, int state);
99 	int (*read_bufferram)(struct mtd_info *mtd, int area,
100 			unsigned char *buffer, int offset, size_t count);
101 	int (*write_bufferram)(struct mtd_info *mtd, int area,
102 			const unsigned char *buffer, int offset, size_t count);
103 	unsigned short (*read_word)(void __iomem *addr);
104 	void (*write_word)(unsigned short value, void __iomem *addr);
105 	void (*mmcontrol)(struct mtd_info *mtd, int sync_read);
106 	int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
107 	int (*scan_bbt)(struct mtd_info *mtd);
108 
109 	spinlock_t		chip_lock;
110 	wait_queue_head_t	wq;
111 	onenand_state_t		state;
112 	unsigned char		*page_buf;
113 
114 	struct nand_oobinfo	*autooob;
115 
116 	void 			*bbm;
117 
118 	void			*priv;
119 };
120 
121 /*
122  * Helper macros
123  */
124 #define ONENAND_CURRENT_BUFFERRAM(this)		(this->bufferram_index)
125 #define ONENAND_NEXT_BUFFERRAM(this)		(this->bufferram_index ^ 1)
126 #define ONENAND_SET_NEXT_BUFFERRAM(this)	(this->bufferram_index ^= 1)
127 
128 #define ONENAND_GET_SYS_CFG1(this)					\
129 	(this->read_word(this->base + ONENAND_REG_SYS_CFG1))
130 #define ONENAND_SET_SYS_CFG1(v, this)					\
131 	(this->write_word(v, this->base + ONENAND_REG_SYS_CFG1))
132 
133 /*
134  * Options bits
135  */
136 #define ONENAND_CONT_LOCK		(0x0001)
137 #define ONENAND_PAGEBUF_ALLOC		(0x1000)
138 
139 /*
140  * OneNAND Flash Manufacturer ID Codes
141  */
142 #define ONENAND_MFR_SAMSUNG	0xec
143 
144 /**
145  * struct nand_manufacturers - NAND Flash Manufacturer ID Structure
146  * @param name:		Manufacturer name
147  * @param id:		manufacturer ID code of device.
148 */
149 struct onenand_manufacturers {
150         int id;
151         char *name;
152 };
153 
154 #endif	/* __LINUX_MTD_ONENAND_H */
155