1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2016 Sigma Designs
9 #include <linux/iopoll.h>
10 #include <linux/module.h>
11 #include <linux/mtd/rawnand.h>
12 #include <linux/dmaengine.h>
13 #include <linux/dma-mapping.h>
14 #include <linux/platform_device.h>
16 /* Offsets relative to chip->base */
21 /* Offsets relative to reg_base */
22 #define NFC_STATUS 0x00
23 #define NFC_FLASH_CMD 0x04
24 #define NFC_DEVICE_CFG 0x08
25 #define NFC_TIMING1 0x0c
26 #define NFC_TIMING2 0x10
27 #define NFC_XFER_CFG 0x14
28 #define NFC_PKT_0_CFG 0x18
29 #define NFC_PKT_N_CFG 0x1c
30 #define NFC_BB_CFG 0x20
31 #define NFC_ADDR_PAGE 0x24
32 #define NFC_ADDR_OFFSET 0x28
33 #define NFC_XFER_STATUS 0x2c
35 /* NFC_STATUS values */
36 #define CMD_READY BIT(31)
38 /* NFC_FLASH_CMD values */
42 /* NFC_XFER_STATUS values */
43 #define PAGE_IS_EMPTY BIT(16)
45 /* Offsets relative to mem_base */
46 #define METADATA 0x000
47 #define ERROR_REPORT 0x1c0
50 * Error reports are split in two bytes:
51 * byte 0 for the first packet in the page (PKT_0)
52 * byte 1 for other packets in the page (PKT_N, for N > 0)
53 * ERR_COUNT_PKT_N is the max error count over all but the first packet.
55 #define ERR_COUNT_PKT_0(v) (((v) >> 0) & 0x3f)
56 #define ERR_COUNT_PKT_N(v) (((v) >> 8) & 0x3f)
57 #define DECODE_FAIL_PKT_0(v) (((v) & BIT(7)) == 0)
58 #define DECODE_FAIL_PKT_N(v) (((v) & BIT(15)) == 0)
60 /* Offsets relative to pbus_base */
61 #define PBUS_CS_CTRL 0x83c
62 #define PBUS_PAD_MODE 0x8f0
64 /* PBUS_CS_CTRL values */
65 #define PBUS_IORDY BIT(31)
68 * PBUS_PAD_MODE values
69 * In raw mode, the driver communicates directly with the NAND chips.
70 * In NFC mode, the NAND Flash controller manages the communication.
71 * We use NFC mode for read and write; raw mode for everything else.
74 #define MODE_NFC BIT(31)
76 #define METADATA_SIZE 4
78 #define FIELD_ORDER 15
83 struct nand_controller hw
;
84 void __iomem
*reg_base
;
85 void __iomem
*mem_base
;
86 void __iomem
*pbus_base
;
87 struct tango_chip
*chips
[MAX_CS
];
88 struct dma_chan
*chan
;
92 #define to_tango_nfc(ptr) container_of(ptr, struct tango_nfc, hw)
95 struct nand_chip nand_chip
;
105 #define to_tango_chip(ptr) container_of(ptr, struct tango_chip, nand_chip)
107 #define XFER_CFG(cs, page_count, steps, metadata_size) \
108 ((cs) << 24 | (page_count) << 16 | (steps) << 8 | (metadata_size))
110 #define PKT_CFG(size, strength) ((size) << 16 | (strength))
112 #define BB_CFG(bb_offset, bb_size) ((bb_offset) << 16 | (bb_size))
114 #define TIMING(t0, t1, t2, t3) ((t0) << 24 | (t1) << 16 | (t2) << 8 | (t3))
116 static void tango_select_target(struct nand_chip
*chip
, unsigned int cs
)
118 struct tango_nfc
*nfc
= to_tango_nfc(chip
->controller
);
119 struct tango_chip
*tchip
= to_tango_chip(chip
);
121 writel_relaxed(tchip
->timing1
, nfc
->reg_base
+ NFC_TIMING1
);
122 writel_relaxed(tchip
->timing2
, nfc
->reg_base
+ NFC_TIMING2
);
123 writel_relaxed(tchip
->xfer_cfg
, nfc
->reg_base
+ NFC_XFER_CFG
);
124 writel_relaxed(tchip
->pkt_0_cfg
, nfc
->reg_base
+ NFC_PKT_0_CFG
);
125 writel_relaxed(tchip
->pkt_n_cfg
, nfc
->reg_base
+ NFC_PKT_N_CFG
);
126 writel_relaxed(tchip
->bb_cfg
, nfc
->reg_base
+ NFC_BB_CFG
);
129 static int tango_waitrdy(struct nand_chip
*chip
, unsigned int timeout_ms
)
131 struct tango_nfc
*nfc
= to_tango_nfc(chip
->controller
);
134 return readl_relaxed_poll_timeout(nfc
->pbus_base
+ PBUS_CS_CTRL
,
135 status
, status
& PBUS_IORDY
, 20,
139 static int tango_exec_instr(struct nand_chip
*chip
,
140 const struct nand_op_instr
*instr
)
142 struct tango_chip
*tchip
= to_tango_chip(chip
);
145 switch (instr
->type
) {
146 case NAND_OP_CMD_INSTR
:
147 writeb_relaxed(instr
->ctx
.cmd
.opcode
, tchip
->base
+ PBUS_CMD
);
149 case NAND_OP_ADDR_INSTR
:
150 for (i
= 0; i
< instr
->ctx
.addr
.naddrs
; i
++)
151 writeb_relaxed(instr
->ctx
.addr
.addrs
[i
],
152 tchip
->base
+ PBUS_ADDR
);
154 case NAND_OP_DATA_IN_INSTR
:
155 ioread8_rep(tchip
->base
+ PBUS_DATA
, instr
->ctx
.data
.buf
.in
,
156 instr
->ctx
.data
.len
);
158 case NAND_OP_DATA_OUT_INSTR
:
159 iowrite8_rep(tchip
->base
+ PBUS_DATA
, instr
->ctx
.data
.buf
.out
,
160 instr
->ctx
.data
.len
);
162 case NAND_OP_WAITRDY_INSTR
:
163 return tango_waitrdy(chip
,
164 instr
->ctx
.waitrdy
.timeout_ms
);
172 static int tango_exec_op(struct nand_chip
*chip
,
173 const struct nand_operation
*op
,
182 tango_select_target(chip
, op
->cs
);
183 for (i
= 0; i
< op
->ninstrs
; i
++) {
184 ret
= tango_exec_instr(chip
, &op
->instrs
[i
]);
193 * The controller does not check for bitflips in erased pages,
194 * therefore software must check instead.
196 static int check_erased_page(struct nand_chip
*chip
, u8
*buf
)
198 struct mtd_info
*mtd
= nand_to_mtd(chip
);
199 u8
*meta
= chip
->oob_poi
+ BBM_SIZE
;
200 u8
*ecc
= chip
->oob_poi
+ BBM_SIZE
+ METADATA_SIZE
;
201 const int ecc_size
= chip
->ecc
.bytes
;
202 const int pkt_size
= chip
->ecc
.size
;
203 int i
, res
, meta_len
, bitflips
= 0;
205 for (i
= 0; i
< chip
->ecc
.steps
; ++i
) {
206 meta_len
= i
? 0 : METADATA_SIZE
;
207 res
= nand_check_erased_ecc_chunk(buf
, pkt_size
, ecc
, ecc_size
,
211 mtd
->ecc_stats
.failed
++;
213 mtd
->ecc_stats
.corrected
+= res
;
215 bitflips
= max(res
, bitflips
);
223 static int decode_error_report(struct nand_chip
*chip
)
226 struct mtd_info
*mtd
= nand_to_mtd(chip
);
227 struct tango_nfc
*nfc
= to_tango_nfc(chip
->controller
);
229 status
= readl_relaxed(nfc
->reg_base
+ NFC_XFER_STATUS
);
230 if (status
& PAGE_IS_EMPTY
)
233 res
= readl_relaxed(nfc
->mem_base
+ ERROR_REPORT
);
235 if (DECODE_FAIL_PKT_0(res
) || DECODE_FAIL_PKT_N(res
))
238 /* ERR_COUNT_PKT_N is max, not sum, but that's all we have */
239 mtd
->ecc_stats
.corrected
+=
240 ERR_COUNT_PKT_0(res
) + ERR_COUNT_PKT_N(res
);
242 return max(ERR_COUNT_PKT_0(res
), ERR_COUNT_PKT_N(res
));
245 static void tango_dma_callback(void *arg
)
250 static int do_dma(struct tango_nfc
*nfc
, enum dma_data_direction dir
, int cmd
,
251 const void *buf
, int len
, int page
)
253 void __iomem
*addr
= nfc
->reg_base
+ NFC_STATUS
;
254 struct dma_chan
*chan
= nfc
->chan
;
255 struct dma_async_tx_descriptor
*desc
;
256 enum dma_transfer_direction tdir
;
257 struct scatterlist sg
;
258 struct completion tx_done
;
262 sg_init_one(&sg
, buf
, len
);
263 if (dma_map_sg(chan
->device
->dev
, &sg
, 1, dir
) != 1)
266 tdir
= dir
== DMA_TO_DEVICE
? DMA_MEM_TO_DEV
: DMA_DEV_TO_MEM
;
267 desc
= dmaengine_prep_slave_sg(chan
, &sg
, 1, tdir
, DMA_PREP_INTERRUPT
);
271 desc
->callback
= tango_dma_callback
;
272 desc
->callback_param
= &tx_done
;
273 init_completion(&tx_done
);
275 writel_relaxed(MODE_NFC
, nfc
->pbus_base
+ PBUS_PAD_MODE
);
277 writel_relaxed(page
, nfc
->reg_base
+ NFC_ADDR_PAGE
);
278 writel_relaxed(0, nfc
->reg_base
+ NFC_ADDR_OFFSET
);
279 writel_relaxed(cmd
, nfc
->reg_base
+ NFC_FLASH_CMD
);
281 dmaengine_submit(desc
);
282 dma_async_issue_pending(chan
);
284 res
= wait_for_completion_timeout(&tx_done
, HZ
);
286 err
= readl_poll_timeout(addr
, val
, val
& CMD_READY
, 0, 1000);
288 writel_relaxed(MODE_RAW
, nfc
->pbus_base
+ PBUS_PAD_MODE
);
291 dma_unmap_sg(chan
->device
->dev
, &sg
, 1, dir
);
296 static int tango_read_page(struct nand_chip
*chip
, u8
*buf
,
297 int oob_required
, int page
)
299 struct mtd_info
*mtd
= nand_to_mtd(chip
);
300 struct tango_nfc
*nfc
= to_tango_nfc(chip
->controller
);
301 int err
, res
, len
= mtd
->writesize
;
303 tango_select_target(chip
, chip
->cur_cs
);
305 chip
->ecc
.read_oob(chip
, page
);
307 err
= do_dma(nfc
, DMA_FROM_DEVICE
, NFC_READ
, buf
, len
, page
);
311 res
= decode_error_report(chip
);
313 chip
->ecc
.read_oob_raw(chip
, page
);
314 res
= check_erased_page(chip
, buf
);
320 static int tango_write_page(struct nand_chip
*chip
, const u8
*buf
,
321 int oob_required
, int page
)
323 struct mtd_info
*mtd
= nand_to_mtd(chip
);
324 struct tango_nfc
*nfc
= to_tango_nfc(chip
->controller
);
325 const struct nand_sdr_timings
*timings
;
326 int err
, len
= mtd
->writesize
;
329 /* Calling tango_write_oob() would send PAGEPROG twice */
333 tango_select_target(chip
, chip
->cur_cs
);
334 writel_relaxed(0xffffffff, nfc
->mem_base
+ METADATA
);
335 err
= do_dma(nfc
, DMA_TO_DEVICE
, NFC_WRITE
, buf
, len
, page
);
339 timings
= nand_get_sdr_timings(nand_get_interface_config(chip
));
340 err
= tango_waitrdy(chip
, PSEC_TO_MSEC(timings
->tR_max
));
344 err
= nand_status_op(chip
, &status
);
348 return (status
& NAND_STATUS_FAIL
) ? -EIO
: 0;
351 static void aux_read(struct nand_chip
*chip
, u8
**buf
, int len
, int *pos
)
356 /* skip over "len" bytes */
357 nand_change_read_column_op(chip
, *pos
, NULL
, 0, false);
359 struct tango_chip
*tchip
= to_tango_chip(chip
);
361 ioread8_rep(tchip
->base
+ PBUS_DATA
, *buf
, len
);
366 static void aux_write(struct nand_chip
*chip
, const u8
**buf
, int len
, int *pos
)
371 /* skip over "len" bytes */
372 nand_change_write_column_op(chip
, *pos
, NULL
, 0, false);
374 struct tango_chip
*tchip
= to_tango_chip(chip
);
376 iowrite8_rep(tchip
->base
+ PBUS_DATA
, *buf
, len
);
382 * Physical page layout (not drawn to scale)
384 * NB: Bad Block Marker area splits PKT_N in two (N1, N2).
386 * +---+-----------------+-------+-----+-----------+-----+----+-------+
387 * | M | PKT_0 | ECC_0 | ... | N1 | BBM | N2 | ECC_N |
388 * +---+-----------------+-------+-----+-----------+-----+----+-------+
390 * Logical page layout:
392 * +-----+---+-------+-----+-------+
393 * oob = | BBM | M | ECC_0 | ... | ECC_N |
394 * +-----+---+-------+-----+-------+
396 * +-----------------+-----+-----------------+
397 * buf = | PKT_0 | ... | PKT_N |
398 * +-----------------+-----+-----------------+
400 static void raw_read(struct nand_chip
*chip
, u8
*buf
, u8
*oob
)
402 struct mtd_info
*mtd
= nand_to_mtd(chip
);
404 const int page_size
= mtd
->writesize
;
405 const int ecc_size
= chip
->ecc
.bytes
;
406 const int pkt_size
= chip
->ecc
.size
;
407 int pos
= 0; /* position within physical page */
408 int rem
= page_size
; /* bytes remaining until BBM area */
413 aux_read(chip
, &oob
, METADATA_SIZE
, &pos
);
415 while (rem
> pkt_size
) {
416 aux_read(chip
, &buf
, pkt_size
, &pos
);
417 aux_read(chip
, &oob
, ecc_size
, &pos
);
418 rem
= page_size
- pos
;
421 aux_read(chip
, &buf
, rem
, &pos
);
422 aux_read(chip
, &oob_orig
, BBM_SIZE
, &pos
);
423 aux_read(chip
, &buf
, pkt_size
- rem
, &pos
);
424 aux_read(chip
, &oob
, ecc_size
, &pos
);
427 static void raw_write(struct nand_chip
*chip
, const u8
*buf
, const u8
*oob
)
429 struct mtd_info
*mtd
= nand_to_mtd(chip
);
430 const u8
*oob_orig
= oob
;
431 const int page_size
= mtd
->writesize
;
432 const int ecc_size
= chip
->ecc
.bytes
;
433 const int pkt_size
= chip
->ecc
.size
;
434 int pos
= 0; /* position within physical page */
435 int rem
= page_size
; /* bytes remaining until BBM area */
440 aux_write(chip
, &oob
, METADATA_SIZE
, &pos
);
442 while (rem
> pkt_size
) {
443 aux_write(chip
, &buf
, pkt_size
, &pos
);
444 aux_write(chip
, &oob
, ecc_size
, &pos
);
445 rem
= page_size
- pos
;
448 aux_write(chip
, &buf
, rem
, &pos
);
449 aux_write(chip
, &oob_orig
, BBM_SIZE
, &pos
);
450 aux_write(chip
, &buf
, pkt_size
- rem
, &pos
);
451 aux_write(chip
, &oob
, ecc_size
, &pos
);
454 static int tango_read_page_raw(struct nand_chip
*chip
, u8
*buf
,
455 int oob_required
, int page
)
457 tango_select_target(chip
, chip
->cur_cs
);
458 nand_read_page_op(chip
, page
, 0, NULL
, 0);
459 raw_read(chip
, buf
, chip
->oob_poi
);
463 static int tango_write_page_raw(struct nand_chip
*chip
, const u8
*buf
,
464 int oob_required
, int page
)
466 tango_select_target(chip
, chip
->cur_cs
);
467 nand_prog_page_begin_op(chip
, page
, 0, NULL
, 0);
468 raw_write(chip
, buf
, chip
->oob_poi
);
469 return nand_prog_page_end_op(chip
);
472 static int tango_read_oob(struct nand_chip
*chip
, int page
)
474 tango_select_target(chip
, chip
->cur_cs
);
475 nand_read_page_op(chip
, page
, 0, NULL
, 0);
476 raw_read(chip
, NULL
, chip
->oob_poi
);
480 static int tango_write_oob(struct nand_chip
*chip
, int page
)
482 tango_select_target(chip
, chip
->cur_cs
);
483 nand_prog_page_begin_op(chip
, page
, 0, NULL
, 0);
484 raw_write(chip
, NULL
, chip
->oob_poi
);
485 return nand_prog_page_end_op(chip
);
488 static int oob_ecc(struct mtd_info
*mtd
, int idx
, struct mtd_oob_region
*res
)
490 struct nand_chip
*chip
= mtd_to_nand(mtd
);
491 struct nand_ecc_ctrl
*ecc
= &chip
->ecc
;
493 if (idx
>= ecc
->steps
)
496 res
->offset
= BBM_SIZE
+ METADATA_SIZE
+ ecc
->bytes
* idx
;
497 res
->length
= ecc
->bytes
;
502 static int oob_free(struct mtd_info
*mtd
, int idx
, struct mtd_oob_region
*res
)
504 return -ERANGE
; /* no free space in spare area */
507 static const struct mtd_ooblayout_ops tango_nand_ooblayout_ops
= {
512 static u32
to_ticks(int kHz
, int ps
)
514 return DIV_ROUND_UP_ULL((u64
)kHz
* ps
, NSEC_PER_SEC
);
517 static int tango_set_timings(struct nand_chip
*chip
, int csline
,
518 const struct nand_interface_config
*conf
)
520 const struct nand_sdr_timings
*sdr
= nand_get_sdr_timings(conf
);
521 struct tango_nfc
*nfc
= to_tango_nfc(chip
->controller
);
522 struct tango_chip
*tchip
= to_tango_chip(chip
);
523 u32 Trdy
, Textw
, Twc
, Twpw
, Tacc
, Thold
, Trpw
, Textr
;
524 int kHz
= nfc
->freq_kHz
;
529 if (csline
== NAND_DATA_IFACE_CHECK_ONLY
)
532 Trdy
= to_ticks(kHz
, sdr
->tCEA_max
- sdr
->tREA_max
);
533 Textw
= to_ticks(kHz
, sdr
->tWB_max
);
534 Twc
= to_ticks(kHz
, sdr
->tWC_min
);
535 Twpw
= to_ticks(kHz
, sdr
->tWC_min
- sdr
->tWP_min
);
537 Tacc
= to_ticks(kHz
, sdr
->tREA_max
);
538 Thold
= to_ticks(kHz
, sdr
->tREH_min
);
539 Trpw
= to_ticks(kHz
, sdr
->tRC_min
- sdr
->tREH_min
);
540 Textr
= to_ticks(kHz
, sdr
->tRHZ_max
);
542 tchip
->timing1
= TIMING(Trdy
, Textw
, Twc
, Twpw
);
543 tchip
->timing2
= TIMING(Tacc
, Thold
, Trpw
, Textr
);
548 static int tango_attach_chip(struct nand_chip
*chip
)
550 struct nand_ecc_ctrl
*ecc
= &chip
->ecc
;
552 ecc
->engine_type
= NAND_ECC_ENGINE_TYPE_ON_HOST
;
553 ecc
->algo
= NAND_ECC_ALGO_BCH
;
554 ecc
->bytes
= DIV_ROUND_UP(ecc
->strength
* FIELD_ORDER
, BITS_PER_BYTE
);
556 ecc
->read_page_raw
= tango_read_page_raw
;
557 ecc
->write_page_raw
= tango_write_page_raw
;
558 ecc
->read_page
= tango_read_page
;
559 ecc
->write_page
= tango_write_page
;
560 ecc
->read_oob
= tango_read_oob
;
561 ecc
->write_oob
= tango_write_oob
;
566 static const struct nand_controller_ops tango_controller_ops
= {
567 .attach_chip
= tango_attach_chip
,
568 .setup_interface
= tango_set_timings
,
569 .exec_op
= tango_exec_op
,
572 static int chip_init(struct device
*dev
, struct device_node
*np
)
576 struct mtd_info
*mtd
;
577 struct nand_chip
*chip
;
578 struct tango_chip
*tchip
;
579 struct nand_ecc_ctrl
*ecc
;
580 struct tango_nfc
*nfc
= dev_get_drvdata(dev
);
582 tchip
= devm_kzalloc(dev
, sizeof(*tchip
), GFP_KERNEL
);
586 res
= of_property_count_u32_elems(np
, "reg");
591 return -ENOTSUPP
; /* Multi-CS chips are not supported */
593 err
= of_property_read_u32_index(np
, "reg", 0, &cs
);
600 chip
= &tchip
->nand_chip
;
602 mtd
= nand_to_mtd(chip
);
604 chip
->options
= NAND_USES_DMA
|
605 NAND_NO_SUBPAGE_WRITE
|
607 chip
->controller
= &nfc
->hw
;
608 tchip
->base
= nfc
->pbus_base
+ (cs
* 256);
610 nand_set_flash_node(chip
, np
);
611 mtd_set_ooblayout(mtd
, &tango_nand_ooblayout_ops
);
612 mtd
->dev
.parent
= dev
;
614 err
= nand_scan(chip
, 1);
618 tchip
->xfer_cfg
= XFER_CFG(cs
, 1, ecc
->steps
, METADATA_SIZE
);
619 tchip
->pkt_0_cfg
= PKT_CFG(ecc
->size
+ METADATA_SIZE
, ecc
->strength
);
620 tchip
->pkt_n_cfg
= PKT_CFG(ecc
->size
, ecc
->strength
);
621 tchip
->bb_cfg
= BB_CFG(mtd
->writesize
, BBM_SIZE
);
623 err
= mtd_device_register(mtd
, NULL
, 0);
629 nfc
->chips
[cs
] = tchip
;
634 static int tango_nand_remove(struct platform_device
*pdev
)
636 struct tango_nfc
*nfc
= platform_get_drvdata(pdev
);
637 struct nand_chip
*chip
;
640 dma_release_channel(nfc
->chan
);
642 for (cs
= 0; cs
< MAX_CS
; ++cs
) {
643 if (nfc
->chips
[cs
]) {
644 chip
= &nfc
->chips
[cs
]->nand_chip
;
645 ret
= mtd_device_unregister(nand_to_mtd(chip
));
654 static int tango_nand_probe(struct platform_device
*pdev
)
658 struct resource
*res
;
659 struct tango_nfc
*nfc
;
660 struct device_node
*np
;
662 nfc
= devm_kzalloc(&pdev
->dev
, sizeof(*nfc
), GFP_KERNEL
);
666 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
667 nfc
->reg_base
= devm_ioremap_resource(&pdev
->dev
, res
);
668 if (IS_ERR(nfc
->reg_base
))
669 return PTR_ERR(nfc
->reg_base
);
671 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
672 nfc
->mem_base
= devm_ioremap_resource(&pdev
->dev
, res
);
673 if (IS_ERR(nfc
->mem_base
))
674 return PTR_ERR(nfc
->mem_base
);
676 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 2);
677 nfc
->pbus_base
= devm_ioremap_resource(&pdev
->dev
, res
);
678 if (IS_ERR(nfc
->pbus_base
))
679 return PTR_ERR(nfc
->pbus_base
);
681 writel_relaxed(MODE_RAW
, nfc
->pbus_base
+ PBUS_PAD_MODE
);
683 clk
= devm_clk_get(&pdev
->dev
, NULL
);
687 nfc
->chan
= dma_request_chan(&pdev
->dev
, "rxtx");
688 if (IS_ERR(nfc
->chan
))
689 return PTR_ERR(nfc
->chan
);
691 platform_set_drvdata(pdev
, nfc
);
692 nand_controller_init(&nfc
->hw
);
693 nfc
->hw
.ops
= &tango_controller_ops
;
694 nfc
->freq_kHz
= clk_get_rate(clk
) / 1000;
696 for_each_child_of_node(pdev
->dev
.of_node
, np
) {
697 err
= chip_init(&pdev
->dev
, np
);
699 tango_nand_remove(pdev
);
708 static const struct of_device_id tango_nand_ids
[] = {
709 { .compatible
= "sigma,smp8758-nand" },
712 MODULE_DEVICE_TABLE(of
, tango_nand_ids
);
714 static struct platform_driver tango_nand_driver
= {
715 .probe
= tango_nand_probe
,
716 .remove
= tango_nand_remove
,
718 .name
= "tango-nand",
719 .of_match_table
= tango_nand_ids
,
723 module_platform_driver(tango_nand_driver
);
725 MODULE_LICENSE("GPL");
726 MODULE_AUTHOR("Sigma Designs");
727 MODULE_DESCRIPTION("Tango4 NAND Flash controller driver");