Commit 004c15a6 authored by Bill Huang's avatar Bill Huang Committed by Samuel Ortiz

mfd: dt: tps6586x: Add power off control

Add DT property "ti,system-power-controller" telling whether or not this
pmic is in charge of controlling the system power, so the power off
routine can be hooked up to system call "pm_power_off".

Based on the work by:
Dan Willemsen <dwillemsen@nvidia.com>
Signed-off-by: default avatarBill Huang <bilhuang@nvidia.com>
Tested-by: default avatarStephen Warren <swarren@wwwdotorg.org>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 80633f05
...@@ -18,6 +18,10 @@ Required properties: ...@@ -18,6 +18,10 @@ Required properties:
- vinldo678-supply: The input supply for the LDO6, LDO7 and LDO8 - vinldo678-supply: The input supply for the LDO6, LDO7 and LDO8
- vinldo9-supply: The input supply for the LDO9 - vinldo9-supply: The input supply for the LDO9
Optional properties:
- ti,system-power-controller: Telling whether or not this pmic is controlling
the system power.
Each regulator is defined using the standard binding for regulators. Each regulator is defined using the standard binding for regulators.
Example: Example:
...@@ -30,6 +34,8 @@ Example: ...@@ -30,6 +34,8 @@ Example:
#gpio-cells = <2>; #gpio-cells = <2>;
gpio-controller; gpio-controller;
ti,system-power-controller;
sm0-supply = <&some_reg>; sm0-supply = <&some_reg>;
sm1-supply = <&some_reg>; sm1-supply = <&some_reg>;
sm2-supply = <&some_reg>; sm2-supply = <&some_reg>;
......
...@@ -29,6 +29,10 @@ ...@@ -29,6 +29,10 @@
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/tps6586x.h> #include <linux/mfd/tps6586x.h>
#define TPS6586X_SUPPLYENE 0x14
#define EXITSLREQ_BIT BIT(1)
#define SLEEP_MODE_BIT BIT(3)
/* interrupt control registers */ /* interrupt control registers */
#define TPS6586X_INT_ACK1 0xb5 #define TPS6586X_INT_ACK1 0xb5
#define TPS6586X_INT_ACK2 0xb6 #define TPS6586X_INT_ACK2 0xb6
...@@ -409,6 +413,7 @@ static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *clien ...@@ -409,6 +413,7 @@ static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *clien
pdata->subdevs = devs; pdata->subdevs = devs;
pdata->gpio_base = -1; pdata->gpio_base = -1;
pdata->irq_base = -1; pdata->irq_base = -1;
pdata->pm_off = of_property_read_bool(np, "ti,system-power-controller");
return pdata; return pdata;
} }
...@@ -441,6 +446,15 @@ static const struct regmap_config tps6586x_regmap_config = { ...@@ -441,6 +446,15 @@ static const struct regmap_config tps6586x_regmap_config = {
.cache_type = REGCACHE_RBTREE, .cache_type = REGCACHE_RBTREE,
}; };
static struct device *tps6586x_dev;
static void tps6586x_power_off(void)
{
if (tps6586x_clr_bits(tps6586x_dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
return;
tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
}
static int __devinit tps6586x_i2c_probe(struct i2c_client *client, static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
...@@ -506,6 +520,11 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client, ...@@ -506,6 +520,11 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
goto err_add_devs; goto err_add_devs;
} }
if (pdata->pm_off && !pm_power_off) {
tps6586x_dev = &client->dev;
pm_power_off = tps6586x_power_off;
}
return 0; return 0;
err_add_devs: err_add_devs:
......
...@@ -77,6 +77,7 @@ struct tps6586x_platform_data { ...@@ -77,6 +77,7 @@ struct tps6586x_platform_data {
int gpio_base; int gpio_base;
int irq_base; int irq_base;
bool pm_off;
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment