Acquire the /RESET GPIO before we enable regulators and hold the device
in reset while the regulators power up in order to improve robustness
during the initial power up.

Also fix the error path so that the device is left in reset while we're
at it.

Signed-off-by: Mark Brown <broo...@opensource.wolfsonmicro.com>
---
 drivers/mfd/arizona-core.c |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index 26ac372..e4c8dc2 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -494,6 +494,17 @@ int arizona_dev_init(struct arizona *arizona)
                goto err_early;
        }
 
+       if (arizona->pdata.reset) {
+               /* Start out with /RESET low to put the chip into reset */
+               ret = gpio_request_one(arizona->pdata.reset,
+                                      GPIOF_DIR_OUT | GPIOF_INIT_LOW,
+                                      "arizona /RESET");
+               if (ret != 0) {
+                       dev_err(dev, "Failed to request /RESET: %d\n", ret);
+                       goto err_early;
+               }
+       }
+
        ret = regulator_bulk_enable(arizona->num_core_supplies,
                                    arizona->core_supplies);
        if (ret != 0) {
@@ -508,18 +519,8 @@ int arizona_dev_init(struct arizona *arizona)
                goto err_enable;
        }
 
-       if (arizona->pdata.reset) {
-               /* Start out with /RESET low to put the chip into reset */
-               ret = gpio_request_one(arizona->pdata.reset,
-                                      GPIOF_DIR_OUT | GPIOF_INIT_LOW,
-                                      "arizona /RESET");
-               if (ret != 0) {
-                       dev_err(dev, "Failed to request /RESET: %d\n", ret);
-                       goto err_dcvdd;
-               }
-
+       if (arizona->pdata.reset)
                gpio_set_value_cansleep(arizona->pdata.reset, 1);
-       }
 
        regcache_cache_only(arizona->regmap, false);
 
@@ -759,10 +760,9 @@ err_irq:
        arizona_irq_exit(arizona);
 err_reset:
        if (arizona->pdata.reset) {
-               gpio_set_value_cansleep(arizona->pdata.reset, 1);
+               gpio_set_value_cansleep(arizona->pdata.reset, 0);
                gpio_free(arizona->pdata.reset);
        }
-err_dcvdd:
        regulator_disable(arizona->dcvdd);
 err_enable:
        regulator_bulk_disable(arizona->num_core_supplies,
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to