diff options
author | Jin Park <jinyoungp@nvidia.com> | 2012-01-17 14:48:47 +0900 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2012-01-19 16:26:28 -0800 |
commit | f245f8f8bd58d1df0a1eb1bf73ad03fb3772813d (patch) | |
tree | b6fc4a1ca7756e0f153c981039b730eae6f4923f /drivers/mfd | |
parent | 7d69f35bad838a96aa23211adbbc0bfbb222bd8e (diff) |
mfd: max77663: Support Low-Power Mode during sleep mode
Put the power rails into Low-Power Mode during sleep mode,
if SLP_LPM is enabled and the power rail's power mode is GLPM.
Bug 924686
Change-Id: I460f8bfa6be73a440a4924160d8e271695fc4973
Reviewed-on: http://git-master/r/75626
Signed-off-by: Jin Park <jinyoungp@nvidia.com>
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/75890
Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/max77663-core.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/drivers/mfd/max77663-core.c b/drivers/mfd/max77663-core.c index 38d1956ee0ec..36688f016df7 100644 --- a/drivers/mfd/max77663-core.c +++ b/drivers/mfd/max77663-core.c @@ -57,6 +57,7 @@ #define MAX77663_REG_GPIO_PD 0x3F #define MAX77663_REG_GPIO_ALT 0x40 #define MAX77663_REG_ONOFF_CFG1 0x41 +#define MAX77663_REG_ONOFF_CFG2 0x42 #define IRQ_TOP_GLBL_MASK (1 << 7) #define IRQ_TOP_GLBL_SHIFT 7 @@ -114,6 +115,8 @@ #define ONOFF_SFT_RST_MASK (1 << 7) #define ONOFF_SLPEN_MASK (1 << 2) +#define ONOFF_SLP_LPM_MASK (1 << 5) + enum { CACHE_IRQ_LBT, CACHE_IRQ_SD, @@ -366,12 +369,25 @@ int max77663_power_off(void) } EXPORT_SYMBOL(max77663_power_off); -static int max77663_sleep_enable(struct max77663_chip *chip) +static int max77663_sleep(struct max77663_chip *chip, bool on) { + int ret = 0; + + if (chip->pdata->flags & SLP_LPM_ENABLE) { + /* Put the power rails into Low-Power mode during sleep mode, + * if the power rail's power mode is GLPM. */ + ret = max77663_set_bits(chip->dev, MAX77663_REG_ONOFF_CFG2, + ONOFF_SLP_LPM_MASK, + on ? ONOFF_SLP_LPM_MASK : 0, 0); + if (ret < 0) + return ret; + } + /* Enable sleep that AP can be placed into sleep mode * by pulling EN1 low */ return max77663_set_bits(chip->dev, MAX77663_REG_ONOFF_CFG1, - ONOFF_SLPEN_MASK, ONOFF_SLPEN_MASK, 0); + ONOFF_SLPEN_MASK, + on ? ONOFF_SLPEN_MASK : 0, 0); } static inline int max77663_cache_write(struct device *dev, u8 addr, u8 mask, @@ -1287,11 +1303,15 @@ static int max77663_probe(struct i2c_client *client, max77663_gpio_init(chip); max77663_irq_init(chip); max77663_debugfs_init(chip); - max77663_sleep_enable(chip); + ret = max77663_sleep(chip, false); + if (ret < 0) { + dev_err(&client->dev, "probe: Failed to disable sleep\n"); + goto out_exit; + } ret = mfd_add_devices(&client->dev, 0, pdata->sub_devices, pdata->num_subdevs, NULL, 0); - if (ret != 0) { + if (ret != 0) { dev_err(&client->dev, "probe: Failed to add subdev: %d\n", ret); goto out_exit; } @@ -1334,7 +1354,7 @@ static int max77663_suspend(struct device *dev) if (client->irq) disable_irq(client->irq); - ret = max77663_sleep_enable(chip); + ret = max77663_sleep(chip, true); if (ret < 0) dev_err(dev, "suspend: Failed to enable sleep\n"); @@ -1347,9 +1367,9 @@ static int max77663_resume(struct device *dev) struct max77663_chip *chip = i2c_get_clientdata(client); int ret; - ret = max77663_sleep_enable(chip); + ret = max77663_sleep(chip, false); if (ret < 0) { - dev_err(dev, "resume: Failed to enable sleep\n"); + dev_err(dev, "resume: Failed to disable sleep\n"); return ret; } @@ -1389,7 +1409,7 @@ static int __init max77663_init(void) { return i2c_add_driver(&max77663_driver); } -arch_initcall(max77663_init); +subsys_initcall(max77663_init); static void __exit max77663_exit(void) { |