aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/mtd
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@cruncher.tec.linutronix.de>2006-05-26 12:52:08 -0400
committerThomas Gleixner <tglx@cruncher.tec.linutronix.de>2006-05-26 12:52:08 -0400
commitf75e5097ef298c5a0aa106faa211d1afdc92dc3d (patch)
tree0de4534e9ae54cf5d17ea9ef20acefb931167eee /include/linux/mtd
parente4d222ff18bca6322f032088a21e9c4a4c038b85 (diff)
[MTD] NAND modularize write function
Modularize the write function and reorganaize the internal buffer management. Remove obsolete chip options and fixup all affected users. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/mtd')
-rw-r--r--include/linux/mtd/nand.h71
1 files changed, 45 insertions, 26 deletions
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 00916498ea55..1a749ba6130f 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -37,7 +37,7 @@ extern int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from,
37 37
38 38
39extern int nand_write_raw(struct mtd_info *mtd, loff_t to, size_t len, 39extern int nand_write_raw(struct mtd_info *mtd, loff_t to, size_t len,
40 size_t *retlen, uint8_t *buf, uint8_t *oob); 40 size_t *retlen, const uint8_t *buf, uint8_t *oob);
41 41
42/* The maximum number of NAND chips in an array */ 42/* The maximum number of NAND chips in an array */
43#define NAND_MAX_CHIPS 8 43#define NAND_MAX_CHIPS 8
@@ -47,6 +47,7 @@ extern int nand_write_raw(struct mtd_info *mtd, loff_t to, size_t len,
47 * adjust this accordingly. 47 * adjust this accordingly.
48 */ 48 */
49#define NAND_MAX_OOBSIZE 64 49#define NAND_MAX_OOBSIZE 64
50#define NAND_MAX_PAGESIZE 2048
50 51
51/* 52/*
52 * Constants for hardware specific CLE/ALE/NCE function 53 * Constants for hardware specific CLE/ALE/NCE function
@@ -181,20 +182,12 @@ typedef enum {
181/* Use a flash based bad block table. This option is passed to the 182/* Use a flash based bad block table. This option is passed to the
182 * default bad block table function. */ 183 * default bad block table function. */
183#define NAND_USE_FLASH_BBT 0x00010000 184#define NAND_USE_FLASH_BBT 0x00010000
184/* The hw ecc generator provides a syndrome instead a ecc value on read
185 * This can only work if we have the ecc bytes directly behind the
186 * data bytes. Applies for DOC and AG-AND Renesas HW Reed Solomon generators */
187#define NAND_HWECC_SYNDROME 0x00020000
188/* This option skips the bbt scan during initialization. */ 185/* This option skips the bbt scan during initialization. */
189#define NAND_SKIP_BBTSCAN 0x00040000 186#define NAND_SKIP_BBTSCAN 0x00020000
190 187
191/* Options set by nand scan */ 188/* Options set by nand scan */
192/* Nand scan has allocated controller struct */ 189/* Nand scan has allocated controller struct */
193#define NAND_CONTROLLER_ALLOC 0x20000000 190#define NAND_CONTROLLER_ALLOC 0x80000000
194/* Nand scan has allocated oob_buf */
195#define NAND_OOBBUF_ALLOC 0x40000000
196/* Nand scan has allocated data_buf */
197#define NAND_DATABUF_ALLOC 0x80000000
198 191
199 192
200/* 193/*
@@ -240,6 +233,7 @@ struct nand_hw_control {
240 * be provided if an hardware ECC is available 233 * be provided if an hardware ECC is available
241 * @calculate: function for ecc calculation or readback from ecc hardware 234 * @calculate: function for ecc calculation or readback from ecc hardware
242 * @correct: function for ecc correction, matching to ecc generator (sw/hw) 235 * @correct: function for ecc correction, matching to ecc generator (sw/hw)
236 * @read_page: function to read a page according to the ecc generator requirements
243 * @write_page: function to write a page according to the ecc generator requirements 237 * @write_page: function to write a page according to the ecc generator requirements
244 */ 238 */
245struct nand_ecc_ctrl { 239struct nand_ecc_ctrl {
@@ -260,9 +254,28 @@ struct nand_ecc_ctrl {
260 int (*read_page)(struct mtd_info *mtd, 254 int (*read_page)(struct mtd_info *mtd,
261 struct nand_chip *chip, 255 struct nand_chip *chip,
262 uint8_t *buf); 256 uint8_t *buf);
263 int (*write_page)(struct mtd_info *mtd, 257 void (*write_page)(struct mtd_info *mtd,
264 struct nand_chip *chip, 258 struct nand_chip *chip,
265 uint8_t *buf, int cached); 259 const uint8_t *buf);
260};
261
262/**
263 * struct nand_buffers - buffer structure for read/write
264 * @ecccalc: buffer for calculated ecc
265 * @ecccode: buffer for ecc read from flash
266 * @oobwbuf: buffer for write oob data
267 * @databuf: buffer for data - dynamically sized
268 * @oobrbuf: buffer to read oob data
269 *
270 * Do not change the order of buffers. databuf and oobrbuf must be in
271 * consecutive order.
272 */
273struct nand_buffers {
274 uint8_t ecccalc[NAND_MAX_OOBSIZE];
275 uint8_t ecccode[NAND_MAX_OOBSIZE];
276 uint8_t oobwbuf[NAND_MAX_OOBSIZE];
277 uint8_t databuf[NAND_MAX_PAGESIZE];
278 uint8_t oobrbuf[NAND_MAX_OOBSIZE];
266}; 279};
267 280
268/** 281/**
@@ -294,8 +307,8 @@ struct nand_ecc_ctrl {
294 * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock 307 * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock
295 * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry 308 * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry
296 * @chip_shift: [INTERN] number of address bits in one chip 309 * @chip_shift: [INTERN] number of address bits in one chip
297 * @data_buf: [INTERN] internal buffer for one page + oob 310 * @datbuf: [INTERN] internal buffer for one page + oob
298 * @oob_buf: [INTERN] oob buffer for one eraseblock 311 * @oobbuf: [INTERN] oob buffer for one eraseblock
299 * @oobdirty: [INTERN] indicates that oob_buf must be reinitialized 312 * @oobdirty: [INTERN] indicates that oob_buf must be reinitialized
300 * @data_poi: [INTERN] pointer to a data buffer 313 * @data_poi: [INTERN] pointer to a data buffer
301 * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about 314 * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about
@@ -336,32 +349,38 @@ struct nand_chip {
336 int (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this, int state); 349 int (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this, int state);
337 void (*erase_cmd)(struct mtd_info *mtd, int page); 350 void (*erase_cmd)(struct mtd_info *mtd, int page);
338 int (*scan_bbt)(struct mtd_info *mtd); 351 int (*scan_bbt)(struct mtd_info *mtd);
339 struct nand_ecc_ctrl ecc; 352 int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page);
353
340 int chip_delay; 354 int chip_delay;
341 wait_queue_head_t wq; 355 unsigned int options;
342 nand_state_t state; 356
343 int page_shift; 357 int page_shift;
344 int phys_erase_shift; 358 int phys_erase_shift;
345 int bbt_erase_shift; 359 int bbt_erase_shift;
346 int chip_shift; 360 int chip_shift;
347 uint8_t *data_buf;
348 uint8_t *oob_buf;
349 int oobdirty;
350 uint8_t *data_poi;
351 unsigned int options;
352 int badblockpos;
353 int numchips; 361 int numchips;
354 unsigned long chipsize; 362 unsigned long chipsize;
355 int pagemask; 363 int pagemask;
356 int pagebuf; 364 int pagebuf;
365 int badblockpos;
366
367 nand_state_t state;
368
369 uint8_t *oob_poi;
370 struct nand_hw_control *controller;
357 struct nand_oobinfo *autooob; 371 struct nand_oobinfo *autooob;
372
373 struct nand_ecc_ctrl ecc;
374 struct nand_buffers buffers;
375 struct nand_hw_control hwcontrol;
376
358 uint8_t *bbt; 377 uint8_t *bbt;
359 struct nand_bbt_descr *bbt_td; 378 struct nand_bbt_descr *bbt_td;
360 struct nand_bbt_descr *bbt_md; 379 struct nand_bbt_descr *bbt_md;
380
361 struct nand_bbt_descr *badblock_pattern; 381 struct nand_bbt_descr *badblock_pattern;
362 struct nand_hw_control *controller; 382
363 void *priv; 383 void *priv;
364 int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page);
365}; 384};
366 385
367/* 386/*