1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li>
5 * Derived from drivers/mtd/nand/toto.c (removed in v2.6.28)
6 * Copyright (c) 2003 Texas Instruments
7 * Copyright (c) 2002 Thomas Gleixner <tgxl@linutronix.de>
9 * Converted to platform driver by Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
10 * Partially stolen from plat_nand.c
13 * This is a device driver for the NAND flash device found on the
17 #include <linux/slab.h>
18 #include <linux/module.h>
19 #include <linux/delay.h>
20 #include <linux/gpio/consumer.h>
21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/nand-gpio.h>
23 #include <linux/mtd/rawnand.h>
24 #include <linux/mtd/partitions.h>
25 #include <linux/of_device.h>
26 #include <linux/platform_device.h>
27 #include <linux/sizes.h>
30 * MTD structure for E3 (Delta)
33 struct nand_controller base
;
34 struct nand_chip nand_chip
;
35 struct gpio_desc
*gpiod_rdy
;
36 struct gpio_desc
*gpiod_nce
;
37 struct gpio_desc
*gpiod_nre
;
38 struct gpio_desc
*gpiod_nwp
;
39 struct gpio_desc
*gpiod_nwe
;
40 struct gpio_desc
*gpiod_ale
;
41 struct gpio_desc
*gpiod_cle
;
42 struct gpio_descs
*data_gpiods
;
46 u8 (*io_read
)(struct gpio_nand
*this);
47 void (*io_write
)(struct gpio_nand
*this, u8 byte
);
50 static void gpio_nand_write_commit(struct gpio_nand
*priv
)
52 gpiod_set_value(priv
->gpiod_nwe
, 1);
54 gpiod_set_value(priv
->gpiod_nwe
, 0);
57 static void gpio_nand_io_write(struct gpio_nand
*priv
, u8 byte
)
59 struct gpio_descs
*data_gpiods
= priv
->data_gpiods
;
60 DECLARE_BITMAP(values
, BITS_PER_TYPE(byte
)) = { byte
, };
62 gpiod_set_raw_array_value(data_gpiods
->ndescs
, data_gpiods
->desc
,
63 data_gpiods
->info
, values
);
65 gpio_nand_write_commit(priv
);
68 static void gpio_nand_dir_output(struct gpio_nand
*priv
, u8 byte
)
70 struct gpio_descs
*data_gpiods
= priv
->data_gpiods
;
71 DECLARE_BITMAP(values
, BITS_PER_TYPE(byte
)) = { byte
, };
74 for (i
= 0; i
< data_gpiods
->ndescs
; i
++)
75 gpiod_direction_output_raw(data_gpiods
->desc
[i
],
78 gpio_nand_write_commit(priv
);
80 priv
->data_in
= false;
83 static u8
gpio_nand_io_read(struct gpio_nand
*priv
)
86 struct gpio_descs
*data_gpiods
= priv
->data_gpiods
;
87 DECLARE_BITMAP(values
, BITS_PER_TYPE(res
)) = { 0, };
89 gpiod_set_value(priv
->gpiod_nre
, 1);
92 gpiod_get_raw_array_value(data_gpiods
->ndescs
, data_gpiods
->desc
,
93 data_gpiods
->info
, values
);
95 gpiod_set_value(priv
->gpiod_nre
, 0);
101 static void gpio_nand_dir_input(struct gpio_nand
*priv
)
103 struct gpio_descs
*data_gpiods
= priv
->data_gpiods
;
106 for (i
= 0; i
< data_gpiods
->ndescs
; i
++)
107 gpiod_direction_input(data_gpiods
->desc
[i
]);
109 priv
->data_in
= true;
112 static void gpio_nand_write_buf(struct gpio_nand
*priv
, const u8
*buf
, int len
)
116 if (len
> 0 && priv
->data_in
)
117 gpio_nand_dir_output(priv
, buf
[i
++]);
120 priv
->io_write(priv
, buf
[i
++]);
123 static void gpio_nand_read_buf(struct gpio_nand
*priv
, u8
*buf
, int len
)
127 if (priv
->data_gpiods
&& !priv
->data_in
)
128 gpio_nand_dir_input(priv
);
130 for (i
= 0; i
< len
; i
++)
131 buf
[i
] = priv
->io_read(priv
);
134 static void gpio_nand_ctrl_cs(struct gpio_nand
*priv
, bool assert)
136 gpiod_set_value(priv
->gpiod_nce
, assert);
139 static int gpio_nand_exec_op(struct nand_chip
*this,
140 const struct nand_operation
*op
, bool check_only
)
142 struct gpio_nand
*priv
= nand_get_controller_data(this);
143 const struct nand_op_instr
*instr
;
149 gpio_nand_ctrl_cs(priv
, 1);
151 for (instr
= op
->instrs
; instr
< op
->instrs
+ op
->ninstrs
; instr
++) {
152 switch (instr
->type
) {
153 case NAND_OP_CMD_INSTR
:
154 gpiod_set_value(priv
->gpiod_cle
, 1);
155 gpio_nand_write_buf(priv
, &instr
->ctx
.cmd
.opcode
, 1);
156 gpiod_set_value(priv
->gpiod_cle
, 0);
159 case NAND_OP_ADDR_INSTR
:
160 gpiod_set_value(priv
->gpiod_ale
, 1);
161 gpio_nand_write_buf(priv
, instr
->ctx
.addr
.addrs
,
162 instr
->ctx
.addr
.naddrs
);
163 gpiod_set_value(priv
->gpiod_ale
, 0);
166 case NAND_OP_DATA_IN_INSTR
:
167 gpio_nand_read_buf(priv
, instr
->ctx
.data
.buf
.in
,
168 instr
->ctx
.data
.len
);
171 case NAND_OP_DATA_OUT_INSTR
:
172 gpio_nand_write_buf(priv
, instr
->ctx
.data
.buf
.out
,
173 instr
->ctx
.data
.len
);
176 case NAND_OP_WAITRDY_INSTR
:
177 ret
= priv
->gpiod_rdy
?
178 nand_gpio_waitrdy(this, priv
->gpiod_rdy
,
179 instr
->ctx
.waitrdy
.timeout_ms
) :
180 nand_soft_waitrdy(this,
181 instr
->ctx
.waitrdy
.timeout_ms
);
189 gpio_nand_ctrl_cs(priv
, 0);
194 static int gpio_nand_setup_interface(struct nand_chip
*this, int csline
,
195 const struct nand_interface_config
*cf
)
197 struct gpio_nand
*priv
= nand_get_controller_data(this);
198 const struct nand_sdr_timings
*sdr
= nand_get_sdr_timings(cf
);
199 struct device
*dev
= &nand_to_mtd(this)->dev
;
204 if (csline
== NAND_DATA_IFACE_CHECK_ONLY
)
207 if (priv
->gpiod_nre
) {
208 priv
->tRP
= DIV_ROUND_UP(sdr
->tRP_min
, 1000);
209 dev_dbg(dev
, "using %u ns read pulse width\n", priv
->tRP
);
212 priv
->tWP
= DIV_ROUND_UP(sdr
->tWP_min
, 1000);
213 dev_dbg(dev
, "using %u ns write pulse width\n", priv
->tWP
);
218 static int gpio_nand_attach_chip(struct nand_chip
*chip
)
220 chip
->ecc
.engine_type
= NAND_ECC_ENGINE_TYPE_SOFT
;
222 if (chip
->ecc
.algo
== NAND_ECC_ALGO_UNKNOWN
)
223 chip
->ecc
.algo
= NAND_ECC_ALGO_HAMMING
;
228 static const struct nand_controller_ops gpio_nand_ops
= {
229 .exec_op
= gpio_nand_exec_op
,
230 .attach_chip
= gpio_nand_attach_chip
,
231 .setup_interface
= gpio_nand_setup_interface
,
235 * Main initialization routine
237 static int gpio_nand_probe(struct platform_device
*pdev
)
239 struct gpio_nand_platdata
*pdata
= dev_get_platdata(&pdev
->dev
);
240 const struct mtd_partition
*partitions
= NULL
;
241 int num_partitions
= 0;
242 struct gpio_nand
*priv
;
243 struct nand_chip
*this;
244 struct mtd_info
*mtd
;
245 int (*probe
)(struct platform_device
*pdev
, struct gpio_nand
*priv
);
249 partitions
= pdata
->parts
;
250 num_partitions
= pdata
->num_parts
;
253 /* Allocate memory for MTD device structure and private data */
254 priv
= devm_kzalloc(&pdev
->dev
, sizeof(struct gpio_nand
),
259 this = &priv
->nand_chip
;
261 mtd
= nand_to_mtd(this);
262 mtd
->dev
.parent
= &pdev
->dev
;
264 nand_set_controller_data(this, priv
);
265 nand_set_flash_node(this, pdev
->dev
.of_node
);
267 priv
->gpiod_rdy
= devm_gpiod_get_optional(&pdev
->dev
, "rdy", GPIOD_IN
);
268 if (IS_ERR(priv
->gpiod_rdy
)) {
269 err
= PTR_ERR(priv
->gpiod_rdy
);
270 dev_warn(&pdev
->dev
, "RDY GPIO request failed (%d)\n", err
);
274 platform_set_drvdata(pdev
, priv
);
276 /* Set chip enabled but write protected */
277 priv
->gpiod_nwp
= devm_gpiod_get_optional(&pdev
->dev
, "nwp",
279 if (IS_ERR(priv
->gpiod_nwp
)) {
280 err
= PTR_ERR(priv
->gpiod_nwp
);
281 dev_err(&pdev
->dev
, "NWP GPIO request failed (%d)\n", err
);
285 priv
->gpiod_nce
= devm_gpiod_get_optional(&pdev
->dev
, "nce",
287 if (IS_ERR(priv
->gpiod_nce
)) {
288 err
= PTR_ERR(priv
->gpiod_nce
);
289 dev_err(&pdev
->dev
, "NCE GPIO request failed (%d)\n", err
);
293 priv
->gpiod_nre
= devm_gpiod_get_optional(&pdev
->dev
, "nre",
295 if (IS_ERR(priv
->gpiod_nre
)) {
296 err
= PTR_ERR(priv
->gpiod_nre
);
297 dev_err(&pdev
->dev
, "NRE GPIO request failed (%d)\n", err
);
301 priv
->gpiod_nwe
= devm_gpiod_get_optional(&pdev
->dev
, "nwe",
303 if (IS_ERR(priv
->gpiod_nwe
)) {
304 err
= PTR_ERR(priv
->gpiod_nwe
);
305 dev_err(&pdev
->dev
, "NWE GPIO request failed (%d)\n", err
);
309 priv
->gpiod_ale
= devm_gpiod_get(&pdev
->dev
, "ale", GPIOD_OUT_LOW
);
310 if (IS_ERR(priv
->gpiod_ale
)) {
311 err
= PTR_ERR(priv
->gpiod_ale
);
312 dev_err(&pdev
->dev
, "ALE GPIO request failed (%d)\n", err
);
316 priv
->gpiod_cle
= devm_gpiod_get(&pdev
->dev
, "cle", GPIOD_OUT_LOW
);
317 if (IS_ERR(priv
->gpiod_cle
)) {
318 err
= PTR_ERR(priv
->gpiod_cle
);
319 dev_err(&pdev
->dev
, "CLE GPIO request failed (%d)\n", err
);
323 /* Request array of data pins, initialize them as input */
324 priv
->data_gpiods
= devm_gpiod_get_array_optional(&pdev
->dev
, "data",
326 if (IS_ERR(priv
->data_gpiods
)) {
327 err
= PTR_ERR(priv
->data_gpiods
);
328 dev_err(&pdev
->dev
, "data GPIO request failed: %d\n", err
);
331 if (priv
->data_gpiods
) {
332 if (!priv
->gpiod_nwe
) {
334 "mandatory NWE pin not provided by platform\n");
338 priv
->io_read
= gpio_nand_io_read
;
339 priv
->io_write
= gpio_nand_io_write
;
340 priv
->data_in
= true;
344 probe
= (void *) pdev
->id_entry
->driver_data
;
346 probe
= of_device_get_match_data(&pdev
->dev
);
348 err
= probe(pdev
, priv
);
352 if (!priv
->io_read
|| !priv
->io_write
) {
353 dev_err(&pdev
->dev
, "incomplete device configuration\n");
357 /* Initialize the NAND controller object embedded in gpio_nand. */
358 priv
->base
.ops
= &gpio_nand_ops
;
359 nand_controller_init(&priv
->base
);
360 this->controller
= &priv
->base
;
363 * FIXME: We should release write protection only after nand_scan() to
364 * be on the safe side but we can't do that until we have a generic way
365 * to assert/deassert WP from the core. Even if the core shouldn't
366 * write things in the nand_scan() path, it should have control on this
367 * pin just in case we ever need to disable write protection during
368 * chip detection/initialization.
370 /* Release write protection */
371 gpiod_set_value(priv
->gpiod_nwp
, 0);
373 /* Scan to find existence of the device */
374 err
= nand_scan(this, 1);
378 /* Register the partitions */
379 err
= mtd_device_register(mtd
, partitions
, num_partitions
);
381 goto err_nand_cleanup
;
394 static int gpio_nand_remove(struct platform_device
*pdev
)
396 struct gpio_nand
*priv
= platform_get_drvdata(pdev
);
397 struct mtd_info
*mtd
= nand_to_mtd(&priv
->nand_chip
);
400 /* Apply write protection */
401 gpiod_set_value(priv
->gpiod_nwp
, 1);
403 /* Unregister device */
404 ret
= mtd_device_unregister(mtd
);
406 nand_cleanup(mtd_to_nand(mtd
));
412 static const struct of_device_id gpio_nand_of_id_table
[] = {
417 MODULE_DEVICE_TABLE(of
, gpio_nand_of_id_table
);
420 static const struct platform_device_id gpio_nand_plat_id_table
[] = {
422 .name
= "ams-delta-nand",
427 MODULE_DEVICE_TABLE(platform
, gpio_nand_plat_id_table
);
429 static struct platform_driver gpio_nand_driver
= {
430 .probe
= gpio_nand_probe
,
431 .remove
= gpio_nand_remove
,
432 .id_table
= gpio_nand_plat_id_table
,
434 .name
= "ams-delta-nand",
435 .of_match_table
= of_match_ptr(gpio_nand_of_id_table
),
439 module_platform_driver(gpio_nand_driver
);
441 MODULE_LICENSE("GPL v2");
442 MODULE_AUTHOR("Jonathan McDowell <noodles@earth.li>");
443 MODULE_DESCRIPTION("Glue layer for NAND flash on Amstrad E3 (Delta)");