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/completion.h>
27 #include <linux/delay.h>
28 #include <linux/dmaengine.h>
29 #include <linux/dma-mapping.h>
30 #include <linux/interrupt.h>
33 #include <linux/of_device.h>
34 #include <linux/platform_device.h>
35 #include <linux/pm_runtime.h>
36 #include <linux/sh_dma.h>
37 #include <linux/slab.h>
38 #include <linux/string.h>
40 #include <linux/mtd/mtd.h>
41 #include <linux/mtd/nand.h>
42 #include <linux/mtd/partitions.h>
43 #include <linux/mtd/sh_flctl.h>
45 static int flctl_4secc_ooblayout_sp_ecc(struct mtd_info
*mtd
, int section
,
46 struct mtd_oob_region
*oobregion
)
48 struct nand_chip
*chip
= mtd_to_nand(mtd
);
53 oobregion
->offset
= 0;
54 oobregion
->length
= chip
->ecc
.bytes
;
59 static int flctl_4secc_ooblayout_sp_free(struct mtd_info
*mtd
, int section
,
60 struct mtd_oob_region
*oobregion
)
65 oobregion
->offset
= 12;
66 oobregion
->length
= 4;
71 static const struct mtd_ooblayout_ops flctl_4secc_oob_smallpage_ops
= {
72 .ecc
= flctl_4secc_ooblayout_sp_ecc
,
73 .free
= flctl_4secc_ooblayout_sp_free
,
76 static int flctl_4secc_ooblayout_lp_ecc(struct mtd_info
*mtd
, int section
,
77 struct mtd_oob_region
*oobregion
)
79 struct nand_chip
*chip
= mtd_to_nand(mtd
);
81 if (section
>= chip
->ecc
.steps
)
84 oobregion
->offset
= (section
* 16) + 6;
85 oobregion
->length
= chip
->ecc
.bytes
;
90 static int flctl_4secc_ooblayout_lp_free(struct mtd_info
*mtd
, int section
,
91 struct mtd_oob_region
*oobregion
)
93 struct nand_chip
*chip
= mtd_to_nand(mtd
);
95 if (section
>= chip
->ecc
.steps
)
98 oobregion
->offset
= section
* 16;
99 oobregion
->length
= 6;
102 oobregion
->offset
+= 2;
103 oobregion
->length
-= 2;
109 static const struct mtd_ooblayout_ops flctl_4secc_oob_largepage_ops
= {
110 .ecc
= flctl_4secc_ooblayout_lp_ecc
,
111 .free
= flctl_4secc_ooblayout_lp_free
,
114 static uint8_t scan_ff_pattern
[] = { 0xff, 0xff };
116 static struct nand_bbt_descr flctl_4secc_smallpage
= {
117 .options
= NAND_BBT_SCAN2NDPAGE
,
120 .pattern
= scan_ff_pattern
,
123 static struct nand_bbt_descr flctl_4secc_largepage
= {
124 .options
= NAND_BBT_SCAN2NDPAGE
,
127 .pattern
= scan_ff_pattern
,
130 static void empty_fifo(struct sh_flctl
*flctl
)
132 writel(flctl
->flintdmacr_base
| AC1CLR
| AC0CLR
, FLINTDMACR(flctl
));
133 writel(flctl
->flintdmacr_base
, FLINTDMACR(flctl
));
136 static void start_translation(struct sh_flctl
*flctl
)
138 writeb(TRSTRT
, FLTRCR(flctl
));
141 static void timeout_error(struct sh_flctl
*flctl
, const char *str
)
143 dev_err(&flctl
->pdev
->dev
, "Timeout occurred in %s\n", str
);
146 static void wait_completion(struct sh_flctl
*flctl
)
148 uint32_t timeout
= LOOP_TIMEOUT_MAX
;
151 if (readb(FLTRCR(flctl
)) & TREND
) {
152 writeb(0x0, FLTRCR(flctl
));
158 timeout_error(flctl
, __func__
);
159 writeb(0x0, FLTRCR(flctl
));
162 static void flctl_dma_complete(void *param
)
164 struct sh_flctl
*flctl
= param
;
166 complete(&flctl
->dma_complete
);
169 static void flctl_release_dma(struct sh_flctl
*flctl
)
171 if (flctl
->chan_fifo0_rx
) {
172 dma_release_channel(flctl
->chan_fifo0_rx
);
173 flctl
->chan_fifo0_rx
= NULL
;
175 if (flctl
->chan_fifo0_tx
) {
176 dma_release_channel(flctl
->chan_fifo0_tx
);
177 flctl
->chan_fifo0_tx
= NULL
;
181 static void flctl_setup_dma(struct sh_flctl
*flctl
)
184 struct dma_slave_config cfg
;
185 struct platform_device
*pdev
= flctl
->pdev
;
186 struct sh_flctl_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
192 if (pdata
->slave_id_fifo0_tx
<= 0 || pdata
->slave_id_fifo0_rx
<= 0)
195 /* We can only either use DMA for both Tx and Rx or not use it at all */
197 dma_cap_set(DMA_SLAVE
, mask
);
199 flctl
->chan_fifo0_tx
= dma_request_channel(mask
, shdma_chan_filter
,
200 (void *)(uintptr_t)pdata
->slave_id_fifo0_tx
);
201 dev_dbg(&pdev
->dev
, "%s: TX: got channel %p\n", __func__
,
202 flctl
->chan_fifo0_tx
);
204 if (!flctl
->chan_fifo0_tx
)
207 memset(&cfg
, 0, sizeof(cfg
));
208 cfg
.direction
= DMA_MEM_TO_DEV
;
209 cfg
.dst_addr
= flctl
->fifo
;
211 ret
= dmaengine_slave_config(flctl
->chan_fifo0_tx
, &cfg
);
215 flctl
->chan_fifo0_rx
= dma_request_channel(mask
, shdma_chan_filter
,
216 (void *)(uintptr_t)pdata
->slave_id_fifo0_rx
);
217 dev_dbg(&pdev
->dev
, "%s: RX: got channel %p\n", __func__
,
218 flctl
->chan_fifo0_rx
);
220 if (!flctl
->chan_fifo0_rx
)
223 cfg
.direction
= DMA_DEV_TO_MEM
;
225 cfg
.src_addr
= flctl
->fifo
;
226 ret
= dmaengine_slave_config(flctl
->chan_fifo0_rx
, &cfg
);
230 init_completion(&flctl
->dma_complete
);
235 flctl_release_dma(flctl
);
238 static void set_addr(struct mtd_info
*mtd
, int column
, int page_addr
)
240 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
244 addr
= page_addr
; /* ERASE1 */
245 } else if (page_addr
!= -1) {
246 /* SEQIN, READ0, etc.. */
247 if (flctl
->chip
.options
& NAND_BUSWIDTH_16
)
249 if (flctl
->page_size
) {
250 addr
= column
& 0x0FFF;
251 addr
|= (page_addr
& 0xff) << 16;
252 addr
|= ((page_addr
>> 8) & 0xff) << 24;
254 if (flctl
->rw_ADRCNT
== ADRCNT2_E
) {
256 addr2
= (page_addr
>> 16) & 0xff;
257 writel(addr2
, FLADR2(flctl
));
261 addr
|= (page_addr
& 0xff) << 8;
262 addr
|= ((page_addr
>> 8) & 0xff) << 16;
263 addr
|= ((page_addr
>> 16) & 0xff) << 24;
266 writel(addr
, FLADR(flctl
));
269 static void wait_rfifo_ready(struct sh_flctl
*flctl
)
271 uint32_t timeout
= LOOP_TIMEOUT_MAX
;
276 val
= readl(FLDTCNTR(flctl
)) >> 16;
281 timeout_error(flctl
, __func__
);
284 static void wait_wfifo_ready(struct sh_flctl
*flctl
)
286 uint32_t len
, timeout
= LOOP_TIMEOUT_MAX
;
290 len
= (readl(FLDTCNTR(flctl
)) >> 16) & 0xFF;
295 timeout_error(flctl
, __func__
);
298 static enum flctl_ecc_res_t wait_recfifo_ready
299 (struct sh_flctl
*flctl
, int sector_number
)
301 uint32_t timeout
= LOOP_TIMEOUT_MAX
;
302 void __iomem
*ecc_reg
[4];
304 int state
= FL_SUCCESS
;
308 * First this loops checks in FLDTCNTR if we are ready to read out the
309 * oob data. This is the case if either all went fine without errors or
310 * if the bottom part of the loop corrected the errors or marked them as
311 * uncorrectable and the controller is given time to push the data into
315 /* check if all is ok and we can read out the OOB */
316 size
= readl(FLDTCNTR(flctl
)) >> 24;
317 if ((size
& 0xFF) == 4)
320 /* check if a correction code has been calculated */
321 if (!(readl(FL4ECCCR(flctl
)) & _4ECCEND
)) {
323 * either we wait for the fifo to be filled or a
324 * correction pattern is being generated
330 /* check for an uncorrectable error */
331 if (readl(FL4ECCCR(flctl
)) & _4ECCFA
) {
332 /* check if we face a non-empty page */
333 for (i
= 0; i
< 512; i
++) {
334 if (flctl
->done_buff
[i
] != 0xff) {
335 state
= FL_ERROR
; /* can't correct */
340 if (state
== FL_SUCCESS
)
341 dev_dbg(&flctl
->pdev
->dev
,
342 "reading empty sector %d, ecc error ignored\n",
345 writel(0, FL4ECCCR(flctl
));
349 /* start error correction */
350 ecc_reg
[0] = FL4ECCRESULT0(flctl
);
351 ecc_reg
[1] = FL4ECCRESULT1(flctl
);
352 ecc_reg
[2] = FL4ECCRESULT2(flctl
);
353 ecc_reg
[3] = FL4ECCRESULT3(flctl
);
355 for (i
= 0; i
< 3; i
++) {
359 data
= readl(ecc_reg
[i
]);
361 if (flctl
->page_size
)
362 index
= (512 * sector_number
) +
367 org
= flctl
->done_buff
[index
];
368 flctl
->done_buff
[index
] = org
^ (data
& 0xFF);
370 state
= FL_REPAIRABLE
;
371 writel(0, FL4ECCCR(flctl
));
374 timeout_error(flctl
, __func__
);
375 return FL_TIMEOUT
; /* timeout */
378 static void wait_wecfifo_ready(struct sh_flctl
*flctl
)
380 uint32_t timeout
= LOOP_TIMEOUT_MAX
;
385 len
= (readl(FLDTCNTR(flctl
)) >> 24) & 0xFF;
390 timeout_error(flctl
, __func__
);
393 static int flctl_dma_fifo0_transfer(struct sh_flctl
*flctl
, unsigned long *buf
,
394 int len
, enum dma_data_direction dir
)
396 struct dma_async_tx_descriptor
*desc
= NULL
;
397 struct dma_chan
*chan
;
398 enum dma_transfer_direction tr_dir
;
400 dma_cookie_t cookie
= -EINVAL
;
404 if (dir
== DMA_FROM_DEVICE
) {
405 chan
= flctl
->chan_fifo0_rx
;
406 tr_dir
= DMA_DEV_TO_MEM
;
408 chan
= flctl
->chan_fifo0_tx
;
409 tr_dir
= DMA_MEM_TO_DEV
;
412 dma_addr
= dma_map_single(chan
->device
->dev
, buf
, len
, dir
);
415 desc
= dmaengine_prep_slave_single(chan
, dma_addr
, len
,
416 tr_dir
, DMA_PREP_INTERRUPT
| DMA_CTRL_ACK
);
419 reg
= readl(FLINTDMACR(flctl
));
421 writel(reg
, FLINTDMACR(flctl
));
423 desc
->callback
= flctl_dma_complete
;
424 desc
->callback_param
= flctl
;
425 cookie
= dmaengine_submit(desc
);
427 dma_async_issue_pending(chan
);
429 /* DMA failed, fall back to PIO */
430 flctl_release_dma(flctl
);
431 dev_warn(&flctl
->pdev
->dev
,
432 "DMA failed, falling back to PIO\n");
438 wait_for_completion_timeout(&flctl
->dma_complete
,
439 msecs_to_jiffies(3000));
442 dmaengine_terminate_all(chan
);
443 dev_err(&flctl
->pdev
->dev
, "wait_for_completion_timeout\n");
447 reg
= readl(FLINTDMACR(flctl
));
449 writel(reg
, FLINTDMACR(flctl
));
451 dma_unmap_single(chan
->device
->dev
, dma_addr
, len
, dir
);
453 /* ret > 0 is success */
457 static void read_datareg(struct sh_flctl
*flctl
, int offset
)
460 unsigned long *buf
= (unsigned long *)&flctl
->done_buff
[offset
];
462 wait_completion(flctl
);
464 data
= readl(FLDATAR(flctl
));
465 *buf
= le32_to_cpu(data
);
468 static void read_fiforeg(struct sh_flctl
*flctl
, int rlen
, int offset
)
471 unsigned long *buf
= (unsigned long *)&flctl
->done_buff
[offset
];
473 len_4align
= (rlen
+ 3) / 4;
475 /* initiate DMA transfer */
476 if (flctl
->chan_fifo0_rx
&& rlen
>= 32 &&
477 flctl_dma_fifo0_transfer(flctl
, buf
, rlen
, DMA_DEV_TO_MEM
) > 0)
478 goto convert
; /* DMA success */
480 /* do polling transfer */
481 for (i
= 0; i
< len_4align
; i
++) {
482 wait_rfifo_ready(flctl
);
483 buf
[i
] = readl(FLDTFIFO(flctl
));
487 for (i
= 0; i
< len_4align
; i
++)
488 buf
[i
] = be32_to_cpu(buf
[i
]);
491 static enum flctl_ecc_res_t read_ecfiforeg
492 (struct sh_flctl
*flctl
, uint8_t *buff
, int sector
)
495 enum flctl_ecc_res_t res
;
496 unsigned long *ecc_buf
= (unsigned long *)buff
;
498 res
= wait_recfifo_ready(flctl
, sector
);
500 if (res
!= FL_ERROR
) {
501 for (i
= 0; i
< 4; i
++) {
502 ecc_buf
[i
] = readl(FLECFIFO(flctl
));
503 ecc_buf
[i
] = be32_to_cpu(ecc_buf
[i
]);
510 static void write_fiforeg(struct sh_flctl
*flctl
, int rlen
,
514 unsigned long *buf
= (unsigned long *)&flctl
->done_buff
[offset
];
516 len_4align
= (rlen
+ 3) / 4;
517 for (i
= 0; i
< len_4align
; i
++) {
518 wait_wfifo_ready(flctl
);
519 writel(cpu_to_be32(buf
[i
]), FLDTFIFO(flctl
));
523 static void write_ec_fiforeg(struct sh_flctl
*flctl
, int rlen
,
527 unsigned long *buf
= (unsigned long *)&flctl
->done_buff
[offset
];
529 len_4align
= (rlen
+ 3) / 4;
531 for (i
= 0; i
< len_4align
; i
++)
532 buf
[i
] = cpu_to_be32(buf
[i
]);
534 /* initiate DMA transfer */
535 if (flctl
->chan_fifo0_tx
&& rlen
>= 32 &&
536 flctl_dma_fifo0_transfer(flctl
, buf
, rlen
, DMA_MEM_TO_DEV
) > 0)
537 return; /* DMA success */
539 /* do polling transfer */
540 for (i
= 0; i
< len_4align
; i
++) {
541 wait_wecfifo_ready(flctl
);
542 writel(buf
[i
], FLECFIFO(flctl
));
546 static void set_cmd_regs(struct mtd_info
*mtd
, uint32_t cmd
, uint32_t flcmcdr_val
)
548 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
549 uint32_t flcmncr_val
= flctl
->flcmncr_base
& ~SEL_16BIT
;
550 uint32_t flcmdcr_val
, addr_len_bytes
= 0;
552 /* Set SNAND bit if page size is 2048byte */
553 if (flctl
->page_size
)
554 flcmncr_val
|= SNAND_E
;
556 flcmncr_val
&= ~SNAND_E
;
558 /* default FLCMDCR val */
559 flcmdcr_val
= DOCMD1_E
| DOADR_E
;
561 /* Set for FLCMDCR */
563 case NAND_CMD_ERASE1
:
564 addr_len_bytes
= flctl
->erase_ADRCNT
;
565 flcmdcr_val
|= DOCMD2_E
;
568 case NAND_CMD_READOOB
:
569 case NAND_CMD_RNDOUT
:
570 addr_len_bytes
= flctl
->rw_ADRCNT
;
571 flcmdcr_val
|= CDSRC_E
;
572 if (flctl
->chip
.options
& NAND_BUSWIDTH_16
)
573 flcmncr_val
|= SEL_16BIT
;
576 /* This case is that cmd is READ0 or READ1 or READ00 */
577 flcmdcr_val
&= ~DOADR_E
; /* ONLY execute 1st cmd */
579 case NAND_CMD_PAGEPROG
:
580 addr_len_bytes
= flctl
->rw_ADRCNT
;
581 flcmdcr_val
|= DOCMD2_E
| CDSRC_E
| SELRW
;
582 if (flctl
->chip
.options
& NAND_BUSWIDTH_16
)
583 flcmncr_val
|= SEL_16BIT
;
585 case NAND_CMD_READID
:
586 flcmncr_val
&= ~SNAND_E
;
587 flcmdcr_val
|= CDSRC_E
;
588 addr_len_bytes
= ADRCNT_1
;
590 case NAND_CMD_STATUS
:
592 flcmncr_val
&= ~SNAND_E
;
593 flcmdcr_val
&= ~(DOADR_E
| DOSR_E
);
599 /* Set address bytes parameter */
600 flcmdcr_val
|= addr_len_bytes
;
602 /* Now actually write */
603 writel(flcmncr_val
, FLCMNCR(flctl
));
604 writel(flcmdcr_val
, FLCMDCR(flctl
));
605 writel(flcmcdr_val
, FLCMCDR(flctl
));
608 static int flctl_read_page_hwecc(struct mtd_info
*mtd
, struct nand_chip
*chip
,
609 uint8_t *buf
, int oob_required
, int page
)
611 chip
->read_buf(mtd
, buf
, mtd
->writesize
);
613 chip
->read_buf(mtd
, chip
->oob_poi
, mtd
->oobsize
);
617 static int flctl_write_page_hwecc(struct mtd_info
*mtd
, struct nand_chip
*chip
,
618 const uint8_t *buf
, int oob_required
,
621 chip
->write_buf(mtd
, buf
, mtd
->writesize
);
622 chip
->write_buf(mtd
, chip
->oob_poi
, mtd
->oobsize
);
626 static void execmd_read_page_sector(struct mtd_info
*mtd
, int page_addr
)
628 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
629 int sector
, page_sectors
;
630 enum flctl_ecc_res_t ecc_result
;
632 page_sectors
= flctl
->page_size
? 4 : 1;
634 set_cmd_regs(mtd
, NAND_CMD_READ0
,
635 (NAND_CMD_READSTART
<< 8) | NAND_CMD_READ0
);
637 writel(readl(FLCMNCR(flctl
)) | ACM_SACCES_MODE
| _4ECCCORRECT
,
639 writel(readl(FLCMDCR(flctl
)) | page_sectors
, FLCMDCR(flctl
));
640 writel(page_addr
<< 2, FLADR(flctl
));
643 start_translation(flctl
);
645 for (sector
= 0; sector
< page_sectors
; sector
++) {
646 read_fiforeg(flctl
, 512, 512 * sector
);
648 ecc_result
= read_ecfiforeg(flctl
,
649 &flctl
->done_buff
[mtd
->writesize
+ 16 * sector
],
652 switch (ecc_result
) {
654 dev_info(&flctl
->pdev
->dev
,
655 "applied ecc on page 0x%x", page_addr
);
656 mtd
->ecc_stats
.corrected
++;
659 dev_warn(&flctl
->pdev
->dev
,
660 "page 0x%x contains corrupted data\n",
662 mtd
->ecc_stats
.failed
++;
669 wait_completion(flctl
);
671 writel(readl(FLCMNCR(flctl
)) & ~(ACM_SACCES_MODE
| _4ECCCORRECT
),
675 static void execmd_read_oob(struct mtd_info
*mtd
, int page_addr
)
677 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
678 int page_sectors
= flctl
->page_size
? 4 : 1;
681 set_cmd_regs(mtd
, NAND_CMD_READ0
,
682 (NAND_CMD_READSTART
<< 8) | NAND_CMD_READ0
);
686 for (i
= 0; i
< page_sectors
; i
++) {
687 set_addr(mtd
, (512 + 16) * i
+ 512 , page_addr
);
688 writel(16, FLDTCNTR(flctl
));
690 start_translation(flctl
);
691 read_fiforeg(flctl
, 16, 16 * i
);
692 wait_completion(flctl
);
696 static void execmd_write_page_sector(struct mtd_info
*mtd
)
698 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
699 int page_addr
= flctl
->seqin_page_addr
;
700 int sector
, page_sectors
;
702 page_sectors
= flctl
->page_size
? 4 : 1;
704 set_cmd_regs(mtd
, NAND_CMD_PAGEPROG
,
705 (NAND_CMD_PAGEPROG
<< 8) | NAND_CMD_SEQIN
);
708 writel(readl(FLCMNCR(flctl
)) | ACM_SACCES_MODE
, FLCMNCR(flctl
));
709 writel(readl(FLCMDCR(flctl
)) | page_sectors
, FLCMDCR(flctl
));
710 writel(page_addr
<< 2, FLADR(flctl
));
711 start_translation(flctl
);
713 for (sector
= 0; sector
< page_sectors
; sector
++) {
714 write_fiforeg(flctl
, 512, 512 * sector
);
715 write_ec_fiforeg(flctl
, 16, mtd
->writesize
+ 16 * sector
);
718 wait_completion(flctl
);
719 writel(readl(FLCMNCR(flctl
)) & ~ACM_SACCES_MODE
, FLCMNCR(flctl
));
722 static void execmd_write_oob(struct mtd_info
*mtd
)
724 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
725 int page_addr
= flctl
->seqin_page_addr
;
726 int sector
, page_sectors
;
728 page_sectors
= flctl
->page_size
? 4 : 1;
730 set_cmd_regs(mtd
, NAND_CMD_PAGEPROG
,
731 (NAND_CMD_PAGEPROG
<< 8) | NAND_CMD_SEQIN
);
733 for (sector
= 0; sector
< page_sectors
; sector
++) {
735 set_addr(mtd
, sector
* 528 + 512, page_addr
);
736 writel(16, FLDTCNTR(flctl
)); /* set read size */
738 start_translation(flctl
);
739 write_fiforeg(flctl
, 16, 16 * sector
);
740 wait_completion(flctl
);
744 static void flctl_cmdfunc(struct mtd_info
*mtd
, unsigned int command
,
745 int column
, int page_addr
)
747 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
748 uint32_t read_cmd
= 0;
750 pm_runtime_get_sync(&flctl
->pdev
->dev
);
752 flctl
->read_bytes
= 0;
753 if (command
!= NAND_CMD_PAGEPROG
)
760 /* read page with hwecc */
761 execmd_read_page_sector(mtd
, page_addr
);
764 if (flctl
->page_size
)
765 set_cmd_regs(mtd
, command
, (NAND_CMD_READSTART
<< 8)
768 set_cmd_regs(mtd
, command
, command
);
770 set_addr(mtd
, 0, page_addr
);
772 flctl
->read_bytes
= mtd
->writesize
+ mtd
->oobsize
;
773 if (flctl
->chip
.options
& NAND_BUSWIDTH_16
)
775 flctl
->index
+= column
;
776 goto read_normal_exit
;
778 case NAND_CMD_READOOB
:
780 /* read page with hwecc */
781 execmd_read_oob(mtd
, page_addr
);
785 if (flctl
->page_size
) {
786 set_cmd_regs(mtd
, command
, (NAND_CMD_READSTART
<< 8)
788 set_addr(mtd
, mtd
->writesize
, page_addr
);
790 set_cmd_regs(mtd
, command
, command
);
791 set_addr(mtd
, 0, page_addr
);
793 flctl
->read_bytes
= mtd
->oobsize
;
794 goto read_normal_exit
;
796 case NAND_CMD_RNDOUT
:
800 if (flctl
->page_size
)
801 set_cmd_regs(mtd
, command
, (NAND_CMD_RNDOUTSTART
<< 8)
804 set_cmd_regs(mtd
, command
, command
);
806 set_addr(mtd
, column
, 0);
808 flctl
->read_bytes
= mtd
->writesize
+ mtd
->oobsize
- column
;
809 goto read_normal_exit
;
811 case NAND_CMD_READID
:
812 set_cmd_regs(mtd
, command
, command
);
814 /* READID is always performed using an 8-bit bus */
815 if (flctl
->chip
.options
& NAND_BUSWIDTH_16
)
817 set_addr(mtd
, column
, 0);
819 flctl
->read_bytes
= 8;
820 writel(flctl
->read_bytes
, FLDTCNTR(flctl
)); /* set read size */
822 start_translation(flctl
);
823 read_fiforeg(flctl
, flctl
->read_bytes
, 0);
824 wait_completion(flctl
);
827 case NAND_CMD_ERASE1
:
828 flctl
->erase1_page_addr
= page_addr
;
831 case NAND_CMD_ERASE2
:
832 set_cmd_regs(mtd
, NAND_CMD_ERASE1
,
833 (command
<< 8) | NAND_CMD_ERASE1
);
834 set_addr(mtd
, -1, flctl
->erase1_page_addr
);
835 start_translation(flctl
);
836 wait_completion(flctl
);
840 if (!flctl
->page_size
) {
841 /* output read command */
842 if (column
>= mtd
->writesize
) {
843 column
-= mtd
->writesize
;
844 read_cmd
= NAND_CMD_READOOB
;
845 } else if (column
< 256) {
846 read_cmd
= NAND_CMD_READ0
;
849 read_cmd
= NAND_CMD_READ1
;
852 flctl
->seqin_column
= column
;
853 flctl
->seqin_page_addr
= page_addr
;
854 flctl
->seqin_read_cmd
= read_cmd
;
857 case NAND_CMD_PAGEPROG
:
859 if (!flctl
->page_size
) {
860 set_cmd_regs(mtd
, NAND_CMD_SEQIN
,
861 flctl
->seqin_read_cmd
);
862 set_addr(mtd
, -1, -1);
863 writel(0, FLDTCNTR(flctl
)); /* set 0 size */
864 start_translation(flctl
);
865 wait_completion(flctl
);
868 /* write page with hwecc */
869 if (flctl
->seqin_column
== mtd
->writesize
)
870 execmd_write_oob(mtd
);
871 else if (!flctl
->seqin_column
)
872 execmd_write_page_sector(mtd
);
874 printk(KERN_ERR
"Invalid address !?\n");
877 set_cmd_regs(mtd
, command
, (command
<< 8) | NAND_CMD_SEQIN
);
878 set_addr(mtd
, flctl
->seqin_column
, flctl
->seqin_page_addr
);
879 writel(flctl
->index
, FLDTCNTR(flctl
)); /* set write size */
880 start_translation(flctl
);
881 write_fiforeg(flctl
, flctl
->index
, 0);
882 wait_completion(flctl
);
885 case NAND_CMD_STATUS
:
886 set_cmd_regs(mtd
, command
, command
);
887 set_addr(mtd
, -1, -1);
889 flctl
->read_bytes
= 1;
890 writel(flctl
->read_bytes
, FLDTCNTR(flctl
)); /* set read size */
891 start_translation(flctl
);
892 read_datareg(flctl
, 0); /* read and end */
896 set_cmd_regs(mtd
, command
, command
);
897 set_addr(mtd
, -1, -1);
899 writel(0, FLDTCNTR(flctl
)); /* set 0 size */
900 start_translation(flctl
);
901 wait_completion(flctl
);
910 writel(flctl
->read_bytes
, FLDTCNTR(flctl
)); /* set read size */
912 start_translation(flctl
);
913 read_fiforeg(flctl
, flctl
->read_bytes
, 0);
914 wait_completion(flctl
);
916 pm_runtime_put_sync(&flctl
->pdev
->dev
);
920 static void flctl_select_chip(struct mtd_info
*mtd
, int chipnr
)
922 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
927 flctl
->flcmncr_base
&= ~CE0_ENABLE
;
929 pm_runtime_get_sync(&flctl
->pdev
->dev
);
930 writel(flctl
->flcmncr_base
, FLCMNCR(flctl
));
932 if (flctl
->qos_request
) {
933 dev_pm_qos_remove_request(&flctl
->pm_qos
);
934 flctl
->qos_request
= 0;
937 pm_runtime_put_sync(&flctl
->pdev
->dev
);
940 flctl
->flcmncr_base
|= CE0_ENABLE
;
942 if (!flctl
->qos_request
) {
943 ret
= dev_pm_qos_add_request(&flctl
->pdev
->dev
,
945 DEV_PM_QOS_RESUME_LATENCY
,
948 dev_err(&flctl
->pdev
->dev
,
949 "PM QoS request failed: %d\n", ret
);
950 flctl
->qos_request
= 1;
954 pm_runtime_get_sync(&flctl
->pdev
->dev
);
955 writel(HOLDEN
, FLHOLDCR(flctl
));
956 pm_runtime_put_sync(&flctl
->pdev
->dev
);
964 static void flctl_write_buf(struct mtd_info
*mtd
, const uint8_t *buf
, int len
)
966 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
968 memcpy(&flctl
->done_buff
[flctl
->index
], buf
, len
);
972 static uint8_t flctl_read_byte(struct mtd_info
*mtd
)
974 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
977 data
= flctl
->done_buff
[flctl
->index
];
982 static uint16_t flctl_read_word(struct mtd_info
*mtd
)
984 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
985 uint16_t *buf
= (uint16_t *)&flctl
->done_buff
[flctl
->index
];
991 static void flctl_read_buf(struct mtd_info
*mtd
, uint8_t *buf
, int len
)
993 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
995 memcpy(buf
, &flctl
->done_buff
[flctl
->index
], len
);
999 static int flctl_chip_init_tail(struct mtd_info
*mtd
)
1001 struct sh_flctl
*flctl
= mtd_to_flctl(mtd
);
1002 struct nand_chip
*chip
= &flctl
->chip
;
1004 if (mtd
->writesize
== 512) {
1005 flctl
->page_size
= 0;
1006 if (chip
->chipsize
> (32 << 20)) {
1008 flctl
->rw_ADRCNT
= ADRCNT_4
;
1009 flctl
->erase_ADRCNT
= ADRCNT_3
;
1010 } else if (chip
->chipsize
> (2 << 16)) {
1011 /* big than 128KB */
1012 flctl
->rw_ADRCNT
= ADRCNT_3
;
1013 flctl
->erase_ADRCNT
= ADRCNT_2
;
1015 flctl
->rw_ADRCNT
= ADRCNT_2
;
1016 flctl
->erase_ADRCNT
= ADRCNT_1
;
1019 flctl
->page_size
= 1;
1020 if (chip
->chipsize
> (128 << 20)) {
1021 /* big than 128MB */
1022 flctl
->rw_ADRCNT
= ADRCNT2_E
;
1023 flctl
->erase_ADRCNT
= ADRCNT_3
;
1024 } else if (chip
->chipsize
> (8 << 16)) {
1025 /* big than 512KB */
1026 flctl
->rw_ADRCNT
= ADRCNT_4
;
1027 flctl
->erase_ADRCNT
= ADRCNT_2
;
1029 flctl
->rw_ADRCNT
= ADRCNT_3
;
1030 flctl
->erase_ADRCNT
= ADRCNT_1
;
1035 if (mtd
->writesize
== 512) {
1036 mtd_set_ooblayout(mtd
, &flctl_4secc_oob_smallpage_ops
);
1037 chip
->badblock_pattern
= &flctl_4secc_smallpage
;
1039 mtd_set_ooblayout(mtd
, &flctl_4secc_oob_largepage_ops
);
1040 chip
->badblock_pattern
= &flctl_4secc_largepage
;
1043 chip
->ecc
.size
= 512;
1044 chip
->ecc
.bytes
= 10;
1045 chip
->ecc
.strength
= 4;
1046 chip
->ecc
.read_page
= flctl_read_page_hwecc
;
1047 chip
->ecc
.write_page
= flctl_write_page_hwecc
;
1048 chip
->ecc
.mode
= NAND_ECC_HW
;
1050 /* 4 symbols ECC enabled */
1051 flctl
->flcmncr_base
|= _4ECCEN
;
1053 chip
->ecc
.mode
= NAND_ECC_SOFT
;
1054 chip
->ecc
.algo
= NAND_ECC_HAMMING
;
1060 static irqreturn_t
flctl_handle_flste(int irq
, void *dev_id
)
1062 struct sh_flctl
*flctl
= dev_id
;
1064 dev_err(&flctl
->pdev
->dev
, "flste irq: %x\n", readl(FLINTDMACR(flctl
)));
1065 writel(flctl
->flintdmacr_base
, FLINTDMACR(flctl
));
1070 struct flctl_soc_config
{
1071 unsigned long flcmncr_val
;
1072 unsigned has_hwecc
:1;
1073 unsigned use_holden
:1;
1076 static struct flctl_soc_config flctl_sh7372_config
= {
1077 .flcmncr_val
= CLK_16B_12L_4H
| TYPESEL_SET
| SHBUSSEL
,
1082 static const struct of_device_id of_flctl_match
[] = {
1083 { .compatible
= "renesas,shmobile-flctl-sh7372",
1084 .data
= &flctl_sh7372_config
},
1087 MODULE_DEVICE_TABLE(of
, of_flctl_match
);
1089 static struct sh_flctl_platform_data
*flctl_parse_dt(struct device
*dev
)
1091 const struct of_device_id
*match
;
1092 struct flctl_soc_config
*config
;
1093 struct sh_flctl_platform_data
*pdata
;
1095 match
= of_match_device(of_flctl_match
, dev
);
1097 config
= (struct flctl_soc_config
*)match
->data
;
1099 dev_err(dev
, "%s: no OF configuration attached\n", __func__
);
1103 pdata
= devm_kzalloc(dev
, sizeof(struct sh_flctl_platform_data
),
1108 /* set SoC specific options */
1109 pdata
->flcmncr_val
= config
->flcmncr_val
;
1110 pdata
->has_hwecc
= config
->has_hwecc
;
1111 pdata
->use_holden
= config
->use_holden
;
1116 static int flctl_probe(struct platform_device
*pdev
)
1118 struct resource
*res
;
1119 struct sh_flctl
*flctl
;
1120 struct mtd_info
*flctl_mtd
;
1121 struct nand_chip
*nand
;
1122 struct sh_flctl_platform_data
*pdata
;
1126 flctl
= devm_kzalloc(&pdev
->dev
, sizeof(struct sh_flctl
), GFP_KERNEL
);
1130 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
1131 flctl
->reg
= devm_ioremap_resource(&pdev
->dev
, res
);
1132 if (IS_ERR(flctl
->reg
))
1133 return PTR_ERR(flctl
->reg
);
1134 flctl
->fifo
= res
->start
+ 0x24; /* FLDTFIFO */
1136 irq
= platform_get_irq(pdev
, 0);
1138 dev_err(&pdev
->dev
, "failed to get flste irq data\n");
1142 ret
= devm_request_irq(&pdev
->dev
, irq
, flctl_handle_flste
, IRQF_SHARED
,
1145 dev_err(&pdev
->dev
, "request interrupt failed.\n");
1149 if (pdev
->dev
.of_node
)
1150 pdata
= flctl_parse_dt(&pdev
->dev
);
1152 pdata
= dev_get_platdata(&pdev
->dev
);
1155 dev_err(&pdev
->dev
, "no setup data defined\n");
1159 platform_set_drvdata(pdev
, flctl
);
1160 nand
= &flctl
->chip
;
1161 flctl_mtd
= nand_to_mtd(nand
);
1162 nand_set_flash_node(nand
, pdev
->dev
.of_node
);
1163 flctl_mtd
->dev
.parent
= &pdev
->dev
;
1165 flctl
->hwecc
= pdata
->has_hwecc
;
1166 flctl
->holden
= pdata
->use_holden
;
1167 flctl
->flcmncr_base
= pdata
->flcmncr_val
;
1168 flctl
->flintdmacr_base
= flctl
->hwecc
? (STERINTE
| ECERB
) : STERINTE
;
1170 /* Set address of hardware control function */
1171 /* 20 us command delay time */
1172 nand
->chip_delay
= 20;
1174 nand
->read_byte
= flctl_read_byte
;
1175 nand
->read_word
= flctl_read_word
;
1176 nand
->write_buf
= flctl_write_buf
;
1177 nand
->read_buf
= flctl_read_buf
;
1178 nand
->select_chip
= flctl_select_chip
;
1179 nand
->cmdfunc
= flctl_cmdfunc
;
1181 if (pdata
->flcmncr_val
& SEL_16BIT
)
1182 nand
->options
|= NAND_BUSWIDTH_16
;
1184 pm_runtime_enable(&pdev
->dev
);
1185 pm_runtime_resume(&pdev
->dev
);
1187 flctl_setup_dma(flctl
);
1189 ret
= nand_scan_ident(flctl_mtd
, 1, NULL
);
1193 if (nand
->options
& NAND_BUSWIDTH_16
) {
1195 * NAND_BUSWIDTH_16 may have been set by nand_scan_ident().
1196 * Add the SEL_16BIT flag in pdata->flcmncr_val and re-assign
1197 * flctl->flcmncr_base to pdata->flcmncr_val.
1199 pdata
->flcmncr_val
|= SEL_16BIT
;
1200 flctl
->flcmncr_base
= pdata
->flcmncr_val
;
1203 ret
= flctl_chip_init_tail(flctl_mtd
);
1207 ret
= nand_scan_tail(flctl_mtd
);
1211 ret
= mtd_device_register(flctl_mtd
, pdata
->parts
, pdata
->nr_parts
);
1216 flctl_release_dma(flctl
);
1217 pm_runtime_disable(&pdev
->dev
);
1221 static int flctl_remove(struct platform_device
*pdev
)
1223 struct sh_flctl
*flctl
= platform_get_drvdata(pdev
);
1225 flctl_release_dma(flctl
);
1226 nand_release(nand_to_mtd(&flctl
->chip
));
1227 pm_runtime_disable(&pdev
->dev
);
1232 static struct platform_driver flctl_driver
= {
1233 .remove
= flctl_remove
,
1236 .of_match_table
= of_match_ptr(of_flctl_match
),
1240 module_platform_driver_probe(flctl_driver
, flctl_probe
);
1242 MODULE_LICENSE("GPL");
1243 MODULE_AUTHOR("Yoshihiro Shimoda");
1244 MODULE_DESCRIPTION("SuperH FLCTL driver");
1245 MODULE_ALIAS("platform:sh_flctl");