2 * Samsung S3C64XX/S5PC1XX OneNAND driver
4 * Copyright © 2008-2010 Samsung Electronics
5 * Kyungmin Park <kyungmin.park@samsung.com>
6 * Marek Szyprowski <m.szyprowski@samsung.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 * S3C64XX and S5PC100: emulate the pseudo BufferRAM
17 #include <linux/module.h>
18 #include <linux/platform_device.h>
19 #include <linux/sched.h>
20 #include <linux/slab.h>
21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/onenand.h>
23 #include <linux/mtd/partitions.h>
24 #include <linux/dma-mapping.h>
25 #include <linux/interrupt.h>
27 #include <asm/mach/flash.h>
28 #include <plat/regs-onenand.h>
39 #define ONENAND_ERASE_STATUS 0x00
40 #define ONENAND_MULTI_ERASE_SET 0x01
41 #define ONENAND_ERASE_START 0x03
42 #define ONENAND_UNLOCK_START 0x08
43 #define ONENAND_UNLOCK_END 0x09
44 #define ONENAND_LOCK_START 0x0A
45 #define ONENAND_LOCK_END 0x0B
46 #define ONENAND_LOCK_TIGHT_START 0x0C
47 #define ONENAND_LOCK_TIGHT_END 0x0D
48 #define ONENAND_UNLOCK_ALL 0x0E
49 #define ONENAND_OTP_ACCESS 0x12
50 #define ONENAND_SPARE_ACCESS_ONLY 0x13
51 #define ONENAND_MAIN_ACCESS_ONLY 0x14
52 #define ONENAND_ERASE_VERIFY 0x15
53 #define ONENAND_MAIN_SPARE_ACCESS 0x16
54 #define ONENAND_PIPELINE_READ 0x4000
61 #define S3C64XX_CMD_MAP_SHIFT 24
62 #define S5PC100_CMD_MAP_SHIFT 26
64 #define S3C6400_FBA_SHIFT 10
65 #define S3C6400_FPA_SHIFT 4
66 #define S3C6400_FSA_SHIFT 2
68 #define S3C6410_FBA_SHIFT 12
69 #define S3C6410_FPA_SHIFT 6
70 #define S3C6410_FSA_SHIFT 4
72 #define S5PC100_FBA_SHIFT 13
73 #define S5PC100_FPA_SHIFT 7
74 #define S5PC100_FSA_SHIFT 5
76 /* S5PC110 specific definitions */
77 #define S5PC110_DMA_SRC_ADDR 0x400
78 #define S5PC110_DMA_SRC_CFG 0x404
79 #define S5PC110_DMA_DST_ADDR 0x408
80 #define S5PC110_DMA_DST_CFG 0x40C
81 #define S5PC110_DMA_TRANS_SIZE 0x414
82 #define S5PC110_DMA_TRANS_CMD 0x418
83 #define S5PC110_DMA_TRANS_STATUS 0x41C
84 #define S5PC110_DMA_TRANS_DIR 0x420
85 #define S5PC110_INTC_DMA_CLR 0x1004
86 #define S5PC110_INTC_ONENAND_CLR 0x1008
87 #define S5PC110_INTC_DMA_MASK 0x1024
88 #define S5PC110_INTC_ONENAND_MASK 0x1028
89 #define S5PC110_INTC_DMA_PEND 0x1044
90 #define S5PC110_INTC_ONENAND_PEND 0x1048
91 #define S5PC110_INTC_DMA_STATUS 0x1064
92 #define S5PC110_INTC_ONENAND_STATUS 0x1068
94 #define S5PC110_INTC_DMA_TD (1 << 24)
95 #define S5PC110_INTC_DMA_TE (1 << 16)
97 #define S5PC110_DMA_CFG_SINGLE (0x0 << 16)
98 #define S5PC110_DMA_CFG_4BURST (0x2 << 16)
99 #define S5PC110_DMA_CFG_8BURST (0x3 << 16)
100 #define S5PC110_DMA_CFG_16BURST (0x4 << 16)
102 #define S5PC110_DMA_CFG_INC (0x0 << 8)
103 #define S5PC110_DMA_CFG_CNT (0x1 << 8)
105 #define S5PC110_DMA_CFG_8BIT (0x0 << 0)
106 #define S5PC110_DMA_CFG_16BIT (0x1 << 0)
107 #define S5PC110_DMA_CFG_32BIT (0x2 << 0)
109 #define S5PC110_DMA_SRC_CFG_READ (S5PC110_DMA_CFG_16BURST | \
110 S5PC110_DMA_CFG_INC | \
111 S5PC110_DMA_CFG_16BIT)
112 #define S5PC110_DMA_DST_CFG_READ (S5PC110_DMA_CFG_16BURST | \
113 S5PC110_DMA_CFG_INC | \
114 S5PC110_DMA_CFG_32BIT)
115 #define S5PC110_DMA_SRC_CFG_WRITE (S5PC110_DMA_CFG_16BURST | \
116 S5PC110_DMA_CFG_INC | \
117 S5PC110_DMA_CFG_32BIT)
118 #define S5PC110_DMA_DST_CFG_WRITE (S5PC110_DMA_CFG_16BURST | \
119 S5PC110_DMA_CFG_INC | \
120 S5PC110_DMA_CFG_16BIT)
122 #define S5PC110_DMA_TRANS_CMD_TDC (0x1 << 18)
123 #define S5PC110_DMA_TRANS_CMD_TEC (0x1 << 16)
124 #define S5PC110_DMA_TRANS_CMD_TR (0x1 << 0)
126 #define S5PC110_DMA_TRANS_STATUS_TD (0x1 << 18)
127 #define S5PC110_DMA_TRANS_STATUS_TB (0x1 << 17)
128 #define S5PC110_DMA_TRANS_STATUS_TE (0x1 << 16)
130 #define S5PC110_DMA_DIR_READ 0x0
131 #define S5PC110_DMA_DIR_WRITE 0x1
134 struct mtd_info
*mtd
;
135 struct platform_device
*pdev
;
138 struct resource
*base_res
;
139 void __iomem
*ahb_addr
;
140 struct resource
*ahb_res
;
142 void __iomem
*page_buf
;
143 void __iomem
*oob_buf
;
144 unsigned int (*mem_addr
)(int fba
, int fpa
, int fsa
);
145 unsigned int (*cmd_map
)(unsigned int type
, unsigned int val
);
146 void __iomem
*dma_addr
;
147 struct resource
*dma_res
;
148 unsigned long phys_base
;
149 struct completion complete
;
150 #ifdef CONFIG_MTD_PARTITIONS
151 struct mtd_partition
*parts
;
155 #define CMD_MAP_00(dev, addr) (dev->cmd_map(MAP_00, ((addr) << 1)))
156 #define CMD_MAP_01(dev, mem_addr) (dev->cmd_map(MAP_01, (mem_addr)))
157 #define CMD_MAP_10(dev, mem_addr) (dev->cmd_map(MAP_10, (mem_addr)))
158 #define CMD_MAP_11(dev, addr) (dev->cmd_map(MAP_11, ((addr) << 2)))
160 static struct s3c_onenand
*onenand
;
162 #ifdef CONFIG_MTD_PARTITIONS
163 static const char *part_probes
[] = { "cmdlinepart", NULL
, };
166 static inline int s3c_read_reg(int offset
)
168 return readl(onenand
->base
+ offset
);
171 static inline void s3c_write_reg(int value
, int offset
)
173 writel(value
, onenand
->base
+ offset
);
176 static inline int s3c_read_cmd(unsigned int cmd
)
178 return readl(onenand
->ahb_addr
+ cmd
);
181 static inline void s3c_write_cmd(int value
, unsigned int cmd
)
183 writel(value
, onenand
->ahb_addr
+ cmd
);
187 static void s3c_dump_reg(void)
191 for (i
= 0; i
< 0x400; i
+= 0x40) {
192 printk(KERN_INFO
"0x%08X: 0x%08x 0x%08x 0x%08x 0x%08x\n",
193 (unsigned int) onenand
->base
+ i
,
194 s3c_read_reg(i
), s3c_read_reg(i
+ 0x10),
195 s3c_read_reg(i
+ 0x20), s3c_read_reg(i
+ 0x30));
200 static unsigned int s3c64xx_cmd_map(unsigned type
, unsigned val
)
202 return (type
<< S3C64XX_CMD_MAP_SHIFT
) | val
;
205 static unsigned int s5pc1xx_cmd_map(unsigned type
, unsigned val
)
207 return (type
<< S5PC100_CMD_MAP_SHIFT
) | val
;
210 static unsigned int s3c6400_mem_addr(int fba
, int fpa
, int fsa
)
212 return (fba
<< S3C6400_FBA_SHIFT
) | (fpa
<< S3C6400_FPA_SHIFT
) |
213 (fsa
<< S3C6400_FSA_SHIFT
);
216 static unsigned int s3c6410_mem_addr(int fba
, int fpa
, int fsa
)
218 return (fba
<< S3C6410_FBA_SHIFT
) | (fpa
<< S3C6410_FPA_SHIFT
) |
219 (fsa
<< S3C6410_FSA_SHIFT
);
222 static unsigned int s5pc100_mem_addr(int fba
, int fpa
, int fsa
)
224 return (fba
<< S5PC100_FBA_SHIFT
) | (fpa
<< S5PC100_FPA_SHIFT
) |
225 (fsa
<< S5PC100_FSA_SHIFT
);
228 static void s3c_onenand_reset(void)
230 unsigned long timeout
= 0x10000;
233 s3c_write_reg(ONENAND_MEM_RESET_COLD
, MEM_RESET_OFFSET
);
234 while (1 && timeout
--) {
235 stat
= s3c_read_reg(INT_ERR_STAT_OFFSET
);
239 stat
= s3c_read_reg(INT_ERR_STAT_OFFSET
);
240 s3c_write_reg(stat
, INT_ERR_ACK_OFFSET
);
242 /* Clear interrupt */
243 s3c_write_reg(0x0, INT_ERR_ACK_OFFSET
);
244 /* Clear the ECC status */
245 s3c_write_reg(0x0, ECC_ERR_STAT_OFFSET
);
248 static unsigned short s3c_onenand_readw(void __iomem
*addr
)
250 struct onenand_chip
*this = onenand
->mtd
->priv
;
251 struct device
*dev
= &onenand
->pdev
->dev
;
252 int reg
= addr
- this->base
;
253 int word_addr
= reg
>> 1;
256 /* It's used for probing time */
258 case ONENAND_REG_MANUFACTURER_ID
:
259 return s3c_read_reg(MANUFACT_ID_OFFSET
);
260 case ONENAND_REG_DEVICE_ID
:
261 return s3c_read_reg(DEVICE_ID_OFFSET
);
262 case ONENAND_REG_VERSION_ID
:
263 return s3c_read_reg(FLASH_VER_ID_OFFSET
);
264 case ONENAND_REG_DATA_BUFFER_SIZE
:
265 return s3c_read_reg(DATA_BUF_SIZE_OFFSET
);
266 case ONENAND_REG_TECHNOLOGY
:
267 return s3c_read_reg(TECH_OFFSET
);
268 case ONENAND_REG_SYS_CFG1
:
269 return s3c_read_reg(MEM_CFG_OFFSET
);
271 /* Used at unlock all status */
272 case ONENAND_REG_CTRL_STATUS
:
275 case ONENAND_REG_WP_STATUS
:
276 return ONENAND_WP_US
;
282 /* BootRAM access control */
283 if ((unsigned int) addr
< ONENAND_DATARAM
&& onenand
->bootram_command
) {
285 return s3c_read_reg(MANUFACT_ID_OFFSET
);
287 return s3c_read_reg(DEVICE_ID_OFFSET
);
289 return s3c_read_reg(FLASH_VER_ID_OFFSET
);
292 value
= s3c_read_cmd(CMD_MAP_11(onenand
, word_addr
)) & 0xffff;
293 dev_info(dev
, "%s: Illegal access at reg 0x%x, value 0x%x\n", __func__
,
298 static void s3c_onenand_writew(unsigned short value
, void __iomem
*addr
)
300 struct onenand_chip
*this = onenand
->mtd
->priv
;
301 struct device
*dev
= &onenand
->pdev
->dev
;
302 unsigned int reg
= addr
- this->base
;
303 unsigned int word_addr
= reg
>> 1;
305 /* It's used for probing time */
307 case ONENAND_REG_SYS_CFG1
:
308 s3c_write_reg(value
, MEM_CFG_OFFSET
);
311 case ONENAND_REG_START_ADDRESS1
:
312 case ONENAND_REG_START_ADDRESS2
:
315 /* Lock/lock-tight/unlock/unlock_all */
316 case ONENAND_REG_START_BLOCK_ADDRESS
:
323 /* BootRAM access control */
324 if ((unsigned int)addr
< ONENAND_DATARAM
) {
325 if (value
== ONENAND_CMD_READID
) {
326 onenand
->bootram_command
= 1;
329 if (value
== ONENAND_CMD_RESET
) {
330 s3c_write_reg(ONENAND_MEM_RESET_COLD
, MEM_RESET_OFFSET
);
331 onenand
->bootram_command
= 0;
336 dev_info(dev
, "%s: Illegal access at reg 0x%x, value 0x%x\n", __func__
,
339 s3c_write_cmd(value
, CMD_MAP_11(onenand
, word_addr
));
342 static int s3c_onenand_wait(struct mtd_info
*mtd
, int state
)
344 struct device
*dev
= &onenand
->pdev
->dev
;
345 unsigned int flags
= INT_ACT
;
346 unsigned int stat
, ecc
;
347 unsigned long timeout
;
351 flags
|= BLK_RW_CMP
| LOAD_CMP
;
354 flags
|= BLK_RW_CMP
| PGM_CMP
;
357 flags
|= BLK_RW_CMP
| ERS_CMP
;
366 /* The 20 msec is enough */
367 timeout
= jiffies
+ msecs_to_jiffies(20);
368 while (time_before(jiffies
, timeout
)) {
369 stat
= s3c_read_reg(INT_ERR_STAT_OFFSET
);
373 if (state
!= FL_READING
)
376 /* To get correct interrupt status in timeout case */
377 stat
= s3c_read_reg(INT_ERR_STAT_OFFSET
);
378 s3c_write_reg(stat
, INT_ERR_ACK_OFFSET
);
381 * In the Spec. it checks the controller status first
382 * However if you get the correct information in case of
383 * power off recovery (POR) test, it should read ECC status first
385 if (stat
& LOAD_CMP
) {
386 ecc
= s3c_read_reg(ECC_ERR_STAT_OFFSET
);
387 if (ecc
& ONENAND_ECC_4BIT_UNCORRECTABLE
) {
388 dev_info(dev
, "%s: ECC error = 0x%04x\n", __func__
,
390 mtd
->ecc_stats
.failed
++;
395 if (stat
& (LOCKED_BLK
| ERS_FAIL
| PGM_FAIL
| LD_FAIL_ECC_ERR
)) {
396 dev_info(dev
, "%s: controller error = 0x%04x\n", __func__
,
398 if (stat
& LOCKED_BLK
)
399 dev_info(dev
, "%s: it's locked error = 0x%04x\n",
408 static int s3c_onenand_command(struct mtd_info
*mtd
, int cmd
, loff_t addr
,
411 struct onenand_chip
*this = mtd
->priv
;
413 int fba
, fpa
, fsa
= 0;
414 unsigned int mem_addr
, cmd_map_01
, cmd_map_10
;
415 int i
, mcount
, scount
;
418 fba
= (int) (addr
>> this->erase_shift
);
419 fpa
= (int) (addr
>> this->page_shift
);
420 fpa
&= this->page_mask
;
422 mem_addr
= onenand
->mem_addr(fba
, fpa
, fsa
);
423 cmd_map_01
= CMD_MAP_01(onenand
, mem_addr
);
424 cmd_map_10
= CMD_MAP_10(onenand
, mem_addr
);
427 case ONENAND_CMD_READ
:
428 case ONENAND_CMD_READOOB
:
429 case ONENAND_CMD_BUFFERRAM
:
430 ONENAND_SET_NEXT_BUFFERRAM(this);
435 index
= ONENAND_CURRENT_BUFFERRAM(this);
438 * Emulate Two BufferRAMs and access with 4 bytes pointer
440 m
= (unsigned int *) onenand
->page_buf
;
441 s
= (unsigned int *) onenand
->oob_buf
;
444 m
+= (this->writesize
>> 2);
445 s
+= (mtd
->oobsize
>> 2);
448 mcount
= mtd
->writesize
>> 2;
449 scount
= mtd
->oobsize
>> 2;
452 case ONENAND_CMD_READ
:
454 for (i
= 0; i
< mcount
; i
++)
455 *m
++ = s3c_read_cmd(cmd_map_01
);
458 case ONENAND_CMD_READOOB
:
459 s3c_write_reg(TSRF
, TRANS_SPARE_OFFSET
);
461 for (i
= 0; i
< mcount
; i
++)
462 *m
++ = s3c_read_cmd(cmd_map_01
);
465 for (i
= 0; i
< scount
; i
++)
466 *s
++ = s3c_read_cmd(cmd_map_01
);
468 s3c_write_reg(0, TRANS_SPARE_OFFSET
);
471 case ONENAND_CMD_PROG
:
473 for (i
= 0; i
< mcount
; i
++)
474 s3c_write_cmd(*m
++, cmd_map_01
);
477 case ONENAND_CMD_PROGOOB
:
478 s3c_write_reg(TSRF
, TRANS_SPARE_OFFSET
);
480 /* Main - dummy write */
481 for (i
= 0; i
< mcount
; i
++)
482 s3c_write_cmd(0xffffffff, cmd_map_01
);
485 for (i
= 0; i
< scount
; i
++)
486 s3c_write_cmd(*s
++, cmd_map_01
);
488 s3c_write_reg(0, TRANS_SPARE_OFFSET
);
491 case ONENAND_CMD_UNLOCK_ALL
:
492 s3c_write_cmd(ONENAND_UNLOCK_ALL
, cmd_map_10
);
495 case ONENAND_CMD_ERASE
:
496 s3c_write_cmd(ONENAND_ERASE_START
, cmd_map_10
);
506 static unsigned char *s3c_get_bufferram(struct mtd_info
*mtd
, int area
)
508 struct onenand_chip
*this = mtd
->priv
;
509 int index
= ONENAND_CURRENT_BUFFERRAM(this);
512 if (area
== ONENAND_DATARAM
) {
513 p
= (unsigned char *) onenand
->page_buf
;
515 p
+= this->writesize
;
517 p
= (unsigned char *) onenand
->oob_buf
;
525 static int onenand_read_bufferram(struct mtd_info
*mtd
, int area
,
526 unsigned char *buffer
, int offset
,
531 p
= s3c_get_bufferram(mtd
, area
);
532 memcpy(buffer
, p
+ offset
, count
);
536 static int onenand_write_bufferram(struct mtd_info
*mtd
, int area
,
537 const unsigned char *buffer
, int offset
,
542 p
= s3c_get_bufferram(mtd
, area
);
543 memcpy(p
+ offset
, buffer
, count
);
547 static int (*s5pc110_dma_ops
)(void *dst
, void *src
, size_t count
, int direction
);
549 static int s5pc110_dma_poll(void *dst
, void *src
, size_t count
, int direction
)
551 void __iomem
*base
= onenand
->dma_addr
;
553 unsigned long timeout
;
555 writel(src
, base
+ S5PC110_DMA_SRC_ADDR
);
556 writel(dst
, base
+ S5PC110_DMA_DST_ADDR
);
558 if (direction
== S5PC110_DMA_DIR_READ
) {
559 writel(S5PC110_DMA_SRC_CFG_READ
, base
+ S5PC110_DMA_SRC_CFG
);
560 writel(S5PC110_DMA_DST_CFG_READ
, base
+ S5PC110_DMA_DST_CFG
);
562 writel(S5PC110_DMA_SRC_CFG_WRITE
, base
+ S5PC110_DMA_SRC_CFG
);
563 writel(S5PC110_DMA_DST_CFG_WRITE
, base
+ S5PC110_DMA_DST_CFG
);
566 writel(count
, base
+ S5PC110_DMA_TRANS_SIZE
);
567 writel(direction
, base
+ S5PC110_DMA_TRANS_DIR
);
569 writel(S5PC110_DMA_TRANS_CMD_TR
, base
+ S5PC110_DMA_TRANS_CMD
);
572 * There's no exact timeout values at Spec.
573 * In real case it takes under 1 msec.
574 * So 20 msecs are enough.
576 timeout
= jiffies
+ msecs_to_jiffies(20);
579 status
= readl(base
+ S5PC110_DMA_TRANS_STATUS
);
580 if (status
& S5PC110_DMA_TRANS_STATUS_TE
) {
581 writel(S5PC110_DMA_TRANS_CMD_TEC
,
582 base
+ S5PC110_DMA_TRANS_CMD
);
585 } while (!(status
& S5PC110_DMA_TRANS_STATUS_TD
) &&
586 time_before(jiffies
, timeout
));
588 writel(S5PC110_DMA_TRANS_CMD_TDC
, base
+ S5PC110_DMA_TRANS_CMD
);
593 static irqreturn_t
s5pc110_onenand_irq(int irq
, void *data
)
595 void __iomem
*base
= onenand
->dma_addr
;
598 status
= readl(base
+ S5PC110_INTC_DMA_STATUS
);
600 if (likely(status
& S5PC110_INTC_DMA_TD
))
601 cmd
= S5PC110_DMA_TRANS_CMD_TDC
;
603 if (unlikely(status
& S5PC110_INTC_DMA_TE
))
604 cmd
= S5PC110_DMA_TRANS_CMD_TEC
;
606 writel(cmd
, base
+ S5PC110_DMA_TRANS_CMD
);
607 writel(status
, base
+ S5PC110_INTC_DMA_CLR
);
609 if (!onenand
->complete
.done
)
610 complete(&onenand
->complete
);
615 static int s5pc110_dma_irq(void *dst
, void *src
, size_t count
, int direction
)
617 void __iomem
*base
= onenand
->dma_addr
;
620 status
= readl(base
+ S5PC110_INTC_DMA_MASK
);
622 status
&= ~(S5PC110_INTC_DMA_TD
| S5PC110_INTC_DMA_TE
);
623 writel(status
, base
+ S5PC110_INTC_DMA_MASK
);
626 writel(src
, base
+ S5PC110_DMA_SRC_ADDR
);
627 writel(dst
, base
+ S5PC110_DMA_DST_ADDR
);
629 if (direction
== S5PC110_DMA_DIR_READ
) {
630 writel(S5PC110_DMA_SRC_CFG_READ
, base
+ S5PC110_DMA_SRC_CFG
);
631 writel(S5PC110_DMA_DST_CFG_READ
, base
+ S5PC110_DMA_DST_CFG
);
633 writel(S5PC110_DMA_SRC_CFG_WRITE
, base
+ S5PC110_DMA_SRC_CFG
);
634 writel(S5PC110_DMA_DST_CFG_WRITE
, base
+ S5PC110_DMA_DST_CFG
);
637 writel(count
, base
+ S5PC110_DMA_TRANS_SIZE
);
638 writel(direction
, base
+ S5PC110_DMA_TRANS_DIR
);
640 writel(S5PC110_DMA_TRANS_CMD_TR
, base
+ S5PC110_DMA_TRANS_CMD
);
642 wait_for_completion_timeout(&onenand
->complete
, msecs_to_jiffies(20));
647 static int s5pc110_read_bufferram(struct mtd_info
*mtd
, int area
,
648 unsigned char *buffer
, int offset
, size_t count
)
650 struct onenand_chip
*this = mtd
->priv
;
652 void *buf
= (void *) buffer
;
653 dma_addr_t dma_src
, dma_dst
;
654 int err
, ofs
, page_dma
= 0;
655 struct device
*dev
= &onenand
->pdev
->dev
;
657 p
= this->base
+ area
;
658 if (ONENAND_CURRENT_BUFFERRAM(this)) {
659 if (area
== ONENAND_DATARAM
)
660 p
+= this->writesize
;
665 if (offset
& 3 || (size_t) buf
& 3 ||
666 !onenand
->dma_addr
|| count
!= mtd
->writesize
)
669 /* Handle vmalloc address */
670 if (buf
>= high_memory
) {
673 if (((size_t) buf
& PAGE_MASK
) !=
674 ((size_t) (buf
+ count
- 1) & PAGE_MASK
))
676 page
= vmalloc_to_page(buf
);
681 ofs
= ((size_t) buf
& ~PAGE_MASK
);
685 dma_src
= onenand
->phys_base
+ (p
- this->base
);
686 dma_dst
= dma_map_page(dev
, page
, ofs
, count
, DMA_FROM_DEVICE
);
689 dma_src
= onenand
->phys_base
+ (p
- this->base
);
690 dma_dst
= dma_map_single(dev
, buf
, count
, DMA_FROM_DEVICE
);
692 if (dma_mapping_error(dev
, dma_dst
)) {
693 dev_err(dev
, "Couldn't map a %d byte buffer for DMA\n", count
);
696 err
= s5pc110_dma_ops((void *) dma_dst
, (void *) dma_src
,
697 count
, S5PC110_DMA_DIR_READ
);
700 dma_unmap_page(dev
, dma_dst
, count
, DMA_FROM_DEVICE
);
702 dma_unmap_single(dev
, dma_dst
, count
, DMA_FROM_DEVICE
);
708 if (count
!= mtd
->writesize
) {
709 /* Copy the bufferram to memory to prevent unaligned access */
710 memcpy(this->page_buf
, p
, mtd
->writesize
);
711 p
= this->page_buf
+ offset
;
714 memcpy(buffer
, p
, count
);
719 static int s5pc110_chip_probe(struct mtd_info
*mtd
)
721 /* Now just return 0 */
725 static int s3c_onenand_bbt_wait(struct mtd_info
*mtd
, int state
)
727 unsigned int flags
= INT_ACT
| LOAD_CMP
;
729 unsigned long timeout
;
731 /* The 20 msec is enough */
732 timeout
= jiffies
+ msecs_to_jiffies(20);
733 while (time_before(jiffies
, timeout
)) {
734 stat
= s3c_read_reg(INT_ERR_STAT_OFFSET
);
738 /* To get correct interrupt status in timeout case */
739 stat
= s3c_read_reg(INT_ERR_STAT_OFFSET
);
740 s3c_write_reg(stat
, INT_ERR_ACK_OFFSET
);
742 if (stat
& LD_FAIL_ECC_ERR
) {
744 return ONENAND_BBT_READ_ERROR
;
747 if (stat
& LOAD_CMP
) {
748 int ecc
= s3c_read_reg(ECC_ERR_STAT_OFFSET
);
749 if (ecc
& ONENAND_ECC_4BIT_UNCORRECTABLE
) {
751 return ONENAND_BBT_READ_ERROR
;
758 static void s3c_onenand_check_lock_status(struct mtd_info
*mtd
)
760 struct onenand_chip
*this = mtd
->priv
;
761 struct device
*dev
= &onenand
->pdev
->dev
;
762 unsigned int block
, end
;
765 end
= this->chipsize
>> this->erase_shift
;
767 for (block
= 0; block
< end
; block
++) {
768 unsigned int mem_addr
= onenand
->mem_addr(block
, 0, 0);
769 tmp
= s3c_read_cmd(CMD_MAP_01(onenand
, mem_addr
));
771 if (s3c_read_reg(INT_ERR_STAT_OFFSET
) & LOCKED_BLK
) {
772 dev_err(dev
, "block %d is write-protected!\n", block
);
773 s3c_write_reg(LOCKED_BLK
, INT_ERR_ACK_OFFSET
);
778 static void s3c_onenand_do_lock_cmd(struct mtd_info
*mtd
, loff_t ofs
,
781 struct onenand_chip
*this = mtd
->priv
;
782 int start
, end
, start_mem_addr
, end_mem_addr
;
784 start
= ofs
>> this->erase_shift
;
785 start_mem_addr
= onenand
->mem_addr(start
, 0, 0);
786 end
= start
+ (len
>> this->erase_shift
) - 1;
787 end_mem_addr
= onenand
->mem_addr(end
, 0, 0);
789 if (cmd
== ONENAND_CMD_LOCK
) {
790 s3c_write_cmd(ONENAND_LOCK_START
, CMD_MAP_10(onenand
,
792 s3c_write_cmd(ONENAND_LOCK_END
, CMD_MAP_10(onenand
,
795 s3c_write_cmd(ONENAND_UNLOCK_START
, CMD_MAP_10(onenand
,
797 s3c_write_cmd(ONENAND_UNLOCK_END
, CMD_MAP_10(onenand
,
801 this->wait(mtd
, FL_LOCKING
);
804 static void s3c_unlock_all(struct mtd_info
*mtd
)
806 struct onenand_chip
*this = mtd
->priv
;
808 size_t len
= this->chipsize
;
810 if (this->options
& ONENAND_HAS_UNLOCK_ALL
) {
811 /* Write unlock command */
812 this->command(mtd
, ONENAND_CMD_UNLOCK_ALL
, 0, 0);
814 /* No need to check return value */
815 this->wait(mtd
, FL_LOCKING
);
817 /* Workaround for all block unlock in DDP */
818 if (!ONENAND_IS_DDP(this)) {
819 s3c_onenand_check_lock_status(mtd
);
823 /* All blocks on another chip */
824 ofs
= this->chipsize
>> 1;
825 len
= this->chipsize
>> 1;
828 s3c_onenand_do_lock_cmd(mtd
, ofs
, len
, ONENAND_CMD_UNLOCK
);
830 s3c_onenand_check_lock_status(mtd
);
833 static void s3c_onenand_setup(struct mtd_info
*mtd
)
835 struct onenand_chip
*this = mtd
->priv
;
839 if (onenand
->type
== TYPE_S3C6400
) {
840 onenand
->mem_addr
= s3c6400_mem_addr
;
841 onenand
->cmd_map
= s3c64xx_cmd_map
;
842 } else if (onenand
->type
== TYPE_S3C6410
) {
843 onenand
->mem_addr
= s3c6410_mem_addr
;
844 onenand
->cmd_map
= s3c64xx_cmd_map
;
845 } else if (onenand
->type
== TYPE_S5PC100
) {
846 onenand
->mem_addr
= s5pc100_mem_addr
;
847 onenand
->cmd_map
= s5pc1xx_cmd_map
;
848 } else if (onenand
->type
== TYPE_S5PC110
) {
849 /* Use generic onenand functions */
850 this->read_bufferram
= s5pc110_read_bufferram
;
851 this->chip_probe
= s5pc110_chip_probe
;
857 this->read_word
= s3c_onenand_readw
;
858 this->write_word
= s3c_onenand_writew
;
860 this->wait
= s3c_onenand_wait
;
861 this->bbt_wait
= s3c_onenand_bbt_wait
;
862 this->unlock_all
= s3c_unlock_all
;
863 this->command
= s3c_onenand_command
;
865 this->read_bufferram
= onenand_read_bufferram
;
866 this->write_bufferram
= onenand_write_bufferram
;
869 static int s3c_onenand_probe(struct platform_device
*pdev
)
871 struct onenand_platform_data
*pdata
;
872 struct onenand_chip
*this;
873 struct mtd_info
*mtd
;
877 pdata
= pdev
->dev
.platform_data
;
878 /* No need to check pdata. the platform data is optional */
880 size
= sizeof(struct mtd_info
) + sizeof(struct onenand_chip
);
881 mtd
= kzalloc(size
, GFP_KERNEL
);
883 dev_err(&pdev
->dev
, "failed to allocate memory\n");
887 onenand
= kzalloc(sizeof(struct s3c_onenand
), GFP_KERNEL
);
893 this = (struct onenand_chip
*) &mtd
[1];
895 mtd
->dev
.parent
= &pdev
->dev
;
896 mtd
->owner
= THIS_MODULE
;
897 onenand
->pdev
= pdev
;
898 onenand
->type
= platform_get_device_id(pdev
)->driver_data
;
900 s3c_onenand_setup(mtd
);
902 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
904 dev_err(&pdev
->dev
, "no memory resource defined\n");
906 goto ahb_resource_failed
;
909 onenand
->base_res
= request_mem_region(r
->start
, resource_size(r
),
911 if (!onenand
->base_res
) {
912 dev_err(&pdev
->dev
, "failed to request memory resource\n");
914 goto resource_failed
;
917 onenand
->base
= ioremap(r
->start
, resource_size(r
));
918 if (!onenand
->base
) {
919 dev_err(&pdev
->dev
, "failed to map memory resource\n");
923 /* Set onenand_chip also */
924 this->base
= onenand
->base
;
926 /* Use runtime badblock check */
927 this->options
|= ONENAND_SKIP_UNLOCK_CHECK
;
929 if (onenand
->type
!= TYPE_S5PC110
) {
930 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
932 dev_err(&pdev
->dev
, "no buffer memory resource defined\n");
934 goto ahb_resource_failed
;
937 onenand
->ahb_res
= request_mem_region(r
->start
, resource_size(r
),
939 if (!onenand
->ahb_res
) {
940 dev_err(&pdev
->dev
, "failed to request buffer memory resource\n");
942 goto ahb_resource_failed
;
945 onenand
->ahb_addr
= ioremap(r
->start
, resource_size(r
));
946 if (!onenand
->ahb_addr
) {
947 dev_err(&pdev
->dev
, "failed to map buffer memory resource\n");
949 goto ahb_ioremap_failed
;
952 /* Allocate 4KiB BufferRAM */
953 onenand
->page_buf
= kzalloc(SZ_4K
, GFP_KERNEL
);
954 if (!onenand
->page_buf
) {
959 /* Allocate 128 SpareRAM */
960 onenand
->oob_buf
= kzalloc(128, GFP_KERNEL
);
961 if (!onenand
->oob_buf
) {
966 /* S3C doesn't handle subpage write */
967 mtd
->subpage_sft
= 0;
968 this->subpagesize
= mtd
->writesize
;
970 } else { /* S5PC110 */
971 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
973 dev_err(&pdev
->dev
, "no dma memory resource defined\n");
975 goto dma_resource_failed
;
978 onenand
->dma_res
= request_mem_region(r
->start
, resource_size(r
),
980 if (!onenand
->dma_res
) {
981 dev_err(&pdev
->dev
, "failed to request dma memory resource\n");
983 goto dma_resource_failed
;
986 onenand
->dma_addr
= ioremap(r
->start
, resource_size(r
));
987 if (!onenand
->dma_addr
) {
988 dev_err(&pdev
->dev
, "failed to map dma memory resource\n");
990 goto dma_ioremap_failed
;
993 onenand
->phys_base
= onenand
->base_res
->start
;
995 s5pc110_dma_ops
= s5pc110_dma_poll
;
996 /* Interrupt support */
997 r
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
999 init_completion(&onenand
->complete
);
1000 s5pc110_dma_ops
= s5pc110_dma_irq
;
1001 err
= request_irq(r
->start
, s5pc110_onenand_irq
,
1002 IRQF_SHARED
, "onenand", &onenand
);
1004 dev_err(&pdev
->dev
, "failed to get irq\n");
1010 if (onenand_scan(mtd
, 1)) {
1015 if (onenand
->type
!= TYPE_S5PC110
) {
1016 /* S3C doesn't handle subpage write */
1017 mtd
->subpage_sft
= 0;
1018 this->subpagesize
= mtd
->writesize
;
1021 if (s3c_read_reg(MEM_CFG_OFFSET
) & ONENAND_SYS_CFG1_SYNC_READ
)
1022 dev_info(&onenand
->pdev
->dev
, "OneNAND Sync. Burst Read enabled\n");
1024 #ifdef CONFIG_MTD_PARTITIONS
1025 err
= parse_mtd_partitions(mtd
, part_probes
, &onenand
->parts
, 0);
1027 add_mtd_partitions(mtd
, onenand
->parts
, err
);
1028 else if (err
<= 0 && pdata
&& pdata
->parts
)
1029 add_mtd_partitions(mtd
, pdata
->parts
, pdata
->nr_parts
);
1032 err
= add_mtd_device(mtd
);
1034 platform_set_drvdata(pdev
, mtd
);
1039 if (onenand
->dma_addr
)
1040 iounmap(onenand
->dma_addr
);
1042 if (onenand
->dma_res
)
1043 release_mem_region(onenand
->dma_res
->start
,
1044 resource_size(onenand
->dma_res
));
1045 kfree(onenand
->oob_buf
);
1047 kfree(onenand
->page_buf
);
1049 if (onenand
->ahb_addr
)
1050 iounmap(onenand
->ahb_addr
);
1052 if (onenand
->ahb_res
)
1053 release_mem_region(onenand
->ahb_res
->start
,
1054 resource_size(onenand
->ahb_res
));
1055 dma_resource_failed
:
1056 ahb_resource_failed
:
1057 iounmap(onenand
->base
);
1059 if (onenand
->base_res
)
1060 release_mem_region(onenand
->base_res
->start
,
1061 resource_size(onenand
->base_res
));
1069 static int __devexit
s3c_onenand_remove(struct platform_device
*pdev
)
1071 struct mtd_info
*mtd
= platform_get_drvdata(pdev
);
1073 onenand_release(mtd
);
1074 if (onenand
->ahb_addr
)
1075 iounmap(onenand
->ahb_addr
);
1076 if (onenand
->ahb_res
)
1077 release_mem_region(onenand
->ahb_res
->start
,
1078 resource_size(onenand
->ahb_res
));
1079 if (onenand
->dma_addr
)
1080 iounmap(onenand
->dma_addr
);
1081 if (onenand
->dma_res
)
1082 release_mem_region(onenand
->dma_res
->start
,
1083 resource_size(onenand
->dma_res
));
1085 iounmap(onenand
->base
);
1086 release_mem_region(onenand
->base_res
->start
,
1087 resource_size(onenand
->base_res
));
1089 platform_set_drvdata(pdev
, NULL
);
1090 kfree(onenand
->oob_buf
);
1091 kfree(onenand
->page_buf
);
1097 static int s3c_pm_ops_suspend(struct device
*dev
)
1099 struct platform_device
*pdev
= to_platform_device(dev
);
1100 struct mtd_info
*mtd
= platform_get_drvdata(pdev
);
1101 struct onenand_chip
*this = mtd
->priv
;
1103 this->wait(mtd
, FL_PM_SUSPENDED
);
1107 static int s3c_pm_ops_resume(struct device
*dev
)
1109 struct platform_device
*pdev
= to_platform_device(dev
);
1110 struct mtd_info
*mtd
= platform_get_drvdata(pdev
);
1111 struct onenand_chip
*this = mtd
->priv
;
1113 this->unlock_all(mtd
);
1117 static const struct dev_pm_ops s3c_pm_ops
= {
1118 .suspend
= s3c_pm_ops_suspend
,
1119 .resume
= s3c_pm_ops_resume
,
1122 static struct platform_device_id s3c_onenand_driver_ids
[] = {
1124 .name
= "s3c6400-onenand",
1125 .driver_data
= TYPE_S3C6400
,
1127 .name
= "s3c6410-onenand",
1128 .driver_data
= TYPE_S3C6410
,
1130 .name
= "s5pc100-onenand",
1131 .driver_data
= TYPE_S5PC100
,
1133 .name
= "s5pc110-onenand",
1134 .driver_data
= TYPE_S5PC110
,
1137 MODULE_DEVICE_TABLE(platform
, s3c_onenand_driver_ids
);
1139 static struct platform_driver s3c_onenand_driver
= {
1141 .name
= "samsung-onenand",
1144 .id_table
= s3c_onenand_driver_ids
,
1145 .probe
= s3c_onenand_probe
,
1146 .remove
= __devexit_p(s3c_onenand_remove
),
1149 static int __init
s3c_onenand_init(void)
1151 return platform_driver_register(&s3c_onenand_driver
);
1154 static void __exit
s3c_onenand_exit(void)
1156 platform_driver_unregister(&s3c_onenand_driver
);
1159 module_init(s3c_onenand_init
);
1160 module_exit(s3c_onenand_exit
);
1162 MODULE_LICENSE("GPL");
1163 MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
1164 MODULE_DESCRIPTION("Samsung OneNAND controller support");