It isn't safe to read the device ID in SOFTWARE_RESET register
until the silicon boot sequence has completed. This patch
rearranges the code to wait for BOOT_DONE first.

If we don't have a GPIO to control hard reset we must issue
a soft reset to get the silicon into a known-good booted state
before reading the device ID.

Signed-off-by: Stuart Henderson <[email protected]>
Signed-off-by: Richard Fitzgerald <[email protected]>
---
 drivers/mfd/madera-core.c | 33 +++++++++++++++------------------
 1 file changed, 15 insertions(+), 18 deletions(-)

diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c
index 3ff9a0615658..b9d42edf96c9 100644
--- a/drivers/mfd/madera-core.c
+++ b/drivers/mfd/madera-core.c
@@ -454,10 +454,23 @@ int madera_dev_init(struct madera *madera)
        regcache_cache_only(madera->regmap, false);
        regcache_cache_only(madera->regmap_32bit, false);
 
+       /* If we don't have a reset GPIO use a soft reset */
+       if (!madera->pdata.reset) {
+               ret = madera_soft_reset(madera);
+               if (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.
+        * Must wait for internal boot sequence to complete before
+        * reading the device ID
         */
+       ret = madera_wait_for_boot(madera);
+       if (ret) {
+               dev_err(madera->dev, "Device failed initial boot: %d\n", ret);
+               goto err_reset;
+       }
+
        ret = regmap_read(madera->regmap, MADERA_SOFTWARE_RESET, &hwid);
        if (ret) {
                dev_err(dev, "Failed to read ID register: %d\n", ret);
@@ -519,22 +532,6 @@ int madera_dev_init(struct madera *madera)
                goto err_reset;
        }
 
-       /*
-        * It looks like a device we support. If we don't have a hard reset
-        * we can now attempt a soft reset.
-        */
-       if (!madera->pdata.reset) {
-               ret = madera_soft_reset(madera);
-               if (ret)
-                       goto err_reset;
-       }
-
-       ret = madera_wait_for_boot(madera);
-       if (ret) {
-               dev_err(madera->dev, "Device failed initial boot: %d\n", ret);
-               goto err_reset;
-       }
-
        ret = regmap_read(madera->regmap, MADERA_HARDWARE_REVISION,
                          &madera->rev);
        if (ret) {
-- 
2.11.0

Reply via email to