summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown2013-03-26 13:15:26 +0100
committerSamuel Ortiz2013-04-08 15:21:02 +0200
commit87d3af4ac0554afc2e86069d7578f74b12f3f67a (patch)
tree129aca21c5fe3654ca2a13b091c1cb9b1840d383
parentmfd: wm5102: Update defaults to match patch (diff)
downloadkernel-qcow2-linux-87d3af4ac0554afc2e86069d7578f74b12f3f67a.tar.gz
kernel-qcow2-linux-87d3af4ac0554afc2e86069d7578f74b12f3f67a.tar.xz
kernel-qcow2-linux-87d3af4ac0554afc2e86069d7578f74b12f3f67a.zip
mfd: arizona: Hold device in reset while ramping supplies
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>
-rw-r--r--drivers/mfd/arizona-core.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index 7d1abe7ce83f..ae10af798843 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -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,