board: stm32mp1: add timeout for I/O compensation ready
This patch avoids infinite loop when I/O compensation failed, it adds a 1s timeout to detect error. Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
This commit is contained in:
@@ -32,6 +32,7 @@
|
|||||||
#include <asm/arch/sys_proto.h>
|
#include <asm/arch/sys_proto.h>
|
||||||
#include <jffs2/load_kernel.h>
|
#include <jffs2/load_kernel.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <linux/iopoll.h>
|
||||||
#include <power/regulator.h>
|
#include <power/regulator.h>
|
||||||
#include <usb/dwc2_udc.h>
|
#include <usb/dwc2_udc.h>
|
||||||
|
|
||||||
@@ -463,10 +464,10 @@ static void sysconf_init(void)
|
|||||||
struct udevice *pwr_dev;
|
struct udevice *pwr_dev;
|
||||||
struct udevice *pwr_reg;
|
struct udevice *pwr_reg;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int ret;
|
|
||||||
u32 otp = 0;
|
u32 otp = 0;
|
||||||
#endif
|
#endif
|
||||||
u32 bootr;
|
int ret;
|
||||||
|
u32 bootr, val;
|
||||||
|
|
||||||
syscfg = (u8 *)syscon_get_first_range(STM32MP_SYSCON_SYSCFG);
|
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);
|
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);
|
clrbits_le32(syscfg + SYSCFG_CMPCR, SYSCFG_CMPCR_SW_CTRL);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user