summaryrefslogtreecommitdiff
path: root/drivers/mfd
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 /drivers/mfd
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>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/tps6586x.c28
1 files changed, 28 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: