From: Lothar Waßmann Date: Mon, 13 Mar 2017 15:09:19 +0000 (+0100) Subject: drivers: spmi: msm: add timeout to function waiting for SPMI_STATUS_DONE X-Git-Tag: KARO-TXSD-2017-03-15~10 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=81d7676a0476f887f7072d56af58df2827bbfd5e;p=karo-tx-uboot.git 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. --- 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) {