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/cpufreq.h>
30 #include <linux/err.h>
33 #include <mach/rk2818_nand.h>
34 #include <mach/rk2818_iomap.h>
35 #include <mach/iomux.h>
37 #define PROGRAM_BUSY_COUNT 10000
38 #define ERASE_BUSY_COUNT 20000
39 #define READ_BUSY_COUNT 5000
41 /* Define delays in microsec for NAND device operations */
42 #define TROP_US_DELAY 2000
44 static struct mutex rknand_mutex;
45 //static spinlock_t rknand_lock;
48 struct rk2818_nand_mtd {
50 struct nand_chip nand;
51 struct mtd_partition *parts;
53 const struct rk2818_nand_flash *flash_info;
56 unsigned long clk_rate;
58 int cs; // support muliple nand chip,record current chip select
60 #ifdef CONFIG_CPU_FREQ
61 struct notifier_block freq_transition;
66 /* OOB placement block for use with software ecc generation */
67 static struct nand_ecclayout nand_sw_eccoob_8 = {
69 .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,
70 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55},
71 .oobfree = {{0,8},{56, 72}}
74 /* OOB placement block for use with hardware ecc generation */
75 static struct nand_ecclayout nand_hw_eccoob_16 = {
77 .eccpos = { 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,
78 18,19,20,21,22,23,24,25,26,27,28,29,30,31},
82 #ifdef CONFIG_MTD_PARTITIONS
83 static const char *part_probes[] = { "cmdlinepart", NULL };
87 static void rk2818_nand_wait_busy(struct mtd_info *mtd, uint32_t timeout)
90 struct nand_chip *nand_chip = mtd->priv;
91 struct rk2818_nand_mtd *master = nand_chip->priv;
92 pNANDC pRK28NC= (pNANDC)(master->regs);
98 if ( pRK28NC->FMCTL& FMC_FRDY)
106 static void rk2818_nand_wait_bchdone(struct mtd_info *mtd, uint32_t timeout)
109 struct nand_chip *nand_chip = mtd->priv;
110 struct rk2818_nand_mtd *master = nand_chip->priv;
111 pNANDC pRK28NC= (pNANDC)(master->regs);
117 if(pRK28NC->BCHST &(1<<1))
125 static void wait_op_done(struct mtd_info *mtd, int max_retries, uint16_t param)
127 struct nand_chip *nand_chip = mtd->priv;
128 struct rk2818_nand_mtd *master = nand_chip->priv;
129 pNANDC pRK28NC= (pNANDC)(master->regs);
131 while (max_retries-- > 0) {
133 if (pRK28NC->FLCTL & FL_RDY)
138 static int rk2818_nand_dev_ready(struct mtd_info *mtd)
140 struct nand_chip *nand_chip = mtd->priv;
141 struct rk2818_nand_mtd *master = nand_chip->priv;
142 pNANDC pRK28NC= (pNANDC)(master->regs);
144 if(pRK28NC->FMCTL& FMC_FRDY)
153 static void rk2818_nand_select_chip(struct mtd_info *mtd, int chip)
155 struct nand_chip *nand_chip = mtd->priv;
156 struct rk2818_nand_mtd *master = nand_chip->priv;
157 pNANDC pRK28NC= (pNANDC)(master->regs);
161 pRK28NC->FMCTL &=0xffffff00; // release chip select
165 pRK28NC->FMCTL &=0xffffff00;
166 pRK28NC ->FMCTL |= 0x1<<chip; // select chip
174 static u_char rk2818_nand_read_byte(struct mtd_info *mtd)
176 struct nand_chip *nand_chip = mtd->priv;
177 struct rk2818_nand_mtd *master = nand_chip->priv;
178 pNANDC pRK28NC= (pNANDC)(master->regs);
182 ret = (u_char)(pRK28NC ->chip[master->cs].data);
188 * ¶ÁÒ»¸öword ³¤¶ÈÊý¾Ý
190 static u16 rk2818_nand_read_word(struct mtd_info *mtd)
192 struct nand_chip *nand_chip = mtd->priv;
193 struct rk2818_nand_mtd *master = nand_chip->priv;
194 pNANDC pRK28NC= (pNANDC)(master->regs);
197 u_char tmp1 = 0,tmp2=0;
200 tmp1 = (u_char)(pRK28NC ->chip[master->cs].data);
201 tmp2 = (u_char)(pRK28NC ->chip[master->cs].data);
203 ret = (tmp2 <<8)|tmp1;
208 static void rk2818_nand_read_buf(struct mtd_info *mtd, u_char* const buf, int len)
210 struct nand_chip *nand_chip = mtd->priv;
211 struct rk2818_nand_mtd *master = nand_chip->priv;
212 pNANDC pRK28NC= (pNANDC)(master->regs);
215 mutex_lock(&rknand_mutex);
217 chipnr = master->cs ;
219 rk2818_nand_select_chip(mtd,chipnr);
223 if ( len < mtd->writesize ) // read oob
225 pRK28NC ->BCHCTL = BCH_RST;
226 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
227 wait_op_done(mtd,TROP_US_DELAY,0);
228 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
229 memcpy(buf,(u_char *)(pRK28NC->spare),4); // only use nandc sram0
233 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
234 for(i=0;i<mtd->writesize/0x400;i++)
236 pRK28NC ->BCHCTL = BCH_RST;
237 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
238 wait_op_done(mtd,TROP_US_DELAY,0);
239 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
240 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
246 rk2818_nand_select_chip(mtd,-1);
248 mutex_unlock(&rknand_mutex);
255 static void rk2818_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
257 struct nand_chip *nand_chip = mtd->priv;
258 struct rk2818_nand_mtd *master = nand_chip->priv;
259 pNANDC pRK28NC= (pNANDC)(master->regs);
261 uint32_t i = 0, chipnr;
264 mutex_lock(&rknand_mutex);
266 chipnr = master->cs ;
268 rk2818_nand_select_chip(mtd,chipnr);
270 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
273 for(i=0;i<mtd->writesize/0x400;i++)
275 memcpy((u_char *)(pRK28NC->buf),buf+i*0x400,0x400); // only use nandc sram0
276 pRK28NC ->BCHCTL =BCH_WR|BCH_RST;
277 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|0x1<<5|FL_RDN|FL_BYPASS|FL_START;
278 wait_op_done(mtd,TROP_US_DELAY,0);
283 rk2818_nand_select_chip(mtd,-1);
285 mutex_unlock(&rknand_mutex);
291 static void rk2818_nand_cmdfunc(struct mtd_info *mtd, unsigned command,int column, int page_addr)
293 struct nand_chip *nand_chip = mtd->priv;
294 struct rk2818_nand_mtd *master = nand_chip->priv;
295 pNANDC pRK28NC= (pNANDC)(master->regs);
297 uint32_t timeout = 1000;
303 case NAND_CMD_READID:
304 pRK28NC ->chip[master->cs].cmd = command;
305 pRK28NC ->chip[master->cs].addr = 0x0;
310 if(pRK28NC->FLCTL&FL_INTCLR)
318 pRK28NC ->chip[master->cs].cmd = command;
321 pRK28NC ->chip[master->cs].addr = column & 0xff;
322 if( mtd->writesize > 512)
323 pRK28NC ->chip[master->cs].addr = (column >> 8) & 0xff;
327 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
328 pRK28NC ->chip[master->cs].addr = (page_addr >> 8) & 0xFF;
329 pRK28NC ->chip[master->cs].addr = (page_addr >> 16) & 0xff;
331 if( mtd->writesize > 512)
332 pRK28NC ->chip[0].cmd = NAND_CMD_READSTART;
334 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
339 pRK28NC ->chip[master->cs].cmd = command;
342 case NAND_CMD_READOOB:
343 pRK28NC ->BCHCTL = 0x0;
344 if( mtd->writesize > 512 )
345 command = NAND_CMD_READ0; // È«²¿¶Á£¬°üÀ¨¶Áoob
347 pRK28NC ->chip[master->cs].cmd = command;
349 if ( mtd->writesize >512 )
353 pRK28NC ->chip[master->cs].addr = (column + mtd->writesize) & 0xff;
354 pRK28NC ->chip[master->cs].addr = ( (column + mtd->writesize) >> 8) & 0xff;
358 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
359 pRK28NC ->chip[master->cs].addr = (page_addr >> 8) & 0xFF;
360 pRK28NC ->chip[master->cs].addr = (page_addr >> 16) & 0xff;
362 pRK28NC ->chip[master->cs].cmd = NAND_CMD_READSTART;
366 pRK28NC ->chip[master->cs].addr = column;
369 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
374 case NAND_CMD_PAGEPROG:
375 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
376 pRK28NC ->chip[master->cs].cmd = command;
377 rk2818_nand_wait_busy(mtd,PROGRAM_BUSY_COUNT);
379 pRK28NC ->chip[master->cs].cmd = NAND_CMD_STATUS;
380 status = pRK28NC ->chip[master->cs].data;
389 case NAND_CMD_ERASE1:
390 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
391 pRK28NC ->BCHCTL = 0x0;
392 pRK28NC ->chip[master->cs].cmd = command;
395 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
396 pRK28NC ->chip[master->cs].addr = (page_addr>>8)&0xff;
397 pRK28NC ->chip[master->cs].addr = (page_addr>>16)&0xff;
401 case NAND_CMD_ERASE2:
402 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
403 pRK28NC ->chip[master->cs].cmd = command;
404 rk2818_nand_wait_busy(mtd,ERASE_BUSY_COUNT);
405 pRK28NC ->chip[master->cs].cmd = NAND_CMD_STATUS;
406 status = pRK28NC ->chip[master->cs].data;
416 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
417 pRK28NC ->chip[master->cs].cmd = command;
421 pRK28NC ->chip[master->cs].addr = column;
422 if( mtd->writesize > 512)
423 pRK28NC ->chip[master->cs].addr = (column >> 8) & 0xff;
427 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
428 pRK28NC ->chip[master->cs].addr = (page_addr>>8)&0xff;
429 pRK28NC ->chip[master->cs].addr = (page_addr>>16)&0xff;
434 case NAND_CMD_STATUS:
435 pRK28NC ->BCHCTL = 0x0;
436 pRK28NC ->chip[master->cs].cmd = command;
440 pRK28NC ->chip[master->cs].cmd = command;
443 /* This applies to read commands */
445 pRK28NC ->chip[master->cs].cmd = command;
453 int rk2818_nand_calculate_ecc(struct mtd_info *mtd,const uint8_t *dat,uint8_t *ecc_code)
455 struct nand_chip *nand_chip = mtd->priv;
456 struct rk2818_nand_mtd *master = nand_chip->priv;
457 pNANDC pRK28NC= (pNANDC)(master->regs);
463 eccdata[i] = pRK28NC->spare[i+1];
466 ecc_code[i*4] = eccdata[i]& 0xff;
467 ecc_code[i*4+1] = (eccdata[i]>> 8)& 0xff;
468 ecc_code[i*4+2] = (eccdata[i]>>16)& 0xff;
469 ecc_code[i*4+3] = (eccdata[i]>>24)& 0xff;
476 void rk2818_nand_hwctl_ecc(struct mtd_info *mtd, int mode)
478 struct nand_chip *nand_chip = mtd->priv;
479 struct rk2818_nand_mtd *master = nand_chip->priv;
480 pNANDC pRK28NC= (pNANDC)(master->regs);
482 pRK28NC->BCHCTL = 1; // reset bch and enable hw ecc
487 int rk2818_nand_correct_data(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc,uint8_t *calc_ecc)
489 struct nand_chip *nand_chip = mtd->priv;
490 struct rk2818_nand_mtd *master = nand_chip->priv;
491 pNANDC pRK28NC= (pNANDC)(master->regs);
494 if( pRK28NC->BCHST & (1<<2) )
496 DEBUG(MTD_DEBUG_LEVEL0,
497 "rk2818 nand :hw ecc uncorrectable error\n");
504 int rk2818_nand_read_page(struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf, int page)
506 struct nand_chip *nand_chip = mtd->priv;
507 struct rk2818_nand_mtd *master = nand_chip->priv;
508 pNANDC pRK28NC= (pNANDC)(master->regs);
513 mutex_lock(&rknand_mutex);
515 chipnr = master->cs ;
517 rk2818_nand_select_chip(mtd,chipnr);
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) ;
531 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
535 rk2818_nand_select_chip(mtd,-1);
537 mutex_unlock(&rknand_mutex);
543 void rk2818_nand_write_page(struct mtd_info *mtd,struct nand_chip *chip,const uint8_t *buf)
545 struct nand_chip *nand_chip = mtd->priv;
546 struct rk2818_nand_mtd *master = nand_chip->priv;
547 pNANDC pRK28NC= (pNANDC)(master->regs);
548 uint32_t i = 0, chipnr;
550 mutex_lock(&rknand_mutex);
552 chipnr = master->cs ;
554 rk2818_nand_select_chip(mtd,chipnr);
556 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
559 for(i=0;i<mtd->writesize/0x400;i++)
561 memcpy((u_char *)(pRK28NC->buf),(buf+i*0x400),0x400); // only use nandc sram0
563 memcpy((u_char *)(pRK28NC->spare),(u_char *)(chip->oob_poi + chip->ops.ooboffs),4);
565 pRK28NC ->BCHCTL = BCH_WR|BCH_RST;
566 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_RDN|FL_BYPASS|FL_START;
567 wait_op_done(mtd,TROP_US_DELAY,0);
570 pRK28NC ->chip[0].cmd = NAND_CMD_PAGEPROG;
574 rk2818_nand_wait_busy(mtd,PROGRAM_BUSY_COUNT);
576 rk2818_nand_select_chip(mtd,-1);
578 mutex_unlock(&rknand_mutex);
584 int rk2818_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip, int page, int sndcmd)
586 struct nand_chip *nand_chip = mtd->priv;
587 struct rk2818_nand_mtd *master = nand_chip->priv;
588 pNANDC pRK28NC= (pNANDC)(master->regs);
593 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
597 mutex_lock(&rknand_mutex);
599 chipnr = master->cs ;
601 rk2818_nand_select_chip(mtd,chipnr);
603 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
606 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
611 for(i=0;i<mtd->writesize/0x400;i++)
613 pRK28NC ->BCHCTL = BCH_RST;
614 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
615 wait_op_done(mtd,TROP_US_DELAY,0);
616 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
618 memcpy((u_char *)(chip->oob_poi+ chip->ops.ooboffs),(u_char *)(pRK28NC->spare),4);
622 rk2818_nand_select_chip(mtd,-1);
624 mutex_unlock(&rknand_mutex);
630 int rk2818_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int page)
632 struct nand_chip *nand_chip = mtd->priv;
633 struct rk2818_nand_mtd *master = nand_chip->priv;
634 pNANDC pRK28NC= (pNANDC)(master->regs);
639 mutex_lock(&rknand_mutex);
641 chipnr = master->cs ;
643 rk2818_nand_select_chip(mtd,chipnr);
645 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
647 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
651 for(i=0;i<mtd->writesize/0x400;i++)
653 pRK28NC ->BCHCTL = BCH_RST;
654 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
655 wait_op_done(mtd,TROP_US_DELAY,0);
656 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
657 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
659 memcpy((u_char *)(chip->oob_poi+ chip->ops.ooboffs),(u_char *)(pRK28NC->spare),4);
663 rk2818_nand_select_chip(mtd,-1);
664 mutex_unlock(&rknand_mutex);
670 static int rk2818_nand_setrate(struct rk2818_nand_mtd *info)
672 pNANDC pRK28NC= (pNANDC)(info->regs);
674 unsigned long clkrate = clk_get_rate(info->clk);
676 u_char accesstime,rwpw,csrw,rwcs;
678 unsigned int ns=0,timingcfg;
682 //scan nand flash access time
683 if ( info->accesstime ==0x00 )
685 else if ( info->accesstime==0x80)
687 else if ( info->accesstime==0x08)
690 accesstime=60; //60ns
692 info->clk_rate = clkrate;
693 clkrate /= 1000000; /* turn clock into MHz for ease of use */
695 if(clkrate>0 && clkrate<200)
696 ns= 1000/clkrate; // ns
700 timingcfg = (accesstime + ns -1)/ns;
702 timingcfg = (timingcfg>=3) ? (timingcfg-2) : timingcfg; //csrw+1, rwcs+1
704 rwpw = timingcfg-timingcfg/4;
706 rwcs = (timingcfg/4 >=1)?(timingcfg/4):1;
708 mutex_lock(&rknand_mutex);
710 pRK28NC ->FMWAIT |= (rwcs<<FMW_RWCS_OFFSET)|(rwpw<<FMW_RWPW_OFFSET)|(csrw<<FMW_CSRW_OFFSET);
712 mutex_unlock(&rknand_mutex);
718 /* cpufreq driver support */
720 #ifdef CONFIG_CPU_FREQ
722 static int rk2818_nand_cpufreq_transition(struct notifier_block *nb, unsigned long val, void *data)
724 struct rk2818_nand_mtd *info;
725 unsigned long newclk;
727 info = container_of(nb, struct rk2818_nand_mtd, freq_transition);
728 newclk = clk_get_rate(info->clk);
730 if (val == CPUFREQ_POSTCHANGE && newclk != info->clk_rate)
732 rk2818_nand_setrate(info);
738 static inline int rk2818_nand_cpufreq_register(struct rk2818_nand_mtd *info)
740 info->freq_transition.notifier_call = rk2818_nand_cpufreq_transition;
742 return cpufreq_register_notifier(&info->freq_transition, CPUFREQ_TRANSITION_NOTIFIER);
745 static inline void rk2818_nand_cpufreq_deregister(struct rk2818_nand_mtd *info)
747 cpufreq_unregister_notifier(&info->freq_transition, CPUFREQ_TRANSITION_NOTIFIER);
751 static inline int rk2818_nand_cpufreq_register(struct rk2818_nand_mtd *info)
756 static inline void rk2818_nand_cpufreq_deregister(struct rk2818_nand_mtd *info)
762 static int rk2818_nand_probe(struct platform_device *pdev)
764 struct nand_chip *this;
765 struct mtd_info *mtd;
766 struct rk2818_nand_platform_data *pdata = pdev->dev.platform_data;
767 struct rk2818_nand_mtd *master;
768 struct resource *res;
771 u_char maf_id,dev_id,ext_id3,ext_id4;
773 #ifdef CONFIG_MTD_PARTITIONS
774 struct mtd_partition *partitions = NULL;
775 int num_partitions = 0;
778 /* Allocate memory for MTD device structure and private data */
779 master = kzalloc(sizeof(struct rk2818_nand_mtd), GFP_KERNEL);
783 master->dev = &pdev->dev;
784 /* structures must be linked */
785 this = &master->nand;
788 mtd->owner = THIS_MODULE;
789 mtd->name = dev_name(&pdev->dev);
791 /* 50 us command delay time */
792 this->chip_delay = 5;
795 this->dev_ready = rk2818_nand_dev_ready;
796 this->cmdfunc = rk2818_nand_cmdfunc;
797 this->select_chip = rk2818_nand_select_chip;
798 this->read_byte = rk2818_nand_read_byte;
799 this->read_word = rk2818_nand_read_word;
800 this->write_buf = rk2818_nand_write_buf;
801 this->read_buf = rk2818_nand_read_buf;
802 this->options |= NAND_USE_FLASH_BBT; // open bbt options
805 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
811 master->regs = ioremap(res->start, res->end - res->start + 1);
818 this->ecc.calculate = rk2818_nand_calculate_ecc;
819 this->ecc.hwctl = rk2818_nand_hwctl_ecc;
820 this->ecc.correct = rk2818_nand_correct_data;
821 this->ecc.mode = NAND_ECC_HW;
822 this->ecc.read_page = rk2818_nand_read_page;
823 this->ecc.write_page = rk2818_nand_write_page;
824 this->ecc.read_oob = rk2818_nand_read_oob;
825 this->ecc.read_page_raw = rk2818_nand_read_page_raw;
826 this->ecc.size = 1024;
827 this->ecc.bytes = 28;
828 this->ecc.layout = &nand_hw_eccoob_16;
830 this->ecc.size = 256;
832 this->ecc.layout = &nand_sw_eccoob_8;
833 this->ecc.mode = NAND_ECC_SOFT;
837 mutex_init(&rknand_mutex);
839 master->clk = clk_get(NULL, "nandc");
841 clk_enable(master->clk);
843 pRK28NC = (pNANDC)(master->regs);
844 pRK28NC ->FMCTL = FMC_WP|FMC_FRDY;
845 pRK28NC ->FMWAIT |= (1<<FMW_RWCS_OFFSET)|(4<<FMW_RWPW_OFFSET)|(1<<FMW_CSRW_OFFSET);
846 pRK28NC ->BCHCTL = 0x1;
848 this->select_chip(mtd, 0);
849 this->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
850 maf_id = this->read_byte(mtd);
851 dev_id = this->read_byte(mtd);
852 ext_id3 = this->read_byte(mtd);
853 ext_id4 = this->read_byte(mtd);
855 master->accesstime = ext_id4&0x88;
857 rk2818_nand_setrate(master);
860 this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
861 /* NAND bus width determines access funtions used by upper layer */
862 if (pdata->width == 2) {
863 this->options |= NAND_BUSWIDTH_16;
864 this->ecc.layout = &nand_hw_eccoob_16;
867 // iomux flash cs1~cs7
868 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
869 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
870 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
871 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45);
872 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67);
874 /* Scan to find existence of the device */
875 if (nand_scan(mtd, 8)) { // rk2818 nandc support max 8 cs
877 DEBUG(MTD_DEBUG_LEVEL0,
878 "RK2818 NAND: Unable to find any NAND device.\n");
884 // rk281x dma mode bch must (1k data + 32 oob) bytes align , so cheat system writesize =1024,oobsize=32
885 mtd->writesize = 1024;
889 #ifdef CONFIG_MTD_PARTITIONS
890 num_partitions = parse_mtd_partitions(mtd, part_probes, &partitions, 0);
891 if (num_partitions > 0) {
892 printk(KERN_INFO "Using commandline partition definition\n");
893 add_mtd_partitions(mtd, partitions, num_partitions);
896 } else if (pdata->nr_parts) {
897 printk(KERN_INFO "Using board partition definition\n");
898 add_mtd_partitions(mtd, pdata->parts, pdata->nr_parts);
902 printk(KERN_INFO "no partition info available, registering whole flash at once\n");
906 platform_set_drvdata(pdev, master);
908 err =rk2818_nand_cpufreq_register(master);
910 printk(KERN_ERR"rk2818 nand failed to init cpufreq support\n");
918 iounmap(master->regs);
925 static int rk2818_nand_remove(struct platform_device *pdev)
927 struct rk2818_nand_mtd *master = platform_get_drvdata(pdev);
929 platform_set_drvdata(pdev, NULL);
934 rk2818_nand_cpufreq_deregister(master);
937 nand_release(&master->mtd);
939 if(master->regs!=NULL){
940 iounmap(master->regs);
944 if (master->clk != NULL && !IS_ERR(master->clk)) {
945 clk_disable(master->clk);
946 clk_put(master->clk);
955 static int rk2818_nand_suspend(struct platform_device *pdev, pm_message_t state)
957 struct mtd_info *info = platform_get_drvdata(pdev);
960 DEBUG(MTD_DEBUG_LEVEL0, "RK2818_NAND : NAND suspend\n");
962 ret = info->suspend(info);
966 static int rk2818_nand_resume(struct platform_device *pdev)
968 struct mtd_info *info = platform_get_drvdata(pdev);
971 DEBUG(MTD_DEBUG_LEVEL0, "RK2818_NAND : NAND resume\n");
972 /* Enable the NFC clock */
980 #define rk2818_nand_suspend NULL
981 #define rk2818_nand_resume NULL
982 #endif /* CONFIG_PM */
985 static struct platform_driver rk2818_nand_driver = {
987 .name = "rk2818-nand",
989 .probe = rk2818_nand_probe,
990 .remove = rk2818_nand_remove,
991 .suspend = rk2818_nand_suspend,
992 .resume = rk2818_nand_resume,
995 static int __init rk2818_nand_init(void)
997 /* Register the device driver structure. */
998 printk("rk2818_nand_init\n");
999 return platform_driver_register(&rk2818_nand_driver);;
1002 static void __exit rk2818_nand_exit(void)
1004 /* Unregister the device structure */
1005 platform_driver_unregister(&rk2818_nand_driver);
1009 // nandc dma cs mutex for dm9000 interface
1010 int rk2818_nand_status_mutex_trylock(void)
1012 pNANDC pRK28NC= (pNANDC)RK2818_NANDC_BASE;
1013 if( mutex_trylock(&rknand_mutex))
1015 pRK28NC->FMCTL &=0xffffff00; // release chip select
1022 void rk2818_nand_status_mutex_unlock(void)
1024 mutex_unlock(&rknand_mutex);
1028 module_init(rk2818_nand_init);
1029 module_exit(rk2818_nand_exit);
1031 MODULE_LICENSE("GPL");
1032 MODULE_AUTHOR("hxy <hxy@rock-chips.com>");
1033 MODULE_DESCRIPTION("MTD NAND driver for rk2818 device");