]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
drivers: spmi: msm: add timeout to function waiting for SPMI_STATUS_DONE
authorLothar Waßmann <LW@KARO-electronics.de>
Mon, 13 Mar 2017 15:09:19 +0000 (16:09 +0100)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 14 Mar 2017 16:41:17 +0000 (17:41 +0100)
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

index a1e6df444592bbb09630ac9165a8857bf37f17bc..44062c46d083d014710a414411215eabb21f7bd6 100644 (file)
@@ -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) {