3 * drivers/mtd/nand/rk2818_nand.c
5 * Copyright (C) 2010 RockChip, Inc.
6 * Author: hxy@rock-chips.com
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <linux/module.h>
19 #include <linux/delay.h>
20 #include <linux/slab.h>
21 #include <linux/init.h>
22 #include <linux/mtd/mtd.h>
23 #include <linux/mtd/nand.h>
24 #include <linux/mtd/partitions.h>
25 #include <linux/interrupt.h>
26 #include <linux/device.h>
27 #include <linux/platform_device.h>
28 #include <linux/clk.h>
29 #include <linux/err.h>
32 #include <mach/rk2818_nand.h>
34 #define PROGRAM_BUSY_COUNT 10000
35 #define ERASE_BUSY_COUNT 20000
36 #define READ_BUSY_COUNT 5000
38 /* Define delays in microsec for NAND device operations */
39 #define TROP_US_DELAY 2000
41 struct rk2818_nand_mtd {
43 struct nand_chip nand;
44 struct mtd_partition *parts;
46 const struct rk2818_nand_flash *flash_info;
53 /* OOB placement block for use with software ecc generation */
54 static struct nand_ecclayout nand_sw_eccoob_8 = {
56 .eccpos = { 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
57 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55},
58 .oobfree = {{0,8},{56, 72}}
61 /* OOB placement block for use with hardware ecc generation */
62 static struct nand_ecclayout nand_hw_eccoob_16 = {
64 .eccpos = { 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,
65 18,19,20,21,22,23,24,25,26,27,28,29,30,31},
69 #ifdef CONFIG_MTD_PARTITIONS
70 static const char *part_probes[] = { "cmdlinepart", NULL };
74 static void rk2818_nand_wait_busy(struct mtd_info *mtd, uint32_t timeout)
77 struct nand_chip *nand_chip = mtd->priv;
78 struct rk2818_nand_mtd *master = nand_chip->priv;
79 pNANDC pRK28NC= (pNANDC)(master->regs);
85 if ( pRK28NC->FMCTL& FMC_FRDY)
93 static void rk2818_nand_wait_bchdone(struct mtd_info *mtd, uint32_t timeout)
96 struct nand_chip *nand_chip = mtd->priv;
97 struct rk2818_nand_mtd *master = nand_chip->priv;
98 pNANDC pRK28NC= (pNANDC)(master->regs);
104 if(pRK28NC->BCHST &(1<<1))
112 static void wait_op_done(struct mtd_info *mtd, int max_retries, uint16_t param)
114 struct nand_chip *nand_chip = mtd->priv;
115 struct rk2818_nand_mtd *master = nand_chip->priv;
116 pNANDC pRK28NC= (pNANDC)(master->regs);
118 while (max_retries-- > 0) {
120 if (pRK28NC->FLCTL & FL_RDY)
125 static int rk2818_nand_dev_ready(struct mtd_info *mtd)
127 struct nand_chip *nand_chip = mtd->priv;
128 struct rk2818_nand_mtd *master = nand_chip->priv;
129 pNANDC pRK28NC= (pNANDC)(master->regs);
131 if(pRK28NC->FMCTL& FMC_FRDY)
140 static void rk2818_nand_select_chip(struct mtd_info *mtd, int chip)
142 struct nand_chip *nand_chip = mtd->priv;
143 struct rk2818_nand_mtd *master = nand_chip->priv;
144 pNANDC pRK28NC= (pNANDC)(master->regs);
146 pRK28NC ->FMCTL |= 0x1<<chip;
152 static u_char rk2818_nand_read_byte(struct mtd_info *mtd)
154 struct nand_chip *nand_chip = mtd->priv;
155 struct rk2818_nand_mtd *master = nand_chip->priv;
156 pNANDC pRK28NC= (pNANDC)(master->regs);
159 pRK28NC->FLCTL &= ~FL_BYPASS; // bypass mode
160 ret = (u_char)(pRK28NC ->chip[0].data);
165 * ¶ÁÒ»¸öword ³¤¶ÈÊý¾Ý
167 static u16 rk2818_nand_read_word(struct mtd_info *mtd)
169 struct nand_chip *nand_chip = mtd->priv;
170 struct rk2818_nand_mtd *master = nand_chip->priv;
171 pNANDC pRK28NC= (pNANDC)(master->regs);
173 u_char tmp1 = 0,tmp2=0;
176 pRK28NC->FLCTL &= ~FL_BYPASS; // bypass mode
178 tmp1 = (u_char)(pRK28NC ->chip[0].data);
179 tmp2 = (u_char)(pRK28NC ->chip[0].data);
181 ret = (tmp2 <<8)|tmp1;
186 static void rk2818_nand_read_buf(struct mtd_info *mtd, u_char* const buf, int len)
188 struct nand_chip *nand_chip = mtd->priv;
189 struct rk2818_nand_mtd *master = nand_chip->priv;
190 pNANDC pRK28NC= (pNANDC)(master->regs);
194 if ( len < mtd->writesize ) // read oob
196 pRK28NC ->BCHCTL = BCH_RST;
197 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
198 wait_op_done(mtd,TROP_US_DELAY,0);
199 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
200 memcpy(buf,(u_char *)(pRK28NC->spare),4); // only use nandc sram0
204 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
205 for(i=0;i<mtd->writesize/0x400;i++)
207 pRK28NC ->BCHCTL = BCH_RST;
208 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
209 wait_op_done(mtd,TROP_US_DELAY,0);
210 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
211 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
219 static void rk2818_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
221 struct nand_chip *nand_chip = mtd->priv;
222 struct rk2818_nand_mtd *master = nand_chip->priv;
223 pNANDC pRK28NC= (pNANDC)(master->regs);
227 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
228 for(i=0;i<mtd->writesize/0x400;i++)
230 memcpy((u_char *)(pRK28NC->buf),buf+i*0x400,0x400); // only use nandc sram0
231 pRK28NC ->BCHCTL =BCH_WR|BCH_RST;
232 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|0x1<<5|FL_RDN|FL_BYPASS|FL_START;
233 wait_op_done(mtd,TROP_US_DELAY,0);
239 static void rk2818_nand_cmdfunc(struct mtd_info *mtd, unsigned command,int column, int page_addr)
241 struct nand_chip *nand_chip = mtd->priv;
242 struct rk2818_nand_mtd *master = nand_chip->priv;
243 pNANDC pRK28NC= (pNANDC)(master->regs);
245 uint32_t timeout = 1000;
250 case NAND_CMD_READID:
251 pRK28NC ->chip[0].cmd = command;
252 pRK28NC ->chip[0].addr = 0x0;
257 if(pRK28NC->FLCTL&FL_INTCLR)
265 pRK28NC ->chip[0].cmd = command;
268 pRK28NC ->chip[0].addr = column & 0xff;
269 if( mtd->writesize > 512)
270 pRK28NC ->chip[0].addr = (column >> 8) & 0xff;
274 pRK28NC ->chip[0].addr = page_addr & 0xff;
275 pRK28NC ->chip[0].addr = (page_addr >> 8) & 0xFF;
276 pRK28NC ->chip[0].addr = (page_addr >> 16) & 0xff;
278 if( mtd->writesize > 512)
279 pRK28NC ->chip[0].cmd = NAND_CMD_READSTART;
281 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
286 pRK28NC ->chip[0].cmd = command;
289 case NAND_CMD_READOOB:
290 pRK28NC ->BCHCTL = 0x0;
291 if( mtd->writesize > 512 )
292 command = NAND_CMD_READ0; // È«²¿¶Á£¬°üÀ¨¶Áoob
294 pRK28NC ->chip[0].cmd = command;
296 if ( mtd->writesize >512 )
300 pRK28NC ->chip[0].addr = (column + mtd->writesize) & 0xff;
301 pRK28NC ->chip[0].addr = ( (column + mtd->writesize) >> 8) & 0xff;
305 pRK28NC ->chip[0].addr = page_addr & 0xff;
306 pRK28NC ->chip[0].addr = (page_addr >> 8) & 0xFF;
307 pRK28NC ->chip[0].addr = (page_addr >> 16) & 0xff;
309 pRK28NC ->chip[0].cmd = NAND_CMD_READSTART;
313 pRK28NC ->chip[0].addr = column;
316 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
321 case NAND_CMD_PAGEPROG:
322 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
323 pRK28NC ->chip[0].cmd = command;
324 rk2818_nand_wait_busy(mtd,PROGRAM_BUSY_COUNT);
326 pRK28NC ->chip[0].cmd = NAND_CMD_STATUS;
327 status = pRK28NC ->chip[0].data;
336 case NAND_CMD_ERASE1:
337 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
338 pRK28NC ->BCHCTL = 0x0;
339 pRK28NC ->chip[0].cmd = command;
342 pRK28NC ->chip[0].addr = page_addr & 0xff;
343 pRK28NC ->chip[0].addr = (page_addr>>8)&0xff;
344 pRK28NC ->chip[0].addr = (page_addr>>16)&0xff;
348 case NAND_CMD_ERASE2:
349 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
350 pRK28NC ->chip[0].cmd = command;
351 rk2818_nand_wait_busy(mtd,ERASE_BUSY_COUNT);
352 pRK28NC ->chip[0].cmd = NAND_CMD_STATUS;
353 status = pRK28NC ->chip[0].data;
363 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
364 pRK28NC ->chip[0].cmd = command;
368 pRK28NC ->chip[0].addr = column;
369 if( mtd->writesize > 512)
370 pRK28NC ->chip[0].addr = (column >> 8) & 0xff;
374 pRK28NC ->chip[0].addr = page_addr & 0xff;
375 pRK28NC ->chip[0].addr = (page_addr>>8)&0xff;
376 pRK28NC ->chip[0].addr = (page_addr>>16)&0xff;
381 case NAND_CMD_STATUS:
382 pRK28NC ->BCHCTL = 0x0;
383 pRK28NC ->chip[0].cmd = command;
387 pRK28NC ->chip[0].cmd = command;
390 /* This applies to read commands */
392 pRK28NC ->chip[0].cmd = command;
400 int rk2818_nand_calculate_ecc(struct mtd_info *mtd,const uint8_t *dat,uint8_t *ecc_code)
402 struct nand_chip *nand_chip = mtd->priv;
403 struct rk2818_nand_mtd *master = nand_chip->priv;
404 pNANDC pRK28NC= (pNANDC)(master->regs);
410 eccdata[i] = pRK28NC->spare[i+1];
413 ecc_code[i*4] = eccdata[i]& 0xff;
414 ecc_code[i*4+1] = (eccdata[i]>> 8)& 0xff;
415 ecc_code[i*4+2] = (eccdata[i]>>16)& 0xff;
416 ecc_code[i*4+3] = (eccdata[i]>>24)& 0xff;
423 void rk2818_nand_hwctl_ecc(struct mtd_info *mtd, int mode)
425 struct nand_chip *nand_chip = mtd->priv;
426 struct rk2818_nand_mtd *master = nand_chip->priv;
427 pNANDC pRK28NC= (pNANDC)(master->regs);
429 pRK28NC->BCHCTL = 1; // reset bch and enable hw ecc
434 int rk2818_nand_correct_data(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc,uint8_t *calc_ecc)
436 struct nand_chip *nand_chip = mtd->priv;
437 struct rk2818_nand_mtd *master = nand_chip->priv;
438 pNANDC pRK28NC= (pNANDC)(master->regs);
441 if( pRK28NC->BCHST & (1<<2) )
443 DEBUG(MTD_DEBUG_LEVEL0,
444 "rk2818 nand :hw ecc uncorrectable error\n");
451 int rk2818_nand_read_page(struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf, int page)
453 struct nand_chip *nand_chip = mtd->priv;
454 struct rk2818_nand_mtd *master = nand_chip->priv;
455 pNANDC pRK28NC= (pNANDC)(master->regs);
461 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
463 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
465 for(i=0;i<mtd->writesize/0x400;i++)
467 pRK28NC ->BCHCTL = BCH_RST;
468 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
469 wait_op_done(mtd,TROP_US_DELAY,0);
470 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
472 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
479 void rk2818_nand_write_page(struct mtd_info *mtd,struct nand_chip *chip,const uint8_t *buf)
481 struct nand_chip *nand_chip = mtd->priv;
482 struct rk2818_nand_mtd *master = nand_chip->priv;
483 pNANDC pRK28NC= (pNANDC)(master->regs);
488 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
489 for(i=0;i<mtd->writesize/0x400;i++)
491 memcpy((u_char *)(pRK28NC->buf),(buf+i*0x400),0x400); // only use nandc sram0
493 memcpy((u_char *)(pRK28NC->spare),(u_char *)(chip->oob_poi + chip->ops.ooboffs),4);
495 pRK28NC ->BCHCTL = BCH_WR|BCH_RST;
496 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_RDN|FL_BYPASS|FL_START;
497 wait_op_done(mtd,TROP_US_DELAY,0);
500 pRK28NC ->chip[0].cmd = NAND_CMD_PAGEPROG;
501 rk2818_nand_wait_busy(mtd,PROGRAM_BUSY_COUNT);
508 int rk2818_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip, int page, int sndcmd)
510 struct nand_chip *nand_chip = mtd->priv;
511 struct rk2818_nand_mtd *master = nand_chip->priv;
512 pNANDC pRK28NC= (pNANDC)(master->regs);
516 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
520 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
522 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
524 for(i=0;i<mtd->writesize/0x400;i++)
526 pRK28NC ->BCHCTL = BCH_RST;
527 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
528 wait_op_done(mtd,TROP_US_DELAY,0);
529 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
530 // memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
532 memcpy((u_char *)(chip->oob_poi+ chip->ops.ooboffs),(u_char *)(pRK28NC->spare),4);
539 int rk2818_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int page)
541 struct nand_chip *nand_chip = mtd->priv;
542 struct rk2818_nand_mtd *master = nand_chip->priv;
543 pNANDC pRK28NC= (pNANDC)(master->regs);
549 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
551 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
553 for(i=0;i<mtd->writesize/0x400;i++)
555 pRK28NC ->BCHCTL = BCH_RST;
556 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
557 wait_op_done(mtd,TROP_US_DELAY,0);
558 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
559 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
561 memcpy((u_char *)(chip->oob_poi+ chip->ops.ooboffs),(u_char *)(pRK28NC->spare),4);
568 static int rk2818_nand_probe(struct platform_device *pdev)
570 struct nand_chip *this;
571 struct mtd_info *mtd;
572 struct rk2818_nand_platform_data *pdata = pdev->dev.platform_data;
573 struct rk2818_nand_mtd *master;
574 struct resource *res;
578 #ifdef CONFIG_MTD_PARTITIONS
579 struct mtd_partition *partitions = NULL;
580 int num_partitions = 0;
583 /* Allocate memory for MTD device structure and private data */
584 master = kzalloc(sizeof(struct rk2818_nand_mtd), GFP_KERNEL);
588 master->dev = &pdev->dev;
589 /* structures must be linked */
590 this = &master->nand;
593 mtd->owner = THIS_MODULE;
594 mtd->name = dev_name(&pdev->dev);
596 /* 50 us command delay time */
597 this->chip_delay = 5;
600 this->dev_ready = rk2818_nand_dev_ready;
601 this->cmdfunc = rk2818_nand_cmdfunc;
602 this->select_chip = rk2818_nand_select_chip;
603 this->read_byte = rk2818_nand_read_byte;
604 this->read_word = rk2818_nand_read_word;
605 this->write_buf = rk2818_nand_write_buf;
606 this->read_buf = rk2818_nand_read_buf;
607 this->options |= NAND_USE_FLASH_BBT; // open bbt options
610 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
616 master->regs = ioremap(res->start, res->end - res->start + 1);
623 this->ecc.calculate = rk2818_nand_calculate_ecc;
624 this->ecc.hwctl = rk2818_nand_hwctl_ecc;
625 this->ecc.correct = rk2818_nand_correct_data;
626 this->ecc.mode = NAND_ECC_HW;
627 this->ecc.read_page = rk2818_nand_read_page;
628 this->ecc.write_page = rk2818_nand_write_page;
629 this->ecc.read_oob = rk2818_nand_read_oob;
630 this->ecc.read_page_raw = rk2818_nand_read_page_raw;
631 this->ecc.size = 1024;
632 this->ecc.bytes = 28;
633 this->ecc.layout = &nand_hw_eccoob_16;
635 this->ecc.size = 256;
637 this->ecc.layout = &nand_sw_eccoob_8;
638 this->ecc.mode = NAND_ECC_SOFT;
641 pRK28NC = (pNANDC)(master->regs);
642 pRK28NC ->FMCTL = FMC_WP|FMC_FRDY|(0x1<<0);
643 pRK28NC ->FMWAIT |= (1<<FMW_RWCS_OFFSET)|(4<<FMW_RWPW_OFFSET)|(1<<FMW_CSRW_OFFSET);
644 pRK28NC ->BCHCTL = 0x1;
647 this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
648 /* NAND bus width determines access funtions used by upper layer */
649 if (pdata->width == 2) {
650 this->options |= NAND_BUSWIDTH_16;
651 this->ecc.layout = &nand_hw_eccoob_16;
654 /* Scan to find existence of the device */
655 if (nand_scan(mtd, 1)) {
656 DEBUG(MTD_DEBUG_LEVEL0,
657 "RK2818 NAND: Unable to find any NAND device.\n");
662 #ifdef CONFIG_MTD_PARTITIONS
663 num_partitions = parse_mtd_partitions(mtd, part_probes, &partitions, 0);
664 if (num_partitions > 0) {
665 printk(KERN_INFO "Using commandline partition definition\n");
666 add_mtd_partitions(mtd, partitions, num_partitions);
669 } else if (pdata->nr_parts) {
670 printk(KERN_INFO "Using board partition definition\n");
671 add_mtd_partitions(mtd, pdata->parts, pdata->nr_parts);
675 printk(KERN_INFO "no partition info available, registering whole flash at once\n");
679 platform_set_drvdata(pdev, master);
685 iounmap(master->regs);
692 static int rk2818_nand_remove(struct platform_device *pdev)
694 struct rk2818_nand_mtd *master = platform_get_drvdata(pdev);
696 platform_set_drvdata(pdev, NULL);
698 nand_release(&master->mtd);
699 iounmap(master->regs);
706 static int rk2818_nand_suspend(struct platform_device *pdev, pm_message_t state)
708 struct mtd_info *info = platform_get_drvdata(pdev);
711 DEBUG(MTD_DEBUG_LEVEL0, "RK2818_NAND : NAND suspend\n");
713 ret = info->suspend(info);
717 static int rk2818_nand_resume(struct platform_device *pdev)
719 struct mtd_info *info = platform_get_drvdata(pdev);
722 DEBUG(MTD_DEBUG_LEVEL0, "RK2818_NAND : NAND resume\n");
723 /* Enable the NFC clock */
731 #define rk2818_nand_suspend NULL
732 #define rk2818_nand_resume NULL
733 #endif /* CONFIG_PM */
736 static struct platform_driver rk2818_nand_driver = {
738 .name = "rk2818-nand",
740 .probe = rk2818_nand_probe,
741 .remove = rk2818_nand_remove,
742 .suspend = rk2818_nand_suspend,
743 .resume = rk2818_nand_resume,
746 static int __init rk2818_nand_init(void)
748 /* Register the device driver structure. */
749 printk("rk2818_nand_init\n");
750 return platform_driver_register(&rk2818_nand_driver);;
753 static void __exit rk2818_nand_exit(void)
755 /* Unregister the device structure */
756 platform_driver_unregister(&rk2818_nand_driver);
759 module_init(rk2818_nand_init);
760 module_exit(rk2818_nand_exit);
762 MODULE_LICENSE("GPL");
763 MODULE_AUTHOR("hxy <hxy@rock-chips.com>");
764 MODULE_DESCRIPTION("MTD NAND driver for rk2818 device");