1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
3 * Copyright (C) STMicroelectronics 2020
6 #define LOG_CATEGORY UCLASS_NOP
11 #include <dm/device_compat.h>
12 #include <linux/bitfield.h>
13 #include <linux/err.h>
14 #include <linux/iopoll.h>
15 #include <linux/ioport.h>
16 #include <linux/time.h>
18 /* FMC2 Controller Registers */
21 #define FMC2_BCR(x) ((x) * 0x8 + FMC2_BCR1)
22 #define FMC2_BTR(x) ((x) * 0x8 + FMC2_BTR1)
23 #define FMC2_PCSCNTR 0x20
24 #define FMC2_CFGR 0x20
26 #define FMC2_BWTR1 0x104
27 #define FMC2_BWTR(x) ((x) * 0x8 + FMC2_BWTR1)
28 #define FMC2_SECCFGR 0x300
29 #define FMC2_CIDCFGR0 0x30c
30 #define FMC2_CIDCFGR(x) ((x) * 0x8 + FMC2_CIDCFGR0)
31 #define FMC2_SEMCR0 0x310
32 #define FMC2_SEMCR(x) ((x) * 0x8 + FMC2_SEMCR0)
34 /* Register: FMC2_BCR1 */
35 #define FMC2_BCR1_CCLKEN BIT(20)
36 #define FMC2_BCR1_FMC2EN BIT(31)
38 /* Register: FMC2_BCRx */
39 #define FMC2_BCR_MBKEN BIT(0)
40 #define FMC2_BCR_MUXEN BIT(1)
41 #define FMC2_BCR_MTYP GENMASK(3, 2)
42 #define FMC2_BCR_MWID GENMASK(5, 4)
43 #define FMC2_BCR_FACCEN BIT(6)
44 #define FMC2_BCR_BURSTEN BIT(8)
45 #define FMC2_BCR_WAITPOL BIT(9)
46 #define FMC2_BCR_WAITCFG BIT(11)
47 #define FMC2_BCR_WREN BIT(12)
48 #define FMC2_BCR_WAITEN BIT(13)
49 #define FMC2_BCR_EXTMOD BIT(14)
50 #define FMC2_BCR_ASYNCWAIT BIT(15)
51 #define FMC2_BCR_CPSIZE GENMASK(18, 16)
52 #define FMC2_BCR_CBURSTRW BIT(19)
53 #define FMC2_BCR_CSCOUNT GENMASK(21, 20)
54 #define FMC2_BCR_NBLSET GENMASK(23, 22)
56 /* Register: FMC2_BTRx/FMC2_BWTRx */
57 #define FMC2_BXTR_ADDSET GENMASK(3, 0)
58 #define FMC2_BXTR_ADDHLD GENMASK(7, 4)
59 #define FMC2_BXTR_DATAST GENMASK(15, 8)
60 #define FMC2_BXTR_BUSTURN GENMASK(19, 16)
61 #define FMC2_BTR_CLKDIV GENMASK(23, 20)
62 #define FMC2_BTR_DATLAT GENMASK(27, 24)
63 #define FMC2_BXTR_ACCMOD GENMASK(29, 28)
64 #define FMC2_BXTR_DATAHLD GENMASK(31, 30)
66 /* Register: FMC2_PCSCNTR */
67 #define FMC2_PCSCNTR_CSCOUNT GENMASK(15, 0)
68 #define FMC2_PCSCNTR_CNTBEN(x) BIT((x) + 16)
70 /* Register: FMC2_CFGR */
71 #define FMC2_CFGR_CLKDIV GENMASK(19, 16)
72 #define FMC2_CFGR_CCLKEN BIT(20)
73 #define FMC2_CFGR_FMC2EN BIT(31)
75 /* Register: FMC2_SR */
76 #define FMC2_SR_ISOST GENMASK(1, 0)
78 /* Register: FMC2_CIDCFGR */
79 #define FMC2_CIDCFGR_CFEN BIT(0)
80 #define FMC2_CIDCFGR_SEMEN BIT(1)
81 #define FMC2_CIDCFGR_SCID GENMASK(6, 4)
82 #define FMC2_CIDCFGR_SEMWLC1 BIT(17)
84 /* Register: FMC2_SEMCR */
85 #define FMC2_SEMCR_SEM_MUTEX BIT(0)
86 #define FMC2_SEMCR_SEMCID GENMASK(6, 4)
88 #define FMC2_MAX_EBI_CE 4
89 #define FMC2_MAX_BANKS 5
90 #define FMC2_MAX_RESOURCES 6
93 #define FMC2_BCR_CPSIZE_0 0x0
94 #define FMC2_BCR_CPSIZE_128 0x1
95 #define FMC2_BCR_CPSIZE_256 0x2
96 #define FMC2_BCR_CPSIZE_512 0x3
97 #define FMC2_BCR_CPSIZE_1024 0x4
99 #define FMC2_BCR_MWID_8 0x0
100 #define FMC2_BCR_MWID_16 0x1
102 #define FMC2_BCR_MTYP_SRAM 0x0
103 #define FMC2_BCR_MTYP_PSRAM 0x1
104 #define FMC2_BCR_MTYP_NOR 0x2
106 #define FMC2_BCR_CSCOUNT_0 0x0
107 #define FMC2_BCR_CSCOUNT_1 0x1
108 #define FMC2_BCR_CSCOUNT_64 0x2
109 #define FMC2_BCR_CSCOUNT_256 0x3
111 #define FMC2_BXTR_EXTMOD_A 0x0
112 #define FMC2_BXTR_EXTMOD_B 0x1
113 #define FMC2_BXTR_EXTMOD_C 0x2
114 #define FMC2_BXTR_EXTMOD_D 0x3
116 #define FMC2_BCR_NBLSET_MAX 0x3
117 #define FMC2_BXTR_ADDSET_MAX 0xf
118 #define FMC2_BXTR_ADDHLD_MAX 0xf
119 #define FMC2_BXTR_DATAST_MAX 0xff
120 #define FMC2_BXTR_BUSTURN_MAX 0xf
121 #define FMC2_BXTR_DATAHLD_MAX 0x3
122 #define FMC2_BTR_CLKDIV_MAX 0xf
123 #define FMC2_BTR_DATLAT_MAX 0xf
124 #define FMC2_PCSCNTR_CSCOUNT_MAX 0xff
125 #define FMC2_CFGR_CLKDIV_MAX 0xf
127 enum stm32_fmc2_ebi_bank {
135 enum stm32_fmc2_ebi_register_type {
143 enum stm32_fmc2_ebi_transaction_type {
144 FMC2_ASYNC_MODE_1_SRAM = 0,
145 FMC2_ASYNC_MODE_1_PSRAM,
146 FMC2_ASYNC_MODE_A_SRAM,
147 FMC2_ASYNC_MODE_A_PSRAM,
148 FMC2_ASYNC_MODE_2_NOR,
149 FMC2_ASYNC_MODE_B_NOR,
150 FMC2_ASYNC_MODE_C_NOR,
151 FMC2_ASYNC_MODE_D_NOR,
152 FMC2_SYNC_READ_SYNC_WRITE_PSRAM,
153 FMC2_SYNC_READ_ASYNC_WRITE_PSRAM,
154 FMC2_SYNC_READ_SYNC_WRITE_NOR,
155 FMC2_SYNC_READ_ASYNC_WRITE_NOR
158 enum stm32_fmc2_ebi_buswidth {
160 FMC2_BUSWIDTH_16 = 16
163 enum stm32_fmc2_ebi_cpsize {
165 FMC2_CPSIZE_128 = 128,
166 FMC2_CPSIZE_256 = 256,
167 FMC2_CPSIZE_512 = 512,
168 FMC2_CPSIZE_1024 = 1024
171 enum stm32_fmc2_ebi_cscount {
174 FMC2_CSCOUNT_64 = 64,
175 FMC2_CSCOUNT_256 = 256
178 struct stm32_fmc2_ebi;
180 struct stm32_fmc2_ebi_data {
181 const struct stm32_fmc2_prop *child_props;
182 unsigned int nb_child_props;
185 int (*nwait_used_by_ctrls)(struct stm32_fmc2_ebi *ebi);
186 int (*check_rif)(struct stm32_fmc2_ebi *ebi, u32 resource);
189 struct stm32_fmc2_ebi {
192 const struct stm32_fmc2_ebi_data *data;
198 * struct stm32_fmc2_prop - STM32 FMC2 EBI property
199 * @name: the device tree binding name of the property
200 * @bprop: indicate that it is a boolean property
201 * @mprop: indicate that it is a mandatory property
202 * @reg_type: the register that have to be modified
203 * @reg_mask: the bit that have to be modified in the selected register
204 * in case of it is a boolean property
205 * @reset_val: the default value that have to be set in case the property
206 * has not been defined in the device tree
207 * @check: this callback ckecks that the property is compliant with the
208 * transaction type selected
209 * @calculate: this callback is called to calculate for exemple a timing
210 * set in nanoseconds in the device tree in clock cycles or in
212 * @set: this callback applies the values in the registers
214 struct stm32_fmc2_prop {
221 int (*check)(struct stm32_fmc2_ebi *ebi,
222 const struct stm32_fmc2_prop *prop, int cs);
223 u32 (*calculate)(struct stm32_fmc2_ebi *ebi, int cs, u32 setup);
224 int (*set)(struct stm32_fmc2_ebi *ebi,
225 const struct stm32_fmc2_prop *prop,
229 static int stm32_fmc2_ebi_check_mux(struct stm32_fmc2_ebi *ebi,
230 const struct stm32_fmc2_prop *prop,
233 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
235 if (bcr & FMC2_BCR_MTYP)
241 static int stm32_fmc2_ebi_check_waitcfg(struct stm32_fmc2_ebi *ebi,
242 const struct stm32_fmc2_prop *prop,
245 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
246 u32 val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
248 if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
254 static int stm32_fmc2_ebi_check_sync_trans(struct stm32_fmc2_ebi *ebi,
255 const struct stm32_fmc2_prop *prop,
258 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
260 if (bcr & FMC2_BCR_BURSTEN)
266 static int stm32_fmc2_ebi_mp25_check_cclk(struct stm32_fmc2_ebi *ebi,
267 const struct stm32_fmc2_prop *prop,
270 if (!ebi->access_granted)
273 return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
276 static int stm32_fmc2_ebi_mp25_check_clk_period(struct stm32_fmc2_ebi *ebi,
277 const struct stm32_fmc2_prop *prop,
280 u32 cfgr = readl(ebi->io_base + FMC2_CFGR);
282 if (cfgr & FMC2_CFGR_CCLKEN && !ebi->access_granted)
285 return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
288 static int stm32_fmc2_ebi_check_async_trans(struct stm32_fmc2_ebi *ebi,
289 const struct stm32_fmc2_prop *prop,
292 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
294 if (!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW))
300 static int stm32_fmc2_ebi_check_cpsize(struct stm32_fmc2_ebi *ebi,
301 const struct stm32_fmc2_prop *prop,
304 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
305 u32 val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
307 if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
313 static int stm32_fmc2_ebi_check_address_hold(struct stm32_fmc2_ebi *ebi,
314 const struct stm32_fmc2_prop *prop,
317 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
318 u32 bxtr = prop->reg_type == FMC2_REG_BWTR ?
319 readl(ebi->io_base + FMC2_BWTR(cs)) :
320 readl(ebi->io_base + FMC2_BTR(cs));
321 u32 val = FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
323 if ((!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW)) &&
324 ((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN))
330 static int stm32_fmc2_ebi_check_clk_period(struct stm32_fmc2_ebi *ebi,
331 const struct stm32_fmc2_prop *prop,
334 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
335 u32 bcr1 = cs ? readl(ebi->io_base + FMC2_BCR1) : bcr;
337 if (bcr & FMC2_BCR_BURSTEN && (!cs || !(bcr1 & FMC2_BCR1_CCLKEN)))
343 static int stm32_fmc2_ebi_check_cclk(struct stm32_fmc2_ebi *ebi,
344 const struct stm32_fmc2_prop *prop,
350 return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
353 static u32 stm32_fmc2_ebi_ns_to_clock_cycles(struct stm32_fmc2_ebi *ebi,
356 unsigned long hclk = clk_get_rate(&ebi->clk);
357 unsigned long hclkp = NSEC_PER_SEC / (hclk / 1000);
359 return DIV_ROUND_UP(setup * 1000, hclkp);
362 static u32 stm32_fmc2_ebi_ns_to_clk_period(struct stm32_fmc2_ebi *ebi,
365 u32 nb_clk_cycles = stm32_fmc2_ebi_ns_to_clock_cycles(ebi, cs, setup);
366 u32 bcr = readl(ebi->io_base + FMC2_BCR1);
367 u32 btr = bcr & FMC2_BCR1_CCLKEN || !cs ?
368 readl(ebi->io_base + FMC2_BTR1) :
369 readl(ebi->io_base + FMC2_BTR(cs));
370 u32 clk_period = FIELD_GET(FMC2_BTR_CLKDIV, btr) + 1;
372 return DIV_ROUND_UP(nb_clk_cycles, clk_period);
375 static u32 stm32_fmc2_ebi_mp25_ns_to_clk_period(struct stm32_fmc2_ebi *ebi,
378 u32 nb_clk_cycles = stm32_fmc2_ebi_ns_to_clock_cycles(ebi, cs, setup);
379 u32 cfgr = readl(ebi->io_base + FMC2_CFGR);
382 if (cfgr & FMC2_CFGR_CCLKEN) {
383 clk_period = FIELD_GET(FMC2_CFGR_CLKDIV, cfgr) + 1;
385 u32 btr = readl(ebi->io_base + FMC2_BTR(cs));
387 clk_period = FIELD_GET(FMC2_BTR_CLKDIV, btr) + 1;
390 return DIV_ROUND_UP(nb_clk_cycles, clk_period);
393 static int stm32_fmc2_ebi_get_reg(int reg_type, int cs, u32 *reg)
403 *reg = FMC2_BWTR(cs);
405 case FMC2_REG_PCSCNTR:
418 static int stm32_fmc2_ebi_set_bit_field(struct stm32_fmc2_ebi *ebi,
419 const struct stm32_fmc2_prop *prop,
425 ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, ®);
429 clrsetbits_le32(ebi->io_base + reg, prop->reg_mask,
430 setup ? prop->reg_mask : 0);
435 static int stm32_fmc2_ebi_set_trans_type(struct stm32_fmc2_ebi *ebi,
436 const struct stm32_fmc2_prop *prop,
439 u32 bcr_mask, bcr = FMC2_BCR_WREN;
440 u32 btr_mask, btr = 0;
441 u32 bwtr_mask, bwtr = 0;
443 bwtr_mask = FMC2_BXTR_ACCMOD;
444 btr_mask = FMC2_BXTR_ACCMOD;
445 bcr_mask = FMC2_BCR_MUXEN | FMC2_BCR_MTYP | FMC2_BCR_FACCEN |
446 FMC2_BCR_WREN | FMC2_BCR_WAITEN | FMC2_BCR_BURSTEN |
447 FMC2_BCR_EXTMOD | FMC2_BCR_CBURSTRW;
450 case FMC2_ASYNC_MODE_1_SRAM:
451 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_SRAM);
453 * MUXEN = 0, MTYP = 0, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
454 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
457 case FMC2_ASYNC_MODE_1_PSRAM:
459 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
460 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
462 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
464 case FMC2_ASYNC_MODE_A_SRAM:
466 * MUXEN = 0, MTYP = 0, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
467 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 0
469 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_SRAM);
470 bcr |= FMC2_BCR_EXTMOD;
471 btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
472 bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
474 case FMC2_ASYNC_MODE_A_PSRAM:
476 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
477 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 0
479 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
480 bcr |= FMC2_BCR_EXTMOD;
481 btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
482 bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
484 case FMC2_ASYNC_MODE_2_NOR:
486 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
487 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
489 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
490 bcr |= FMC2_BCR_FACCEN;
492 case FMC2_ASYNC_MODE_B_NOR:
494 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
495 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 1
497 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
498 bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
499 btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_B);
500 bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_B);
502 case FMC2_ASYNC_MODE_C_NOR:
504 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
505 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 2
507 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
508 bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
509 btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_C);
510 bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_C);
512 case FMC2_ASYNC_MODE_D_NOR:
514 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
515 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 3
517 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
518 bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
519 btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
520 bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
522 case FMC2_SYNC_READ_SYNC_WRITE_PSRAM:
524 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 1, WAITEN = 0,
525 * WREN = 1, EXTMOD = 0, CBURSTRW = 1, ACCMOD = 0
527 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
528 bcr |= FMC2_BCR_BURSTEN | FMC2_BCR_CBURSTRW;
530 case FMC2_SYNC_READ_ASYNC_WRITE_PSRAM:
532 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 1, WAITEN = 0,
533 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
535 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
536 bcr |= FMC2_BCR_BURSTEN;
538 case FMC2_SYNC_READ_SYNC_WRITE_NOR:
540 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 1, WAITEN = 0,
541 * WREN = 1, EXTMOD = 0, CBURSTRW = 1, ACCMOD = 0
543 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
544 bcr |= FMC2_BCR_FACCEN | FMC2_BCR_BURSTEN | FMC2_BCR_CBURSTRW;
546 case FMC2_SYNC_READ_ASYNC_WRITE_NOR:
548 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 1, WAITEN = 0,
549 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
551 bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
552 bcr |= FMC2_BCR_FACCEN | FMC2_BCR_BURSTEN;
555 /* Type of transaction not supported */
559 if (bcr & FMC2_BCR_EXTMOD)
560 clrsetbits_le32(ebi->io_base + FMC2_BWTR(cs),
562 clrsetbits_le32(ebi->io_base + FMC2_BTR(cs), btr_mask, btr);
563 clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), bcr_mask, bcr);
568 static int stm32_fmc2_ebi_set_buswidth(struct stm32_fmc2_ebi *ebi,
569 const struct stm32_fmc2_prop *prop,
575 case FMC2_BUSWIDTH_8:
576 val = FIELD_PREP(FMC2_BCR_MWID, FMC2_BCR_MWID_8);
578 case FMC2_BUSWIDTH_16:
579 val = FIELD_PREP(FMC2_BCR_MWID, FMC2_BCR_MWID_16);
582 /* Buswidth not supported */
586 clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_MWID, val);
591 static int stm32_fmc2_ebi_set_cpsize(struct stm32_fmc2_ebi *ebi,
592 const struct stm32_fmc2_prop *prop,
599 val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_0);
601 case FMC2_CPSIZE_128:
602 val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_128);
604 case FMC2_CPSIZE_256:
605 val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_256);
607 case FMC2_CPSIZE_512:
608 val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_512);
610 case FMC2_CPSIZE_1024:
611 val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_1024);
614 /* Cpsize not supported */
618 clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_CPSIZE, val);
623 static int stm32_fmc2_ebi_set_bl_setup(struct stm32_fmc2_ebi *ebi,
624 const struct stm32_fmc2_prop *prop,
629 val = min_t(u32, setup, FMC2_BCR_NBLSET_MAX);
630 val = FIELD_PREP(FMC2_BCR_NBLSET, val);
631 clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_NBLSET, val);
636 static int stm32_fmc2_ebi_set_address_setup(struct stm32_fmc2_ebi *ebi,
637 const struct stm32_fmc2_prop *prop,
640 u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
641 u32 bxtr = prop->reg_type == FMC2_REG_BWTR ?
642 readl(ebi->io_base + FMC2_BWTR(cs)) :
643 readl(ebi->io_base + FMC2_BTR(cs));
644 u32 reg, val = FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
647 ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, ®);
651 if ((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN)
652 val = clamp_val(setup, 1, FMC2_BXTR_ADDSET_MAX);
654 val = min_t(u32, setup, FMC2_BXTR_ADDSET_MAX);
655 val = FIELD_PREP(FMC2_BXTR_ADDSET, val);
656 clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_ADDSET, val);
661 static int stm32_fmc2_ebi_set_address_hold(struct stm32_fmc2_ebi *ebi,
662 const struct stm32_fmc2_prop *prop,
668 ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, ®);
672 val = clamp_val(setup, 1, FMC2_BXTR_ADDHLD_MAX);
673 val = FIELD_PREP(FMC2_BXTR_ADDHLD, val);
674 clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_ADDHLD, val);
679 static int stm32_fmc2_ebi_set_data_setup(struct stm32_fmc2_ebi *ebi,
680 const struct stm32_fmc2_prop *prop,
686 ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, ®);
690 val = clamp_val(setup, 1, FMC2_BXTR_DATAST_MAX);
691 val = FIELD_PREP(FMC2_BXTR_DATAST, val);
692 clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_DATAST, val);
697 static int stm32_fmc2_ebi_set_bus_turnaround(struct stm32_fmc2_ebi *ebi,
698 const struct stm32_fmc2_prop *prop,
704 ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, ®);
708 val = setup ? min_t(u32, setup - 1, FMC2_BXTR_BUSTURN_MAX) : 0;
709 val = FIELD_PREP(FMC2_BXTR_BUSTURN, val);
710 clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_BUSTURN, val);
715 static int stm32_fmc2_ebi_set_data_hold(struct stm32_fmc2_ebi *ebi,
716 const struct stm32_fmc2_prop *prop,
722 ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, ®);
726 if (prop->reg_type == FMC2_REG_BWTR)
727 val = setup ? min_t(u32, setup - 1, FMC2_BXTR_DATAHLD_MAX) : 0;
729 val = min_t(u32, setup, FMC2_BXTR_DATAHLD_MAX);
730 val = FIELD_PREP(FMC2_BXTR_DATAHLD, val);
731 clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_DATAHLD, val);
736 static int stm32_fmc2_ebi_set_clk_period(struct stm32_fmc2_ebi *ebi,
737 const struct stm32_fmc2_prop *prop,
742 val = setup ? clamp_val(setup - 1, 1, FMC2_BTR_CLKDIV_MAX) : 1;
743 val = FIELD_PREP(FMC2_BTR_CLKDIV, val);
744 clrsetbits_le32(ebi->io_base + FMC2_BTR(cs), FMC2_BTR_CLKDIV, val);
749 static int stm32_fmc2_ebi_mp25_set_clk_period(struct stm32_fmc2_ebi *ebi,
750 const struct stm32_fmc2_prop *prop,
753 u32 cfgr = readl(ebi->io_base + FMC2_CFGR);
756 if (cfgr & FMC2_CFGR_CCLKEN) {
757 val = setup ? clamp_val(setup - 1, 1, FMC2_CFGR_CLKDIV_MAX) : 1;
758 val = FIELD_PREP(FMC2_CFGR_CLKDIV, val);
759 clrsetbits_le32(ebi->io_base + FMC2_CFGR, FMC2_CFGR_CLKDIV, val);
761 val = setup ? clamp_val(setup - 1, 1, FMC2_BTR_CLKDIV_MAX) : 1;
762 val = FIELD_PREP(FMC2_BTR_CLKDIV, val);
763 clrsetbits_le32(ebi->io_base + FMC2_BTR(cs), FMC2_BTR_CLKDIV, val);
769 static int stm32_fmc2_ebi_set_data_latency(struct stm32_fmc2_ebi *ebi,
770 const struct stm32_fmc2_prop *prop,
775 val = setup > 1 ? min_t(u32, setup - 2, FMC2_BTR_DATLAT_MAX) : 0;
776 val = FIELD_PREP(FMC2_BTR_DATLAT, val);
777 clrsetbits_le32(ebi->io_base + FMC2_BTR(cs), FMC2_BTR_DATLAT, val);
782 static int stm32_fmc2_ebi_set_max_low_pulse(struct stm32_fmc2_ebi *ebi,
783 const struct stm32_fmc2_prop *prop,
786 u32 old_val, new_val, pcscntr;
791 pcscntr = readl(ebi->io_base + FMC2_PCSCNTR);
793 /* Enable counter for the bank */
794 setbits_le32(ebi->io_base + FMC2_PCSCNTR, FMC2_PCSCNTR_CNTBEN(cs));
796 new_val = min_t(u32, setup - 1, FMC2_PCSCNTR_CSCOUNT_MAX);
797 old_val = FIELD_GET(FMC2_PCSCNTR_CSCOUNT, pcscntr);
798 if (old_val && new_val > old_val)
799 /* Keep current counter value */
802 new_val = FIELD_PREP(FMC2_PCSCNTR_CSCOUNT, new_val);
803 clrsetbits_le32(ebi->io_base + FMC2_PCSCNTR,
804 FMC2_PCSCNTR_CSCOUNT, new_val);
809 static int stm32_fmc2_ebi_mp25_set_max_low_pulse(struct stm32_fmc2_ebi *ebi,
810 const struct stm32_fmc2_prop *prop,
815 if (setup == FMC2_CSCOUNT_0)
816 val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_0);
817 else if (setup == FMC2_CSCOUNT_1)
818 val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_1);
819 else if (setup <= FMC2_CSCOUNT_64)
820 val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_64);
822 val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_256);
824 clrsetbits_le32(ebi->io_base + FMC2_BCR(cs),
825 FMC2_BCR_CSCOUNT, val);
830 static const struct stm32_fmc2_prop stm32_fmc2_child_props[] = {
831 /* st,fmc2-ebi-cs-trans-type must be the first property */
833 .name = "st,fmc2-ebi-cs-transaction-type",
835 .set = stm32_fmc2_ebi_set_trans_type,
838 .name = "st,fmc2-ebi-cs-cclk-enable",
840 .reg_type = FMC2_REG_BCR,
841 .reg_mask = FMC2_BCR1_CCLKEN,
842 .check = stm32_fmc2_ebi_check_cclk,
843 .set = stm32_fmc2_ebi_set_bit_field,
846 .name = "st,fmc2-ebi-cs-mux-enable",
848 .reg_type = FMC2_REG_BCR,
849 .reg_mask = FMC2_BCR_MUXEN,
850 .check = stm32_fmc2_ebi_check_mux,
851 .set = stm32_fmc2_ebi_set_bit_field,
854 .name = "st,fmc2-ebi-cs-buswidth",
855 .reset_val = FMC2_BUSWIDTH_16,
856 .set = stm32_fmc2_ebi_set_buswidth,
859 .name = "st,fmc2-ebi-cs-waitpol-high",
861 .reg_type = FMC2_REG_BCR,
862 .reg_mask = FMC2_BCR_WAITPOL,
863 .set = stm32_fmc2_ebi_set_bit_field,
866 .name = "st,fmc2-ebi-cs-waitcfg-enable",
868 .reg_type = FMC2_REG_BCR,
869 .reg_mask = FMC2_BCR_WAITCFG,
870 .check = stm32_fmc2_ebi_check_waitcfg,
871 .set = stm32_fmc2_ebi_set_bit_field,
874 .name = "st,fmc2-ebi-cs-wait-enable",
876 .reg_type = FMC2_REG_BCR,
877 .reg_mask = FMC2_BCR_WAITEN,
878 .check = stm32_fmc2_ebi_check_sync_trans,
879 .set = stm32_fmc2_ebi_set_bit_field,
882 .name = "st,fmc2-ebi-cs-asyncwait-enable",
884 .reg_type = FMC2_REG_BCR,
885 .reg_mask = FMC2_BCR_ASYNCWAIT,
886 .check = stm32_fmc2_ebi_check_async_trans,
887 .set = stm32_fmc2_ebi_set_bit_field,
890 .name = "st,fmc2-ebi-cs-cpsize",
891 .check = stm32_fmc2_ebi_check_cpsize,
892 .set = stm32_fmc2_ebi_set_cpsize,
895 .name = "st,fmc2-ebi-cs-byte-lane-setup-ns",
896 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
897 .set = stm32_fmc2_ebi_set_bl_setup,
900 .name = "st,fmc2-ebi-cs-address-setup-ns",
901 .reg_type = FMC2_REG_BTR,
902 .reset_val = FMC2_BXTR_ADDSET_MAX,
903 .check = stm32_fmc2_ebi_check_async_trans,
904 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
905 .set = stm32_fmc2_ebi_set_address_setup,
908 .name = "st,fmc2-ebi-cs-address-hold-ns",
909 .reg_type = FMC2_REG_BTR,
910 .reset_val = FMC2_BXTR_ADDHLD_MAX,
911 .check = stm32_fmc2_ebi_check_address_hold,
912 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
913 .set = stm32_fmc2_ebi_set_address_hold,
916 .name = "st,fmc2-ebi-cs-data-setup-ns",
917 .reg_type = FMC2_REG_BTR,
918 .reset_val = FMC2_BXTR_DATAST_MAX,
919 .check = stm32_fmc2_ebi_check_async_trans,
920 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
921 .set = stm32_fmc2_ebi_set_data_setup,
924 .name = "st,fmc2-ebi-cs-bus-turnaround-ns",
925 .reg_type = FMC2_REG_BTR,
926 .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
927 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
928 .set = stm32_fmc2_ebi_set_bus_turnaround,
931 .name = "st,fmc2-ebi-cs-data-hold-ns",
932 .reg_type = FMC2_REG_BTR,
933 .check = stm32_fmc2_ebi_check_async_trans,
934 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
935 .set = stm32_fmc2_ebi_set_data_hold,
938 .name = "st,fmc2-ebi-cs-clk-period-ns",
939 .reset_val = FMC2_BTR_CLKDIV_MAX + 1,
940 .check = stm32_fmc2_ebi_check_clk_period,
941 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
942 .set = stm32_fmc2_ebi_set_clk_period,
945 .name = "st,fmc2-ebi-cs-data-latency-ns",
946 .check = stm32_fmc2_ebi_check_sync_trans,
947 .calculate = stm32_fmc2_ebi_ns_to_clk_period,
948 .set = stm32_fmc2_ebi_set_data_latency,
951 .name = "st,fmc2-ebi-cs-write-address-setup-ns",
952 .reg_type = FMC2_REG_BWTR,
953 .reset_val = FMC2_BXTR_ADDSET_MAX,
954 .check = stm32_fmc2_ebi_check_async_trans,
955 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
956 .set = stm32_fmc2_ebi_set_address_setup,
959 .name = "st,fmc2-ebi-cs-write-address-hold-ns",
960 .reg_type = FMC2_REG_BWTR,
961 .reset_val = FMC2_BXTR_ADDHLD_MAX,
962 .check = stm32_fmc2_ebi_check_address_hold,
963 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
964 .set = stm32_fmc2_ebi_set_address_hold,
967 .name = "st,fmc2-ebi-cs-write-data-setup-ns",
968 .reg_type = FMC2_REG_BWTR,
969 .reset_val = FMC2_BXTR_DATAST_MAX,
970 .check = stm32_fmc2_ebi_check_async_trans,
971 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
972 .set = stm32_fmc2_ebi_set_data_setup,
975 .name = "st,fmc2-ebi-cs-write-bus-turnaround-ns",
976 .reg_type = FMC2_REG_BWTR,
977 .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
978 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
979 .set = stm32_fmc2_ebi_set_bus_turnaround,
982 .name = "st,fmc2-ebi-cs-write-data-hold-ns",
983 .reg_type = FMC2_REG_BWTR,
984 .check = stm32_fmc2_ebi_check_async_trans,
985 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
986 .set = stm32_fmc2_ebi_set_data_hold,
989 .name = "st,fmc2-ebi-cs-max-low-pulse-ns",
990 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
991 .set = stm32_fmc2_ebi_set_max_low_pulse,
995 static const struct stm32_fmc2_prop stm32_fmc2_mp25_child_props[] = {
996 /* st,fmc2-ebi-cs-trans-type must be the first property */
998 .name = "st,fmc2-ebi-cs-transaction-type",
1000 .set = stm32_fmc2_ebi_set_trans_type,
1003 .name = "st,fmc2-ebi-cs-cclk-enable",
1005 .reg_type = FMC2_REG_CFGR,
1006 .reg_mask = FMC2_CFGR_CCLKEN,
1007 .check = stm32_fmc2_ebi_mp25_check_cclk,
1008 .set = stm32_fmc2_ebi_set_bit_field,
1011 .name = "st,fmc2-ebi-cs-mux-enable",
1013 .reg_type = FMC2_REG_BCR,
1014 .reg_mask = FMC2_BCR_MUXEN,
1015 .check = stm32_fmc2_ebi_check_mux,
1016 .set = stm32_fmc2_ebi_set_bit_field,
1019 .name = "st,fmc2-ebi-cs-buswidth",
1020 .reset_val = FMC2_BUSWIDTH_16,
1021 .set = stm32_fmc2_ebi_set_buswidth,
1024 .name = "st,fmc2-ebi-cs-waitpol-high",
1026 .reg_type = FMC2_REG_BCR,
1027 .reg_mask = FMC2_BCR_WAITPOL,
1028 .set = stm32_fmc2_ebi_set_bit_field,
1031 .name = "st,fmc2-ebi-cs-waitcfg-enable",
1033 .reg_type = FMC2_REG_BCR,
1034 .reg_mask = FMC2_BCR_WAITCFG,
1035 .check = stm32_fmc2_ebi_check_waitcfg,
1036 .set = stm32_fmc2_ebi_set_bit_field,
1039 .name = "st,fmc2-ebi-cs-wait-enable",
1041 .reg_type = FMC2_REG_BCR,
1042 .reg_mask = FMC2_BCR_WAITEN,
1043 .check = stm32_fmc2_ebi_check_sync_trans,
1044 .set = stm32_fmc2_ebi_set_bit_field,
1047 .name = "st,fmc2-ebi-cs-asyncwait-enable",
1049 .reg_type = FMC2_REG_BCR,
1050 .reg_mask = FMC2_BCR_ASYNCWAIT,
1051 .check = stm32_fmc2_ebi_check_async_trans,
1052 .set = stm32_fmc2_ebi_set_bit_field,
1055 .name = "st,fmc2-ebi-cs-cpsize",
1056 .check = stm32_fmc2_ebi_check_cpsize,
1057 .set = stm32_fmc2_ebi_set_cpsize,
1060 .name = "st,fmc2-ebi-cs-byte-lane-setup-ns",
1061 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1062 .set = stm32_fmc2_ebi_set_bl_setup,
1065 .name = "st,fmc2-ebi-cs-address-setup-ns",
1066 .reg_type = FMC2_REG_BTR,
1067 .reset_val = FMC2_BXTR_ADDSET_MAX,
1068 .check = stm32_fmc2_ebi_check_async_trans,
1069 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1070 .set = stm32_fmc2_ebi_set_address_setup,
1073 .name = "st,fmc2-ebi-cs-address-hold-ns",
1074 .reg_type = FMC2_REG_BTR,
1075 .reset_val = FMC2_BXTR_ADDHLD_MAX,
1076 .check = stm32_fmc2_ebi_check_address_hold,
1077 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1078 .set = stm32_fmc2_ebi_set_address_hold,
1081 .name = "st,fmc2-ebi-cs-data-setup-ns",
1082 .reg_type = FMC2_REG_BTR,
1083 .reset_val = FMC2_BXTR_DATAST_MAX,
1084 .check = stm32_fmc2_ebi_check_async_trans,
1085 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1086 .set = stm32_fmc2_ebi_set_data_setup,
1089 .name = "st,fmc2-ebi-cs-bus-turnaround-ns",
1090 .reg_type = FMC2_REG_BTR,
1091 .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
1092 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1093 .set = stm32_fmc2_ebi_set_bus_turnaround,
1096 .name = "st,fmc2-ebi-cs-data-hold-ns",
1097 .reg_type = FMC2_REG_BTR,
1098 .check = stm32_fmc2_ebi_check_async_trans,
1099 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1100 .set = stm32_fmc2_ebi_set_data_hold,
1103 .name = "st,fmc2-ebi-cs-clk-period-ns",
1104 .reset_val = FMC2_CFGR_CLKDIV_MAX + 1,
1105 .check = stm32_fmc2_ebi_mp25_check_clk_period,
1106 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1107 .set = stm32_fmc2_ebi_mp25_set_clk_period,
1110 .name = "st,fmc2-ebi-cs-data-latency-ns",
1111 .check = stm32_fmc2_ebi_check_sync_trans,
1112 .calculate = stm32_fmc2_ebi_mp25_ns_to_clk_period,
1113 .set = stm32_fmc2_ebi_set_data_latency,
1116 .name = "st,fmc2-ebi-cs-write-address-setup-ns",
1117 .reg_type = FMC2_REG_BWTR,
1118 .reset_val = FMC2_BXTR_ADDSET_MAX,
1119 .check = stm32_fmc2_ebi_check_async_trans,
1120 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1121 .set = stm32_fmc2_ebi_set_address_setup,
1124 .name = "st,fmc2-ebi-cs-write-address-hold-ns",
1125 .reg_type = FMC2_REG_BWTR,
1126 .reset_val = FMC2_BXTR_ADDHLD_MAX,
1127 .check = stm32_fmc2_ebi_check_address_hold,
1128 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1129 .set = stm32_fmc2_ebi_set_address_hold,
1132 .name = "st,fmc2-ebi-cs-write-data-setup-ns",
1133 .reg_type = FMC2_REG_BWTR,
1134 .reset_val = FMC2_BXTR_DATAST_MAX,
1135 .check = stm32_fmc2_ebi_check_async_trans,
1136 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1137 .set = stm32_fmc2_ebi_set_data_setup,
1140 .name = "st,fmc2-ebi-cs-write-bus-turnaround-ns",
1141 .reg_type = FMC2_REG_BWTR,
1142 .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
1143 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1144 .set = stm32_fmc2_ebi_set_bus_turnaround,
1147 .name = "st,fmc2-ebi-cs-write-data-hold-ns",
1148 .reg_type = FMC2_REG_BWTR,
1149 .check = stm32_fmc2_ebi_check_async_trans,
1150 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1151 .set = stm32_fmc2_ebi_set_data_hold,
1154 .name = "st,fmc2-ebi-cs-max-low-pulse-ns",
1155 .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
1156 .set = stm32_fmc2_ebi_mp25_set_max_low_pulse,
1160 static int stm32_fmc2_ebi_mp25_check_rif(struct stm32_fmc2_ebi *ebi, u32 resource)
1162 u32 seccfgr, cidcfgr, semcr;
1165 if (resource >= FMC2_MAX_RESOURCES)
1168 seccfgr = readl(ebi->io_base + FMC2_SECCFGR);
1169 if (seccfgr & BIT(resource)) {
1171 log_err("resource %d is configured as secure\n",
1177 cidcfgr = readl(ebi->io_base + FMC2_CIDCFGR(resource));
1178 if (!(cidcfgr & FMC2_CIDCFGR_CFEN))
1179 /* CID filtering is turned off: access granted */
1182 if (!(cidcfgr & FMC2_CIDCFGR_SEMEN)) {
1183 /* Static CID mode */
1184 cid = FIELD_GET(FMC2_CIDCFGR_SCID, cidcfgr);
1185 if (cid != FMC2_CID1) {
1187 log_err("static CID%d set for resource %d\n",
1196 /* Pass-list with semaphore mode */
1197 if (!(cidcfgr & FMC2_CIDCFGR_SEMWLC1)) {
1199 log_err("CID1 is block-listed for resource %d\n",
1205 semcr = readl(ebi->io_base + FMC2_SEMCR(resource));
1206 if (!(semcr & FMC2_SEMCR_SEM_MUTEX)) {
1207 setbits_le32(ebi->io_base + FMC2_SEMCR(resource),
1208 FMC2_SEMCR_SEM_MUTEX);
1209 semcr = readl(ebi->io_base + FMC2_SEMCR(resource));
1212 cid = FIELD_GET(FMC2_SEMCR_SEMCID, semcr);
1213 if (cid != FMC2_CID1) {
1215 log_err("resource %d is already used by CID%d\n",
1224 static int stm32_fmc2_ebi_parse_prop(struct stm32_fmc2_ebi *ebi,
1226 const struct stm32_fmc2_prop *prop,
1232 log_err("property %s is not well defined\n", prop->name);
1236 if (prop->check && prop->check(ebi, prop, cs))
1237 /* Skip this property */
1243 bprop = ofnode_read_bool(node, prop->name);
1244 if (prop->mprop && !bprop) {
1245 log_err("mandatory property %s not defined in the device tree\n",
1256 ret = ofnode_read_u32(node, prop->name, &val);
1257 if (prop->mprop && ret) {
1258 log_err("mandatory property %s not defined in the device tree\n",
1264 setup = prop->reset_val;
1265 else if (prop->calculate)
1266 setup = prop->calculate(ebi, cs, val);
1271 return prop->set(ebi, prop, cs, setup);
1274 static void stm32_fmc2_ebi_enable_bank(struct stm32_fmc2_ebi *ebi, int cs)
1276 setbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_MBKEN);
1279 static void stm32_fmc2_ebi_disable_bank(struct stm32_fmc2_ebi *ebi, int cs)
1281 clrbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_MBKEN);
1284 /* NWAIT signal can not be connected to EBI controller and NAND controller */
1285 static int stm32_fmc2_ebi_nwait_used_by_ctrls(struct stm32_fmc2_ebi *ebi)
1290 for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
1291 if (!(ebi->bank_assigned & BIT(cs)))
1294 bcr = readl(ebi->io_base + FMC2_BCR(cs));
1295 if ((bcr & FMC2_BCR_WAITEN || bcr & FMC2_BCR_ASYNCWAIT) &&
1296 ebi->bank_assigned & BIT(FMC2_NAND)) {
1297 log_err("NWAIT signal connected to EBI and NAND controllers\n");
1305 static void stm32_fmc2_ebi_enable(struct stm32_fmc2_ebi *ebi)
1307 if (!ebi->access_granted)
1310 setbits_le32(ebi->io_base + ebi->data->fmc2_enable_reg,
1311 ebi->data->fmc2_enable_bit);
1314 static int stm32_fmc2_ebi_setup_cs(struct stm32_fmc2_ebi *ebi,
1315 ofnode node, u32 cs)
1320 stm32_fmc2_ebi_disable_bank(ebi, cs);
1322 for (i = 0; i < ebi->data->nb_child_props; i++) {
1323 const struct stm32_fmc2_prop *p = &ebi->data->child_props[i];
1325 ret = stm32_fmc2_ebi_parse_prop(ebi, node, p, cs);
1327 log_err("property %s could not be set: %d\n",
1333 stm32_fmc2_ebi_enable_bank(ebi, cs);
1338 static int stm32_fmc2_ebi_parse_dt(struct udevice *dev,
1339 struct stm32_fmc2_ebi *ebi)
1342 bool child_found = false;
1346 dev_for_each_subnode(child, dev) {
1347 ret = ofnode_read_u32(child, "reg", &bank);
1349 dev_err(dev, "could not retrieve reg property: %d\n", ret);
1353 if (bank >= FMC2_MAX_BANKS) {
1354 dev_err(dev, "invalid reg value: %d\n", bank);
1358 if (ebi->bank_assigned & BIT(bank)) {
1359 dev_err(dev, "bank already assigned: %d\n", bank);
1363 if (ebi->data->check_rif) {
1364 ret = ebi->data->check_rif(ebi, bank + 1);
1366 dev_err(dev, "bank access failed: %d\n", bank);
1371 if (bank < FMC2_MAX_EBI_CE) {
1372 ret = stm32_fmc2_ebi_setup_cs(ebi, child, bank);
1374 dev_err(dev, "setup chip select %d failed: %d\n", bank, ret);
1379 ebi->bank_assigned |= BIT(bank);
1384 dev_warn(dev, "no subnodes found, disable the driver.\n");
1388 if (ebi->data->nwait_used_by_ctrls) {
1389 ret = ebi->data->nwait_used_by_ctrls(ebi);
1394 stm32_fmc2_ebi_enable(ebi);
1399 static int stm32_fmc2_ebi_probe(struct udevice *dev)
1401 struct stm32_fmc2_ebi *ebi = dev_get_priv(dev);
1402 struct reset_ctl reset;
1405 ebi->data = (void *)dev_get_driver_data(dev);
1409 ebi->io_base = dev_read_addr(dev);
1410 if (ebi->io_base == FDT_ADDR_T_NONE)
1413 ret = clk_get_by_index(dev, 0, &ebi->clk);
1417 ret = clk_enable(&ebi->clk);
1421 ret = reset_get_by_index(dev, 0, &reset);
1423 reset_assert(&reset);
1425 reset_deassert(&reset);
1428 /* Check if CFGR register can be modified */
1429 ebi->access_granted = true;
1430 if (ebi->data->check_rif) {
1431 ret = ebi->data->check_rif(ebi, 0);
1433 ebi->access_granted = false;
1435 /* In case of CFGR is secure, just check that the FMC2 is enabled */
1436 if (readl(ebi->io_base + FMC2_SR) & FMC2_SR_ISOST) {
1437 dev_err(dev, "FMC2 is not ready to be used.\n");
1443 return stm32_fmc2_ebi_parse_dt(dev, ebi);
1446 static const struct stm32_fmc2_ebi_data stm32_fmc2_ebi_mp1_data = {
1447 .child_props = stm32_fmc2_child_props,
1448 .nb_child_props = ARRAY_SIZE(stm32_fmc2_child_props),
1449 .fmc2_enable_reg = FMC2_BCR1,
1450 .fmc2_enable_bit = FMC2_BCR1_FMC2EN,
1451 .nwait_used_by_ctrls = stm32_fmc2_ebi_nwait_used_by_ctrls,
1454 static const struct stm32_fmc2_ebi_data stm32_fmc2_ebi_mp25_data = {
1455 .child_props = stm32_fmc2_mp25_child_props,
1456 .nb_child_props = ARRAY_SIZE(stm32_fmc2_mp25_child_props),
1457 .fmc2_enable_reg = FMC2_CFGR,
1458 .fmc2_enable_bit = FMC2_CFGR_FMC2EN,
1459 .check_rif = stm32_fmc2_ebi_mp25_check_rif,
1462 static const struct udevice_id stm32_fmc2_ebi_match[] = {
1464 .compatible = "st,stm32mp1-fmc2-ebi",
1465 .data = (ulong)&stm32_fmc2_ebi_mp1_data,
1468 .compatible = "st,stm32mp25-fmc2-ebi",
1469 .data = (ulong)&stm32_fmc2_ebi_mp25_data,
1474 U_BOOT_DRIVER(stm32_fmc2_ebi) = {
1475 .name = "stm32_fmc2_ebi",
1477 .of_match = stm32_fmc2_ebi_match,
1478 .probe = stm32_fmc2_ebi_probe,
1479 .priv_auto = sizeof(struct stm32_fmc2_ebi),
1480 .bind = dm_scan_fdt_dev,