1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2 /*
3  * Copyright (C) STMicroelectronics 2020
4  */
5 
6 #define LOG_CATEGORY UCLASS_NOP
7 
8 #include <common.h>
9 #include <clk.h>
10 #include <dm.h>
11 #include <reset.h>
12 #include <dm/device_compat.h>
13 #include <linux/bitfield.h>
14 #include <linux/err.h>
15 #include <linux/iopoll.h>
16 #include <linux/ioport.h>
17 
18 /* FMC2 Controller Registers */
19 #define FMC2_BCR1			0x0
20 #define FMC2_BTR1			0x4
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_BWTR1			0x104
25 #define FMC2_BWTR(x)			((x) * 0x8 + FMC2_BWTR1)
26 
27 /* Register: FMC2_BCR1 */
28 #define FMC2_BCR1_CCLKEN		BIT(20)
29 #define FMC2_BCR1_FMC2EN		BIT(31)
30 
31 /* Register: FMC2_BCRx */
32 #define FMC2_BCR_MBKEN			BIT(0)
33 #define FMC2_BCR_MUXEN			BIT(1)
34 #define FMC2_BCR_MTYP			GENMASK(3, 2)
35 #define FMC2_BCR_MWID			GENMASK(5, 4)
36 #define FMC2_BCR_FACCEN			BIT(6)
37 #define FMC2_BCR_BURSTEN		BIT(8)
38 #define FMC2_BCR_WAITPOL		BIT(9)
39 #define FMC2_BCR_WAITCFG		BIT(11)
40 #define FMC2_BCR_WREN			BIT(12)
41 #define FMC2_BCR_WAITEN			BIT(13)
42 #define FMC2_BCR_EXTMOD			BIT(14)
43 #define FMC2_BCR_ASYNCWAIT		BIT(15)
44 #define FMC2_BCR_CPSIZE			GENMASK(18, 16)
45 #define FMC2_BCR_CBURSTRW		BIT(19)
46 #define FMC2_BCR_NBLSET			GENMASK(23, 22)
47 
48 /* Register: FMC2_BTRx/FMC2_BWTRx */
49 #define FMC2_BXTR_ADDSET		GENMASK(3, 0)
50 #define FMC2_BXTR_ADDHLD		GENMASK(7, 4)
51 #define FMC2_BXTR_DATAST		GENMASK(15, 8)
52 #define FMC2_BXTR_BUSTURN		GENMASK(19, 16)
53 #define FMC2_BTR_CLKDIV			GENMASK(23, 20)
54 #define FMC2_BTR_DATLAT			GENMASK(27, 24)
55 #define FMC2_BXTR_ACCMOD		GENMASK(29, 28)
56 #define FMC2_BXTR_DATAHLD		GENMASK(31, 30)
57 
58 /* Register: FMC2_PCSCNTR */
59 #define FMC2_PCSCNTR_CSCOUNT		GENMASK(15, 0)
60 #define FMC2_PCSCNTR_CNTBEN(x)		BIT((x) + 16)
61 
62 #define FMC2_MAX_EBI_CE			4
63 #define FMC2_MAX_BANKS			5
64 
65 #define FMC2_BCR_CPSIZE_0		0x0
66 #define FMC2_BCR_CPSIZE_128		0x1
67 #define FMC2_BCR_CPSIZE_256		0x2
68 #define FMC2_BCR_CPSIZE_512		0x3
69 #define FMC2_BCR_CPSIZE_1024		0x4
70 
71 #define FMC2_BCR_MWID_8			0x0
72 #define FMC2_BCR_MWID_16		0x1
73 
74 #define FMC2_BCR_MTYP_SRAM		0x0
75 #define FMC2_BCR_MTYP_PSRAM		0x1
76 #define FMC2_BCR_MTYP_NOR		0x2
77 
78 #define FMC2_BXTR_EXTMOD_A		0x0
79 #define FMC2_BXTR_EXTMOD_B		0x1
80 #define FMC2_BXTR_EXTMOD_C		0x2
81 #define FMC2_BXTR_EXTMOD_D		0x3
82 
83 #define FMC2_BCR_NBLSET_MAX		0x3
84 #define FMC2_BXTR_ADDSET_MAX		0xf
85 #define FMC2_BXTR_ADDHLD_MAX		0xf
86 #define FMC2_BXTR_DATAST_MAX		0xff
87 #define FMC2_BXTR_BUSTURN_MAX		0xf
88 #define FMC2_BXTR_DATAHLD_MAX		0x3
89 #define FMC2_BTR_CLKDIV_MAX		0xf
90 #define FMC2_BTR_DATLAT_MAX		0xf
91 #define FMC2_PCSCNTR_CSCOUNT_MAX	0xff
92 
93 #define FMC2_NSEC_PER_SEC		1000000000L
94 
95 enum stm32_fmc2_ebi_bank {
96 	FMC2_EBI1 = 0,
97 	FMC2_EBI2,
98 	FMC2_EBI3,
99 	FMC2_EBI4,
100 	FMC2_NAND
101 };
102 
103 enum stm32_fmc2_ebi_register_type {
104 	FMC2_REG_BCR = 1,
105 	FMC2_REG_BTR,
106 	FMC2_REG_BWTR,
107 	FMC2_REG_PCSCNTR
108 };
109 
110 enum stm32_fmc2_ebi_transaction_type {
111 	FMC2_ASYNC_MODE_1_SRAM = 0,
112 	FMC2_ASYNC_MODE_1_PSRAM,
113 	FMC2_ASYNC_MODE_A_SRAM,
114 	FMC2_ASYNC_MODE_A_PSRAM,
115 	FMC2_ASYNC_MODE_2_NOR,
116 	FMC2_ASYNC_MODE_B_NOR,
117 	FMC2_ASYNC_MODE_C_NOR,
118 	FMC2_ASYNC_MODE_D_NOR,
119 	FMC2_SYNC_READ_SYNC_WRITE_PSRAM,
120 	FMC2_SYNC_READ_ASYNC_WRITE_PSRAM,
121 	FMC2_SYNC_READ_SYNC_WRITE_NOR,
122 	FMC2_SYNC_READ_ASYNC_WRITE_NOR
123 };
124 
125 enum stm32_fmc2_ebi_buswidth {
126 	FMC2_BUSWIDTH_8 = 8,
127 	FMC2_BUSWIDTH_16 = 16
128 };
129 
130 enum stm32_fmc2_ebi_cpsize {
131 	FMC2_CPSIZE_0 = 0,
132 	FMC2_CPSIZE_128 = 128,
133 	FMC2_CPSIZE_256 = 256,
134 	FMC2_CPSIZE_512 = 512,
135 	FMC2_CPSIZE_1024 = 1024
136 };
137 
138 struct stm32_fmc2_ebi {
139 	struct clk clk;
140 	fdt_addr_t io_base;
141 	u8 bank_assigned;
142 };
143 
144 /*
145  * struct stm32_fmc2_prop - STM32 FMC2 EBI property
146  * @name: the device tree binding name of the property
147  * @bprop: indicate that it is a boolean property
148  * @mprop: indicate that it is a mandatory property
149  * @reg_type: the register that have to be modified
150  * @reg_mask: the bit that have to be modified in the selected register
151  *            in case of it is a boolean property
152  * @reset_val: the default value that have to be set in case the property
153  *             has not been defined in the device tree
154  * @check: this callback ckecks that the property is compliant with the
155  *         transaction type selected
156  * @calculate: this callback is called to calculate for exemple a timing
157  *             set in nanoseconds in the device tree in clock cycles or in
158  *             clock period
159  * @set: this callback applies the values in the registers
160  */
161 struct stm32_fmc2_prop {
162 	const char *name;
163 	bool bprop;
164 	bool mprop;
165 	int reg_type;
166 	u32 reg_mask;
167 	u32 reset_val;
168 	int (*check)(struct stm32_fmc2_ebi *ebi,
169 		     const struct stm32_fmc2_prop *prop, int cs);
170 	u32 (*calculate)(struct stm32_fmc2_ebi *ebi, int cs, u32 setup);
171 	int (*set)(struct stm32_fmc2_ebi *ebi,
172 		   const struct stm32_fmc2_prop *prop,
173 		   int cs, u32 setup);
174 };
175 
stm32_fmc2_ebi_check_mux(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)176 static int stm32_fmc2_ebi_check_mux(struct stm32_fmc2_ebi *ebi,
177 				    const struct stm32_fmc2_prop *prop,
178 				    int cs)
179 {
180 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
181 
182 	if (bcr & FMC2_BCR_MTYP)
183 		return 0;
184 
185 	return -EINVAL;
186 }
187 
stm32_fmc2_ebi_check_waitcfg(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)188 static int stm32_fmc2_ebi_check_waitcfg(struct stm32_fmc2_ebi *ebi,
189 					const struct stm32_fmc2_prop *prop,
190 					int cs)
191 {
192 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
193 	u32 val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
194 
195 	if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
196 		return 0;
197 
198 	return -EINVAL;
199 }
200 
stm32_fmc2_ebi_check_sync_trans(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)201 static int stm32_fmc2_ebi_check_sync_trans(struct stm32_fmc2_ebi *ebi,
202 					   const struct stm32_fmc2_prop *prop,
203 					   int cs)
204 {
205 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
206 
207 	if (bcr & FMC2_BCR_BURSTEN)
208 		return 0;
209 
210 	return -EINVAL;
211 }
212 
stm32_fmc2_ebi_check_async_trans(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)213 static int stm32_fmc2_ebi_check_async_trans(struct stm32_fmc2_ebi *ebi,
214 					    const struct stm32_fmc2_prop *prop,
215 					    int cs)
216 {
217 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
218 
219 	if (!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW))
220 		return 0;
221 
222 	return -EINVAL;
223 }
224 
stm32_fmc2_ebi_check_cpsize(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)225 static int stm32_fmc2_ebi_check_cpsize(struct stm32_fmc2_ebi *ebi,
226 				       const struct stm32_fmc2_prop *prop,
227 				       int cs)
228 {
229 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
230 	u32 val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
231 
232 	if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
233 		return 0;
234 
235 	return -EINVAL;
236 }
237 
stm32_fmc2_ebi_check_address_hold(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)238 static int stm32_fmc2_ebi_check_address_hold(struct stm32_fmc2_ebi *ebi,
239 					     const struct stm32_fmc2_prop *prop,
240 					     int cs)
241 {
242 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
243 	u32 bxtr = prop->reg_type == FMC2_REG_BWTR ?
244 		   readl(ebi->io_base + FMC2_BWTR(cs)) :
245 		   readl(ebi->io_base + FMC2_BTR(cs));
246 	u32 val = FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
247 
248 	if ((!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW)) &&
249 	    ((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN))
250 		return 0;
251 
252 	return -EINVAL;
253 }
254 
stm32_fmc2_ebi_check_clk_period(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)255 static int stm32_fmc2_ebi_check_clk_period(struct stm32_fmc2_ebi *ebi,
256 					   const struct stm32_fmc2_prop *prop,
257 					   int cs)
258 {
259 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
260 	u32 bcr1 = cs ? readl(ebi->io_base + FMC2_BCR1) : bcr;
261 
262 	if (bcr & FMC2_BCR_BURSTEN && (!cs || !(bcr1 & FMC2_BCR1_CCLKEN)))
263 		return 0;
264 
265 	return -EINVAL;
266 }
267 
stm32_fmc2_ebi_check_cclk(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs)268 static int stm32_fmc2_ebi_check_cclk(struct stm32_fmc2_ebi *ebi,
269 				     const struct stm32_fmc2_prop *prop,
270 				     int cs)
271 {
272 	if (cs)
273 		return -EINVAL;
274 
275 	return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
276 }
277 
stm32_fmc2_ebi_ns_to_clock_cycles(struct stm32_fmc2_ebi * ebi,int cs,u32 setup)278 static u32 stm32_fmc2_ebi_ns_to_clock_cycles(struct stm32_fmc2_ebi *ebi,
279 					     int cs, u32 setup)
280 {
281 	unsigned long hclk = clk_get_rate(&ebi->clk);
282 	unsigned long hclkp = FMC2_NSEC_PER_SEC / (hclk / 1000);
283 
284 	return DIV_ROUND_UP(setup * 1000, hclkp);
285 }
286 
stm32_fmc2_ebi_ns_to_clk_period(struct stm32_fmc2_ebi * ebi,int cs,u32 setup)287 static u32 stm32_fmc2_ebi_ns_to_clk_period(struct stm32_fmc2_ebi *ebi,
288 					   int cs, u32 setup)
289 {
290 	u32 nb_clk_cycles = stm32_fmc2_ebi_ns_to_clock_cycles(ebi, cs, setup);
291 	u32 bcr = readl(ebi->io_base + FMC2_BCR1);
292 	u32 btr = bcr & FMC2_BCR1_CCLKEN || !cs ?
293 		  readl(ebi->io_base + FMC2_BTR1) :
294 		  readl(ebi->io_base + FMC2_BTR(cs));
295 	u32 clk_period = FIELD_GET(FMC2_BTR_CLKDIV, btr) + 1;
296 
297 	return DIV_ROUND_UP(nb_clk_cycles, clk_period);
298 }
299 
stm32_fmc2_ebi_get_reg(int reg_type,int cs,u32 * reg)300 static int stm32_fmc2_ebi_get_reg(int reg_type, int cs, u32 *reg)
301 {
302 	switch (reg_type) {
303 	case FMC2_REG_BCR:
304 		*reg = FMC2_BCR(cs);
305 		break;
306 	case FMC2_REG_BTR:
307 		*reg = FMC2_BTR(cs);
308 		break;
309 	case FMC2_REG_BWTR:
310 		*reg = FMC2_BWTR(cs);
311 		break;
312 	case FMC2_REG_PCSCNTR:
313 		*reg = FMC2_PCSCNTR;
314 		break;
315 	default:
316 		return -EINVAL;
317 	}
318 
319 	return 0;
320 }
321 
stm32_fmc2_ebi_set_bit_field(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)322 static int stm32_fmc2_ebi_set_bit_field(struct stm32_fmc2_ebi *ebi,
323 					const struct stm32_fmc2_prop *prop,
324 					int cs, u32 setup)
325 {
326 	u32 reg;
327 	int ret;
328 
329 	ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
330 	if (ret)
331 		return ret;
332 
333 	clrsetbits_le32(ebi->io_base + reg, prop->reg_mask,
334 			setup ? prop->reg_mask : 0);
335 
336 	return 0;
337 }
338 
stm32_fmc2_ebi_set_trans_type(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)339 static int stm32_fmc2_ebi_set_trans_type(struct stm32_fmc2_ebi *ebi,
340 					 const struct stm32_fmc2_prop *prop,
341 					 int cs, u32 setup)
342 {
343 	u32 bcr_mask, bcr = FMC2_BCR_WREN;
344 	u32 btr_mask, btr = 0;
345 	u32 bwtr_mask, bwtr = 0;
346 
347 	bwtr_mask = FMC2_BXTR_ACCMOD;
348 	btr_mask = FMC2_BXTR_ACCMOD;
349 	bcr_mask = FMC2_BCR_MUXEN | FMC2_BCR_MTYP | FMC2_BCR_FACCEN |
350 		   FMC2_BCR_WREN | FMC2_BCR_WAITEN | FMC2_BCR_BURSTEN |
351 		   FMC2_BCR_EXTMOD | FMC2_BCR_CBURSTRW;
352 
353 	switch (setup) {
354 	case FMC2_ASYNC_MODE_1_SRAM:
355 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_SRAM);
356 		/*
357 		 * MUXEN = 0, MTYP = 0, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
358 		 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
359 		 */
360 		break;
361 	case FMC2_ASYNC_MODE_1_PSRAM:
362 		/*
363 		 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
364 		 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
365 		 */
366 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
367 		break;
368 	case FMC2_ASYNC_MODE_A_SRAM:
369 		/*
370 		 * MUXEN = 0, MTYP = 0, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
371 		 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 0
372 		 */
373 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_SRAM);
374 		bcr |= FMC2_BCR_EXTMOD;
375 		btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
376 		bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
377 		break;
378 	case FMC2_ASYNC_MODE_A_PSRAM:
379 		/*
380 		 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
381 		 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 0
382 		 */
383 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
384 		bcr |= FMC2_BCR_EXTMOD;
385 		btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
386 		bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
387 		break;
388 	case FMC2_ASYNC_MODE_2_NOR:
389 		/*
390 		 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
391 		 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
392 		 */
393 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
394 		bcr |= FMC2_BCR_FACCEN;
395 		break;
396 	case FMC2_ASYNC_MODE_B_NOR:
397 		/*
398 		 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
399 		 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 1
400 		 */
401 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
402 		bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
403 		btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_B);
404 		bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_B);
405 		break;
406 	case FMC2_ASYNC_MODE_C_NOR:
407 		/*
408 		 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
409 		 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 2
410 		 */
411 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
412 		bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
413 		btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_C);
414 		bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_C);
415 		break;
416 	case FMC2_ASYNC_MODE_D_NOR:
417 		/*
418 		 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
419 		 * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 3
420 		 */
421 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
422 		bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
423 		btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
424 		bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
425 		break;
426 	case FMC2_SYNC_READ_SYNC_WRITE_PSRAM:
427 		/*
428 		 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 1, WAITEN = 0,
429 		 * WREN = 1, EXTMOD = 0, CBURSTRW = 1, ACCMOD = 0
430 		 */
431 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
432 		bcr |= FMC2_BCR_BURSTEN | FMC2_BCR_CBURSTRW;
433 		break;
434 	case FMC2_SYNC_READ_ASYNC_WRITE_PSRAM:
435 		/*
436 		 * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 1, WAITEN = 0,
437 		 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
438 		 */
439 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
440 		bcr |= FMC2_BCR_BURSTEN;
441 		break;
442 	case FMC2_SYNC_READ_SYNC_WRITE_NOR:
443 		/*
444 		 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 1, WAITEN = 0,
445 		 * WREN = 1, EXTMOD = 0, CBURSTRW = 1, ACCMOD = 0
446 		 */
447 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
448 		bcr |= FMC2_BCR_FACCEN | FMC2_BCR_BURSTEN | FMC2_BCR_CBURSTRW;
449 		break;
450 	case FMC2_SYNC_READ_ASYNC_WRITE_NOR:
451 		/*
452 		 * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 1, WAITEN = 0,
453 		 * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
454 		 */
455 		bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
456 		bcr |= FMC2_BCR_FACCEN | FMC2_BCR_BURSTEN;
457 		break;
458 	default:
459 		/* Type of transaction not supported */
460 		return -EINVAL;
461 	}
462 
463 	if (bcr & FMC2_BCR_EXTMOD)
464 		clrsetbits_le32(ebi->io_base + FMC2_BWTR(cs),
465 				bwtr_mask, bwtr);
466 	clrsetbits_le32(ebi->io_base + FMC2_BTR(cs), btr_mask, btr);
467 	clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), bcr_mask, bcr);
468 
469 	return 0;
470 }
471 
stm32_fmc2_ebi_set_buswidth(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)472 static int stm32_fmc2_ebi_set_buswidth(struct stm32_fmc2_ebi *ebi,
473 				       const struct stm32_fmc2_prop *prop,
474 				       int cs, u32 setup)
475 {
476 	u32 val;
477 
478 	switch (setup) {
479 	case FMC2_BUSWIDTH_8:
480 		val = FIELD_PREP(FMC2_BCR_MWID, FMC2_BCR_MWID_8);
481 		break;
482 	case FMC2_BUSWIDTH_16:
483 		val = FIELD_PREP(FMC2_BCR_MWID, FMC2_BCR_MWID_16);
484 		break;
485 	default:
486 		/* Buswidth not supported */
487 		return -EINVAL;
488 	}
489 
490 	clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_MWID, val);
491 
492 	return 0;
493 }
494 
stm32_fmc2_ebi_set_cpsize(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)495 static int stm32_fmc2_ebi_set_cpsize(struct stm32_fmc2_ebi *ebi,
496 				     const struct stm32_fmc2_prop *prop,
497 				     int cs, u32 setup)
498 {
499 	u32 val;
500 
501 	switch (setup) {
502 	case FMC2_CPSIZE_0:
503 		val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_0);
504 		break;
505 	case FMC2_CPSIZE_128:
506 		val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_128);
507 		break;
508 	case FMC2_CPSIZE_256:
509 		val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_256);
510 		break;
511 	case FMC2_CPSIZE_512:
512 		val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_512);
513 		break;
514 	case FMC2_CPSIZE_1024:
515 		val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_1024);
516 		break;
517 	default:
518 		/* Cpsize not supported */
519 		return -EINVAL;
520 	}
521 
522 	clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_CPSIZE, val);
523 
524 	return 0;
525 }
526 
stm32_fmc2_ebi_set_bl_setup(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)527 static int stm32_fmc2_ebi_set_bl_setup(struct stm32_fmc2_ebi *ebi,
528 				       const struct stm32_fmc2_prop *prop,
529 				       int cs, u32 setup)
530 {
531 	u32 val;
532 
533 	val = min_t(u32, setup, FMC2_BCR_NBLSET_MAX);
534 	val = FIELD_PREP(FMC2_BCR_NBLSET, val);
535 	clrsetbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_NBLSET, val);
536 
537 	return 0;
538 }
539 
stm32_fmc2_ebi_set_address_setup(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)540 static int stm32_fmc2_ebi_set_address_setup(struct stm32_fmc2_ebi *ebi,
541 					    const struct stm32_fmc2_prop *prop,
542 					    int cs, u32 setup)
543 {
544 	u32 bcr = readl(ebi->io_base + FMC2_BCR(cs));
545 	u32 bxtr = prop->reg_type == FMC2_REG_BWTR ?
546 		   readl(ebi->io_base + FMC2_BWTR(cs)) :
547 		   readl(ebi->io_base + FMC2_BTR(cs));
548 	u32 reg, val = FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
549 	int ret;
550 
551 	ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
552 	if (ret)
553 		return ret;
554 
555 	if ((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN)
556 		val = clamp_val(setup, 1, FMC2_BXTR_ADDSET_MAX);
557 	else
558 		val = min_t(u32, setup, FMC2_BXTR_ADDSET_MAX);
559 	val = FIELD_PREP(FMC2_BXTR_ADDSET, val);
560 	clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_ADDSET, val);
561 
562 	return 0;
563 }
564 
stm32_fmc2_ebi_set_address_hold(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)565 static int stm32_fmc2_ebi_set_address_hold(struct stm32_fmc2_ebi *ebi,
566 					   const struct stm32_fmc2_prop *prop,
567 					   int cs, u32 setup)
568 {
569 	u32 val, reg;
570 	int ret;
571 
572 	ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
573 	if (ret)
574 		return ret;
575 
576 	val = clamp_val(setup, 1, FMC2_BXTR_ADDHLD_MAX);
577 	val = FIELD_PREP(FMC2_BXTR_ADDHLD, val);
578 	clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_ADDHLD, val);
579 
580 	return 0;
581 }
582 
stm32_fmc2_ebi_set_data_setup(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)583 static int stm32_fmc2_ebi_set_data_setup(struct stm32_fmc2_ebi *ebi,
584 					 const struct stm32_fmc2_prop *prop,
585 					 int cs, u32 setup)
586 {
587 	u32 val, reg;
588 	int ret;
589 
590 	ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
591 	if (ret)
592 		return ret;
593 
594 	val = clamp_val(setup, 1, FMC2_BXTR_DATAST_MAX);
595 	val = FIELD_PREP(FMC2_BXTR_DATAST, val);
596 	clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_DATAST, val);
597 
598 	return 0;
599 }
600 
stm32_fmc2_ebi_set_bus_turnaround(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)601 static int stm32_fmc2_ebi_set_bus_turnaround(struct stm32_fmc2_ebi *ebi,
602 					     const struct stm32_fmc2_prop *prop,
603 					     int cs, u32 setup)
604 {
605 	u32 val, reg;
606 	int ret;
607 
608 	ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
609 	if (ret)
610 		return ret;
611 
612 	val = setup ? min_t(u32, setup - 1, FMC2_BXTR_BUSTURN_MAX) : 0;
613 	val = FIELD_PREP(FMC2_BXTR_BUSTURN, val);
614 	clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_BUSTURN, val);
615 
616 	return 0;
617 }
618 
stm32_fmc2_ebi_set_data_hold(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)619 static int stm32_fmc2_ebi_set_data_hold(struct stm32_fmc2_ebi *ebi,
620 					const struct stm32_fmc2_prop *prop,
621 					int cs, u32 setup)
622 {
623 	u32 val, reg;
624 	int ret;
625 
626 	ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
627 	if (ret)
628 		return ret;
629 
630 	if (prop->reg_type == FMC2_REG_BWTR)
631 		val = setup ? min_t(u32, setup - 1, FMC2_BXTR_DATAHLD_MAX) : 0;
632 	else
633 		val = min_t(u32, setup, FMC2_BXTR_DATAHLD_MAX);
634 	val = FIELD_PREP(FMC2_BXTR_DATAHLD, val);
635 	clrsetbits_le32(ebi->io_base + reg, FMC2_BXTR_DATAHLD, val);
636 
637 	return 0;
638 }
639 
stm32_fmc2_ebi_set_clk_period(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)640 static int stm32_fmc2_ebi_set_clk_period(struct stm32_fmc2_ebi *ebi,
641 					 const struct stm32_fmc2_prop *prop,
642 					 int cs, u32 setup)
643 {
644 	u32 val;
645 
646 	val = setup ? clamp_val(setup - 1, 1, FMC2_BTR_CLKDIV_MAX) : 1;
647 	val = FIELD_PREP(FMC2_BTR_CLKDIV, val);
648 	clrsetbits_le32(ebi->io_base + FMC2_BTR(cs), FMC2_BTR_CLKDIV, val);
649 
650 	return 0;
651 }
652 
stm32_fmc2_ebi_set_data_latency(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)653 static int stm32_fmc2_ebi_set_data_latency(struct stm32_fmc2_ebi *ebi,
654 					   const struct stm32_fmc2_prop *prop,
655 					   int cs, u32 setup)
656 {
657 	u32 val;
658 
659 	val = setup > 1 ? min_t(u32, setup - 2, FMC2_BTR_DATLAT_MAX) : 0;
660 	val = FIELD_PREP(FMC2_BTR_DATLAT, val);
661 	clrsetbits_le32(ebi->io_base + FMC2_BTR(cs), FMC2_BTR_DATLAT, val);
662 
663 	return 0;
664 }
665 
stm32_fmc2_ebi_set_max_low_pulse(struct stm32_fmc2_ebi * ebi,const struct stm32_fmc2_prop * prop,int cs,u32 setup)666 static int stm32_fmc2_ebi_set_max_low_pulse(struct stm32_fmc2_ebi *ebi,
667 					    const struct stm32_fmc2_prop *prop,
668 					    int cs, u32 setup)
669 {
670 	u32 old_val, new_val, pcscntr;
671 
672 	if (setup < 1)
673 		return 0;
674 
675 	pcscntr = readl(ebi->io_base + FMC2_PCSCNTR);
676 
677 	/* Enable counter for the bank */
678 	setbits_le32(ebi->io_base + FMC2_PCSCNTR, FMC2_PCSCNTR_CNTBEN(cs));
679 
680 	new_val = min_t(u32, setup - 1, FMC2_PCSCNTR_CSCOUNT_MAX);
681 	old_val = FIELD_GET(FMC2_PCSCNTR_CSCOUNT, pcscntr);
682 	if (old_val && new_val > old_val)
683 		/* Keep current counter value */
684 		return 0;
685 
686 	new_val = FIELD_PREP(FMC2_PCSCNTR_CSCOUNT, new_val);
687 	clrsetbits_le32(ebi->io_base + FMC2_PCSCNTR,
688 			FMC2_PCSCNTR_CSCOUNT, new_val);
689 
690 	return 0;
691 }
692 
693 static const struct stm32_fmc2_prop stm32_fmc2_child_props[] = {
694 	/* st,fmc2-ebi-cs-trans-type must be the first property */
695 	{
696 		.name = "st,fmc2-ebi-cs-transaction-type",
697 		.mprop = true,
698 		.set = stm32_fmc2_ebi_set_trans_type,
699 	},
700 	{
701 		.name = "st,fmc2-ebi-cs-cclk-enable",
702 		.bprop = true,
703 		.reg_type = FMC2_REG_BCR,
704 		.reg_mask = FMC2_BCR1_CCLKEN,
705 		.check = stm32_fmc2_ebi_check_cclk,
706 		.set = stm32_fmc2_ebi_set_bit_field,
707 	},
708 	{
709 		.name = "st,fmc2-ebi-cs-mux-enable",
710 		.bprop = true,
711 		.reg_type = FMC2_REG_BCR,
712 		.reg_mask = FMC2_BCR_MUXEN,
713 		.check = stm32_fmc2_ebi_check_mux,
714 		.set = stm32_fmc2_ebi_set_bit_field,
715 	},
716 	{
717 		.name = "st,fmc2-ebi-cs-buswidth",
718 		.reset_val = FMC2_BUSWIDTH_16,
719 		.set = stm32_fmc2_ebi_set_buswidth,
720 	},
721 	{
722 		.name = "st,fmc2-ebi-cs-waitpol-high",
723 		.bprop = true,
724 		.reg_type = FMC2_REG_BCR,
725 		.reg_mask = FMC2_BCR_WAITPOL,
726 		.set = stm32_fmc2_ebi_set_bit_field,
727 	},
728 	{
729 		.name = "st,fmc2-ebi-cs-waitcfg-enable",
730 		.bprop = true,
731 		.reg_type = FMC2_REG_BCR,
732 		.reg_mask = FMC2_BCR_WAITCFG,
733 		.check = stm32_fmc2_ebi_check_waitcfg,
734 		.set = stm32_fmc2_ebi_set_bit_field,
735 	},
736 	{
737 		.name = "st,fmc2-ebi-cs-wait-enable",
738 		.bprop = true,
739 		.reg_type = FMC2_REG_BCR,
740 		.reg_mask = FMC2_BCR_WAITEN,
741 		.check = stm32_fmc2_ebi_check_sync_trans,
742 		.set = stm32_fmc2_ebi_set_bit_field,
743 	},
744 	{
745 		.name = "st,fmc2-ebi-cs-asyncwait-enable",
746 		.bprop = true,
747 		.reg_type = FMC2_REG_BCR,
748 		.reg_mask = FMC2_BCR_ASYNCWAIT,
749 		.check = stm32_fmc2_ebi_check_async_trans,
750 		.set = stm32_fmc2_ebi_set_bit_field,
751 	},
752 	{
753 		.name = "st,fmc2-ebi-cs-cpsize",
754 		.check = stm32_fmc2_ebi_check_cpsize,
755 		.set = stm32_fmc2_ebi_set_cpsize,
756 	},
757 	{
758 		.name = "st,fmc2-ebi-cs-byte-lane-setup-ns",
759 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
760 		.set = stm32_fmc2_ebi_set_bl_setup,
761 	},
762 	{
763 		.name = "st,fmc2-ebi-cs-address-setup-ns",
764 		.reg_type = FMC2_REG_BTR,
765 		.reset_val = FMC2_BXTR_ADDSET_MAX,
766 		.check = stm32_fmc2_ebi_check_async_trans,
767 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
768 		.set = stm32_fmc2_ebi_set_address_setup,
769 	},
770 	{
771 		.name = "st,fmc2-ebi-cs-address-hold-ns",
772 		.reg_type = FMC2_REG_BTR,
773 		.reset_val = FMC2_BXTR_ADDHLD_MAX,
774 		.check = stm32_fmc2_ebi_check_address_hold,
775 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
776 		.set = stm32_fmc2_ebi_set_address_hold,
777 	},
778 	{
779 		.name = "st,fmc2-ebi-cs-data-setup-ns",
780 		.reg_type = FMC2_REG_BTR,
781 		.reset_val = FMC2_BXTR_DATAST_MAX,
782 		.check = stm32_fmc2_ebi_check_async_trans,
783 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
784 		.set = stm32_fmc2_ebi_set_data_setup,
785 	},
786 	{
787 		.name = "st,fmc2-ebi-cs-bus-turnaround-ns",
788 		.reg_type = FMC2_REG_BTR,
789 		.reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
790 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
791 		.set = stm32_fmc2_ebi_set_bus_turnaround,
792 	},
793 	{
794 		.name = "st,fmc2-ebi-cs-data-hold-ns",
795 		.reg_type = FMC2_REG_BTR,
796 		.check = stm32_fmc2_ebi_check_async_trans,
797 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
798 		.set = stm32_fmc2_ebi_set_data_hold,
799 	},
800 	{
801 		.name = "st,fmc2-ebi-cs-clk-period-ns",
802 		.reset_val = FMC2_BTR_CLKDIV_MAX + 1,
803 		.check = stm32_fmc2_ebi_check_clk_period,
804 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
805 		.set = stm32_fmc2_ebi_set_clk_period,
806 	},
807 	{
808 		.name = "st,fmc2-ebi-cs-data-latency-ns",
809 		.check = stm32_fmc2_ebi_check_sync_trans,
810 		.calculate = stm32_fmc2_ebi_ns_to_clk_period,
811 		.set = stm32_fmc2_ebi_set_data_latency,
812 	},
813 	{
814 		.name = "st,fmc2-ebi-cs-write-address-setup-ns",
815 		.reg_type = FMC2_REG_BWTR,
816 		.reset_val = FMC2_BXTR_ADDSET_MAX,
817 		.check = stm32_fmc2_ebi_check_async_trans,
818 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
819 		.set = stm32_fmc2_ebi_set_address_setup,
820 	},
821 	{
822 		.name = "st,fmc2-ebi-cs-write-address-hold-ns",
823 		.reg_type = FMC2_REG_BWTR,
824 		.reset_val = FMC2_BXTR_ADDHLD_MAX,
825 		.check = stm32_fmc2_ebi_check_address_hold,
826 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
827 		.set = stm32_fmc2_ebi_set_address_hold,
828 	},
829 	{
830 		.name = "st,fmc2-ebi-cs-write-data-setup-ns",
831 		.reg_type = FMC2_REG_BWTR,
832 		.reset_val = FMC2_BXTR_DATAST_MAX,
833 		.check = stm32_fmc2_ebi_check_async_trans,
834 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
835 		.set = stm32_fmc2_ebi_set_data_setup,
836 	},
837 	{
838 		.name = "st,fmc2-ebi-cs-write-bus-turnaround-ns",
839 		.reg_type = FMC2_REG_BWTR,
840 		.reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
841 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
842 		.set = stm32_fmc2_ebi_set_bus_turnaround,
843 	},
844 	{
845 		.name = "st,fmc2-ebi-cs-write-data-hold-ns",
846 		.reg_type = FMC2_REG_BWTR,
847 		.check = stm32_fmc2_ebi_check_async_trans,
848 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
849 		.set = stm32_fmc2_ebi_set_data_hold,
850 	},
851 	{
852 		.name = "st,fmc2-ebi-cs-max-low-pulse-ns",
853 		.calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
854 		.set = stm32_fmc2_ebi_set_max_low_pulse,
855 	},
856 };
857 
stm32_fmc2_ebi_parse_prop(struct stm32_fmc2_ebi * ebi,ofnode node,const struct stm32_fmc2_prop * prop,int cs)858 static int stm32_fmc2_ebi_parse_prop(struct stm32_fmc2_ebi *ebi,
859 				     ofnode node,
860 				     const struct stm32_fmc2_prop *prop,
861 				     int cs)
862 {
863 	u32 setup = 0;
864 
865 	if (!prop->set) {
866 		log_err("property %s is not well defined\n", prop->name);
867 		return -EINVAL;
868 	}
869 
870 	if (prop->check && prop->check(ebi, prop, cs))
871 		/* Skip this property */
872 		return 0;
873 
874 	if (prop->bprop) {
875 		bool bprop;
876 
877 		bprop = ofnode_read_bool(node, prop->name);
878 		if (prop->mprop && !bprop) {
879 			log_err("mandatory property %s not defined in the device tree\n",
880 				prop->name);
881 			return -EINVAL;
882 		}
883 
884 		if (bprop)
885 			setup = 1;
886 	} else {
887 		u32 val;
888 		int ret;
889 
890 		ret = ofnode_read_u32(node, prop->name, &val);
891 		if (prop->mprop && ret) {
892 			log_err("mandatory property %s not defined in the device tree\n",
893 				prop->name);
894 			return ret;
895 		}
896 
897 		if (ret)
898 			setup = prop->reset_val;
899 		else if (prop->calculate)
900 			setup = prop->calculate(ebi, cs, val);
901 		else
902 			setup = val;
903 	}
904 
905 	return prop->set(ebi, prop, cs, setup);
906 }
907 
stm32_fmc2_ebi_enable_bank(struct stm32_fmc2_ebi * ebi,int cs)908 static void stm32_fmc2_ebi_enable_bank(struct stm32_fmc2_ebi *ebi, int cs)
909 {
910 	setbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_MBKEN);
911 }
912 
stm32_fmc2_ebi_disable_bank(struct stm32_fmc2_ebi * ebi,int cs)913 static void stm32_fmc2_ebi_disable_bank(struct stm32_fmc2_ebi *ebi, int cs)
914 {
915 	clrbits_le32(ebi->io_base + FMC2_BCR(cs), FMC2_BCR_MBKEN);
916 }
917 
918 /* NWAIT signal can not be connected to EBI controller and NAND controller */
stm32_fmc2_ebi_nwait_used_by_ctrls(struct stm32_fmc2_ebi * ebi)919 static bool stm32_fmc2_ebi_nwait_used_by_ctrls(struct stm32_fmc2_ebi *ebi)
920 {
921 	unsigned int cs;
922 	u32 bcr;
923 
924 	for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
925 		if (!(ebi->bank_assigned & BIT(cs)))
926 			continue;
927 
928 		bcr = readl(ebi->io_base + FMC2_BCR(cs));
929 		if ((bcr & FMC2_BCR_WAITEN || bcr & FMC2_BCR_ASYNCWAIT) &&
930 		    ebi->bank_assigned & BIT(FMC2_NAND))
931 			return true;
932 	}
933 
934 	return false;
935 }
936 
stm32_fmc2_ebi_enable(struct stm32_fmc2_ebi * ebi)937 static void stm32_fmc2_ebi_enable(struct stm32_fmc2_ebi *ebi)
938 {
939 	setbits_le32(ebi->io_base + FMC2_BCR1, FMC2_BCR1_FMC2EN);
940 }
941 
stm32_fmc2_ebi_setup_cs(struct stm32_fmc2_ebi * ebi,ofnode node,u32 cs)942 static int stm32_fmc2_ebi_setup_cs(struct stm32_fmc2_ebi *ebi,
943 				   ofnode node, u32 cs)
944 {
945 	unsigned int i;
946 	int ret;
947 
948 	stm32_fmc2_ebi_disable_bank(ebi, cs);
949 
950 	for (i = 0; i < ARRAY_SIZE(stm32_fmc2_child_props); i++) {
951 		const struct stm32_fmc2_prop *p = &stm32_fmc2_child_props[i];
952 
953 		ret = stm32_fmc2_ebi_parse_prop(ebi, node, p, cs);
954 		if (ret) {
955 			log_err("property %s could not be set: %d\n",
956 				p->name, ret);
957 			return ret;
958 		}
959 	}
960 
961 	stm32_fmc2_ebi_enable_bank(ebi, cs);
962 
963 	return 0;
964 }
965 
stm32_fmc2_ebi_parse_dt(struct udevice * dev,struct stm32_fmc2_ebi * ebi)966 static int stm32_fmc2_ebi_parse_dt(struct udevice *dev,
967 				   struct stm32_fmc2_ebi *ebi)
968 {
969 	ofnode child;
970 	bool child_found = false;
971 	u32 bank;
972 	int ret;
973 
974 	dev_for_each_subnode(child, dev) {
975 		ret = ofnode_read_u32(child, "reg", &bank);
976 		if (ret) {
977 			dev_err(dev, "could not retrieve reg property: %d\n", ret);
978 			return ret;
979 		}
980 
981 		if (bank >= FMC2_MAX_BANKS) {
982 			dev_err(dev, "invalid reg value: %d\n", bank);
983 			return -EINVAL;
984 		}
985 
986 		if (ebi->bank_assigned & BIT(bank)) {
987 			dev_err(dev, "bank already assigned: %d\n", bank);
988 			return -EINVAL;
989 		}
990 
991 		if (bank < FMC2_MAX_EBI_CE) {
992 			ret = stm32_fmc2_ebi_setup_cs(ebi, child, bank);
993 			if (ret) {
994 				dev_err(dev, "setup chip select %d failed: %d\n", bank, ret);
995 				return ret;
996 			}
997 		}
998 
999 		ebi->bank_assigned |= BIT(bank);
1000 		child_found = true;
1001 	}
1002 
1003 	if (!child_found) {
1004 		dev_warn(dev, "no subnodes found, disable the driver.\n");
1005 		return -ENODEV;
1006 	}
1007 
1008 	if (stm32_fmc2_ebi_nwait_used_by_ctrls(ebi)) {
1009 		dev_err(dev, "NWAIT signal connected to EBI and NAND controllers\n");
1010 		return -EINVAL;
1011 	}
1012 
1013 	stm32_fmc2_ebi_enable(ebi);
1014 
1015 	return 0;
1016 }
1017 
stm32_fmc2_ebi_probe(struct udevice * dev)1018 static int stm32_fmc2_ebi_probe(struct udevice *dev)
1019 {
1020 	struct stm32_fmc2_ebi *ebi = dev_get_priv(dev);
1021 	struct reset_ctl reset;
1022 	int ret;
1023 
1024 	ebi->io_base = dev_read_addr(dev);
1025 	if (ebi->io_base == FDT_ADDR_T_NONE)
1026 		return -EINVAL;
1027 
1028 	ret = clk_get_by_index(dev, 0, &ebi->clk);
1029 	if (ret)
1030 		return ret;
1031 
1032 	ret = clk_enable(&ebi->clk);
1033 	if (ret)
1034 		return ret;
1035 
1036 	ret = reset_get_by_index(dev, 0, &reset);
1037 	if (!ret) {
1038 		reset_assert(&reset);
1039 		udelay(2);
1040 		reset_deassert(&reset);
1041 	}
1042 
1043 	return stm32_fmc2_ebi_parse_dt(dev, ebi);
1044 }
1045 
1046 static const struct udevice_id stm32_fmc2_ebi_match[] = {
1047 	{.compatible = "st,stm32mp1-fmc2-ebi"},
1048 	{ /* Sentinel */ }
1049 };
1050 
1051 U_BOOT_DRIVER(stm32_fmc2_ebi) = {
1052 	.name = "stm32_fmc2_ebi",
1053 	.id = UCLASS_NOP,
1054 	.of_match = stm32_fmc2_ebi_match,
1055 	.probe = stm32_fmc2_ebi_probe,
1056 	.priv_auto	= sizeof(struct stm32_fmc2_ebi),
1057 	.bind = dm_scan_fdt_dev,
1058 };
1059