- 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
This commit is contained in:
Tom Rini
2021-01-13 15:00:53 -05:00
74 changed files with 847 additions and 724 deletions

View File

@@ -47,28 +47,28 @@
config-1 {
/* DT+SoM+board model */
description = "dh,stm32mp15xx-dhcom-pdk2_somrev0_boardrev0";
loadables = "uboot";
firmware = "uboot";
fdt = "fdt-1";
};
config-2 {
/* DT+SoM+board model */
description = "dh,stm32mp15xx-dhcom-pdk2_somrev1_boardrev0";
loadables = "uboot";
firmware = "uboot";
fdt = "fdt-1";
};
config-3 {
/* DT+SoM+board model */
description = "dh,stm32mp15xx-dhcom-drc02_somrev0_boardrev0";
loadables = "uboot";
firmware = "uboot";
fdt = "fdt-2";
};
config-4 {
/* DT+SoM+board model */
description = "dh,stm32mp15xx-dhcom-drc02_somrev1_boardrev0";
loadables = "uboot";
firmware = "uboot";
fdt = "fdt-2";
};

View File

@@ -31,7 +31,7 @@
config-1 {
/* DT+SoM+board model */
description = "arrow,stm32mp15xx-avenger96_somrev0_boardrev1";
loadables = "uboot";
firmware = "uboot";
fdt = "fdt-1";
};

View File

@@ -1,5 +1,5 @@
ST BOARDS
M: Patrick Delaunay <patrick.delaunay@st.com>
M: Patrick Delaunay <patrick.delaunay@foss.st.com>
L: uboot-stm32@st-md-mailman.stormreply.com (moderated for non-subscribers)
T: git https://gitlab.denx.de/u-boot/custodians/u-boot-stm.git
S: Maintained

View File

@@ -8,6 +8,7 @@
#include <dm.h>
#include <dfu.h>
#include <env.h>
#include <log.h>
#include <memalign.h>
#include <misc.h>
#include <mtd.h>
@@ -199,7 +200,7 @@ static int dfu_pmic_read(u64 offset, u8 *buffer, long *size)
ret = 0;
}
#else
pr_err("PMIC update not supported");
log_err("PMIC update not supported");
ret = -EOPNOTSUPP;
#endif

View File

@@ -8,6 +8,7 @@
#include <dm.h>
#include <env.h>
#include <env_internal.h>
#include <log.h>
#include <mtd.h>
#include <mtd_node.h>
#include <tee.h>
@@ -117,7 +118,7 @@ void board_mtdparts_default(const char **mtdids, const char **mtdparts)
for (uclass_first_device(UCLASS_MTD, &dev);
dev;
uclass_next_device(&dev)) {
pr_debug("mtd device = %s\n", dev->name);
log_debug("mtd device = %s\n", dev->name);
}
if (nor || nand) {
@@ -163,5 +164,5 @@ void board_mtdparts_default(const char **mtdids, const char **mtdparts)
mtd_initialized = true;
*mtdids = ids;
*mtdparts = parts;
debug("%s:mtdids=%s & mtdparts=%s\n", __func__, ids, parts);
log_debug("mtdids=%s & mtdparts=%s\n", ids, parts);
}

View File

@@ -3,8 +3,11 @@
* Copyright (C) 2020, STMicroelectronics - All Rights Reserved
*/
#define LOG_CATEGORY LOGC_BOARD
#include <common.h>
#include <dm.h>
#include <log.h>
#include <asm/io.h>
#include <asm/arch/ddr.h>
#include <linux/bitops.h>
@@ -202,7 +205,7 @@ void stpmic1_init(u32 voltage_mv)
/* Check if debug is enabled to program PMIC according to the bit */
if (readl(TAMP_BOOT_CONTEXT) & TAMP_BOOT_DEBUG_ON) {
printf("Keep debug unit ON\n");
log_info("Keep debug unit ON\n");
pmic_clrsetbits(dev, STPMIC1_BUCKS_MRST_CR,
STPMIC1_MRST_BUCK_DEBUG,

View File

@@ -6,6 +6,8 @@
* Copyright (C) 2020, STMicroelectronics - All Rights Reserved
*/
#define LOG_CATEGORY UCLASS_I2C_GENERIC
#include <common.h>
#include <dm.h>
#include <i2c.h>

View File

@@ -1,5 +1,5 @@
STIH410-B2260 BOARD
M: Patrice Chotard <patrice.chotard@st.com>
M: Patrice Chotard <patrice.chotard@foss.st.com>
S: Maintained
F: board/st/stih410-b2260/
F: include/configs/stih410-b2260.h

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) 2017, STMicroelectronics - All Rights Reserved
# Author(s): Patrice CHOTARD, <patrice.chotard@st.com> for STMicroelectronics.
# Author(s): Patrice CHOTARD, <patrice.chotard@foss.st.com> for STMicroelectronics.
obj-y = board.o

View File

@@ -1,5 +1,5 @@
STM32F429-EVALUATION BOARD
M: Patrice Chotard <patrice.chotard@st.com>
M: Patrice Chotard <patrice.chotard@foss.st.com>
S: Maintained
F: board/st/stm32f429-evaluation/
F: include/configs/stm32f429-evaluation.h

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) 2018, STMicroelectronics - All Rights Reserved
# Author(s): Patrice CHOTARD, <patrice.chotard@st.com> for STMicroelectronics.
# Author(s): Patrice CHOTARD, <patrice.chotard@foss.st.com> for STMicroelectronics.
obj-y := stm32f429-evaluation.o

View File

@@ -1,5 +1,5 @@
STM32F469-DISCOVERY BOARD
M: Patrice Chotard <patrice.chotard@st.com>
M: Patrice Chotard <patrice.chotard@foss.st.com>
S: Maintained
F: board/st/stm32f469-discovery/
F: include/configs/stm32f469-discovery.h

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) STMicroelectronics SA 2017
# Author(s): Patrice CHOTARD, <patrice.chotard@st.com> for STMicroelectronics.
# Author(s): Patrice CHOTARD, <patrice.chotard@foss.st.com> for STMicroelectronics.
obj-y := stm32f469-discovery.o

View File

@@ -1,5 +1,5 @@
STM32H743 DISCOVERY BOARD
M: Patrice Chotard <patrice.chotard@st.com>
M: Patrice Chotard <patrice.chotard@foss.st.com>
S: Maintained
F: board/st/stm32h743-disco
F: include/configs/stm32h743-disco.h

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) 2017, STMicroelectronics - All Rights Reserved
# Author(s): Patrice CHOTARD, <patrice.chotard@st.com> for STMicroelectronics.
# Author(s): Patrice CHOTARD, <patrice.chotard@foss.st.com> for STMicroelectronics.
obj-y := stm32h743-disco.o

View File

@@ -1,5 +1,5 @@
STM32H743 EVALUATION BOARD
M: Patrice Chotard <patrice.chotard@st.com>
M: Patrice Chotard <patrice.chotard@foss.st.com>
S: Maintained
F: board/st/stm32h743-eval
F: include/configs/stm32h743-eval.h

View File

@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0+
#
# Copyright (C) 2017, STMicroelectronics - All Rights Reserved
# Author(s): Patrice CHOTARD, <patrice.chotard@st.com> for STMicroelectronics.
# Author(s): Patrice CHOTARD, <patrice.chotard@foss.st.com> for STMicroelectronics.
obj-y := stm32h743-eval.o

View File

@@ -1,5 +1,5 @@
STM32MP1 BOARD
M: Patrick Delaunay <patrick.delaunay@st.com>
M: Patrick Delaunay <patrick.delaunay@foss.st.com>
L: uboot-stm32@st-md-mailman.stormreply.com (moderated for non-subscribers)
T: git https://gitlab.denx.de/u-boot/custodians/u-boot-stm.git
S: Maintained

View File

@@ -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,24 +289,66 @@ 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 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)) {
log_debug("can't find /config/st,adc_usb_pd\n");
return 0;
}
ret = uclass_get_device_by_ofnode(UCLASS_ADC, adc_args.node,
&adc);
if (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) {
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;
log_debug("%s[%02d] = %u, %d uV\n",
adc->name, adc_args.args[0], raw, uV);
} else {
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 ret, uV, adc_count;
int adc_count, ret;
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__);
log_debug("no /config node?\n");
return -ENOENT;
}
@@ -319,63 +362,38 @@ static int board_check_usb_power(void)
if (adc_count == -ENOENT)
return 0;
pr_err("%s: can't find adc channel (%d)\n", __func__,
adc_count);
log_err("Can't find adc channel (%d)\n", adc_count);
return adc_count;
}
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__);
/* 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;
}
ret = uclass_get_device_by_ofnode(UCLASS_ADC, adc_args.node,
&adc);
if (ret) {
pr_err("%s: Can't get adc device(%d)\n", __func__,
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]);
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);
} else {
pr_err("%s: Can't get uV value for %s[%d]\n",
__func__, adc->name, adc_args.args[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) */
}
}
/*
* 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;
pr_err("****************************************************\n");
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);