1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/moduleparam.h>
26#include <linux/slab.h>
27#include <linux/sched.h>
28#include <linux/delay.h>
29#include <linux/interrupt.h>
30#include <linux/jiffies.h>
31#include <linux/mtd/mtd.h>
32#include <linux/mtd/onenand.h>
33#include <linux/mtd/partitions.h>
34
35#include <asm/io.h>
36
37
38
39
40
41#define MB_ERASE_MIN_BLK_COUNT 2
42#define MB_ERASE_MAX_BLK_COUNT 64
43
44
45static int flex_bdry[MAX_DIES * 2] = { -1, 0, -1, 0 };
46
47module_param_array(flex_bdry, int, NULL, 0400);
48MODULE_PARM_DESC(flex_bdry, "SLC Boundary information for Flex-OneNAND"
49 "Syntax:flex_bdry=DIE_BDRY,LOCK,..."
50 "DIE_BDRY: SLC boundary of the die"
51 "LOCK: Locking information for SLC boundary"
52 " : 0->Set boundary in unlocked status"
53 " : 1->Set boundary in locked status");
54
55
56static int otp;
57
58module_param(otp, int, 0400);
59MODULE_PARM_DESC(otp, "Corresponding behaviour of OneNAND in OTP"
60 "Syntax : otp=LOCK_TYPE"
61 "LOCK_TYPE : Keys issued, for specific OTP Lock type"
62 " : 0 -> Default (No Blocks Locked)"
63 " : 1 -> OTP Block lock"
64 " : 2 -> 1st Block lock"
65 " : 3 -> BOTH OTP Block and 1st Block lock");
66
67
68
69
70
71static struct nand_ecclayout flexonenand_oob_128 = {
72 .eccbytes = 64,
73 .eccpos = {
74 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
75 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
76 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
77 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
78 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
79 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
80 102, 103, 104, 105
81 },
82 .oobfree = {
83 {2, 4}, {18, 4}, {34, 4}, {50, 4},
84 {66, 4}, {82, 4}, {98, 4}, {114, 4}
85 }
86};
87
88
89
90
91
92
93
94
95
96
97
98
99static struct nand_ecclayout onenand_oob_128 = {
100 .eccbytes = 64,
101 .eccpos = {
102 7, 8, 9, 10, 11, 12, 13, 14, 15,
103 23, 24, 25, 26, 27, 28, 29, 30, 31,
104 39, 40, 41, 42, 43, 44, 45, 46, 47,
105 55, 56, 57, 58, 59, 60, 61, 62, 63,
106 71, 72, 73, 74, 75, 76, 77, 78, 79,
107 87, 88, 89, 90, 91, 92, 93, 94, 95,
108 103, 104, 105, 106, 107, 108, 109, 110, 111,
109 119
110 },
111 .oobfree = {
112 {2, 3}, {18, 3}, {34, 3}, {50, 3},
113 {66, 3}, {82, 3}, {98, 3}, {114, 3}
114 }
115};
116
117
118
119
120static struct nand_ecclayout onenand_oob_64 = {
121 .eccbytes = 20,
122 .eccpos = {
123 8, 9, 10, 11, 12,
124 24, 25, 26, 27, 28,
125 40, 41, 42, 43, 44,
126 56, 57, 58, 59, 60,
127 },
128 .oobfree = {
129 {2, 3}, {14, 2}, {18, 3}, {30, 2},
130 {34, 3}, {46, 2}, {50, 3}, {62, 2}
131 }
132};
133
134
135
136
137static struct nand_ecclayout onenand_oob_32 = {
138 .eccbytes = 10,
139 .eccpos = {
140 8, 9, 10, 11, 12,
141 24, 25, 26, 27, 28,
142 },
143 .oobfree = { {2, 3}, {14, 2}, {18, 3}, {30, 2} }
144};
145
146static const unsigned char ffchars[] = {
147 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
148 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
149 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
150 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
151 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
152 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
153 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
154 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
155 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
156 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
157 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
158 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
159 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
160 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
161 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
162 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
163};
164
165
166
167
168
169
170
171static unsigned short onenand_readw(void __iomem *addr)
172{
173 return readw(addr);
174}
175
176
177
178
179
180
181
182
183static void onenand_writew(unsigned short value, void __iomem *addr)
184{
185 writew(value, addr);
186}
187
188
189
190
191
192
193
194
195
196static int onenand_block_address(struct onenand_chip *this, int block)
197{
198
199 if (block & this->density_mask)
200 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask);
201
202 return block;
203}
204
205
206
207
208
209
210
211
212
213static int onenand_bufferram_address(struct onenand_chip *this, int block)
214{
215
216 if (block & this->density_mask)
217 return ONENAND_DDP_CHIP1;
218
219 return ONENAND_DDP_CHIP0;
220}
221
222
223
224
225
226
227
228
229
230static int onenand_page_address(int page, int sector)
231{
232
233 int fpa, fsa;
234
235 fpa = page & ONENAND_FPA_MASK;
236 fsa = sector & ONENAND_FSA_MASK;
237
238 return ((fpa << ONENAND_FPA_SHIFT) | fsa);
239}
240
241
242
243
244
245
246
247
248
249
250static int onenand_buffer_address(int dataram1, int sectors, int count)
251{
252 int bsa, bsc;
253
254
255 bsa = sectors & ONENAND_BSA_MASK;
256
257 if (dataram1)
258 bsa |= ONENAND_BSA_DATARAM1;
259 else
260 bsa |= ONENAND_BSA_DATARAM0;
261
262
263 bsc = count & ONENAND_BSC_MASK;
264
265 return ((bsa << ONENAND_BSA_SHIFT) | bsc);
266}
267
268
269
270
271
272
273static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr)
274{
275 unsigned boundary, blk, die = 0;
276
277 if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) {
278 die = 1;
279 addr -= this->diesize[0];
280 }
281
282 boundary = this->boundary[die];
283
284 blk = addr >> (this->erase_shift - 1);
285 if (blk > boundary)
286 blk = (blk + boundary + 1) >> 1;
287
288 blk += die ? this->density_mask : 0;
289 return blk;
290}
291
292inline unsigned onenand_block(struct onenand_chip *this, loff_t addr)
293{
294 if (!FLEXONENAND(this))
295 return addr >> this->erase_shift;
296 return flexonenand_block(this, addr);
297}
298
299
300
301
302
303
304
305
306static loff_t flexonenand_addr(struct onenand_chip *this, int block)
307{
308 loff_t ofs = 0;
309 int die = 0, boundary;
310
311 if (ONENAND_IS_DDP(this) && block >= this->density_mask) {
312 block -= this->density_mask;
313 die = 1;
314 ofs = this->diesize[0];
315 }
316
317 boundary = this->boundary[die];
318 ofs += (loff_t)block << (this->erase_shift - 1);
319 if (block > (boundary + 1))
320 ofs += (loff_t)(block - boundary - 1) << (this->erase_shift - 1);
321 return ofs;
322}
323
324loff_t onenand_addr(struct onenand_chip *this, int block)
325{
326 if (!FLEXONENAND(this))
327 return (loff_t)block << this->erase_shift;
328 return flexonenand_addr(this, block);
329}
330EXPORT_SYMBOL(onenand_addr);
331
332
333
334
335
336
337
338static inline int onenand_get_density(int dev_id)
339{
340 int density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT;
341 return (density & ONENAND_DEVICE_DENSITY_MASK);
342}
343
344
345
346
347
348
349int flexonenand_region(struct mtd_info *mtd, loff_t addr)
350{
351 int i;
352
353 for (i = 0; i < mtd->numeraseregions; i++)
354 if (addr < mtd->eraseregions[i].offset)
355 break;
356 return i - 1;
357}
358EXPORT_SYMBOL(flexonenand_region);
359
360
361
362
363
364
365
366
367
368
369
370static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)
371{
372 struct onenand_chip *this = mtd->priv;
373 int value, block, page;
374
375
376 switch (cmd) {
377 case ONENAND_CMD_UNLOCK:
378 case ONENAND_CMD_LOCK:
379 case ONENAND_CMD_LOCK_TIGHT:
380 case ONENAND_CMD_UNLOCK_ALL:
381 block = -1;
382 page = -1;
383 break;
384
385 case FLEXONENAND_CMD_PI_ACCESS:
386
387 block = addr * this->density_mask;
388 page = -1;
389 break;
390
391 case ONENAND_CMD_ERASE:
392 case ONENAND_CMD_MULTIBLOCK_ERASE:
393 case ONENAND_CMD_ERASE_VERIFY:
394 case ONENAND_CMD_BUFFERRAM:
395 case ONENAND_CMD_OTP_ACCESS:
396 block = onenand_block(this, addr);
397 page = -1;
398 break;
399
400 case FLEXONENAND_CMD_READ_PI:
401 cmd = ONENAND_CMD_READ;
402 block = addr * this->density_mask;
403 page = 0;
404 break;
405
406 default:
407 block = onenand_block(this, addr);
408 if (FLEXONENAND(this))
409 page = (int) (addr - onenand_addr(this, block))>>\
410 this->page_shift;
411 else
412 page = (int) (addr >> this->page_shift);
413 if (ONENAND_IS_2PLANE(this)) {
414
415 block &= ~1;
416
417 if (addr & this->writesize)
418 block++;
419 page >>= 1;
420 }
421 page &= this->page_mask;
422 break;
423 }
424
425
426 if (cmd == ONENAND_CMD_BUFFERRAM) {
427
428 value = onenand_bufferram_address(this, block);
429 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
430
431 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
432
433 ONENAND_SET_BUFFERRAM0(this);
434 else
435
436 ONENAND_SET_NEXT_BUFFERRAM(this);
437
438 return 0;
439 }
440
441 if (block != -1) {
442
443 value = onenand_block_address(this, block);
444 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
445
446
447 value = onenand_bufferram_address(this, block);
448 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
449 }
450
451 if (page != -1) {
452
453 int sectors = 0, count = 0;
454 int dataram;
455
456 switch (cmd) {
457 case FLEXONENAND_CMD_RECOVER_LSB:
458 case ONENAND_CMD_READ:
459 case ONENAND_CMD_READOOB:
460 if (ONENAND_IS_4KB_PAGE(this))
461
462 dataram = ONENAND_SET_BUFFERRAM0(this);
463 else
464 dataram = ONENAND_SET_NEXT_BUFFERRAM(this);
465 break;
466
467 default:
468 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
469 cmd = ONENAND_CMD_2X_PROG;
470 dataram = ONENAND_CURRENT_BUFFERRAM(this);
471 break;
472 }
473
474
475 value = onenand_page_address(page, sectors);
476 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8);
477
478
479 value = onenand_buffer_address(dataram, sectors, count);
480 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
481 }
482
483
484 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
485
486
487 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
488
489 return 0;
490}
491
492
493
494
495
496static inline int onenand_read_ecc(struct onenand_chip *this)
497{
498 int ecc, i, result = 0;
499
500 if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this))
501 return this->read_word(this->base + ONENAND_REG_ECC_STATUS);
502
503 for (i = 0; i < 4; i++) {
504 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2);
505 if (likely(!ecc))
506 continue;
507 if (ecc & FLEXONENAND_UNCORRECTABLE_ERROR)
508 return ONENAND_ECC_2BIT_ALL;
509 else
510 result = ONENAND_ECC_1BIT_ALL;
511 }
512
513 return result;
514}
515
516
517
518
519
520
521
522
523
524
525static int onenand_wait(struct mtd_info *mtd, int state)
526{
527 struct onenand_chip * this = mtd->priv;
528 unsigned long timeout;
529 unsigned int flags = ONENAND_INT_MASTER;
530 unsigned int interrupt = 0;
531 unsigned int ctrl;
532
533
534 timeout = jiffies + msecs_to_jiffies(20);
535 while (time_before(jiffies, timeout)) {
536 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
537
538 if (interrupt & flags)
539 break;
540
541 if (state != FL_READING && state != FL_PREPARING_ERASE)
542 cond_resched();
543 }
544
545 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
546
547 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
548
549
550
551
552
553
554 if (interrupt & ONENAND_INT_READ) {
555 int ecc = onenand_read_ecc(this);
556 if (ecc) {
557 if (ecc & ONENAND_ECC_2BIT_ALL) {
558 printk(KERN_ERR "%s: ECC error = 0x%04x\n",
559 __func__, ecc);
560 mtd->ecc_stats.failed++;
561 return -EBADMSG;
562 } else if (ecc & ONENAND_ECC_1BIT_ALL) {
563 printk(KERN_DEBUG "%s: correctable ECC error = 0x%04x\n",
564 __func__, ecc);
565 mtd->ecc_stats.corrected++;
566 }
567 }
568 } else if (state == FL_READING) {
569 printk(KERN_ERR "%s: read timeout! ctrl=0x%04x intr=0x%04x\n",
570 __func__, ctrl, interrupt);
571 return -EIO;
572 }
573
574 if (state == FL_PREPARING_ERASE && !(interrupt & ONENAND_INT_ERASE)) {
575 printk(KERN_ERR "%s: mb erase timeout! ctrl=0x%04x intr=0x%04x\n",
576 __func__, ctrl, interrupt);
577 return -EIO;
578 }
579
580 if (!(interrupt & ONENAND_INT_MASTER)) {
581 printk(KERN_ERR "%s: timeout! ctrl=0x%04x intr=0x%04x\n",
582 __func__, ctrl, interrupt);
583 return -EIO;
584 }
585
586
587 if (ctrl & ONENAND_CTRL_ERROR) {
588 printk(KERN_ERR "%s: controller error = 0x%04x\n",
589 __func__, ctrl);
590 if (ctrl & ONENAND_CTRL_LOCK)
591 printk(KERN_ERR "%s: it's locked error.\n", __func__);
592 return -EIO;
593 }
594
595 return 0;
596}
597
598
599
600
601
602
603
604
605static irqreturn_t onenand_interrupt(int irq, void *data)
606{
607 struct onenand_chip *this = data;
608
609
610 if (!this->complete.done)
611 complete(&this->complete);
612
613 return IRQ_HANDLED;
614}
615
616
617
618
619
620
621
622
623static int onenand_interrupt_wait(struct mtd_info *mtd, int state)
624{
625 struct onenand_chip *this = mtd->priv;
626
627 wait_for_completion(&this->complete);
628
629 return onenand_wait(mtd, state);
630}
631
632
633
634
635
636
637
638
639static int onenand_try_interrupt_wait(struct mtd_info *mtd, int state)
640{
641 struct onenand_chip *this = mtd->priv;
642 unsigned long remain, timeout;
643
644
645 this->wait = onenand_interrupt_wait;
646
647 timeout = msecs_to_jiffies(100);
648 remain = wait_for_completion_timeout(&this->complete, timeout);
649 if (!remain) {
650 printk(KERN_INFO "OneNAND: There's no interrupt. "
651 "We use the normal wait\n");
652
653
654 free_irq(this->irq, this);
655
656 this->wait = onenand_wait;
657 }
658
659 return onenand_wait(mtd, state);
660}
661
662
663
664
665
666
667
668
669
670static void onenand_setup_wait(struct mtd_info *mtd)
671{
672 struct onenand_chip *this = mtd->priv;
673 int syscfg;
674
675 init_completion(&this->complete);
676
677 if (this->irq <= 0) {
678 this->wait = onenand_wait;
679 return;
680 }
681
682 if (request_irq(this->irq, &onenand_interrupt,
683 IRQF_SHARED, "onenand", this)) {
684
685 this->wait = onenand_wait;
686 return;
687 }
688
689
690 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
691 syscfg |= ONENAND_SYS_CFG1_IOBE;
692 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
693
694 this->wait = onenand_try_interrupt_wait;
695}
696
697
698
699
700
701
702
703
704
705static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
706{
707 struct onenand_chip *this = mtd->priv;
708
709 if (ONENAND_CURRENT_BUFFERRAM(this)) {
710
711 if (area == ONENAND_DATARAM)
712 return this->writesize;
713 if (area == ONENAND_SPARERAM)
714 return mtd->oobsize;
715 }
716
717 return 0;
718}
719
720
721
722
723
724
725
726
727
728
729
730static int onenand_read_bufferram(struct mtd_info *mtd, int area,
731 unsigned char *buffer, int offset, size_t count)
732{
733 struct onenand_chip *this = mtd->priv;
734 void __iomem *bufferram;
735
736 bufferram = this->base + area;
737
738 bufferram += onenand_bufferram_offset(mtd, area);
739
740 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
741 unsigned short word;
742
743
744 count--;
745
746
747 word = this->read_word(bufferram + offset + count);
748 buffer[count] = (word & 0xff);
749 }
750
751 memcpy(buffer, bufferram + offset, count);
752
753 return 0;
754}
755
756
757
758
759
760
761
762
763
764
765
766static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
767 unsigned char *buffer, int offset, size_t count)
768{
769 struct onenand_chip *this = mtd->priv;
770 void __iomem *bufferram;
771
772 bufferram = this->base + area;
773
774 bufferram += onenand_bufferram_offset(mtd, area);
775
776 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
777
778 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
779 unsigned short word;
780
781
782 count--;
783
784
785 word = this->read_word(bufferram + offset + count);
786 buffer[count] = (word & 0xff);
787 }
788
789 memcpy(buffer, bufferram + offset, count);
790
791 this->mmcontrol(mtd, 0);
792
793 return 0;
794}
795
796
797
798
799
800
801
802
803
804
805
806static int onenand_write_bufferram(struct mtd_info *mtd, int area,
807 const unsigned char *buffer, int offset, size_t count)
808{
809 struct onenand_chip *this = mtd->priv;
810 void __iomem *bufferram;
811
812 bufferram = this->base + area;
813
814 bufferram += onenand_bufferram_offset(mtd, area);
815
816 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
817 unsigned short word;
818 int byte_offset;
819
820
821 count--;
822
823
824 byte_offset = offset + count;
825
826
827 word = this->read_word(bufferram + byte_offset);
828 word = (word & ~0xff) | buffer[count];
829 this->write_word(word, bufferram + byte_offset);
830 }
831
832 memcpy(bufferram + offset, buffer, count);
833
834 return 0;
835}
836
837
838
839
840
841
842
843
844
845static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr)
846{
847 struct onenand_chip *this = mtd->priv;
848 int blockpage, block, page;
849
850
851 block = (int) (addr >> this->erase_shift) & ~1;
852
853 if (addr & this->writesize)
854 block++;
855 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask;
856 blockpage = (block << 7) | page;
857
858 return blockpage;
859}
860
861
862
863
864
865
866
867
868
869static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
870{
871 struct onenand_chip *this = mtd->priv;
872 int blockpage, found = 0;
873 unsigned int i;
874
875 if (ONENAND_IS_2PLANE(this))
876 blockpage = onenand_get_2x_blockpage(mtd, addr);
877 else
878 blockpage = (int) (addr >> this->page_shift);
879
880
881 i = ONENAND_CURRENT_BUFFERRAM(this);
882 if (this->bufferram[i].blockpage == blockpage)
883 found = 1;
884 else {
885
886 i = ONENAND_NEXT_BUFFERRAM(this);
887 if (this->bufferram[i].blockpage == blockpage) {
888 ONENAND_SET_NEXT_BUFFERRAM(this);
889 found = 1;
890 }
891 }
892
893 if (found && ONENAND_IS_DDP(this)) {
894
895 int block = onenand_block(this, addr);
896 int value = onenand_bufferram_address(this, block);
897 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
898 }
899
900 return found;
901}
902
903
904
905
906
907
908
909
910
911static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
912 int valid)
913{
914 struct onenand_chip *this = mtd->priv;
915 int blockpage;
916 unsigned int i;
917
918 if (ONENAND_IS_2PLANE(this))
919 blockpage = onenand_get_2x_blockpage(mtd, addr);
920 else
921 blockpage = (int) (addr >> this->page_shift);
922
923
924 i = ONENAND_NEXT_BUFFERRAM(this);
925 if (this->bufferram[i].blockpage == blockpage)
926 this->bufferram[i].blockpage = -1;
927
928
929 i = ONENAND_CURRENT_BUFFERRAM(this);
930 if (valid)
931 this->bufferram[i].blockpage = blockpage;
932 else
933 this->bufferram[i].blockpage = -1;
934}
935
936
937
938
939
940
941
942
943
944static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr,
945 unsigned int len)
946{
947 struct onenand_chip *this = mtd->priv;
948 int i;
949 loff_t end_addr = addr + len;
950
951
952 for (i = 0; i < MAX_BUFFERRAM; i++) {
953 loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
954 if (buf_addr >= addr && buf_addr < end_addr)
955 this->bufferram[i].blockpage = -1;
956 }
957}
958
959
960
961
962
963
964
965
966static int onenand_get_device(struct mtd_info *mtd, int new_state)
967{
968 struct onenand_chip *this = mtd->priv;
969 DECLARE_WAITQUEUE(wait, current);
970
971
972
973
974 while (1) {
975 spin_lock(&this->chip_lock);
976 if (this->state == FL_READY) {
977 this->state = new_state;
978 spin_unlock(&this->chip_lock);
979 if (new_state != FL_PM_SUSPENDED && this->enable)
980 this->enable(mtd);
981 break;
982 }
983 if (new_state == FL_PM_SUSPENDED) {
984 spin_unlock(&this->chip_lock);
985 return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
986 }
987 set_current_state(TASK_UNINTERRUPTIBLE);
988 add_wait_queue(&this->wq, &wait);
989 spin_unlock(&this->chip_lock);
990 schedule();
991 remove_wait_queue(&this->wq, &wait);
992 }
993
994 return 0;
995}
996
997
998
999
1000
1001
1002
1003static void onenand_release_device(struct mtd_info *mtd)
1004{
1005 struct onenand_chip *this = mtd->priv;
1006
1007 if (this->state != FL_PM_SUSPENDED && this->disable)
1008 this->disable(mtd);
1009
1010 spin_lock(&this->chip_lock);
1011 this->state = FL_READY;
1012 wake_up(&this->wq);
1013 spin_unlock(&this->chip_lock);
1014}
1015
1016
1017
1018
1019
1020
1021
1022
1023static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int column,
1024 int thislen)
1025{
1026 struct onenand_chip *this = mtd->priv;
1027 struct nand_oobfree *free;
1028 int readcol = column;
1029 int readend = column + thislen;
1030 int lastgap = 0;
1031 unsigned int i;
1032 uint8_t *oob_buf = this->oob_buf;
1033
1034 free = this->ecclayout->oobfree;
1035 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1036 if (readcol >= lastgap)
1037 readcol += free->offset - lastgap;
1038 if (readend >= lastgap)
1039 readend += free->offset - lastgap;
1040 lastgap = free->offset + free->length;
1041 }
1042 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1043 free = this->ecclayout->oobfree;
1044 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1045 int free_end = free->offset + free->length;
1046 if (free->offset < readend && free_end > readcol) {
1047 int st = max_t(int,free->offset,readcol);
1048 int ed = min_t(int,free_end,readend);
1049 int n = ed - st;
1050 memcpy(buf, oob_buf + st, n);
1051 buf += n;
1052 } else if (column == 0)
1053 break;
1054 }
1055 return 0;
1056}
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
1072{
1073 struct onenand_chip *this = mtd->priv;
1074 int i;
1075
1076
1077 if (!FLEXONENAND(this))
1078 return status;
1079
1080
1081 if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
1082 return status;
1083
1084
1085 i = flexonenand_region(mtd, addr);
1086 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift))
1087 return status;
1088
1089
1090
1091
1092 printk(KERN_INFO "%s: Attempting to recover from uncorrectable read\n",
1093 __func__);
1094 mtd->ecc_stats.failed--;
1095
1096
1097 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize);
1098 return this->wait(mtd, FL_READING);
1099}
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1111 struct mtd_oob_ops *ops)
1112{
1113 struct onenand_chip *this = mtd->priv;
1114 struct mtd_ecc_stats stats;
1115 size_t len = ops->len;
1116 size_t ooblen = ops->ooblen;
1117 u_char *buf = ops->datbuf;
1118 u_char *oobbuf = ops->oobbuf;
1119 int read = 0, column, thislen;
1120 int oobread = 0, oobcolumn, thisooblen, oobsize;
1121 int ret = 0;
1122 int writesize = this->writesize;
1123
1124 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1125 (int)len);
1126
1127 if (ops->mode == MTD_OPS_AUTO_OOB)
1128 oobsize = this->ecclayout->oobavail;
1129 else
1130 oobsize = mtd->oobsize;
1131
1132 oobcolumn = from & (mtd->oobsize - 1);
1133
1134
1135 if (from + len > mtd->size) {
1136 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1137 __func__);
1138 ops->retlen = 0;
1139 ops->oobretlen = 0;
1140 return -EINVAL;
1141 }
1142
1143 stats = mtd->ecc_stats;
1144
1145 while (read < len) {
1146 cond_resched();
1147
1148 thislen = min_t(int, writesize, len - read);
1149
1150 column = from & (writesize - 1);
1151 if (column + thislen > writesize)
1152 thislen = writesize - column;
1153
1154 if (!onenand_check_bufferram(mtd, from)) {
1155 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1156
1157 ret = this->wait(mtd, FL_READING);
1158 if (unlikely(ret))
1159 ret = onenand_recover_lsb(mtd, from, ret);
1160 onenand_update_bufferram(mtd, from, !ret);
1161 if (mtd_is_eccerr(ret))
1162 ret = 0;
1163 if (ret)
1164 break;
1165 }
1166
1167 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1168 if (oobbuf) {
1169 thisooblen = oobsize - oobcolumn;
1170 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1171
1172 if (ops->mode == MTD_OPS_AUTO_OOB)
1173 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1174 else
1175 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1176 oobread += thisooblen;
1177 oobbuf += thisooblen;
1178 oobcolumn = 0;
1179 }
1180
1181 read += thislen;
1182 if (read == len)
1183 break;
1184
1185 from += thislen;
1186 buf += thislen;
1187 }
1188
1189
1190
1191
1192
1193
1194 ops->retlen = read;
1195 ops->oobretlen = oobread;
1196
1197 if (ret)
1198 return ret;
1199
1200 if (mtd->ecc_stats.failed - stats.failed)
1201 return -EBADMSG;
1202
1203
1204 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1205}
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1216 struct mtd_oob_ops *ops)
1217{
1218 struct onenand_chip *this = mtd->priv;
1219 struct mtd_ecc_stats stats;
1220 size_t len = ops->len;
1221 size_t ooblen = ops->ooblen;
1222 u_char *buf = ops->datbuf;
1223 u_char *oobbuf = ops->oobbuf;
1224 int read = 0, column, thislen;
1225 int oobread = 0, oobcolumn, thisooblen, oobsize;
1226 int ret = 0, boundary = 0;
1227 int writesize = this->writesize;
1228
1229 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1230 (int)len);
1231
1232 if (ops->mode == MTD_OPS_AUTO_OOB)
1233 oobsize = this->ecclayout->oobavail;
1234 else
1235 oobsize = mtd->oobsize;
1236
1237 oobcolumn = from & (mtd->oobsize - 1);
1238
1239
1240 if ((from + len) > mtd->size) {
1241 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1242 __func__);
1243 ops->retlen = 0;
1244 ops->oobretlen = 0;
1245 return -EINVAL;
1246 }
1247
1248 stats = mtd->ecc_stats;
1249
1250
1251
1252
1253 if (read < len) {
1254 if (!onenand_check_bufferram(mtd, from)) {
1255 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1256 ret = this->wait(mtd, FL_READING);
1257 onenand_update_bufferram(mtd, from, !ret);
1258 if (mtd_is_eccerr(ret))
1259 ret = 0;
1260 }
1261 }
1262
1263 thislen = min_t(int, writesize, len - read);
1264 column = from & (writesize - 1);
1265 if (column + thislen > writesize)
1266 thislen = writesize - column;
1267
1268 while (!ret) {
1269
1270 from += thislen;
1271 if (read + thislen < len) {
1272 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1273
1274
1275
1276
1277
1278 if (ONENAND_IS_DDP(this) &&
1279 unlikely(from == (this->chipsize >> 1))) {
1280 this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2);
1281 boundary = 1;
1282 } else
1283 boundary = 0;
1284 ONENAND_SET_PREV_BUFFERRAM(this);
1285 }
1286
1287 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1288
1289
1290 if (oobbuf) {
1291 thisooblen = oobsize - oobcolumn;
1292 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1293
1294 if (ops->mode == MTD_OPS_AUTO_OOB)
1295 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1296 else
1297 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1298 oobread += thisooblen;
1299 oobbuf += thisooblen;
1300 oobcolumn = 0;
1301 }
1302
1303
1304 read += thislen;
1305 if (read == len)
1306 break;
1307
1308 if (unlikely(boundary))
1309 this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2);
1310 ONENAND_SET_NEXT_BUFFERRAM(this);
1311 buf += thislen;
1312 thislen = min_t(int, writesize, len - read);
1313 column = 0;
1314 cond_resched();
1315
1316 ret = this->wait(mtd, FL_READING);
1317 onenand_update_bufferram(mtd, from, !ret);
1318 if (mtd_is_eccerr(ret))
1319 ret = 0;
1320 }
1321
1322
1323
1324
1325
1326
1327 ops->retlen = read;
1328 ops->oobretlen = oobread;
1329
1330 if (ret)
1331 return ret;
1332
1333 if (mtd->ecc_stats.failed - stats.failed)
1334 return -EBADMSG;
1335
1336
1337 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1338}
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
1349 struct mtd_oob_ops *ops)
1350{
1351 struct onenand_chip *this = mtd->priv;
1352 struct mtd_ecc_stats stats;
1353 int read = 0, thislen, column, oobsize;
1354 size_t len = ops->ooblen;
1355 unsigned int mode = ops->mode;
1356 u_char *buf = ops->oobbuf;
1357 int ret = 0, readcmd;
1358
1359 from += ops->ooboffs;
1360
1361 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1362 (int)len);
1363
1364
1365 ops->oobretlen = 0;
1366
1367 if (mode == MTD_OPS_AUTO_OOB)
1368 oobsize = this->ecclayout->oobavail;
1369 else
1370 oobsize = mtd->oobsize;
1371
1372 column = from & (mtd->oobsize - 1);
1373
1374 if (unlikely(column >= oobsize)) {
1375 printk(KERN_ERR "%s: Attempted to start read outside oob\n",
1376 __func__);
1377 return -EINVAL;
1378 }
1379
1380
1381 if (unlikely(from >= mtd->size ||
1382 column + len > ((mtd->size >> this->page_shift) -
1383 (from >> this->page_shift)) * oobsize)) {
1384 printk(KERN_ERR "%s: Attempted to read beyond end of device\n",
1385 __func__);
1386 return -EINVAL;
1387 }
1388
1389 stats = mtd->ecc_stats;
1390
1391 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1392
1393 while (read < len) {
1394 cond_resched();
1395
1396 thislen = oobsize - column;
1397 thislen = min_t(int, thislen, len);
1398
1399 this->command(mtd, readcmd, from, mtd->oobsize);
1400
1401 onenand_update_bufferram(mtd, from, 0);
1402
1403 ret = this->wait(mtd, FL_READING);
1404 if (unlikely(ret))
1405 ret = onenand_recover_lsb(mtd, from, ret);
1406
1407 if (ret && !mtd_is_eccerr(ret)) {
1408 printk(KERN_ERR "%s: read failed = 0x%x\n",
1409 __func__, ret);
1410 break;
1411 }
1412
1413 if (mode == MTD_OPS_AUTO_OOB)
1414 onenand_transfer_auto_oob(mtd, buf, column, thislen);
1415 else
1416 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1417
1418 read += thislen;
1419
1420 if (read == len)
1421 break;
1422
1423 buf += thislen;
1424
1425
1426 if (read < len) {
1427
1428 from += mtd->writesize;
1429 column = 0;
1430 }
1431 }
1432
1433 ops->oobretlen = read;
1434
1435 if (ret)
1436 return ret;
1437
1438 if (mtd->ecc_stats.failed - stats.failed)
1439 return -EBADMSG;
1440
1441 return 0;
1442}
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
1455 size_t *retlen, u_char *buf)
1456{
1457 struct onenand_chip *this = mtd->priv;
1458 struct mtd_oob_ops ops = {
1459 .len = len,
1460 .ooblen = 0,
1461 .datbuf = buf,
1462 .oobbuf = NULL,
1463 };
1464 int ret;
1465
1466 onenand_get_device(mtd, FL_READING);
1467 ret = ONENAND_IS_4KB_PAGE(this) ?
1468 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
1469 onenand_read_ops_nolock(mtd, from, &ops);
1470 onenand_release_device(mtd);
1471
1472 *retlen = ops.retlen;
1473 return ret;
1474}
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484static int onenand_read_oob(struct mtd_info *mtd, loff_t from,
1485 struct mtd_oob_ops *ops)
1486{
1487 struct onenand_chip *this = mtd->priv;
1488 int ret;
1489
1490 switch (ops->mode) {
1491 case MTD_OPS_PLACE_OOB:
1492 case MTD_OPS_AUTO_OOB:
1493 break;
1494 case MTD_OPS_RAW:
1495
1496 default:
1497 return -EINVAL;
1498 }
1499
1500 onenand_get_device(mtd, FL_READING);
1501 if (ops->datbuf)
1502 ret = ONENAND_IS_4KB_PAGE(this) ?
1503 onenand_mlc_read_ops_nolock(mtd, from, ops) :
1504 onenand_read_ops_nolock(mtd, from, ops);
1505 else
1506 ret = onenand_read_oob_nolock(mtd, from, ops);
1507 onenand_release_device(mtd);
1508
1509 return ret;
1510}
1511
1512
1513
1514
1515
1516
1517
1518
1519static int onenand_bbt_wait(struct mtd_info *mtd, int state)
1520{
1521 struct onenand_chip *this = mtd->priv;
1522 unsigned long timeout;
1523 unsigned int interrupt, ctrl, ecc, addr1, addr8;
1524
1525
1526 timeout = jiffies + msecs_to_jiffies(20);
1527 while (time_before(jiffies, timeout)) {
1528 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1529 if (interrupt & ONENAND_INT_MASTER)
1530 break;
1531 }
1532
1533 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1534 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
1535 addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1);
1536 addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8);
1537
1538 if (interrupt & ONENAND_INT_READ) {
1539 ecc = onenand_read_ecc(this);
1540 if (ecc & ONENAND_ECC_2BIT_ALL) {
1541 printk(KERN_DEBUG "%s: ecc 0x%04x ctrl 0x%04x "
1542 "intr 0x%04x addr1 %#x addr8 %#x\n",
1543 __func__, ecc, ctrl, interrupt, addr1, addr8);
1544 return ONENAND_BBT_READ_ECC_ERROR;
1545 }
1546 } else {
1547 printk(KERN_ERR "%s: read timeout! ctrl 0x%04x "
1548 "intr 0x%04x addr1 %#x addr8 %#x\n",
1549 __func__, ctrl, interrupt, addr1, addr8);
1550 return ONENAND_BBT_READ_FATAL_ERROR;
1551 }
1552
1553
1554 if (ctrl & ONENAND_CTRL_ERROR) {
1555 printk(KERN_DEBUG "%s: ctrl 0x%04x intr 0x%04x addr1 %#x "
1556 "addr8 %#x\n", __func__, ctrl, interrupt, addr1, addr8);
1557 return ONENAND_BBT_READ_ERROR;
1558 }
1559
1560 return 0;
1561}
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
1572 struct mtd_oob_ops *ops)
1573{
1574 struct onenand_chip *this = mtd->priv;
1575 int read = 0, thislen, column;
1576 int ret = 0, readcmd;
1577 size_t len = ops->ooblen;
1578 u_char *buf = ops->oobbuf;
1579
1580 pr_debug("%s: from = 0x%08x, len = %zi\n", __func__, (unsigned int)from,
1581 len);
1582
1583
1584 ops->oobretlen = 0;
1585
1586
1587 if (unlikely((from + len) > mtd->size)) {
1588 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1589 __func__);
1590 return ONENAND_BBT_READ_FATAL_ERROR;
1591 }
1592
1593
1594 onenand_get_device(mtd, FL_READING);
1595
1596 column = from & (mtd->oobsize - 1);
1597
1598 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1599
1600 while (read < len) {
1601 cond_resched();
1602
1603 thislen = mtd->oobsize - column;
1604 thislen = min_t(int, thislen, len);
1605
1606 this->command(mtd, readcmd, from, mtd->oobsize);
1607
1608 onenand_update_bufferram(mtd, from, 0);
1609
1610 ret = this->bbt_wait(mtd, FL_READING);
1611 if (unlikely(ret))
1612 ret = onenand_recover_lsb(mtd, from, ret);
1613
1614 if (ret)
1615 break;
1616
1617 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1618 read += thislen;
1619 if (read == len)
1620 break;
1621
1622 buf += thislen;
1623
1624
1625 if (read < len) {
1626
1627 from += this->writesize;
1628 column = 0;
1629 }
1630 }
1631
1632
1633 onenand_release_device(mtd);
1634
1635 ops->oobretlen = read;
1636 return ret;
1637}
1638
1639#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
1640
1641
1642
1643
1644
1645
1646static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to)
1647{
1648 struct onenand_chip *this = mtd->priv;
1649 u_char *oob_buf = this->oob_buf;
1650 int status, i, readcmd;
1651
1652 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1653
1654 this->command(mtd, readcmd, to, mtd->oobsize);
1655 onenand_update_bufferram(mtd, to, 0);
1656 status = this->wait(mtd, FL_READING);
1657 if (status)
1658 return status;
1659
1660 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1661 for (i = 0; i < mtd->oobsize; i++)
1662 if (buf[i] != 0xFF && buf[i] != oob_buf[i])
1663 return -EBADMSG;
1664
1665 return 0;
1666}
1667
1668
1669
1670
1671
1672
1673
1674
1675static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len)
1676{
1677 struct onenand_chip *this = mtd->priv;
1678 int ret = 0;
1679 int thislen, column;
1680
1681 column = addr & (this->writesize - 1);
1682
1683 while (len != 0) {
1684 thislen = min_t(int, this->writesize - column, len);
1685
1686 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize);
1687
1688 onenand_update_bufferram(mtd, addr, 0);
1689
1690 ret = this->wait(mtd, FL_READING);
1691 if (ret)
1692 return ret;
1693
1694 onenand_update_bufferram(mtd, addr, 1);
1695
1696 this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize);
1697
1698 if (memcmp(buf, this->verify_buf + column, thislen))
1699 return -EBADMSG;
1700
1701 len -= thislen;
1702 buf += thislen;
1703 addr += thislen;
1704 column = 0;
1705 }
1706
1707 return 0;
1708}
1709#else
1710#define onenand_verify(...) (0)
1711#define onenand_verify_oob(...) (0)
1712#endif
1713
1714#define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1715
1716static void onenand_panic_wait(struct mtd_info *mtd)
1717{
1718 struct onenand_chip *this = mtd->priv;
1719 unsigned int interrupt;
1720 int i;
1721
1722 for (i = 0; i < 2000; i++) {
1723 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1724 if (interrupt & ONENAND_INT_MASTER)
1725 break;
1726 udelay(10);
1727 }
1728}
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
1741 size_t *retlen, const u_char *buf)
1742{
1743 struct onenand_chip *this = mtd->priv;
1744 int column, subpage;
1745 int written = 0;
1746 int ret = 0;
1747
1748 if (this->state == FL_PM_SUSPENDED)
1749 return -EBUSY;
1750
1751
1752 onenand_panic_wait(mtd);
1753
1754 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1755 (int)len);
1756
1757
1758 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1759 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1760 __func__);
1761 return -EINVAL;
1762 }
1763
1764 column = to & (mtd->writesize - 1);
1765
1766
1767 while (written < len) {
1768 int thislen = min_t(int, mtd->writesize - column, len - written);
1769 u_char *wbuf = (u_char *) buf;
1770
1771 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1772
1773
1774 subpage = thislen < mtd->writesize;
1775 if (subpage) {
1776 memset(this->page_buf, 0xff, mtd->writesize);
1777 memcpy(this->page_buf + column, buf, thislen);
1778 wbuf = this->page_buf;
1779 }
1780
1781 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1782 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize);
1783
1784 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
1785
1786 onenand_panic_wait(mtd);
1787
1788
1789 onenand_update_bufferram(mtd, to, !ret && !subpage);
1790 if (ONENAND_IS_2PLANE(this)) {
1791 ONENAND_SET_BUFFERRAM1(this);
1792 onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage);
1793 }
1794
1795 if (ret) {
1796 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
1797 break;
1798 }
1799
1800 written += thislen;
1801
1802 if (written == len)
1803 break;
1804
1805 column = 0;
1806 to += thislen;
1807 buf += thislen;
1808 }
1809
1810 *retlen = written;
1811 return ret;
1812}
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
1823 const u_char *buf, int column, int thislen)
1824{
1825 struct onenand_chip *this = mtd->priv;
1826 struct nand_oobfree *free;
1827 int writecol = column;
1828 int writeend = column + thislen;
1829 int lastgap = 0;
1830 unsigned int i;
1831
1832 free = this->ecclayout->oobfree;
1833 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1834 if (writecol >= lastgap)
1835 writecol += free->offset - lastgap;
1836 if (writeend >= lastgap)
1837 writeend += free->offset - lastgap;
1838 lastgap = free->offset + free->length;
1839 }
1840 free = this->ecclayout->oobfree;
1841 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1842 int free_end = free->offset + free->length;
1843 if (free->offset < writeend && free_end > writecol) {
1844 int st = max_t(int,free->offset,writecol);
1845 int ed = min_t(int,free_end,writeend);
1846 int n = ed - st;
1847 memcpy(oob_buf + st, buf, n);
1848 buf += n;
1849 } else if (column == 0)
1850 break;
1851 }
1852 return 0;
1853}
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
1864 struct mtd_oob_ops *ops)
1865{
1866 struct onenand_chip *this = mtd->priv;
1867 int written = 0, column, thislen = 0, subpage = 0;
1868 int prev = 0, prevlen = 0, prev_subpage = 0, first = 1;
1869 int oobwritten = 0, oobcolumn, thisooblen, oobsize;
1870 size_t len = ops->len;
1871 size_t ooblen = ops->ooblen;
1872 const u_char *buf = ops->datbuf;
1873 const u_char *oob = ops->oobbuf;
1874 u_char *oobbuf;
1875 int ret = 0, cmd;
1876
1877 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1878 (int)len);
1879
1880
1881 ops->retlen = 0;
1882 ops->oobretlen = 0;
1883
1884
1885 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1886 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1887 __func__);
1888 return -EINVAL;
1889 }
1890
1891
1892 if (!len)
1893 return 0;
1894
1895 if (ops->mode == MTD_OPS_AUTO_OOB)
1896 oobsize = this->ecclayout->oobavail;
1897 else
1898 oobsize = mtd->oobsize;
1899
1900 oobcolumn = to & (mtd->oobsize - 1);
1901
1902 column = to & (mtd->writesize - 1);
1903
1904
1905 while (1) {
1906 if (written < len) {
1907 u_char *wbuf = (u_char *) buf;
1908
1909 thislen = min_t(int, mtd->writesize - column, len - written);
1910 thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
1911
1912 cond_resched();
1913
1914 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1915
1916
1917 subpage = thislen < mtd->writesize;
1918 if (subpage) {
1919 memset(this->page_buf, 0xff, mtd->writesize);
1920 memcpy(this->page_buf + column, buf, thislen);
1921 wbuf = this->page_buf;
1922 }
1923
1924 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1925
1926 if (oob) {
1927 oobbuf = this->oob_buf;
1928
1929
1930
1931 memset(oobbuf, 0xff, mtd->oobsize);
1932 if (ops->mode == MTD_OPS_AUTO_OOB)
1933 onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
1934 else
1935 memcpy(oobbuf + oobcolumn, oob, thisooblen);
1936
1937 oobwritten += thisooblen;
1938 oob += thisooblen;
1939 oobcolumn = 0;
1940 } else
1941 oobbuf = (u_char *) ffchars;
1942
1943 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
1944 } else
1945 ONENAND_SET_NEXT_BUFFERRAM(this);
1946
1947
1948
1949
1950
1951 if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) {
1952 ONENAND_SET_PREV_BUFFERRAM(this);
1953
1954 ret = this->wait(mtd, FL_WRITING);
1955
1956
1957 onenand_update_bufferram(mtd, prev, !ret && !prev_subpage);
1958 if (ret) {
1959 written -= prevlen;
1960 printk(KERN_ERR "%s: write failed %d\n",
1961 __func__, ret);
1962 break;
1963 }
1964
1965 if (written == len) {
1966
1967 ret = onenand_verify(mtd, buf - len, to - len, len);
1968 if (ret)
1969 printk(KERN_ERR "%s: verify failed %d\n",
1970 __func__, ret);
1971 break;
1972 }
1973
1974 ONENAND_SET_NEXT_BUFFERRAM(this);
1975 }
1976
1977 this->ongoing = 0;
1978 cmd = ONENAND_CMD_PROG;
1979
1980
1981 if (ONENAND_IS_CACHE_PROGRAM(this) &&
1982 likely(onenand_block(this, to) != 0) &&
1983 ONENAND_IS_4KB_PAGE(this) &&
1984 ((written + thislen) < len)) {
1985 cmd = ONENAND_CMD_2X_CACHE_PROG;
1986 this->ongoing = 1;
1987 }
1988
1989 this->command(mtd, cmd, to, mtd->writesize);
1990
1991
1992
1993
1994 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) {
1995 ret = this->wait(mtd, FL_WRITING);
1996
1997
1998 onenand_update_bufferram(mtd, to, !ret && !subpage);
1999 if (ret) {
2000 printk(KERN_ERR "%s: write failed %d\n",
2001 __func__, ret);
2002 break;
2003 }
2004
2005
2006 ret = onenand_verify(mtd, buf, to, thislen);
2007 if (ret) {
2008 printk(KERN_ERR "%s: verify failed %d\n",
2009 __func__, ret);
2010 break;
2011 }
2012
2013 written += thislen;
2014
2015 if (written == len)
2016 break;
2017
2018 } else
2019 written += thislen;
2020
2021 column = 0;
2022 prev_subpage = subpage;
2023 prev = to;
2024 prevlen = thislen;
2025 to += thislen;
2026 buf += thislen;
2027 first = 0;
2028 }
2029
2030
2031 if (written != len)
2032 onenand_invalidate_bufferram(mtd, 0, -1);
2033
2034 ops->retlen = written;
2035 ops->oobretlen = oobwritten;
2036
2037 return ret;
2038}
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2053 struct mtd_oob_ops *ops)
2054{
2055 struct onenand_chip *this = mtd->priv;
2056 int column, ret = 0, oobsize;
2057 int written = 0, oobcmd;
2058 u_char *oobbuf;
2059 size_t len = ops->ooblen;
2060 const u_char *buf = ops->oobbuf;
2061 unsigned int mode = ops->mode;
2062
2063 to += ops->ooboffs;
2064
2065 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
2066 (int)len);
2067
2068
2069 ops->oobretlen = 0;
2070
2071 if (mode == MTD_OPS_AUTO_OOB)
2072 oobsize = this->ecclayout->oobavail;
2073 else
2074 oobsize = mtd->oobsize;
2075
2076 column = to & (mtd->oobsize - 1);
2077
2078 if (unlikely(column >= oobsize)) {
2079 printk(KERN_ERR "%s: Attempted to start write outside oob\n",
2080 __func__);
2081 return -EINVAL;
2082 }
2083
2084
2085 if (unlikely(column + len > oobsize)) {
2086 printk(KERN_ERR "%s: Attempt to write past end of page\n",
2087 __func__);
2088 return -EINVAL;
2089 }
2090
2091
2092 if (unlikely(to >= mtd->size ||
2093 column + len > ((mtd->size >> this->page_shift) -
2094 (to >> this->page_shift)) * oobsize)) {
2095 printk(KERN_ERR "%s: Attempted to write past end of device\n",
2096 __func__);
2097 return -EINVAL;
2098 }
2099
2100 oobbuf = this->oob_buf;
2101
2102 oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB;
2103
2104
2105 while (written < len) {
2106 int thislen = min_t(int, oobsize, len - written);
2107
2108 cond_resched();
2109
2110 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize);
2111
2112
2113
2114 memset(oobbuf, 0xff, mtd->oobsize);
2115 if (mode == MTD_OPS_AUTO_OOB)
2116 onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
2117 else
2118 memcpy(oobbuf + column, buf, thislen);
2119 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
2120
2121 if (ONENAND_IS_4KB_PAGE(this)) {
2122
2123 memset(this->page_buf, 0xff, mtd->writesize);
2124 this->write_bufferram(mtd, ONENAND_DATARAM,
2125 this->page_buf, 0, mtd->writesize);
2126 }
2127
2128 this->command(mtd, oobcmd, to, mtd->oobsize);
2129
2130 onenand_update_bufferram(mtd, to, 0);
2131 if (ONENAND_IS_2PLANE(this)) {
2132 ONENAND_SET_BUFFERRAM1(this);
2133 onenand_update_bufferram(mtd, to + this->writesize, 0);
2134 }
2135
2136 ret = this->wait(mtd, FL_WRITING);
2137 if (ret) {
2138 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2139 break;
2140 }
2141
2142 ret = onenand_verify_oob(mtd, oobbuf, to);
2143 if (ret) {
2144 printk(KERN_ERR "%s: verify failed %d\n",
2145 __func__, ret);
2146 break;
2147 }
2148
2149 written += thislen;
2150 if (written == len)
2151 break;
2152
2153 to += mtd->writesize;
2154 buf += thislen;
2155 column = 0;
2156 }
2157
2158 ops->oobretlen = written;
2159
2160 return ret;
2161}
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
2174 size_t *retlen, const u_char *buf)
2175{
2176 struct mtd_oob_ops ops = {
2177 .len = len,
2178 .ooblen = 0,
2179 .datbuf = (u_char *) buf,
2180 .oobbuf = NULL,
2181 };
2182 int ret;
2183
2184 onenand_get_device(mtd, FL_WRITING);
2185 ret = onenand_write_ops_nolock(mtd, to, &ops);
2186 onenand_release_device(mtd);
2187
2188 *retlen = ops.retlen;
2189 return ret;
2190}
2191
2192
2193
2194
2195
2196
2197
2198static int onenand_write_oob(struct mtd_info *mtd, loff_t to,
2199 struct mtd_oob_ops *ops)
2200{
2201 int ret;
2202
2203 switch (ops->mode) {
2204 case MTD_OPS_PLACE_OOB:
2205 case MTD_OPS_AUTO_OOB:
2206 break;
2207 case MTD_OPS_RAW:
2208
2209 default:
2210 return -EINVAL;
2211 }
2212
2213 onenand_get_device(mtd, FL_WRITING);
2214 if (ops->datbuf)
2215 ret = onenand_write_ops_nolock(mtd, to, ops);
2216 else
2217 ret = onenand_write_oob_nolock(mtd, to, ops);
2218 onenand_release_device(mtd);
2219
2220 return ret;
2221}
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt)
2233{
2234 struct onenand_chip *this = mtd->priv;
2235 struct bbm_info *bbm = this->bbm;
2236
2237
2238 return bbm->isbad_bbt(mtd, ofs, allowbbt);
2239}
2240
2241
2242static int onenand_multiblock_erase_verify(struct mtd_info *mtd,
2243 struct erase_info *instr)
2244{
2245 struct onenand_chip *this = mtd->priv;
2246 loff_t addr = instr->addr;
2247 int len = instr->len;
2248 unsigned int block_size = (1 << this->erase_shift);
2249 int ret = 0;
2250
2251 while (len) {
2252 this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size);
2253 ret = this->wait(mtd, FL_VERIFYING_ERASE);
2254 if (ret) {
2255 printk(KERN_ERR "%s: Failed verify, block %d\n",
2256 __func__, onenand_block(this, addr));
2257 instr->state = MTD_ERASE_FAILED;
2258 instr->fail_addr = addr;
2259 return -1;
2260 }
2261 len -= block_size;
2262 addr += block_size;
2263 }
2264 return 0;
2265}
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275static int onenand_multiblock_erase(struct mtd_info *mtd,
2276 struct erase_info *instr,
2277 unsigned int block_size)
2278{
2279 struct onenand_chip *this = mtd->priv;
2280 loff_t addr = instr->addr;
2281 int len = instr->len;
2282 int eb_count = 0;
2283 int ret = 0;
2284 int bdry_block = 0;
2285
2286 instr->state = MTD_ERASING;
2287
2288 if (ONENAND_IS_DDP(this)) {
2289 loff_t bdry_addr = this->chipsize >> 1;
2290 if (addr < bdry_addr && (addr + len) > bdry_addr)
2291 bdry_block = bdry_addr >> this->erase_shift;
2292 }
2293
2294
2295 while (len) {
2296
2297 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2298 printk(KERN_WARNING "%s: attempt to erase a bad block "
2299 "at addr 0x%012llx\n",
2300 __func__, (unsigned long long) addr);
2301 instr->state = MTD_ERASE_FAILED;
2302 return -EIO;
2303 }
2304 len -= block_size;
2305 addr += block_size;
2306 }
2307
2308 len = instr->len;
2309 addr = instr->addr;
2310
2311
2312 while (len) {
2313 struct erase_info verify_instr = *instr;
2314 int max_eb_count = MB_ERASE_MAX_BLK_COUNT;
2315
2316 verify_instr.addr = addr;
2317 verify_instr.len = 0;
2318
2319
2320 if (bdry_block) {
2321 int this_block = (addr >> this->erase_shift);
2322
2323 if (this_block < bdry_block) {
2324 max_eb_count = min(max_eb_count,
2325 (bdry_block - this_block));
2326 }
2327 }
2328
2329 eb_count = 0;
2330
2331 while (len > block_size && eb_count < (max_eb_count - 1)) {
2332 this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE,
2333 addr, block_size);
2334 onenand_invalidate_bufferram(mtd, addr, block_size);
2335
2336 ret = this->wait(mtd, FL_PREPARING_ERASE);
2337 if (ret) {
2338 printk(KERN_ERR "%s: Failed multiblock erase, "
2339 "block %d\n", __func__,
2340 onenand_block(this, addr));
2341 instr->state = MTD_ERASE_FAILED;
2342 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2343 return -EIO;
2344 }
2345
2346 len -= block_size;
2347 addr += block_size;
2348 eb_count++;
2349 }
2350
2351
2352 cond_resched();
2353 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2354 onenand_invalidate_bufferram(mtd, addr, block_size);
2355
2356 ret = this->wait(mtd, FL_ERASING);
2357
2358 if (ret) {
2359 printk(KERN_ERR "%s: Failed erase, block %d\n",
2360 __func__, onenand_block(this, addr));
2361 instr->state = MTD_ERASE_FAILED;
2362 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2363 return -EIO;
2364 }
2365
2366 len -= block_size;
2367 addr += block_size;
2368 eb_count++;
2369
2370
2371 verify_instr.len = eb_count * block_size;
2372 if (onenand_multiblock_erase_verify(mtd, &verify_instr)) {
2373 instr->state = verify_instr.state;
2374 instr->fail_addr = verify_instr.fail_addr;
2375 return -EIO;
2376 }
2377
2378 }
2379 return 0;
2380}
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392static int onenand_block_by_block_erase(struct mtd_info *mtd,
2393 struct erase_info *instr,
2394 struct mtd_erase_region_info *region,
2395 unsigned int block_size)
2396{
2397 struct onenand_chip *this = mtd->priv;
2398 loff_t addr = instr->addr;
2399 int len = instr->len;
2400 loff_t region_end = 0;
2401 int ret = 0;
2402
2403 if (region) {
2404
2405 region_end = region->offset + region->erasesize * region->numblocks;
2406 }
2407
2408 instr->state = MTD_ERASING;
2409
2410
2411 while (len) {
2412 cond_resched();
2413
2414
2415 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2416 printk(KERN_WARNING "%s: attempt to erase a bad block "
2417 "at addr 0x%012llx\n",
2418 __func__, (unsigned long long) addr);
2419 instr->state = MTD_ERASE_FAILED;
2420 return -EIO;
2421 }
2422
2423 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2424
2425 onenand_invalidate_bufferram(mtd, addr, block_size);
2426
2427 ret = this->wait(mtd, FL_ERASING);
2428
2429 if (ret) {
2430 printk(KERN_ERR "%s: Failed erase, block %d\n",
2431 __func__, onenand_block(this, addr));
2432 instr->state = MTD_ERASE_FAILED;
2433 instr->fail_addr = addr;
2434 return -EIO;
2435 }
2436
2437 len -= block_size;
2438 addr += block_size;
2439
2440 if (region && addr == region_end) {
2441 if (!len)
2442 break;
2443 region++;
2444
2445 block_size = region->erasesize;
2446 region_end = region->offset + region->erasesize * region->numblocks;
2447
2448 if (len & (block_size - 1)) {
2449
2450 printk(KERN_ERR "%s: Unaligned address\n",
2451 __func__);
2452 return -EIO;
2453 }
2454 }
2455 }
2456 return 0;
2457}
2458
2459
2460
2461
2462
2463
2464
2465
2466static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
2467{
2468 struct onenand_chip *this = mtd->priv;
2469 unsigned int block_size;
2470 loff_t addr = instr->addr;
2471 loff_t len = instr->len;
2472 int ret = 0;
2473 struct mtd_erase_region_info *region = NULL;
2474 loff_t region_offset = 0;
2475
2476 pr_debug("%s: start=0x%012llx, len=%llu\n", __func__,
2477 (unsigned long long)instr->addr,
2478 (unsigned long long)instr->len);
2479
2480 if (FLEXONENAND(this)) {
2481
2482 int i = flexonenand_region(mtd, addr);
2483
2484 region = &mtd->eraseregions[i];
2485 block_size = region->erasesize;
2486
2487
2488
2489
2490 region_offset = region->offset;
2491 } else
2492 block_size = 1 << this->erase_shift;
2493
2494
2495 if (unlikely((addr - region_offset) & (block_size - 1))) {
2496 printk(KERN_ERR "%s: Unaligned address\n", __func__);
2497 return -EINVAL;
2498 }
2499
2500
2501 if (unlikely(len & (block_size - 1))) {
2502 printk(KERN_ERR "%s: Length not block aligned\n", __func__);
2503 return -EINVAL;
2504 }
2505
2506
2507 onenand_get_device(mtd, FL_ERASING);
2508
2509 if (ONENAND_IS_4KB_PAGE(this) || region ||
2510 instr->len < MB_ERASE_MIN_BLK_COUNT * block_size) {
2511
2512 ret = onenand_block_by_block_erase(mtd, instr,
2513 region, block_size);
2514 } else {
2515 ret = onenand_multiblock_erase(mtd, instr, block_size);
2516 }
2517
2518
2519 onenand_release_device(mtd);
2520
2521
2522 if (!ret) {
2523 instr->state = MTD_ERASE_DONE;
2524 mtd_erase_callback(instr);
2525 }
2526
2527 return ret;
2528}
2529
2530
2531
2532
2533
2534
2535
2536static void onenand_sync(struct mtd_info *mtd)
2537{
2538 pr_debug("%s: called\n", __func__);
2539
2540
2541 onenand_get_device(mtd, FL_SYNCING);
2542
2543
2544 onenand_release_device(mtd);
2545}
2546
2547
2548
2549
2550
2551
2552
2553
2554static int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
2555{
2556 int ret;
2557
2558 onenand_get_device(mtd, FL_READING);
2559 ret = onenand_block_isbad_nolock(mtd, ofs, 0);
2560 onenand_release_device(mtd);
2561 return ret;
2562}
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
2573{
2574 struct onenand_chip *this = mtd->priv;
2575 struct bbm_info *bbm = this->bbm;
2576 u_char buf[2] = {0, 0};
2577 struct mtd_oob_ops ops = {
2578 .mode = MTD_OPS_PLACE_OOB,
2579 .ooblen = 2,
2580 .oobbuf = buf,
2581 .ooboffs = 0,
2582 };
2583 int block;
2584
2585
2586 block = onenand_block(this, ofs);
2587 if (bbm->bbt)
2588 bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
2589
2590
2591 ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
2592
2593
2594
2595
2596 return onenand_write_oob_nolock(mtd, ofs, &ops);
2597}
2598
2599
2600
2601
2602
2603
2604
2605
2606static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
2607{
2608 int ret;
2609
2610 ret = onenand_block_isbad(mtd, ofs);
2611 if (ret) {
2612
2613 if (ret > 0)
2614 return 0;
2615 return ret;
2616 }
2617
2618 onenand_get_device(mtd, FL_WRITING);
2619 ret = mtd_block_markbad(mtd, ofs);
2620 onenand_release_device(mtd);
2621 return ret;
2622}
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd)
2634{
2635 struct onenand_chip *this = mtd->priv;
2636 int start, end, block, value, status;
2637 int wp_status_mask;
2638
2639 start = onenand_block(this, ofs);
2640 end = onenand_block(this, ofs + len) - 1;
2641
2642 if (cmd == ONENAND_CMD_LOCK)
2643 wp_status_mask = ONENAND_WP_LS;
2644 else
2645 wp_status_mask = ONENAND_WP_US;
2646
2647
2648 if (this->options & ONENAND_HAS_CONT_LOCK) {
2649
2650 this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2651
2652 this->write_word(end, this->base + ONENAND_REG_END_BLOCK_ADDRESS);
2653
2654 this->command(mtd, cmd, 0, 0);
2655
2656
2657 this->wait(mtd, FL_LOCKING);
2658
2659
2660 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2661 & ONENAND_CTRL_ONGO)
2662 continue;
2663
2664
2665 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2666 if (!(status & wp_status_mask))
2667 printk(KERN_ERR "%s: wp status = 0x%x\n",
2668 __func__, status);
2669
2670 return 0;
2671 }
2672
2673
2674 for (block = start; block < end + 1; block++) {
2675
2676 value = onenand_block_address(this, block);
2677 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2678
2679 value = onenand_bufferram_address(this, block);
2680 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2681
2682 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2683
2684 this->command(mtd, cmd, 0, 0);
2685
2686
2687 this->wait(mtd, FL_LOCKING);
2688
2689
2690 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2691 & ONENAND_CTRL_ONGO)
2692 continue;
2693
2694
2695 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2696 if (!(status & wp_status_mask))
2697 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2698 __func__, block, status);
2699 }
2700
2701 return 0;
2702}
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712static int onenand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2713{
2714 int ret;
2715
2716 onenand_get_device(mtd, FL_LOCKING);
2717 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK);
2718 onenand_release_device(mtd);
2719 return ret;
2720}
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2731{
2732 int ret;
2733
2734 onenand_get_device(mtd, FL_LOCKING);
2735 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2736 onenand_release_device(mtd);
2737 return ret;
2738}
2739
2740
2741
2742
2743
2744
2745
2746static int onenand_check_lock_status(struct onenand_chip *this)
2747{
2748 unsigned int value, block, status;
2749 unsigned int end;
2750
2751 end = this->chipsize >> this->erase_shift;
2752 for (block = 0; block < end; block++) {
2753
2754 value = onenand_block_address(this, block);
2755 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2756
2757 value = onenand_bufferram_address(this, block);
2758 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2759
2760 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2761
2762
2763 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2764 if (!(status & ONENAND_WP_US)) {
2765 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2766 __func__, block, status);
2767 return 0;
2768 }
2769 }
2770
2771 return 1;
2772}
2773
2774
2775
2776
2777
2778
2779
2780static void onenand_unlock_all(struct mtd_info *mtd)
2781{
2782 struct onenand_chip *this = mtd->priv;
2783 loff_t ofs = 0;
2784 loff_t len = mtd->size;
2785
2786 if (this->options & ONENAND_HAS_UNLOCK_ALL) {
2787
2788 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2789
2790 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0);
2791
2792
2793 this->wait(mtd, FL_LOCKING);
2794
2795
2796 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2797 & ONENAND_CTRL_ONGO)
2798 continue;
2799
2800
2801 if (this->options & ONENAND_SKIP_UNLOCK_CHECK)
2802 return;
2803
2804
2805 if (onenand_check_lock_status(this))
2806 return;
2807
2808
2809 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) {
2810
2811 ofs = this->chipsize >> 1;
2812 len = this->chipsize >> 1;
2813 }
2814 }
2815
2816 onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2817}
2818
2819#ifdef CONFIG_MTD_ONENAND_OTP
2820
2821
2822
2823
2824
2825
2826
2827
2828static int onenand_otp_command(struct mtd_info *mtd, int cmd, loff_t addr,
2829 size_t len)
2830{
2831 struct onenand_chip *this = mtd->priv;
2832 int value, block, page;
2833
2834
2835 switch (cmd) {
2836 case ONENAND_CMD_OTP_ACCESS:
2837 block = (int) (addr >> this->erase_shift);
2838 page = -1;
2839 break;
2840
2841 default:
2842 block = (int) (addr >> this->erase_shift);
2843 page = (int) (addr >> this->page_shift);
2844
2845 if (ONENAND_IS_2PLANE(this)) {
2846
2847 block &= ~1;
2848
2849 if (addr & this->writesize)
2850 block++;
2851 page >>= 1;
2852 }
2853 page &= this->page_mask;
2854 break;
2855 }
2856
2857 if (block != -1) {
2858
2859 value = onenand_block_address(this, block);
2860 this->write_word(value, this->base +
2861 ONENAND_REG_START_ADDRESS1);
2862 }
2863
2864 if (page != -1) {
2865
2866 int sectors = 4, count = 4;
2867 int dataram;
2868
2869 switch (cmd) {
2870 default:
2871 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
2872 cmd = ONENAND_CMD_2X_PROG;
2873 dataram = ONENAND_CURRENT_BUFFERRAM(this);
2874 break;
2875 }
2876
2877
2878 value = onenand_page_address(page, sectors);
2879 this->write_word(value, this->base +
2880 ONENAND_REG_START_ADDRESS8);
2881
2882
2883 value = onenand_buffer_address(dataram, sectors, count);
2884 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
2885 }
2886
2887
2888 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
2889
2890
2891 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
2892
2893 return 0;
2894}
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906static int onenand_otp_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2907 struct mtd_oob_ops *ops)
2908{
2909 struct onenand_chip *this = mtd->priv;
2910 int column, ret = 0, oobsize;
2911 int written = 0;
2912 u_char *oobbuf;
2913 size_t len = ops->ooblen;
2914 const u_char *buf = ops->oobbuf;
2915 int block, value, status;
2916
2917 to += ops->ooboffs;
2918
2919
2920 ops->oobretlen = 0;
2921
2922 oobsize = mtd->oobsize;
2923
2924 column = to & (mtd->oobsize - 1);
2925
2926 oobbuf = this->oob_buf;
2927
2928
2929 while (written < len) {
2930 int thislen = min_t(int, oobsize, len - written);
2931
2932 cond_resched();
2933
2934 block = (int) (to >> this->erase_shift);
2935
2936
2937
2938
2939
2940 value = onenand_block_address(this, block);
2941 this->write_word(value, this->base +
2942 ONENAND_REG_START_ADDRESS1);
2943
2944
2945
2946
2947
2948
2949 value = onenand_bufferram_address(this, block);
2950 this->write_word(value, this->base +
2951 ONENAND_REG_START_ADDRESS2);
2952 ONENAND_SET_NEXT_BUFFERRAM(this);
2953
2954
2955
2956
2957 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
2958 this->wait(mtd, FL_OTPING);
2959
2960
2961
2962 memcpy(oobbuf + column, buf, thislen);
2963
2964
2965
2966
2967
2968
2969
2970 this->write_bufferram(mtd, ONENAND_SPARERAM,
2971 oobbuf, 0, mtd->oobsize);
2972
2973 onenand_otp_command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
2974 onenand_update_bufferram(mtd, to, 0);
2975 if (ONENAND_IS_2PLANE(this)) {
2976 ONENAND_SET_BUFFERRAM1(this);
2977 onenand_update_bufferram(mtd, to + this->writesize, 0);
2978 }
2979
2980 ret = this->wait(mtd, FL_WRITING);
2981 if (ret) {
2982 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2983 break;
2984 }
2985
2986
2987 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
2988 this->wait(mtd, FL_RESETING);
2989
2990 status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
2991 status &= 0x60;
2992
2993 if (status == 0x60) {
2994 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2995 printk(KERN_DEBUG "1st Block\tLOCKED\n");
2996 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
2997 } else if (status == 0x20) {
2998 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2999 printk(KERN_DEBUG "1st Block\tLOCKED\n");
3000 printk(KERN_DEBUG "OTP Block\tUN-LOCKED\n");
3001 } else if (status == 0x40) {
3002 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
3003 printk(KERN_DEBUG "1st Block\tUN-LOCKED\n");
3004 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
3005 } else {
3006 printk(KERN_DEBUG "Reboot to check\n");
3007 }
3008
3009 written += thislen;
3010 if (written == len)
3011 break;
3012
3013 to += mtd->writesize;
3014 buf += thislen;
3015 column = 0;
3016 }
3017
3018 ops->oobretlen = written;
3019
3020 return ret;
3021}
3022
3023
3024typedef int (*otp_op_t)(struct mtd_info *mtd, loff_t form, size_t len,
3025 size_t *retlen, u_char *buf);
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
3038 size_t *retlen, u_char *buf)
3039{
3040 struct onenand_chip *this = mtd->priv;
3041 struct mtd_oob_ops ops = {
3042 .len = len,
3043 .ooblen = 0,
3044 .datbuf = buf,
3045 .oobbuf = NULL,
3046 };
3047 int ret;
3048
3049
3050 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3051 this->wait(mtd, FL_OTPING);
3052
3053 ret = ONENAND_IS_4KB_PAGE(this) ?
3054 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
3055 onenand_read_ops_nolock(mtd, from, &ops);
3056
3057
3058 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3059 this->wait(mtd, FL_RESETING);
3060
3061 return ret;
3062}
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074static int do_otp_write(struct mtd_info *mtd, loff_t to, size_t len,
3075 size_t *retlen, u_char *buf)
3076{
3077 struct onenand_chip *this = mtd->priv;
3078 unsigned char *pbuf = buf;
3079 int ret;
3080 struct mtd_oob_ops ops;
3081
3082
3083 if (len < mtd->writesize) {
3084 memcpy(this->page_buf, buf, len);
3085 memset(this->page_buf + len, 0xff, mtd->writesize - len);
3086 pbuf = this->page_buf;
3087 len = mtd->writesize;
3088 }
3089
3090
3091 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3092 this->wait(mtd, FL_OTPING);
3093
3094 ops.len = len;
3095 ops.ooblen = 0;
3096 ops.datbuf = pbuf;
3097 ops.oobbuf = NULL;
3098 ret = onenand_write_ops_nolock(mtd, to, &ops);
3099 *retlen = ops.retlen;
3100
3101
3102 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3103 this->wait(mtd, FL_RESETING);
3104
3105 return ret;
3106}
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len,
3119 size_t *retlen, u_char *buf)
3120{
3121 struct onenand_chip *this = mtd->priv;
3122 struct mtd_oob_ops ops;
3123 int ret;
3124
3125 if (FLEXONENAND(this)) {
3126
3127
3128 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3129 this->wait(mtd, FL_OTPING);
3130
3131
3132
3133
3134 ops.len = mtd->writesize;
3135 ops.ooblen = 0;
3136 ops.datbuf = buf;
3137 ops.oobbuf = NULL;
3138 ret = onenand_write_ops_nolock(mtd, mtd->writesize * 49, &ops);
3139 *retlen = ops.retlen;
3140
3141
3142 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3143 this->wait(mtd, FL_RESETING);
3144 } else {
3145 ops.mode = MTD_OPS_PLACE_OOB;
3146 ops.ooblen = len;
3147 ops.oobbuf = buf;
3148 ops.ooboffs = 0;
3149 ret = onenand_otp_write_oob_nolock(mtd, from, &ops);
3150 *retlen = ops.oobretlen;
3151 }
3152
3153 return ret;
3154}
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
3169 size_t *retlen, u_char *buf,
3170 otp_op_t action, int mode)
3171{
3172 struct onenand_chip *this = mtd->priv;
3173 int otp_pages;
3174 int density;
3175 int ret = 0;
3176
3177 *retlen = 0;
3178
3179 density = onenand_get_density(this->device_id);
3180 if (density < ONENAND_DEVICE_DENSITY_512Mb)
3181 otp_pages = 20;
3182 else
3183 otp_pages = 50;
3184
3185 if (mode == MTD_OTP_FACTORY) {
3186 from += mtd->writesize * otp_pages;
3187 otp_pages = ONENAND_PAGES_PER_BLOCK - otp_pages;
3188 }
3189
3190
3191 if (mode == MTD_OTP_USER) {
3192 if (mtd->writesize * otp_pages < from + len)
3193 return 0;
3194 } else {
3195 if (mtd->writesize * otp_pages < len)
3196 return 0;
3197 }
3198
3199 onenand_get_device(mtd, FL_OTPING);
3200 while (len > 0 && otp_pages > 0) {
3201 if (!action) {
3202 struct otp_info *otpinfo;
3203
3204 len -= sizeof(struct otp_info);
3205 if (len <= 0) {
3206 ret = -ENOSPC;
3207 break;
3208 }
3209
3210 otpinfo = (struct otp_info *) buf;
3211 otpinfo->start = from;
3212 otpinfo->length = mtd->writesize;
3213 otpinfo->locked = 0;
3214
3215 from += mtd->writesize;
3216 buf += sizeof(struct otp_info);
3217 *retlen += sizeof(struct otp_info);
3218 } else {
3219 size_t tmp_retlen;
3220
3221 ret = action(mtd, from, len, &tmp_retlen, buf);
3222
3223 buf += tmp_retlen;
3224 len -= tmp_retlen;
3225 *retlen += tmp_retlen;
3226
3227 if (ret)
3228 break;
3229 }
3230 otp_pages--;
3231 }
3232 onenand_release_device(mtd);
3233
3234 return ret;
3235}
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246static int onenand_get_fact_prot_info(struct mtd_info *mtd, size_t len,
3247 size_t *retlen, struct otp_info *buf)
3248{
3249 return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3250 MTD_OTP_FACTORY);
3251}
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
3264 size_t len, size_t *retlen, u_char *buf)
3265{
3266 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_FACTORY);
3267}
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278static int onenand_get_user_prot_info(struct mtd_info *mtd, size_t len,
3279 size_t *retlen, struct otp_info *buf)
3280{
3281 return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3282 MTD_OTP_USER);
3283}
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295static int onenand_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
3296 size_t len, size_t *retlen, u_char *buf)
3297{
3298 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_USER);
3299}
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311static int onenand_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
3312 size_t len, size_t *retlen, u_char *buf)
3313{
3314 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_write, MTD_OTP_USER);
3315}
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325static int onenand_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
3326 size_t len)
3327{
3328 struct onenand_chip *this = mtd->priv;
3329 u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf;
3330 size_t retlen;
3331 int ret;
3332 unsigned int otp_lock_offset = ONENAND_OTP_LOCK_OFFSET;
3333
3334 memset(buf, 0xff, FLEXONENAND(this) ? this->writesize
3335 : mtd->oobsize);
3336
3337
3338
3339
3340
3341
3342
3343 from = 0;
3344 len = FLEXONENAND(this) ? mtd->writesize : 16;
3345
3346
3347
3348
3349
3350
3351
3352 if (FLEXONENAND(this))
3353 otp_lock_offset = FLEXONENAND_OTP_LOCK_OFFSET;
3354
3355
3356 if (otp == 1)
3357 buf[otp_lock_offset] = 0xFC;
3358 else if (otp == 2)
3359 buf[otp_lock_offset] = 0xF3;
3360 else if (otp == 3)
3361 buf[otp_lock_offset] = 0xF0;
3362 else if (otp != 0)
3363 printk(KERN_DEBUG "[OneNAND] Invalid option selected for OTP\n");
3364
3365 ret = onenand_otp_walk(mtd, from, len, &retlen, buf, do_otp_lock, MTD_OTP_USER);
3366
3367 return ret ? : retlen;
3368}
3369
3370#endif
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380static void onenand_check_features(struct mtd_info *mtd)
3381{
3382 struct onenand_chip *this = mtd->priv;
3383 unsigned int density, process, numbufs;
3384
3385
3386 density = onenand_get_density(this->device_id);
3387 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT;
3388 numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8;
3389
3390
3391 switch (density) {
3392 case ONENAND_DEVICE_DENSITY_4Gb:
3393 if (ONENAND_IS_DDP(this))
3394 this->options |= ONENAND_HAS_2PLANE;
3395 else if (numbufs == 1) {
3396 this->options |= ONENAND_HAS_4KB_PAGE;
3397 this->options |= ONENAND_HAS_CACHE_PROGRAM;
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409 if ((this->version_id & 0xf) == 0xe)
3410 this->options |= ONENAND_HAS_NOP_1;
3411 }
3412
3413 case ONENAND_DEVICE_DENSITY_2Gb:
3414
3415 if (!ONENAND_IS_DDP(this))
3416 this->options |= ONENAND_HAS_2PLANE;
3417 this->options |= ONENAND_HAS_UNLOCK_ALL;
3418
3419 case ONENAND_DEVICE_DENSITY_1Gb:
3420
3421 if (process)
3422 this->options |= ONENAND_HAS_UNLOCK_ALL;
3423 break;
3424
3425 default:
3426
3427 if (!process)
3428 this->options |= ONENAND_HAS_CONT_LOCK;
3429 break;
3430 }
3431
3432
3433 if (ONENAND_IS_MLC(this))
3434 this->options |= ONENAND_HAS_4KB_PAGE;
3435
3436 if (ONENAND_IS_4KB_PAGE(this))
3437 this->options &= ~ONENAND_HAS_2PLANE;
3438
3439 if (FLEXONENAND(this)) {
3440 this->options &= ~ONENAND_HAS_CONT_LOCK;
3441 this->options |= ONENAND_HAS_UNLOCK_ALL;
3442 }
3443
3444 if (this->options & ONENAND_HAS_CONT_LOCK)
3445 printk(KERN_DEBUG "Lock scheme is Continuous Lock\n");
3446 if (this->options & ONENAND_HAS_UNLOCK_ALL)
3447 printk(KERN_DEBUG "Chip support all block unlock\n");
3448 if (this->options & ONENAND_HAS_2PLANE)
3449 printk(KERN_DEBUG "Chip has 2 plane\n");
3450 if (this->options & ONENAND_HAS_4KB_PAGE)
3451 printk(KERN_DEBUG "Chip has 4KiB pagesize\n");
3452 if (this->options & ONENAND_HAS_CACHE_PROGRAM)
3453 printk(KERN_DEBUG "Chip has cache program feature\n");
3454}
3455
3456
3457
3458
3459
3460
3461
3462
3463static void onenand_print_device_info(int device, int version)
3464{
3465 int vcc, demuxed, ddp, density, flexonenand;
3466
3467 vcc = device & ONENAND_DEVICE_VCC_MASK;
3468 demuxed = device & ONENAND_DEVICE_IS_DEMUX;
3469 ddp = device & ONENAND_DEVICE_IS_DDP;
3470 density = onenand_get_density(device);
3471 flexonenand = device & DEVICE_IS_FLEXONENAND;
3472 printk(KERN_INFO "%s%sOneNAND%s %dMB %sV 16-bit (0x%02x)\n",
3473 demuxed ? "" : "Muxed ",
3474 flexonenand ? "Flex-" : "",
3475 ddp ? "(DDP)" : "",
3476 (16 << density),
3477 vcc ? "2.65/3.3" : "1.8",
3478 device);
3479 printk(KERN_INFO "OneNAND version = 0x%04x\n", version);
3480}
3481
3482static const struct onenand_manufacturers onenand_manuf_ids[] = {
3483 {ONENAND_MFR_SAMSUNG, "Samsung"},
3484 {ONENAND_MFR_NUMONYX, "Numonyx"},
3485};
3486
3487
3488
3489
3490
3491
3492
3493static int onenand_check_maf(int manuf)
3494{
3495 int size = ARRAY_SIZE(onenand_manuf_ids);
3496 char *name;
3497 int i;
3498
3499 for (i = 0; i < size; i++)
3500 if (manuf == onenand_manuf_ids[i].id)
3501 break;
3502
3503 if (i < size)
3504 name = onenand_manuf_ids[i].name;
3505 else
3506 name = "Unknown";
3507
3508 printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf);
3509
3510 return (i == size);
3511}
3512
3513
3514
3515
3516
3517static int flexonenand_get_boundary(struct mtd_info *mtd)
3518{
3519 struct onenand_chip *this = mtd->priv;
3520 unsigned die, bdry;
3521 int syscfg, locked;
3522
3523
3524 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3525 this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1);
3526
3527 for (die = 0; die < this->dies; die++) {
3528 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3529 this->wait(mtd, FL_SYNCING);
3530
3531 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3532 this->wait(mtd, FL_READING);
3533
3534 bdry = this->read_word(this->base + ONENAND_DATARAM);
3535 if ((bdry >> FLEXONENAND_PI_UNLOCK_SHIFT) == 3)
3536 locked = 0;
3537 else
3538 locked = 1;
3539 this->boundary[die] = bdry & FLEXONENAND_PI_MASK;
3540
3541 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3542 this->wait(mtd, FL_RESETING);
3543
3544 printk(KERN_INFO "Die %d boundary: %d%s\n", die,
3545 this->boundary[die], locked ? "(Locked)" : "(Unlocked)");
3546 }
3547
3548
3549 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3550 return 0;
3551}
3552
3553
3554
3555
3556
3557
3558static void flexonenand_get_size(struct mtd_info *mtd)
3559{
3560 struct onenand_chip *this = mtd->priv;
3561 int die, i, eraseshift, density;
3562 int blksperdie, maxbdry;
3563 loff_t ofs;
3564
3565 density = onenand_get_density(this->device_id);
3566 blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift);
3567 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3568 maxbdry = blksperdie - 1;
3569 eraseshift = this->erase_shift - 1;
3570
3571 mtd->numeraseregions = this->dies << 1;
3572
3573
3574 flexonenand_get_boundary(mtd);
3575 die = ofs = 0;
3576 i = -1;
3577 for (; die < this->dies; die++) {
3578 if (!die || this->boundary[die-1] != maxbdry) {
3579 i++;
3580 mtd->eraseregions[i].offset = ofs;
3581 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3582 mtd->eraseregions[i].numblocks =
3583 this->boundary[die] + 1;
3584 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3585 eraseshift++;
3586 } else {
3587 mtd->numeraseregions -= 1;
3588 mtd->eraseregions[i].numblocks +=
3589 this->boundary[die] + 1;
3590 ofs += (this->boundary[die] + 1) << (eraseshift - 1);
3591 }
3592 if (this->boundary[die] != maxbdry) {
3593 i++;
3594 mtd->eraseregions[i].offset = ofs;
3595 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3596 mtd->eraseregions[i].numblocks = maxbdry ^
3597 this->boundary[die];
3598 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3599 eraseshift--;
3600 } else
3601 mtd->numeraseregions -= 1;
3602 }
3603
3604
3605 mtd->erasesize = 1 << this->erase_shift;
3606 if (mtd->numeraseregions == 1)
3607 mtd->erasesize >>= 1;
3608
3609 printk(KERN_INFO "Device has %d eraseregions\n", mtd->numeraseregions);
3610 for (i = 0; i < mtd->numeraseregions; i++)
3611 printk(KERN_INFO "[offset: 0x%08x, erasesize: 0x%05x,"
3612 " numblocks: %04u]\n",
3613 (unsigned int) mtd->eraseregions[i].offset,
3614 mtd->eraseregions[i].erasesize,
3615 mtd->eraseregions[i].numblocks);
3616
3617 for (die = 0, mtd->size = 0; die < this->dies; die++) {
3618 this->diesize[die] = (loff_t)blksperdie << this->erase_shift;
3619 this->diesize[die] -= (loff_t)(this->boundary[die] + 1)
3620 << (this->erase_shift - 1);
3621 mtd->size += this->diesize[die];
3622 }
3623}
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int end)
3640{
3641 struct onenand_chip *this = mtd->priv;
3642 int i, ret;
3643 int block;
3644 struct mtd_oob_ops ops = {
3645 .mode = MTD_OPS_PLACE_OOB,
3646 .ooboffs = 0,
3647 .ooblen = mtd->oobsize,
3648 .datbuf = NULL,
3649 .oobbuf = this->oob_buf,
3650 };
3651 loff_t addr;
3652
3653 printk(KERN_DEBUG "Check blocks from %d to %d\n", start, end);
3654
3655 for (block = start; block <= end; block++) {
3656 addr = flexonenand_addr(this, block);
3657 if (onenand_block_isbad_nolock(mtd, addr, 0))
3658 continue;
3659
3660
3661
3662
3663
3664 ret = onenand_read_oob_nolock(mtd, addr, &ops);
3665 if (ret)
3666 return ret;
3667
3668 for (i = 0; i < mtd->oobsize; i++)
3669 if (this->oob_buf[i] != 0xff)
3670 break;
3671
3672 if (i != mtd->oobsize) {
3673 printk(KERN_WARNING "%s: Block %d not erased.\n",
3674 __func__, block);
3675 return 1;
3676 }
3677 }
3678
3679 return 0;
3680}
3681
3682
3683
3684
3685
3686static int flexonenand_set_boundary(struct mtd_info *mtd, int die,
3687 int boundary, int lock)
3688{
3689 struct onenand_chip *this = mtd->priv;
3690 int ret, density, blksperdie, old, new, thisboundary;
3691 loff_t addr;
3692
3693
3694 if (die && (!ONENAND_IS_DDP(this)))
3695 return 0;
3696
3697
3698 if (boundary < 0 || boundary == this->boundary[die])
3699 return 0;
3700
3701 density = onenand_get_density(this->device_id);
3702 blksperdie = ((16 << density) << 20) >> this->erase_shift;
3703 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3704
3705 if (boundary >= blksperdie) {
3706 printk(KERN_ERR "%s: Invalid boundary value. "
3707 "Boundary not changed.\n", __func__);
3708 return -EINVAL;
3709 }
3710
3711
3712 old = this->boundary[die] + (die * this->density_mask);
3713 new = boundary + (die * this->density_mask);
3714 ret = flexonenand_check_blocks_erased(mtd, min(old, new) + 1, max(old, new));
3715 if (ret) {
3716 printk(KERN_ERR "%s: Please erase blocks "
3717 "before boundary change\n", __func__);
3718 return ret;
3719 }
3720
3721 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3722 this->wait(mtd, FL_SYNCING);
3723
3724
3725 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3726 this->wait(mtd, FL_READING);
3727
3728 thisboundary = this->read_word(this->base + ONENAND_DATARAM);
3729 if ((thisboundary >> FLEXONENAND_PI_UNLOCK_SHIFT) != 3) {
3730 printk(KERN_ERR "%s: boundary locked\n", __func__);
3731 ret = 1;
3732 goto out;
3733 }
3734
3735 printk(KERN_INFO "Changing die %d boundary: %d%s\n",
3736 die, boundary, lock ? "(Locked)" : "(Unlocked)");
3737
3738 addr = die ? this->diesize[0] : 0;
3739
3740 boundary &= FLEXONENAND_PI_MASK;
3741 boundary |= lock ? 0 : (3 << FLEXONENAND_PI_UNLOCK_SHIFT);
3742
3743 this->command(mtd, ONENAND_CMD_ERASE, addr, 0);
3744 ret = this->wait(mtd, FL_ERASING);
3745 if (ret) {
3746 printk(KERN_ERR "%s: Failed PI erase for Die %d\n",
3747 __func__, die);
3748 goto out;
3749 }
3750
3751 this->write_word(boundary, this->base + ONENAND_DATARAM);
3752 this->command(mtd, ONENAND_CMD_PROG, addr, 0);
3753 ret = this->wait(mtd, FL_WRITING);
3754 if (ret) {
3755 printk(KERN_ERR "%s: Failed PI write for Die %d\n",
3756 __func__, die);
3757 goto out;
3758 }
3759
3760 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0);
3761 ret = this->wait(mtd, FL_WRITING);
3762out:
3763 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND);
3764 this->wait(mtd, FL_RESETING);
3765 if (!ret)
3766
3767 flexonenand_get_size(mtd);
3768
3769 return ret;
3770}
3771
3772
3773
3774
3775
3776
3777
3778
3779static int onenand_chip_probe(struct mtd_info *mtd)
3780{
3781 struct onenand_chip *this = mtd->priv;
3782 int bram_maf_id, bram_dev_id, maf_id, dev_id;
3783 int syscfg;
3784
3785
3786 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3787
3788 this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base + ONENAND_REG_SYS_CFG1);
3789
3790
3791 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
3792
3793
3794 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0);
3795 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2);
3796
3797
3798 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM);
3799
3800 this->wait(mtd, FL_RESETING);
3801
3802
3803 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3804
3805
3806 if (onenand_check_maf(bram_maf_id))
3807 return -ENXIO;
3808
3809
3810 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
3811 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3812
3813
3814 if (maf_id != bram_maf_id || dev_id != bram_dev_id)
3815 return -ENXIO;
3816
3817 return 0;
3818}
3819
3820
3821
3822
3823
3824static int onenand_probe(struct mtd_info *mtd)
3825{
3826 struct onenand_chip *this = mtd->priv;
3827 int dev_id, ver_id;
3828 int density;
3829 int ret;
3830
3831 ret = this->chip_probe(mtd);
3832 if (ret)
3833 return ret;
3834
3835
3836 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3837 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
3838 this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
3839
3840
3841 onenand_print_device_info(dev_id, ver_id);
3842 this->device_id = dev_id;
3843 this->version_id = ver_id;
3844
3845
3846 onenand_check_features(mtd);
3847
3848 density = onenand_get_density(dev_id);
3849 if (FLEXONENAND(this)) {
3850 this->dies = ONENAND_IS_DDP(this) ? 2 : 1;
3851
3852 mtd->numeraseregions = this->dies << 1;
3853 mtd->eraseregions = kzalloc(sizeof(struct mtd_erase_region_info)
3854 * (this->dies << 1), GFP_KERNEL);
3855 if (!mtd->eraseregions)
3856 return -ENOMEM;
3857 }
3858
3859
3860
3861
3862
3863 this->chipsize = (16 << density) << 20;
3864
3865
3866
3867 mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
3868
3869 if (ONENAND_IS_4KB_PAGE(this))
3870 mtd->writesize <<= 1;
3871
3872 mtd->oobsize = mtd->writesize >> 5;
3873
3874 mtd->erasesize = mtd->writesize << 6;
3875
3876
3877
3878
3879
3880 if (FLEXONENAND(this))
3881 mtd->erasesize <<= 1;
3882
3883 this->erase_shift = ffs(mtd->erasesize) - 1;
3884 this->page_shift = ffs(mtd->writesize) - 1;
3885 this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1;
3886
3887 if (ONENAND_IS_DDP(this))
3888 this->density_mask = this->chipsize >> (this->erase_shift + 1);
3889
3890 this->writesize = mtd->writesize;
3891
3892
3893
3894 if (FLEXONENAND(this))
3895 flexonenand_get_size(mtd);
3896 else
3897 mtd->size = this->chipsize;
3898
3899
3900
3901
3902
3903
3904
3905 if (ONENAND_IS_2PLANE(this)) {
3906 mtd->writesize <<= 1;
3907 mtd->erasesize <<= 1;
3908 }
3909
3910 return 0;
3911}
3912
3913
3914
3915
3916
3917static int onenand_suspend(struct mtd_info *mtd)
3918{
3919 return onenand_get_device(mtd, FL_PM_SUSPENDED);
3920}
3921
3922
3923
3924
3925
3926static void onenand_resume(struct mtd_info *mtd)
3927{
3928 struct onenand_chip *this = mtd->priv;
3929
3930 if (this->state == FL_PM_SUSPENDED)
3931 onenand_release_device(mtd);
3932 else
3933 printk(KERN_ERR "%s: resume() called for the chip which is not "
3934 "in suspended state\n", __func__);
3935}
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947int onenand_scan(struct mtd_info *mtd, int maxchips)
3948{
3949 int i, ret;
3950 struct onenand_chip *this = mtd->priv;
3951
3952 if (!this->read_word)
3953 this->read_word = onenand_readw;
3954 if (!this->write_word)
3955 this->write_word = onenand_writew;
3956
3957 if (!this->command)
3958 this->command = onenand_command;
3959 if (!this->wait)
3960 onenand_setup_wait(mtd);
3961 if (!this->bbt_wait)
3962 this->bbt_wait = onenand_bbt_wait;
3963 if (!this->unlock_all)
3964 this->unlock_all = onenand_unlock_all;
3965
3966 if (!this->chip_probe)
3967 this->chip_probe = onenand_chip_probe;
3968
3969 if (!this->read_bufferram)
3970 this->read_bufferram = onenand_read_bufferram;
3971 if (!this->write_bufferram)
3972 this->write_bufferram = onenand_write_bufferram;
3973
3974 if (!this->block_markbad)
3975 this->block_markbad = onenand_default_block_markbad;
3976 if (!this->scan_bbt)
3977 this->scan_bbt = onenand_default_bbt;
3978
3979 if (onenand_probe(mtd))
3980 return -ENXIO;
3981
3982
3983 if (this->mmcontrol) {
3984 printk(KERN_INFO "OneNAND Sync. Burst Read support\n");
3985 this->read_bufferram = onenand_sync_read_bufferram;
3986 }
3987
3988
3989 if (!this->page_buf) {
3990 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3991 if (!this->page_buf)
3992 return -ENOMEM;
3993#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
3994 this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3995 if (!this->verify_buf) {
3996 kfree(this->page_buf);
3997 return -ENOMEM;
3998 }
3999#endif
4000 this->options |= ONENAND_PAGEBUF_ALLOC;
4001 }
4002 if (!this->oob_buf) {
4003 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
4004 if (!this->oob_buf) {
4005 if (this->options & ONENAND_PAGEBUF_ALLOC) {
4006 this->options &= ~ONENAND_PAGEBUF_ALLOC;
4007 kfree(this->page_buf);
4008 }
4009 return -ENOMEM;
4010 }
4011 this->options |= ONENAND_OOBBUF_ALLOC;
4012 }
4013
4014 this->state = FL_READY;
4015 init_waitqueue_head(&this->wq);
4016 spin_lock_init(&this->chip_lock);
4017
4018
4019
4020
4021 switch (mtd->oobsize) {
4022 case 128:
4023 if (FLEXONENAND(this)) {
4024 this->ecclayout = &flexonenand_oob_128;
4025 mtd->subpage_sft = 0;
4026 } else {
4027 this->ecclayout = &onenand_oob_128;
4028 mtd->subpage_sft = 2;
4029 }
4030 if (ONENAND_IS_NOP_1(this))
4031 mtd->subpage_sft = 0;
4032 break;
4033 case 64:
4034 this->ecclayout = &onenand_oob_64;
4035 mtd->subpage_sft = 2;
4036 break;
4037
4038 case 32:
4039 this->ecclayout = &onenand_oob_32;
4040 mtd->subpage_sft = 1;
4041 break;
4042
4043 default:
4044 printk(KERN_WARNING "%s: No OOB scheme defined for oobsize %d\n",
4045 __func__, mtd->oobsize);
4046 mtd->subpage_sft = 0;
4047
4048 this->ecclayout = &onenand_oob_32;
4049 break;
4050 }
4051
4052 this->subpagesize = mtd->writesize >> mtd->subpage_sft;
4053
4054
4055
4056
4057
4058 this->ecclayout->oobavail = 0;
4059 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
4060 this->ecclayout->oobfree[i].length; i++)
4061 this->ecclayout->oobavail +=
4062 this->ecclayout->oobfree[i].length;
4063 mtd->oobavail = this->ecclayout->oobavail;
4064
4065 mtd->ecclayout = this->ecclayout;
4066 mtd->ecc_strength = 1;
4067
4068
4069 mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH;
4070 mtd->flags = MTD_CAP_NANDFLASH;
4071 mtd->_erase = onenand_erase;
4072 mtd->_point = NULL;
4073 mtd->_unpoint = NULL;
4074 mtd->_read = onenand_read;
4075 mtd->_write = onenand_write;
4076 mtd->_read_oob = onenand_read_oob;
4077 mtd->_write_oob = onenand_write_oob;
4078 mtd->_panic_write = onenand_panic_write;
4079#ifdef CONFIG_MTD_ONENAND_OTP
4080 mtd->_get_fact_prot_info = onenand_get_fact_prot_info;
4081 mtd->_read_fact_prot_reg = onenand_read_fact_prot_reg;
4082 mtd->_get_user_prot_info = onenand_get_user_prot_info;
4083 mtd->_read_user_prot_reg = onenand_read_user_prot_reg;
4084 mtd->_write_user_prot_reg = onenand_write_user_prot_reg;
4085 mtd->_lock_user_prot_reg = onenand_lock_user_prot_reg;
4086#endif
4087 mtd->_sync = onenand_sync;
4088 mtd->_lock = onenand_lock;
4089 mtd->_unlock = onenand_unlock;
4090 mtd->_suspend = onenand_suspend;
4091 mtd->_resume = onenand_resume;
4092 mtd->_block_isbad = onenand_block_isbad;
4093 mtd->_block_markbad = onenand_block_markbad;
4094 mtd->owner = THIS_MODULE;
4095 mtd->writebufsize = mtd->writesize;
4096
4097
4098 if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING))
4099 this->unlock_all(mtd);
4100
4101 ret = this->scan_bbt(mtd);
4102 if ((!FLEXONENAND(this)) || ret)
4103 return ret;
4104
4105
4106 for (i = 0; i < MAX_DIES; i++)
4107 flexonenand_set_boundary(mtd, i, flex_bdry[2 * i],
4108 flex_bdry[(2 * i) + 1]);
4109
4110 return 0;
4111}
4112
4113
4114
4115
4116
4117void onenand_release(struct mtd_info *mtd)
4118{
4119 struct onenand_chip *this = mtd->priv;
4120
4121
4122 mtd_device_unregister(mtd);
4123
4124
4125 if (this->bbm) {
4126 struct bbm_info *bbm = this->bbm;
4127 kfree(bbm->bbt);
4128 kfree(this->bbm);
4129 }
4130
4131 if (this->options & ONENAND_PAGEBUF_ALLOC) {
4132 kfree(this->page_buf);
4133#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4134 kfree(this->verify_buf);
4135#endif
4136 }
4137 if (this->options & ONENAND_OOBBUF_ALLOC)
4138 kfree(this->oob_buf);
4139 kfree(mtd->eraseregions);
4140}
4141
4142EXPORT_SYMBOL_GPL(onenand_scan);
4143EXPORT_SYMBOL_GPL(onenand_release);
4144
4145MODULE_LICENSE("GPL");
4146MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
4147MODULE_DESCRIPTION("Generic OneNAND flash driver code");
4148