1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2 /*
3  * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
4  */
5 
6 #define LOG_CATEGORY LOGC_BOARD
7 
8 #include <common.h>
9 #include <adc.h>
10 #include <bootm.h>
11 #include <clk.h>
12 #include <config.h>
13 #include <dm.h>
14 #include <env.h>
15 #include <env_internal.h>
16 #include <fdt_support.h>
17 #include <g_dnl.h>
18 #include <generic-phy.h>
19 #include <hang.h>
20 #include <i2c.h>
21 #include <init.h>
22 #include <led.h>
23 #include <log.h>
24 #include <malloc.h>
25 #include <misc.h>
26 #include <mtd_node.h>
27 #include <net.h>
28 #include <netdev.h>
29 #include <phy.h>
30 #include <remoteproc.h>
31 #include <reset.h>
32 #include <syscon.h>
33 #include <usb.h>
34 #include <watchdog.h>
35 #include <asm/global_data.h>
36 #include <asm/io.h>
37 #include <asm/gpio.h>
38 #include <asm/arch/stm32.h>
39 #include <asm/arch/sys_proto.h>
40 #include <dm/ofnode.h>
41 #include <jffs2/load_kernel.h>
42 #include <linux/bitops.h>
43 #include <linux/delay.h>
44 #include <linux/err.h>
45 #include <linux/iopoll.h>
46 #include <power/regulator.h>
47 #include <usb/dwc2_udc.h>
48 
49 #include "../../st/common/stusb160x.h"
50 
51 /* SYSCFG registers */
52 #define SYSCFG_BOOTR		0x00
53 #define SYSCFG_PMCSETR		0x04
54 #define SYSCFG_IOCTRLSETR	0x18
55 #define SYSCFG_ICNR		0x1C
56 #define SYSCFG_CMPCR		0x20
57 #define SYSCFG_CMPENSETR	0x24
58 #define SYSCFG_PMCCLRR		0x44
59 
60 #define SYSCFG_BOOTR_BOOT_MASK		GENMASK(2, 0)
61 #define SYSCFG_BOOTR_BOOTPD_SHIFT	4
62 
63 #define SYSCFG_IOCTRLSETR_HSLVEN_TRACE		BIT(0)
64 #define SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI	BIT(1)
65 #define SYSCFG_IOCTRLSETR_HSLVEN_ETH		BIT(2)
66 #define SYSCFG_IOCTRLSETR_HSLVEN_SDMMC		BIT(3)
67 #define SYSCFG_IOCTRLSETR_HSLVEN_SPI		BIT(4)
68 
69 #define SYSCFG_CMPCR_SW_CTRL		BIT(1)
70 #define SYSCFG_CMPCR_READY		BIT(8)
71 
72 #define SYSCFG_CMPENSETR_MPU_EN		BIT(0)
73 
74 #define SYSCFG_PMCSETR_ETH_CLK_SEL	BIT(16)
75 #define SYSCFG_PMCSETR_ETH_REF_CLK_SEL	BIT(17)
76 
77 #define SYSCFG_PMCSETR_ETH_SELMII	BIT(20)
78 
79 #define SYSCFG_PMCSETR_ETH_SEL_MASK	GENMASK(23, 21)
80 #define SYSCFG_PMCSETR_ETH_SEL_GMII_MII	0
81 #define SYSCFG_PMCSETR_ETH_SEL_RGMII	BIT(21)
82 #define SYSCFG_PMCSETR_ETH_SEL_RMII	BIT(23)
83 
84 /*
85  * Get a global data pointer
86  */
87 DECLARE_GLOBAL_DATA_PTR;
88 
89 #define USB_LOW_THRESHOLD_UV		200000
90 #define USB_WARNING_LOW_THRESHOLD_UV	660000
91 #define USB_START_LOW_THRESHOLD_UV	1230000
92 #define USB_START_HIGH_THRESHOLD_UV	2150000
93 
board_early_init_f(void)94 int board_early_init_f(void)
95 {
96 	/* nothing to do, only used in SPL */
97 	return 0;
98 }
99 
checkboard(void)100 int checkboard(void)
101 {
102 	int ret;
103 	char *mode;
104 	u32 otp;
105 	struct udevice *dev;
106 	const char *fdt_compat;
107 	int fdt_compat_len;
108 
109 	if (IS_ENABLED(CONFIG_TFABOOT)) {
110 		if (IS_ENABLED(CONFIG_STM32MP15x_STM32IMAGE))
111 			mode = "trusted - stm32image";
112 		else
113 			mode = "trusted";
114 	} else {
115 		mode = "basic";
116 	}
117 
118 	fdt_compat = fdt_getprop(gd->fdt_blob, 0, "compatible",
119 				 &fdt_compat_len);
120 
121 	log_info("Board: stm32mp1 in %s mode (%s)\n", mode,
122 		 fdt_compat && fdt_compat_len ? fdt_compat : "");
123 
124 	/* display the STMicroelectronics board identification */
125 	if (CONFIG_IS_ENABLED(CMD_STBOARD)) {
126 		ret = uclass_get_device_by_driver(UCLASS_MISC,
127 						  DM_DRIVER_GET(stm32mp_bsec),
128 						  &dev);
129 		if (!ret)
130 			ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
131 					&otp, sizeof(otp));
132 		if (ret > 0 && otp)
133 			log_info("Board: MB%04x Var%d.%d Rev.%c-%02d\n",
134 				 otp >> 16,
135 				 (otp >> 12) & 0xF,
136 				 (otp >> 4) & 0xF,
137 				 ((otp >> 8) & 0xF) - 1 + 'A',
138 				 otp & 0xF);
139 	}
140 
141 	return 0;
142 }
143 
board_key_check(void)144 static void board_key_check(void)
145 {
146 	ofnode node;
147 	struct gpio_desc gpio;
148 	enum forced_boot_mode boot_mode = BOOT_NORMAL;
149 
150 	if (!IS_ENABLED(CONFIG_FASTBOOT) && !IS_ENABLED(CONFIG_CMD_STM32PROG))
151 		return;
152 
153 	node = ofnode_path("/config");
154 	if (!ofnode_valid(node)) {
155 		log_debug("no /config node?\n");
156 		return;
157 	}
158 	if (IS_ENABLED(CONFIG_FASTBOOT)) {
159 		if (gpio_request_by_name_nodev(node, "st,fastboot-gpios", 0,
160 					       &gpio, GPIOD_IS_IN)) {
161 			log_debug("could not find a /config/st,fastboot-gpios\n");
162 		} else {
163 			udelay(20);
164 			if (dm_gpio_get_value(&gpio)) {
165 				log_notice("Fastboot key pressed, ");
166 				boot_mode = BOOT_FASTBOOT;
167 			}
168 
169 			dm_gpio_free(NULL, &gpio);
170 		}
171 	}
172 	if (IS_ENABLED(CONFIG_CMD_STM32PROG)) {
173 		if (gpio_request_by_name_nodev(node, "st,stm32prog-gpios", 0,
174 					       &gpio, GPIOD_IS_IN)) {
175 			log_debug("could not find a /config/st,stm32prog-gpios\n");
176 		} else {
177 			udelay(20);
178 			if (dm_gpio_get_value(&gpio)) {
179 				log_notice("STM32Programmer key pressed, ");
180 				boot_mode = BOOT_STM32PROG;
181 			}
182 			dm_gpio_free(NULL, &gpio);
183 		}
184 	}
185 	if (boot_mode != BOOT_NORMAL) {
186 		log_notice("entering download mode...\n");
187 		clrsetbits_le32(TAMP_BOOT_CONTEXT,
188 				TAMP_BOOT_FORCED_MASK,
189 				boot_mode);
190 	}
191 }
192 
g_dnl_board_usb_cable_connected(void)193 int g_dnl_board_usb_cable_connected(void)
194 {
195 	struct udevice *dwc2_udc_otg;
196 	int ret;
197 
198 	if (!IS_ENABLED(CONFIG_USB_GADGET_DWC2_OTG))
199 		return -ENODEV;
200 
201 	/* if typec stusb160x is present, means DK1 or DK2 board */
202 	ret = stusb160x_cable_connected();
203 	if (ret >= 0)
204 		return ret;
205 
206 	ret = uclass_get_device_by_driver(UCLASS_USB_GADGET_GENERIC,
207 					  DM_DRIVER_GET(dwc2_udc_otg),
208 					  &dwc2_udc_otg);
209 	if (ret) {
210 		log_debug("dwc2_udc_otg init failed\n");
211 		return ret;
212 	}
213 
214 	return dwc2_udc_B_session_valid(dwc2_udc_otg);
215 }
216 
217 #ifdef CONFIG_USB_GADGET_DOWNLOAD
218 #define STM32MP1_G_DNL_DFU_PRODUCT_NUM 0xdf11
219 #define STM32MP1_G_DNL_FASTBOOT_PRODUCT_NUM 0x0afb
220 
g_dnl_bind_fixup(struct usb_device_descriptor * dev,const char * name)221 int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
222 {
223 	if (IS_ENABLED(CONFIG_DFU_OVER_USB) &&
224 	    !strcmp(name, "usb_dnl_dfu"))
225 		put_unaligned(STM32MP1_G_DNL_DFU_PRODUCT_NUM, &dev->idProduct);
226 	else if (IS_ENABLED(CONFIG_FASTBOOT) &&
227 		 !strcmp(name, "usb_dnl_fastboot"))
228 		put_unaligned(STM32MP1_G_DNL_FASTBOOT_PRODUCT_NUM,
229 			      &dev->idProduct);
230 	else
231 		put_unaligned(CONFIG_USB_GADGET_PRODUCT_NUM, &dev->idProduct);
232 
233 	return 0;
234 }
235 #endif /* CONFIG_USB_GADGET_DOWNLOAD */
236 
get_led(struct udevice ** dev,char * led_string)237 static int get_led(struct udevice **dev, char *led_string)
238 {
239 	const char *led_name;
240 	int ret;
241 
242 	led_name = ofnode_conf_read_str(led_string);
243 	if (!led_name) {
244 		log_debug("could not find %s config string\n", led_string);
245 		return -ENOENT;
246 	}
247 	ret = led_get_by_label(led_name, dev);
248 	if (ret) {
249 		log_debug("get=%d\n", ret);
250 		return ret;
251 	}
252 
253 	return 0;
254 }
255 
setup_led(enum led_state_t cmd)256 static int setup_led(enum led_state_t cmd)
257 {
258 	struct udevice *dev;
259 	int ret;
260 
261 	if (!CONFIG_IS_ENABLED(LED))
262 		return 0;
263 
264 	ret = get_led(&dev, "u-boot,boot-led");
265 	if (ret)
266 		return ret;
267 
268 	ret = led_set_state(dev, cmd);
269 	return ret;
270 }
271 
led_error_blink(u32 nb_blink)272 static void __maybe_unused led_error_blink(u32 nb_blink)
273 {
274 	int ret;
275 	struct udevice *led;
276 	u32 i;
277 
278 	if (!nb_blink)
279 		return;
280 
281 	if (CONFIG_IS_ENABLED(LED)) {
282 		ret = get_led(&led, "u-boot,error-led");
283 		if (!ret) {
284 			/* make u-boot,error-led blinking */
285 			/* if U32_MAX and 125ms interval, for 17.02 years */
286 			for (i = 0; i < 2 * nb_blink; i++) {
287 				led_set_state(led, LEDST_TOGGLE);
288 				mdelay(125);
289 				WATCHDOG_RESET();
290 			}
291 			led_set_state(led, LEDST_ON);
292 		}
293 	}
294 
295 	/* infinite: the boot process must be stopped */
296 	if (nb_blink == U32_MAX)
297 		hang();
298 }
299 
adc_measurement(ofnode node,int adc_count,int * min_uV,int * max_uV)300 static int adc_measurement(ofnode node, int adc_count, int *min_uV, int *max_uV)
301 {
302 	struct ofnode_phandle_args adc_args;
303 	struct udevice *adc;
304 	unsigned int raw;
305 	int ret, uV;
306 	int i;
307 
308 	for (i = 0; i < adc_count; i++) {
309 		if (ofnode_parse_phandle_with_args(node, "st,adc_usb_pd",
310 						   "#io-channel-cells", 0, i,
311 						   &adc_args)) {
312 			log_debug("can't find /config/st,adc_usb_pd\n");
313 			return 0;
314 		}
315 
316 		ret = uclass_get_device_by_ofnode(UCLASS_ADC, adc_args.node,
317 						  &adc);
318 
319 		if (ret) {
320 			log_err("Can't get adc device(%d)\n", ret);
321 			return ret;
322 		}
323 
324 		ret = adc_channel_single_shot(adc->name, adc_args.args[0],
325 					      &raw);
326 		if (ret) {
327 			log_err("single shot failed for %s[%d]!\n",
328 				adc->name, adc_args.args[0]);
329 			return ret;
330 		}
331 		/* Convert to uV */
332 		if (!adc_raw_to_uV(adc, raw, &uV)) {
333 			if (uV > *max_uV)
334 				*max_uV = uV;
335 			if (uV < *min_uV)
336 				*min_uV = uV;
337 			log_debug("%s[%02d] = %u, %d uV\n",
338 				  adc->name, adc_args.args[0], raw, uV);
339 		} else {
340 			log_err("Can't get uV value for %s[%d]\n",
341 				adc->name, adc_args.args[0]);
342 		}
343 	}
344 
345 	return 0;
346 }
347 
board_check_usb_power(void)348 static int board_check_usb_power(void)
349 {
350 	ofnode node;
351 	int max_uV = 0;
352 	int min_uV = USB_START_HIGH_THRESHOLD_UV;
353 	int adc_count, ret;
354 	u32 nb_blink;
355 	u8 i;
356 
357 	if (!IS_ENABLED(CONFIG_ADC))
358 		return -ENODEV;
359 
360 	node = ofnode_path("/config");
361 	if (!ofnode_valid(node)) {
362 		log_debug("no /config node?\n");
363 		return -ENOENT;
364 	}
365 
366 	/*
367 	 * Retrieve the ADC channels devices and get measurement
368 	 * for each of them
369 	 */
370 	adc_count = ofnode_count_phandle_with_args(node, "st,adc_usb_pd",
371 						   "#io-channel-cells", 0);
372 	if (adc_count < 0) {
373 		if (adc_count == -ENOENT)
374 			return 0;
375 
376 		log_err("Can't find adc channel (%d)\n", adc_count);
377 
378 		return adc_count;
379 	}
380 
381 	/* perform maximum of 2 ADC measurements to detect power supply current */
382 	for (i = 0; i < 2; i++) {
383 		ret = adc_measurement(node, adc_count, &min_uV, &max_uV);
384 		if (ret)
385 			return ret;
386 
387 		/*
388 		 * If highest value is inside 1.23 Volts and 2.10 Volts, that means
389 		 * board is plugged on an USB-C 3A power supply and boot process can
390 		 * continue.
391 		 */
392 		if (max_uV > USB_START_LOW_THRESHOLD_UV &&
393 		    max_uV <= USB_START_HIGH_THRESHOLD_UV &&
394 		    min_uV <= USB_LOW_THRESHOLD_UV)
395 			return 0;
396 
397 		if (i == 0) {
398 			log_err("Previous ADC measurements was not the one expected, retry in 20ms\n");
399 			mdelay(20);  /* equal to max tPDDebounce duration (min 10ms - max 20ms) */
400 		}
401 	}
402 
403 	log_notice("****************************************************\n");
404 	/*
405 	 * If highest and lowest value are either both below
406 	 * USB_LOW_THRESHOLD_UV or both above USB_LOW_THRESHOLD_UV, that
407 	 * means USB TYPE-C is in unattached mode, this is an issue, make
408 	 * u-boot,error-led blinking and stop boot process.
409 	 */
410 	if ((max_uV > USB_LOW_THRESHOLD_UV &&
411 	     min_uV > USB_LOW_THRESHOLD_UV) ||
412 	     (max_uV <= USB_LOW_THRESHOLD_UV &&
413 	     min_uV <= USB_LOW_THRESHOLD_UV)) {
414 		log_notice("* ERROR USB TYPE-C connection in unattached mode   *\n");
415 		log_notice("* Check that USB TYPE-C cable is correctly plugged *\n");
416 		/* with 125ms interval, led will blink for 17.02 years ....*/
417 		nb_blink = U32_MAX;
418 	}
419 
420 	if (max_uV > USB_LOW_THRESHOLD_UV &&
421 	    max_uV <= USB_WARNING_LOW_THRESHOLD_UV &&
422 	    min_uV <= USB_LOW_THRESHOLD_UV) {
423 		log_notice("*        WARNING 500mA power supply detected       *\n");
424 		nb_blink = 2;
425 	}
426 
427 	if (max_uV > USB_WARNING_LOW_THRESHOLD_UV &&
428 	    max_uV <= USB_START_LOW_THRESHOLD_UV &&
429 	    min_uV <= USB_LOW_THRESHOLD_UV) {
430 		log_notice("*       WARNING 1.5A power supply detected        *\n");
431 		nb_blink = 3;
432 	}
433 
434 	/*
435 	 * If highest value is above 2.15 Volts that means that the USB TypeC
436 	 * supplies more than 3 Amp, this is not compliant with TypeC specification
437 	 */
438 	if (max_uV > USB_START_HIGH_THRESHOLD_UV) {
439 		log_notice("*      USB TYPE-C charger not compliant with       *\n");
440 		log_notice("*                   specification                  *\n");
441 		log_notice("****************************************************\n\n");
442 		/* with 125ms interval, led will blink for 17.02 years ....*/
443 		nb_blink = U32_MAX;
444 	} else {
445 		log_notice("*     Current too low, use a 3A power supply!      *\n");
446 		log_notice("****************************************************\n\n");
447 	}
448 
449 	led_error_blink(nb_blink);
450 
451 	return 0;
452 }
453 
sysconf_init(void)454 static void sysconf_init(void)
455 {
456 	u8 *syscfg;
457 	struct udevice *pwr_dev;
458 	struct udevice *pwr_reg;
459 	struct udevice *dev;
460 	u32 otp = 0;
461 	int ret;
462 	u32 bootr, val;
463 
464 	syscfg = (u8 *)syscon_get_first_range(STM32MP_SYSCON_SYSCFG);
465 
466 	/* interconnect update : select master using the port 1 */
467 	/* LTDC = AXI_M9 */
468 	/* GPU  = AXI_M8 */
469 	/* today information is hardcoded in U-Boot */
470 	writel(BIT(9), syscfg + SYSCFG_ICNR);
471 
472 	/* disable Pull-Down for boot pin connected to VDD */
473 	bootr = readl(syscfg + SYSCFG_BOOTR);
474 	bootr &= ~(SYSCFG_BOOTR_BOOT_MASK << SYSCFG_BOOTR_BOOTPD_SHIFT);
475 	bootr |= (bootr & SYSCFG_BOOTR_BOOT_MASK) << SYSCFG_BOOTR_BOOTPD_SHIFT;
476 	writel(bootr, syscfg + SYSCFG_BOOTR);
477 
478 	/* High Speed Low Voltage Pad mode Enable for SPI, SDMMC, ETH, QSPI
479 	 * and TRACE. Needed above ~50MHz and conditioned by AFMUX selection.
480 	 * The customer will have to disable this for low frequencies
481 	 * or if AFMUX is selected but the function not used, typically for
482 	 * TRACE. Otherwise, impact on power consumption.
483 	 *
484 	 * WARNING:
485 	 *   enabling High Speed mode while VDD>2.7V
486 	 *   with the OTP product_below_2v5 (OTP 18, BIT 13)
487 	 *   erroneously set to 1 can damage the IC!
488 	 *   => U-Boot set the register only if VDD < 2.7V (in DT)
489 	 *      but this value need to be consistent with board design
490 	 */
491 	ret = uclass_get_device_by_driver(UCLASS_PMIC,
492 					  DM_DRIVER_GET(stm32mp_pwr_pmic),
493 					  &pwr_dev);
494 	if (!ret && IS_ENABLED(CONFIG_DM_REGULATOR)) {
495 		ret = uclass_get_device_by_driver(UCLASS_MISC,
496 						  DM_DRIVER_GET(stm32mp_bsec),
497 						  &dev);
498 		if (ret) {
499 			log_err("Can't find stm32mp_bsec driver\n");
500 			return;
501 		}
502 
503 		ret = misc_read(dev, STM32_BSEC_SHADOW(18), &otp, 4);
504 		if (ret > 0)
505 			otp = otp & BIT(13);
506 
507 		/* get VDD = vdd-supply */
508 		ret = device_get_supply_regulator(pwr_dev, "vdd-supply",
509 						  &pwr_reg);
510 
511 		/* check if VDD is Low Voltage */
512 		if (!ret) {
513 			if (regulator_get_value(pwr_reg) < 2700000) {
514 				writel(SYSCFG_IOCTRLSETR_HSLVEN_TRACE |
515 				       SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI |
516 				       SYSCFG_IOCTRLSETR_HSLVEN_ETH |
517 				       SYSCFG_IOCTRLSETR_HSLVEN_SDMMC |
518 				       SYSCFG_IOCTRLSETR_HSLVEN_SPI,
519 				       syscfg + SYSCFG_IOCTRLSETR);
520 
521 				if (!otp)
522 					log_err("product_below_2v5=0: HSLVEN protected by HW\n");
523 			} else {
524 				if (otp)
525 					log_err("product_below_2v5=1: HSLVEN update is destructive, no update as VDD>2.7V\n");
526 			}
527 		} else {
528 			log_debug("VDD unknown");
529 		}
530 	}
531 
532 	/* activate automatic I/O compensation
533 	 * warning: need to ensure CSI enabled and ready in clock driver
534 	 */
535 	writel(SYSCFG_CMPENSETR_MPU_EN, syscfg + SYSCFG_CMPENSETR);
536 
537 	/* poll until ready (1s timeout) */
538 	ret = readl_poll_timeout(syscfg + SYSCFG_CMPCR, val,
539 				 val & SYSCFG_CMPCR_READY,
540 				 1000000);
541 	if (ret) {
542 		log_err("SYSCFG: I/O compensation failed, timeout.\n");
543 		led_error_blink(10);
544 	}
545 
546 	clrbits_le32(syscfg + SYSCFG_CMPCR, SYSCFG_CMPCR_SW_CTRL);
547 }
548 
549 /* Fix to make I2C1 usable on DK2 for touchscreen usage in kernel */
dk2_i2c1_fix(void)550 static int dk2_i2c1_fix(void)
551 {
552 	ofnode node;
553 	struct gpio_desc hdmi, audio;
554 	int ret = 0;
555 
556 	if (!IS_ENABLED(CONFIG_DM_REGULATOR))
557 		return -ENODEV;
558 
559 	node = ofnode_path("/soc/i2c@40012000/hdmi-transmitter@39");
560 	if (!ofnode_valid(node)) {
561 		log_debug("no hdmi-transmitter@39 ?\n");
562 		return -ENOENT;
563 	}
564 
565 	if (gpio_request_by_name_nodev(node, "reset-gpios", 0,
566 				       &hdmi, GPIOD_IS_OUT)) {
567 		log_debug("could not find reset-gpios\n");
568 		return -ENOENT;
569 	}
570 
571 	node = ofnode_path("/soc/i2c@40012000/cs42l51@4a");
572 	if (!ofnode_valid(node)) {
573 		log_debug("no cs42l51@4a ?\n");
574 		return -ENOENT;
575 	}
576 
577 	if (gpio_request_by_name_nodev(node, "reset-gpios", 0,
578 				       &audio, GPIOD_IS_OUT)) {
579 		log_debug("could not find reset-gpios\n");
580 		return -ENOENT;
581 	}
582 
583 	/* before power up, insure that HDMI and AUDIO IC is under reset */
584 	ret = dm_gpio_set_value(&hdmi, 1);
585 	if (ret) {
586 		log_err("can't set_value for hdmi_nrst gpio");
587 		goto error;
588 	}
589 	ret = dm_gpio_set_value(&audio, 1);
590 	if (ret) {
591 		log_err("can't set_value for audio_nrst gpio");
592 		goto error;
593 	}
594 
595 	/* power-up audio IC */
596 	regulator_autoset_by_name("v1v8_audio", NULL);
597 
598 	/* power-up HDMI IC */
599 	regulator_autoset_by_name("v1v2_hdmi", NULL);
600 	regulator_autoset_by_name("v3v3_hdmi", NULL);
601 
602 error:
603 	return ret;
604 }
605 
board_is_dk2(void)606 static bool board_is_dk2(void)
607 {
608 	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
609 	    of_machine_is_compatible("st,stm32mp157c-dk2"))
610 		return true;
611 
612 	return false;
613 }
614 
board_is_ev1(void)615 static bool board_is_ev1(void)
616 {
617 	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
618 	    (of_machine_is_compatible("st,stm32mp157a-ev1") ||
619 	     of_machine_is_compatible("st,stm32mp157c-ev1") ||
620 	     of_machine_is_compatible("st,stm32mp157d-ev1") ||
621 	     of_machine_is_compatible("st,stm32mp157f-ev1")))
622 		return true;
623 
624 	return false;
625 }
626 
627 /* touchscreen driver: only used for pincontrol configuration */
628 static const struct udevice_id goodix_ids[] = {
629 	{ .compatible = "goodix,gt9147", },
630 	{ }
631 };
632 
633 U_BOOT_DRIVER(goodix) = {
634 	.name		= "goodix",
635 	.id		= UCLASS_NOP,
636 	.of_match	= goodix_ids,
637 };
638 
board_ev1_init(void)639 static void board_ev1_init(void)
640 {
641 	struct udevice *dev;
642 
643 	/* configure IRQ line on EV1 for touchscreen before LCD reset */
644 	uclass_get_device_by_driver(UCLASS_NOP, DM_DRIVER_GET(goodix), &dev);
645 }
646 
647 /* board dependent setup after realloc */
board_init(void)648 int board_init(void)
649 {
650 	board_key_check();
651 
652 	if (board_is_ev1())
653 		board_ev1_init();
654 
655 	if (board_is_dk2())
656 		dk2_i2c1_fix();
657 
658 	if (IS_ENABLED(CONFIG_DM_REGULATOR))
659 		regulators_enable_boot_on(_DEBUG);
660 
661 	if (!IS_ENABLED(CONFIG_TFABOOT))
662 		sysconf_init();
663 
664 	if (CONFIG_IS_ENABLED(LED))
665 		led_default_state();
666 
667 	setup_led(LEDST_ON);
668 
669 	return 0;
670 }
671 
board_late_init(void)672 int board_late_init(void)
673 {
674 	const void *fdt_compat;
675 	int fdt_compat_len;
676 	int ret;
677 	u32 otp;
678 	struct udevice *dev;
679 	char buf[10];
680 	char dtb_name[256];
681 	int buf_len;
682 
683 	if (IS_ENABLED(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG)) {
684 		fdt_compat = fdt_getprop(gd->fdt_blob, 0, "compatible",
685 					 &fdt_compat_len);
686 		if (fdt_compat && fdt_compat_len) {
687 			if (strncmp(fdt_compat, "st,", 3) != 0) {
688 				env_set("board_name", fdt_compat);
689 			} else {
690 				env_set("board_name", fdt_compat + 3);
691 
692 				buf_len = sizeof(dtb_name);
693 				strncpy(dtb_name, fdt_compat + 3, buf_len);
694 				buf_len -= strlen(fdt_compat + 3);
695 				strncat(dtb_name, ".dtb", buf_len);
696 				env_set("fdtfile", dtb_name);
697 			}
698 		}
699 		ret = uclass_get_device_by_driver(UCLASS_MISC,
700 						  DM_DRIVER_GET(stm32mp_bsec),
701 						  &dev);
702 
703 		if (!ret)
704 			ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
705 					&otp, sizeof(otp));
706 		if (ret > 0 && otp) {
707 			snprintf(buf, sizeof(buf), "0x%04x", otp >> 16);
708 			env_set("board_id", buf);
709 
710 			snprintf(buf, sizeof(buf), "0x%04x",
711 				 ((otp >> 8) & 0xF) - 1 + 0xA);
712 			env_set("board_rev", buf);
713 		}
714 	}
715 
716 	/* for DK1/DK2 boards */
717 	board_check_usb_power();
718 
719 	return 0;
720 }
721 
board_quiesce_devices(void)722 void board_quiesce_devices(void)
723 {
724 	setup_led(LEDST_OFF);
725 }
726 
727 /* eth init function : weak called in eqos driver */
board_interface_eth_init(struct udevice * dev,phy_interface_t interface_type)728 int board_interface_eth_init(struct udevice *dev,
729 			     phy_interface_t interface_type)
730 {
731 	u8 *syscfg;
732 	u32 value;
733 	bool eth_clk_sel_reg = false;
734 	bool eth_ref_clk_sel_reg = false;
735 
736 	/* Gigabit Ethernet 125MHz clock selection. */
737 	eth_clk_sel_reg = dev_read_bool(dev, "st,eth-clk-sel");
738 
739 	/* Ethernet 50Mhz RMII clock selection */
740 	eth_ref_clk_sel_reg =
741 		dev_read_bool(dev, "st,eth-ref-clk-sel");
742 
743 	syscfg = (u8 *)syscon_get_first_range(STM32MP_SYSCON_SYSCFG);
744 
745 	if (!syscfg)
746 		return -ENODEV;
747 
748 	switch (interface_type) {
749 	case PHY_INTERFACE_MODE_MII:
750 		value = SYSCFG_PMCSETR_ETH_SEL_GMII_MII |
751 			SYSCFG_PMCSETR_ETH_REF_CLK_SEL;
752 		log_debug("PHY_INTERFACE_MODE_MII\n");
753 		break;
754 	case PHY_INTERFACE_MODE_GMII:
755 		if (eth_clk_sel_reg)
756 			value = SYSCFG_PMCSETR_ETH_SEL_GMII_MII |
757 				SYSCFG_PMCSETR_ETH_CLK_SEL;
758 		else
759 			value = SYSCFG_PMCSETR_ETH_SEL_GMII_MII;
760 		log_debug("PHY_INTERFACE_MODE_GMII\n");
761 		break;
762 	case PHY_INTERFACE_MODE_RMII:
763 		if (eth_ref_clk_sel_reg)
764 			value = SYSCFG_PMCSETR_ETH_SEL_RMII |
765 				SYSCFG_PMCSETR_ETH_REF_CLK_SEL;
766 		else
767 			value = SYSCFG_PMCSETR_ETH_SEL_RMII;
768 		log_debug("PHY_INTERFACE_MODE_RMII\n");
769 		break;
770 	case PHY_INTERFACE_MODE_RGMII:
771 	case PHY_INTERFACE_MODE_RGMII_ID:
772 	case PHY_INTERFACE_MODE_RGMII_RXID:
773 	case PHY_INTERFACE_MODE_RGMII_TXID:
774 		if (eth_clk_sel_reg)
775 			value = SYSCFG_PMCSETR_ETH_SEL_RGMII |
776 				SYSCFG_PMCSETR_ETH_CLK_SEL;
777 		else
778 			value = SYSCFG_PMCSETR_ETH_SEL_RGMII;
779 		log_debug("PHY_INTERFACE_MODE_RGMII\n");
780 		break;
781 	default:
782 		log_debug("Do not manage %d interface\n",
783 			  interface_type);
784 		/* Do not manage others interfaces */
785 		return -EINVAL;
786 	}
787 
788 	/* clear and set ETH configuration bits */
789 	writel(SYSCFG_PMCSETR_ETH_SEL_MASK | SYSCFG_PMCSETR_ETH_SELMII |
790 	       SYSCFG_PMCSETR_ETH_REF_CLK_SEL | SYSCFG_PMCSETR_ETH_CLK_SEL,
791 	       syscfg + SYSCFG_PMCCLRR);
792 	writel(value, syscfg + SYSCFG_PMCSETR);
793 
794 	return 0;
795 }
796 
env_get_location(enum env_operation op,int prio)797 enum env_location env_get_location(enum env_operation op, int prio)
798 {
799 	u32 bootmode = get_bootmode();
800 
801 	if (prio)
802 		return ENVL_UNKNOWN;
803 
804 	switch (bootmode & TAMP_BOOT_DEVICE_MASK) {
805 	case BOOT_FLASH_SD:
806 	case BOOT_FLASH_EMMC:
807 		if (CONFIG_IS_ENABLED(ENV_IS_IN_MMC))
808 			return ENVL_MMC;
809 		else if (CONFIG_IS_ENABLED(ENV_IS_IN_EXT4))
810 			return ENVL_EXT4;
811 		else
812 			return ENVL_NOWHERE;
813 
814 	case BOOT_FLASH_NAND:
815 	case BOOT_FLASH_SPINAND:
816 		if (CONFIG_IS_ENABLED(ENV_IS_IN_UBI))
817 			return ENVL_UBI;
818 		else
819 			return ENVL_NOWHERE;
820 
821 	case BOOT_FLASH_NOR:
822 		if (CONFIG_IS_ENABLED(ENV_IS_IN_SPI_FLASH))
823 			return ENVL_SPI_FLASH;
824 		else
825 			return ENVL_NOWHERE;
826 
827 	default:
828 		return ENVL_NOWHERE;
829 	}
830 }
831 
env_ext4_get_intf(void)832 const char *env_ext4_get_intf(void)
833 {
834 	u32 bootmode = get_bootmode();
835 
836 	switch (bootmode & TAMP_BOOT_DEVICE_MASK) {
837 	case BOOT_FLASH_SD:
838 	case BOOT_FLASH_EMMC:
839 		return "mmc";
840 	default:
841 		return "";
842 	}
843 }
844 
mmc_get_boot(void)845 int mmc_get_boot(void)
846 {
847 	struct udevice *dev;
848 	u32 boot_mode = get_bootmode();
849 	unsigned int instance = (boot_mode & TAMP_BOOT_INSTANCE_MASK) - 1;
850 	char cmd[20];
851 	const u32 sdmmc_addr[] = {
852 		STM32_SDMMC1_BASE,
853 		STM32_SDMMC2_BASE,
854 		STM32_SDMMC3_BASE
855 	};
856 
857 	if (instance > ARRAY_SIZE(sdmmc_addr))
858 		return 0;
859 
860 	/* search associated sdmmc node in devicetree */
861 	snprintf(cmd, sizeof(cmd), "mmc@%x", sdmmc_addr[instance]);
862 	if (uclass_get_device_by_name(UCLASS_MMC, cmd, &dev)) {
863 		log_err("mmc%d = %s not found in device tree!\n", instance, cmd);
864 		return 0;
865 	}
866 
867 	return dev_seq(dev);
868 };
869 
env_ext4_get_dev_part(void)870 const char *env_ext4_get_dev_part(void)
871 {
872 	static char *const env_dev_part =
873 #ifdef CONFIG_ENV_EXT4_DEVICE_AND_PART
874 		CONFIG_ENV_EXT4_DEVICE_AND_PART;
875 #else
876 		"";
877 #endif
878 	static char *const dev_part[] = {"0:auto", "1:auto", "2:auto"};
879 
880 	if (strlen(env_dev_part) > 0)
881 		return env_dev_part;
882 
883 	return dev_part[mmc_get_boot()];
884 }
885 
mmc_get_env_dev(void)886 int mmc_get_env_dev(void)
887 {
888 	if (CONFIG_SYS_MMC_ENV_DEV >= 0)
889 		return CONFIG_SYS_MMC_ENV_DEV;
890 
891 	/* use boot instance to select the correct mmc device identifier */
892 	return mmc_get_boot();
893 }
894 
895 #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,struct bd_info * bd)896 int ft_board_setup(void *blob, struct bd_info *bd)
897 {
898 	static const struct node_info nodes[] = {
899 		{ "st,stm32f469-qspi",		MTD_DEV_TYPE_NOR,  },
900 		{ "st,stm32f469-qspi",		MTD_DEV_TYPE_SPINAND},
901 		{ "st,stm32mp15-fmc2",		MTD_DEV_TYPE_NAND, },
902 		{ "st,stm32mp1-fmc2-nfc",	MTD_DEV_TYPE_NAND, },
903 	};
904 	char *boot_device;
905 
906 	/* Check the boot-source and don't update MTD for serial or usb boot */
907 	boot_device = env_get("boot_device");
908 	if (!boot_device ||
909 	    (strcmp(boot_device, "serial") && strcmp(boot_device, "usb")))
910 		if (IS_ENABLED(CONFIG_FDT_FIXUP_PARTITIONS))
911 			fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
912 
913 	return 0;
914 }
915 #endif
916 
board_copro_image_process(ulong fw_image,size_t fw_size)917 static void board_copro_image_process(ulong fw_image, size_t fw_size)
918 {
919 	int ret, id = 0; /* Copro id fixed to 0 as only one coproc on mp1 */
920 
921 	if (!rproc_is_initialized())
922 		if (rproc_init()) {
923 			log_err("Remote Processor %d initialization failed\n",
924 				id);
925 			return;
926 		}
927 
928 	ret = rproc_load(id, fw_image, fw_size);
929 	log_err("Load Remote Processor %d with data@addr=0x%08lx %u bytes:%s\n",
930 		id, fw_image, fw_size, ret ? " Failed!" : " Success!");
931 
932 	if (!ret)
933 		rproc_start(id);
934 }
935 
936 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
937