2 * SuperH FLCTL nand controller
4 * Copyright (c) 2008 Renesas Solutions Corp.
5 * Copyright (c) 2008 Atom Create Engineering Co., Ltd.
7 * Based on fsl_elbc_nand.c, Copyright (c) 2006-2007 Freescale Semiconductor
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2 of the License.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 #include <linux/module.h>
25 #include <linux/kernel.h>
26 #include <linux/delay.h>
28 #include <linux/platform_device.h>
29 #include <linux/slab.h>
31 #include <linux/mtd/mtd.h>
32 #include <linux/mtd/nand.h>
33 #include <linux/mtd/partitions.h>
34 #include <linux/mtd/sh_flctl.h>
36 static struct nand_ecclayout flctl_4secc_oob_16 = {
38 .eccpos = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
44 static struct nand_ecclayout flctl_4secc_oob_64 = {
46 .eccpos = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57},
52 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
54 static struct nand_bbt_descr flctl_4secc_smallpage = {
55 .options = NAND_BBT_SCAN2NDPAGE,
58 .pattern = scan_ff_pattern,
61 static struct nand_bbt_descr flctl_4secc_largepage = {
62 .options = NAND_BBT_SCAN2NDPAGE,
65 .pattern = scan_ff_pattern,
68 static void empty_fifo(struct sh_flctl *flctl)
70 writel(0x000c0000, FLINTDMACR(flctl)); /* FIFO Clear */
71 writel(0x00000000, FLINTDMACR(flctl)); /* Clear Error flags */
74 static void start_translation(struct sh_flctl *flctl)
76 writeb(TRSTRT, FLTRCR(flctl));
79 static void timeout_error(struct sh_flctl *flctl, const char *str)
81 dev_err(&flctl->pdev->dev, "Timeout occurred in %s\n", str);
84 static void wait_completion(struct sh_flctl *flctl)
86 uint32_t timeout = LOOP_TIMEOUT_MAX;
89 if (readb(FLTRCR(flctl)) & TREND) {
90 writeb(0x0, FLTRCR(flctl));
96 timeout_error(flctl, __func__);
97 writeb(0x0, FLTRCR(flctl));
100 static void set_addr(struct mtd_info *mtd, int column, int page_addr)
102 struct sh_flctl *flctl = mtd_to_flctl(mtd);
106 addr = page_addr; /* ERASE1 */
107 } else if (page_addr != -1) {
108 /* SEQIN, READ0, etc.. */
109 if (flctl->chip.options & NAND_BUSWIDTH_16)
111 if (flctl->page_size) {
112 addr = column & 0x0FFF;
113 addr |= (page_addr & 0xff) << 16;
114 addr |= ((page_addr >> 8) & 0xff) << 24;
116 if (flctl->rw_ADRCNT == ADRCNT2_E) {
118 addr2 = (page_addr >> 16) & 0xff;
119 writel(addr2, FLADR2(flctl));
123 addr |= (page_addr & 0xff) << 8;
124 addr |= ((page_addr >> 8) & 0xff) << 16;
125 addr |= ((page_addr >> 16) & 0xff) << 24;
128 writel(addr, FLADR(flctl));
131 static void wait_rfifo_ready(struct sh_flctl *flctl)
133 uint32_t timeout = LOOP_TIMEOUT_MAX;
138 val = readl(FLDTCNTR(flctl)) >> 16;
143 timeout_error(flctl, __func__);
146 static void wait_wfifo_ready(struct sh_flctl *flctl)
148 uint32_t len, timeout = LOOP_TIMEOUT_MAX;
152 len = (readl(FLDTCNTR(flctl)) >> 16) & 0xFF;
157 timeout_error(flctl, __func__);
160 static int wait_recfifo_ready(struct sh_flctl *flctl, int sector_number)
162 uint32_t timeout = LOOP_TIMEOUT_MAX;
164 void __iomem *ecc_reg[4];
168 memset(checked, 0, sizeof(checked));
171 size = readl(FLDTCNTR(flctl)) >> 24;
173 return 0; /* success */
175 if (readl(FL4ECCCR(flctl)) & _4ECCFA)
176 return 1; /* can't correct */
179 if (!(readl(FL4ECCCR(flctl)) & _4ECCEND))
182 /* start error correction */
183 ecc_reg[0] = FL4ECCRESULT0(flctl);
184 ecc_reg[1] = FL4ECCRESULT1(flctl);
185 ecc_reg[2] = FL4ECCRESULT2(flctl);
186 ecc_reg[3] = FL4ECCRESULT3(flctl);
188 for (i = 0; i < 3; i++) {
189 data = readl(ecc_reg[i]);
190 if (data != INIT_FL4ECCRESULT_VAL && !checked[i]) {
194 if (flctl->page_size)
195 index = (512 * sector_number) +
200 org = flctl->done_buff[index];
201 flctl->done_buff[index] = org ^ (data & 0xFF);
206 writel(0, FL4ECCCR(flctl));
209 timeout_error(flctl, __func__);
210 return 1; /* timeout */
213 static void wait_wecfifo_ready(struct sh_flctl *flctl)
215 uint32_t timeout = LOOP_TIMEOUT_MAX;
220 len = (readl(FLDTCNTR(flctl)) >> 24) & 0xFF;
225 timeout_error(flctl, __func__);
228 static void read_datareg(struct sh_flctl *flctl, int offset)
231 unsigned long *buf = (unsigned long *)&flctl->done_buff[offset];
233 wait_completion(flctl);
235 data = readl(FLDATAR(flctl));
236 *buf = le32_to_cpu(data);
239 static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
242 unsigned long *buf = (unsigned long *)&flctl->done_buff[offset];
243 void *fifo_addr = (void *)FLDTFIFO(flctl);
245 len_4align = (rlen + 3) / 4;
247 for (i = 0; i < len_4align; i++) {
248 wait_rfifo_ready(flctl);
249 buf[i] = readl(fifo_addr);
250 buf[i] = be32_to_cpu(buf[i]);
254 static int read_ecfiforeg(struct sh_flctl *flctl, uint8_t *buff, int sector)
257 unsigned long *ecc_buf = (unsigned long *)buff;
258 void *fifo_addr = (void *)FLECFIFO(flctl);
260 for (i = 0; i < 4; i++) {
261 if (wait_recfifo_ready(flctl , sector))
263 ecc_buf[i] = readl(fifo_addr);
264 ecc_buf[i] = be32_to_cpu(ecc_buf[i]);
270 static void write_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
273 unsigned long *data = (unsigned long *)&flctl->done_buff[offset];
274 void *fifo_addr = (void *)FLDTFIFO(flctl);
276 len_4align = (rlen + 3) / 4;
277 for (i = 0; i < len_4align; i++) {
278 wait_wfifo_ready(flctl);
279 writel(cpu_to_be32(data[i]), fifo_addr);
283 static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_val)
285 struct sh_flctl *flctl = mtd_to_flctl(mtd);
286 uint32_t flcmncr_val = readl(FLCMNCR(flctl)) & ~SEL_16BIT;
287 uint32_t flcmdcr_val, addr_len_bytes = 0;
289 /* Set SNAND bit if page size is 2048byte */
290 if (flctl->page_size)
291 flcmncr_val |= SNAND_E;
293 flcmncr_val &= ~SNAND_E;
295 /* default FLCMDCR val */
296 flcmdcr_val = DOCMD1_E | DOADR_E;
298 /* Set for FLCMDCR */
300 case NAND_CMD_ERASE1:
301 addr_len_bytes = flctl->erase_ADRCNT;
302 flcmdcr_val |= DOCMD2_E;
305 case NAND_CMD_READOOB:
306 case NAND_CMD_RNDOUT:
307 addr_len_bytes = flctl->rw_ADRCNT;
308 flcmdcr_val |= CDSRC_E;
309 if (flctl->chip.options & NAND_BUSWIDTH_16)
310 flcmncr_val |= SEL_16BIT;
313 /* This case is that cmd is READ0 or READ1 or READ00 */
314 flcmdcr_val &= ~DOADR_E; /* ONLY execute 1st cmd */
316 case NAND_CMD_PAGEPROG:
317 addr_len_bytes = flctl->rw_ADRCNT;
318 flcmdcr_val |= DOCMD2_E | CDSRC_E | SELRW;
319 if (flctl->chip.options & NAND_BUSWIDTH_16)
320 flcmncr_val |= SEL_16BIT;
322 case NAND_CMD_READID:
323 flcmncr_val &= ~SNAND_E;
324 flcmdcr_val |= CDSRC_E;
325 addr_len_bytes = ADRCNT_1;
327 case NAND_CMD_STATUS:
329 flcmncr_val &= ~SNAND_E;
330 flcmdcr_val &= ~(DOADR_E | DOSR_E);
336 /* Set address bytes parameter */
337 flcmdcr_val |= addr_len_bytes;
339 /* Now actually write */
340 writel(flcmncr_val, FLCMNCR(flctl));
341 writel(flcmdcr_val, FLCMDCR(flctl));
342 writel(flcmcdr_val, FLCMCDR(flctl));
345 static int flctl_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
346 uint8_t *buf, int page)
348 int i, eccsize = chip->ecc.size;
349 int eccbytes = chip->ecc.bytes;
350 int eccsteps = chip->ecc.steps;
352 struct sh_flctl *flctl = mtd_to_flctl(mtd);
354 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
355 chip->read_buf(mtd, p, eccsize);
357 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
358 if (flctl->hwecc_cant_correct[i])
359 mtd->ecc_stats.failed++;
361 mtd->ecc_stats.corrected += 0;
367 static void flctl_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
370 int i, eccsize = chip->ecc.size;
371 int eccbytes = chip->ecc.bytes;
372 int eccsteps = chip->ecc.steps;
373 const uint8_t *p = buf;
375 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
376 chip->write_buf(mtd, p, eccsize);
379 static void execmd_read_page_sector(struct mtd_info *mtd, int page_addr)
381 struct sh_flctl *flctl = mtd_to_flctl(mtd);
382 int sector, page_sectors;
384 if (flctl->page_size)
389 writel(readl(FLCMNCR(flctl)) | ACM_SACCES_MODE | _4ECCCORRECT,
392 set_cmd_regs(mtd, NAND_CMD_READ0,
393 (NAND_CMD_READSTART << 8) | NAND_CMD_READ0);
395 for (sector = 0; sector < page_sectors; sector++) {
399 writel(readl(FLCMDCR(flctl)) | 1, FLCMDCR(flctl));
400 writel(page_addr << 2 | sector, FLADR(flctl));
402 start_translation(flctl);
403 read_fiforeg(flctl, 512, 512 * sector);
405 ret = read_ecfiforeg(flctl,
406 &flctl->done_buff[mtd->writesize + 16 * sector],
410 flctl->hwecc_cant_correct[sector] = 1;
412 writel(0x0, FL4ECCCR(flctl));
413 wait_completion(flctl);
415 writel(readl(FLCMNCR(flctl)) & ~(ACM_SACCES_MODE | _4ECCCORRECT),
419 static void execmd_read_oob(struct mtd_info *mtd, int page_addr)
421 struct sh_flctl *flctl = mtd_to_flctl(mtd);
423 set_cmd_regs(mtd, NAND_CMD_READ0,
424 (NAND_CMD_READSTART << 8) | NAND_CMD_READ0);
427 if (flctl->page_size) {
429 /* In case that the page size is 2k */
430 for (i = 0; i < 16 * 3; i++)
431 flctl->done_buff[i] = 0xFF;
433 set_addr(mtd, 3 * 528 + 512, page_addr);
434 writel(16, FLDTCNTR(flctl));
436 start_translation(flctl);
437 read_fiforeg(flctl, 16, 16 * 3);
438 wait_completion(flctl);
440 /* In case that the page size is 512b */
441 set_addr(mtd, 512, page_addr);
442 writel(16, FLDTCNTR(flctl));
444 start_translation(flctl);
445 read_fiforeg(flctl, 16, 0);
446 wait_completion(flctl);
450 static void execmd_write_page_sector(struct mtd_info *mtd)
452 struct sh_flctl *flctl = mtd_to_flctl(mtd);
453 int i, page_addr = flctl->seqin_page_addr;
454 int sector, page_sectors;
456 if (flctl->page_size)
461 writel(readl(FLCMNCR(flctl)) | ACM_SACCES_MODE, FLCMNCR(flctl));
463 set_cmd_regs(mtd, NAND_CMD_PAGEPROG,
464 (NAND_CMD_PAGEPROG << 8) | NAND_CMD_SEQIN);
466 for (sector = 0; sector < page_sectors; sector++) {
468 writel(readl(FLCMDCR(flctl)) | 1, FLCMDCR(flctl));
469 writel(page_addr << 2 | sector, FLADR(flctl));
471 start_translation(flctl);
472 write_fiforeg(flctl, 512, 512 * sector);
474 for (i = 0; i < 4; i++) {
475 wait_wecfifo_ready(flctl); /* wait for write ready */
476 writel(0xFFFFFFFF, FLECFIFO(flctl));
478 wait_completion(flctl);
481 writel(readl(FLCMNCR(flctl)) & ~ACM_SACCES_MODE, FLCMNCR(flctl));
484 static void execmd_write_oob(struct mtd_info *mtd)
486 struct sh_flctl *flctl = mtd_to_flctl(mtd);
487 int page_addr = flctl->seqin_page_addr;
488 int sector, page_sectors;
490 if (flctl->page_size) {
498 set_cmd_regs(mtd, NAND_CMD_PAGEPROG,
499 (NAND_CMD_PAGEPROG << 8) | NAND_CMD_SEQIN);
501 for (; sector < page_sectors; sector++) {
503 set_addr(mtd, sector * 528 + 512, page_addr);
504 writel(16, FLDTCNTR(flctl)); /* set read size */
506 start_translation(flctl);
507 write_fiforeg(flctl, 16, 16 * sector);
508 wait_completion(flctl);
512 static void flctl_cmdfunc(struct mtd_info *mtd, unsigned int command,
513 int column, int page_addr)
515 struct sh_flctl *flctl = mtd_to_flctl(mtd);
516 uint32_t read_cmd = 0;
518 flctl->read_bytes = 0;
519 if (command != NAND_CMD_PAGEPROG)
526 /* read page with hwecc */
527 execmd_read_page_sector(mtd, page_addr);
530 if (flctl->page_size)
531 set_cmd_regs(mtd, command, (NAND_CMD_READSTART << 8)
534 set_cmd_regs(mtd, command, command);
536 set_addr(mtd, 0, page_addr);
538 flctl->read_bytes = mtd->writesize + mtd->oobsize;
539 if (flctl->chip.options & NAND_BUSWIDTH_16)
541 flctl->index += column;
542 goto read_normal_exit;
544 case NAND_CMD_READOOB:
546 /* read page with hwecc */
547 execmd_read_oob(mtd, page_addr);
551 if (flctl->page_size) {
552 set_cmd_regs(mtd, command, (NAND_CMD_READSTART << 8)
554 set_addr(mtd, mtd->writesize, page_addr);
556 set_cmd_regs(mtd, command, command);
557 set_addr(mtd, 0, page_addr);
559 flctl->read_bytes = mtd->oobsize;
560 goto read_normal_exit;
562 case NAND_CMD_RNDOUT:
566 if (flctl->page_size)
567 set_cmd_regs(mtd, command, (NAND_CMD_RNDOUTSTART << 8)
570 set_cmd_regs(mtd, command, command);
572 set_addr(mtd, column, 0);
574 flctl->read_bytes = mtd->writesize + mtd->oobsize - column;
575 goto read_normal_exit;
577 case NAND_CMD_READID:
578 set_cmd_regs(mtd, command, command);
580 /* READID is always performed using an 8-bit bus */
581 if (flctl->chip.options & NAND_BUSWIDTH_16)
583 set_addr(mtd, column, 0);
585 flctl->read_bytes = 8;
586 writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */
588 start_translation(flctl);
589 read_fiforeg(flctl, flctl->read_bytes, 0);
590 wait_completion(flctl);
593 case NAND_CMD_ERASE1:
594 flctl->erase1_page_addr = page_addr;
597 case NAND_CMD_ERASE2:
598 set_cmd_regs(mtd, NAND_CMD_ERASE1,
599 (command << 8) | NAND_CMD_ERASE1);
600 set_addr(mtd, -1, flctl->erase1_page_addr);
601 start_translation(flctl);
602 wait_completion(flctl);
606 if (!flctl->page_size) {
607 /* output read command */
608 if (column >= mtd->writesize) {
609 column -= mtd->writesize;
610 read_cmd = NAND_CMD_READOOB;
611 } else if (column < 256) {
612 read_cmd = NAND_CMD_READ0;
615 read_cmd = NAND_CMD_READ1;
618 flctl->seqin_column = column;
619 flctl->seqin_page_addr = page_addr;
620 flctl->seqin_read_cmd = read_cmd;
623 case NAND_CMD_PAGEPROG:
625 if (!flctl->page_size) {
626 set_cmd_regs(mtd, NAND_CMD_SEQIN,
627 flctl->seqin_read_cmd);
628 set_addr(mtd, -1, -1);
629 writel(0, FLDTCNTR(flctl)); /* set 0 size */
630 start_translation(flctl);
631 wait_completion(flctl);
634 /* write page with hwecc */
635 if (flctl->seqin_column == mtd->writesize)
636 execmd_write_oob(mtd);
637 else if (!flctl->seqin_column)
638 execmd_write_page_sector(mtd);
640 printk(KERN_ERR "Invalid address !?\n");
643 set_cmd_regs(mtd, command, (command << 8) | NAND_CMD_SEQIN);
644 set_addr(mtd, flctl->seqin_column, flctl->seqin_page_addr);
645 writel(flctl->index, FLDTCNTR(flctl)); /* set write size */
646 start_translation(flctl);
647 write_fiforeg(flctl, flctl->index, 0);
648 wait_completion(flctl);
651 case NAND_CMD_STATUS:
652 set_cmd_regs(mtd, command, command);
653 set_addr(mtd, -1, -1);
655 flctl->read_bytes = 1;
656 writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */
657 start_translation(flctl);
658 read_datareg(flctl, 0); /* read and end */
662 set_cmd_regs(mtd, command, command);
663 set_addr(mtd, -1, -1);
665 writel(0, FLDTCNTR(flctl)); /* set 0 size */
666 start_translation(flctl);
667 wait_completion(flctl);
676 writel(flctl->read_bytes, FLDTCNTR(flctl)); /* set read size */
678 start_translation(flctl);
679 read_fiforeg(flctl, flctl->read_bytes, 0);
680 wait_completion(flctl);
684 static void flctl_select_chip(struct mtd_info *mtd, int chipnr)
686 struct sh_flctl *flctl = mtd_to_flctl(mtd);
687 uint32_t flcmncr_val = readl(FLCMNCR(flctl));
691 flcmncr_val &= ~CE0_ENABLE;
692 writel(flcmncr_val, FLCMNCR(flctl));
695 flcmncr_val |= CE0_ENABLE;
696 writel(flcmncr_val, FLCMNCR(flctl));
703 static void flctl_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
705 struct sh_flctl *flctl = mtd_to_flctl(mtd);
706 int i, index = flctl->index;
708 for (i = 0; i < len; i++)
709 flctl->done_buff[index + i] = buf[i];
713 static uint8_t flctl_read_byte(struct mtd_info *mtd)
715 struct sh_flctl *flctl = mtd_to_flctl(mtd);
716 int index = flctl->index;
719 data = flctl->done_buff[index];
724 static uint16_t flctl_read_word(struct mtd_info *mtd)
726 struct sh_flctl *flctl = mtd_to_flctl(mtd);
727 int index = flctl->index;
729 uint16_t *buf = (uint16_t *)&flctl->done_buff[index];
736 static void flctl_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
740 for (i = 0; i < len; i++)
741 buf[i] = flctl_read_byte(mtd);
744 static int flctl_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
748 for (i = 0; i < len; i++)
749 if (buf[i] != flctl_read_byte(mtd))
754 static void flctl_register_init(struct sh_flctl *flctl, unsigned long val)
756 writel(val, FLCMNCR(flctl));
759 static int flctl_chip_init_tail(struct mtd_info *mtd)
761 struct sh_flctl *flctl = mtd_to_flctl(mtd);
762 struct nand_chip *chip = &flctl->chip;
764 if (mtd->writesize == 512) {
765 flctl->page_size = 0;
766 if (chip->chipsize > (32 << 20)) {
768 flctl->rw_ADRCNT = ADRCNT_4;
769 flctl->erase_ADRCNT = ADRCNT_3;
770 } else if (chip->chipsize > (2 << 16)) {
772 flctl->rw_ADRCNT = ADRCNT_3;
773 flctl->erase_ADRCNT = ADRCNT_2;
775 flctl->rw_ADRCNT = ADRCNT_2;
776 flctl->erase_ADRCNT = ADRCNT_1;
779 flctl->page_size = 1;
780 if (chip->chipsize > (128 << 20)) {
782 flctl->rw_ADRCNT = ADRCNT2_E;
783 flctl->erase_ADRCNT = ADRCNT_3;
784 } else if (chip->chipsize > (8 << 16)) {
786 flctl->rw_ADRCNT = ADRCNT_4;
787 flctl->erase_ADRCNT = ADRCNT_2;
789 flctl->rw_ADRCNT = ADRCNT_3;
790 flctl->erase_ADRCNT = ADRCNT_1;
795 if (mtd->writesize == 512) {
796 chip->ecc.layout = &flctl_4secc_oob_16;
797 chip->badblock_pattern = &flctl_4secc_smallpage;
799 chip->ecc.layout = &flctl_4secc_oob_64;
800 chip->badblock_pattern = &flctl_4secc_largepage;
803 chip->ecc.size = 512;
804 chip->ecc.bytes = 10;
805 chip->ecc.read_page = flctl_read_page_hwecc;
806 chip->ecc.write_page = flctl_write_page_hwecc;
807 chip->ecc.mode = NAND_ECC_HW;
809 /* 4 symbols ECC enabled */
810 writel(readl(FLCMNCR(flctl)) | _4ECCEN | ECCPOS2 | ECCPOS_02,
813 chip->ecc.mode = NAND_ECC_SOFT;
819 static int __devinit flctl_probe(struct platform_device *pdev)
821 struct resource *res;
822 struct sh_flctl *flctl;
823 struct mtd_info *flctl_mtd;
824 struct nand_chip *nand;
825 struct sh_flctl_platform_data *pdata;
828 pdata = pdev->dev.platform_data;
830 dev_err(&pdev->dev, "no platform data defined\n");
834 flctl = kzalloc(sizeof(struct sh_flctl), GFP_KERNEL);
836 dev_err(&pdev->dev, "failed to allocate driver data\n");
840 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
842 dev_err(&pdev->dev, "failed to get I/O memory\n");
846 flctl->reg = ioremap(res->start, resource_size(res));
847 if (flctl->reg == NULL) {
848 dev_err(&pdev->dev, "failed to remap I/O memory\n");
852 platform_set_drvdata(pdev, flctl);
853 flctl_mtd = &flctl->mtd;
855 flctl_mtd->priv = nand;
857 flctl->hwecc = pdata->has_hwecc;
859 flctl_register_init(flctl, pdata->flcmncr_val);
861 nand->options = NAND_NO_AUTOINCR;
863 /* Set address of hardware control function */
864 /* 20 us command delay time */
865 nand->chip_delay = 20;
867 nand->read_byte = flctl_read_byte;
868 nand->write_buf = flctl_write_buf;
869 nand->read_buf = flctl_read_buf;
870 nand->verify_buf = flctl_verify_buf;
871 nand->select_chip = flctl_select_chip;
872 nand->cmdfunc = flctl_cmdfunc;
874 if (pdata->flcmncr_val & SEL_16BIT) {
875 nand->options |= NAND_BUSWIDTH_16;
876 nand->read_word = flctl_read_word;
879 ret = nand_scan_ident(flctl_mtd, 1, NULL);
883 ret = flctl_chip_init_tail(flctl_mtd);
887 ret = nand_scan_tail(flctl_mtd);
891 mtd_device_register(flctl_mtd, pdata->parts, pdata->nr_parts);
900 static int __devexit flctl_remove(struct platform_device *pdev)
902 struct sh_flctl *flctl = platform_get_drvdata(pdev);
904 nand_release(&flctl->mtd);
910 static struct platform_driver flctl_driver = {
911 .remove = flctl_remove,
914 .owner = THIS_MODULE,
918 static int __init flctl_nand_init(void)
920 return platform_driver_probe(&flctl_driver, flctl_probe);
923 static void __exit flctl_nand_cleanup(void)
925 platform_driver_unregister(&flctl_driver);
928 module_init(flctl_nand_init);
929 module_exit(flctl_nand_cleanup);
931 MODULE_LICENSE("GPL");
932 MODULE_AUTHOR("Yoshihiro Shimoda");
933 MODULE_DESCRIPTION("SuperH FLCTL driver");
934 MODULE_ALIAS("platform:sh_flctl");