mfd: arizona: Hold device in reset while ramping supplies
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 26 Mar 2013 12:15:26 +0000 (12:15 +0000)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 8 Apr 2013 13:21:02 +0000 (15:21 +0200)
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 <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/arizona-core.c

index 7d1abe7ce83f020e1b508d5afaa253d5c8321172..ae10af798843bd04647cb626acb7457700d636f9 100644 (file)
@@ -504,6 +504,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) {
@@ -518,18 +529,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);
 
@@ -769,10 +770,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,