diff options
-rw-r--r-- | drivers/mfd/tps6586x.c | 28 | ||||
-rw-r--r-- | include/linux/mfd/tps6586x.h | 1 |
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 */ |