1 // SPDX-License-Identifier: GPL-2.0
3 * Ingenic JZ47xx NAND driver
5 * Copyright (c) 2015 Imagination Technologies
6 * Author: Alex Smith <alex.smith@imgtec.com>
9 #include <linux/delay.h>
10 #include <linux/init.h>
12 #include <linux/list.h>
13 #include <linux/module.h>
15 #include <linux/of_address.h>
16 #include <linux/of_device.h>
17 #include <linux/gpio/consumer.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
20 #include <linux/mtd/mtd.h>
21 #include <linux/mtd/rawnand.h>
22 #include <linux/mtd/partitions.h>
24 #include <linux/jz4780-nemc.h>
26 #include "ingenic_ecc.h"
28 #define DRV_NAME "ingenic-nand"
31 unsigned long data_offset
;
32 unsigned long addr_offset
;
33 unsigned long cmd_offset
;
34 const struct mtd_ooblayout_ops
*oob_layout
;
37 struct ingenic_nand_cs
{
44 struct ingenic_ecc
*ecc
;
45 const struct jz_soc_info
*soc_info
;
46 struct nand_controller controller
;
47 unsigned int num_banks
;
48 struct list_head chips
;
49 struct ingenic_nand_cs cs
[];
53 struct nand_chip chip
;
54 struct list_head chip_list
;
56 struct gpio_desc
*busy_gpio
;
57 struct gpio_desc
*wp_gpio
;
58 unsigned int reading
: 1;
61 static inline struct ingenic_nand
*to_ingenic_nand(struct mtd_info
*mtd
)
63 return container_of(mtd_to_nand(mtd
), struct ingenic_nand
, chip
);
66 static inline struct ingenic_nfc
*to_ingenic_nfc(struct nand_controller
*ctrl
)
68 return container_of(ctrl
, struct ingenic_nfc
, controller
);
71 static int qi_lb60_ooblayout_ecc(struct mtd_info
*mtd
, int section
,
72 struct mtd_oob_region
*oobregion
)
74 struct nand_chip
*chip
= mtd_to_nand(mtd
);
75 struct nand_ecc_ctrl
*ecc
= &chip
->ecc
;
77 if (section
|| !ecc
->total
)
80 oobregion
->length
= ecc
->total
;
81 oobregion
->offset
= 12;
86 static int qi_lb60_ooblayout_free(struct mtd_info
*mtd
, int section
,
87 struct mtd_oob_region
*oobregion
)
89 struct nand_chip
*chip
= mtd_to_nand(mtd
);
90 struct nand_ecc_ctrl
*ecc
= &chip
->ecc
;
95 oobregion
->length
= mtd
->oobsize
- ecc
->total
- 12;
96 oobregion
->offset
= 12 + ecc
->total
;
101 static const struct mtd_ooblayout_ops qi_lb60_ooblayout_ops
= {
102 .ecc
= qi_lb60_ooblayout_ecc
,
103 .free
= qi_lb60_ooblayout_free
,
106 static int jz4725b_ooblayout_ecc(struct mtd_info
*mtd
, int section
,
107 struct mtd_oob_region
*oobregion
)
109 struct nand_chip
*chip
= mtd_to_nand(mtd
);
110 struct nand_ecc_ctrl
*ecc
= &chip
->ecc
;
112 if (section
|| !ecc
->total
)
115 oobregion
->length
= ecc
->total
;
116 oobregion
->offset
= 3;
121 static int jz4725b_ooblayout_free(struct mtd_info
*mtd
, int section
,
122 struct mtd_oob_region
*oobregion
)
124 struct nand_chip
*chip
= mtd_to_nand(mtd
);
125 struct nand_ecc_ctrl
*ecc
= &chip
->ecc
;
130 oobregion
->length
= mtd
->oobsize
- ecc
->total
- 3;
131 oobregion
->offset
= 3 + ecc
->total
;
136 static const struct mtd_ooblayout_ops jz4725b_ooblayout_ops
= {
137 .ecc
= jz4725b_ooblayout_ecc
,
138 .free
= jz4725b_ooblayout_free
,
141 static void ingenic_nand_ecc_hwctl(struct nand_chip
*chip
, int mode
)
143 struct ingenic_nand
*nand
= to_ingenic_nand(nand_to_mtd(chip
));
145 nand
->reading
= (mode
== NAND_ECC_READ
);
148 static int ingenic_nand_ecc_calculate(struct nand_chip
*chip
, const u8
*dat
,
151 struct ingenic_nand
*nand
= to_ingenic_nand(nand_to_mtd(chip
));
152 struct ingenic_nfc
*nfc
= to_ingenic_nfc(nand
->chip
.controller
);
153 struct ingenic_ecc_params params
;
156 * Don't need to generate the ECC when reading, the ECC engine does it
157 * for us as part of decoding/correction.
162 params
.size
= nand
->chip
.ecc
.size
;
163 params
.bytes
= nand
->chip
.ecc
.bytes
;
164 params
.strength
= nand
->chip
.ecc
.strength
;
166 return ingenic_ecc_calculate(nfc
->ecc
, ¶ms
, dat
, ecc_code
);
169 static int ingenic_nand_ecc_correct(struct nand_chip
*chip
, u8
*dat
,
170 u8
*read_ecc
, u8
*calc_ecc
)
172 struct ingenic_nand
*nand
= to_ingenic_nand(nand_to_mtd(chip
));
173 struct ingenic_nfc
*nfc
= to_ingenic_nfc(nand
->chip
.controller
);
174 struct ingenic_ecc_params params
;
176 params
.size
= nand
->chip
.ecc
.size
;
177 params
.bytes
= nand
->chip
.ecc
.bytes
;
178 params
.strength
= nand
->chip
.ecc
.strength
;
180 return ingenic_ecc_correct(nfc
->ecc
, ¶ms
, dat
, read_ecc
);
183 static int ingenic_nand_attach_chip(struct nand_chip
*chip
)
185 struct mtd_info
*mtd
= nand_to_mtd(chip
);
186 struct ingenic_nfc
*nfc
= to_ingenic_nfc(chip
->controller
);
189 if (chip
->ecc
.strength
== 4) {
190 /* JZ4740 uses 9 bytes of ECC to correct maximum 4 errors */
193 chip
->ecc
.bytes
= fls((1 + 8) * chip
->ecc
.size
) *
194 (chip
->ecc
.strength
/ 8);
197 switch (chip
->ecc
.engine_type
) {
198 case NAND_ECC_ENGINE_TYPE_ON_HOST
:
200 dev_err(nfc
->dev
, "HW ECC selected, but ECC controller not found\n");
204 chip
->ecc
.hwctl
= ingenic_nand_ecc_hwctl
;
205 chip
->ecc
.calculate
= ingenic_nand_ecc_calculate
;
206 chip
->ecc
.correct
= ingenic_nand_ecc_correct
;
208 case NAND_ECC_ENGINE_TYPE_SOFT
:
209 dev_info(nfc
->dev
, "using %s (strength %d, size %d, bytes %d)\n",
210 (nfc
->ecc
) ? "hardware ECC" : "software ECC",
211 chip
->ecc
.strength
, chip
->ecc
.size
, chip
->ecc
.bytes
);
213 case NAND_ECC_ENGINE_TYPE_NONE
:
214 dev_info(nfc
->dev
, "not using ECC\n");
217 dev_err(nfc
->dev
, "ECC mode %d not supported\n",
218 chip
->ecc
.engine_type
);
222 /* The NAND core will generate the ECC layout for SW ECC */
223 if (chip
->ecc
.engine_type
!= NAND_ECC_ENGINE_TYPE_ON_HOST
)
226 /* Generate ECC layout. ECC codes are right aligned in the OOB area. */
227 eccbytes
= mtd
->writesize
/ chip
->ecc
.size
* chip
->ecc
.bytes
;
229 if (eccbytes
> mtd
->oobsize
- 2) {
231 "invalid ECC config: required %d ECC bytes, but only %d are available",
232 eccbytes
, mtd
->oobsize
- 2);
237 * The generic layout for BBT markers will most likely overlap with our
238 * ECC bytes in the OOB, so move the BBT markers outside the OOB area.
240 if (chip
->bbt_options
& NAND_BBT_USE_FLASH
)
241 chip
->bbt_options
|= NAND_BBT_NO_OOB
;
243 /* For legacy reasons we use a different layout on the qi,lb60 board. */
244 if (of_machine_is_compatible("qi,lb60"))
245 mtd_set_ooblayout(mtd
, &qi_lb60_ooblayout_ops
);
246 else if (nfc
->soc_info
->oob_layout
)
247 mtd_set_ooblayout(mtd
, nfc
->soc_info
->oob_layout
);
249 mtd_set_ooblayout(mtd
, nand_get_large_page_ooblayout());
254 static int ingenic_nand_exec_instr(struct nand_chip
*chip
,
255 struct ingenic_nand_cs
*cs
,
256 const struct nand_op_instr
*instr
)
258 struct ingenic_nand
*nand
= to_ingenic_nand(nand_to_mtd(chip
));
259 struct ingenic_nfc
*nfc
= to_ingenic_nfc(chip
->controller
);
262 switch (instr
->type
) {
263 case NAND_OP_CMD_INSTR
:
264 writeb(instr
->ctx
.cmd
.opcode
,
265 cs
->base
+ nfc
->soc_info
->cmd_offset
);
267 case NAND_OP_ADDR_INSTR
:
268 for (i
= 0; i
< instr
->ctx
.addr
.naddrs
; i
++)
269 writeb(instr
->ctx
.addr
.addrs
[i
],
270 cs
->base
+ nfc
->soc_info
->addr_offset
);
272 case NAND_OP_DATA_IN_INSTR
:
273 if (instr
->ctx
.data
.force_8bit
||
274 !(chip
->options
& NAND_BUSWIDTH_16
))
275 ioread8_rep(cs
->base
+ nfc
->soc_info
->data_offset
,
276 instr
->ctx
.data
.buf
.in
,
277 instr
->ctx
.data
.len
);
279 ioread16_rep(cs
->base
+ nfc
->soc_info
->data_offset
,
280 instr
->ctx
.data
.buf
.in
,
281 instr
->ctx
.data
.len
);
283 case NAND_OP_DATA_OUT_INSTR
:
284 if (instr
->ctx
.data
.force_8bit
||
285 !(chip
->options
& NAND_BUSWIDTH_16
))
286 iowrite8_rep(cs
->base
+ nfc
->soc_info
->data_offset
,
287 instr
->ctx
.data
.buf
.out
,
288 instr
->ctx
.data
.len
);
290 iowrite16_rep(cs
->base
+ nfc
->soc_info
->data_offset
,
291 instr
->ctx
.data
.buf
.out
,
292 instr
->ctx
.data
.len
);
294 case NAND_OP_WAITRDY_INSTR
:
295 if (!nand
->busy_gpio
)
296 return nand_soft_waitrdy(chip
,
297 instr
->ctx
.waitrdy
.timeout_ms
);
299 return nand_gpio_waitrdy(chip
, nand
->busy_gpio
,
300 instr
->ctx
.waitrdy
.timeout_ms
);
308 static int ingenic_nand_exec_op(struct nand_chip
*chip
,
309 const struct nand_operation
*op
,
312 struct ingenic_nand
*nand
= to_ingenic_nand(nand_to_mtd(chip
));
313 struct ingenic_nfc
*nfc
= to_ingenic_nfc(nand
->chip
.controller
);
314 struct ingenic_nand_cs
*cs
;
321 cs
= &nfc
->cs
[op
->cs
];
322 jz4780_nemc_assert(nfc
->dev
, cs
->bank
, true);
323 for (i
= 0; i
< op
->ninstrs
; i
++) {
324 ret
= ingenic_nand_exec_instr(chip
, cs
, &op
->instrs
[i
]);
328 if (op
->instrs
[i
].delay_ns
)
329 ndelay(op
->instrs
[i
].delay_ns
);
331 jz4780_nemc_assert(nfc
->dev
, cs
->bank
, false);
336 static const struct nand_controller_ops ingenic_nand_controller_ops
= {
337 .attach_chip
= ingenic_nand_attach_chip
,
338 .exec_op
= ingenic_nand_exec_op
,
341 static int ingenic_nand_init_chip(struct platform_device
*pdev
,
342 struct ingenic_nfc
*nfc
,
343 struct device_node
*np
,
346 struct device
*dev
= &pdev
->dev
;
347 struct ingenic_nand
*nand
;
348 struct ingenic_nand_cs
*cs
;
349 struct nand_chip
*chip
;
350 struct mtd_info
*mtd
;
354 cs
= &nfc
->cs
[chipnr
];
356 reg
= of_get_property(np
, "reg", NULL
);
360 cs
->bank
= be32_to_cpu(*reg
);
362 jz4780_nemc_set_type(nfc
->dev
, cs
->bank
, JZ4780_NEMC_BANK_NAND
);
364 cs
->base
= devm_platform_ioremap_resource(pdev
, chipnr
);
365 if (IS_ERR(cs
->base
))
366 return PTR_ERR(cs
->base
);
368 nand
= devm_kzalloc(dev
, sizeof(*nand
), GFP_KERNEL
);
372 nand
->busy_gpio
= devm_gpiod_get_optional(dev
, "rb", GPIOD_IN
);
374 if (IS_ERR(nand
->busy_gpio
)) {
375 ret
= PTR_ERR(nand
->busy_gpio
);
376 dev_err(dev
, "failed to request busy GPIO: %d\n", ret
);
381 * The rb-gpios semantics was undocumented and qi,lb60 (along with
382 * the ingenic driver) got it wrong. The active state encodes the
383 * NAND ready state, which is high level. Since there's no signal
384 * inverter on this board, it should be active-high. Let's fix that
385 * here for older DTs so we can re-use the generic nand_gpio_waitrdy()
386 * helper, and be consistent with what other drivers do.
388 if (of_machine_is_compatible("qi,lb60") &&
389 gpiod_is_active_low(nand
->busy_gpio
))
390 gpiod_toggle_active_low(nand
->busy_gpio
);
392 nand
->wp_gpio
= devm_gpiod_get_optional(dev
, "wp", GPIOD_OUT_LOW
);
394 if (IS_ERR(nand
->wp_gpio
)) {
395 ret
= PTR_ERR(nand
->wp_gpio
);
396 dev_err(dev
, "failed to request WP GPIO: %d\n", ret
);
401 mtd
= nand_to_mtd(chip
);
402 mtd
->name
= devm_kasprintf(dev
, GFP_KERNEL
, "%s.%d", dev_name(dev
),
406 mtd
->dev
.parent
= dev
;
408 chip
->options
= NAND_NO_SUBPAGE_WRITE
;
409 chip
->ecc
.engine_type
= NAND_ECC_ENGINE_TYPE_ON_HOST
;
410 chip
->controller
= &nfc
->controller
;
411 nand_set_flash_node(chip
, np
);
413 chip
->controller
->ops
= &ingenic_nand_controller_ops
;
414 ret
= nand_scan(chip
, 1);
418 ret
= mtd_device_register(mtd
, NULL
, 0);
424 list_add_tail(&nand
->chip_list
, &nfc
->chips
);
429 static void ingenic_nand_cleanup_chips(struct ingenic_nfc
*nfc
)
431 struct ingenic_nand
*ingenic_chip
;
432 struct nand_chip
*chip
;
435 while (!list_empty(&nfc
->chips
)) {
436 ingenic_chip
= list_first_entry(&nfc
->chips
,
437 struct ingenic_nand
, chip_list
);
438 chip
= &ingenic_chip
->chip
;
439 ret
= mtd_device_unregister(nand_to_mtd(chip
));
442 list_del(&ingenic_chip
->chip_list
);
446 static int ingenic_nand_init_chips(struct ingenic_nfc
*nfc
,
447 struct platform_device
*pdev
)
449 struct device
*dev
= &pdev
->dev
;
450 struct device_node
*np
;
453 int num_chips
= of_get_child_count(dev
->of_node
);
455 if (num_chips
> nfc
->num_banks
) {
456 dev_err(dev
, "found %d chips but only %d banks\n",
457 num_chips
, nfc
->num_banks
);
461 for_each_child_of_node(dev
->of_node
, np
) {
462 ret
= ingenic_nand_init_chip(pdev
, nfc
, np
, i
);
464 ingenic_nand_cleanup_chips(nfc
);
475 static int ingenic_nand_probe(struct platform_device
*pdev
)
477 struct device
*dev
= &pdev
->dev
;
478 unsigned int num_banks
;
479 struct ingenic_nfc
*nfc
;
482 num_banks
= jz4780_nemc_num_banks(dev
);
483 if (num_banks
== 0) {
484 dev_err(dev
, "no banks found\n");
488 nfc
= devm_kzalloc(dev
, struct_size(nfc
, cs
, num_banks
), GFP_KERNEL
);
492 nfc
->soc_info
= device_get_match_data(dev
);
497 * Check for ECC HW before we call nand_scan_ident, to prevent us from
498 * having to call it again if the ECC driver returns -EPROBE_DEFER.
500 nfc
->ecc
= of_ingenic_ecc_get(dev
->of_node
);
501 if (IS_ERR(nfc
->ecc
))
502 return PTR_ERR(nfc
->ecc
);
505 nfc
->num_banks
= num_banks
;
507 nand_controller_init(&nfc
->controller
);
508 INIT_LIST_HEAD(&nfc
->chips
);
510 ret
= ingenic_nand_init_chips(nfc
, pdev
);
513 ingenic_ecc_release(nfc
->ecc
);
517 platform_set_drvdata(pdev
, nfc
);
521 static int ingenic_nand_remove(struct platform_device
*pdev
)
523 struct ingenic_nfc
*nfc
= platform_get_drvdata(pdev
);
526 ingenic_ecc_release(nfc
->ecc
);
528 ingenic_nand_cleanup_chips(nfc
);
533 static const struct jz_soc_info jz4740_soc_info
= {
534 .data_offset
= 0x00000000,
535 .cmd_offset
= 0x00008000,
536 .addr_offset
= 0x00010000,
539 static const struct jz_soc_info jz4725b_soc_info
= {
540 .data_offset
= 0x00000000,
541 .cmd_offset
= 0x00008000,
542 .addr_offset
= 0x00010000,
543 .oob_layout
= &jz4725b_ooblayout_ops
,
546 static const struct jz_soc_info jz4780_soc_info
= {
547 .data_offset
= 0x00000000,
548 .cmd_offset
= 0x00400000,
549 .addr_offset
= 0x00800000,
552 static const struct of_device_id ingenic_nand_dt_match
[] = {
553 { .compatible
= "ingenic,jz4740-nand", .data
= &jz4740_soc_info
},
554 { .compatible
= "ingenic,jz4725b-nand", .data
= &jz4725b_soc_info
},
555 { .compatible
= "ingenic,jz4780-nand", .data
= &jz4780_soc_info
},
558 MODULE_DEVICE_TABLE(of
, ingenic_nand_dt_match
);
560 static struct platform_driver ingenic_nand_driver
= {
561 .probe
= ingenic_nand_probe
,
562 .remove
= ingenic_nand_remove
,
565 .of_match_table
= of_match_ptr(ingenic_nand_dt_match
),
568 module_platform_driver(ingenic_nand_driver
);
570 MODULE_AUTHOR("Alex Smith <alex@alex-smith.me.uk>");
571 MODULE_AUTHOR("Harvey Hunt <harveyhuntnexus@gmail.com>");
572 MODULE_DESCRIPTION("Ingenic JZ47xx NAND driver");
573 MODULE_LICENSE("GPL v2");