blob: 7e683f49c5e53b0cd805db40997b0cbf665c2977 [file] [log] [blame]
Arseniy Krasnov55842b42024-02-11 01:39:27 +03001// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Amlogic Meson Nand Flash Controller Driver
4 *
5 * Copyright (c) 2018 Amlogic, inc.
6 * Author: Liang Yang <liang.yang@amlogic.com>
7 *
8 * Copyright (c) 2023 SaluteDevices, Inc.
9 * Author: Arseniy Krasnov <avkrasnov@salutedevices.com>
10 */
11
Arseniy Krasnov55842b42024-02-11 01:39:27 +030012#include <nand.h>
13#include <asm/io.h>
14#include <dm.h>
15#include <dm/device_compat.h>
16#include <dm/ofnode.h>
17#include <dm/uclass.h>
18#include <linux/bug.h>
19#include <linux/clk-provider.h>
20#include <linux/delay.h>
21#include <linux/dma-mapping.h>
22#include <linux/iopoll.h>
23#include <linux/mtd/mtd.h>
24#include <linux/mtd/rawnand.h>
25#include <linux/sizes.h>
26
27#define NFC_CMD_IDLE (0xc << 14)
28#define NFC_CMD_CLE (0x5 << 14)
29#define NFC_CMD_ALE (0x6 << 14)
30#define NFC_CMD_DWR (0x4 << 14)
31#define NFC_CMD_DRD (0x8 << 14)
32#define NFC_CMD_ADL ((0 << 16) | (3 << 20))
33#define NFC_CMD_ADH ((1 << 16) | (3 << 20))
34#define NFC_CMD_AIL ((2 << 16) | (3 << 20))
35#define NFC_CMD_AIH ((3 << 16) | (3 << 20))
36#define NFC_CMD_SEED ((8 << 16) | (3 << 20))
37#define NFC_CMD_M2N ((0 << 17) | (2 << 20))
38#define NFC_CMD_N2M ((1 << 17) | (2 << 20))
39#define NFC_CMD_RB BIT(20)
40#define NFC_CMD_SCRAMBLER_ENABLE BIT(19)
41#define NFC_CMD_SCRAMBLER_DISABLE 0
Arseniy Krasnovd72b0132024-08-26 16:17:10 +030042#define NFC_CMD_SHORTMODE_ENABLE 1
Arseniy Krasnov55842b42024-02-11 01:39:27 +030043#define NFC_CMD_SHORTMODE_DISABLE 0
44#define NFC_CMD_RB_INT BIT(14)
45#define NFC_CMD_RB_INT_NO_PIN ((0xb << 10) | BIT(18) | BIT(16))
46
47#define NFC_CMD_GET_SIZE(x) (((x) >> 22) & GENMASK(4, 0))
48
49#define NFC_REG_CMD 0x00
50#define NFC_REG_CFG 0x04
51#define NFC_REG_DADR 0x08
52#define NFC_REG_IADR 0x0c
53#define NFC_REG_BUF 0x10
54#define NFC_REG_INFO 0x14
55#define NFC_REG_DC 0x18
56#define NFC_REG_ADR 0x1c
57#define NFC_REG_DL 0x20
58#define NFC_REG_DH 0x24
59#define NFC_REG_CADR 0x28
60#define NFC_REG_SADR 0x2c
61#define NFC_REG_PINS 0x30
62#define NFC_REG_VER 0x38
63
64#define CMDRWGEN(cmd_dir, ran, bch, short_mode, page_size, pages) \
65 ( \
66 (cmd_dir) | \
67 (ran) | \
68 ((bch) << 14) | \
69 ((short_mode) << 13) | \
70 (((page_size) & 0x7f) << 6) | \
71 ((pages) & 0x3f) \
72 )
73
74#define GENCMDDADDRL(adl, addr) ((adl) | ((addr) & 0xffff))
75#define GENCMDDADDRH(adh, addr) ((adh) | (((addr) >> 16) & 0xffff))
76#define GENCMDIADDRL(ail, addr) ((ail) | ((addr) & 0xffff))
77#define GENCMDIADDRH(aih, addr) ((aih) | (((addr) >> 16) & 0xffff))
78
79#define DMA_DIR(dir) ((dir) ? NFC_CMD_N2M : NFC_CMD_M2N)
80
Arseniy Krasnovd72b0132024-08-26 16:17:10 +030081#define NFC_SHORT_MODE_ECC_SZ 384
82
Arseniy Krasnov55842b42024-02-11 01:39:27 +030083#define ECC_CHECK_RETURN_FF -1
84
85#define NAND_CE0 (0xe << 10)
86#define NAND_CE1 (0xd << 10)
87
88#define DMA_BUSY_TIMEOUT_US 1000000
89#define CMD_DRAIN_TIMEOUT_US 1000
90#define ECC_POLL_TIMEOUT_US 15
91
92#define MAX_CE_NUM 2
93
94/* eMMC clock register, misc control */
95#define CLK_SELECT_NAND BIT(31)
96#define CLK_ALWAYS_ON_NAND BIT(24)
97#define CLK_ENABLE_VALUE 0x245
98
99#define DIRREAD 1
100#define DIRWRITE 0
101
102#define ECC_PARITY_BCH8_512B 14
103#define ECC_COMPLETE BIT(31)
104#define ECC_ERR_CNT(x) (((x) >> 24) & GENMASK(5, 0))
105#define ECC_ZERO_CNT(x) (((x) >> 16) & GENMASK(5, 0))
106#define ECC_UNCORRECTABLE 0x3f
107
108#define PER_INFO_BYTE 8
109
110#define NFC_SEND_CMD(host, cmd) \
111 (writel((cmd), (host)->reg_base + NFC_REG_CMD))
112
113#define NFC_GET_CMD(host) \
114 (readl((host)->reg_base + NFC_REG_CMD))
115
116#define NFC_CMDFIFO_SIZE(host) ((NFC_GET_CMD((host)) >> 22) & GENMASK(4, 0))
117
118#define NFC_CMD_MAKE_IDLE(ce, delay) ((ce) | NFC_CMD_IDLE | ((delay) & 0x3ff))
119#define NFC_CMD_MAKE_DRD(ce, size) ((ce) | NFC_CMD_DRD | (size))
120#define NFC_CMD_MAKE_DWR(ce, data) ((ce) | NFC_CMD_DWR | ((data) & 0xff))
121#define NFC_CMD_MAKE_CLE(ce, cmd_val) ((ce) | NFC_CMD_CLE | ((cmd_val) & 0xff))
122#define NFC_CMD_MAKE_ALE(ce, addr) ((ce) | NFC_CMD_ALE | ((addr) & 0xff))
123
124#define NAND_TWB_TIME_CYCLE 10
125
126#define NFC_DEV_READY_TICK_MAX 5000
127
128/* Both values are recommended by vendor, as the most
129 * tested with almost all SLC NAND flash. Second value
130 * could be calculated dynamically from timing parameters,
131 * but we need both values for initial start of the NAND
132 * controller (e.g. before NAND subsystem processes timings),
133 * so use hardcoded constants.
134 */
135#define NFC_DEFAULT_BUS_CYCLE 6
136#define NFC_DEFAULT_BUS_TIMING 7
137
138#define NFC_SEED_OFFSET 0xc2
139#define NFC_SEED_MASK 0x7fff
140
141#define DMA_ADDR_ALIGN 8
142
143struct meson_nfc_nand_chip {
144 struct list_head node;
145 struct nand_chip nand;
Arseniy Krasnovd72b0132024-08-26 16:17:10 +0300146 u32 boot_pages;
147 u32 boot_page_step;
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300148
149 u32 bch_mode;
150 u8 *data_buf;
151 __le64 *info_buf;
152 u32 nsels;
153 u8 sels[];
154};
155
156struct meson_nfc_param {
157 u32 chip_select;
158 u32 rb_select;
159};
160
161struct meson_nfc {
162 void __iomem *reg_base;
163 void __iomem *reg_clk;
164 struct list_head chips;
165 struct meson_nfc_param param;
166 struct udevice *dev;
167 dma_addr_t daddr;
168 dma_addr_t iaddr;
169 u32 data_bytes;
170 u32 info_bytes;
171 u64 assigned_cs;
172};
173
174struct meson_nand_ecc {
175 u32 bch;
176 u32 strength;
177 u32 size;
178};
179
180enum {
181 NFC_ECC_BCH8_512 = 1,
182 NFC_ECC_BCH8_1K,
183 NFC_ECC_BCH24_1K,
184 NFC_ECC_BCH30_1K,
185 NFC_ECC_BCH40_1K,
186 NFC_ECC_BCH50_1K,
187 NFC_ECC_BCH60_1K,
188};
189
190#define MESON_ECC_DATA(b, s, sz) { .bch = (b), .strength = (s), .size = (sz) }
191
192static struct meson_nand_ecc meson_ecc[] = {
193 MESON_ECC_DATA(NFC_ECC_BCH8_512, 8, 512),
194 MESON_ECC_DATA(NFC_ECC_BCH8_1K, 8, 1024),
195};
196
197static int meson_nand_calc_ecc_bytes(int step_size, int strength)
198{
199 int ecc_bytes;
200
201 if (step_size == 512 && strength == 8)
202 return ECC_PARITY_BCH8_512B;
203
204 ecc_bytes = DIV_ROUND_UP(strength * fls(step_size * 8), 8);
205 ecc_bytes = ALIGN(ecc_bytes, 2);
206
207 return ecc_bytes;
208}
209
210static struct meson_nfc_nand_chip *to_meson_nand(struct nand_chip *nand)
211{
212 return container_of(nand, struct meson_nfc_nand_chip, nand);
213}
214
215static void meson_nfc_nand_select_chip(struct mtd_info *mtd, int chip)
216{
217 struct nand_chip *nand = mtd_to_nand(mtd);
218 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
219 struct meson_nfc *nfc = nand_get_controller_data(nand);
220
221 nfc->param.chip_select = meson_chip->sels[chip] ? NAND_CE1 : NAND_CE0;
222}
223
224static void meson_nfc_cmd_idle(struct meson_nfc *nfc, u32 time)
225{
226 writel(NFC_CMD_MAKE_IDLE(nfc->param.chip_select, time),
227 nfc->reg_base + NFC_REG_CMD);
228}
229
230static void meson_nfc_cmd_seed(const struct meson_nfc *nfc, u32 seed)
231{
232 writel(NFC_CMD_SEED | (NFC_SEED_OFFSET + (seed & NFC_SEED_MASK)),
233 nfc->reg_base + NFC_REG_CMD);
234}
235
Arseniy Krasnovd72b0132024-08-26 16:17:10 +0300236static int meson_nfc_is_boot_page(struct nand_chip *nand, int page)
237{
238 const struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
239
240 return (nand->options & NAND_IS_BOOT_MEDIUM) &&
241 !(page % meson_chip->boot_page_step) &&
242 (page < meson_chip->boot_pages);
243}
244
Arseniy Krasnov6f95fea2024-08-26 16:17:09 +0300245static void meson_nfc_cmd_access(struct nand_chip *nand, bool raw, bool dir, int page)
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300246{
Arseniy Krasnovd72b0132024-08-26 16:17:10 +0300247 const struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300248 struct mtd_info *mtd = nand_to_mtd(nand);
249 const struct meson_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd));
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300250 int len = mtd->writesize, pagesize, pages;
Arseniy Krasnov6f95fea2024-08-26 16:17:09 +0300251 unsigned int scrambler;
Arseniy Krasnovd72b0132024-08-26 16:17:10 +0300252 u32 cmd;
Arseniy Krasnov6f95fea2024-08-26 16:17:09 +0300253
254 if (nand->options & NAND_NEED_SCRAMBLING)
255 scrambler = NFC_CMD_SCRAMBLER_ENABLE;
256 else
257 scrambler = NFC_CMD_SCRAMBLER_DISABLE;
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300258
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300259 if (raw) {
260 len = mtd->writesize + mtd->oobsize;
261 cmd = len | scrambler | DMA_DIR(dir);
Arseniy Krasnovd72b0132024-08-26 16:17:10 +0300262 } else if (meson_nfc_is_boot_page(nand, page)) {
263 pagesize = NFC_SHORT_MODE_ECC_SZ >> 3;
264 pages = mtd->writesize / 512;
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300265
Arseniy Krasnovd72b0132024-08-26 16:17:10 +0300266 scrambler = NFC_CMD_SCRAMBLER_ENABLE;
267 cmd = CMDRWGEN(DMA_DIR(dir), scrambler, NFC_ECC_BCH8_1K,
268 NFC_CMD_SHORTMODE_ENABLE, pagesize, pages);
269 } else {
270 pagesize = nand->ecc.size >> 3;
271 pages = len / nand->ecc.size;
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300272
Arseniy Krasnovd72b0132024-08-26 16:17:10 +0300273 cmd = CMDRWGEN(DMA_DIR(dir), scrambler, meson_chip->bch_mode,
274 NFC_CMD_SHORTMODE_DISABLE, pagesize, pages);
275 }
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300276
Arseniy Krasnov6f95fea2024-08-26 16:17:09 +0300277 if (scrambler == NFC_CMD_SCRAMBLER_ENABLE)
278 meson_nfc_cmd_seed(nfc, page);
279
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300280 writel(cmd, nfc->reg_base + NFC_REG_CMD);
281}
282
283static void meson_nfc_drain_cmd(struct meson_nfc *nfc)
284{
285 /*
286 * Insert two commands to make sure all valid commands are finished.
287 *
288 * The Nand flash controller is designed as two stages pipleline -
289 * a) fetch and b) execute.
290 * There might be cases when the driver see command queue is empty,
291 * but the Nand flash controller still has two commands buffered,
292 * one is fetched into NFC request queue (ready to run), and another
293 * is actively executing. So pushing 2 "IDLE" commands guarantees that
294 * the pipeline is emptied.
295 */
296 meson_nfc_cmd_idle(nfc, 0);
297 meson_nfc_cmd_idle(nfc, 0);
298}
299
300static int meson_nfc_wait_cmd_finish(const struct meson_nfc *nfc,
301 unsigned int timeout_us)
302{
303 u32 cmd_size = 0;
304
305 /* wait cmd fifo is empty */
306 return readl_relaxed_poll_timeout(nfc->reg_base + NFC_REG_CMD, cmd_size,
307 !NFC_CMD_GET_SIZE(cmd_size),
308 timeout_us);
309}
310
311static int meson_nfc_wait_dma_finish(struct meson_nfc *nfc)
312{
313 meson_nfc_drain_cmd(nfc);
314
315 return meson_nfc_wait_cmd_finish(nfc, DMA_BUSY_TIMEOUT_US);
316}
317
318static u8 *meson_nfc_oob_ptr(struct nand_chip *nand, int i)
319{
320 const struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
321 int len;
322
323 len = nand->ecc.size * (i + 1) + (nand->ecc.bytes + 2) * i;
324
325 return meson_chip->data_buf + len;
326}
327
328static u8 *meson_nfc_data_ptr(struct nand_chip *nand, int i)
329{
330 const struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
331 int len, temp;
332
333 temp = nand->ecc.size + nand->ecc.bytes;
334 len = (temp + 2) * i;
335
336 return meson_chip->data_buf + len;
337}
338
339static void meson_nfc_get_data_oob(struct nand_chip *nand,
340 u8 *buf, u8 *oobbuf)
341{
342 u8 *dsrc, *osrc;
343 int i, oob_len;
344
345 oob_len = nand->ecc.bytes + 2;
346 for (i = 0; i < nand->ecc.steps; i++) {
347 if (buf) {
348 dsrc = meson_nfc_data_ptr(nand, i);
349 memcpy(buf, dsrc, nand->ecc.size);
350 buf += nand->ecc.size;
351 }
352
353 if (oobbuf) {
354 osrc = meson_nfc_oob_ptr(nand, i);
355 memcpy(oobbuf, osrc, oob_len);
356 oobbuf += oob_len;
357 }
358 }
359}
360
361static void meson_nfc_set_data_oob(struct nand_chip *nand,
362 const u8 *buf, u8 *oobbuf)
363{
364 int i, oob_len;
365
366 oob_len = nand->ecc.bytes + 2;
367 for (i = 0; i < nand->ecc.steps; i++) {
368 u8 *osrc;
369
370 if (buf) {
371 u8 *dsrc;
372
373 dsrc = meson_nfc_data_ptr(nand, i);
374 memcpy(dsrc, buf, nand->ecc.size);
375 buf += nand->ecc.size;
376 }
377
378 osrc = meson_nfc_oob_ptr(nand, i);
379 memcpy(osrc, oobbuf, oob_len);
380 oobbuf += oob_len;
381 }
382}
383
384static void meson_nfc_set_user_byte(struct nand_chip *nand, const u8 *oob_buf)
385{
386 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
387 int i, count;
388
389 for (i = 0, count = 0; i < nand->ecc.steps; i++, count += (2 + nand->ecc.bytes)) {
390 __le64 *info = &meson_chip->info_buf[i];
391
392 *info |= oob_buf[count];
393 *info |= oob_buf[count + 1] << 8;
394 }
395}
396
397static void meson_nfc_get_user_byte(struct nand_chip *nand, u8 *oob_buf)
398{
399 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
400 int i, count;
401
402 for (i = 0, count = 0; i < nand->ecc.steps; i++, count += (2 + nand->ecc.bytes)) {
403 const __le64 *info = &meson_chip->info_buf[i];
404
405 oob_buf[count] = *info;
406 oob_buf[count + 1] = *info >> 8;
407 }
408}
409
410static int meson_nfc_ecc_correct(struct nand_chip *nand, u32 *bitflips,
411 u64 *correct_bitmap)
412{
413 struct mtd_info *mtd = nand_to_mtd(nand);
414 int ret = 0, i;
415
416 for (i = 0; i < nand->ecc.steps; i++) {
417 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
418 const __le64 *info = &meson_chip->info_buf[i];
419
420 if (ECC_ERR_CNT(*info) != ECC_UNCORRECTABLE) {
421 mtd->ecc_stats.corrected += ECC_ERR_CNT(*info);
422 *bitflips = max_t(u32, *bitflips, ECC_ERR_CNT(*info));
423 *correct_bitmap |= BIT_ULL(i);
424 continue;
425 }
426
427 if ((nand->options & NAND_NEED_SCRAMBLING) &&
428 ECC_ZERO_CNT(*info) < nand->ecc.strength) {
429 mtd->ecc_stats.corrected += ECC_ZERO_CNT(*info);
430 *bitflips = max_t(u32, *bitflips,
431 ECC_ZERO_CNT(*info));
432 ret = ECC_CHECK_RETURN_FF;
433 } else {
434 ret = -EBADMSG;
435 }
436 }
437
438 return ret;
439}
440
441static int meson_nfc_dma_buffer_setup(struct nand_chip *nand, void *databuf,
442 int datalen, void *infobuf, int infolen,
443 enum dma_data_direction dir)
444{
445 struct meson_nfc *nfc = nand_get_controller_data(nand);
446 int ret;
447 u32 cmd;
448
449 nfc->daddr = dma_map_single(databuf, datalen, DMA_BIDIRECTIONAL);
450 ret = dma_mapping_error(nfc->dev, nfc->daddr);
451 if (ret)
452 return ret;
453
454 cmd = GENCMDDADDRL(NFC_CMD_ADL, nfc->daddr);
455 writel(cmd, nfc->reg_base + NFC_REG_CMD);
456
457 cmd = GENCMDDADDRH(NFC_CMD_ADH, nfc->daddr);
458 writel(cmd, nfc->reg_base + NFC_REG_CMD);
459
460 if (infobuf) {
461 nfc->iaddr = dma_map_single(infobuf, infolen,
462 DMA_BIDIRECTIONAL);
463 ret = dma_mapping_error(nfc->dev, nfc->iaddr);
464 if (ret) {
465 dma_unmap_single(nfc->daddr, datalen, dir);
466 return ret;
467 }
468
469 nfc->info_bytes = infolen;
470 cmd = GENCMDIADDRL(NFC_CMD_AIL, nfc->iaddr);
471 writel(cmd, nfc->reg_base + NFC_REG_CMD);
472
473 cmd = GENCMDIADDRH(NFC_CMD_AIH, nfc->iaddr);
474 writel(cmd, nfc->reg_base + NFC_REG_CMD);
475 }
476
477 return 0;
478}
479
480static void meson_nfc_dma_buffer_release(struct nand_chip *nand,
481 int datalen, int infolen,
482 enum dma_data_direction dir)
483{
484 struct meson_nfc *nfc = nand_get_controller_data(nand);
485
486 dma_unmap_single(nfc->daddr, datalen, dir);
487
488 if (infolen) {
489 dma_unmap_single(nfc->iaddr, infolen, dir);
490 nfc->info_bytes = 0;
491 }
492}
493
494static void meson_nfc_read_buf(struct mtd_info *mtd, u8 *buf, int size)
495{
496 struct nand_chip *nand = mtd_to_nand(mtd);
497 struct meson_nfc *nfc = nand_get_controller_data(nand);
498 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
499 u8 *dma_buf;
500 int ret;
501 u32 cmd;
502
503 if ((uintptr_t)buf % DMA_ADDR_ALIGN) {
504 unsigned long tmp_addr;
505
506 dma_buf = dma_alloc_coherent(size, &tmp_addr);
507 if (!dma_buf)
508 return;
509 } else {
510 dma_buf = buf;
511 }
512
513 ret = meson_nfc_dma_buffer_setup(nand, dma_buf, size, meson_chip->info_buf,
514 PER_INFO_BYTE, DMA_FROM_DEVICE);
515 if (ret) {
516 pr_err("Failed to setup DMA buffer %p/%p\n", dma_buf,
517 meson_chip->info_buf);
518 return;
519 }
520
521 cmd = NFC_CMD_N2M | size;
522 writel(cmd, nfc->reg_base + NFC_REG_CMD);
523
524 meson_nfc_drain_cmd(nfc);
525 meson_nfc_wait_cmd_finish(nfc, CMD_DRAIN_TIMEOUT_US);
526 meson_nfc_dma_buffer_release(nand, size, PER_INFO_BYTE, DMA_FROM_DEVICE);
527
528 if (buf != dma_buf) {
529 memcpy(buf, dma_buf, size);
530 dma_free_coherent(dma_buf);
531 }
532}
533
534static void meson_nfc_write_buf(struct mtd_info *mtd, const u8 *buf, int size)
535{
536 struct nand_chip *nand = mtd_to_nand(mtd);
537 struct meson_nfc *nfc = nand_get_controller_data(nand);
538 u8 *dma_buf;
539 int ret;
540 u32 cmd;
541
542 if ((uintptr_t)buf % DMA_ADDR_ALIGN) {
543 unsigned long tmp_addr;
544
545 dma_buf = dma_alloc_coherent(size, &tmp_addr);
546 if (!dma_buf)
547 return;
548
549 memcpy(dma_buf, buf, size);
550 } else {
551 dma_buf = (u8 *)buf;
552 }
553
554 ret = meson_nfc_dma_buffer_setup(nand, (void *)dma_buf, size, NULL,
555 0, DMA_TO_DEVICE);
556 if (ret) {
557 pr_err("Failed to setup DMA buffer %p\n", dma_buf);
558 return;
559 }
560
561 cmd = NFC_CMD_M2N | size;
562 writel(cmd, nfc->reg_base + NFC_REG_CMD);
563
564 meson_nfc_drain_cmd(nfc);
565 meson_nfc_wait_cmd_finish(nfc, CMD_DRAIN_TIMEOUT_US);
566 meson_nfc_dma_buffer_release(nand, size, 0, DMA_TO_DEVICE);
567
568 if (buf != dma_buf)
569 dma_free_coherent(dma_buf);
570}
571
572static int meson_nfc_write_page_sub(struct nand_chip *nand,
573 int page, bool raw)
574{
575 const struct mtd_info *mtd = nand_to_mtd(nand);
576 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
577 struct meson_nfc *nfc = nand_get_controller_data(nand);
578 int data_len, info_len;
579 int ret;
580 u32 cmd;
581
582 data_len = mtd->writesize + mtd->oobsize;
583 info_len = nand->ecc.steps * PER_INFO_BYTE;
584
585 ret = meson_nfc_dma_buffer_setup(nand, meson_chip->data_buf,
586 data_len, meson_chip->info_buf,
587 info_len, DMA_TO_DEVICE);
588 if (ret) {
589 pr_err("Failed to setup DMA buffer %p/%p\n",
590 meson_chip->data_buf, meson_chip->info_buf);
591 return ret;
592 }
593
Arseniy Krasnov6f95fea2024-08-26 16:17:09 +0300594 meson_nfc_cmd_access(nand, raw, DIRWRITE, page);
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300595
596 cmd = nfc->param.chip_select | NFC_CMD_CLE | NAND_CMD_PAGEPROG;
597 writel(cmd, nfc->reg_base + NFC_REG_CMD);
598
599 meson_nfc_dma_buffer_release(nand, data_len, info_len, DMA_TO_DEVICE);
600
601 return 0;
602}
603
604static int meson_nfc_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
605 const u8 *buf, int oob_required, int page)
606{
607 meson_nfc_set_data_oob(chip, buf, oob_required ? chip->oob_poi : NULL);
608
609 return meson_nfc_write_page_sub(chip, page, true);
610}
611
612static int meson_nfc_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
613 const u8 *buf, int oob_required, int page)
614{
615 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(chip);
616
617 if (buf)
618 memcpy(meson_chip->data_buf, buf, mtd->writesize);
619
620 memset(meson_chip->info_buf, 0, chip->ecc.steps * PER_INFO_BYTE);
Arseniy Krasnove6cd0cb2024-12-23 00:23:29 +0300621 meson_nfc_set_user_byte(chip, chip->oob_poi);
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300622
623 return meson_nfc_write_page_sub(chip, page, false);
624}
625
626static void meson_nfc_check_ecc_pages_valid(struct meson_nfc *nfc,
627 struct nand_chip *nand, bool raw)
628{
629 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
630 __le64 *info;
631 u32 neccpages;
632 int ret;
633
634 neccpages = raw ? 1 : nand->ecc.steps;
635 info = &meson_chip->info_buf[neccpages - 1];
636 do {
637 udelay(ECC_POLL_TIMEOUT_US);
638 /* info is updated by nfc dma engine*/
639 rmb();
640 invalidate_dcache_range(nfc->iaddr, nfc->iaddr + nfc->info_bytes);
641 ret = *info & ECC_COMPLETE;
642 } while (!ret);
643}
644
645static int meson_nfc_read_page_sub(struct nand_chip *nand,
646 int page, bool raw)
647{
648 struct mtd_info *mtd = nand_to_mtd(nand);
649 struct meson_nfc *nfc = nand_get_controller_data(nand);
650 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
651 u32 data_len, info_len;
652 int ret;
653
654 data_len = mtd->writesize + mtd->oobsize;
655 info_len = nand->ecc.steps * PER_INFO_BYTE;
656
657 ret = meson_nfc_dma_buffer_setup(nand, meson_chip->data_buf, data_len,
658 meson_chip->info_buf, info_len,
659 DMA_FROM_DEVICE);
660 if (ret)
661 return ret;
662
Arseniy Krasnov6f95fea2024-08-26 16:17:09 +0300663 meson_nfc_cmd_access(nand, raw, DIRREAD, page);
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300664
665 meson_nfc_wait_dma_finish(nfc);
666 meson_nfc_check_ecc_pages_valid(nfc, nand, raw);
667
668 meson_nfc_dma_buffer_release(nand, data_len, info_len,
669 DMA_FROM_DEVICE);
670
671 return 0;
672}
673
674static int meson_nfc_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
675 u8 *buf, int oob_required, int page)
676{
677 int ret;
678
679 ret = meson_nfc_read_page_sub(chip, page, true);
680 if (ret)
681 return ret;
682
683 meson_nfc_get_data_oob(chip, buf, oob_required ? chip->oob_poi : NULL);
684
685 return 0;
686}
687
688static int meson_nfc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
689 u8 *buf, int oob_required, int page)
690{
691 const struct meson_nfc_nand_chip *meson_chip = to_meson_nand(chip);
692 u64 correct_bitmap = 0;
693 u32 bitflips = 0;
694 int ret;
695
696 ret = meson_nfc_read_page_sub(chip, page, false);
697 if (ret)
698 return ret;
699
700 if (oob_required)
701 meson_nfc_get_user_byte(chip, chip->oob_poi);
702
703 ret = meson_nfc_ecc_correct(chip, &bitflips, &correct_bitmap);
704
705 if (ret == ECC_CHECK_RETURN_FF) {
706 if (buf)
707 memset(buf, 0xff, mtd->writesize);
708
709 if (oob_required)
710 memset(chip->oob_poi, 0xff, mtd->oobsize);
711 } else if (ret < 0) {
712 struct nand_ecc_ctrl *ecc;
713 int i;
714
715 if ((chip->options & NAND_NEED_SCRAMBLING) || !buf) {
716 mtd->ecc_stats.failed++;
717 return bitflips;
718 }
719
720 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
721
722 ret = meson_nfc_read_page_raw(mtd, chip, buf, 1, page);
723 if (ret)
724 return ret;
725
726 ecc = &chip->ecc;
727
728 for (i = 0; i < chip->ecc.steps ; i++) {
729 u8 *data = buf + i * ecc->size;
730 u8 *oob = chip->oob_poi + i * (ecc->bytes + 2);
731
732 if (correct_bitmap & BIT_ULL(i))
733 continue;
734
735 ret = nand_check_erased_ecc_chunk(data, ecc->size,
736 oob, ecc->bytes + 2,
737 NULL, 0,
738 ecc->strength);
739 if (ret < 0) {
740 mtd->ecc_stats.failed++;
741 } else {
742 mtd->ecc_stats.corrected += ret;
743 bitflips = max_t(u32, bitflips, ret);
744 }
745 }
746 } else if (buf && buf != meson_chip->data_buf) {
747 memcpy(buf, meson_chip->data_buf, mtd->writesize);
748 }
749
750 return bitflips;
751}
752
753static int meson_nfc_read_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
754 int page)
755{
756 int ret;
757
758 ret = nand_read_page_op(chip, page, 0, NULL, 0);
759 if (ret)
760 return ret;
761
762 return meson_nfc_read_page_raw(mtd, chip, NULL, 1, page);
763}
764
765static int meson_nfc_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
766 int page)
767{
768 int ret;
769
770 ret = nand_read_page_op(chip, page, 0, NULL, 0);
771 if (ret)
772 return ret;
773
774 return meson_nfc_read_page_hwecc(mtd, chip, NULL, 1, page);
775}
776
777static int meson_nfc_write_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
778 int page)
779{
780 int ret;
781
782 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
783 if (ret)
784 return ret;
785
786 ret = meson_nfc_write_page_raw(mtd, chip, NULL, 1, page);
787 if (ret)
788 return ret;
789
790 return nand_prog_page_end_op(chip);
791}
792
793static int meson_nfc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
794 int page)
795{
796 int ret;
797
798 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
799 if (ret)
800 return ret;
801
802 ret = meson_nfc_write_page_hwecc(mtd, chip, NULL, 1, page);
803 if (ret)
804 return ret;
805
806 return nand_prog_page_end_op(chip);
807}
808
809static void meson_nfc_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
810 int column, int page_addr)
811{
812 struct nand_chip *chip = mtd_to_nand(mtd);
813
814 chip->cmd_ctrl(mtd, command, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
815
816 if (column != -1 || page_addr != -1) {
817 int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
818
819 /* Serially input address */
820 if (column != -1) {
821 /* Adjust columns for 16 bit buswidth */
822 if (chip->options & NAND_BUSWIDTH_16 &&
823 !nand_opcode_8bits(command))
824 column >>= 1;
825
826 chip->cmd_ctrl(mtd, column, ctrl);
827 ctrl &= ~NAND_CTRL_CHANGE;
828 /* Only output a single addr cycle for 8bits
829 * opcodes.
830 */
831 if (!nand_opcode_8bits(command))
832 chip->cmd_ctrl(mtd, column >> 8, ctrl);
833 }
834
835 if (page_addr != -1) {
836 chip->cmd_ctrl(mtd, page_addr, ctrl);
837 chip->cmd_ctrl(mtd, page_addr >> 8, NAND_NCE |
838 NAND_ALE);
839 /* One more address cycle for devices > 128MiB */
840 if (chip->chipsize > SZ_128M)
841 chip->cmd_ctrl(mtd, page_addr >> 16,
842 NAND_NCE | NAND_ALE);
843 }
844
845 switch (command) {
846 case NAND_CMD_READ0:
847 chip->cmd_ctrl(mtd, NAND_CMD_READSTART,
848 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
849 fallthrough;
850 case NAND_CMD_PARAM:
851 nand_wait_ready(mtd);
852 nand_exit_status_op(chip);
853 }
854 }
855}
856
857static void meson_nfc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
858{
859 struct nand_chip *nand = mtd_to_nand(mtd);
860 struct meson_nfc *nfc = nand_get_controller_data(nand);
861
862 if (cmd == NAND_CMD_NONE)
863 return;
864
865 if (ctrl & NAND_CLE)
866 cmd = NFC_CMD_MAKE_CLE(nfc->param.chip_select, cmd);
867 else
868 cmd = NFC_CMD_MAKE_ALE(nfc->param.chip_select, cmd);
869
870 writel(cmd, nfc->reg_base + NFC_REG_CMD);
871}
872
873static void meson_nfc_wait_cmd_fifo(struct meson_nfc *nfc)
874{
875 while ((NFC_GET_CMD(nfc) >> 22) & GENMASK(4, 0))
876 ;
877}
878
879static u8 meson_nfc_nand_read_byte(struct mtd_info *mtd)
880{
881 struct nand_chip *nand = mtd_to_nand(mtd);
882 struct meson_nfc *nfc = nand_get_controller_data(nand);
883
884 writel(NFC_CMD_MAKE_DRD(nfc->param.chip_select, 0), nfc->reg_base + NFC_REG_CMD);
885
886 meson_nfc_cmd_idle(nfc, NAND_TWB_TIME_CYCLE);
887 meson_nfc_cmd_idle(nfc, 0);
888 meson_nfc_cmd_idle(nfc, 0);
889
890 meson_nfc_wait_cmd_fifo(nfc);
891
892 return readl(nfc->reg_base + NFC_REG_BUF);
893}
894
895static void meson_nfc_nand_write_byte(struct mtd_info *mtd, u8 val)
896{
897 struct nand_chip *nand = mtd_to_nand(mtd);
898 struct meson_nfc *nfc = nand_get_controller_data(nand);
899
900 meson_nfc_cmd_idle(nfc, NAND_TWB_TIME_CYCLE);
901
902 writel(NFC_CMD_MAKE_DWR(nfc->param.chip_select, val), nfc->reg_base + NFC_REG_CMD);
903
904 meson_nfc_cmd_idle(nfc, NAND_TWB_TIME_CYCLE);
905 meson_nfc_cmd_idle(nfc, 0);
906 meson_nfc_cmd_idle(nfc, 0);
907
908 meson_nfc_wait_cmd_fifo(nfc);
909}
910
911static int meson_nfc_dev_ready(struct mtd_info *mtd)
912{
913 struct nand_chip *chip = mtd_to_nand(mtd);
914 unsigned int time_out_cnt = 0;
915
916 chip->select_chip(mtd, 0);
917
918 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
919
920 do {
921 int status;
922
923 status = (int)chip->read_byte(mtd);
924 if (status & NAND_STATUS_READY)
925 break;
926 } while (time_out_cnt++ < NFC_DEV_READY_TICK_MAX);
927
928 return time_out_cnt != NFC_DEV_READY_TICK_MAX;
929}
930
931static int meson_chip_buffer_init(struct nand_chip *nand)
932{
933 const struct mtd_info *mtd = nand_to_mtd(nand);
934 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
935 u32 page_bytes, info_bytes, nsectors;
936 unsigned long tmp_addr;
937
938 nsectors = mtd->writesize / nand->ecc.size;
939
940 page_bytes = mtd->writesize + mtd->oobsize;
941 info_bytes = nsectors * PER_INFO_BYTE;
942
943 meson_chip->data_buf = dma_alloc_coherent(page_bytes, &tmp_addr);
944 if (!meson_chip->data_buf)
945 return -ENOMEM;
946
947 meson_chip->info_buf = dma_alloc_coherent(info_bytes, &tmp_addr);
948 if (!meson_chip->info_buf) {
949 dma_free_coherent(meson_chip->data_buf);
950 return -ENOMEM;
951 }
952
953 return 0;
954}
955
956static const int axg_stepinfo_strengths[] = { 8 };
957static const struct nand_ecc_step_info axg_stepinfo_1024 = {
958 .stepsize = 1024,
959 .strengths = axg_stepinfo_strengths,
960 .nstrengths = ARRAY_SIZE(axg_stepinfo_strengths)
961};
962
963static const struct nand_ecc_step_info axg_stepinfo_512 = {
964 .stepsize = 512,
965 .strengths = axg_stepinfo_strengths,
966 .nstrengths = ARRAY_SIZE(axg_stepinfo_strengths)
967};
968
969static const struct nand_ecc_step_info axg_stepinfo[] = { axg_stepinfo_1024, axg_stepinfo_512 };
970
971static const struct nand_ecc_caps meson_axg_ecc_caps = {
972 .stepinfos = axg_stepinfo,
973 .nstepinfos = ARRAY_SIZE(axg_stepinfo),
974 .calc_ecc_bytes = meson_nand_calc_ecc_bytes,
975};
976
977/*
978 * OOB layout:
979 *
980 * For ECC with 512 bytes step size:
981 * 0x00: AA AA BB BB BB BB BB BB BB BB BB BB BB BB BB BB
982 * 0x10: AA AA CC CC CC CC CC CC CC CC CC CC CC CC CC CC
983 * 0x20:
984 * 0x30:
985 *
986 * For ECC with 1024 bytes step size:
987 * 0x00: AA AA BB BB BB BB BB BB BB BB BB BB BB BB BB BB
988 * 0x10: AA AA CC CC CC CC CC CC CC CC CC CC CC CC CC CC
989 * 0x20: AA AA DD DD DD DD DD DD DD DD DD DD DD DD DD DD
990 * 0x30: AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE
991 *
992 * AA - user bytes.
993 * BB, CC, DD, EE - ECC code bytes for each step.
994 */
995static struct nand_ecclayout nand_oob;
996
997static void meson_nfc_init_nand_oob(struct nand_chip *nand)
998{
999 int section_size = 2 + nand->ecc.bytes;
1000 int i;
1001 int k;
1002
1003 nand_oob.eccbytes = nand->ecc.steps * nand->ecc.bytes;
1004 k = 0;
1005
1006 for (i = 0; i < nand->ecc.steps; i++) {
1007 int j;
1008
1009 for (j = 0; j < nand->ecc.bytes; j++)
1010 nand_oob.eccpos[k++] = (i * section_size) + 2 + j;
1011
1012 nand_oob.oobfree[i].offset = (i * section_size);
1013 nand_oob.oobfree[i].length = 2;
1014 }
1015
1016 nand_oob.oobavail = 2 * nand->ecc.steps;
1017 nand->ecc.layout = &nand_oob;
1018}
1019
1020static int meson_nfc_init_ecc(struct nand_chip *nand, ofnode node)
1021{
1022 const struct mtd_info *mtd = nand_to_mtd(nand);
1023 int ret;
1024 int i;
1025
1026 ret = nand_check_ecc_caps(nand, &meson_axg_ecc_caps, mtd->oobsize - 2);
1027 if (ret)
1028 return ret;
1029
1030 for (i = 0; i < ARRAY_SIZE(meson_ecc); i++) {
1031 if (meson_ecc[i].strength == nand->ecc.strength &&
1032 meson_ecc[i].size == nand->ecc.size) {
1033 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
1034
1035 nand->ecc.steps = mtd->writesize / nand->ecc.size;
1036 meson_chip->bch_mode = meson_ecc[i].bch;
1037
1038 meson_nfc_init_nand_oob(nand);
1039
1040 return 0;
1041 }
1042 }
1043
1044 return -EINVAL;
1045}
1046
1047static int meson_nfc_nand_chip_init(struct udevice *dev, struct meson_nfc *nfc,
1048 ofnode node)
1049{
1050 struct meson_nfc_nand_chip *meson_chip;
1051 struct nand_chip *nand;
1052 struct mtd_info *mtd;
1053 u32 cs[MAX_CE_NUM];
1054 u32 nsels;
1055 int ret;
1056 int i;
1057
1058 if (!ofnode_get_property(node, "reg", &nsels)) {
1059 dev_err(dev, "\"reg\" property is not found\n");
1060 return -ENODEV;
1061 }
1062
1063 nsels /= sizeof(u32);
1064 if (nsels >= MAX_CE_NUM) {
1065 dev_err(dev, "invalid size of CS array, max is %d\n",
1066 MAX_CE_NUM);
1067 return -EINVAL;
1068 }
1069
1070 ret = ofnode_read_u32_array(node, "reg", cs, nsels);
1071 if (ret < 0) {
1072 dev_err(dev, "failed to read \"reg\" property\n");
1073 return ret;
1074 }
1075
1076 for (i = 0; i < nsels; i++) {
1077 if (test_and_set_bit(cs[i], &nfc->assigned_cs)) {
1078 dev_err(dev, "CS %d already assigned\n", cs[i]);
1079 return -EINVAL;
1080 }
1081 }
1082
1083 meson_chip = malloc(sizeof(*meson_chip) + nsels * sizeof(meson_chip->sels[0]));
1084 if (!meson_chip) {
1085 dev_err(dev, "failed to allocate memory for chip\n");
1086 return -ENOMEM;
1087 }
1088
1089 meson_chip->nsels = nsels;
1090 nand = &meson_chip->nand;
1091
1092 nand->flash_node = node;
1093 nand_set_controller_data(nand, nfc);
1094 /* Set the driver entry points for MTD */
1095 nand->cmdfunc = meson_nfc_nand_cmd_function;
1096 nand->cmd_ctrl = meson_nfc_cmd_ctrl;
1097 nand->select_chip = meson_nfc_nand_select_chip;
1098 nand->read_byte = meson_nfc_nand_read_byte;
1099 nand->write_byte = meson_nfc_nand_write_byte;
1100 nand->dev_ready = meson_nfc_dev_ready;
1101
1102 /* Buffer read/write routines */
1103 nand->read_buf = meson_nfc_read_buf;
1104 nand->write_buf = meson_nfc_write_buf;
1105 nand->options |= NAND_NO_SUBPAGE_WRITE;
1106
1107 nand->ecc.mode = NAND_ECC_HW;
1108 nand->ecc.hwctl = NULL;
1109 nand->ecc.read_page = meson_nfc_read_page_hwecc;
1110 nand->ecc.write_page = meson_nfc_write_page_hwecc;
1111 nand->ecc.read_page_raw = meson_nfc_read_page_raw;
1112 nand->ecc.write_page_raw = meson_nfc_write_page_raw;
1113
1114 nand->ecc.read_oob = meson_nfc_read_oob;
1115 nand->ecc.write_oob = meson_nfc_write_oob;
1116 nand->ecc.read_oob_raw = meson_nfc_read_oob_raw;
1117 nand->ecc.write_oob_raw = meson_nfc_write_oob_raw;
1118
1119 nand->ecc.algo = NAND_ECC_BCH;
1120
1121 mtd = nand_to_mtd(nand);
1122
1123 ret = nand_scan_ident(mtd, 1, NULL);
1124 if (ret) {
1125 dev_err(dev, "'nand_scan_ident()' failed: %d\n", ret);
1126 goto err_chip_free;
1127 }
1128
1129 ret = meson_nfc_init_ecc(nand, node);
1130 if (ret) {
1131 dev_err(dev, "failed to init ECC settings: %d\n", ret);
1132 goto err_chip_free;
1133 }
1134
1135 ret = meson_chip_buffer_init(nand);
1136 if (ret) {
1137 dev_err(dev, "failed to init DMA buffers: %d\n", ret);
1138 goto err_chip_free;
1139 }
1140
1141 /* 'nand_scan_tail()' needs ECC parameters to be already
1142 * set and correct.
1143 */
1144 ret = nand_scan_tail(mtd);
1145 if (ret) {
1146 dev_err(dev, "'nand_scan_tail()' failed: %d\n", ret);
1147 goto err_chip_buf_free;
1148 }
1149
Arseniy Krasnovd72b0132024-08-26 16:17:10 +03001150 if (nand->options & NAND_IS_BOOT_MEDIUM) {
1151 ret = ofnode_read_u32(node, "amlogic,boot-pages",
1152 &meson_chip->boot_pages);
1153 if (ret) {
1154 dev_err(dev, "could not retrieve 'amlogic,boot-pages' property: %d",
1155 ret);
1156 goto err_chip_buf_free;
1157 }
1158
1159 ret = ofnode_read_u32(node, "amlogic,boot-page-step",
1160 &meson_chip->boot_page_step);
1161 if (ret) {
1162 dev_err(dev, "could not retrieve 'amlogic,boot-page-step' property: %d",
1163 ret);
1164 goto err_chip_buf_free;
1165 }
1166 }
1167
Arseniy Krasnov55842b42024-02-11 01:39:27 +03001168 ret = nand_register(0, mtd);
1169 if (ret) {
1170 dev_err(dev, "'nand_register()' failed: %d\n", ret);
1171 goto err_chip_buf_free;
1172 }
1173
1174 list_add_tail(&meson_chip->node, &nfc->chips);
1175
1176 return 0;
1177
1178err_chip_buf_free:
1179 dma_free_coherent(meson_chip->info_buf);
1180 dma_free_coherent(meson_chip->data_buf);
1181
1182err_chip_free:
1183 free(meson_chip);
1184
1185 return ret;
1186}
1187
1188static int meson_nfc_nand_chips_init(struct udevice *dev,
1189 struct meson_nfc *nfc)
1190{
1191 ofnode parent = dev_ofnode(dev);
1192 ofnode node;
1193
1194 ofnode_for_each_subnode(node, parent) {
1195 int ret = meson_nfc_nand_chip_init(dev, nfc, node);
1196
1197 if (ret)
1198 return ret;
1199 }
1200
1201 return 0;
1202}
1203
1204static void meson_nfc_clk_init(struct meson_nfc *nfc)
1205{
1206 u32 bus_cycle = NFC_DEFAULT_BUS_CYCLE;
1207 u32 bus_timing = NFC_DEFAULT_BUS_TIMING;
1208 u32 bus_cfg_val;
1209
1210 writel(CLK_ALWAYS_ON_NAND | CLK_SELECT_NAND | CLK_ENABLE_VALUE, nfc->reg_clk);
1211 writel(0, nfc->reg_base + NFC_REG_CFG);
1212
1213 bus_cfg_val = (((bus_cycle - 1) & 31) | ((bus_timing & 31) << 5));
1214 writel(bus_cfg_val, nfc->reg_base + NFC_REG_CFG);
1215 writel(BIT(31), nfc->reg_base + NFC_REG_CMD);
1216}
1217
1218static int meson_probe(struct udevice *dev)
1219{
1220 struct meson_nfc *nfc = dev_get_priv(dev);
1221 void *addr;
1222 int ret;
1223
1224 addr = dev_read_addr_ptr(dev);
1225 if (!addr) {
1226 dev_err(dev, "base register address not found\n");
1227 return -EINVAL;
1228 }
1229
1230 nfc->reg_base = addr;
1231
1232 addr = dev_read_addr_index_ptr(dev, 1);
1233 if (!addr) {
1234 dev_err(dev, "clk register address not found\n");
1235 return -EINVAL;
1236 }
1237
1238 nfc->reg_clk = addr;
1239 nfc->dev = dev;
1240
1241 meson_nfc_clk_init(nfc);
1242
1243 ret = meson_nfc_nand_chips_init(dev, nfc);
1244 if (ret) {
1245 dev_err(nfc->dev, "failed to init chips\n");
1246 return ret;
1247 }
1248
1249 return 0;
1250}
1251
1252static const struct udevice_id meson_nand_dt_ids[] = {
1253 {.compatible = "amlogic,meson-axg-nfc",},
1254 { /* sentinel */ }
1255};
1256
1257U_BOOT_DRIVER(meson_nand) = {
1258 .name = "meson_nand",
1259 .id = UCLASS_MTD,
1260 .of_match = meson_nand_dt_ids,
1261 .probe = meson_probe,
1262 .priv_auto = sizeof(struct meson_nfc),
1263};
1264
1265void board_nand_init(void)
1266{
1267 struct udevice *dev;
1268 int ret;
1269
1270 ret = uclass_get_device_by_driver(UCLASS_MTD,
1271 DM_DRIVER_GET(meson_nand), &dev);
1272
1273 if (ret && ret != -ENODEV)
1274 pr_err("Failed to initialize: %d\n", ret);
1275}