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
40 #define RESET_BUSY_COUNT 20000
42 /* Define delays in microsec for NAND device operations */
43 #define TROP_US_DELAY 2000
45 static struct mutex rknand_mutex;
46 //static spinlock_t rknand_lock;
49 struct rk2818_nand_mtd {
51 struct nand_chip nand;
52 struct mtd_partition *parts;
54 const struct rk2818_nand_flash *flash_info;
57 unsigned long clk_rate;
59 int cs; // support muliple nand chip,record current chip select
61 #ifdef CONFIG_CPU_FREQ
62 struct notifier_block freq_transition;
67 /* OOB placement block for use with software ecc generation */
68 static struct nand_ecclayout nand_sw_eccoob_8 = {
70 .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,
71 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55},
72 .oobfree = {{0,8},{56, 72}}
75 /* OOB placement block for use with hardware ecc generation */
76 static struct nand_ecclayout nand_hw_eccoob_16 = {
78 .eccpos = { 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,
79 18,19,20,21,22,23,24,25,26,27,28,29,30,31},
83 #ifdef CONFIG_MTD_PARTITIONS
84 static const char *part_probes[] = { "cmdlinepart", NULL };
88 static void rk2818_nand_wait_busy(struct mtd_info *mtd, uint32_t timeout)
91 struct nand_chip *nand_chip = mtd->priv;
92 struct rk2818_nand_mtd *master = nand_chip->priv;
93 pNANDC pRK28NC= (pNANDC)(master->regs);
99 if ( pRK28NC->FMCTL& FMC_FRDY)
107 static void rk2818_nand_wait_bchdone(struct mtd_info *mtd, uint32_t timeout)
110 struct nand_chip *nand_chip = mtd->priv;
111 struct rk2818_nand_mtd *master = nand_chip->priv;
112 pNANDC pRK28NC= (pNANDC)(master->regs);
118 if(pRK28NC->BCHST &(1<<1))
126 static void wait_op_done(struct mtd_info *mtd, int max_retries, uint16_t param)
128 struct nand_chip *nand_chip = mtd->priv;
129 struct rk2818_nand_mtd *master = nand_chip->priv;
130 pNANDC pRK28NC= (pNANDC)(master->regs);
132 while (max_retries-- > 0) {
134 if (pRK28NC->FLCTL & FL_RDY)
139 static int rk2818_nand_dev_ready(struct mtd_info *mtd)
141 struct nand_chip *nand_chip = mtd->priv;
142 struct rk2818_nand_mtd *master = nand_chip->priv;
143 pNANDC pRK28NC= (pNANDC)(master->regs);
145 if(pRK28NC->FMCTL& FMC_FRDY)
154 static void rk2818_nand_select_chip(struct mtd_info *mtd, int chip)
156 struct nand_chip *nand_chip = mtd->priv;
157 struct rk2818_nand_mtd *master = nand_chip->priv;
158 pNANDC pRK28NC= (pNANDC)(master->regs);
162 pRK28NC->FMCTL &=0xffffff00; // release chip select
166 pRK28NC->FMCTL &=0xffffff00;
167 pRK28NC ->FMCTL |= 0x1<<chip; // select chip
175 static u_char rk2818_nand_read_byte(struct mtd_info *mtd)
177 struct nand_chip *nand_chip = mtd->priv;
178 struct rk2818_nand_mtd *master = nand_chip->priv;
179 pNANDC pRK28NC= (pNANDC)(master->regs);
183 ret = (u_char)(pRK28NC ->chip[master->cs].data);
189 * ¶ÁÒ»¸öword ³¤¶ÈÊý¾Ý
191 static u16 rk2818_nand_read_word(struct mtd_info *mtd)
193 struct nand_chip *nand_chip = mtd->priv;
194 struct rk2818_nand_mtd *master = nand_chip->priv;
195 pNANDC pRK28NC= (pNANDC)(master->regs);
198 u_char tmp1 = 0,tmp2=0;
201 tmp1 = (u_char)(pRK28NC ->chip[master->cs].data);
202 tmp2 = (u_char)(pRK28NC ->chip[master->cs].data);
204 ret = (tmp2 <<8)|tmp1;
209 static void rk2818_nand_read_buf(struct mtd_info *mtd, u_char* const buf, int len)
211 struct nand_chip *nand_chip = mtd->priv;
212 struct rk2818_nand_mtd *master = nand_chip->priv;
213 pNANDC pRK28NC= (pNANDC)(master->regs);
216 mutex_lock(&rknand_mutex);
218 chipnr = master->cs ;
220 rk2818_nand_select_chip(mtd,chipnr);
224 if ( len < mtd->writesize ) // read oob
226 pRK28NC ->BCHCTL = BCH_RST;
227 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
228 wait_op_done(mtd,TROP_US_DELAY,0);
229 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
230 memcpy(buf,(u_char *)(pRK28NC->spare),4); // only use nandc sram0
234 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
235 for(i=0;i<mtd->writesize/0x400;i++)
237 pRK28NC ->BCHCTL = BCH_RST;
238 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
239 wait_op_done(mtd,TROP_US_DELAY,0);
240 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
241 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
247 rk2818_nand_select_chip(mtd,-1);
249 mutex_unlock(&rknand_mutex);
256 static void rk2818_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
258 struct nand_chip *nand_chip = mtd->priv;
259 struct rk2818_nand_mtd *master = nand_chip->priv;
260 pNANDC pRK28NC= (pNANDC)(master->regs);
262 uint32_t i = 0, chipnr;
265 mutex_lock(&rknand_mutex);
267 chipnr = master->cs ;
269 rk2818_nand_select_chip(mtd,chipnr);
271 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
274 for(i=0;i<mtd->writesize/0x400;i++)
276 memcpy((u_char *)(pRK28NC->buf),buf+i*0x400,0x400); // only use nandc sram0
277 pRK28NC ->BCHCTL =BCH_WR|BCH_RST;
278 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|0x1<<5|FL_RDN|FL_BYPASS|FL_START;
279 wait_op_done(mtd,TROP_US_DELAY,0);
284 rk2818_nand_select_chip(mtd,-1);
286 mutex_unlock(&rknand_mutex);
292 static void rk2818_nand_cmdfunc(struct mtd_info *mtd, unsigned command,int column, int page_addr)
294 struct nand_chip *nand_chip = mtd->priv;
295 struct rk2818_nand_mtd *master = nand_chip->priv;
296 pNANDC pRK28NC= (pNANDC)(master->regs);
298 uint32_t timeout = 1000;
304 case NAND_CMD_READID:
305 pRK28NC ->chip[master->cs].cmd = command;
306 pRK28NC ->chip[master->cs].addr = 0x0;
311 if(pRK28NC->FLCTL&FL_INTCLR)
316 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
320 pRK28NC ->chip[master->cs].cmd = command;
323 pRK28NC ->chip[master->cs].addr = column & 0xff;
324 if( mtd->writesize > 512)
325 pRK28NC ->chip[master->cs].addr = (column >> 8) & 0xff;
329 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
330 pRK28NC ->chip[master->cs].addr = (page_addr >> 8) & 0xFF;
331 pRK28NC ->chip[master->cs].addr = (page_addr >> 16) & 0xff;
333 if( mtd->writesize > 512)
334 pRK28NC ->chip[0].cmd = NAND_CMD_READSTART;
336 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
341 pRK28NC ->chip[master->cs].cmd = command;
344 case NAND_CMD_READOOB:
345 pRK28NC ->BCHCTL = 0x0;
346 if( mtd->writesize > 512 )
347 command = NAND_CMD_READ0; // È«²¿¶Á£¬°üÀ¨¶Áoob
349 pRK28NC ->chip[master->cs].cmd = command;
351 if ( mtd->writesize >512 )
355 pRK28NC ->chip[master->cs].addr = column & 0xff;
356 pRK28NC ->chip[master->cs].addr = ( column >> 8) & 0xff;
360 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
361 pRK28NC ->chip[master->cs].addr = (page_addr >> 8) & 0xFF;
362 pRK28NC ->chip[master->cs].addr = (page_addr >> 16) & 0xff;
364 pRK28NC ->chip[master->cs].cmd = NAND_CMD_READSTART;
368 pRK28NC ->chip[master->cs].addr = column;
371 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
376 case NAND_CMD_PAGEPROG:
377 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
378 pRK28NC ->chip[master->cs].cmd = command;
379 rk2818_nand_wait_busy(mtd,PROGRAM_BUSY_COUNT);
381 pRK28NC ->chip[master->cs].cmd = NAND_CMD_STATUS;
382 status = pRK28NC ->chip[master->cs].data;
391 case NAND_CMD_ERASE1:
392 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
393 pRK28NC ->BCHCTL = 0x0;
394 pRK28NC ->chip[master->cs].cmd = command;
397 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
398 pRK28NC ->chip[master->cs].addr = (page_addr>>8)&0xff;
399 pRK28NC ->chip[master->cs].addr = (page_addr>>16)&0xff;
403 case NAND_CMD_ERASE2:
404 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
405 pRK28NC ->chip[master->cs].cmd = command;
406 rk2818_nand_wait_busy(mtd,ERASE_BUSY_COUNT);
407 pRK28NC ->chip[master->cs].cmd = NAND_CMD_STATUS;
408 status = pRK28NC ->chip[master->cs].data;
418 pRK28NC ->FMCTL |= FMC_WP; //½â³ýд±£»¤
419 pRK28NC ->chip[master->cs].cmd = command;
423 pRK28NC ->chip[master->cs].addr = column;
424 if( mtd->writesize > 512)
425 pRK28NC ->chip[master->cs].addr = (column >> 8) & 0xff;
429 pRK28NC ->chip[master->cs].addr = page_addr & 0xff;
430 pRK28NC ->chip[master->cs].addr = (page_addr>>8)&0xff;
431 pRK28NC ->chip[master->cs].addr = (page_addr>>16)&0xff;
436 case NAND_CMD_STATUS:
437 pRK28NC ->BCHCTL = 0x0;
438 pRK28NC ->chip[master->cs].cmd = command;
443 if(pRK28NC->FLCTL&FL_INTCLR)
450 pRK28NC ->chip[master->cs].cmd = command;
455 if(pRK28NC->FLCTL&FL_INTCLR)
459 rk2818_nand_wait_busy(mtd,RESET_BUSY_COUNT);
462 /* This applies to read commands */
464 pRK28NC ->chip[master->cs].cmd = command;
472 int rk2818_nand_calculate_ecc(struct mtd_info *mtd,const uint8_t *dat,uint8_t *ecc_code)
474 struct nand_chip *nand_chip = mtd->priv;
475 struct rk2818_nand_mtd *master = nand_chip->priv;
476 pNANDC pRK28NC= (pNANDC)(master->regs);
482 eccdata[i] = pRK28NC->spare[i+1];
485 ecc_code[i*4] = eccdata[i]& 0xff;
486 ecc_code[i*4+1] = (eccdata[i]>> 8)& 0xff;
487 ecc_code[i*4+2] = (eccdata[i]>>16)& 0xff;
488 ecc_code[i*4+3] = (eccdata[i]>>24)& 0xff;
495 void rk2818_nand_hwctl_ecc(struct mtd_info *mtd, int mode)
497 struct nand_chip *nand_chip = mtd->priv;
498 struct rk2818_nand_mtd *master = nand_chip->priv;
499 pNANDC pRK28NC= (pNANDC)(master->regs);
501 pRK28NC->BCHCTL = 1; // reset bch and enable hw ecc
506 int rk2818_nand_correct_data(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc,uint8_t *calc_ecc)
508 struct nand_chip *nand_chip = mtd->priv;
509 struct rk2818_nand_mtd *master = nand_chip->priv;
510 pNANDC pRK28NC= (pNANDC)(master->regs);
513 if( pRK28NC->BCHST & (1<<2) )
515 DEBUG(MTD_DEBUG_LEVEL0,
516 "rk2818 nand :hw ecc uncorrectable error\n");
523 int rk2818_nand_read_page(struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf, int page)
525 struct nand_chip *nand_chip = mtd->priv;
526 struct rk2818_nand_mtd *master = nand_chip->priv;
527 pNANDC pRK28NC= (pNANDC)(master->regs);
532 mutex_lock(&rknand_mutex);
534 chipnr = master->cs ;
536 rk2818_nand_select_chip(mtd,chipnr);
539 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
541 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
543 for(i=0;i<mtd->writesize/0x400;i++)
545 pRK28NC ->BCHCTL = BCH_RST;
546 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
547 wait_op_done(mtd,TROP_US_DELAY,0);
548 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
550 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
554 rk2818_nand_select_chip(mtd,-1);
556 mutex_unlock(&rknand_mutex);
562 void rk2818_nand_write_page(struct mtd_info *mtd,struct nand_chip *chip,const uint8_t *buf)
564 struct nand_chip *nand_chip = mtd->priv;
565 struct rk2818_nand_mtd *master = nand_chip->priv;
566 pNANDC pRK28NC= (pNANDC)(master->regs);
567 uint32_t i = 0, chipnr;
569 mutex_lock(&rknand_mutex);
571 chipnr = master->cs ;
573 rk2818_nand_select_chip(mtd,chipnr);
575 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
578 for(i=0;i<mtd->writesize/0x400;i++)
580 memcpy((u_char *)(pRK28NC->buf),(buf+i*0x400),0x400); // only use nandc sram0
582 memcpy((u_char *)(pRK28NC->spare),(u_char *)(chip->oob_poi + chip->ops.ooboffs),4);
584 pRK28NC ->BCHCTL = BCH_WR|BCH_RST;
585 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_RDN|FL_BYPASS|FL_START;
586 wait_op_done(mtd,TROP_US_DELAY,0);
589 pRK28NC ->chip[0].cmd = NAND_CMD_PAGEPROG;
593 rk2818_nand_wait_busy(mtd,PROGRAM_BUSY_COUNT);
595 rk2818_nand_select_chip(mtd,-1);
597 mutex_unlock(&rknand_mutex);
603 int rk2818_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip, int page, int sndcmd)
605 struct nand_chip *nand_chip = mtd->priv;
606 struct rk2818_nand_mtd *master = nand_chip->priv;
607 pNANDC pRK28NC= (pNANDC)(master->regs);
612 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
616 mutex_lock(&rknand_mutex);
618 chipnr = master->cs ;
620 rk2818_nand_select_chip(mtd,chipnr);
622 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
625 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
630 for(i=0;i<mtd->writesize/0x400;i++)
632 pRK28NC ->BCHCTL = BCH_RST;
633 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
634 wait_op_done(mtd,TROP_US_DELAY,0);
635 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
637 memcpy((u_char *)(chip->oob_poi+ chip->ops.ooboffs),(u_char *)(pRK28NC->spare),4);
641 rk2818_nand_select_chip(mtd,-1);
643 mutex_unlock(&rknand_mutex);
649 int rk2818_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int page)
651 struct nand_chip *nand_chip = mtd->priv;
652 struct rk2818_nand_mtd *master = nand_chip->priv;
653 pNANDC pRK28NC= (pNANDC)(master->regs);
658 mutex_lock(&rknand_mutex);
660 chipnr = master->cs ;
662 rk2818_nand_select_chip(mtd,chipnr);
664 rk2818_nand_wait_busy(mtd,READ_BUSY_COUNT);
666 pRK28NC->FLCTL |= FL_BYPASS; // dma mode
670 for(i=0;i<mtd->writesize/0x400;i++)
672 pRK28NC ->BCHCTL = BCH_RST;
673 pRK28NC ->FLCTL = (0<<4)|FL_COR_EN|(0x1<<5)|FL_BYPASS|FL_START ;
674 wait_op_done(mtd,TROP_US_DELAY,0);
675 rk2818_nand_wait_bchdone(mtd,TROP_US_DELAY) ;
676 memcpy(buf+i*0x400,(u_char *)(pRK28NC->buf),0x400); // only use nandc sram0
678 memcpy((u_char *)(chip->oob_poi+ chip->ops.ooboffs),(u_char *)(pRK28NC->spare),4);
682 rk2818_nand_select_chip(mtd,-1);
683 mutex_unlock(&rknand_mutex);
689 static int rk2818_nand_setrate(struct rk2818_nand_mtd *info)
691 pNANDC pRK28NC= (pNANDC)(info->regs);
693 unsigned long clkrate = clk_get_rate(info->clk);
695 u_char accesstime,rwpw,csrw,rwcs;
697 unsigned int ns=0,timingcfg;
701 //scan nand flash access time
702 if ( info->accesstime ==0x00 )
704 else if ( info->accesstime==0x80)
706 else if ( info->accesstime==0x08)
709 accesstime=60; //60ns
711 info->clk_rate = clkrate;
712 clkrate /= 1000000; /* turn clock into MHz for ease of use */
714 if(clkrate>0 && clkrate<200)
715 ns= 1000/clkrate; // ns
719 timingcfg = (accesstime + ns -1)/ns;
721 timingcfg = (timingcfg>=3) ? (timingcfg-2) : timingcfg; //csrw+1, rwcs+1
723 rwpw = timingcfg-timingcfg/4;
725 rwcs = (timingcfg/4 >=1)?(timingcfg/4):1;
727 mutex_lock(&rknand_mutex);
729 pRK28NC ->FMWAIT |= (rwcs<<FMW_RWCS_OFFSET)|(rwpw<<FMW_RWPW_OFFSET)|(csrw<<FMW_CSRW_OFFSET);
731 mutex_unlock(&rknand_mutex);
737 /* cpufreq driver support */
739 #ifdef CONFIG_CPU_FREQ
741 static int rk2818_nand_cpufreq_transition(struct notifier_block *nb, unsigned long val, void *data)
743 struct rk2818_nand_mtd *info;
744 unsigned long newclk;
746 info = container_of(nb, struct rk2818_nand_mtd, freq_transition);
747 newclk = clk_get_rate(info->clk);
749 if (val == CPUFREQ_POSTCHANGE && newclk != info->clk_rate)
751 rk2818_nand_setrate(info);
757 static inline int rk2818_nand_cpufreq_register(struct rk2818_nand_mtd *info)
759 info->freq_transition.notifier_call = rk2818_nand_cpufreq_transition;
761 return cpufreq_register_notifier(&info->freq_transition, CPUFREQ_TRANSITION_NOTIFIER);
764 static inline void rk2818_nand_cpufreq_deregister(struct rk2818_nand_mtd *info)
766 cpufreq_unregister_notifier(&info->freq_transition, CPUFREQ_TRANSITION_NOTIFIER);
770 static inline int rk2818_nand_cpufreq_register(struct rk2818_nand_mtd *info)
775 static inline void rk2818_nand_cpufreq_deregister(struct rk2818_nand_mtd *info)
781 static int rk2818_nand_probe(struct platform_device *pdev)
783 struct nand_chip *this;
784 struct mtd_info *mtd;
785 struct rk2818_nand_platform_data *pdata = pdev->dev.platform_data;
786 struct rk2818_nand_mtd *master;
787 struct resource *res;
790 u_char maf_id,dev_id,ext_id3,ext_id4;
791 struct nand_chip *chip;
793 #ifdef CONFIG_MTD_PARTITIONS
794 struct mtd_partition *partitions = NULL;
795 int num_partitions = 0;
798 /* Allocate memory for MTD device structure and private data */
799 master = kzalloc(sizeof(struct rk2818_nand_mtd), GFP_KERNEL);
803 master->dev = &pdev->dev;
804 /* structures must be linked */
805 this = &master->nand;
808 mtd->owner = THIS_MODULE;
809 mtd->name = dev_name(&pdev->dev);
811 /* 50 us command delay time */
812 this->chip_delay = 5;
815 this->dev_ready = rk2818_nand_dev_ready;
816 this->cmdfunc = rk2818_nand_cmdfunc;
817 this->select_chip = rk2818_nand_select_chip;
818 this->read_byte = rk2818_nand_read_byte;
819 this->read_word = rk2818_nand_read_word;
820 this->write_buf = rk2818_nand_write_buf;
821 this->read_buf = rk2818_nand_read_buf;
822 this->options |= NAND_USE_FLASH_BBT; // open bbt options
825 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
831 master->regs = ioremap(res->start, res->end - res->start + 1);
838 this->ecc.calculate = rk2818_nand_calculate_ecc;
839 this->ecc.hwctl = rk2818_nand_hwctl_ecc;
840 this->ecc.correct = rk2818_nand_correct_data;
841 this->ecc.mode = NAND_ECC_HW;
842 this->ecc.read_page = rk2818_nand_read_page;
843 this->ecc.write_page = rk2818_nand_write_page;
844 this->ecc.read_oob = rk2818_nand_read_oob;
845 this->ecc.read_page_raw = rk2818_nand_read_page_raw;
846 this->ecc.size = 1024;
847 this->ecc.bytes = 28;
848 this->ecc.layout = &nand_hw_eccoob_16;
850 this->ecc.size = 256;
852 this->ecc.layout = &nand_sw_eccoob_8;
853 this->ecc.mode = NAND_ECC_SOFT;
857 mutex_init(&rknand_mutex);
859 master->clk = clk_get(NULL, "nandc");
861 clk_enable(master->clk);
863 pRK28NC = (pNANDC)(master->regs);
864 pRK28NC ->FMCTL = FMC_WP|FMC_FRDY;
865 pRK28NC ->FMWAIT |= (1<<FMW_RWCS_OFFSET)|(4<<FMW_RWPW_OFFSET)|(1<<FMW_CSRW_OFFSET);
866 pRK28NC ->BCHCTL = 0x1;
868 this->select_chip(mtd, 0);
869 this->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
870 maf_id = this->read_byte(mtd);
871 dev_id = this->read_byte(mtd);
872 ext_id3 = this->read_byte(mtd);
873 ext_id4 = this->read_byte(mtd);
875 master->accesstime = ext_id4&0x88;
877 rk2818_nand_setrate(master);
880 this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
881 /* NAND bus width determines access funtions used by upper layer */
882 if (pdata->width == 2) {
883 this->options |= NAND_BUSWIDTH_16;
884 this->ecc.layout = &nand_hw_eccoob_16;
886 // iomux flash cs1~cs7
887 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
888 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
889 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
890 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45);
891 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67);
893 /* Scan to find existence of the device */
894 if (nand_scan(mtd, 8)) { // rk2818 nandc support max 8 cs
896 DEBUG(MTD_DEBUG_LEVEL0,
897 "RK2818 NAND: Unable to find any NAND device.\n");
902 //¸ù¾ÝƬѡÇé¿ö»Ö¸´IO MUXÔʼֵ
904 switch(chip->numchips)
907 rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME);
909 rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME);
911 rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME);
913 rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME);
916 rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME);
921 DEBUG(MTD_DEBUG_LEVEL0, "RK2818 NAND: numchips error!!!\n");
924 // rk281x dma mode bch must (1k data + 32 oob) bytes align , so cheat system writesize =1024,oobsize=32
925 mtd->writesize = 1024;
929 #ifdef CONFIG_MTD_PARTITIONS
930 num_partitions = parse_mtd_partitions(mtd, part_probes, &partitions, 0);
931 if (num_partitions > 0) {
932 printk(KERN_INFO "Using commandline partition definition\n");
933 add_mtd_partitions(mtd, partitions, num_partitions);
936 } else if (pdata->nr_parts) {
937 printk(KERN_INFO "Using board partition definition\n");
938 add_mtd_partitions(mtd, pdata->parts, pdata->nr_parts);
942 printk(KERN_INFO "no partition info available, registering whole flash at once\n");
946 platform_set_drvdata(pdev, master);
948 err =rk2818_nand_cpufreq_register(master);
950 printk(KERN_ERR"rk2818 nand failed to init cpufreq support\n");
958 iounmap(master->regs);
965 static int rk2818_nand_remove(struct platform_device *pdev)
967 struct rk2818_nand_mtd *master = platform_get_drvdata(pdev);
969 platform_set_drvdata(pdev, NULL);
974 rk2818_nand_cpufreq_deregister(master);
977 nand_release(&master->mtd);
979 if(master->regs!=NULL){
980 iounmap(master->regs);
984 if (master->clk != NULL && !IS_ERR(master->clk)) {
985 clk_disable(master->clk);
986 clk_put(master->clk);
995 static int rk2818_nand_suspend(struct platform_device *pdev, pm_message_t state)
997 struct mtd_info *info = platform_get_drvdata(pdev);
1000 DEBUG(MTD_DEBUG_LEVEL0, "RK2818_NAND : NAND suspend\n");
1002 ret = info->suspend(info);
1006 static int rk2818_nand_resume(struct platform_device *pdev)
1008 struct mtd_info *info = platform_get_drvdata(pdev);
1011 DEBUG(MTD_DEBUG_LEVEL0, "RK2818_NAND : NAND resume\n");
1012 /* Enable the NFC clock */
1020 #define rk2818_nand_suspend NULL
1021 #define rk2818_nand_resume NULL
1022 #endif /* CONFIG_PM */
1025 static struct platform_driver rk2818_nand_driver = {
1027 .name = "rk2818-nand",
1029 .probe = rk2818_nand_probe,
1030 .remove = rk2818_nand_remove,
1031 .suspend = rk2818_nand_suspend,
1032 .resume = rk2818_nand_resume,
1035 static int __init rk2818_nand_init(void)
1037 /* Register the device driver structure. */
1038 printk("rk2818_nand_init\n");
1039 return platform_driver_register(&rk2818_nand_driver);;
1042 static void __exit rk2818_nand_exit(void)
1044 /* Unregister the device structure */
1045 platform_driver_unregister(&rk2818_nand_driver);
1049 // nandc dma cs mutex for dm9000 interface
1050 void rk2818_nand_status_mutex_lock(void)
1052 pNANDC pRK28NC= (pNANDC)RK2818_NANDC_BASE;
1053 mutex_lock(&rknand_mutex);
1054 pRK28NC->FMCTL &=0xffffff00; // release chip select
1058 int rk2818_nand_status_mutex_trylock(void)
1060 pNANDC pRK28NC= (pNANDC)RK2818_NANDC_BASE;
1061 if( mutex_trylock(&rknand_mutex))
1063 pRK28NC->FMCTL &=0xffffff00; // release chip select
1070 void rk2818_nand_status_mutex_unlock(void)
1072 mutex_unlock(&rknand_mutex);
1076 module_init(rk2818_nand_init);
1077 module_exit(rk2818_nand_exit);
1079 MODULE_LICENSE("GPL");
1080 MODULE_AUTHOR("hxy <hxy@rock-chips.com>");
1081 MODULE_DESCRIPTION("MTD NAND driver for rk2818 device");