mfd: madera: Wait for boot done before accessing any other registers
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Mon, 6 Jan 2020 10:28:34 +0000 (10:28 +0000)
committerLee Jones <lee.jones@linaro.org>
Fri, 24 Jan 2020 07:33:58 +0000 (07:33 +0000)
It is advised to wait for the boot done bit to be set before reading
any other register, update the driver to respect this.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/mfd/madera-core.c

index a8cfadc..a7d50a7 100644 (file)
@@ -199,7 +199,7 @@ EXPORT_SYMBOL_GPL(madera_name_from_type);
 #define MADERA_BOOT_POLL_INTERVAL_USEC         5000
 #define MADERA_BOOT_POLL_TIMEOUT_USEC          25000
 
-static int madera_wait_for_boot(struct madera *madera)
+static int madera_wait_for_boot_noack(struct madera *madera)
 {
        ktime_t timeout;
        unsigned int val = 0;
@@ -226,6 +226,13 @@ static int madera_wait_for_boot(struct madera *madera)
                ret = -ETIMEDOUT;
        }
 
+       return ret;
+}
+
+static int madera_wait_for_boot(struct madera *madera)
+{
+       int ret = madera_wait_for_boot_noack(madera);
+
        /*
         * BOOT_DONE defaults to unmasked on boot so we must ack it.
         * Do this even after a timeout to avoid interrupt storms.
@@ -545,6 +552,12 @@ int madera_dev_init(struct madera *madera)
        regcache_cache_only(madera->regmap, false);
        regcache_cache_only(madera->regmap_32bit, false);
 
+       ret = madera_wait_for_boot_noack(madera);
+       if (ret) {
+               dev_err(madera->dev, "Device failed initial boot: %d\n", ret);
+               goto err_reset;
+       }
+
        /*
         * Now we can power up and verify that this is a chip we know about
         * before we start doing any writes to its registers.
@@ -650,7 +663,7 @@ int madera_dev_init(struct madera *madera)
 
        ret = madera_wait_for_boot(madera);
        if (ret) {
-               dev_err(madera->dev, "Device failed initial boot: %d\n", ret);
+               dev_err(madera->dev, "Failed to clear boot done: %d\n", ret);
                goto err_reset;
        }