Merge branch 'master' of /home/stefan/git/u-boot/u-boot
[platform/kernel/u-boot.git] / drivers / mtd / onenand / onenand_base.c
1 /*
2  *  linux/drivers/mtd/onenand/onenand_base.c
3  *
4  *  Copyright (C) 2005-2007 Samsung Electronics
5  *  Kyungmin Park <kyungmin.park@samsung.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11
12 #include <common.h>
13
14 #ifdef CONFIG_CMD_ONENAND
15
16 #include <linux/mtd/compat.h>
17 #include <linux/mtd/mtd.h>
18 #include <linux/mtd/onenand.h>
19
20 #include <asm/io.h>
21 #include <asm/errno.h>
22 #include <malloc.h>
23
24 /* It should access 16-bit instead of 8-bit */
25 static inline void *memcpy_16(void *dst, const void *src, unsigned int len)
26 {
27         void *ret = dst;
28         short *d = dst;
29         const short *s = src;
30
31         len >>= 1;
32         while (len-- > 0)
33                 *d++ = *s++;
34         return ret;
35 }
36
37 static const unsigned char ffchars[] = {
38         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
39         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 16 */
40         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
41         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 32 */
42         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
43         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 48 */
44         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
45         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 64 */
46 };
47
48 /**
49  * onenand_readw - [OneNAND Interface] Read OneNAND register
50  * @param addr          address to read
51  *
52  * Read OneNAND register
53  */
54 static unsigned short onenand_readw(void __iomem * addr)
55 {
56         return readw(addr);
57 }
58
59 /**
60  * onenand_writew - [OneNAND Interface] Write OneNAND register with value
61  * @param value         value to write
62  * @param addr          address to write
63  *
64  * Write OneNAND register with value
65  */
66 static void onenand_writew(unsigned short value, void __iomem * addr)
67 {
68         writew(value, addr);
69 }
70
71 /**
72  * onenand_block_address - [DEFAULT] Get block address
73  * @param device        the device id
74  * @param block         the block
75  * @return              translated block address if DDP, otherwise same
76  *
77  * Setup Start Address 1 Register (F100h)
78  */
79 static int onenand_block_address(int device, int block)
80 {
81         if (device & ONENAND_DEVICE_IS_DDP) {
82                 /* Device Flash Core select, NAND Flash Block Address */
83                 int dfs = 0, density, mask;
84
85                 density = device >> ONENAND_DEVICE_DENSITY_SHIFT;
86                 mask = (1 << (density + 6));
87
88                 if (block & mask)
89                         dfs = 1;
90
91                 return (dfs << ONENAND_DDP_SHIFT) | (block & (mask - 1));
92         }
93
94         return block;
95 }
96
97 /**
98  * onenand_bufferram_address - [DEFAULT] Get bufferram address
99  * @param device        the device id
100  * @param block         the block
101  * @return              set DBS value if DDP, otherwise 0
102  *
103  * Setup Start Address 2 Register (F101h) for DDP
104  */
105 static int onenand_bufferram_address(int device, int block)
106 {
107         if (device & ONENAND_DEVICE_IS_DDP) {
108                 /* Device BufferRAM Select */
109                 int dbs = 0, density, mask;
110
111                 density = device >> ONENAND_DEVICE_DENSITY_SHIFT;
112                 mask = (1 << (density + 6));
113
114                 if (block & mask)
115                         dbs = 1;
116
117                 return (dbs << ONENAND_DDP_SHIFT);
118         }
119
120         return 0;
121 }
122
123 /**
124  * onenand_page_address - [DEFAULT] Get page address
125  * @param page          the page address
126  * @param sector        the sector address
127  * @return              combined page and sector address
128  *
129  * Setup Start Address 8 Register (F107h)
130  */
131 static int onenand_page_address(int page, int sector)
132 {
133         /* Flash Page Address, Flash Sector Address */
134         int fpa, fsa;
135
136         fpa = page & ONENAND_FPA_MASK;
137         fsa = sector & ONENAND_FSA_MASK;
138
139         return ((fpa << ONENAND_FPA_SHIFT) | fsa);
140 }
141
142 /**
143  * onenand_buffer_address - [DEFAULT] Get buffer address
144  * @param dataram1      DataRAM index
145  * @param sectors       the sector address
146  * @param count         the number of sectors
147  * @return              the start buffer value
148  *
149  * Setup Start Buffer Register (F200h)
150  */
151 static int onenand_buffer_address(int dataram1, int sectors, int count)
152 {
153         int bsa, bsc;
154
155         /* BufferRAM Sector Address */
156         bsa = sectors & ONENAND_BSA_MASK;
157
158         if (dataram1)
159                 bsa |= ONENAND_BSA_DATARAM1;    /* DataRAM1 */
160         else
161                 bsa |= ONENAND_BSA_DATARAM0;    /* DataRAM0 */
162
163         /* BufferRAM Sector Count */
164         bsc = count & ONENAND_BSC_MASK;
165
166         return ((bsa << ONENAND_BSA_SHIFT) | bsc);
167 }
168
169 /**
170  * onenand_command - [DEFAULT] Send command to OneNAND device
171  * @param mtd           MTD device structure
172  * @param cmd           the command to be sent
173  * @param addr          offset to read from or write to
174  * @param len           number of bytes to read or write
175  *
176  * Send command to OneNAND device. This function is used for middle/large page
177  * devices (1KB/2KB Bytes per page)
178  */
179 static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr,
180                            size_t len)
181 {
182         struct onenand_chip *this = mtd->priv;
183         int value, readcmd = 0;
184         int block, page;
185         /* Now we use page size operation */
186         int sectors = 4, count = 4;
187
188         /* Address translation */
189         switch (cmd) {
190         case ONENAND_CMD_UNLOCK:
191         case ONENAND_CMD_LOCK:
192         case ONENAND_CMD_LOCK_TIGHT:
193                 block = -1;
194                 page = -1;
195                 break;
196
197         case ONENAND_CMD_ERASE:
198         case ONENAND_CMD_BUFFERRAM:
199                 block = (int)(addr >> this->erase_shift);
200                 page = -1;
201                 break;
202
203         default:
204                 block = (int)(addr >> this->erase_shift);
205                 page = (int)(addr >> this->page_shift);
206                 page &= this->page_mask;
207                 break;
208         }
209
210         /* NOTE: The setting order of the registers is very important! */
211         if (cmd == ONENAND_CMD_BUFFERRAM) {
212                 /* Select DataRAM for DDP */
213                 value = onenand_bufferram_address(this->device_id, block);
214                 this->write_word(value,
215                                  this->base + ONENAND_REG_START_ADDRESS2);
216
217                 /* Switch to the next data buffer */
218                 ONENAND_SET_NEXT_BUFFERRAM(this);
219
220                 return 0;
221         }
222
223         if (block != -1) {
224                 /* Write 'DFS, FBA' of Flash */
225                 value = onenand_block_address(this->device_id, block);
226                 this->write_word(value,
227                                  this->base + ONENAND_REG_START_ADDRESS1);
228         }
229
230         if (page != -1) {
231                 int dataram;
232
233                 switch (cmd) {
234                 case ONENAND_CMD_READ:
235                 case ONENAND_CMD_READOOB:
236                         dataram = ONENAND_SET_NEXT_BUFFERRAM(this);
237                         readcmd = 1;
238                         break;
239
240                 default:
241                         dataram = ONENAND_CURRENT_BUFFERRAM(this);
242                         break;
243                 }
244
245                 /* Write 'FPA, FSA' of Flash */
246                 value = onenand_page_address(page, sectors);
247                 this->write_word(value,
248                                  this->base + ONENAND_REG_START_ADDRESS8);
249
250                 /* Write 'BSA, BSC' of DataRAM */
251                 value = onenand_buffer_address(dataram, sectors, count);
252                 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
253
254                 if (readcmd) {
255                         /* Select DataRAM for DDP */
256                         value =
257                             onenand_bufferram_address(this->device_id, block);
258                         this->write_word(value,
259                                          this->base +
260                                          ONENAND_REG_START_ADDRESS2);
261                 }
262         }
263
264         /* Interrupt clear */
265         this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
266         /* Write command */
267         this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
268
269         return 0;
270 }
271
272 /**
273  * onenand_wait - [DEFAULT] wait until the command is done
274  * @param mtd           MTD device structure
275  * @param state         state to select the max. timeout value
276  *
277  * Wait for command done. This applies to all OneNAND command
278  * Read can take up to 30us, erase up to 2ms and program up to 350us
279  * according to general OneNAND specs
280  */
281 static int onenand_wait(struct mtd_info *mtd, int state)
282 {
283         struct onenand_chip *this = mtd->priv;
284         unsigned int flags = ONENAND_INT_MASTER;
285         unsigned int interrupt = 0;
286         unsigned int ctrl, ecc;
287
288         while (1) {
289                 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
290                 if (interrupt & flags)
291                         break;
292         }
293
294         ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
295
296         if (ctrl & ONENAND_CTRL_ERROR) {
297                 MTDDEBUG (MTD_DEBUG_LEVEL0,
298                           "onenand_wait: controller error = 0x%04x\n", ctrl);
299                 return -EAGAIN;
300         }
301
302         if (ctrl & ONENAND_CTRL_LOCK) {
303                 MTDDEBUG (MTD_DEBUG_LEVEL0,
304                           "onenand_wait: it's locked error = 0x%04x\n", ctrl);
305                 return -EIO;
306         }
307
308         if (interrupt & ONENAND_INT_READ) {
309                 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS);
310                 if (ecc & ONENAND_ECC_2BIT_ALL) {
311                         MTDDEBUG (MTD_DEBUG_LEVEL0,
312                                   "onenand_wait: ECC error = 0x%04x\n", ecc);
313                         return -EBADMSG;
314                 }
315         }
316
317         return 0;
318 }
319
320 /**
321  * onenand_bufferram_offset - [DEFAULT] BufferRAM offset
322  * @param mtd           MTD data structure
323  * @param area          BufferRAM area
324  * @return              offset given area
325  *
326  * Return BufferRAM offset given area
327  */
328 static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
329 {
330         struct onenand_chip *this = mtd->priv;
331
332         if (ONENAND_CURRENT_BUFFERRAM(this)) {
333                 if (area == ONENAND_DATARAM)
334                         return mtd->oobblock;
335                 if (area == ONENAND_SPARERAM)
336                         return mtd->oobsize;
337         }
338
339         return 0;
340 }
341
342 /**
343  * onenand_read_bufferram - [OneNAND Interface] Read the bufferram area
344  * @param mtd           MTD data structure
345  * @param area          BufferRAM area
346  * @param buffer        the databuffer to put/get data
347  * @param offset        offset to read from or write to
348  * @param count         number of bytes to read/write
349  *
350  * Read the BufferRAM area
351  */
352 static int onenand_read_bufferram(struct mtd_info *mtd, int area,
353                                   unsigned char *buffer, int offset,
354                                   size_t count)
355 {
356         struct onenand_chip *this = mtd->priv;
357         void __iomem *bufferram;
358
359         bufferram = this->base + area;
360         bufferram += onenand_bufferram_offset(mtd, area);
361
362         memcpy_16(buffer, bufferram + offset, count);
363
364         return 0;
365 }
366
367 /**
368  * onenand_sync_read_bufferram - [OneNAND Interface] Read the bufferram area with Sync. Burst mode
369  * @param mtd           MTD data structure
370  * @param area          BufferRAM area
371  * @param buffer        the databuffer to put/get data
372  * @param offset        offset to read from or write to
373  * @param count         number of bytes to read/write
374  *
375  * Read the BufferRAM area with Sync. Burst Mode
376  */
377 static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
378                                        unsigned char *buffer, int offset,
379                                        size_t count)
380 {
381         struct onenand_chip *this = mtd->priv;
382         void __iomem *bufferram;
383
384         bufferram = this->base + area;
385         bufferram += onenand_bufferram_offset(mtd, area);
386
387         this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
388
389         memcpy_16(buffer, bufferram + offset, count);
390
391         this->mmcontrol(mtd, 0);
392
393         return 0;
394 }
395
396 /**
397  * onenand_write_bufferram - [OneNAND Interface] Write the bufferram area
398  * @param mtd           MTD data structure
399  * @param area          BufferRAM area
400  * @param buffer        the databuffer to put/get data
401  * @param offset        offset to read from or write to
402  * @param count         number of bytes to read/write
403  *
404  * Write the BufferRAM area
405  */
406 static int onenand_write_bufferram(struct mtd_info *mtd, int area,
407                                    const unsigned char *buffer, int offset,
408                                    size_t count)
409 {
410         struct onenand_chip *this = mtd->priv;
411         void __iomem *bufferram;
412
413         bufferram = this->base + area;
414         bufferram += onenand_bufferram_offset(mtd, area);
415
416         memcpy_16(bufferram + offset, buffer, count);
417
418         return 0;
419 }
420
421 /**
422  * onenand_check_bufferram - [GENERIC] Check BufferRAM information
423  * @param mtd           MTD data structure
424  * @param addr          address to check
425  * @return              1 if there are valid data, otherwise 0
426  *
427  * Check bufferram if there is data we required
428  */
429 static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
430 {
431         struct onenand_chip *this = mtd->priv;
432         int block, page;
433         int i;
434
435         block = (int)(addr >> this->erase_shift);
436         page = (int)(addr >> this->page_shift);
437         page &= this->page_mask;
438
439         i = ONENAND_CURRENT_BUFFERRAM(this);
440
441         /* Is there valid data? */
442         if (this->bufferram[i].block == block &&
443             this->bufferram[i].page == page && this->bufferram[i].valid)
444                 return 1;
445
446         return 0;
447 }
448
449 /**
450  * onenand_update_bufferram - [GENERIC] Update BufferRAM information
451  * @param mtd           MTD data structure
452  * @param addr          address to update
453  * @param valid         valid flag
454  *
455  * Update BufferRAM information
456  */
457 static int onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
458                                     int valid)
459 {
460         struct onenand_chip *this = mtd->priv;
461         int block, page;
462         int i;
463
464         block = (int)(addr >> this->erase_shift);
465         page = (int)(addr >> this->page_shift);
466         page &= this->page_mask;
467
468         /* Invalidate BufferRAM */
469         for (i = 0; i < MAX_BUFFERRAM; i++) {
470                 if (this->bufferram[i].block == block &&
471                     this->bufferram[i].page == page)
472                         this->bufferram[i].valid = 0;
473         }
474
475         /* Update BufferRAM */
476         i = ONENAND_CURRENT_BUFFERRAM(this);
477         this->bufferram[i].block = block;
478         this->bufferram[i].page = page;
479         this->bufferram[i].valid = valid;
480
481         return 0;
482 }
483
484 /**
485  * onenand_get_device - [GENERIC] Get chip for selected access
486  * @param mtd           MTD device structure
487  * @param new_state     the state which is requested
488  *
489  * Get the device and lock it for exclusive access
490  */
491 static void onenand_get_device(struct mtd_info *mtd, int new_state)
492 {
493         /* Do nothing */
494 }
495
496 /**
497  * onenand_release_device - [GENERIC] release chip
498  * @param mtd           MTD device structure
499  *
500  * Deselect, release chip lock and wake up anyone waiting on the device
501  */
502 static void onenand_release_device(struct mtd_info *mtd)
503 {
504         /* Do nothing */
505 }
506
507 /**
508  * onenand_read_ecc - [MTD Interface] Read data with ECC
509  * @param mtd           MTD device structure
510  * @param from          offset to read from
511  * @param len           number of bytes to read
512  * @param retlen        pointer to variable to store the number of read bytes
513  * @param buf           the databuffer to put data
514  * @param oob_buf       filesystem supplied oob data buffer
515  * @param oobsel        oob selection structure
516  *
517  * OneNAND read with ECC
518  */
519 static int onenand_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
520                             size_t * retlen, u_char * buf,
521                             u_char * oob_buf, struct nand_oobinfo *oobsel)
522 {
523         struct onenand_chip *this = mtd->priv;
524         int read = 0, column;
525         int thislen;
526         int ret = 0;
527
528         MTDDEBUG (MTD_DEBUG_LEVEL3, "onenand_read_ecc: "
529                   "from = 0x%08x, len = %i\n",
530                   (unsigned int)from, (int)len);
531
532         /* Do not allow reads past end of device */
533         if ((from + len) > mtd->size) {
534                 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_read_ecc: "
535                           "Attempt read beyond end of device\n");
536                 *retlen = 0;
537                 return -EINVAL;
538         }
539
540         /* Grab the lock and see if the device is available */
541         onenand_get_device(mtd, FL_READING);
542
543         while (read < len) {
544                 thislen = min_t(int, mtd->oobblock, len - read);
545
546                 column = from & (mtd->oobblock - 1);
547                 if (column + thislen > mtd->oobblock)
548                         thislen = mtd->oobblock - column;
549
550                 if (!onenand_check_bufferram(mtd, from)) {
551                         this->command(mtd, ONENAND_CMD_READ, from,
552                                       mtd->oobblock);
553                         ret = this->wait(mtd, FL_READING);
554                         /* First copy data and check return value for ECC handling */
555                         onenand_update_bufferram(mtd, from, 1);
556                 }
557
558                 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column,
559                                      thislen);
560
561                 read += thislen;
562                 if (read == len)
563                         break;
564
565                 if (ret) {
566                         MTDDEBUG (MTD_DEBUG_LEVEL0,
567                                   "onenand_read_ecc: read failed = %d\n", ret);
568                         break;
569                 }
570
571                 from += thislen;
572                 buf += thislen;
573         }
574
575         /* Deselect and wake up anyone waiting on the device */
576         onenand_release_device(mtd);
577
578         /*
579          * Return success, if no ECC failures, else -EBADMSG
580          * fs driver will take care of that, because
581          * retlen == desired len and result == -EBADMSG
582          */
583         *retlen = read;
584         return ret;
585 }
586
587 /**
588  * onenand_read - [MTD Interface] MTD compability function for onenand_read_ecc
589  * @param mtd           MTD device structure
590  * @param from          offset to read from
591  * @param len           number of bytes to read
592  * @param retlen        pointer to variable to store the number of read bytes
593  * @param buf           the databuffer to put data
594  *
595  * This function simply calls onenand_read_ecc with oob buffer and oobsel = NULL
596 */
597 int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
598                  size_t * retlen, u_char * buf)
599 {
600         return onenand_read_ecc(mtd, from, len, retlen, buf, NULL, NULL);
601 }
602
603 /**
604  * onenand_read_oob - [MTD Interface] OneNAND read out-of-band
605  * @param mtd           MTD device structure
606  * @param from          offset to read from
607  * @param len           number of bytes to read
608  * @param retlen        pointer to variable to store the number of read bytes
609  * @param buf           the databuffer to put data
610  *
611  * OneNAND read out-of-band data from the spare area
612  */
613 int onenand_read_oob(struct mtd_info *mtd, loff_t from, size_t len,
614                      size_t * retlen, u_char * buf)
615 {
616         struct onenand_chip *this = mtd->priv;
617         int read = 0, thislen, column;
618         int ret = 0;
619
620         MTDDEBUG (MTD_DEBUG_LEVEL3, "onenand_read_oob: "
621                   "from = 0x%08x, len = %i\n",
622                   (unsigned int)from, (int)len);
623
624         /* Initialize return length value */
625         *retlen = 0;
626
627         /* Do not allow reads past end of device */
628         if (unlikely((from + len) > mtd->size)) {
629                 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_read_oob: "
630                           "Attempt read beyond end of device\n");
631                 return -EINVAL;
632         }
633
634         /* Grab the lock and see if the device is available */
635         onenand_get_device(mtd, FL_READING);
636
637         column = from & (mtd->oobsize - 1);
638
639         while (read < len) {
640                 thislen = mtd->oobsize - column;
641                 thislen = min_t(int, thislen, len);
642
643                 this->command(mtd, ONENAND_CMD_READOOB, from, mtd->oobsize);
644
645                 onenand_update_bufferram(mtd, from, 0);
646
647                 ret = this->wait(mtd, FL_READING);
648                 /* First copy data and check return value for ECC handling */
649
650                 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column,
651                                      thislen);
652
653                 read += thislen;
654                 if (read == len)
655                         break;
656
657                 if (ret) {
658                         MTDDEBUG (MTD_DEBUG_LEVEL0,
659                                   "onenand_read_oob: read failed = %d\n", ret);
660                         break;
661                 }
662
663                 buf += thislen;
664                 /* Read more? */
665                 if (read < len) {
666                         /* Page size */
667                         from += mtd->oobblock;
668                         column = 0;
669                 }
670         }
671
672         /* Deselect and wake up anyone waiting on the device */
673         onenand_release_device(mtd);
674
675         *retlen = read;
676         return ret;
677 }
678
679 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
680 /**
681  * onenand_verify_page - [GENERIC] verify the chip contents after a write
682  * @param mtd           MTD device structure
683  * @param buf           the databuffer to verify
684  *
685  * Check DataRAM area directly
686  */
687 static int onenand_verify_page(struct mtd_info *mtd, u_char * buf,
688                                loff_t addr)
689 {
690         struct onenand_chip *this = mtd->priv;
691         void __iomem *dataram0, *dataram1;
692         int ret = 0;
693
694         this->command(mtd, ONENAND_CMD_READ, addr, mtd->oobblock);
695
696         ret = this->wait(mtd, FL_READING);
697         if (ret)
698                 return ret;
699
700         onenand_update_bufferram(mtd, addr, 1);
701
702         /* Check, if the two dataram areas are same */
703         dataram0 = this->base + ONENAND_DATARAM;
704         dataram1 = dataram0 + mtd->oobblock;
705
706         if (memcmp(dataram0, dataram1, mtd->oobblock))
707                 return -EBADMSG;
708
709         return 0;
710 }
711 #else
712 #define onenand_verify_page(...)        (0)
713 #endif
714
715 #define NOTALIGNED(x)   ((x & (mtd->oobblock - 1)) != 0)
716
717 /**
718  * onenand_write_ecc - [MTD Interface] OneNAND write with ECC
719  * @param mtd           MTD device structure
720  * @param to            offset to write to
721  * @param len           number of bytes to write
722  * @param retlen        pointer to variable to store the number of written bytes
723  * @param buf           the data to write
724  * @param eccbuf        filesystem supplied oob data buffer
725  * @param oobsel        oob selection structure
726  *
727  * OneNAND write with ECC
728  */
729 static int onenand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len,
730                              size_t * retlen, const u_char * buf,
731                              u_char * eccbuf, struct nand_oobinfo *oobsel)
732 {
733         struct onenand_chip *this = mtd->priv;
734         int written = 0;
735         int ret = 0;
736
737         MTDDEBUG (MTD_DEBUG_LEVEL3, "onenand_write_ecc: "
738                   "to = 0x%08x, len = %i\n",
739                   (unsigned int)to, (int)len);
740
741         /* Initialize retlen, in case of early exit */
742         *retlen = 0;
743
744         /* Do not allow writes past end of device */
745         if (unlikely((to + len) > mtd->size)) {
746                 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_write_ecc: "
747                           "Attempt write to past end of device\n");
748                 return -EINVAL;
749         }
750
751         /* Reject writes, which are not page aligned */
752         if (unlikely(NOTALIGNED(to)) || unlikely(NOTALIGNED(len))) {
753                 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_write_ecc: "
754                           "Attempt to write not page aligned data\n");
755                 return -EINVAL;
756         }
757
758         /* Grab the lock and see if the device is available */
759         onenand_get_device(mtd, FL_WRITING);
760
761         /* Loop until all data write */
762         while (written < len) {
763                 int thislen = min_t(int, mtd->oobblock, len - written);
764
765                 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobblock);
766
767                 this->write_bufferram(mtd, ONENAND_DATARAM, buf, 0, thislen);
768                 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0,
769                                       mtd->oobsize);
770
771                 this->command(mtd, ONENAND_CMD_PROG, to, mtd->oobblock);
772
773                 onenand_update_bufferram(mtd, to, 1);
774
775                 ret = this->wait(mtd, FL_WRITING);
776                 if (ret) {
777                         MTDDEBUG (MTD_DEBUG_LEVEL0,
778                                   "onenand_write_ecc: write filaed %d\n", ret);
779                         break;
780                 }
781
782                 written += thislen;
783
784                 /* Only check verify write turn on */
785                 ret = onenand_verify_page(mtd, (u_char *) buf, to);
786                 if (ret) {
787                         MTDDEBUG (MTD_DEBUG_LEVEL0,
788                                   "onenand_write_ecc: verify failed %d\n", ret);
789                         break;
790                 }
791
792                 if (written == len)
793                         break;
794
795                 to += thislen;
796                 buf += thislen;
797         }
798
799         /* Deselect and wake up anyone waiting on the device */
800         onenand_release_device(mtd);
801
802         *retlen = written;
803
804         return ret;
805 }
806
807 /**
808  * onenand_write - [MTD Interface] compability function for onenand_write_ecc
809  * @param mtd           MTD device structure
810  * @param to            offset to write to
811  * @param len           number of bytes to write
812  * @param retlen        pointer to variable to store the number of written bytes
813  * @param buf           the data to write
814  *
815  * This function simply calls onenand_write_ecc
816  * with oob buffer and oobsel = NULL
817  */
818 int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
819                   size_t * retlen, const u_char * buf)
820 {
821         return onenand_write_ecc(mtd, to, len, retlen, buf, NULL, NULL);
822 }
823
824 /**
825  * onenand_write_oob - [MTD Interface] OneNAND write out-of-band
826  * @param mtd           MTD device structure
827  * @param to            offset to write to
828  * @param len           number of bytes to write
829  * @param retlen        pointer to variable to store the number of written bytes
830  * @param buf           the data to write
831  *
832  * OneNAND write out-of-band
833  */
834 int onenand_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
835                       size_t * retlen, const u_char * buf)
836 {
837         struct onenand_chip *this = mtd->priv;
838         int column, status;
839         int written = 0;
840
841         MTDDEBUG (MTD_DEBUG_LEVEL3, "onenand_write_oob: "
842                   "to = 0x%08x, len = %i\n",
843                   (unsigned int)to, (int)len);
844
845         /* Initialize retlen, in case of early exit */
846         *retlen = 0;
847
848         /* Do not allow writes past end of device */
849         if (unlikely((to + len) > mtd->size)) {
850                 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_write_oob: "
851                           "Attempt write to past end of device\n");
852                 return -EINVAL;
853         }
854
855         /* Grab the lock and see if the device is available */
856         onenand_get_device(mtd, FL_WRITING);
857
858         /* Loop until all data write */
859         while (written < len) {
860                 int thislen = min_t(int, mtd->oobsize, len - written);
861
862                 column = to & (mtd->oobsize - 1);
863
864                 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize);
865
866                 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0,
867                                       mtd->oobsize);
868                 this->write_bufferram(mtd, ONENAND_SPARERAM, buf, column,
869                                       thislen);
870
871                 this->command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
872
873                 onenand_update_bufferram(mtd, to, 0);
874
875                 status = this->wait(mtd, FL_WRITING);
876                 if (status)
877                         break;
878
879                 written += thislen;
880                 if (written == len)
881                         break;
882
883                 to += thislen;
884                 buf += thislen;
885         }
886
887         /* Deselect and wake up anyone waiting on the device */
888         onenand_release_device(mtd);
889
890         *retlen = written;
891
892         return 0;
893 }
894
895 /**
896  * onenand_erase - [MTD Interface] erase block(s)
897  * @param mtd           MTD device structure
898  * @param instr         erase instruction
899  *
900  * Erase one ore more blocks
901  */
902 int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
903 {
904         struct onenand_chip *this = mtd->priv;
905         unsigned int block_size;
906         loff_t addr;
907         int len;
908         int ret = 0;
909
910         MTDDEBUG (MTD_DEBUG_LEVEL3, "onenand_erase: start = 0x%08x, len = %i\n",
911                   (unsigned int)instr->addr, (unsigned int)instr->len);
912
913         block_size = (1 << this->erase_shift);
914
915         /* Start address must align on block boundary */
916         if (unlikely(instr->addr & (block_size - 1))) {
917                 MTDDEBUG (MTD_DEBUG_LEVEL0,
918                           "onenand_erase: Unaligned address\n");
919                 return -EINVAL;
920         }
921
922         /* Length must align on block boundary */
923         if (unlikely(instr->len & (block_size - 1))) {
924                 MTDDEBUG (MTD_DEBUG_LEVEL0,
925                           "onenand_erase: Length not block aligned\n");
926                 return -EINVAL;
927         }
928
929         /* Do not allow erase past end of device */
930         if (unlikely((instr->len + instr->addr) > mtd->size)) {
931                 MTDDEBUG (MTD_DEBUG_LEVEL0,
932                           "onenand_erase: Erase past end of device\n");
933                 return -EINVAL;
934         }
935
936         instr->fail_addr = 0xffffffff;
937
938         /* Grab the lock and see if the device is available */
939         onenand_get_device(mtd, FL_ERASING);
940
941         /* Loop throught the pages */
942         len = instr->len;
943         addr = instr->addr;
944
945         instr->state = MTD_ERASING;
946
947         while (len) {
948
949                 /* TODO Check badblock */
950
951                 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
952
953                 ret = this->wait(mtd, FL_ERASING);
954                 /* Check, if it is write protected */
955                 if (ret) {
956                         if (ret == -EPERM)
957                                 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_erase: "
958                                           "Device is write protected!!!\n");
959                         else
960                                 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_erase: "
961                                           "Failed erase, block %d\n",
962                                           (unsigned)(addr >> this->erase_shift));
963                         instr->state = MTD_ERASE_FAILED;
964                         instr->fail_addr = addr;
965                         goto erase_exit;
966                 }
967
968                 len -= block_size;
969                 addr += block_size;
970         }
971
972         instr->state = MTD_ERASE_DONE;
973
974       erase_exit:
975
976         ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO;
977         /* Do call back function */
978         if (!ret)
979                 mtd_erase_callback(instr);
980
981         /* Deselect and wake up anyone waiting on the device */
982         onenand_release_device(mtd);
983
984         return ret;
985 }
986
987 /**
988  * onenand_sync - [MTD Interface] sync
989  * @param mtd           MTD device structure
990  *
991  * Sync is actually a wait for chip ready function
992  */
993 void onenand_sync(struct mtd_info *mtd)
994 {
995         MTDDEBUG (MTD_DEBUG_LEVEL3, "onenand_sync: called\n");
996
997         /* Grab the lock and see if the device is available */
998         onenand_get_device(mtd, FL_SYNCING);
999
1000         /* Release it and go back */
1001         onenand_release_device(mtd);
1002 }
1003
1004 /**
1005  * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
1006  * @param mtd           MTD device structure
1007  * @param ofs           offset relative to mtd start
1008  */
1009 int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
1010 {
1011         /*
1012          * TODO
1013          * 1. Bad block table (BBT)
1014          *   -> using NAND BBT to support JFFS2
1015          * 2. Bad block management (BBM)
1016          *   -> bad block replace scheme
1017          *
1018          * Currently we do nothing
1019          */
1020         return 0;
1021 }
1022
1023 /**
1024  * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
1025  * @param mtd           MTD device structure
1026  * @param ofs           offset relative to mtd start
1027  */
1028 int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
1029 {
1030         /* see above */
1031         return 0;
1032 }
1033
1034 /**
1035  * onenand_unlock - [MTD Interface] Unlock block(s)
1036  * @param mtd           MTD device structure
1037  * @param ofs           offset relative to mtd start
1038  * @param len           number of bytes to unlock
1039  *
1040  * Unlock one or more blocks
1041  */
1042 int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len)
1043 {
1044         struct onenand_chip *this = mtd->priv;
1045         int start, end, block, value, status;
1046
1047         start = ofs >> this->erase_shift;
1048         end = len >> this->erase_shift;
1049
1050         /* Continuous lock scheme */
1051         if (this->options & ONENAND_CONT_LOCK) {
1052                 /* Set start block address */
1053                 this->write_word(start,
1054                                  this->base + ONENAND_REG_START_BLOCK_ADDRESS);
1055                 /* Set end block address */
1056                 this->write_word(end - 1,
1057                                  this->base + ONENAND_REG_END_BLOCK_ADDRESS);
1058                 /* Write unlock command */
1059                 this->command(mtd, ONENAND_CMD_UNLOCK, 0, 0);
1060
1061                 /* There's no return value */
1062                 this->wait(mtd, FL_UNLOCKING);
1063
1064                 /* Sanity check */
1065                 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
1066                        & ONENAND_CTRL_ONGO)
1067                         continue;
1068
1069                 /* Check lock status */
1070                 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
1071                 if (!(status & ONENAND_WP_US))
1072                         printk(KERN_ERR "wp status = 0x%x\n", status);
1073
1074                 return 0;
1075         }
1076
1077         /* Block lock scheme */
1078         for (block = start; block < end; block++) {
1079                 /* Set start block address */
1080                 this->write_word(block,
1081                                  this->base + ONENAND_REG_START_BLOCK_ADDRESS);
1082                 /* Write unlock command */
1083                 this->command(mtd, ONENAND_CMD_UNLOCK, 0, 0);
1084
1085                 /* There's no return value */
1086                 this->wait(mtd, FL_UNLOCKING);
1087
1088                 /* Sanity check */
1089                 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
1090                        & ONENAND_CTRL_ONGO)
1091                         continue;
1092
1093                 /* Set block address for read block status */
1094                 value = onenand_block_address(this->device_id, block);
1095                 this->write_word(value,
1096                                  this->base + ONENAND_REG_START_ADDRESS1);
1097
1098                 /* Check lock status */
1099                 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
1100                 if (!(status & ONENAND_WP_US))
1101                         printk(KERN_ERR "block = %d, wp status = 0x%x\n",
1102                                block, status);
1103         }
1104
1105         return 0;
1106 }
1107
1108 /**
1109  * onenand_print_device_info - Print device ID
1110  * @param device        device ID
1111  *
1112  * Print device ID
1113  */
1114 char * onenand_print_device_info(int device)
1115 {
1116         int vcc, demuxed, ddp, density;
1117         char *dev_info = malloc(80);
1118
1119         vcc = device & ONENAND_DEVICE_VCC_MASK;
1120         demuxed = device & ONENAND_DEVICE_IS_DEMUX;
1121         ddp = device & ONENAND_DEVICE_IS_DDP;
1122         density = device >> ONENAND_DEVICE_DENSITY_SHIFT;
1123         sprintf(dev_info, "%sOneNAND%s %dMB %sV 16-bit (0x%02x)",
1124                demuxed ? "" : "Muxed ",
1125                ddp ? "(DDP)" : "",
1126                (16 << density), vcc ? "2.65/3.3" : "1.8", device);
1127
1128         return dev_info;
1129 }
1130
1131 static const struct onenand_manufacturers onenand_manuf_ids[] = {
1132         {ONENAND_MFR_SAMSUNG, "Samsung"},
1133         {ONENAND_MFR_UNKNOWN, "Unknown"}
1134 };
1135
1136 /**
1137  * onenand_check_maf - Check manufacturer ID
1138  * @param manuf         manufacturer ID
1139  *
1140  * Check manufacturer ID
1141  */
1142 static int onenand_check_maf(int manuf)
1143 {
1144         int i;
1145
1146         for (i = 0; onenand_manuf_ids[i].id; i++) {
1147                 if (manuf == onenand_manuf_ids[i].id)
1148                         break;
1149         }
1150
1151 #ifdef ONENAND_DEBUG
1152         printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n",
1153                onenand_manuf_ids[i].name, manuf);
1154 #endif
1155
1156         return (i != ONENAND_MFR_UNKNOWN);
1157 }
1158
1159 /**
1160  * onenand_probe - [OneNAND Interface] Probe the OneNAND device
1161  * @param mtd           MTD device structure
1162  *
1163  * OneNAND detection method:
1164  *   Compare the the values from command with ones from register
1165  */
1166 static int onenand_probe(struct mtd_info *mtd)
1167 {
1168         struct onenand_chip *this = mtd->priv;
1169         int bram_maf_id, bram_dev_id, maf_id, dev_id;
1170         int version_id;
1171         int density;
1172
1173         /* Send the command for reading device ID from BootRAM */
1174         this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
1175
1176         /* Read manufacturer and device IDs from BootRAM */
1177         bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0);
1178         bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2);
1179
1180         /* Check manufacturer ID */
1181         if (onenand_check_maf(bram_maf_id))
1182                 return -ENXIO;
1183
1184         /* Reset OneNAND to read default register values */
1185         this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM);
1186
1187         {
1188                 int i;
1189                 for (i = 0; i < 10000; i++) ;
1190         }
1191
1192         /* Read manufacturer and device IDs from Register */
1193         maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
1194         dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
1195
1196         /* Check OneNAND device */
1197         if (maf_id != bram_maf_id || dev_id != bram_dev_id)
1198                 return -ENXIO;
1199
1200         /* FIXME : Current OneNAND MTD doesn't support Flex-OneNAND */
1201         if (dev_id & (1 << 9)) {
1202                 printk("Not yet support Flex-OneNAND\n");
1203                 return -ENXIO;
1204         }
1205
1206         /* Flash device information */
1207         mtd->name = onenand_print_device_info(dev_id);
1208         this->device_id = dev_id;
1209
1210         density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT;
1211         this->chipsize = (16 << density) << 20;
1212
1213         /* OneNAND page size & block size */
1214         /* The data buffer size is equal to page size */
1215         mtd->oobblock =
1216             this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
1217         mtd->oobsize = mtd->oobblock >> 5;
1218         /* Pagers per block is always 64 in OneNAND */
1219         mtd->erasesize = mtd->oobblock << 6;
1220
1221         this->erase_shift = ffs(mtd->erasesize) - 1;
1222         this->page_shift = ffs(mtd->oobblock) - 1;
1223         this->ppb_shift = (this->erase_shift - this->page_shift);
1224         this->page_mask = (mtd->erasesize / mtd->oobblock) - 1;
1225
1226         /* REVIST: Multichip handling */
1227
1228         mtd->size = this->chipsize;
1229
1230         /* Version ID */
1231         version_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
1232 #ifdef ONENAND_DEBUG
1233         printk(KERN_DEBUG "OneNAND version = 0x%04x\n", version_id);
1234 #endif
1235
1236         /* Lock scheme */
1237         if (density <= ONENAND_DEVICE_DENSITY_512Mb &&
1238             !(version_id >> ONENAND_VERSION_PROCESS_SHIFT)) {
1239                 printk(KERN_INFO "Lock scheme is Continues Lock\n");
1240                 this->options |= ONENAND_CONT_LOCK;
1241         }
1242
1243         mtd->erase = onenand_erase;
1244         mtd->read = onenand_read;
1245         mtd->write = onenand_write;
1246         mtd->read_ecc = onenand_read_ecc;
1247         mtd->write_ecc = onenand_write_ecc;
1248         mtd->read_oob = onenand_read_oob;
1249         mtd->write_oob = onenand_write_oob;
1250         mtd->sync = onenand_sync;
1251         mtd->block_isbad = onenand_block_isbad;
1252         mtd->block_markbad = onenand_block_markbad;
1253
1254         return 0;
1255 }
1256
1257 /**
1258  * onenand_scan - [OneNAND Interface] Scan for the OneNAND device
1259  * @param mtd           MTD device structure
1260  * @param maxchips      Number of chips to scan for
1261  *
1262  * This fills out all the not initialized function pointers
1263  * with the defaults.
1264  * The flash ID is read and the mtd/chip structures are
1265  * filled with the appropriate values.
1266  */
1267 int onenand_scan(struct mtd_info *mtd, int maxchips)
1268 {
1269         struct onenand_chip *this = mtd->priv;
1270
1271         if (!this->read_word)
1272                 this->read_word = onenand_readw;
1273         if (!this->write_word)
1274                 this->write_word = onenand_writew;
1275
1276         if (!this->command)
1277                 this->command = onenand_command;
1278         if (!this->wait)
1279                 this->wait = onenand_wait;
1280
1281         if (!this->read_bufferram)
1282                 this->read_bufferram = onenand_read_bufferram;
1283         if (!this->write_bufferram)
1284                 this->write_bufferram = onenand_write_bufferram;
1285
1286         if (onenand_probe(mtd))
1287                 return -ENXIO;
1288
1289         /* Set Sync. Burst Read after probing */
1290         if (this->mmcontrol) {
1291                 printk(KERN_INFO "OneNAND Sync. Burst Read support\n");
1292                 this->read_bufferram = onenand_sync_read_bufferram;
1293         }
1294
1295         onenand_unlock(mtd, 0, mtd->size);
1296
1297         return onenand_default_bbt(mtd);
1298 }
1299
1300 /**
1301  * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device
1302  * @param mtd           MTD device structure
1303  */
1304 void onenand_release(struct mtd_info *mtd)
1305 {
1306 }
1307
1308 #endif /* CONFIG_CMD_ONENAND */