summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2010-12-17 10:54:55 +0530
committerBharat Nihalani <bnihalani@nvidia.com>2010-12-17 06:40:01 -0800
commit1e6db8c827e98de0308230883f94d069f8b5943e (patch)
tree66147d1e5bf05253e67815ef7d62f99ae8800655
parent691a66c0d6eaa4cbdbe2ff148ff5e6df77137646 (diff)
mfd: tps6586x: add api to power off tps6586x
when tps6586x is put into sleep mode, it powers off ldos. Add an api to put tps6586x in sleep mode by resetting EXITSLREQ and setting SLEEP_MODE in SUPPLYENE register. Change-Id: I80fe35d541e85014bd7b5544d212573fe35d67e5 Reviewed-on: http://git-master/r/13589 Tested-by: Nitin Kumbhar <nkumbhar@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r--drivers/mfd/tps6586x.c28
-rw-r--r--include/linux/mfd/tps6586x.h1
2 files changed, 29 insertions, 0 deletions
diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c
index d11e669913d6..6f3dbc2de343 100644
--- a/drivers/mfd/tps6586x.c
+++ b/drivers/mfd/tps6586x.c
@@ -27,6 +27,10 @@
#include <linux/mfd/core.h>
#include <linux/mfd/tps6586x.h>
+#define TPS6586X_SUPPLYENE 0x14
+#define EXITSLREQ_BIT BIT(1) /* Exit sleep mode request */
+#define SLEEP_MODE_BIT BIT(3) /* Sleep mode */
+
/* GPIO control registers */
#define TPS6586X_GPIOSET1 0x5d
#define TPS6586X_GPIOSET2 0x5e
@@ -254,6 +258,28 @@ out:
}
EXPORT_SYMBOL_GPL(tps6586x_update);
+static struct i2c_client *tps6586x_i2c_client = NULL;
+int tps6586x_power_off(void)
+{
+ struct device *dev = NULL;
+ int ret = -EINVAL;
+
+ if (!tps6586x_i2c_client)
+ return ret;
+
+ dev = &tps6586x_i2c_client->dev;
+
+ ret = tps6586x_clr_bits(dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT);
+ if (ret)
+ return ret;
+
+ ret = tps6586x_set_bits(dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int tps6586x_gpio_get(struct gpio_chip *gc, unsigned offset)
{
struct tps6586x *tps6586x = container_of(gc, struct tps6586x, gpio);
@@ -532,6 +558,8 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
tps6586x_gpio_init(tps6586x, pdata->gpio_base);
+ tps6586x_i2c_client = client;
+
return 0;
err_add_devs:
diff --git a/include/linux/mfd/tps6586x.h b/include/linux/mfd/tps6586x.h
index d96fb3d3e624..bd20aa696485 100644
--- a/include/linux/mfd/tps6586x.h
+++ b/include/linux/mfd/tps6586x.h
@@ -78,5 +78,6 @@ extern int tps6586x_set_bits(struct device *dev, int reg, uint8_t bit_mask);
extern int tps6586x_clr_bits(struct device *dev, int reg, uint8_t bit_mask);
extern int tps6586x_update(struct device *dev, int reg, uint8_t val,
uint8_t mask);
+extern int tps6586x_power_off(void);
#endif /*__LINUX_MFD_TPS6586X_H */