1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2024 AIROHA Inc
8 #include <linux/bitfield.h>
10 #include <linux/delay.h>
11 #include <linux/device.h>
12 #include <linux/dma-mapping.h>
13 #include <linux/errno.h>
14 #include <linux/limits.h>
15 #include <linux/math.h>
16 #include <linux/minmax.h>
17 #include <linux/module.h>
18 #include <linux/mutex.h>
19 #include <linux/platform_device.h>
20 #include <linux/property.h>
21 #include <linux/regmap.h>
22 #include <linux/sizes.h>
23 #include <linux/spi/spi.h>
24 #include <linux/spi/spi-mem.h>
25 #include <linux/types.h>
26 #include <asm/unaligned.h>
29 #define REG_SPI_CTRL_BASE 0x1FA10000
31 #define REG_SPI_CTRL_READ_MODE 0x0000
32 #define REG_SPI_CTRL_READ_IDLE_EN 0x0004
33 #define REG_SPI_CTRL_SIDLY 0x0008
34 #define REG_SPI_CTRL_CSHEXT 0x000c
35 #define REG_SPI_CTRL_CSLEXT 0x0010
37 #define REG_SPI_CTRL_MTX_MODE_TOG 0x0014
38 #define SPI_CTRL_MTX_MODE_TOG GENMASK(3, 0)
40 #define REG_SPI_CTRL_RDCTL_FSM 0x0018
41 #define SPI_CTRL_RDCTL_FSM GENMASK(3, 0)
43 #define REG_SPI_CTRL_MACMUX_SEL 0x001c
45 #define REG_SPI_CTRL_MANUAL_EN 0x0020
46 #define SPI_CTRL_MANUAL_EN BIT(0)
48 #define REG_SPI_CTRL_OPFIFO_EMPTY 0x0024
49 #define SPI_CTRL_OPFIFO_EMPTY BIT(0)
51 #define REG_SPI_CTRL_OPFIFO_WDATA 0x0028
52 #define SPI_CTRL_OPFIFO_LEN GENMASK(8, 0)
53 #define SPI_CTRL_OPFIFO_OP GENMASK(13, 9)
55 #define REG_SPI_CTRL_OPFIFO_FULL 0x002c
56 #define SPI_CTRL_OPFIFO_FULL BIT(0)
58 #define REG_SPI_CTRL_OPFIFO_WR 0x0030
59 #define SPI_CTRL_OPFIFO_WR BIT(0)
61 #define REG_SPI_CTRL_DFIFO_FULL 0x0034
62 #define SPI_CTRL_DFIFO_FULL BIT(0)
64 #define REG_SPI_CTRL_DFIFO_WDATA 0x0038
65 #define SPI_CTRL_DFIFO_WDATA GENMASK(7, 0)
67 #define REG_SPI_CTRL_DFIFO_EMPTY 0x003c
68 #define SPI_CTRL_DFIFO_EMPTY BIT(0)
70 #define REG_SPI_CTRL_DFIFO_RD 0x0040
71 #define SPI_CTRL_DFIFO_RD BIT(0)
73 #define REG_SPI_CTRL_DFIFO_RDATA 0x0044
74 #define SPI_CTRL_DFIFO_RDATA GENMASK(7, 0)
76 #define REG_SPI_CTRL_DUMMY 0x0080
77 #define SPI_CTRL_CTRL_DUMMY GENMASK(3, 0)
79 #define REG_SPI_CTRL_PROBE_SEL 0x0088
80 #define REG_SPI_CTRL_INTERRUPT 0x0090
81 #define REG_SPI_CTRL_INTERRUPT_EN 0x0094
82 #define REG_SPI_CTRL_SI_CK_SEL 0x009c
83 #define REG_SPI_CTRL_SW_CFGNANDADDR_VAL 0x010c
84 #define REG_SPI_CTRL_SW_CFGNANDADDR_EN 0x0110
85 #define REG_SPI_CTRL_SFC_STRAP 0x0114
87 #define REG_SPI_CTRL_NFI2SPI_EN 0x0130
88 #define SPI_CTRL_NFI2SPI_EN BIT(0)
91 #define REG_SPI_NFI_CNFG 0x0000
92 #define SPI_NFI_DMA_MODE BIT(0)
93 #define SPI_NFI_READ_MODE BIT(1)
94 #define SPI_NFI_DMA_BURST_EN BIT(2)
95 #define SPI_NFI_HW_ECC_EN BIT(8)
96 #define SPI_NFI_AUTO_FDM_EN BIT(9)
97 #define SPI_NFI_OPMODE GENMASK(14, 12)
99 #define REG_SPI_NFI_PAGEFMT 0x0004
100 #define SPI_NFI_PAGE_SIZE GENMASK(1, 0)
101 #define SPI_NFI_SPARE_SIZE GENMASK(5, 4)
103 #define REG_SPI_NFI_CON 0x0008
104 #define SPI_NFI_FIFO_FLUSH BIT(0)
105 #define SPI_NFI_RST BIT(1)
106 #define SPI_NFI_RD_TRIG BIT(8)
107 #define SPI_NFI_WR_TRIG BIT(9)
108 #define SPI_NFI_SEC_NUM GENMASK(15, 12)
110 #define REG_SPI_NFI_INTR_EN 0x0010
111 #define SPI_NFI_RD_DONE_EN BIT(0)
112 #define SPI_NFI_WR_DONE_EN BIT(1)
113 #define SPI_NFI_RST_DONE_EN BIT(2)
114 #define SPI_NFI_ERASE_DONE_EN BIT(3)
115 #define SPI_NFI_BUSY_RETURN_EN BIT(4)
116 #define SPI_NFI_ACCESS_LOCK_EN BIT(5)
117 #define SPI_NFI_AHB_DONE_EN BIT(6)
118 #define SPI_NFI_ALL_IRQ_EN \
119 (SPI_NFI_RD_DONE_EN | SPI_NFI_WR_DONE_EN | \
120 SPI_NFI_RST_DONE_EN | SPI_NFI_ERASE_DONE_EN | \
121 SPI_NFI_BUSY_RETURN_EN | SPI_NFI_ACCESS_LOCK_EN | \
124 #define REG_SPI_NFI_INTR 0x0014
125 #define SPI_NFI_AHB_DONE BIT(6)
127 #define REG_SPI_NFI_CMD 0x0020
129 #define REG_SPI_NFI_ADDR_NOB 0x0030
130 #define SPI_NFI_ROW_ADDR_NOB GENMASK(6, 4)
132 #define REG_SPI_NFI_STA 0x0060
133 #define REG_SPI_NFI_FIFOSTA 0x0064
134 #define REG_SPI_NFI_STRADDR 0x0080
135 #define REG_SPI_NFI_FDM0L 0x00a0
136 #define REG_SPI_NFI_FDM0M 0x00a4
137 #define REG_SPI_NFI_FDM7L 0x00d8
138 #define REG_SPI_NFI_FDM7M 0x00dc
139 #define REG_SPI_NFI_FIFODATA0 0x0190
140 #define REG_SPI_NFI_FIFODATA1 0x0194
141 #define REG_SPI_NFI_FIFODATA2 0x0198
142 #define REG_SPI_NFI_FIFODATA3 0x019c
143 #define REG_SPI_NFI_MASTERSTA 0x0224
145 #define REG_SPI_NFI_SECCUS_SIZE 0x022c
146 #define SPI_NFI_CUS_SEC_SIZE GENMASK(12, 0)
147 #define SPI_NFI_CUS_SEC_SIZE_EN BIT(16)
149 #define REG_SPI_NFI_RD_CTL2 0x0510
150 #define REG_SPI_NFI_RD_CTL3 0x0514
152 #define REG_SPI_NFI_PG_CTL1 0x0524
153 #define SPI_NFI_PG_LOAD_CMD GENMASK(15, 8)
155 #define REG_SPI_NFI_PG_CTL2 0x0528
156 #define REG_SPI_NFI_NOR_PROG_ADDR 0x052c
157 #define REG_SPI_NFI_NOR_RD_ADDR 0x0534
159 #define REG_SPI_NFI_SNF_MISC_CTL 0x0538
160 #define SPI_NFI_DATA_READ_WR_MODE GENMASK(18, 16)
162 #define REG_SPI_NFI_SNF_MISC_CTL2 0x053c
163 #define SPI_NFI_READ_DATA_BYTE_NUM GENMASK(12, 0)
164 #define SPI_NFI_PROG_LOAD_BYTE_NUM GENMASK(28, 16)
166 #define REG_SPI_NFI_SNF_STA_CTL1 0x0550
167 #define SPI_NFI_READ_FROM_CACHE_DONE BIT(25)
168 #define SPI_NFI_LOAD_TO_CACHE_DONE BIT(26)
170 #define REG_SPI_NFI_SNF_STA_CTL2 0x0554
172 #define REG_SPI_NFI_SNF_NFI_CNFG 0x055c
173 #define SPI_NFI_SPI_MODE BIT(0)
175 /* SPI NAND Protocol OP */
176 #define SPI_NAND_OP_GET_FEATURE 0x0f
177 #define SPI_NAND_OP_SET_FEATURE 0x1f
178 #define SPI_NAND_OP_PAGE_READ 0x13
179 #define SPI_NAND_OP_READ_FROM_CACHE_SINGLE 0x03
180 #define SPI_NAND_OP_READ_FROM_CACHE_SINGLE_FAST 0x0b
181 #define SPI_NAND_OP_READ_FROM_CACHE_DUAL 0x3b
182 #define SPI_NAND_OP_READ_FROM_CACHE_QUAD 0x6b
183 #define SPI_NAND_OP_WRITE_ENABLE 0x06
184 #define SPI_NAND_OP_WRITE_DISABLE 0x04
185 #define SPI_NAND_OP_PROGRAM_LOAD_SINGLE 0x02
186 #define SPI_NAND_OP_PROGRAM_LOAD_QUAD 0x32
187 #define SPI_NAND_OP_PROGRAM_LOAD_RAMDOM_SINGLE 0x84
188 #define SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD 0x34
189 #define SPI_NAND_OP_PROGRAM_EXECUTE 0x10
190 #define SPI_NAND_OP_READ_ID 0x9f
191 #define SPI_NAND_OP_BLOCK_ERASE 0xd8
192 #define SPI_NAND_OP_RESET 0xff
193 #define SPI_NAND_OP_DIE_SELECT 0xc2
195 #define SPI_NAND_CACHE_SIZE (SZ_4K + SZ_256)
196 #define SPI_MAX_TRANSFER_SIZE 511
198 enum airoha_snand_mode {
204 enum airoha_snand_cs {
209 struct airoha_snand_dev {
216 bool data_need_update;
219 struct airoha_snand_ctrl {
221 struct regmap *regmap_ctrl;
222 struct regmap *regmap_nfi;
233 static int airoha_snand_set_fifo_op(struct airoha_snand_ctrl *as_ctrl,
234 u8 op_cmd, int op_len)
239 err = regmap_write(as_ctrl->regmap_ctrl, REG_SPI_CTRL_OPFIFO_WDATA,
240 FIELD_PREP(SPI_CTRL_OPFIFO_LEN, op_len) |
241 FIELD_PREP(SPI_CTRL_OPFIFO_OP, op_cmd));
245 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl,
246 REG_SPI_CTRL_OPFIFO_FULL,
247 val, !(val & SPI_CTRL_OPFIFO_FULL),
248 0, 250 * USEC_PER_MSEC);
252 err = regmap_write(as_ctrl->regmap_ctrl, REG_SPI_CTRL_OPFIFO_WR,
257 return regmap_read_poll_timeout(as_ctrl->regmap_ctrl,
258 REG_SPI_CTRL_OPFIFO_EMPTY,
259 val, (val & SPI_CTRL_OPFIFO_EMPTY),
260 0, 250 * USEC_PER_MSEC);
263 static int airoha_snand_set_cs(struct airoha_snand_ctrl *as_ctrl, u8 cs)
265 return airoha_snand_set_fifo_op(as_ctrl, cs, sizeof(cs));
268 static int airoha_snand_write_data_to_fifo(struct airoha_snand_ctrl *as_ctrl,
269 const u8 *data, int len)
273 for (i = 0; i < len; i++) {
277 /* 1. Wait until dfifo is not full */
278 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl,
279 REG_SPI_CTRL_DFIFO_FULL, val,
280 !(val & SPI_CTRL_DFIFO_FULL),
281 0, 250 * USEC_PER_MSEC);
285 /* 2. Write data to register DFIFO_WDATA */
286 err = regmap_write(as_ctrl->regmap_ctrl,
287 REG_SPI_CTRL_DFIFO_WDATA,
288 FIELD_PREP(SPI_CTRL_DFIFO_WDATA, data[i]));
292 /* 3. Wait until dfifo is not full */
293 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl,
294 REG_SPI_CTRL_DFIFO_FULL, val,
295 !(val & SPI_CTRL_DFIFO_FULL),
296 0, 250 * USEC_PER_MSEC);
304 static int airoha_snand_read_data_from_fifo(struct airoha_snand_ctrl *as_ctrl,
309 for (i = 0; i < len; i++) {
313 /* 1. wait until dfifo is not empty */
314 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl,
315 REG_SPI_CTRL_DFIFO_EMPTY, val,
316 !(val & SPI_CTRL_DFIFO_EMPTY),
317 0, 250 * USEC_PER_MSEC);
321 /* 2. read from dfifo to register DFIFO_RDATA */
322 err = regmap_read(as_ctrl->regmap_ctrl,
323 REG_SPI_CTRL_DFIFO_RDATA, &val);
327 ptr[i] = FIELD_GET(SPI_CTRL_DFIFO_RDATA, val);
328 /* 3. enable register DFIFO_RD to read next byte */
329 err = regmap_write(as_ctrl->regmap_ctrl,
330 REG_SPI_CTRL_DFIFO_RD, SPI_CTRL_DFIFO_RD);
338 static int airoha_snand_set_mode(struct airoha_snand_ctrl *as_ctrl,
339 enum airoha_snand_mode mode)
344 case SPI_MODE_MANUAL: {
347 err = regmap_write(as_ctrl->regmap_ctrl,
348 REG_SPI_CTRL_NFI2SPI_EN, 0);
352 err = regmap_write(as_ctrl->regmap_ctrl,
353 REG_SPI_CTRL_READ_IDLE_EN, 0);
357 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl,
358 REG_SPI_CTRL_RDCTL_FSM, val,
359 !(val & SPI_CTRL_RDCTL_FSM),
360 0, 250 * USEC_PER_MSEC);
364 err = regmap_write(as_ctrl->regmap_ctrl,
365 REG_SPI_CTRL_MTX_MODE_TOG, 9);
369 err = regmap_write(as_ctrl->regmap_ctrl,
370 REG_SPI_CTRL_MANUAL_EN, SPI_CTRL_MANUAL_EN);
376 err = regmap_write(as_ctrl->regmap_ctrl,
377 REG_SPI_CTRL_NFI2SPI_EN,
382 err = regmap_write(as_ctrl->regmap_ctrl,
383 REG_SPI_CTRL_MTX_MODE_TOG, 0x0);
387 err = regmap_write(as_ctrl->regmap_ctrl,
388 REG_SPI_CTRL_MANUAL_EN, 0x0);
397 return regmap_write(as_ctrl->regmap_ctrl, REG_SPI_CTRL_DUMMY, 0);
400 static int airoha_snand_write_data(struct airoha_snand_ctrl *as_ctrl, u8 cmd,
401 const u8 *data, int len)
405 for (i = 0; i < len; i += data_len) {
408 data_len = min(len, SPI_MAX_TRANSFER_SIZE);
409 err = airoha_snand_set_fifo_op(as_ctrl, cmd, data_len);
413 err = airoha_snand_write_data_to_fifo(as_ctrl, &data[i],
422 static int airoha_snand_read_data(struct airoha_snand_ctrl *as_ctrl, u8 *data,
427 for (i = 0; i < len; i += data_len) {
430 data_len = min(len, SPI_MAX_TRANSFER_SIZE);
431 err = airoha_snand_set_fifo_op(as_ctrl, 0xc, data_len);
435 err = airoha_snand_read_data_from_fifo(as_ctrl, &data[i],
444 static int airoha_snand_nfi_init(struct airoha_snand_ctrl *as_ctrl)
448 /* switch to SNFI mode */
449 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_NFI_CNFG,
455 return regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR_EN,
456 SPI_NFI_ALL_IRQ_EN, SPI_NFI_AHB_DONE_EN);
459 static int airoha_snand_nfi_config(struct airoha_snand_ctrl *as_ctrl)
464 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
465 SPI_NFI_FIFO_FLUSH | SPI_NFI_RST);
470 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
471 SPI_NFI_AUTO_FDM_EN);
476 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
482 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
483 SPI_NFI_DMA_BURST_EN);
488 switch (as_ctrl->nfi_cfg.spare_size) {
490 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x1);
493 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x2);
496 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x3);
499 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x0);
503 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_PAGEFMT,
504 SPI_NFI_SPARE_SIZE, val);
508 switch (as_ctrl->nfi_cfg.page_size) {
510 val = FIELD_PREP(SPI_NFI_PAGE_SIZE, 0x1);
513 val = FIELD_PREP(SPI_NFI_PAGE_SIZE, 0x2);
516 val = FIELD_PREP(SPI_NFI_PAGE_SIZE, 0x0);
520 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_PAGEFMT,
521 SPI_NFI_PAGE_SIZE, val);
526 val = FIELD_PREP(SPI_NFI_SEC_NUM, as_ctrl->nfi_cfg.sec_num);
527 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
528 SPI_NFI_SEC_NUM, val);
532 /* enable cust sec size */
533 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SECCUS_SIZE,
534 SPI_NFI_CUS_SEC_SIZE_EN);
538 /* set cust sec size */
539 val = FIELD_PREP(SPI_NFI_CUS_SEC_SIZE, as_ctrl->nfi_cfg.sec_size);
540 return regmap_update_bits(as_ctrl->regmap_nfi,
541 REG_SPI_NFI_SECCUS_SIZE,
542 SPI_NFI_CUS_SEC_SIZE, val);
545 static bool airoha_snand_is_page_ops(const struct spi_mem_op *op)
547 if (op->addr.nbytes != 2)
550 if (op->addr.buswidth != 1 && op->addr.buswidth != 2 &&
551 op->addr.buswidth != 4)
554 switch (op->data.dir) {
555 case SPI_MEM_DATA_IN:
556 if (op->dummy.nbytes * BITS_PER_BYTE / op->dummy.buswidth > 0xf)
559 /* quad in / quad out */
560 if (op->addr.buswidth == 4)
561 return op->data.buswidth == 4;
563 if (op->addr.buswidth == 2)
564 return op->data.buswidth == 2;
567 return op->data.buswidth == 4 || op->data.buswidth == 2 ||
568 op->data.buswidth == 1;
569 case SPI_MEM_DATA_OUT:
570 return !op->dummy.nbytes && op->addr.buswidth == 1 &&
571 (op->data.buswidth == 4 || op->data.buswidth == 1);
577 static int airoha_snand_adjust_op_size(struct spi_mem *mem,
578 struct spi_mem_op *op)
582 if (airoha_snand_is_page_ops(op)) {
583 struct airoha_snand_ctrl *as_ctrl;
585 as_ctrl = spi_controller_get_devdata(mem->spi->controller);
586 max_len = as_ctrl->nfi_cfg.sec_size;
587 max_len += as_ctrl->nfi_cfg.spare_size;
588 max_len *= as_ctrl->nfi_cfg.sec_num;
590 if (op->data.nbytes > max_len)
591 op->data.nbytes = max_len;
593 max_len = 1 + op->addr.nbytes + op->dummy.nbytes;
597 if (op->data.nbytes > 160 - max_len)
598 op->data.nbytes = 160 - max_len;
604 static bool airoha_snand_supports_op(struct spi_mem *mem,
605 const struct spi_mem_op *op)
607 if (!spi_mem_default_supports_op(mem, op))
610 if (op->cmd.buswidth != 1)
613 if (airoha_snand_is_page_ops(op))
616 return (!op->addr.nbytes || op->addr.buswidth == 1) &&
617 (!op->dummy.nbytes || op->dummy.buswidth == 1) &&
618 (!op->data.nbytes || op->data.buswidth == 1);
621 static int airoha_snand_dirmap_create(struct spi_mem_dirmap_desc *desc)
623 struct airoha_snand_dev *as_dev = spi_get_ctldata(desc->mem->spi);
625 if (!as_dev->txrx_buf)
628 if (desc->info.offset + desc->info.length > U32_MAX)
631 if (!airoha_snand_supports_op(desc->mem, &desc->info.op_tmpl))
637 static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
638 u64 offs, size_t len, void *buf)
640 struct spi_device *spi = desc->mem->spi;
641 struct airoha_snand_dev *as_dev = spi_get_ctldata(spi);
642 struct spi_mem_op *op = &desc->info.op_tmpl;
643 struct airoha_snand_ctrl *as_ctrl;
647 if (!as_dev->data_need_update)
650 as_dev->data_need_update = false;
652 switch (op->cmd.opcode) {
653 case SPI_NAND_OP_READ_FROM_CACHE_DUAL:
656 case SPI_NAND_OP_READ_FROM_CACHE_QUAD:
664 as_ctrl = spi_controller_get_devdata(spi->controller);
665 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA);
669 err = airoha_snand_nfi_config(as_ctrl);
673 dma_sync_single_for_device(as_ctrl->dev, as_dev->dma_addr,
674 as_dev->buf_len, DMA_BIDIRECTIONAL);
677 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR,
682 /* set cust sec size */
683 val = as_ctrl->nfi_cfg.sec_size * as_ctrl->nfi_cfg.sec_num;
684 val = FIELD_PREP(SPI_NFI_READ_DATA_BYTE_NUM, val);
685 err = regmap_update_bits(as_ctrl->regmap_nfi,
686 REG_SPI_NFI_SNF_MISC_CTL2,
687 SPI_NFI_READ_DATA_BYTE_NUM, val);
691 /* set read command */
692 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL2,
698 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL,
699 FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, rd_mode));
704 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL3, 0x0);
709 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
711 FIELD_PREP(SPI_NFI_OPMODE, 6));
715 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
716 SPI_NFI_READ_MODE | SPI_NFI_DMA_MODE);
720 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CMD, 0x0);
724 /* trigger dma start read */
725 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
730 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
735 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi,
736 REG_SPI_NFI_SNF_STA_CTL1, val,
737 (val & SPI_NFI_READ_FROM_CACHE_DONE),
738 0, 1 * USEC_PER_SEC);
742 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1,
743 SPI_NFI_READ_FROM_CACHE_DONE);
747 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR,
748 val, (val & SPI_NFI_AHB_DONE), 0,
753 /* DMA read need delay for data ready from controller to DRAM */
756 dma_sync_single_for_cpu(as_ctrl->dev, as_dev->dma_addr,
757 as_dev->buf_len, DMA_BIDIRECTIONAL);
758 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
762 memcpy(buf, as_dev->txrx_buf + offs, len);
767 static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
768 u64 offs, size_t len, const void *buf)
770 struct spi_device *spi = desc->mem->spi;
771 struct airoha_snand_dev *as_dev = spi_get_ctldata(spi);
772 struct spi_mem_op *op = &desc->info.op_tmpl;
773 struct airoha_snand_ctrl *as_ctrl;
777 as_ctrl = spi_controller_get_devdata(spi->controller);
778 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
782 dma_sync_single_for_cpu(as_ctrl->dev, as_dev->dma_addr,
783 as_dev->buf_len, DMA_BIDIRECTIONAL);
784 memcpy(as_dev->txrx_buf + offs, buf, len);
785 dma_sync_single_for_device(as_ctrl->dev, as_dev->dma_addr,
786 as_dev->buf_len, DMA_BIDIRECTIONAL);
788 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA);
792 err = airoha_snand_nfi_config(as_ctrl);
796 if (op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_QUAD ||
797 op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD)
802 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR,
807 val = FIELD_PREP(SPI_NFI_PROG_LOAD_BYTE_NUM,
808 as_ctrl->nfi_cfg.sec_size * as_ctrl->nfi_cfg.sec_num);
809 err = regmap_update_bits(as_ctrl->regmap_nfi,
810 REG_SPI_NFI_SNF_MISC_CTL2,
811 SPI_NFI_PROG_LOAD_BYTE_NUM, val);
815 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL1,
816 FIELD_PREP(SPI_NFI_PG_LOAD_CMD,
821 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL,
822 FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, wr_mode));
826 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL2, 0x0);
830 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
835 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
837 FIELD_PREP(SPI_NFI_OPMODE, 3));
841 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG,
846 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CMD, 0x80);
850 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
855 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON,
860 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR,
861 val, (val & SPI_NFI_AHB_DONE), 0,
866 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi,
867 REG_SPI_NFI_SNF_STA_CTL1, val,
868 (val & SPI_NFI_LOAD_TO_CACHE_DONE),
869 0, 1 * USEC_PER_SEC);
873 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1,
874 SPI_NFI_LOAD_TO_CACHE_DONE);
878 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
885 static int airoha_snand_exec_op(struct spi_mem *mem,
886 const struct spi_mem_op *op)
888 struct airoha_snand_dev *as_dev = spi_get_ctldata(mem->spi);
889 u8 data[8], cmd, opcode = op->cmd.opcode;
890 struct airoha_snand_ctrl *as_ctrl;
893 as_ctrl = spi_controller_get_devdata(mem->spi->controller);
894 if (opcode == SPI_NAND_OP_PROGRAM_EXECUTE &&
895 op->addr.val == as_dev->cur_page_num) {
896 as_dev->data_need_update = true;
897 } else if (opcode == SPI_NAND_OP_PAGE_READ) {
898 if (!as_dev->data_need_update &&
899 op->addr.val == as_dev->cur_page_num)
902 as_dev->data_need_update = true;
903 as_dev->cur_page_num = op->addr.val;
906 /* switch to manual mode */
907 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
911 err = airoha_snand_set_cs(as_ctrl, SPI_CHIP_SEL_LOW);
916 err = airoha_snand_write_data(as_ctrl, 0x8, &opcode, sizeof(opcode));
921 cmd = opcode == SPI_NAND_OP_GET_FEATURE ? 0x11 : 0x8;
922 put_unaligned_be64(op->addr.val, data);
924 for (i = ARRAY_SIZE(data) - op->addr.nbytes;
925 i < ARRAY_SIZE(data); i++) {
926 err = airoha_snand_write_data(as_ctrl, cmd, &data[i],
934 for (i = 0; i < op->dummy.nbytes; i++) {
935 err = airoha_snand_write_data(as_ctrl, 0x8, &data[0],
942 if (op->data.dir == SPI_MEM_DATA_IN) {
943 err = airoha_snand_read_data(as_ctrl, op->data.buf.in,
948 err = airoha_snand_write_data(as_ctrl, 0x8, op->data.buf.out,
954 return airoha_snand_set_cs(as_ctrl, SPI_CHIP_SEL_HIGH);
957 static const struct spi_controller_mem_ops airoha_snand_mem_ops = {
958 .adjust_op_size = airoha_snand_adjust_op_size,
959 .supports_op = airoha_snand_supports_op,
960 .exec_op = airoha_snand_exec_op,
961 .dirmap_create = airoha_snand_dirmap_create,
962 .dirmap_read = airoha_snand_dirmap_read,
963 .dirmap_write = airoha_snand_dirmap_write,
966 static int airoha_snand_setup(struct spi_device *spi)
968 struct airoha_snand_ctrl *as_ctrl;
969 struct airoha_snand_dev *as_dev;
971 as_ctrl = spi_controller_get_devdata(spi->controller);
973 as_dev = devm_kzalloc(as_ctrl->dev, sizeof(*as_dev), GFP_KERNEL);
977 /* prepare device buffer */
978 as_dev->buf_len = SPI_NAND_CACHE_SIZE;
979 as_dev->txrx_buf = devm_kzalloc(as_ctrl->dev, as_dev->buf_len,
981 if (!as_dev->txrx_buf)
984 as_dev->dma_addr = dma_map_single(as_ctrl->dev, as_dev->txrx_buf,
985 as_dev->buf_len, DMA_BIDIRECTIONAL);
986 if (dma_mapping_error(as_ctrl->dev, as_dev->dma_addr))
989 as_dev->data_need_update = true;
990 spi_set_ctldata(spi, as_dev);
995 static void airoha_snand_cleanup(struct spi_device *spi)
997 struct airoha_snand_dev *as_dev = spi_get_ctldata(spi);
998 struct airoha_snand_ctrl *as_ctrl;
1000 as_ctrl = spi_controller_get_devdata(spi->controller);
1001 dma_unmap_single(as_ctrl->dev, as_dev->dma_addr,
1002 as_dev->buf_len, DMA_BIDIRECTIONAL);
1003 spi_set_ctldata(spi, NULL);
1006 static int airoha_snand_nfi_setup(struct airoha_snand_ctrl *as_ctrl)
1008 u32 val, sec_size, sec_num;
1011 err = regmap_read(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, &val);
1015 sec_num = FIELD_GET(SPI_NFI_SEC_NUM, val);
1017 err = regmap_read(as_ctrl->regmap_nfi, REG_SPI_NFI_SECCUS_SIZE, &val);
1021 sec_size = FIELD_GET(SPI_NFI_CUS_SEC_SIZE, val);
1023 /* init default value */
1024 as_ctrl->nfi_cfg.sec_size = sec_size;
1025 as_ctrl->nfi_cfg.sec_num = sec_num;
1026 as_ctrl->nfi_cfg.page_size = round_down(sec_size * sec_num, 1024);
1027 as_ctrl->nfi_cfg.spare_size = 16;
1029 err = airoha_snand_nfi_init(as_ctrl);
1033 return airoha_snand_nfi_config(as_ctrl);
1036 static const struct regmap_config spi_ctrl_regmap_config = {
1041 .max_register = REG_SPI_CTRL_NFI2SPI_EN,
1044 static const struct regmap_config spi_nfi_regmap_config = {
1049 .max_register = REG_SPI_NFI_SNF_NFI_CNFG,
1052 static const struct of_device_id airoha_snand_ids[] = {
1053 { .compatible = "airoha,en7581-snand" },
1056 MODULE_DEVICE_TABLE(of, airoha_snand_ids);
1058 static int airoha_snand_probe(struct platform_device *pdev)
1060 struct airoha_snand_ctrl *as_ctrl;
1061 struct device *dev = &pdev->dev;
1062 struct spi_controller *ctrl;
1066 ctrl = devm_spi_alloc_host(dev, sizeof(*as_ctrl));
1070 as_ctrl = spi_controller_get_devdata(ctrl);
1073 base = devm_platform_ioremap_resource(pdev, 0);
1075 return PTR_ERR(base);
1077 as_ctrl->regmap_ctrl = devm_regmap_init_mmio(dev, base,
1078 &spi_ctrl_regmap_config);
1079 if (IS_ERR(as_ctrl->regmap_ctrl))
1080 return dev_err_probe(dev, PTR_ERR(as_ctrl->regmap_ctrl),
1081 "failed to init spi ctrl regmap\n");
1083 base = devm_platform_ioremap_resource(pdev, 1);
1085 return PTR_ERR(base);
1087 as_ctrl->regmap_nfi = devm_regmap_init_mmio(dev, base,
1088 &spi_nfi_regmap_config);
1089 if (IS_ERR(as_ctrl->regmap_nfi))
1090 return dev_err_probe(dev, PTR_ERR(as_ctrl->regmap_nfi),
1091 "failed to init spi nfi regmap\n");
1093 as_ctrl->spi_clk = devm_clk_get_enabled(dev, "spi");
1094 if (IS_ERR(as_ctrl->spi_clk))
1095 return dev_err_probe(dev, PTR_ERR(as_ctrl->spi_clk),
1096 "unable to get spi clk\n");
1098 err = dma_set_mask(as_ctrl->dev, DMA_BIT_MASK(32));
1102 ctrl->num_chipselect = 2;
1103 ctrl->mem_ops = &airoha_snand_mem_ops;
1104 ctrl->bits_per_word_mask = SPI_BPW_MASK(8);
1105 ctrl->mode_bits = SPI_RX_DUAL;
1106 ctrl->setup = airoha_snand_setup;
1107 ctrl->cleanup = airoha_snand_cleanup;
1108 device_set_node(&ctrl->dev, dev_fwnode(dev));
1110 err = airoha_snand_nfi_setup(as_ctrl);
1114 return devm_spi_register_controller(dev, ctrl);
1117 static struct platform_driver airoha_snand_driver = {
1119 .name = "airoha-spi",
1120 .of_match_table = airoha_snand_ids,
1122 .probe = airoha_snand_probe,
1124 module_platform_driver(airoha_snand_driver);
1126 MODULE_DESCRIPTION("Airoha SPI-NAND Flash Controller Driver");
1129 MODULE_LICENSE("GPL");