.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org> |
---|
3 | 4 | * Steven J. Hill <sjhill@realitydiluted.com> |
---|
4 | 5 | * Thomas Gleixner <tglx@linutronix.de> |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or modify |
---|
7 | | - * it under the terms of the GNU General Public License version 2 as |
---|
8 | | - * published by the Free Software Foundation. |
---|
9 | 6 | * |
---|
10 | 7 | * Info: |
---|
11 | 8 | * Contains standard defines and IDs for NAND flash devices |
---|
.. | .. |
---|
16 | 13 | #ifndef __LINUX_MTD_RAWNAND_H |
---|
17 | 14 | #define __LINUX_MTD_RAWNAND_H |
---|
18 | 15 | |
---|
19 | | -#include <linux/wait.h> |
---|
20 | | -#include <linux/spinlock.h> |
---|
21 | 16 | #include <linux/mtd/mtd.h> |
---|
| 17 | +#include <linux/mtd/nand.h> |
---|
22 | 18 | #include <linux/mtd/flashchip.h> |
---|
23 | 19 | #include <linux/mtd/bbm.h> |
---|
| 20 | +#include <linux/mtd/jedec.h> |
---|
| 21 | +#include <linux/mtd/nand.h> |
---|
| 22 | +#include <linux/mtd/onfi.h> |
---|
| 23 | +#include <linux/mutex.h> |
---|
24 | 24 | #include <linux/of.h> |
---|
25 | 25 | #include <linux/types.h> |
---|
26 | 26 | |
---|
27 | 27 | struct nand_chip; |
---|
28 | | -struct nand_flash_dev; |
---|
29 | | - |
---|
30 | | -/* Scan and identify a NAND device */ |
---|
31 | | -int nand_scan_with_ids(struct nand_chip *chip, int max_chips, |
---|
32 | | - struct nand_flash_dev *ids); |
---|
33 | | - |
---|
34 | | -static inline int nand_scan(struct nand_chip *chip, int max_chips) |
---|
35 | | -{ |
---|
36 | | - return nand_scan_with_ids(chip, max_chips, NULL); |
---|
37 | | -} |
---|
38 | | - |
---|
39 | | -/* Internal helper for board drivers which need to override command function */ |
---|
40 | | -void nand_wait_ready(struct mtd_info *mtd); |
---|
41 | 28 | |
---|
42 | 29 | /* The maximum number of NAND chips in an array */ |
---|
43 | 30 | #define NAND_MAX_CHIPS 8 |
---|
.. | .. |
---|
95 | 82 | #define NAND_DATA_IFACE_CHECK_ONLY -1 |
---|
96 | 83 | |
---|
97 | 84 | /* |
---|
98 | | - * Constants for ECC_MODES |
---|
99 | | - */ |
---|
100 | | -typedef enum { |
---|
101 | | - NAND_ECC_NONE, |
---|
102 | | - NAND_ECC_SOFT, |
---|
103 | | - NAND_ECC_HW, |
---|
104 | | - NAND_ECC_HW_SYNDROME, |
---|
105 | | - NAND_ECC_HW_OOB_FIRST, |
---|
106 | | - NAND_ECC_ON_DIE, |
---|
107 | | -} nand_ecc_modes_t; |
---|
108 | | - |
---|
109 | | -enum nand_ecc_algo { |
---|
110 | | - NAND_ECC_UNKNOWN, |
---|
111 | | - NAND_ECC_HAMMING, |
---|
112 | | - NAND_ECC_BCH, |
---|
113 | | - NAND_ECC_RS, |
---|
114 | | -}; |
---|
115 | | - |
---|
116 | | -/* |
---|
117 | 85 | * Constants for Hardware ECC |
---|
118 | 86 | */ |
---|
119 | 87 | /* Reset Hardware ECC for read */ |
---|
.. | .. |
---|
130 | 98 | * pages and you want to rely on the default implementation. |
---|
131 | 99 | */ |
---|
132 | 100 | #define NAND_ECC_GENERIC_ERASED_CHECK BIT(0) |
---|
133 | | -#define NAND_ECC_MAXIMIZE BIT(1) |
---|
134 | | - |
---|
135 | | -/* Bit mask for flags passed to do_nand_read_ecc */ |
---|
136 | | -#define NAND_GET_DEVICE 0x80 |
---|
137 | | - |
---|
138 | 101 | |
---|
139 | 102 | /* |
---|
140 | 103 | * Option constants for bizarre disfunctionality and real |
---|
141 | 104 | * features. |
---|
142 | 105 | */ |
---|
| 106 | + |
---|
143 | 107 | /* Buswidth is 16 bit */ |
---|
144 | | -#define NAND_BUSWIDTH_16 0x00000002 |
---|
| 108 | +#define NAND_BUSWIDTH_16 BIT(1) |
---|
| 109 | + |
---|
| 110 | +/* |
---|
| 111 | + * When using software implementation of Hamming, we can specify which byte |
---|
| 112 | + * ordering should be used. |
---|
| 113 | + */ |
---|
| 114 | +#define NAND_ECC_SOFT_HAMMING_SM_ORDER BIT(2) |
---|
| 115 | + |
---|
145 | 116 | /* Chip has cache program function */ |
---|
146 | | -#define NAND_CACHEPRG 0x00000008 |
---|
| 117 | +#define NAND_CACHEPRG BIT(3) |
---|
| 118 | +/* Options valid for Samsung large page devices */ |
---|
| 119 | +#define NAND_SAMSUNG_LP_OPTIONS NAND_CACHEPRG |
---|
| 120 | + |
---|
147 | 121 | /* |
---|
148 | 122 | * Chip requires ready check on read (for auto-incremented sequential read). |
---|
149 | 123 | * True only for small page devices; large page devices do not support |
---|
150 | 124 | * autoincrement. |
---|
151 | 125 | */ |
---|
152 | | -#define NAND_NEED_READRDY 0x00000100 |
---|
| 126 | +#define NAND_NEED_READRDY BIT(8) |
---|
153 | 127 | |
---|
154 | 128 | /* Chip does not allow subpage writes */ |
---|
155 | | -#define NAND_NO_SUBPAGE_WRITE 0x00000200 |
---|
| 129 | +#define NAND_NO_SUBPAGE_WRITE BIT(9) |
---|
156 | 130 | |
---|
157 | 131 | /* Device is one of 'new' xD cards that expose fake nand command set */ |
---|
158 | | -#define NAND_BROKEN_XD 0x00000400 |
---|
| 132 | +#define NAND_BROKEN_XD BIT(10) |
---|
159 | 133 | |
---|
160 | 134 | /* Device behaves just like nand, but is readonly */ |
---|
161 | | -#define NAND_ROM 0x00000800 |
---|
| 135 | +#define NAND_ROM BIT(11) |
---|
162 | 136 | |
---|
163 | 137 | /* Device supports subpage reads */ |
---|
164 | | -#define NAND_SUBPAGE_READ 0x00001000 |
---|
| 138 | +#define NAND_SUBPAGE_READ BIT(12) |
---|
| 139 | +/* Macros to identify the above */ |
---|
| 140 | +#define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ)) |
---|
165 | 141 | |
---|
166 | 142 | /* |
---|
167 | 143 | * Some MLC NANDs need data scrambling to limit bitflips caused by repeated |
---|
168 | 144 | * patterns. |
---|
169 | 145 | */ |
---|
170 | | -#define NAND_NEED_SCRAMBLING 0x00002000 |
---|
| 146 | +#define NAND_NEED_SCRAMBLING BIT(13) |
---|
171 | 147 | |
---|
172 | 148 | /* Device needs 3rd row address cycle */ |
---|
173 | | -#define NAND_ROW_ADDR_3 0x00004000 |
---|
174 | | - |
---|
175 | | -/* Options valid for Samsung large page devices */ |
---|
176 | | -#define NAND_SAMSUNG_LP_OPTIONS NAND_CACHEPRG |
---|
177 | | - |
---|
178 | | -/* Macros to identify the above */ |
---|
179 | | -#define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG)) |
---|
180 | | -#define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ)) |
---|
181 | | -#define NAND_HAS_SUBPAGE_WRITE(chip) !((chip)->options & NAND_NO_SUBPAGE_WRITE) |
---|
| 149 | +#define NAND_ROW_ADDR_3 BIT(14) |
---|
182 | 150 | |
---|
183 | 151 | /* Non chip related options */ |
---|
184 | 152 | /* This option skips the bbt scan during initialization. */ |
---|
185 | | -#define NAND_SKIP_BBTSCAN 0x00010000 |
---|
| 153 | +#define NAND_SKIP_BBTSCAN BIT(16) |
---|
186 | 154 | /* Chip may not exist, so silence any errors in scan */ |
---|
187 | | -#define NAND_SCAN_SILENT_NODEV 0x00040000 |
---|
| 155 | +#define NAND_SCAN_SILENT_NODEV BIT(18) |
---|
| 156 | + |
---|
188 | 157 | /* |
---|
189 | 158 | * Autodetect nand buswidth with readid/onfi. |
---|
190 | 159 | * This suppose the driver will configure the hardware in 8 bits mode |
---|
191 | 160 | * when calling nand_scan_ident, and update its configuration |
---|
192 | 161 | * before calling nand_scan_tail. |
---|
193 | 162 | */ |
---|
194 | | -#define NAND_BUSWIDTH_AUTO 0x00080000 |
---|
| 163 | +#define NAND_BUSWIDTH_AUTO BIT(19) |
---|
| 164 | + |
---|
195 | 165 | /* |
---|
196 | 166 | * This option could be defined by controller drivers to protect against |
---|
197 | 167 | * kmap'ed, vmalloc'ed highmem buffers being passed from upper layers |
---|
198 | 168 | */ |
---|
199 | | -#define NAND_USE_BOUNCE_BUFFER 0x00100000 |
---|
| 169 | +#define NAND_USES_DMA BIT(20) |
---|
200 | 170 | |
---|
201 | 171 | /* |
---|
202 | | - * In case your controller is implementing ->cmd_ctrl() and is relying on the |
---|
203 | | - * default ->cmdfunc() implementation, you may want to let the core handle the |
---|
204 | | - * tCCS delay which is required when a column change (RNDIN or RNDOUT) is |
---|
205 | | - * requested. |
---|
| 172 | + * In case your controller is implementing ->legacy.cmd_ctrl() and is relying |
---|
| 173 | + * on the default ->cmdfunc() implementation, you may want to let the core |
---|
| 174 | + * handle the tCCS delay which is required when a column change (RNDIN or |
---|
| 175 | + * RNDOUT) is requested. |
---|
206 | 176 | * If your controller already takes care of this delay, you don't need to set |
---|
207 | 177 | * this flag. |
---|
208 | 178 | */ |
---|
209 | | -#define NAND_WAIT_TCCS 0x00200000 |
---|
| 179 | +#define NAND_WAIT_TCCS BIT(21) |
---|
210 | 180 | |
---|
211 | 181 | /* |
---|
212 | 182 | * Whether the NAND chip is a boot medium. Drivers might use this information |
---|
213 | 183 | * to select ECC algorithms supported by the boot ROM or similar restrictions. |
---|
214 | 184 | */ |
---|
215 | | -#define NAND_IS_BOOT_MEDIUM 0x00400000 |
---|
| 185 | +#define NAND_IS_BOOT_MEDIUM BIT(22) |
---|
216 | 186 | |
---|
217 | | -/* Options set by nand scan */ |
---|
218 | | -/* Nand scan has allocated controller struct */ |
---|
219 | | -#define NAND_CONTROLLER_ALLOC 0x80000000 |
---|
| 187 | +/* |
---|
| 188 | + * Do not try to tweak the timings at runtime. This is needed when the |
---|
| 189 | + * controller initializes the timings on itself or when it relies on |
---|
| 190 | + * configuration done by the bootloader. |
---|
| 191 | + */ |
---|
| 192 | +#define NAND_KEEP_TIMINGS BIT(23) |
---|
| 193 | + |
---|
| 194 | +/* |
---|
| 195 | + * There are different places where the manufacturer stores the factory bad |
---|
| 196 | + * block markers. |
---|
| 197 | + * |
---|
| 198 | + * Position within the block: Each of these pages needs to be checked for a |
---|
| 199 | + * bad block marking pattern. |
---|
| 200 | + */ |
---|
| 201 | +#define NAND_BBM_FIRSTPAGE BIT(24) |
---|
| 202 | +#define NAND_BBM_SECONDPAGE BIT(25) |
---|
| 203 | +#define NAND_BBM_LASTPAGE BIT(26) |
---|
| 204 | + |
---|
| 205 | +/* |
---|
| 206 | + * Some controllers with pipelined ECC engines override the BBM marker with |
---|
| 207 | + * data or ECC bytes, thus making bad block detection through bad block marker |
---|
| 208 | + * impossible. Let's flag those chips so the core knows it shouldn't check the |
---|
| 209 | + * BBM and consider all blocks good. |
---|
| 210 | + */ |
---|
| 211 | +#define NAND_NO_BBM_QUIRK BIT(27) |
---|
220 | 212 | |
---|
221 | 213 | /* Cell info constants */ |
---|
222 | 214 | #define NAND_CI_CHIPNR_MSK 0x03 |
---|
223 | 215 | #define NAND_CI_CELLTYPE_MSK 0x0C |
---|
224 | 216 | #define NAND_CI_CELLTYPE_SHIFT 2 |
---|
225 | 217 | |
---|
226 | | -/* Keep gcc happy */ |
---|
227 | | -struct nand_chip; |
---|
228 | | - |
---|
229 | | -/* ONFI version bits */ |
---|
230 | | -#define ONFI_VERSION_1_0 BIT(1) |
---|
231 | | -#define ONFI_VERSION_2_0 BIT(2) |
---|
232 | | -#define ONFI_VERSION_2_1 BIT(3) |
---|
233 | | -#define ONFI_VERSION_2_2 BIT(4) |
---|
234 | | -#define ONFI_VERSION_2_3 BIT(5) |
---|
235 | | -#define ONFI_VERSION_3_0 BIT(6) |
---|
236 | | -#define ONFI_VERSION_3_1 BIT(7) |
---|
237 | | -#define ONFI_VERSION_3_2 BIT(8) |
---|
238 | | -#define ONFI_VERSION_4_0 BIT(9) |
---|
239 | | - |
---|
240 | | -/* ONFI features */ |
---|
241 | | -#define ONFI_FEATURE_16_BIT_BUS (1 << 0) |
---|
242 | | -#define ONFI_FEATURE_EXT_PARAM_PAGE (1 << 7) |
---|
243 | | - |
---|
244 | | -/* ONFI timing mode, used in both asynchronous and synchronous mode */ |
---|
245 | | -#define ONFI_TIMING_MODE_0 (1 << 0) |
---|
246 | | -#define ONFI_TIMING_MODE_1 (1 << 1) |
---|
247 | | -#define ONFI_TIMING_MODE_2 (1 << 2) |
---|
248 | | -#define ONFI_TIMING_MODE_3 (1 << 3) |
---|
249 | | -#define ONFI_TIMING_MODE_4 (1 << 4) |
---|
250 | | -#define ONFI_TIMING_MODE_5 (1 << 5) |
---|
251 | | -#define ONFI_TIMING_MODE_UNKNOWN (1 << 6) |
---|
252 | | - |
---|
253 | | -/* ONFI feature number/address */ |
---|
254 | | -#define ONFI_FEATURE_NUMBER 256 |
---|
255 | | -#define ONFI_FEATURE_ADDR_TIMING_MODE 0x1 |
---|
256 | | - |
---|
257 | | -/* Vendor-specific feature address (Micron) */ |
---|
258 | | -#define ONFI_FEATURE_ADDR_READ_RETRY 0x89 |
---|
259 | | -#define ONFI_FEATURE_ON_DIE_ECC 0x90 |
---|
260 | | -#define ONFI_FEATURE_ON_DIE_ECC_EN BIT(3) |
---|
261 | | - |
---|
262 | | -/* ONFI subfeature parameters length */ |
---|
263 | | -#define ONFI_SUBFEATURE_PARAM_LEN 4 |
---|
264 | | - |
---|
265 | | -/* ONFI optional commands SET/GET FEATURES supported? */ |
---|
266 | | -#define ONFI_OPT_CMD_SET_GET_FEATURES (1 << 2) |
---|
267 | | - |
---|
268 | | -struct nand_onfi_params { |
---|
269 | | - /* rev info and features block */ |
---|
270 | | - /* 'O' 'N' 'F' 'I' */ |
---|
271 | | - u8 sig[4]; |
---|
272 | | - __le16 revision; |
---|
273 | | - __le16 features; |
---|
274 | | - __le16 opt_cmd; |
---|
275 | | - u8 reserved0[2]; |
---|
276 | | - __le16 ext_param_page_length; /* since ONFI 2.1 */ |
---|
277 | | - u8 num_of_param_pages; /* since ONFI 2.1 */ |
---|
278 | | - u8 reserved1[17]; |
---|
279 | | - |
---|
280 | | - /* manufacturer information block */ |
---|
281 | | - char manufacturer[12]; |
---|
282 | | - char model[20]; |
---|
283 | | - u8 jedec_id; |
---|
284 | | - __le16 date_code; |
---|
285 | | - u8 reserved2[13]; |
---|
286 | | - |
---|
287 | | - /* memory organization block */ |
---|
288 | | - __le32 byte_per_page; |
---|
289 | | - __le16 spare_bytes_per_page; |
---|
290 | | - __le32 data_bytes_per_ppage; |
---|
291 | | - __le16 spare_bytes_per_ppage; |
---|
292 | | - __le32 pages_per_block; |
---|
293 | | - __le32 blocks_per_lun; |
---|
294 | | - u8 lun_count; |
---|
295 | | - u8 addr_cycles; |
---|
296 | | - u8 bits_per_cell; |
---|
297 | | - __le16 bb_per_lun; |
---|
298 | | - __le16 block_endurance; |
---|
299 | | - u8 guaranteed_good_blocks; |
---|
300 | | - __le16 guaranteed_block_endurance; |
---|
301 | | - u8 programs_per_page; |
---|
302 | | - u8 ppage_attr; |
---|
303 | | - u8 ecc_bits; |
---|
304 | | - u8 interleaved_bits; |
---|
305 | | - u8 interleaved_ops; |
---|
306 | | - u8 reserved3[13]; |
---|
307 | | - |
---|
308 | | - /* electrical parameter block */ |
---|
309 | | - u8 io_pin_capacitance_max; |
---|
310 | | - __le16 async_timing_mode; |
---|
311 | | - __le16 program_cache_timing_mode; |
---|
312 | | - __le16 t_prog; |
---|
313 | | - __le16 t_bers; |
---|
314 | | - __le16 t_r; |
---|
315 | | - __le16 t_ccs; |
---|
316 | | - __le16 src_sync_timing_mode; |
---|
317 | | - u8 src_ssync_features; |
---|
318 | | - __le16 clk_pin_capacitance_typ; |
---|
319 | | - __le16 io_pin_capacitance_typ; |
---|
320 | | - __le16 input_pin_capacitance_typ; |
---|
321 | | - u8 input_pin_capacitance_max; |
---|
322 | | - u8 driver_strength_support; |
---|
323 | | - __le16 t_int_r; |
---|
324 | | - __le16 t_adl; |
---|
325 | | - u8 reserved4[8]; |
---|
326 | | - |
---|
327 | | - /* vendor */ |
---|
328 | | - __le16 vendor_revision; |
---|
329 | | - u8 vendor[88]; |
---|
330 | | - |
---|
331 | | - __le16 crc; |
---|
332 | | -} __packed; |
---|
333 | | - |
---|
334 | | -#define ONFI_CRC_BASE 0x4F4E |
---|
335 | | - |
---|
336 | | -/* Extended ECC information Block Definition (since ONFI 2.1) */ |
---|
337 | | -struct onfi_ext_ecc_info { |
---|
338 | | - u8 ecc_bits; |
---|
339 | | - u8 codeword_size; |
---|
340 | | - __le16 bb_per_lun; |
---|
341 | | - __le16 block_endurance; |
---|
342 | | - u8 reserved[2]; |
---|
343 | | -} __packed; |
---|
344 | | - |
---|
345 | | -#define ONFI_SECTION_TYPE_0 0 /* Unused section. */ |
---|
346 | | -#define ONFI_SECTION_TYPE_1 1 /* for additional sections. */ |
---|
347 | | -#define ONFI_SECTION_TYPE_2 2 /* for ECC information. */ |
---|
348 | | -struct onfi_ext_section { |
---|
349 | | - u8 type; |
---|
350 | | - u8 length; |
---|
351 | | -} __packed; |
---|
352 | | - |
---|
353 | | -#define ONFI_EXT_SECTION_MAX 8 |
---|
354 | | - |
---|
355 | | -/* Extended Parameter Page Definition (since ONFI 2.1) */ |
---|
356 | | -struct onfi_ext_param_page { |
---|
357 | | - __le16 crc; |
---|
358 | | - u8 sig[4]; /* 'E' 'P' 'P' 'S' */ |
---|
359 | | - u8 reserved0[10]; |
---|
360 | | - struct onfi_ext_section sections[ONFI_EXT_SECTION_MAX]; |
---|
361 | | - |
---|
362 | | - /* |
---|
363 | | - * The actual size of the Extended Parameter Page is in |
---|
364 | | - * @ext_param_page_length of nand_onfi_params{}. |
---|
365 | | - * The following are the variable length sections. |
---|
366 | | - * So we do not add any fields below. Please see the ONFI spec. |
---|
367 | | - */ |
---|
368 | | -} __packed; |
---|
369 | | - |
---|
370 | | -struct jedec_ecc_info { |
---|
371 | | - u8 ecc_bits; |
---|
372 | | - u8 codeword_size; |
---|
373 | | - __le16 bb_per_lun; |
---|
374 | | - __le16 block_endurance; |
---|
375 | | - u8 reserved[2]; |
---|
376 | | -} __packed; |
---|
377 | | - |
---|
378 | | -/* JEDEC features */ |
---|
379 | | -#define JEDEC_FEATURE_16_BIT_BUS (1 << 0) |
---|
380 | | - |
---|
381 | | -struct nand_jedec_params { |
---|
382 | | - /* rev info and features block */ |
---|
383 | | - /* 'J' 'E' 'S' 'D' */ |
---|
384 | | - u8 sig[4]; |
---|
385 | | - __le16 revision; |
---|
386 | | - __le16 features; |
---|
387 | | - u8 opt_cmd[3]; |
---|
388 | | - __le16 sec_cmd; |
---|
389 | | - u8 num_of_param_pages; |
---|
390 | | - u8 reserved0[18]; |
---|
391 | | - |
---|
392 | | - /* manufacturer information block */ |
---|
393 | | - char manufacturer[12]; |
---|
394 | | - char model[20]; |
---|
395 | | - u8 jedec_id[6]; |
---|
396 | | - u8 reserved1[10]; |
---|
397 | | - |
---|
398 | | - /* memory organization block */ |
---|
399 | | - __le32 byte_per_page; |
---|
400 | | - __le16 spare_bytes_per_page; |
---|
401 | | - u8 reserved2[6]; |
---|
402 | | - __le32 pages_per_block; |
---|
403 | | - __le32 blocks_per_lun; |
---|
404 | | - u8 lun_count; |
---|
405 | | - u8 addr_cycles; |
---|
406 | | - u8 bits_per_cell; |
---|
407 | | - u8 programs_per_page; |
---|
408 | | - u8 multi_plane_addr; |
---|
409 | | - u8 multi_plane_op_attr; |
---|
410 | | - u8 reserved3[38]; |
---|
411 | | - |
---|
412 | | - /* electrical parameter block */ |
---|
413 | | - __le16 async_sdr_speed_grade; |
---|
414 | | - __le16 toggle_ddr_speed_grade; |
---|
415 | | - __le16 sync_ddr_speed_grade; |
---|
416 | | - u8 async_sdr_features; |
---|
417 | | - u8 toggle_ddr_features; |
---|
418 | | - u8 sync_ddr_features; |
---|
419 | | - __le16 t_prog; |
---|
420 | | - __le16 t_bers; |
---|
421 | | - __le16 t_r; |
---|
422 | | - __le16 t_r_multi_plane; |
---|
423 | | - __le16 t_ccs; |
---|
424 | | - __le16 io_pin_capacitance_typ; |
---|
425 | | - __le16 input_pin_capacitance_typ; |
---|
426 | | - __le16 clk_pin_capacitance_typ; |
---|
427 | | - u8 driver_strength_support; |
---|
428 | | - __le16 t_adl; |
---|
429 | | - u8 reserved4[36]; |
---|
430 | | - |
---|
431 | | - /* ECC and endurance block */ |
---|
432 | | - u8 guaranteed_good_blocks; |
---|
433 | | - __le16 guaranteed_block_endurance; |
---|
434 | | - struct jedec_ecc_info ecc_info[4]; |
---|
435 | | - u8 reserved5[29]; |
---|
436 | | - |
---|
437 | | - /* reserved */ |
---|
438 | | - u8 reserved6[148]; |
---|
439 | | - |
---|
440 | | - /* vendor */ |
---|
441 | | - __le16 vendor_rev_num; |
---|
442 | | - u8 reserved7[88]; |
---|
443 | | - |
---|
444 | | - /* CRC for Parameter Page */ |
---|
445 | | - __le16 crc; |
---|
446 | | -} __packed; |
---|
447 | | - |
---|
448 | | -/** |
---|
449 | | - * struct onfi_params - ONFI specific parameters that will be reused |
---|
450 | | - * @version: ONFI version (BCD encoded), 0 if ONFI is not supported |
---|
451 | | - * @tPROG: Page program time |
---|
452 | | - * @tBERS: Block erase time |
---|
453 | | - * @tR: Page read time |
---|
454 | | - * @tCCS: Change column setup time |
---|
455 | | - * @async_timing_mode: Supported asynchronous timing mode |
---|
456 | | - * @vendor_revision: Vendor specific revision number |
---|
457 | | - * @vendor: Vendor specific data |
---|
458 | | - */ |
---|
459 | | -struct onfi_params { |
---|
460 | | - int version; |
---|
461 | | - u16 tPROG; |
---|
462 | | - u16 tBERS; |
---|
463 | | - u16 tR; |
---|
464 | | - u16 tCCS; |
---|
465 | | - u16 async_timing_mode; |
---|
466 | | - u16 vendor_revision; |
---|
467 | | - u8 vendor[88]; |
---|
468 | | -}; |
---|
| 218 | +/* Position within the OOB data of the page */ |
---|
| 219 | +#define NAND_BBM_POS_SMALL 5 |
---|
| 220 | +#define NAND_BBM_POS_LARGE 0 |
---|
469 | 221 | |
---|
470 | 222 | /** |
---|
471 | 223 | * struct nand_parameters - NAND generic parameters from the parameter page |
---|
.. | .. |
---|
498 | 250 | u8 data[NAND_MAX_ID_LEN]; |
---|
499 | 251 | int len; |
---|
500 | 252 | }; |
---|
501 | | - |
---|
502 | | -/** |
---|
503 | | - * struct nand_controller_ops - Controller operations |
---|
504 | | - * |
---|
505 | | - * @attach_chip: this method is called after the NAND detection phase after |
---|
506 | | - * flash ID and MTD fields such as erase size, page size and OOB |
---|
507 | | - * size have been set up. ECC requirements are available if |
---|
508 | | - * provided by the NAND chip or device tree. Typically used to |
---|
509 | | - * choose the appropriate ECC configuration and allocate |
---|
510 | | - * associated resources. |
---|
511 | | - * This hook is optional. |
---|
512 | | - * @detach_chip: free all resources allocated/claimed in |
---|
513 | | - * nand_controller_ops->attach_chip(). |
---|
514 | | - * This hook is optional. |
---|
515 | | - */ |
---|
516 | | -struct nand_controller_ops { |
---|
517 | | - int (*attach_chip)(struct nand_chip *chip); |
---|
518 | | - void (*detach_chip)(struct nand_chip *chip); |
---|
519 | | -}; |
---|
520 | | - |
---|
521 | | -/** |
---|
522 | | - * struct nand_controller - Structure used to describe a NAND controller |
---|
523 | | - * |
---|
524 | | - * @lock: protection lock |
---|
525 | | - * @active: the mtd device which holds the controller currently |
---|
526 | | - * @wq: wait queue to sleep on if a NAND operation is in |
---|
527 | | - * progress used instead of the per chip wait queue |
---|
528 | | - * when a hw controller is available. |
---|
529 | | - * @ops: NAND controller operations. |
---|
530 | | - */ |
---|
531 | | -struct nand_controller { |
---|
532 | | - spinlock_t lock; |
---|
533 | | - struct nand_chip *active; |
---|
534 | | - wait_queue_head_t wq; |
---|
535 | | - const struct nand_controller_ops *ops; |
---|
536 | | -}; |
---|
537 | | - |
---|
538 | | -static inline void nand_controller_init(struct nand_controller *nfc) |
---|
539 | | -{ |
---|
540 | | - nfc->active = NULL; |
---|
541 | | - spin_lock_init(&nfc->lock); |
---|
542 | | - init_waitqueue_head(&nfc->wq); |
---|
543 | | -} |
---|
544 | 253 | |
---|
545 | 254 | /** |
---|
546 | 255 | * struct nand_ecc_step_info - ECC step information of ECC engine |
---|
.. | .. |
---|
582 | 291 | |
---|
583 | 292 | /** |
---|
584 | 293 | * struct nand_ecc_ctrl - Control structure for ECC |
---|
585 | | - * @mode: ECC mode |
---|
| 294 | + * @engine_type: ECC engine type |
---|
| 295 | + * @placement: OOB bytes placement |
---|
586 | 296 | * @algo: ECC algorithm |
---|
587 | 297 | * @steps: number of ECC steps per page |
---|
588 | 298 | * @size: data bytes per ECC step |
---|
.. | .. |
---|
610 | 320 | * controller and always return contiguous in-band and |
---|
611 | 321 | * out-of-band data even if they're not stored |
---|
612 | 322 | * contiguously on the NAND chip (e.g. |
---|
613 | | - * NAND_ECC_HW_SYNDROME interleaves in-band and |
---|
| 323 | + * NAND_ECC_PLACEMENT_INTERLEAVED interleaves in-band and |
---|
614 | 324 | * out-of-band data). |
---|
615 | 325 | * @write_page_raw: function to write a raw page without ECC. This function |
---|
616 | 326 | * should hide the specific layout used by the ECC |
---|
.. | .. |
---|
618 | 328 | * in-band and out-of-band data. ECC controller is |
---|
619 | 329 | * responsible for doing the appropriate transformations |
---|
620 | 330 | * to adapt to its specific layout (e.g. |
---|
621 | | - * NAND_ECC_HW_SYNDROME interleaves in-band and |
---|
| 331 | + * NAND_ECC_PLACEMENT_INTERLEAVED interleaves in-band and |
---|
622 | 332 | * out-of-band data). |
---|
623 | 333 | * @read_page: function to read a page according to the ECC generator |
---|
624 | 334 | * requirements; returns maximum number of bitflips corrected in |
---|
.. | .. |
---|
634 | 344 | * @write_oob: function to write chip OOB data |
---|
635 | 345 | */ |
---|
636 | 346 | struct nand_ecc_ctrl { |
---|
637 | | - nand_ecc_modes_t mode; |
---|
| 347 | + enum nand_ecc_engine_type engine_type; |
---|
| 348 | + enum nand_ecc_placement placement; |
---|
638 | 349 | enum nand_ecc_algo algo; |
---|
639 | 350 | int steps; |
---|
640 | 351 | int size; |
---|
.. | .. |
---|
647 | 358 | void *priv; |
---|
648 | 359 | u8 *calc_buf; |
---|
649 | 360 | u8 *code_buf; |
---|
650 | | - void (*hwctl)(struct mtd_info *mtd, int mode); |
---|
651 | | - int (*calculate)(struct mtd_info *mtd, const uint8_t *dat, |
---|
652 | | - uint8_t *ecc_code); |
---|
653 | | - int (*correct)(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc, |
---|
654 | | - uint8_t *calc_ecc); |
---|
655 | | - int (*read_page_raw)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
656 | | - uint8_t *buf, int oob_required, int page); |
---|
657 | | - int (*write_page_raw)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
658 | | - const uint8_t *buf, int oob_required, int page); |
---|
659 | | - int (*read_page)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
660 | | - uint8_t *buf, int oob_required, int page); |
---|
661 | | - int (*read_subpage)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
662 | | - uint32_t offs, uint32_t len, uint8_t *buf, int page); |
---|
663 | | - int (*write_subpage)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
664 | | - uint32_t offset, uint32_t data_len, |
---|
665 | | - const uint8_t *data_buf, int oob_required, int page); |
---|
666 | | - int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
667 | | - const uint8_t *buf, int oob_required, int page); |
---|
668 | | - int (*write_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
669 | | - int page); |
---|
670 | | - int (*read_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
671 | | - int page); |
---|
672 | | - int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page); |
---|
673 | | - int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
674 | | - int page); |
---|
| 361 | + void (*hwctl)(struct nand_chip *chip, int mode); |
---|
| 362 | + int (*calculate)(struct nand_chip *chip, const uint8_t *dat, |
---|
| 363 | + uint8_t *ecc_code); |
---|
| 364 | + int (*correct)(struct nand_chip *chip, uint8_t *dat, uint8_t *read_ecc, |
---|
| 365 | + uint8_t *calc_ecc); |
---|
| 366 | + int (*read_page_raw)(struct nand_chip *chip, uint8_t *buf, |
---|
| 367 | + int oob_required, int page); |
---|
| 368 | + int (*write_page_raw)(struct nand_chip *chip, const uint8_t *buf, |
---|
| 369 | + int oob_required, int page); |
---|
| 370 | + int (*read_page)(struct nand_chip *chip, uint8_t *buf, |
---|
| 371 | + int oob_required, int page); |
---|
| 372 | + int (*read_subpage)(struct nand_chip *chip, uint32_t offs, |
---|
| 373 | + uint32_t len, uint8_t *buf, int page); |
---|
| 374 | + int (*write_subpage)(struct nand_chip *chip, uint32_t offset, |
---|
| 375 | + uint32_t data_len, const uint8_t *data_buf, |
---|
| 376 | + int oob_required, int page); |
---|
| 377 | + int (*write_page)(struct nand_chip *chip, const uint8_t *buf, |
---|
| 378 | + int oob_required, int page); |
---|
| 379 | + int (*write_oob_raw)(struct nand_chip *chip, int page); |
---|
| 380 | + int (*read_oob_raw)(struct nand_chip *chip, int page); |
---|
| 381 | + int (*read_oob)(struct nand_chip *chip, int page); |
---|
| 382 | + int (*write_oob)(struct nand_chip *chip, int page); |
---|
675 | 383 | }; |
---|
676 | 384 | |
---|
677 | 385 | /** |
---|
.. | .. |
---|
767 | 475 | }; |
---|
768 | 476 | |
---|
769 | 477 | /** |
---|
770 | | - * enum nand_data_interface_type - NAND interface timing type |
---|
771 | | - * @NAND_SDR_IFACE: Single Data Rate interface |
---|
| 478 | + * struct nand_nvddr_timings - NV-DDR NAND chip timings |
---|
| 479 | + * |
---|
| 480 | + * This struct defines the timing requirements of a NV-DDR NAND data interface. |
---|
| 481 | + * These information can be found in every NAND datasheets and the timings |
---|
| 482 | + * meaning are described in the ONFI specifications: |
---|
| 483 | + * https://media-www.micron.com/-/media/client/onfi/specs/onfi_4_1_gold.pdf |
---|
| 484 | + * (chapter 4.18.2 NV-DDR) |
---|
| 485 | + * |
---|
| 486 | + * All these timings are expressed in picoseconds. |
---|
| 487 | + * |
---|
| 488 | + * @tBERS_max: Block erase time |
---|
| 489 | + * @tCCS_min: Change column setup time |
---|
| 490 | + * @tPROG_max: Page program time |
---|
| 491 | + * @tR_max: Page read time |
---|
| 492 | + * @tAC_min: Access window of DQ[7:0] from CLK |
---|
| 493 | + * @tAC_max: Access window of DQ[7:0] from CLK |
---|
| 494 | + * @tADL_min: ALE to data loading time |
---|
| 495 | + * @tCAD_min: Command, Address, Data delay |
---|
| 496 | + * @tCAH_min: Command/Address DQ hold time |
---|
| 497 | + * @tCALH_min: W/R_n, CLE and ALE hold time |
---|
| 498 | + * @tCALS_min: W/R_n, CLE and ALE setup time |
---|
| 499 | + * @tCAS_min: Command/address DQ setup time |
---|
| 500 | + * @tCEH_min: CE# high hold time |
---|
| 501 | + * @tCH_min: CE# hold time |
---|
| 502 | + * @tCK_min: Average clock cycle time |
---|
| 503 | + * @tCS_min: CE# setup time |
---|
| 504 | + * @tDH_min: Data hold time |
---|
| 505 | + * @tDQSCK_min: Start of the access window of DQS from CLK |
---|
| 506 | + * @tDQSCK_max: End of the access window of DQS from CLK |
---|
| 507 | + * @tDQSD_min: Min W/R_n low to DQS/DQ driven by device |
---|
| 508 | + * @tDQSD_max: Max W/R_n low to DQS/DQ driven by device |
---|
| 509 | + * @tDQSHZ_max: W/R_n high to DQS/DQ tri-state by device |
---|
| 510 | + * @tDQSQ_max: DQS-DQ skew, DQS to last DQ valid, per access |
---|
| 511 | + * @tDS_min: Data setup time |
---|
| 512 | + * @tDSC_min: DQS cycle time |
---|
| 513 | + * @tFEAT_max: Busy time for Set Features and Get Features |
---|
| 514 | + * @tITC_max: Interface and Timing Mode Change time |
---|
| 515 | + * @tQHS_max: Data hold skew factor |
---|
| 516 | + * @tRHW_min: Data output cycle to command, address, or data input cycle |
---|
| 517 | + * @tRR_min: Ready to RE# low (data only) |
---|
| 518 | + * @tRST_max: Device reset time, measured from the falling edge of R/B# to the |
---|
| 519 | + * rising edge of R/B#. |
---|
| 520 | + * @tWB_max: WE# high to SR[6] low |
---|
| 521 | + * @tWHR_min: WE# high to RE# low |
---|
| 522 | + * @tWRCK_min: W/R_n low to data output cycle |
---|
| 523 | + * @tWW_min: WP# transition to WE# low |
---|
772 | 524 | */ |
---|
773 | | -enum nand_data_interface_type { |
---|
774 | | - NAND_SDR_IFACE, |
---|
| 525 | +struct nand_nvddr_timings { |
---|
| 526 | + u64 tBERS_max; |
---|
| 527 | + u32 tCCS_min; |
---|
| 528 | + u64 tPROG_max; |
---|
| 529 | + u64 tR_max; |
---|
| 530 | + u32 tAC_min; |
---|
| 531 | + u32 tAC_max; |
---|
| 532 | + u32 tADL_min; |
---|
| 533 | + u32 tCAD_min; |
---|
| 534 | + u32 tCAH_min; |
---|
| 535 | + u32 tCALH_min; |
---|
| 536 | + u32 tCALS_min; |
---|
| 537 | + u32 tCAS_min; |
---|
| 538 | + u32 tCEH_min; |
---|
| 539 | + u32 tCH_min; |
---|
| 540 | + u32 tCK_min; |
---|
| 541 | + u32 tCS_min; |
---|
| 542 | + u32 tDH_min; |
---|
| 543 | + u32 tDQSCK_min; |
---|
| 544 | + u32 tDQSCK_max; |
---|
| 545 | + u32 tDQSD_min; |
---|
| 546 | + u32 tDQSD_max; |
---|
| 547 | + u32 tDQSHZ_max; |
---|
| 548 | + u32 tDQSQ_max; |
---|
| 549 | + u32 tDS_min; |
---|
| 550 | + u32 tDSC_min; |
---|
| 551 | + u32 tFEAT_max; |
---|
| 552 | + u32 tITC_max; |
---|
| 553 | + u32 tQHS_max; |
---|
| 554 | + u32 tRHW_min; |
---|
| 555 | + u32 tRR_min; |
---|
| 556 | + u32 tRST_max; |
---|
| 557 | + u32 tWB_max; |
---|
| 558 | + u32 tWHR_min; |
---|
| 559 | + u32 tWRCK_min; |
---|
| 560 | + u32 tWW_min; |
---|
775 | 561 | }; |
---|
776 | 562 | |
---|
777 | 563 | /** |
---|
778 | | - * struct nand_data_interface - NAND interface timing |
---|
779 | | - * @type: type of the timing |
---|
780 | | - * @timings: The timing, type according to @type |
---|
781 | | - * @timings.sdr: Use it when @type is %NAND_SDR_IFACE. |
---|
| 564 | + * enum nand_interface_type - NAND interface type |
---|
| 565 | + * @NAND_SDR_IFACE: Single Data Rate interface |
---|
| 566 | + * @NAND_NVDDR_IFACE: Double Data Rate interface |
---|
782 | 567 | */ |
---|
783 | | -struct nand_data_interface { |
---|
784 | | - enum nand_data_interface_type type; |
---|
785 | | - union { |
---|
786 | | - struct nand_sdr_timings sdr; |
---|
| 568 | +enum nand_interface_type { |
---|
| 569 | + NAND_SDR_IFACE, |
---|
| 570 | + NAND_NVDDR_IFACE, |
---|
| 571 | +}; |
---|
| 572 | + |
---|
| 573 | +/** |
---|
| 574 | + * struct nand_interface_config - NAND interface timing |
---|
| 575 | + * @type: type of the timing |
---|
| 576 | + * @timings: The timing information |
---|
| 577 | + * @timings.mode: Timing mode as defined in the specification |
---|
| 578 | + * @timings.sdr: Use it when @type is %NAND_SDR_IFACE. |
---|
| 579 | + * @timings.nvddr: Use it when @type is %NAND_NVDDR_IFACE. |
---|
| 580 | + */ |
---|
| 581 | +struct nand_interface_config { |
---|
| 582 | + enum nand_interface_type type; |
---|
| 583 | + struct nand_timings { |
---|
| 584 | + unsigned int mode; |
---|
| 585 | + union { |
---|
| 586 | + struct nand_sdr_timings sdr; |
---|
| 587 | + struct nand_nvddr_timings nvddr; |
---|
| 588 | + }; |
---|
787 | 589 | } timings; |
---|
788 | 590 | }; |
---|
| 591 | + |
---|
| 592 | +/** |
---|
| 593 | + * nand_interface_is_sdr - get the interface type |
---|
| 594 | + * @conf: The data interface |
---|
| 595 | + */ |
---|
| 596 | +static bool nand_interface_is_sdr(const struct nand_interface_config *conf) |
---|
| 597 | +{ |
---|
| 598 | + return conf->type == NAND_SDR_IFACE; |
---|
| 599 | +} |
---|
| 600 | + |
---|
| 601 | +/** |
---|
| 602 | + * nand_interface_is_nvddr - get the interface type |
---|
| 603 | + * @conf: The data interface |
---|
| 604 | + */ |
---|
| 605 | +static bool nand_interface_is_nvddr(const struct nand_interface_config *conf) |
---|
| 606 | +{ |
---|
| 607 | + return conf->type == NAND_NVDDR_IFACE; |
---|
| 608 | +} |
---|
789 | 609 | |
---|
790 | 610 | /** |
---|
791 | 611 | * nand_get_sdr_timings - get SDR timing from data interface |
---|
792 | 612 | * @conf: The data interface |
---|
793 | 613 | */ |
---|
794 | 614 | static inline const struct nand_sdr_timings * |
---|
795 | | -nand_get_sdr_timings(const struct nand_data_interface *conf) |
---|
| 615 | +nand_get_sdr_timings(const struct nand_interface_config *conf) |
---|
796 | 616 | { |
---|
797 | | - if (conf->type != NAND_SDR_IFACE) |
---|
| 617 | + if (!nand_interface_is_sdr(conf)) |
---|
798 | 618 | return ERR_PTR(-EINVAL); |
---|
799 | 619 | |
---|
800 | 620 | return &conf->timings.sdr; |
---|
801 | 621 | } |
---|
802 | 622 | |
---|
803 | 623 | /** |
---|
804 | | - * struct nand_manufacturer_ops - NAND Manufacturer operations |
---|
805 | | - * @detect: detect the NAND memory organization and capabilities |
---|
806 | | - * @init: initialize all vendor specific fields (like the ->read_retry() |
---|
807 | | - * implementation) if any. |
---|
808 | | - * @cleanup: the ->init() function may have allocated resources, ->cleanup() |
---|
809 | | - * is here to let vendor specific code release those resources. |
---|
810 | | - * @fixup_onfi_param_page: apply vendor specific fixups to the ONFI parameter |
---|
811 | | - * page. This is called after the checksum is verified. |
---|
| 624 | + * nand_get_nvddr_timings - get NV-DDR timing from data interface |
---|
| 625 | + * @conf: The data interface |
---|
812 | 626 | */ |
---|
813 | | -struct nand_manufacturer_ops { |
---|
814 | | - void (*detect)(struct nand_chip *chip); |
---|
815 | | - int (*init)(struct nand_chip *chip); |
---|
816 | | - void (*cleanup)(struct nand_chip *chip); |
---|
817 | | - void (*fixup_onfi_param_page)(struct nand_chip *chip, |
---|
818 | | - struct nand_onfi_params *p); |
---|
819 | | -}; |
---|
| 627 | +static inline const struct nand_nvddr_timings * |
---|
| 628 | +nand_get_nvddr_timings(const struct nand_interface_config *conf) |
---|
| 629 | +{ |
---|
| 630 | + if (!nand_interface_is_nvddr(conf)) |
---|
| 631 | + return ERR_PTR(-EINVAL); |
---|
| 632 | + |
---|
| 633 | + return &conf->timings.nvddr; |
---|
| 634 | +} |
---|
820 | 635 | |
---|
821 | 636 | /** |
---|
822 | 637 | * struct nand_op_cmd_instr - Definition of a command instruction |
---|
.. | .. |
---|
998 | 813 | |
---|
999 | 814 | /** |
---|
1000 | 815 | * struct nand_subop - a sub operation |
---|
| 816 | + * @cs: the CS line to select for this NAND sub-operation |
---|
1001 | 817 | * @instrs: array of instructions |
---|
1002 | 818 | * @ninstrs: length of the @instrs array |
---|
1003 | 819 | * @first_instr_start_off: offset to start from for the first instruction |
---|
.. | .. |
---|
1013 | 829 | * controller driver. |
---|
1014 | 830 | */ |
---|
1015 | 831 | struct nand_subop { |
---|
| 832 | + unsigned int cs; |
---|
1016 | 833 | const struct nand_op_instr *instrs; |
---|
1017 | 834 | unsigned int ninstrs; |
---|
1018 | 835 | unsigned int first_instr_start_off; |
---|
.. | .. |
---|
1122 | 939 | #define NAND_OP_PARSER_PATTERN(_exec, ...) \ |
---|
1123 | 940 | { \ |
---|
1124 | 941 | .exec = _exec, \ |
---|
1125 | | - .elems = (struct nand_op_parser_pattern_elem[]) { __VA_ARGS__ }, \ |
---|
| 942 | + .elems = (const struct nand_op_parser_pattern_elem[]) { __VA_ARGS__ }, \ |
---|
1126 | 943 | .nelems = sizeof((struct nand_op_parser_pattern_elem[]) { __VA_ARGS__ }) / \ |
---|
1127 | 944 | sizeof(struct nand_op_parser_pattern_elem), \ |
---|
1128 | 945 | } |
---|
.. | .. |
---|
1148 | 965 | |
---|
1149 | 966 | #define NAND_OP_PARSER(...) \ |
---|
1150 | 967 | { \ |
---|
1151 | | - .patterns = (struct nand_op_parser_pattern[]) { __VA_ARGS__ }, \ |
---|
| 968 | + .patterns = (const struct nand_op_parser_pattern[]) { __VA_ARGS__ }, \ |
---|
1152 | 969 | .npatterns = sizeof((struct nand_op_parser_pattern[]) { __VA_ARGS__ }) / \ |
---|
1153 | 970 | sizeof(struct nand_op_parser_pattern), \ |
---|
1154 | 971 | } |
---|
1155 | 972 | |
---|
1156 | 973 | /** |
---|
1157 | 974 | * struct nand_operation - NAND operation descriptor |
---|
| 975 | + * @cs: the CS line to select for this NAND operation |
---|
1158 | 976 | * @instrs: array of instructions to execute |
---|
1159 | 977 | * @ninstrs: length of the @instrs array |
---|
1160 | 978 | * |
---|
1161 | 979 | * The actual operation structure that will be passed to chip->exec_op(). |
---|
1162 | 980 | */ |
---|
1163 | 981 | struct nand_operation { |
---|
| 982 | + unsigned int cs; |
---|
1164 | 983 | const struct nand_op_instr *instrs; |
---|
1165 | 984 | unsigned int ninstrs; |
---|
1166 | 985 | }; |
---|
1167 | 986 | |
---|
1168 | | -#define NAND_OPERATION(_instrs) \ |
---|
| 987 | +#define NAND_OPERATION(_cs, _instrs) \ |
---|
1169 | 988 | { \ |
---|
| 989 | + .cs = _cs, \ |
---|
1170 | 990 | .instrs = _instrs, \ |
---|
1171 | 991 | .ninstrs = ARRAY_SIZE(_instrs), \ |
---|
1172 | 992 | } |
---|
.. | .. |
---|
1175 | 995 | const struct nand_op_parser *parser, |
---|
1176 | 996 | const struct nand_operation *op, bool check_only); |
---|
1177 | 997 | |
---|
| 998 | +static inline void nand_op_trace(const char *prefix, |
---|
| 999 | + const struct nand_op_instr *instr) |
---|
| 1000 | +{ |
---|
| 1001 | +#if IS_ENABLED(CONFIG_DYNAMIC_DEBUG) || defined(DEBUG) |
---|
| 1002 | + switch (instr->type) { |
---|
| 1003 | + case NAND_OP_CMD_INSTR: |
---|
| 1004 | + pr_debug("%sCMD [0x%02x]\n", prefix, |
---|
| 1005 | + instr->ctx.cmd.opcode); |
---|
| 1006 | + break; |
---|
| 1007 | + case NAND_OP_ADDR_INSTR: |
---|
| 1008 | + pr_debug("%sADDR [%d cyc: %*ph]\n", prefix, |
---|
| 1009 | + instr->ctx.addr.naddrs, |
---|
| 1010 | + instr->ctx.addr.naddrs < 64 ? |
---|
| 1011 | + instr->ctx.addr.naddrs : 64, |
---|
| 1012 | + instr->ctx.addr.addrs); |
---|
| 1013 | + break; |
---|
| 1014 | + case NAND_OP_DATA_IN_INSTR: |
---|
| 1015 | + pr_debug("%sDATA_IN [%d B%s]\n", prefix, |
---|
| 1016 | + instr->ctx.data.len, |
---|
| 1017 | + instr->ctx.data.force_8bit ? |
---|
| 1018 | + ", force 8-bit" : ""); |
---|
| 1019 | + break; |
---|
| 1020 | + case NAND_OP_DATA_OUT_INSTR: |
---|
| 1021 | + pr_debug("%sDATA_OUT [%d B%s]\n", prefix, |
---|
| 1022 | + instr->ctx.data.len, |
---|
| 1023 | + instr->ctx.data.force_8bit ? |
---|
| 1024 | + ", force 8-bit" : ""); |
---|
| 1025 | + break; |
---|
| 1026 | + case NAND_OP_WAITRDY_INSTR: |
---|
| 1027 | + pr_debug("%sWAITRDY [max %d ms]\n", prefix, |
---|
| 1028 | + instr->ctx.waitrdy.timeout_ms); |
---|
| 1029 | + break; |
---|
| 1030 | + } |
---|
| 1031 | +#endif |
---|
| 1032 | +} |
---|
| 1033 | + |
---|
1178 | 1034 | /** |
---|
1179 | | - * struct nand_chip - NAND Private Flash Chip Data |
---|
1180 | | - * @mtd: MTD device registered to the MTD framework |
---|
1181 | | - * @IO_ADDR_R: [BOARDSPECIFIC] address to read the 8 I/O lines of the |
---|
1182 | | - * flash device |
---|
1183 | | - * @IO_ADDR_W: [BOARDSPECIFIC] address to write the 8 I/O lines of the |
---|
1184 | | - * flash device. |
---|
1185 | | - * @read_byte: [REPLACEABLE] read one byte from the chip |
---|
1186 | | - * @read_word: [REPLACEABLE] read one word from the chip |
---|
1187 | | - * @write_byte: [REPLACEABLE] write a single byte to the chip on the |
---|
1188 | | - * low 8 I/O lines |
---|
1189 | | - * @write_buf: [REPLACEABLE] write data from the buffer to the chip |
---|
1190 | | - * @read_buf: [REPLACEABLE] read data from the chip into the buffer |
---|
1191 | | - * @select_chip: [REPLACEABLE] select chip nr |
---|
1192 | | - * @block_bad: [REPLACEABLE] check if a block is bad, using OOB markers |
---|
1193 | | - * @block_markbad: [REPLACEABLE] mark a block bad |
---|
1194 | | - * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific function for controlling |
---|
1195 | | - * ALE/CLE/nCE. Also used to write command and address |
---|
1196 | | - * @dev_ready: [BOARDSPECIFIC] hardwarespecific function for accessing |
---|
1197 | | - * device ready/busy line. If set to NULL no access to |
---|
1198 | | - * ready/busy is available and the ready/busy information |
---|
1199 | | - * is read from the chip status register. |
---|
1200 | | - * @cmdfunc: [REPLACEABLE] hardwarespecific function for writing |
---|
1201 | | - * commands to the chip. |
---|
1202 | | - * @waitfunc: [REPLACEABLE] hardwarespecific function for wait on |
---|
1203 | | - * ready. |
---|
1204 | | - * @exec_op: controller specific method to execute NAND operations. |
---|
1205 | | - * This method replaces ->cmdfunc(), |
---|
1206 | | - * ->{read,write}_{buf,byte,word}(), ->dev_ready() and |
---|
1207 | | - * ->waifunc(). |
---|
1208 | | - * @setup_read_retry: [FLASHSPECIFIC] flash (vendor) specific function for |
---|
1209 | | - * setting the read-retry mode. Mostly needed for MLC NAND. |
---|
1210 | | - * @ecc: [BOARDSPECIFIC] ECC control structure |
---|
1211 | | - * @buf_align: minimum buffer alignment required by a platform |
---|
1212 | | - * @dummy_controller: dummy controller implementation for drivers that can |
---|
1213 | | - * only control a single chip |
---|
1214 | | - * @erase: [REPLACEABLE] erase function |
---|
1215 | | - * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transferring |
---|
1216 | | - * data from array to read regs (tR). |
---|
1217 | | - * @state: [INTERN] the current state of the NAND device |
---|
1218 | | - * @oob_poi: "poison value buffer," used for laying out OOB data |
---|
1219 | | - * before writing |
---|
1220 | | - * @page_shift: [INTERN] number of address bits in a page (column |
---|
1221 | | - * address bits). |
---|
1222 | | - * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock |
---|
1223 | | - * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry |
---|
1224 | | - * @chip_shift: [INTERN] number of address bits in one chip |
---|
1225 | | - * @options: [BOARDSPECIFIC] various chip options. They can partly |
---|
1226 | | - * be set to inform nand_scan about special functionality. |
---|
1227 | | - * See the defines for further explanation. |
---|
1228 | | - * @bbt_options: [INTERN] bad block specific options. All options used |
---|
1229 | | - * here must come from bbm.h. By default, these options |
---|
1230 | | - * will be copied to the appropriate nand_bbt_descr's. |
---|
1231 | | - * @badblockpos: [INTERN] position of the bad block marker in the oob |
---|
1232 | | - * area. |
---|
1233 | | - * @badblockbits: [INTERN] minimum number of set bits in a good block's |
---|
1234 | | - * bad block marker position; i.e., BBM == 11110111b is |
---|
1235 | | - * not bad when badblockbits == 7 |
---|
1236 | | - * @bits_per_cell: [INTERN] number of bits per cell. i.e., 1 means SLC. |
---|
1237 | | - * @ecc_strength_ds: [INTERN] ECC correctability from the datasheet. |
---|
1238 | | - * Minimum amount of bit errors per @ecc_step_ds guaranteed |
---|
1239 | | - * to be correctable. If unknown, set to zero. |
---|
1240 | | - * @ecc_step_ds: [INTERN] ECC step required by the @ecc_strength_ds, |
---|
1241 | | - * also from the datasheet. It is the recommended ECC step |
---|
1242 | | - * size, if known; if unknown, set to zero. |
---|
1243 | | - * @onfi_timing_mode_default: [INTERN] default ONFI timing mode. This field is |
---|
1244 | | - * set to the actually used ONFI mode if the chip is |
---|
1245 | | - * ONFI compliant or deduced from the datasheet if |
---|
1246 | | - * the NAND chip is not ONFI compliant. |
---|
1247 | | - * @numchips: [INTERN] number of physical chips |
---|
1248 | | - * @chipsize: [INTERN] the size of one chip for multichip arrays |
---|
1249 | | - * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1 |
---|
1250 | | - * @data_buf: [INTERN] buffer for data, size is (page size + oobsize). |
---|
1251 | | - * @pagebuf: [INTERN] holds the pagenumber which is currently in |
---|
1252 | | - * data_buf. |
---|
1253 | | - * @pagebuf_bitflips: [INTERN] holds the bitflip count for the page which is |
---|
1254 | | - * currently in data_buf. |
---|
1255 | | - * @subpagesize: [INTERN] holds the subpagesize |
---|
1256 | | - * @id: [INTERN] holds NAND ID |
---|
1257 | | - * @parameters: [INTERN] holds generic parameters under an easily |
---|
1258 | | - * readable form. |
---|
1259 | | - * @max_bb_per_die: [INTERN] the max number of bad blocks each die of a |
---|
1260 | | - * this nand device will encounter their life times. |
---|
1261 | | - * @blocks_per_die: [INTERN] The number of PEBs in a die |
---|
1262 | | - * @data_interface: [INTERN] NAND interface timing information |
---|
1263 | | - * @read_retries: [INTERN] the number of read retry modes supported |
---|
1264 | | - * @set_features: [REPLACEABLE] set the NAND chip features |
---|
1265 | | - * @get_features: [REPLACEABLE] get the NAND chip features |
---|
1266 | | - * @setup_data_interface: [OPTIONAL] setup the data interface and timing. If |
---|
1267 | | - * chipnr is set to %NAND_DATA_IFACE_CHECK_ONLY this |
---|
1268 | | - * means the configuration should not be applied but |
---|
1269 | | - * only checked. |
---|
1270 | | - * @bbt: [INTERN] bad block table pointer |
---|
1271 | | - * @bbt_td: [REPLACEABLE] bad block table descriptor for flash |
---|
1272 | | - * lookup. |
---|
1273 | | - * @bbt_md: [REPLACEABLE] bad block table mirror descriptor |
---|
1274 | | - * @badblock_pattern: [REPLACEABLE] bad block scan pattern used for initial |
---|
1275 | | - * bad block scan. |
---|
1276 | | - * @controller: [REPLACEABLE] a pointer to a hardware controller |
---|
1277 | | - * structure which is shared among multiple independent |
---|
1278 | | - * devices. |
---|
1279 | | - * @priv: [OPTIONAL] pointer to private chip data |
---|
1280 | | - * @manufacturer: [INTERN] Contains manufacturer information |
---|
1281 | | - * @manufacturer.desc: [INTERN] Contains manufacturer's description |
---|
1282 | | - * @manufacturer.priv: [INTERN] Contains manufacturer private information |
---|
| 1035 | + * struct nand_controller_ops - Controller operations |
---|
| 1036 | + * |
---|
| 1037 | + * @attach_chip: this method is called after the NAND detection phase after |
---|
| 1038 | + * flash ID and MTD fields such as erase size, page size and OOB |
---|
| 1039 | + * size have been set up. ECC requirements are available if |
---|
| 1040 | + * provided by the NAND chip or device tree. Typically used to |
---|
| 1041 | + * choose the appropriate ECC configuration and allocate |
---|
| 1042 | + * associated resources. |
---|
| 1043 | + * This hook is optional. |
---|
| 1044 | + * @detach_chip: free all resources allocated/claimed in |
---|
| 1045 | + * nand_controller_ops->attach_chip(). |
---|
| 1046 | + * This hook is optional. |
---|
| 1047 | + * @exec_op: controller specific method to execute NAND operations. |
---|
| 1048 | + * This method replaces chip->legacy.cmdfunc(), |
---|
| 1049 | + * chip->legacy.{read,write}_{buf,byte,word}(), |
---|
| 1050 | + * chip->legacy.dev_ready() and chip->legacy.waifunc(). |
---|
| 1051 | + * @setup_interface: setup the data interface and timing. If chipnr is set to |
---|
| 1052 | + * %NAND_DATA_IFACE_CHECK_ONLY this means the configuration |
---|
| 1053 | + * should not be applied but only checked. |
---|
| 1054 | + * This hook is optional. |
---|
1283 | 1055 | */ |
---|
1284 | | - |
---|
1285 | | -struct nand_chip { |
---|
1286 | | - struct mtd_info mtd; |
---|
1287 | | - void __iomem *IO_ADDR_R; |
---|
1288 | | - void __iomem *IO_ADDR_W; |
---|
1289 | | - |
---|
1290 | | - uint8_t (*read_byte)(struct mtd_info *mtd); |
---|
1291 | | - u16 (*read_word)(struct mtd_info *mtd); |
---|
1292 | | - void (*write_byte)(struct mtd_info *mtd, uint8_t byte); |
---|
1293 | | - void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); |
---|
1294 | | - void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len); |
---|
1295 | | - void (*select_chip)(struct mtd_info *mtd, int chip); |
---|
1296 | | - int (*block_bad)(struct mtd_info *mtd, loff_t ofs); |
---|
1297 | | - int (*block_markbad)(struct mtd_info *mtd, loff_t ofs); |
---|
1298 | | - void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl); |
---|
1299 | | - int (*dev_ready)(struct mtd_info *mtd); |
---|
1300 | | - void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, |
---|
1301 | | - int page_addr); |
---|
1302 | | - int(*waitfunc)(struct mtd_info *mtd, struct nand_chip *this); |
---|
| 1056 | +struct nand_controller_ops { |
---|
| 1057 | + int (*attach_chip)(struct nand_chip *chip); |
---|
| 1058 | + void (*detach_chip)(struct nand_chip *chip); |
---|
1303 | 1059 | int (*exec_op)(struct nand_chip *chip, |
---|
1304 | 1060 | const struct nand_operation *op, |
---|
1305 | 1061 | bool check_only); |
---|
1306 | | - int (*erase)(struct mtd_info *mtd, int page); |
---|
1307 | | - int (*set_features)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1308 | | - int feature_addr, uint8_t *subfeature_para); |
---|
1309 | | - int (*get_features)(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1310 | | - int feature_addr, uint8_t *subfeature_para); |
---|
1311 | | - int (*setup_read_retry)(struct mtd_info *mtd, int retry_mode); |
---|
1312 | | - int (*setup_data_interface)(struct mtd_info *mtd, int chipnr, |
---|
1313 | | - const struct nand_data_interface *conf); |
---|
1314 | | - |
---|
1315 | | - int chip_delay; |
---|
1316 | | - unsigned int options; |
---|
1317 | | - unsigned int bbt_options; |
---|
1318 | | - |
---|
1319 | | - int page_shift; |
---|
1320 | | - int phys_erase_shift; |
---|
1321 | | - int bbt_erase_shift; |
---|
1322 | | - int chip_shift; |
---|
1323 | | - int numchips; |
---|
1324 | | - uint64_t chipsize; |
---|
1325 | | - int pagemask; |
---|
1326 | | - u8 *data_buf; |
---|
1327 | | - int pagebuf; |
---|
1328 | | - unsigned int pagebuf_bitflips; |
---|
1329 | | - int subpagesize; |
---|
1330 | | - uint8_t bits_per_cell; |
---|
1331 | | - uint16_t ecc_strength_ds; |
---|
1332 | | - uint16_t ecc_step_ds; |
---|
1333 | | - int onfi_timing_mode_default; |
---|
1334 | | - int badblockpos; |
---|
1335 | | - int badblockbits; |
---|
1336 | | - |
---|
1337 | | - struct nand_id id; |
---|
1338 | | - struct nand_parameters parameters; |
---|
1339 | | - u16 max_bb_per_die; |
---|
1340 | | - u32 blocks_per_die; |
---|
1341 | | - |
---|
1342 | | - struct nand_data_interface data_interface; |
---|
1343 | | - |
---|
1344 | | - int read_retries; |
---|
1345 | | - |
---|
1346 | | - flstate_t state; |
---|
1347 | | - |
---|
1348 | | - uint8_t *oob_poi; |
---|
1349 | | - struct nand_controller *controller; |
---|
1350 | | - |
---|
1351 | | - struct nand_ecc_ctrl ecc; |
---|
1352 | | - unsigned long buf_align; |
---|
1353 | | - struct nand_controller dummy_controller; |
---|
1354 | | - |
---|
1355 | | - uint8_t *bbt; |
---|
1356 | | - struct nand_bbt_descr *bbt_td; |
---|
1357 | | - struct nand_bbt_descr *bbt_md; |
---|
1358 | | - |
---|
1359 | | - struct nand_bbt_descr *badblock_pattern; |
---|
1360 | | - |
---|
1361 | | - void *priv; |
---|
1362 | | - |
---|
1363 | | - struct { |
---|
1364 | | - const struct nand_manufacturer *desc; |
---|
1365 | | - void *priv; |
---|
1366 | | - } manufacturer; |
---|
| 1062 | + int (*setup_interface)(struct nand_chip *chip, int chipnr, |
---|
| 1063 | + const struct nand_interface_config *conf); |
---|
1367 | 1064 | }; |
---|
1368 | 1065 | |
---|
1369 | | -static inline int nand_exec_op(struct nand_chip *chip, |
---|
1370 | | - const struct nand_operation *op) |
---|
1371 | | -{ |
---|
1372 | | - if (!chip->exec_op) |
---|
1373 | | - return -ENOTSUPP; |
---|
| 1066 | +/** |
---|
| 1067 | + * struct nand_controller - Structure used to describe a NAND controller |
---|
| 1068 | + * |
---|
| 1069 | + * @lock: lock used to serialize accesses to the NAND controller |
---|
| 1070 | + * @ops: NAND controller operations. |
---|
| 1071 | + */ |
---|
| 1072 | +struct nand_controller { |
---|
| 1073 | + struct mutex lock; |
---|
| 1074 | + const struct nand_controller_ops *ops; |
---|
| 1075 | +}; |
---|
1374 | 1076 | |
---|
1375 | | - return chip->exec_op(chip, op, false); |
---|
| 1077 | +static inline void nand_controller_init(struct nand_controller *nfc) |
---|
| 1078 | +{ |
---|
| 1079 | + mutex_init(&nfc->lock); |
---|
1376 | 1080 | } |
---|
1377 | 1081 | |
---|
1378 | | -extern const struct mtd_ooblayout_ops nand_ooblayout_sp_ops; |
---|
1379 | | -extern const struct mtd_ooblayout_ops nand_ooblayout_lp_ops; |
---|
| 1082 | +/** |
---|
| 1083 | + * struct nand_legacy - NAND chip legacy fields/hooks |
---|
| 1084 | + * @IO_ADDR_R: address to read the 8 I/O lines of the flash device |
---|
| 1085 | + * @IO_ADDR_W: address to write the 8 I/O lines of the flash device |
---|
| 1086 | + * @select_chip: select/deselect a specific target/die |
---|
| 1087 | + * @read_byte: read one byte from the chip |
---|
| 1088 | + * @write_byte: write a single byte to the chip on the low 8 I/O lines |
---|
| 1089 | + * @write_buf: write data from the buffer to the chip |
---|
| 1090 | + * @read_buf: read data from the chip into the buffer |
---|
| 1091 | + * @cmd_ctrl: hardware specific function for controlling ALE/CLE/nCE. Also used |
---|
| 1092 | + * to write command and address |
---|
| 1093 | + * @cmdfunc: hardware specific function for writing commands to the chip. |
---|
| 1094 | + * @dev_ready: hardware specific function for accessing device ready/busy line. |
---|
| 1095 | + * If set to NULL no access to ready/busy is available and the |
---|
| 1096 | + * ready/busy information is read from the chip status register. |
---|
| 1097 | + * @waitfunc: hardware specific function for wait on ready. |
---|
| 1098 | + * @block_bad: check if a block is bad, using OOB markers |
---|
| 1099 | + * @block_markbad: mark a block bad |
---|
| 1100 | + * @set_features: set the NAND chip features |
---|
| 1101 | + * @get_features: get the NAND chip features |
---|
| 1102 | + * @chip_delay: chip dependent delay for transferring data from array to read |
---|
| 1103 | + * regs (tR). |
---|
| 1104 | + * @dummy_controller: dummy controller implementation for drivers that can |
---|
| 1105 | + * only control a single chip |
---|
| 1106 | + * |
---|
| 1107 | + * If you look at this structure you're already wrong. These fields/hooks are |
---|
| 1108 | + * all deprecated. |
---|
| 1109 | + */ |
---|
| 1110 | +struct nand_legacy { |
---|
| 1111 | + void __iomem *IO_ADDR_R; |
---|
| 1112 | + void __iomem *IO_ADDR_W; |
---|
| 1113 | + void (*select_chip)(struct nand_chip *chip, int cs); |
---|
| 1114 | + u8 (*read_byte)(struct nand_chip *chip); |
---|
| 1115 | + void (*write_byte)(struct nand_chip *chip, u8 byte); |
---|
| 1116 | + void (*write_buf)(struct nand_chip *chip, const u8 *buf, int len); |
---|
| 1117 | + void (*read_buf)(struct nand_chip *chip, u8 *buf, int len); |
---|
| 1118 | + void (*cmd_ctrl)(struct nand_chip *chip, int dat, unsigned int ctrl); |
---|
| 1119 | + void (*cmdfunc)(struct nand_chip *chip, unsigned command, int column, |
---|
| 1120 | + int page_addr); |
---|
| 1121 | + int (*dev_ready)(struct nand_chip *chip); |
---|
| 1122 | + int (*waitfunc)(struct nand_chip *chip); |
---|
| 1123 | + int (*block_bad)(struct nand_chip *chip, loff_t ofs); |
---|
| 1124 | + int (*block_markbad)(struct nand_chip *chip, loff_t ofs); |
---|
| 1125 | + int (*set_features)(struct nand_chip *chip, int feature_addr, |
---|
| 1126 | + u8 *subfeature_para); |
---|
| 1127 | + int (*get_features)(struct nand_chip *chip, int feature_addr, |
---|
| 1128 | + u8 *subfeature_para); |
---|
| 1129 | + int chip_delay; |
---|
| 1130 | + struct nand_controller dummy_controller; |
---|
| 1131 | +}; |
---|
1380 | 1132 | |
---|
1381 | | -static inline void nand_set_flash_node(struct nand_chip *chip, |
---|
1382 | | - struct device_node *np) |
---|
1383 | | -{ |
---|
1384 | | - mtd_set_of_node(&chip->mtd, np); |
---|
1385 | | -} |
---|
| 1133 | +/** |
---|
| 1134 | + * struct nand_chip_ops - NAND chip operations |
---|
| 1135 | + * @suspend: Suspend operation |
---|
| 1136 | + * @resume: Resume operation |
---|
| 1137 | + * @lock_area: Lock operation |
---|
| 1138 | + * @unlock_area: Unlock operation |
---|
| 1139 | + * @setup_read_retry: Set the read-retry mode (mostly needed for MLC NANDs) |
---|
| 1140 | + * @choose_interface_config: Choose the best interface configuration |
---|
| 1141 | + */ |
---|
| 1142 | +struct nand_chip_ops { |
---|
| 1143 | + int (*suspend)(struct nand_chip *chip); |
---|
| 1144 | + void (*resume)(struct nand_chip *chip); |
---|
| 1145 | + int (*lock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len); |
---|
| 1146 | + int (*unlock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len); |
---|
| 1147 | + int (*setup_read_retry)(struct nand_chip *chip, int retry_mode); |
---|
| 1148 | + int (*choose_interface_config)(struct nand_chip *chip, |
---|
| 1149 | + struct nand_interface_config *iface); |
---|
| 1150 | +}; |
---|
1386 | 1151 | |
---|
1387 | | -static inline struct device_node *nand_get_flash_node(struct nand_chip *chip) |
---|
1388 | | -{ |
---|
1389 | | - return mtd_get_of_node(&chip->mtd); |
---|
1390 | | -} |
---|
| 1152 | +/** |
---|
| 1153 | + * struct nand_manufacturer - NAND manufacturer structure |
---|
| 1154 | + * @desc: The manufacturer description |
---|
| 1155 | + * @priv: Private information for the manufacturer driver |
---|
| 1156 | + */ |
---|
| 1157 | +struct nand_manufacturer { |
---|
| 1158 | + const struct nand_manufacturer_desc *desc; |
---|
| 1159 | + void *priv; |
---|
| 1160 | +}; |
---|
| 1161 | + |
---|
| 1162 | +/** |
---|
| 1163 | + * struct nand_chip - NAND Private Flash Chip Data |
---|
| 1164 | + * @base: Inherit from the generic NAND device |
---|
| 1165 | + * @id: Holds NAND ID |
---|
| 1166 | + * @parameters: Holds generic parameters under an easily readable form |
---|
| 1167 | + * @manufacturer: Manufacturer information |
---|
| 1168 | + * @ops: NAND chip operations |
---|
| 1169 | + * @legacy: All legacy fields/hooks. If you develop a new driver, don't even try |
---|
| 1170 | + * to use any of these fields/hooks, and if you're modifying an |
---|
| 1171 | + * existing driver that is using those fields/hooks, you should |
---|
| 1172 | + * consider reworking the driver and avoid using them. |
---|
| 1173 | + * @options: Various chip options. They can partly be set to inform nand_scan |
---|
| 1174 | + * about special functionality. See the defines for further |
---|
| 1175 | + * explanation. |
---|
| 1176 | + * @current_interface_config: The currently used NAND interface configuration |
---|
| 1177 | + * @best_interface_config: The best NAND interface configuration which fits both |
---|
| 1178 | + * the NAND chip and NAND controller constraints. If |
---|
| 1179 | + * unset, the default reset interface configuration must |
---|
| 1180 | + * be used. |
---|
| 1181 | + * @bbt_erase_shift: Number of address bits in a bbt entry |
---|
| 1182 | + * @bbt_options: Bad block table specific options. All options used here must |
---|
| 1183 | + * come from bbm.h. By default, these options will be copied to |
---|
| 1184 | + * the appropriate nand_bbt_descr's. |
---|
| 1185 | + * @badblockpos: Bad block marker position in the oob area |
---|
| 1186 | + * @badblockbits: Minimum number of set bits in a good block's bad block marker |
---|
| 1187 | + * position; i.e., BBM = 11110111b is good when badblockbits = 7 |
---|
| 1188 | + * @bbt_td: Bad block table descriptor for flash lookup |
---|
| 1189 | + * @bbt_md: Bad block table mirror descriptor |
---|
| 1190 | + * @badblock_pattern: Bad block scan pattern used for initial bad block scan |
---|
| 1191 | + * @bbt: Bad block table pointer |
---|
| 1192 | + * @page_shift: Number of address bits in a page (column address bits) |
---|
| 1193 | + * @phys_erase_shift: Number of address bits in a physical eraseblock |
---|
| 1194 | + * @chip_shift: Number of address bits in one chip |
---|
| 1195 | + * @pagemask: Page number mask = number of (pages / chip) - 1 |
---|
| 1196 | + * @subpagesize: Holds the subpagesize |
---|
| 1197 | + * @data_buf: Buffer for data, size is (page size + oobsize) |
---|
| 1198 | + * @oob_poi: pointer on the OOB area covered by data_buf |
---|
| 1199 | + * @pagecache: Structure containing page cache related fields |
---|
| 1200 | + * @pagecache.bitflips: Number of bitflips of the cached page |
---|
| 1201 | + * @pagecache.page: Page number currently in the cache. -1 means no page is |
---|
| 1202 | + * currently cached |
---|
| 1203 | + * @buf_align: Minimum buffer alignment required by a platform |
---|
| 1204 | + * @lock: Lock protecting the suspended field. Also used to serialize accesses |
---|
| 1205 | + * to the NAND device |
---|
| 1206 | + * @suspended: Set to 1 when the device is suspended, 0 when it's not |
---|
| 1207 | + * @resume_wq: wait queue to sleep if rawnand is in suspended state. |
---|
| 1208 | + * @cur_cs: Currently selected target. -1 means no target selected, otherwise we |
---|
| 1209 | + * should always have cur_cs >= 0 && cur_cs < nanddev_ntargets(). |
---|
| 1210 | + * NAND Controller drivers should not modify this value, but they're |
---|
| 1211 | + * allowed to read it. |
---|
| 1212 | + * @read_retries: The number of read retry modes supported |
---|
| 1213 | + * @controller: The hardware controller structure which is shared among multiple |
---|
| 1214 | + * independent devices |
---|
| 1215 | + * @ecc: The ECC controller structure |
---|
| 1216 | + * @priv: Chip private data |
---|
| 1217 | + */ |
---|
| 1218 | +struct nand_chip { |
---|
| 1219 | + struct nand_device base; |
---|
| 1220 | + struct nand_id id; |
---|
| 1221 | + struct nand_parameters parameters; |
---|
| 1222 | + struct nand_manufacturer manufacturer; |
---|
| 1223 | + struct nand_chip_ops ops; |
---|
| 1224 | + struct nand_legacy legacy; |
---|
| 1225 | + unsigned int options; |
---|
| 1226 | + |
---|
| 1227 | + /* Data interface */ |
---|
| 1228 | + const struct nand_interface_config *current_interface_config; |
---|
| 1229 | + struct nand_interface_config *best_interface_config; |
---|
| 1230 | + |
---|
| 1231 | + /* Bad block information */ |
---|
| 1232 | + unsigned int bbt_erase_shift; |
---|
| 1233 | + unsigned int bbt_options; |
---|
| 1234 | + unsigned int badblockpos; |
---|
| 1235 | + unsigned int badblockbits; |
---|
| 1236 | + struct nand_bbt_descr *bbt_td; |
---|
| 1237 | + struct nand_bbt_descr *bbt_md; |
---|
| 1238 | + struct nand_bbt_descr *badblock_pattern; |
---|
| 1239 | + u8 *bbt; |
---|
| 1240 | + |
---|
| 1241 | + /* Device internal layout */ |
---|
| 1242 | + unsigned int page_shift; |
---|
| 1243 | + unsigned int phys_erase_shift; |
---|
| 1244 | + unsigned int chip_shift; |
---|
| 1245 | + unsigned int pagemask; |
---|
| 1246 | + unsigned int subpagesize; |
---|
| 1247 | + |
---|
| 1248 | + /* Buffers */ |
---|
| 1249 | + u8 *data_buf; |
---|
| 1250 | + u8 *oob_poi; |
---|
| 1251 | + struct { |
---|
| 1252 | + unsigned int bitflips; |
---|
| 1253 | + int page; |
---|
| 1254 | + } pagecache; |
---|
| 1255 | + unsigned long buf_align; |
---|
| 1256 | + |
---|
| 1257 | + /* Internals */ |
---|
| 1258 | + struct mutex lock; |
---|
| 1259 | + unsigned int suspended : 1; |
---|
| 1260 | + wait_queue_head_t resume_wq; |
---|
| 1261 | + int cur_cs; |
---|
| 1262 | + int read_retries; |
---|
| 1263 | + |
---|
| 1264 | + /* Externals */ |
---|
| 1265 | + struct nand_controller *controller; |
---|
| 1266 | + struct nand_ecc_ctrl ecc; |
---|
| 1267 | + void *priv; |
---|
| 1268 | +}; |
---|
1391 | 1269 | |
---|
1392 | 1270 | static inline struct nand_chip *mtd_to_nand(struct mtd_info *mtd) |
---|
1393 | 1271 | { |
---|
1394 | | - return container_of(mtd, struct nand_chip, mtd); |
---|
| 1272 | + return container_of(mtd, struct nand_chip, base.mtd); |
---|
1395 | 1273 | } |
---|
1396 | 1274 | |
---|
1397 | 1275 | static inline struct mtd_info *nand_to_mtd(struct nand_chip *chip) |
---|
1398 | 1276 | { |
---|
1399 | | - return &chip->mtd; |
---|
| 1277 | + return &chip->base.mtd; |
---|
1400 | 1278 | } |
---|
1401 | 1279 | |
---|
1402 | 1280 | static inline void *nand_get_controller_data(struct nand_chip *chip) |
---|
.. | .. |
---|
1420 | 1298 | return chip->manufacturer.priv; |
---|
1421 | 1299 | } |
---|
1422 | 1300 | |
---|
1423 | | -/* |
---|
1424 | | - * NAND Flash Manufacturer ID Codes |
---|
1425 | | - */ |
---|
1426 | | -#define NAND_MFR_TOSHIBA 0x98 |
---|
1427 | | -#define NAND_MFR_ESMT 0xc8 |
---|
1428 | | -#define NAND_MFR_SAMSUNG 0xec |
---|
1429 | | -#define NAND_MFR_FUJITSU 0x04 |
---|
1430 | | -#define NAND_MFR_NATIONAL 0x8f |
---|
1431 | | -#define NAND_MFR_RENESAS 0x07 |
---|
1432 | | -#define NAND_MFR_STMICRO 0x20 |
---|
1433 | | -#define NAND_MFR_HYNIX 0xad |
---|
1434 | | -#define NAND_MFR_MICRON 0x2c |
---|
1435 | | -#define NAND_MFR_AMD 0x01 |
---|
1436 | | -#define NAND_MFR_MACRONIX 0xc2 |
---|
1437 | | -#define NAND_MFR_EON 0x92 |
---|
1438 | | -#define NAND_MFR_SANDISK 0x45 |
---|
1439 | | -#define NAND_MFR_INTEL 0x89 |
---|
1440 | | -#define NAND_MFR_ATO 0x9b |
---|
1441 | | -#define NAND_MFR_WINBOND 0xef |
---|
| 1301 | +static inline void nand_set_flash_node(struct nand_chip *chip, |
---|
| 1302 | + struct device_node *np) |
---|
| 1303 | +{ |
---|
| 1304 | + mtd_set_of_node(nand_to_mtd(chip), np); |
---|
| 1305 | +} |
---|
1442 | 1306 | |
---|
| 1307 | +static inline struct device_node *nand_get_flash_node(struct nand_chip *chip) |
---|
| 1308 | +{ |
---|
| 1309 | + return mtd_get_of_node(nand_to_mtd(chip)); |
---|
| 1310 | +} |
---|
| 1311 | + |
---|
| 1312 | +/** |
---|
| 1313 | + * nand_get_interface_config - Retrieve the current interface configuration |
---|
| 1314 | + * of a NAND chip |
---|
| 1315 | + * @chip: The NAND chip |
---|
| 1316 | + */ |
---|
| 1317 | +static inline const struct nand_interface_config * |
---|
| 1318 | +nand_get_interface_config(struct nand_chip *chip) |
---|
| 1319 | +{ |
---|
| 1320 | + return chip->current_interface_config; |
---|
| 1321 | +} |
---|
1443 | 1322 | |
---|
1444 | 1323 | /* |
---|
1445 | 1324 | * A helper for defining older NAND chips where the second ID byte fully |
---|
.. | .. |
---|
1473 | 1352 | * struct nand_flash_dev - NAND Flash Device ID Structure |
---|
1474 | 1353 | * @name: a human-readable name of the NAND chip |
---|
1475 | 1354 | * @dev_id: the device ID (the second byte of the full chip ID array) |
---|
1476 | | - * @mfr_id: manufecturer ID part of the full chip ID array (refers the same |
---|
1477 | | - * memory address as @id[0]) |
---|
| 1355 | + * @mfr_id: manufacturer ID part of the full chip ID array (refers the same |
---|
| 1356 | + * memory address as ``id[0]``) |
---|
1478 | 1357 | * @dev_id: device ID part of the full chip ID array (refers the same memory |
---|
1479 | | - * address as @id[1]) |
---|
| 1358 | + * address as ``id[1]``) |
---|
1480 | 1359 | * @id: full device ID array |
---|
1481 | 1360 | * @pagesize: size of the NAND page in bytes; if 0, then the real page size (as |
---|
1482 | 1361 | * well as the eraseblock size) is determined from the extended NAND |
---|
.. | .. |
---|
1493 | 1372 | * @ecc_step_ds in nand_chip{}, also from the datasheet. |
---|
1494 | 1373 | * For example, the "4bit ECC for each 512Byte" can be set with |
---|
1495 | 1374 | * NAND_ECC_INFO(4, 512). |
---|
1496 | | - * @onfi_timing_mode_default: the default ONFI timing mode entered after a NAND |
---|
1497 | | - * reset. Should be deduced from timings described |
---|
1498 | | - * in the datasheet. |
---|
1499 | | - * |
---|
1500 | 1375 | */ |
---|
1501 | 1376 | struct nand_flash_dev { |
---|
1502 | 1377 | char *name; |
---|
.. | .. |
---|
1517 | 1392 | uint16_t strength_ds; |
---|
1518 | 1393 | uint16_t step_ds; |
---|
1519 | 1394 | } ecc; |
---|
1520 | | - int onfi_timing_mode_default; |
---|
1521 | 1395 | }; |
---|
1522 | | - |
---|
1523 | | -/** |
---|
1524 | | - * struct nand_manufacturer - NAND Flash Manufacturer structure |
---|
1525 | | - * @name: Manufacturer name |
---|
1526 | | - * @id: manufacturer ID code of device. |
---|
1527 | | - * @ops: manufacturer operations |
---|
1528 | | -*/ |
---|
1529 | | -struct nand_manufacturer { |
---|
1530 | | - int id; |
---|
1531 | | - char *name; |
---|
1532 | | - const struct nand_manufacturer_ops *ops; |
---|
1533 | | -}; |
---|
1534 | | - |
---|
1535 | | -const struct nand_manufacturer *nand_get_manufacturer(u8 id); |
---|
1536 | | - |
---|
1537 | | -static inline const char * |
---|
1538 | | -nand_manufacturer_name(const struct nand_manufacturer *manufacturer) |
---|
1539 | | -{ |
---|
1540 | | - return manufacturer ? manufacturer->name : "Unknown"; |
---|
1541 | | -} |
---|
1542 | | - |
---|
1543 | | -extern struct nand_flash_dev nand_flash_ids[]; |
---|
1544 | | - |
---|
1545 | | -extern const struct nand_manufacturer_ops toshiba_nand_manuf_ops; |
---|
1546 | | -extern const struct nand_manufacturer_ops samsung_nand_manuf_ops; |
---|
1547 | | -extern const struct nand_manufacturer_ops hynix_nand_manuf_ops; |
---|
1548 | | -extern const struct nand_manufacturer_ops micron_nand_manuf_ops; |
---|
1549 | | -extern const struct nand_manufacturer_ops amd_nand_manuf_ops; |
---|
1550 | | -extern const struct nand_manufacturer_ops macronix_nand_manuf_ops; |
---|
1551 | 1396 | |
---|
1552 | 1397 | int nand_create_bbt(struct nand_chip *chip); |
---|
1553 | | -int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs); |
---|
1554 | | -int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs); |
---|
1555 | | -int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); |
---|
1556 | | -int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, |
---|
1557 | | - int allowbbt); |
---|
1558 | | - |
---|
1559 | | -/** |
---|
1560 | | - * struct platform_nand_chip - chip level device structure |
---|
1561 | | - * @nr_chips: max. number of chips to scan for |
---|
1562 | | - * @chip_offset: chip number offset |
---|
1563 | | - * @nr_partitions: number of partitions pointed to by partitions (or zero) |
---|
1564 | | - * @partitions: mtd partition list |
---|
1565 | | - * @chip_delay: R/B delay value in us |
---|
1566 | | - * @options: Option flags, e.g. 16bit buswidth |
---|
1567 | | - * @bbt_options: BBT option flags, e.g. NAND_BBT_USE_FLASH |
---|
1568 | | - * @part_probe_types: NULL-terminated array of probe types |
---|
1569 | | - */ |
---|
1570 | | -struct platform_nand_chip { |
---|
1571 | | - int nr_chips; |
---|
1572 | | - int chip_offset; |
---|
1573 | | - int nr_partitions; |
---|
1574 | | - struct mtd_partition *partitions; |
---|
1575 | | - int chip_delay; |
---|
1576 | | - unsigned int options; |
---|
1577 | | - unsigned int bbt_options; |
---|
1578 | | - const char **part_probe_types; |
---|
1579 | | -}; |
---|
1580 | | - |
---|
1581 | | -/* Keep gcc happy */ |
---|
1582 | | -struct platform_device; |
---|
1583 | | - |
---|
1584 | | -/** |
---|
1585 | | - * struct platform_nand_ctrl - controller level device structure |
---|
1586 | | - * @probe: platform specific function to probe/setup hardware |
---|
1587 | | - * @remove: platform specific function to remove/teardown hardware |
---|
1588 | | - * @dev_ready: platform specific function to read ready/busy pin |
---|
1589 | | - * @select_chip: platform specific chip select function |
---|
1590 | | - * @cmd_ctrl: platform specific function for controlling |
---|
1591 | | - * ALE/CLE/nCE. Also used to write command and address |
---|
1592 | | - * @write_buf: platform specific function for write buffer |
---|
1593 | | - * @read_buf: platform specific function for read buffer |
---|
1594 | | - * @priv: private data to transport driver specific settings |
---|
1595 | | - * |
---|
1596 | | - * All fields are optional and depend on the hardware driver requirements |
---|
1597 | | - */ |
---|
1598 | | -struct platform_nand_ctrl { |
---|
1599 | | - int (*probe)(struct platform_device *pdev); |
---|
1600 | | - void (*remove)(struct platform_device *pdev); |
---|
1601 | | - int (*dev_ready)(struct mtd_info *mtd); |
---|
1602 | | - void (*select_chip)(struct mtd_info *mtd, int chip); |
---|
1603 | | - void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl); |
---|
1604 | | - void (*write_buf)(struct mtd_info *mtd, const uint8_t *buf, int len); |
---|
1605 | | - void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len); |
---|
1606 | | - void *priv; |
---|
1607 | | -}; |
---|
1608 | | - |
---|
1609 | | -/** |
---|
1610 | | - * struct platform_nand_data - container structure for platform-specific data |
---|
1611 | | - * @chip: chip level chip structure |
---|
1612 | | - * @ctrl: controller level device structure |
---|
1613 | | - */ |
---|
1614 | | -struct platform_nand_data { |
---|
1615 | | - struct platform_nand_chip chip; |
---|
1616 | | - struct platform_nand_ctrl ctrl; |
---|
1617 | | -}; |
---|
1618 | | - |
---|
1619 | | -/* return the supported asynchronous timing mode. */ |
---|
1620 | | -static inline int onfi_get_async_timing_mode(struct nand_chip *chip) |
---|
1621 | | -{ |
---|
1622 | | - if (!chip->parameters.onfi) |
---|
1623 | | - return ONFI_TIMING_MODE_UNKNOWN; |
---|
1624 | | - |
---|
1625 | | - return chip->parameters.onfi->async_timing_mode; |
---|
1626 | | -} |
---|
1627 | | - |
---|
1628 | | -int onfi_fill_data_interface(struct nand_chip *chip, |
---|
1629 | | - enum nand_data_interface_type type, |
---|
1630 | | - int timing_mode); |
---|
1631 | 1398 | |
---|
1632 | 1399 | /* |
---|
1633 | 1400 | * Check if it is a SLC nand. |
---|
.. | .. |
---|
1636 | 1403 | */ |
---|
1637 | 1404 | static inline bool nand_is_slc(struct nand_chip *chip) |
---|
1638 | 1405 | { |
---|
1639 | | - WARN(chip->bits_per_cell == 0, |
---|
| 1406 | + WARN(nanddev_bits_per_cell(&chip->base) == 0, |
---|
1640 | 1407 | "chip->bits_per_cell is used uninitialized\n"); |
---|
1641 | | - return chip->bits_per_cell == 1; |
---|
| 1408 | + return nanddev_bits_per_cell(&chip->base) == 1; |
---|
1642 | 1409 | } |
---|
1643 | 1410 | |
---|
1644 | 1411 | /** |
---|
.. | .. |
---|
1659 | 1426 | return 0; |
---|
1660 | 1427 | } |
---|
1661 | 1428 | |
---|
1662 | | -/* get timing characteristics from ONFI timing mode. */ |
---|
1663 | | -const struct nand_sdr_timings *onfi_async_timing_mode_to_sdr_timings(int mode); |
---|
1664 | | - |
---|
1665 | 1429 | int nand_check_erased_ecc_chunk(void *data, int datalen, |
---|
1666 | 1430 | void *ecc, int ecclen, |
---|
1667 | 1431 | void *extraoob, int extraooblen, |
---|
.. | .. |
---|
1671 | 1435 | const struct nand_ecc_caps *caps, int oobavail); |
---|
1672 | 1436 | |
---|
1673 | 1437 | /* Default write_oob implementation */ |
---|
1674 | | -int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip, int page); |
---|
1675 | | - |
---|
1676 | | -/* Default write_oob syndrome implementation */ |
---|
1677 | | -int nand_write_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1678 | | - int page); |
---|
| 1438 | +int nand_write_oob_std(struct nand_chip *chip, int page); |
---|
1679 | 1439 | |
---|
1680 | 1440 | /* Default read_oob implementation */ |
---|
1681 | | -int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip, int page); |
---|
| 1441 | +int nand_read_oob_std(struct nand_chip *chip, int page); |
---|
1682 | 1442 | |
---|
1683 | | -/* Default read_oob syndrome implementation */ |
---|
1684 | | -int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1685 | | - int page); |
---|
1686 | | - |
---|
1687 | | -/* Wrapper to use in order for controllers/vendors to GET/SET FEATURES */ |
---|
1688 | | -int nand_get_features(struct nand_chip *chip, int addr, u8 *subfeature_param); |
---|
1689 | | -int nand_set_features(struct nand_chip *chip, int addr, u8 *subfeature_param); |
---|
1690 | 1443 | /* Stub used by drivers that do not support GET/SET FEATURES operations */ |
---|
1691 | | -int nand_get_set_features_notsupp(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1692 | | - int addr, u8 *subfeature_param); |
---|
| 1444 | +int nand_get_set_features_notsupp(struct nand_chip *chip, int addr, |
---|
| 1445 | + u8 *subfeature_param); |
---|
1693 | 1446 | |
---|
1694 | | -/* Default read_page_raw implementation */ |
---|
1695 | | -int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1696 | | - uint8_t *buf, int oob_required, int page); |
---|
1697 | | -int nand_read_page_raw_notsupp(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1698 | | - u8 *buf, int oob_required, int page); |
---|
| 1447 | +/* read_page_raw implementations */ |
---|
| 1448 | +int nand_read_page_raw(struct nand_chip *chip, uint8_t *buf, int oob_required, |
---|
| 1449 | + int page); |
---|
| 1450 | +int nand_monolithic_read_page_raw(struct nand_chip *chip, uint8_t *buf, |
---|
| 1451 | + int oob_required, int page); |
---|
1699 | 1452 | |
---|
1700 | | -/* Default write_page_raw implementation */ |
---|
1701 | | -int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1702 | | - const uint8_t *buf, int oob_required, int page); |
---|
1703 | | -int nand_write_page_raw_notsupp(struct mtd_info *mtd, struct nand_chip *chip, |
---|
1704 | | - const u8 *buf, int oob_required, int page); |
---|
| 1453 | +/* write_page_raw implementations */ |
---|
| 1454 | +int nand_write_page_raw(struct nand_chip *chip, const uint8_t *buf, |
---|
| 1455 | + int oob_required, int page); |
---|
| 1456 | +int nand_monolithic_write_page_raw(struct nand_chip *chip, const uint8_t *buf, |
---|
| 1457 | + int oob_required, int page); |
---|
1705 | 1458 | |
---|
1706 | 1459 | /* Reset and initialize a NAND device */ |
---|
1707 | 1460 | int nand_reset(struct nand_chip *chip, int chipnr); |
---|
.. | .. |
---|
1711 | 1464 | int nand_readid_op(struct nand_chip *chip, u8 addr, void *buf, |
---|
1712 | 1465 | unsigned int len); |
---|
1713 | 1466 | int nand_status_op(struct nand_chip *chip, u8 *status); |
---|
1714 | | -int nand_exit_status_op(struct nand_chip *chip); |
---|
1715 | 1467 | int nand_erase_op(struct nand_chip *chip, unsigned int eraseblock); |
---|
1716 | 1468 | int nand_read_page_op(struct nand_chip *chip, unsigned int page, |
---|
1717 | 1469 | unsigned int offset_in_page, void *buf, unsigned int len); |
---|
.. | .. |
---|
1731 | 1483 | unsigned int offset_in_page, const void *buf, |
---|
1732 | 1484 | unsigned int len, bool force_8bit); |
---|
1733 | 1485 | int nand_read_data_op(struct nand_chip *chip, void *buf, unsigned int len, |
---|
1734 | | - bool force_8bit); |
---|
| 1486 | + bool force_8bit, bool check_only); |
---|
1735 | 1487 | int nand_write_data_op(struct nand_chip *chip, const void *buf, |
---|
1736 | 1488 | unsigned int len, bool force_8bit); |
---|
| 1489 | + |
---|
| 1490 | +/* Scan and identify a NAND device */ |
---|
| 1491 | +int nand_scan_with_ids(struct nand_chip *chip, unsigned int max_chips, |
---|
| 1492 | + struct nand_flash_dev *ids); |
---|
| 1493 | + |
---|
| 1494 | +static inline int nand_scan(struct nand_chip *chip, unsigned int max_chips) |
---|
| 1495 | +{ |
---|
| 1496 | + return nand_scan_with_ids(chip, max_chips, NULL); |
---|
| 1497 | +} |
---|
| 1498 | + |
---|
| 1499 | +/* Internal helper for board drivers which need to override command function */ |
---|
| 1500 | +void nand_wait_ready(struct nand_chip *chip); |
---|
1737 | 1501 | |
---|
1738 | 1502 | /* |
---|
1739 | 1503 | * Free resources held by the NAND device, must be called on error after a |
---|
1740 | 1504 | * sucessful nand_scan(). |
---|
1741 | 1505 | */ |
---|
1742 | 1506 | void nand_cleanup(struct nand_chip *chip); |
---|
1743 | | -/* Unregister the MTD device and calls nand_cleanup() */ |
---|
1744 | | -void nand_release(struct nand_chip *chip); |
---|
1745 | | - |
---|
1746 | | -/* Default extended ID decoding function */ |
---|
1747 | | -void nand_decode_ext_id(struct nand_chip *chip); |
---|
1748 | 1507 | |
---|
1749 | 1508 | /* |
---|
1750 | 1509 | * External helper for controller drivers that have to implement the WAITRDY |
---|
1751 | 1510 | * instruction and have no physical pin to check it. |
---|
1752 | 1511 | */ |
---|
1753 | 1512 | int nand_soft_waitrdy(struct nand_chip *chip, unsigned long timeout_ms); |
---|
| 1513 | +struct gpio_desc; |
---|
| 1514 | +int nand_gpio_waitrdy(struct nand_chip *chip, struct gpio_desc *gpiod, |
---|
| 1515 | + unsigned long timeout_ms); |
---|
| 1516 | + |
---|
| 1517 | +/* Select/deselect a NAND target. */ |
---|
| 1518 | +void nand_select_target(struct nand_chip *chip, unsigned int cs); |
---|
| 1519 | +void nand_deselect_target(struct nand_chip *chip); |
---|
| 1520 | + |
---|
| 1521 | +/* Bitops */ |
---|
| 1522 | +void nand_extract_bits(u8 *dst, unsigned int dst_off, const u8 *src, |
---|
| 1523 | + unsigned int src_off, unsigned int nbits); |
---|
| 1524 | + |
---|
| 1525 | +/** |
---|
| 1526 | + * nand_get_data_buf() - Get the internal page buffer |
---|
| 1527 | + * @chip: NAND chip object |
---|
| 1528 | + * |
---|
| 1529 | + * Returns the pre-allocated page buffer after invalidating the cache. This |
---|
| 1530 | + * function should be used by drivers that do not want to allocate their own |
---|
| 1531 | + * bounce buffer and still need such a buffer for specific operations (most |
---|
| 1532 | + * commonly when reading OOB data only). |
---|
| 1533 | + * |
---|
| 1534 | + * Be careful to never call this function in the write/write_oob path, because |
---|
| 1535 | + * the core may have placed the data to be written out in this buffer. |
---|
| 1536 | + * |
---|
| 1537 | + * Return: pointer to the page cache buffer |
---|
| 1538 | + */ |
---|
| 1539 | +static inline void *nand_get_data_buf(struct nand_chip *chip) |
---|
| 1540 | +{ |
---|
| 1541 | + chip->pagecache.page = -1; |
---|
| 1542 | + |
---|
| 1543 | + return chip->data_buf; |
---|
| 1544 | +} |
---|
1754 | 1545 | |
---|
1755 | 1546 | #endif /* __LINUX_MTD_RAWNAND_H */ |
---|