blob: 28c851f103b63b6eeb967e415404f28c8baeeb90 [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);
621
622 if (oob_required)
623 meson_nfc_set_user_byte(chip, chip->oob_poi);
624
625 return meson_nfc_write_page_sub(chip, page, false);
626}
627
628static void meson_nfc_check_ecc_pages_valid(struct meson_nfc *nfc,
629 struct nand_chip *nand, bool raw)
630{
631 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
632 __le64 *info;
633 u32 neccpages;
634 int ret;
635
636 neccpages = raw ? 1 : nand->ecc.steps;
637 info = &meson_chip->info_buf[neccpages - 1];
638 do {
639 udelay(ECC_POLL_TIMEOUT_US);
640 /* info is updated by nfc dma engine*/
641 rmb();
642 invalidate_dcache_range(nfc->iaddr, nfc->iaddr + nfc->info_bytes);
643 ret = *info & ECC_COMPLETE;
644 } while (!ret);
645}
646
647static int meson_nfc_read_page_sub(struct nand_chip *nand,
648 int page, bool raw)
649{
650 struct mtd_info *mtd = nand_to_mtd(nand);
651 struct meson_nfc *nfc = nand_get_controller_data(nand);
652 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
653 u32 data_len, info_len;
654 int ret;
655
656 data_len = mtd->writesize + mtd->oobsize;
657 info_len = nand->ecc.steps * PER_INFO_BYTE;
658
659 ret = meson_nfc_dma_buffer_setup(nand, meson_chip->data_buf, data_len,
660 meson_chip->info_buf, info_len,
661 DMA_FROM_DEVICE);
662 if (ret)
663 return ret;
664
Arseniy Krasnov6f95fea2024-08-26 16:17:09 +0300665 meson_nfc_cmd_access(nand, raw, DIRREAD, page);
Arseniy Krasnov55842b42024-02-11 01:39:27 +0300666
667 meson_nfc_wait_dma_finish(nfc);
668 meson_nfc_check_ecc_pages_valid(nfc, nand, raw);
669
670 meson_nfc_dma_buffer_release(nand, data_len, info_len,
671 DMA_FROM_DEVICE);
672
673 return 0;
674}
675
676static int meson_nfc_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
677 u8 *buf, int oob_required, int page)
678{
679 int ret;
680
681 ret = meson_nfc_read_page_sub(chip, page, true);
682 if (ret)
683 return ret;
684
685 meson_nfc_get_data_oob(chip, buf, oob_required ? chip->oob_poi : NULL);
686
687 return 0;
688}
689
690static int meson_nfc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
691 u8 *buf, int oob_required, int page)
692{
693 const struct meson_nfc_nand_chip *meson_chip = to_meson_nand(chip);
694 u64 correct_bitmap = 0;
695 u32 bitflips = 0;
696 int ret;
697
698 ret = meson_nfc_read_page_sub(chip, page, false);
699 if (ret)
700 return ret;
701
702 if (oob_required)
703 meson_nfc_get_user_byte(chip, chip->oob_poi);
704
705 ret = meson_nfc_ecc_correct(chip, &bitflips, &correct_bitmap);
706
707 if (ret == ECC_CHECK_RETURN_FF) {
708 if (buf)
709 memset(buf, 0xff, mtd->writesize);
710
711 if (oob_required)
712 memset(chip->oob_poi, 0xff, mtd->oobsize);
713 } else if (ret < 0) {
714 struct nand_ecc_ctrl *ecc;
715 int i;
716
717 if ((chip->options & NAND_NEED_SCRAMBLING) || !buf) {
718 mtd->ecc_stats.failed++;
719 return bitflips;
720 }
721
722 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
723
724 ret = meson_nfc_read_page_raw(mtd, chip, buf, 1, page);
725 if (ret)
726 return ret;
727
728 ecc = &chip->ecc;
729
730 for (i = 0; i < chip->ecc.steps ; i++) {
731 u8 *data = buf + i * ecc->size;
732 u8 *oob = chip->oob_poi + i * (ecc->bytes + 2);
733
734 if (correct_bitmap & BIT_ULL(i))
735 continue;
736
737 ret = nand_check_erased_ecc_chunk(data, ecc->size,
738 oob, ecc->bytes + 2,
739 NULL, 0,
740 ecc->strength);
741 if (ret < 0) {
742 mtd->ecc_stats.failed++;
743 } else {
744 mtd->ecc_stats.corrected += ret;
745 bitflips = max_t(u32, bitflips, ret);
746 }
747 }
748 } else if (buf && buf != meson_chip->data_buf) {
749 memcpy(buf, meson_chip->data_buf, mtd->writesize);
750 }
751
752 return bitflips;
753}
754
755static int meson_nfc_read_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
756 int page)
757{
758 int ret;
759
760 ret = nand_read_page_op(chip, page, 0, NULL, 0);
761 if (ret)
762 return ret;
763
764 return meson_nfc_read_page_raw(mtd, chip, NULL, 1, page);
765}
766
767static int meson_nfc_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
768 int page)
769{
770 int ret;
771
772 ret = nand_read_page_op(chip, page, 0, NULL, 0);
773 if (ret)
774 return ret;
775
776 return meson_nfc_read_page_hwecc(mtd, chip, NULL, 1, page);
777}
778
779static int meson_nfc_write_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,
780 int page)
781{
782 int ret;
783
784 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
785 if (ret)
786 return ret;
787
788 ret = meson_nfc_write_page_raw(mtd, chip, NULL, 1, page);
789 if (ret)
790 return ret;
791
792 return nand_prog_page_end_op(chip);
793}
794
795static int meson_nfc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
796 int page)
797{
798 int ret;
799
800 ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0);
801 if (ret)
802 return ret;
803
804 ret = meson_nfc_write_page_hwecc(mtd, chip, NULL, 1, page);
805 if (ret)
806 return ret;
807
808 return nand_prog_page_end_op(chip);
809}
810
811static void meson_nfc_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
812 int column, int page_addr)
813{
814 struct nand_chip *chip = mtd_to_nand(mtd);
815
816 chip->cmd_ctrl(mtd, command, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
817
818 if (column != -1 || page_addr != -1) {
819 int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
820
821 /* Serially input address */
822 if (column != -1) {
823 /* Adjust columns for 16 bit buswidth */
824 if (chip->options & NAND_BUSWIDTH_16 &&
825 !nand_opcode_8bits(command))
826 column >>= 1;
827
828 chip->cmd_ctrl(mtd, column, ctrl);
829 ctrl &= ~NAND_CTRL_CHANGE;
830 /* Only output a single addr cycle for 8bits
831 * opcodes.
832 */
833 if (!nand_opcode_8bits(command))
834 chip->cmd_ctrl(mtd, column >> 8, ctrl);
835 }
836
837 if (page_addr != -1) {
838 chip->cmd_ctrl(mtd, page_addr, ctrl);
839 chip->cmd_ctrl(mtd, page_addr >> 8, NAND_NCE |
840 NAND_ALE);
841 /* One more address cycle for devices > 128MiB */
842 if (chip->chipsize > SZ_128M)
843 chip->cmd_ctrl(mtd, page_addr >> 16,
844 NAND_NCE | NAND_ALE);
845 }
846
847 switch (command) {
848 case NAND_CMD_READ0:
849 chip->cmd_ctrl(mtd, NAND_CMD_READSTART,
850 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
851 fallthrough;
852 case NAND_CMD_PARAM:
853 nand_wait_ready(mtd);
854 nand_exit_status_op(chip);
855 }
856 }
857}
858
859static void meson_nfc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
860{
861 struct nand_chip *nand = mtd_to_nand(mtd);
862 struct meson_nfc *nfc = nand_get_controller_data(nand);
863
864 if (cmd == NAND_CMD_NONE)
865 return;
866
867 if (ctrl & NAND_CLE)
868 cmd = NFC_CMD_MAKE_CLE(nfc->param.chip_select, cmd);
869 else
870 cmd = NFC_CMD_MAKE_ALE(nfc->param.chip_select, cmd);
871
872 writel(cmd, nfc->reg_base + NFC_REG_CMD);
873}
874
875static void meson_nfc_wait_cmd_fifo(struct meson_nfc *nfc)
876{
877 while ((NFC_GET_CMD(nfc) >> 22) & GENMASK(4, 0))
878 ;
879}
880
881static u8 meson_nfc_nand_read_byte(struct mtd_info *mtd)
882{
883 struct nand_chip *nand = mtd_to_nand(mtd);
884 struct meson_nfc *nfc = nand_get_controller_data(nand);
885
886 writel(NFC_CMD_MAKE_DRD(nfc->param.chip_select, 0), nfc->reg_base + NFC_REG_CMD);
887
888 meson_nfc_cmd_idle(nfc, NAND_TWB_TIME_CYCLE);
889 meson_nfc_cmd_idle(nfc, 0);
890 meson_nfc_cmd_idle(nfc, 0);
891
892 meson_nfc_wait_cmd_fifo(nfc);
893
894 return readl(nfc->reg_base + NFC_REG_BUF);
895}
896
897static void meson_nfc_nand_write_byte(struct mtd_info *mtd, u8 val)
898{
899 struct nand_chip *nand = mtd_to_nand(mtd);
900 struct meson_nfc *nfc = nand_get_controller_data(nand);
901
902 meson_nfc_cmd_idle(nfc, NAND_TWB_TIME_CYCLE);
903
904 writel(NFC_CMD_MAKE_DWR(nfc->param.chip_select, val), nfc->reg_base + NFC_REG_CMD);
905
906 meson_nfc_cmd_idle(nfc, NAND_TWB_TIME_CYCLE);
907 meson_nfc_cmd_idle(nfc, 0);
908 meson_nfc_cmd_idle(nfc, 0);
909
910 meson_nfc_wait_cmd_fifo(nfc);
911}
912
913static int meson_nfc_dev_ready(struct mtd_info *mtd)
914{
915 struct nand_chip *chip = mtd_to_nand(mtd);
916 unsigned int time_out_cnt = 0;
917
918 chip->select_chip(mtd, 0);
919
920 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
921
922 do {
923 int status;
924
925 status = (int)chip->read_byte(mtd);
926 if (status & NAND_STATUS_READY)
927 break;
928 } while (time_out_cnt++ < NFC_DEV_READY_TICK_MAX);
929
930 return time_out_cnt != NFC_DEV_READY_TICK_MAX;
931}
932
933static int meson_chip_buffer_init(struct nand_chip *nand)
934{
935 const struct mtd_info *mtd = nand_to_mtd(nand);
936 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
937 u32 page_bytes, info_bytes, nsectors;
938 unsigned long tmp_addr;
939
940 nsectors = mtd->writesize / nand->ecc.size;
941
942 page_bytes = mtd->writesize + mtd->oobsize;
943 info_bytes = nsectors * PER_INFO_BYTE;
944
945 meson_chip->data_buf = dma_alloc_coherent(page_bytes, &tmp_addr);
946 if (!meson_chip->data_buf)
947 return -ENOMEM;
948
949 meson_chip->info_buf = dma_alloc_coherent(info_bytes, &tmp_addr);
950 if (!meson_chip->info_buf) {
951 dma_free_coherent(meson_chip->data_buf);
952 return -ENOMEM;
953 }
954
955 return 0;
956}
957
958static const int axg_stepinfo_strengths[] = { 8 };
959static const struct nand_ecc_step_info axg_stepinfo_1024 = {
960 .stepsize = 1024,
961 .strengths = axg_stepinfo_strengths,
962 .nstrengths = ARRAY_SIZE(axg_stepinfo_strengths)
963};
964
965static const struct nand_ecc_step_info axg_stepinfo_512 = {
966 .stepsize = 512,
967 .strengths = axg_stepinfo_strengths,
968 .nstrengths = ARRAY_SIZE(axg_stepinfo_strengths)
969};
970
971static const struct nand_ecc_step_info axg_stepinfo[] = { axg_stepinfo_1024, axg_stepinfo_512 };
972
973static const struct nand_ecc_caps meson_axg_ecc_caps = {
974 .stepinfos = axg_stepinfo,
975 .nstepinfos = ARRAY_SIZE(axg_stepinfo),
976 .calc_ecc_bytes = meson_nand_calc_ecc_bytes,
977};
978
979/*
980 * OOB layout:
981 *
982 * For ECC with 512 bytes step size:
983 * 0x00: AA AA BB BB BB BB BB BB BB BB BB BB BB BB BB BB
984 * 0x10: AA AA CC CC CC CC CC CC CC CC CC CC CC CC CC CC
985 * 0x20:
986 * 0x30:
987 *
988 * For ECC with 1024 bytes step size:
989 * 0x00: AA AA BB BB BB BB BB BB BB BB BB BB BB BB BB BB
990 * 0x10: AA AA CC CC CC CC CC CC CC CC CC CC CC CC CC CC
991 * 0x20: AA AA DD DD DD DD DD DD DD DD DD DD DD DD DD DD
992 * 0x30: AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE
993 *
994 * AA - user bytes.
995 * BB, CC, DD, EE - ECC code bytes for each step.
996 */
997static struct nand_ecclayout nand_oob;
998
999static void meson_nfc_init_nand_oob(struct nand_chip *nand)
1000{
1001 int section_size = 2 + nand->ecc.bytes;
1002 int i;
1003 int k;
1004
1005 nand_oob.eccbytes = nand->ecc.steps * nand->ecc.bytes;
1006 k = 0;
1007
1008 for (i = 0; i < nand->ecc.steps; i++) {
1009 int j;
1010
1011 for (j = 0; j < nand->ecc.bytes; j++)
1012 nand_oob.eccpos[k++] = (i * section_size) + 2 + j;
1013
1014 nand_oob.oobfree[i].offset = (i * section_size);
1015 nand_oob.oobfree[i].length = 2;
1016 }
1017
1018 nand_oob.oobavail = 2 * nand->ecc.steps;
1019 nand->ecc.layout = &nand_oob;
1020}
1021
1022static int meson_nfc_init_ecc(struct nand_chip *nand, ofnode node)
1023{
1024 const struct mtd_info *mtd = nand_to_mtd(nand);
1025 int ret;
1026 int i;
1027
1028 ret = nand_check_ecc_caps(nand, &meson_axg_ecc_caps, mtd->oobsize - 2);
1029 if (ret)
1030 return ret;
1031
1032 for (i = 0; i < ARRAY_SIZE(meson_ecc); i++) {
1033 if (meson_ecc[i].strength == nand->ecc.strength &&
1034 meson_ecc[i].size == nand->ecc.size) {
1035 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
1036
1037 nand->ecc.steps = mtd->writesize / nand->ecc.size;
1038 meson_chip->bch_mode = meson_ecc[i].bch;
1039
1040 meson_nfc_init_nand_oob(nand);
1041
1042 return 0;
1043 }
1044 }
1045
1046 return -EINVAL;
1047}
1048
1049static int meson_nfc_nand_chip_init(struct udevice *dev, struct meson_nfc *nfc,
1050 ofnode node)
1051{
1052 struct meson_nfc_nand_chip *meson_chip;
1053 struct nand_chip *nand;
1054 struct mtd_info *mtd;
1055 u32 cs[MAX_CE_NUM];
1056 u32 nsels;
1057 int ret;
1058 int i;
1059
1060 if (!ofnode_get_property(node, "reg", &nsels)) {
1061 dev_err(dev, "\"reg\" property is not found\n");
1062 return -ENODEV;
1063 }
1064
1065 nsels /= sizeof(u32);
1066 if (nsels >= MAX_CE_NUM) {
1067 dev_err(dev, "invalid size of CS array, max is %d\n",
1068 MAX_CE_NUM);
1069 return -EINVAL;
1070 }
1071
1072 ret = ofnode_read_u32_array(node, "reg", cs, nsels);
1073 if (ret < 0) {
1074 dev_err(dev, "failed to read \"reg\" property\n");
1075 return ret;
1076 }
1077
1078 for (i = 0; i < nsels; i++) {
1079 if (test_and_set_bit(cs[i], &nfc->assigned_cs)) {
1080 dev_err(dev, "CS %d already assigned\n", cs[i]);
1081 return -EINVAL;
1082 }
1083 }
1084
1085 meson_chip = malloc(sizeof(*meson_chip) + nsels * sizeof(meson_chip->sels[0]));
1086 if (!meson_chip) {
1087 dev_err(dev, "failed to allocate memory for chip\n");
1088 return -ENOMEM;
1089 }
1090
1091 meson_chip->nsels = nsels;
1092 nand = &meson_chip->nand;
1093
1094 nand->flash_node = node;
1095 nand_set_controller_data(nand, nfc);
1096 /* Set the driver entry points for MTD */
1097 nand->cmdfunc = meson_nfc_nand_cmd_function;
1098 nand->cmd_ctrl = meson_nfc_cmd_ctrl;
1099 nand->select_chip = meson_nfc_nand_select_chip;
1100 nand->read_byte = meson_nfc_nand_read_byte;
1101 nand->write_byte = meson_nfc_nand_write_byte;
1102 nand->dev_ready = meson_nfc_dev_ready;
1103
1104 /* Buffer read/write routines */
1105 nand->read_buf = meson_nfc_read_buf;
1106 nand->write_buf = meson_nfc_write_buf;
1107 nand->options |= NAND_NO_SUBPAGE_WRITE;
1108
1109 nand->ecc.mode = NAND_ECC_HW;
1110 nand->ecc.hwctl = NULL;
1111 nand->ecc.read_page = meson_nfc_read_page_hwecc;
1112 nand->ecc.write_page = meson_nfc_write_page_hwecc;
1113 nand->ecc.read_page_raw = meson_nfc_read_page_raw;
1114 nand->ecc.write_page_raw = meson_nfc_write_page_raw;
1115
1116 nand->ecc.read_oob = meson_nfc_read_oob;
1117 nand->ecc.write_oob = meson_nfc_write_oob;
1118 nand->ecc.read_oob_raw = meson_nfc_read_oob_raw;
1119 nand->ecc.write_oob_raw = meson_nfc_write_oob_raw;
1120
1121 nand->ecc.algo = NAND_ECC_BCH;
1122
1123 mtd = nand_to_mtd(nand);
1124
1125 ret = nand_scan_ident(mtd, 1, NULL);
1126 if (ret) {
1127 dev_err(dev, "'nand_scan_ident()' failed: %d\n", ret);
1128 goto err_chip_free;
1129 }
1130
1131 ret = meson_nfc_init_ecc(nand, node);
1132 if (ret) {
1133 dev_err(dev, "failed to init ECC settings: %d\n", ret);
1134 goto err_chip_free;
1135 }
1136
1137 ret = meson_chip_buffer_init(nand);
1138 if (ret) {
1139 dev_err(dev, "failed to init DMA buffers: %d\n", ret);
1140 goto err_chip_free;
1141 }
1142
1143 /* 'nand_scan_tail()' needs ECC parameters to be already
1144 * set and correct.
1145 */
1146 ret = nand_scan_tail(mtd);
1147 if (ret) {
1148 dev_err(dev, "'nand_scan_tail()' failed: %d\n", ret);
1149 goto err_chip_buf_free;
1150 }
1151
Arseniy Krasnovd72b0132024-08-26 16:17:10 +03001152 if (nand->options & NAND_IS_BOOT_MEDIUM) {
1153 ret = ofnode_read_u32(node, "amlogic,boot-pages",
1154 &meson_chip->boot_pages);
1155 if (ret) {
1156 dev_err(dev, "could not retrieve 'amlogic,boot-pages' property: %d",
1157 ret);
1158 goto err_chip_buf_free;
1159 }
1160
1161 ret = ofnode_read_u32(node, "amlogic,boot-page-step",
1162 &meson_chip->boot_page_step);
1163 if (ret) {
1164 dev_err(dev, "could not retrieve 'amlogic,boot-page-step' property: %d",
1165 ret);
1166 goto err_chip_buf_free;
1167 }
1168 }
1169
Arseniy Krasnov55842b42024-02-11 01:39:27 +03001170 ret = nand_register(0, mtd);
1171 if (ret) {
1172 dev_err(dev, "'nand_register()' failed: %d\n", ret);
1173 goto err_chip_buf_free;
1174 }
1175
1176 list_add_tail(&meson_chip->node, &nfc->chips);
1177
1178 return 0;
1179
1180err_chip_buf_free:
1181 dma_free_coherent(meson_chip->info_buf);
1182 dma_free_coherent(meson_chip->data_buf);
1183
1184err_chip_free:
1185 free(meson_chip);
1186
1187 return ret;
1188}
1189
1190static int meson_nfc_nand_chips_init(struct udevice *dev,
1191 struct meson_nfc *nfc)
1192{
1193 ofnode parent = dev_ofnode(dev);
1194 ofnode node;
1195
1196 ofnode_for_each_subnode(node, parent) {
1197 int ret = meson_nfc_nand_chip_init(dev, nfc, node);
1198
1199 if (ret)
1200 return ret;
1201 }
1202
1203 return 0;
1204}
1205
1206static void meson_nfc_clk_init(struct meson_nfc *nfc)
1207{
1208 u32 bus_cycle = NFC_DEFAULT_BUS_CYCLE;
1209 u32 bus_timing = NFC_DEFAULT_BUS_TIMING;
1210 u32 bus_cfg_val;
1211
1212 writel(CLK_ALWAYS_ON_NAND | CLK_SELECT_NAND | CLK_ENABLE_VALUE, nfc->reg_clk);
1213 writel(0, nfc->reg_base + NFC_REG_CFG);
1214
1215 bus_cfg_val = (((bus_cycle - 1) & 31) | ((bus_timing & 31) << 5));
1216 writel(bus_cfg_val, nfc->reg_base + NFC_REG_CFG);
1217 writel(BIT(31), nfc->reg_base + NFC_REG_CMD);
1218}
1219
1220static int meson_probe(struct udevice *dev)
1221{
1222 struct meson_nfc *nfc = dev_get_priv(dev);
1223 void *addr;
1224 int ret;
1225
1226 addr = dev_read_addr_ptr(dev);
1227 if (!addr) {
1228 dev_err(dev, "base register address not found\n");
1229 return -EINVAL;
1230 }
1231
1232 nfc->reg_base = addr;
1233
1234 addr = dev_read_addr_index_ptr(dev, 1);
1235 if (!addr) {
1236 dev_err(dev, "clk register address not found\n");
1237 return -EINVAL;
1238 }
1239
1240 nfc->reg_clk = addr;
1241 nfc->dev = dev;
1242
1243 meson_nfc_clk_init(nfc);
1244
1245 ret = meson_nfc_nand_chips_init(dev, nfc);
1246 if (ret) {
1247 dev_err(nfc->dev, "failed to init chips\n");
1248 return ret;
1249 }
1250
1251 return 0;
1252}
1253
1254static const struct udevice_id meson_nand_dt_ids[] = {
1255 {.compatible = "amlogic,meson-axg-nfc",},
1256 { /* sentinel */ }
1257};
1258
1259U_BOOT_DRIVER(meson_nand) = {
1260 .name = "meson_nand",
1261 .id = UCLASS_MTD,
1262 .of_match = meson_nand_dt_ids,
1263 .probe = meson_probe,
1264 .priv_auto = sizeof(struct meson_nfc),
1265};
1266
1267void board_nand_init(void)
1268{
1269 struct udevice *dev;
1270 int ret;
1271
1272 ret = uclass_get_device_by_driver(UCLASS_MTD,
1273 DM_DRIVER_GET(meson_nand), &dev);
1274
1275 if (ret && ret != -ENODEV)
1276 pr_err("Failed to initialize: %d\n", ret);
1277}