From 81d7676a0476f887f7072d56af58df2827bbfd5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lothar=20Wa=C3=9Fmann?= Date: Mon, 13 Mar 2017 16:09:19 +0100 Subject: [PATCH] drivers: spmi: msm: add timeout to function waiting for SPMI_STATUS_DONE It is always a bad idea(TM) to wait indefinitely for any hardware related operation to conclude. HW _will_ get faulty some day and don't react as expected. Thus add a timeout to the loop waiting for SPMI_STATUS_DONE to be set. --- drivers/spmi/spmi-msm.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/spmi/spmi-msm.c b/drivers/spmi/spmi-msm.c index a1e6df4445..44062c46d0 100644 --- a/drivers/spmi/spmi-msm.c +++ b/drivers/spmi/spmi-msm.c @@ -73,6 +73,7 @@ static int msm_spmi_write(struct udevice *dev, int usid, int pid, int off, struct msm_spmi_priv *priv = dev_get_priv(dev); unsigned channel; uint32_t reg = 0; + int timeout = SPMI_WRITE_TIMEOUT; if (usid >= SPMI_MAX_SLAVES) return -EINVAL; @@ -104,10 +105,16 @@ static int msm_spmi_write(struct udevice *dev, int usid, int pid, int off, writel(reg, priv->spmi_chnls + SPMI_CH_OFFSET(channel) + SPMI_REG_CMD0); /* Wait till CMD DONE status */ - reg = 0; - while (!reg) { - reg = readl(priv->spmi_core + SPMI_CH_OFFSET(channel) + + do { + reg = readl(priv->spmi_chnls + SPMI_CH_OFFSET(channel) + SPMI_REG_STATUS); + if (reg) + break; + udelay(1); + } while (timeout-- > 0); + if (!(reg & SPMI_STATUS_DONE)) { + printf("SPMI write timed out\n"); + return -ETIMEDOUT; } if (reg ^ SPMI_STATUS_DONE) { -- 2.39.2