diff options
Diffstat (limited to 'board/st/stm32mp1/stm32mp1.c')
| -rw-r--r-- | board/st/stm32mp1/stm32mp1.c | 16 | 
1 files changed, 12 insertions, 4 deletions
| diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c index 6873165a0f8..dcbfcc1bcb3 100644 --- a/board/st/stm32mp1/stm32mp1.c +++ b/board/st/stm32mp1/stm32mp1.c @@ -32,6 +32,7 @@  #include <asm/arch/sys_proto.h>  #include <jffs2/load_kernel.h>  #include <linux/err.h> +#include <linux/iopoll.h>  #include <power/regulator.h>  #include <usb/dwc2_udc.h> @@ -463,10 +464,10 @@ static void sysconf_init(void)  	struct udevice *pwr_dev;  	struct udevice *pwr_reg;  	struct udevice *dev; -	int ret;  	u32 otp = 0;  #endif -	u32 bootr; +	int ret; +	u32 bootr, val;  	syscfg = (u8 *)syscon_get_first_range(STM32MP_SYSCON_SYSCFG); @@ -543,8 +544,15 @@ static void sysconf_init(void)  	 */  	writel(SYSCFG_CMPENSETR_MPU_EN, syscfg + SYSCFG_CMPENSETR); -	while (!(readl(syscfg + SYSCFG_CMPCR) & SYSCFG_CMPCR_READY)) -		; +	/* poll until ready (1s timeout) */ +	ret = readl_poll_timeout(syscfg + SYSCFG_CMPCR, val, +				 val & SYSCFG_CMPCR_READY, +				 1000000); +	if (ret) { +		pr_err("SYSCFG: I/O compensation failed, timeout.\n"); +		led_error_blink(10); +	} +  	clrbits_le32(syscfg + SYSCFG_CMPCR, SYSCFG_CMPCR_SW_CTRL);  #endif  } | 
