diff options
author | Tom Rini <trini@konsulko.com> | 2021-01-13 15:00:53 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-01-13 15:00:53 -0500 |
commit | ab1a425524a79eeca61e7b67fdf382c7a499346f (patch) | |
tree | 08f3925c3cb439f674ebf41cc5003c95ea5c4a57 /board/st/stm32mp1/stm32mp1.c | |
parent | 795f8fd0b591eef7cf3f8c6fcf9788280029cc4a (diff) | |
parent | 7ccaa31380a4abb2b23718008a54fe2917db8edf (diff) |
Merge tag 'u-boot-stm32-20210113' of https://gitlab.denx.de/u-boot/custodians/u-boot-stm
- Enable logging features for stm32mp15 boards
- Update MAINTAINERS emails for STI and STM32
- Activate OF_LIVE for ST stm32mp15 boards
- Switch to MCO2 for PHY 50 MHz clock for DHCOM boards
- Correction in stm32prog command on uart: always flush DFU on start command
- Update USB-C power detection algorithm on DK boards
Diffstat (limited to 'board/st/stm32mp1/stm32mp1.c')
-rw-r--r-- | board/st/stm32mp1/stm32mp1.c | 234 |
1 files changed, 125 insertions, 109 deletions
diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c index df353cb5ec..78362d24a2 100644 --- a/board/st/stm32mp1/stm32mp1.c +++ b/board/st/stm32mp1/stm32mp1.c @@ -2,6 +2,9 @@ /* * Copyright (C) 2018, STMicroelectronics - All Rights Reserved */ + +#define LOG_CATEGORY LOGC_BOARD + #include <common.h> #include <adc.h> #include <bootm.h> @@ -106,12 +109,11 @@ int checkboard(void) else mode = "basic"; - printf("Board: stm32mp1 in %s mode", mode); fdt_compat = fdt_getprop(gd->fdt_blob, 0, "compatible", &fdt_compat_len); - if (fdt_compat && fdt_compat_len) - printf(" (%s)", fdt_compat); - puts("\n"); + + log_info("Board: stm32mp1 in %s mode (%s)\n", mode, + fdt_compat && fdt_compat_len ? fdt_compat : ""); /* display the STMicroelectronics board identification */ if (CONFIG_IS_ENABLED(CMD_STBOARD)) { @@ -122,12 +124,12 @@ int checkboard(void) ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD), &otp, sizeof(otp)); if (ret > 0 && otp) - printf("Board: MB%04x Var%d.%d Rev.%c-%02d\n", - otp >> 16, - (otp >> 12) & 0xF, - (otp >> 4) & 0xF, - ((otp >> 8) & 0xF) - 1 + 'A', - otp & 0xF); + log_info("Board: MB%04x Var%d.%d Rev.%c-%02d\n", + otp >> 16, + (otp >> 12) & 0xF, + (otp >> 4) & 0xF, + ((otp >> 8) & 0xF) - 1 + 'A', + otp & 0xF); } return 0; @@ -144,17 +146,16 @@ static void board_key_check(void) node = ofnode_path("/config"); if (!ofnode_valid(node)) { - debug("%s: no /config node?\n", __func__); + log_debug("no /config node?\n"); return; } if (IS_ENABLED(CONFIG_FASTBOOT)) { if (gpio_request_by_name_nodev(node, "st,fastboot-gpios", 0, &gpio, GPIOD_IS_IN)) { - debug("%s: could not find a /config/st,fastboot-gpios\n", - __func__); + log_debug("could not find a /config/st,fastboot-gpios\n"); } else { if (dm_gpio_get_value(&gpio)) { - puts("Fastboot key pressed, "); + log_notice("Fastboot key pressed, "); boot_mode = BOOT_FASTBOOT; } @@ -164,18 +165,17 @@ static void board_key_check(void) if (IS_ENABLED(CONFIG_CMD_STM32PROG)) { if (gpio_request_by_name_nodev(node, "st,stm32prog-gpios", 0, &gpio, GPIOD_IS_IN)) { - debug("%s: could not find a /config/st,stm32prog-gpios\n", - __func__); + log_debug("could not find a /config/st,stm32prog-gpios\n"); } else { if (dm_gpio_get_value(&gpio)) { - puts("STM32Programmer key pressed, "); + log_notice("STM32Programmer key pressed, "); boot_mode = BOOT_STM32PROG; } dm_gpio_free(NULL, &gpio); } } if (boot_mode != BOOT_NORMAL) { - puts("entering download mode...\n"); + log_notice("entering download mode...\n"); clrsetbits_le32(TAMP_BOOT_CONTEXT, TAMP_BOOT_FORCED_MASK, boot_mode); @@ -198,8 +198,10 @@ int g_dnl_board_usb_cable_connected(void) ret = uclass_get_device_by_driver(UCLASS_USB_GADGET_GENERIC, DM_DRIVER_GET(dwc2_udc_otg), &dwc2_udc_otg); - if (!ret) - debug("dwc2_udc_otg init failed\n"); + if (ret) { + log_debug("dwc2_udc_otg init failed\n"); + return ret; + } return dwc2_udc_B_session_valid(dwc2_udc_otg); } @@ -231,13 +233,12 @@ static int get_led(struct udevice **dev, char *led_string) led_name = fdtdec_get_config_string(gd->fdt_blob, led_string); if (!led_name) { - pr_debug("%s: could not find %s config string\n", - __func__, led_string); + log_debug("could not find %s config string\n", led_string); return -ENOENT; } ret = led_get_by_label(led_name, dev); if (ret) { - debug("%s: get=%d\n", __func__, ret); + log_debug("get=%d\n", ret); return ret; } @@ -288,49 +289,19 @@ static void __maybe_unused led_error_blink(u32 nb_blink) hang(); } -static int board_check_usb_power(void) +static int adc_measurement(ofnode node, int adc_count, int *min_uV, int *max_uV) { struct ofnode_phandle_args adc_args; struct udevice *adc; - ofnode node; unsigned int raw; - int max_uV = 0; - int min_uV = USB_START_HIGH_THRESHOLD_UV; - int ret, uV, adc_count; - u32 nb_blink; - u8 i; - - if (!IS_ENABLED(CONFIG_ADC)) - return -ENODEV; - - node = ofnode_path("/config"); - if (!ofnode_valid(node)) { - debug("%s: no /config node?\n", __func__); - return -ENOENT; - } - - /* - * Retrieve the ADC channels devices and get measurement - * for each of them - */ - adc_count = ofnode_count_phandle_with_args(node, "st,adc_usb_pd", - "#io-channel-cells", 0); - if (adc_count < 0) { - if (adc_count == -ENOENT) - return 0; - - pr_err("%s: can't find adc channel (%d)\n", __func__, - adc_count); - - return adc_count; - } + int ret, uV; + int i; for (i = 0; i < adc_count; i++) { if (ofnode_parse_phandle_with_args(node, "st,adc_usb_pd", "#io-channel-cells", 0, i, &adc_args)) { - pr_debug("%s: can't find /config/st,adc_usb_pd\n", - __func__); + log_debug("can't find /config/st,adc_usb_pd\n"); return 0; } @@ -338,44 +309,91 @@ static int board_check_usb_power(void) &adc); if (ret) { - pr_err("%s: Can't get adc device(%d)\n", __func__, - ret); + log_err("Can't get adc device(%d)\n", ret); return ret; } ret = adc_channel_single_shot(adc->name, adc_args.args[0], &raw); if (ret) { - pr_err("%s: single shot failed for %s[%d]!\n", - __func__, adc->name, adc_args.args[0]); + log_err("single shot failed for %s[%d]!\n", + adc->name, adc_args.args[0]); return ret; } /* Convert to uV */ if (!adc_raw_to_uV(adc, raw, &uV)) { - if (uV > max_uV) - max_uV = uV; - if (uV < min_uV) - min_uV = uV; - pr_debug("%s: %s[%02d] = %u, %d uV\n", __func__, - adc->name, adc_args.args[0], raw, uV); + if (uV > *max_uV) + *max_uV = uV; + if (uV < *min_uV) + *min_uV = uV; + log_debug("%s[%02d] = %u, %d uV\n", + adc->name, adc_args.args[0], raw, uV); } else { - pr_err("%s: Can't get uV value for %s[%d]\n", - __func__, adc->name, adc_args.args[0]); + log_err("Can't get uV value for %s[%d]\n", + adc->name, adc_args.args[0]); } } + return 0; +} + +static int board_check_usb_power(void) +{ + ofnode node; + int max_uV = 0; + int min_uV = USB_START_HIGH_THRESHOLD_UV; + int adc_count, ret; + u32 nb_blink; + u8 i; + + node = ofnode_path("/config"); + if (!ofnode_valid(node)) { + log_debug("no /config node?\n"); + return -ENOENT; + } + /* - * If highest value is inside 1.23 Volts and 2.10 Volts, that means - * board is plugged on an USB-C 3A power supply and boot process can - * continue. + * Retrieve the ADC channels devices and get measurement + * for each of them */ - if (max_uV > USB_START_LOW_THRESHOLD_UV && - max_uV <= USB_START_HIGH_THRESHOLD_UV && - min_uV <= USB_LOW_THRESHOLD_UV) - return 0; + adc_count = ofnode_count_phandle_with_args(node, "st,adc_usb_pd", + "#io-channel-cells", 0); + if (adc_count < 0) { + if (adc_count == -ENOENT) + return 0; + + log_err("Can't find adc channel (%d)\n", adc_count); + + return adc_count; + } - pr_err("****************************************************\n"); + /* perform maximum of 2 ADC measurements to detect power supply current */ + for (i = 0; i < 2; i++) { + if (IS_ENABLED(CONFIG_ADC)) + ret = adc_measurement(node, adc_count, &min_uV, &max_uV); + else + ret = -ENODEV; + + if (ret) + return ret; + + /* + * If highest value is inside 1.23 Volts and 2.10 Volts, that means + * board is plugged on an USB-C 3A power supply and boot process can + * continue. + */ + if (max_uV > USB_START_LOW_THRESHOLD_UV && + max_uV <= USB_START_HIGH_THRESHOLD_UV && + min_uV <= USB_LOW_THRESHOLD_UV) + return 0; + + if (i == 0) { + log_err("Previous ADC measurements was not the one expected, retry in 20ms\n"); + mdelay(20); /* equal to max tPDDebounce duration (min 10ms - max 20ms) */ + } + } + log_notice("****************************************************\n"); /* * If highest and lowest value are either both below * USB_LOW_THRESHOLD_UV or both above USB_LOW_THRESHOLD_UV, that @@ -386,8 +404,8 @@ static int board_check_usb_power(void) min_uV > USB_LOW_THRESHOLD_UV) || (max_uV <= USB_LOW_THRESHOLD_UV && min_uV <= USB_LOW_THRESHOLD_UV)) { - pr_err("* ERROR USB TYPE-C connection in unattached mode *\n"); - pr_err("* Check that USB TYPE-C cable is correctly plugged *\n"); + log_notice("* ERROR USB TYPE-C connection in unattached mode *\n"); + log_notice("* Check that USB TYPE-C cable is correctly plugged *\n"); /* with 125ms interval, led will blink for 17.02 years ....*/ nb_blink = U32_MAX; } @@ -395,14 +413,14 @@ static int board_check_usb_power(void) if (max_uV > USB_LOW_THRESHOLD_UV && max_uV <= USB_WARNING_LOW_THRESHOLD_UV && min_uV <= USB_LOW_THRESHOLD_UV) { - pr_err("* WARNING 500mA power supply detected *\n"); + log_notice("* WARNING 500mA power supply detected *\n"); nb_blink = 2; } if (max_uV > USB_WARNING_LOW_THRESHOLD_UV && max_uV <= USB_START_LOW_THRESHOLD_UV && min_uV <= USB_LOW_THRESHOLD_UV) { - pr_err("* WARNING 1.5A power supply detected *\n"); + log_notice("* WARNING 1.5A power supply detected *\n"); nb_blink = 3; } @@ -411,14 +429,14 @@ static int board_check_usb_power(void) * supplies more than 3 Amp, this is not compliant with TypeC specification */ if (max_uV > USB_START_HIGH_THRESHOLD_UV) { - pr_err("* USB TYPE-C charger not compliant with *\n"); - pr_err("* specification *\n"); - pr_err("****************************************************\n\n"); + log_notice("* USB TYPE-C charger not compliant with *\n"); + log_notice("* specification *\n"); + log_notice("****************************************************\n\n"); /* with 125ms interval, led will blink for 17.02 years ....*/ nb_blink = U32_MAX; } else { - pr_err("* Current too low, use a 3A power supply! *\n"); - pr_err("****************************************************\n\n"); + log_notice("* Current too low, use a 3A power supply! *\n"); + log_notice("****************************************************\n\n"); } led_error_blink(nb_blink); @@ -471,7 +489,7 @@ static void sysconf_init(void) DM_DRIVER_GET(stm32mp_bsec), &dev); if (ret) { - pr_err("Can't find stm32mp_bsec driver\n"); + log_err("Can't find stm32mp_bsec driver\n"); return; } @@ -494,13 +512,13 @@ static void sysconf_init(void) syscfg + SYSCFG_IOCTRLSETR); if (!otp) - pr_err("product_below_2v5=0: HSLVEN protected by HW\n"); + log_err("product_below_2v5=0: HSLVEN protected by HW\n"); } else { if (otp) - pr_err("product_below_2v5=1: HSLVEN update is destructive, no update as VDD>2.7V\n"); + log_err("product_below_2v5=1: HSLVEN update is destructive, no update as VDD>2.7V\n"); } } else { - debug("VDD unknown"); + log_debug("VDD unknown"); } } @@ -514,7 +532,7 @@ static void sysconf_init(void) val & SYSCFG_CMPCR_READY, 1000000); if (ret) { - pr_err("SYSCFG: I/O compensation failed, timeout.\n"); + log_err("SYSCFG: I/O compensation failed, timeout.\n"); led_error_blink(10); } @@ -533,39 +551,37 @@ static int dk2_i2c1_fix(void) node = ofnode_path("/soc/i2c@40012000/hdmi-transmitter@39"); if (!ofnode_valid(node)) { - pr_debug("%s: no hdmi-transmitter@39 ?\n", __func__); + log_debug("no hdmi-transmitter@39 ?\n"); return -ENOENT; } if (gpio_request_by_name_nodev(node, "reset-gpios", 0, &hdmi, GPIOD_IS_OUT)) { - pr_debug("%s: could not find reset-gpios\n", - __func__); + log_debug("could not find reset-gpios\n"); return -ENOENT; } node = ofnode_path("/soc/i2c@40012000/cs42l51@4a"); if (!ofnode_valid(node)) { - pr_debug("%s: no cs42l51@4a ?\n", __func__); + log_debug("no cs42l51@4a ?\n"); return -ENOENT; } if (gpio_request_by_name_nodev(node, "reset-gpios", 0, &audio, GPIOD_IS_OUT)) { - pr_debug("%s: could not find reset-gpios\n", - __func__); + log_debug("could not find reset-gpios\n"); return -ENOENT; } /* before power up, insure that HDMI and AUDIO IC is under reset */ ret = dm_gpio_set_value(&hdmi, 1); if (ret) { - pr_err("%s: can't set_value for hdmi_nrst gpio", __func__); + log_err("can't set_value for hdmi_nrst gpio"); goto error; } ret = dm_gpio_set_value(&audio, 1); if (ret) { - pr_err("%s: can't set_value for audio_nrst gpio", __func__); + log_err("can't set_value for audio_nrst gpio"); goto error; } @@ -732,7 +748,7 @@ int board_interface_eth_init(struct udevice *dev, case PHY_INTERFACE_MODE_MII: value = SYSCFG_PMCSETR_ETH_SEL_GMII_MII | SYSCFG_PMCSETR_ETH_REF_CLK_SEL; - debug("%s: PHY_INTERFACE_MODE_MII\n", __func__); + log_debug("PHY_INTERFACE_MODE_MII\n"); break; case PHY_INTERFACE_MODE_GMII: if (eth_clk_sel_reg) @@ -740,7 +756,7 @@ int board_interface_eth_init(struct udevice *dev, SYSCFG_PMCSETR_ETH_CLK_SEL; else value = SYSCFG_PMCSETR_ETH_SEL_GMII_MII; - debug("%s: PHY_INTERFACE_MODE_GMII\n", __func__); + log_debug("PHY_INTERFACE_MODE_GMII\n"); break; case PHY_INTERFACE_MODE_RMII: if (eth_ref_clk_sel_reg) @@ -748,7 +764,7 @@ int board_interface_eth_init(struct udevice *dev, SYSCFG_PMCSETR_ETH_REF_CLK_SEL; else value = SYSCFG_PMCSETR_ETH_SEL_RMII; - debug("%s: PHY_INTERFACE_MODE_RMII\n", __func__); + log_debug("PHY_INTERFACE_MODE_RMII\n"); break; case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII_ID: @@ -759,11 +775,11 @@ int board_interface_eth_init(struct udevice *dev, SYSCFG_PMCSETR_ETH_CLK_SEL; else value = SYSCFG_PMCSETR_ETH_SEL_RGMII; - debug("%s: PHY_INTERFACE_MODE_RGMII\n", __func__); + log_debug("PHY_INTERFACE_MODE_RGMII\n"); break; default: - debug("%s: Do not manage %d interface\n", - __func__, interface_type); + log_debug("Do not manage %d interface\n", + interface_type); /* Do not manage others interfaces */ return -EINVAL; } @@ -878,14 +894,14 @@ static void board_copro_image_process(ulong fw_image, size_t fw_size) if (!rproc_is_initialized()) if (rproc_init()) { - printf("Remote Processor %d initialization failed\n", - id); + log_err("Remote Processor %d initialization failed\n", + id); return; } ret = rproc_load(id, fw_image, fw_size); - printf("Load Remote Processor %d with data@addr=0x%08lx %u bytes:%s\n", - id, fw_image, fw_size, ret ? " Failed!" : " Success!"); + log_err("Load Remote Processor %d with data@addr=0x%08lx %u bytes:%s\n", + id, fw_image, fw_size, ret ? " Failed!" : " Success!"); if (!ret) rproc_start(id); |