diff options
author | Bill Huang <bilhuang@nvidia.com> | 2012-08-19 21:07:55 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-09-14 03:52:14 -0400 |
commit | 004c15a68076f5bdc343bed92efed81087cecbfb (patch) | |
tree | 719632562fd71bf6ec24cd0e9a72afbeda8ff6a6 | |
parent | 80633f05b0dbf5819ef28f626f2f0b7c885d1f88 (diff) |
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: Bill Huang <bilhuang@nvidia.com>
Tested-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
-rw-r--r-- | Documentation/devicetree/bindings/regulator/tps6586x.txt | 6 | ||||
-rw-r--r-- | drivers/mfd/tps6586x.c | 19 | ||||
-rw-r--r-- | include/linux/mfd/tps6586x.h | 1 |
3 files changed, 26 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/regulator/tps6586x.txt b/Documentation/devicetree/bindings/regulator/tps6586x.txt index d156e1b5db1..03dfa4e0aa7 100644 --- a/Documentation/devicetree/bindings/regulator/tps6586x.txt +++ b/Documentation/devicetree/bindings/regulator/tps6586x.txt | |||
@@ -18,6 +18,10 @@ Required properties: | |||
18 | - vinldo678-supply: The input supply for the LDO6, LDO7 and LDO8 | 18 | - vinldo678-supply: The input supply for the LDO6, LDO7 and LDO8 |
19 | - vinldo9-supply: The input supply for the LDO9 | 19 | - vinldo9-supply: The input supply for the LDO9 |
20 | 20 | ||
21 | Optional properties: | ||
22 | - ti,system-power-controller: Telling whether or not this pmic is controlling | ||
23 | the system power. | ||
24 | |||
21 | Each regulator is defined using the standard binding for regulators. | 25 | Each regulator is defined using the standard binding for regulators. |
22 | 26 | ||
23 | Example: | 27 | Example: |
@@ -30,6 +34,8 @@ Example: | |||
30 | #gpio-cells = <2>; | 34 | #gpio-cells = <2>; |
31 | gpio-controller; | 35 | gpio-controller; |
32 | 36 | ||
37 | ti,system-power-controller; | ||
38 | |||
33 | sm0-supply = <&some_reg>; | 39 | sm0-supply = <&some_reg>; |
34 | sm1-supply = <&some_reg>; | 40 | sm1-supply = <&some_reg>; |
35 | sm2-supply = <&some_reg>; | 41 | sm2-supply = <&some_reg>; |
diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c index 5f58370ccf5..95ef40754dd 100644 --- a/drivers/mfd/tps6586x.c +++ b/drivers/mfd/tps6586x.c | |||
@@ -29,6 +29,10 @@ | |||
29 | #include <linux/mfd/core.h> | 29 | #include <linux/mfd/core.h> |
30 | #include <linux/mfd/tps6586x.h> | 30 | #include <linux/mfd/tps6586x.h> |
31 | 31 | ||
32 | #define TPS6586X_SUPPLYENE 0x14 | ||
33 | #define EXITSLREQ_BIT BIT(1) | ||
34 | #define SLEEP_MODE_BIT BIT(3) | ||
35 | |||
32 | /* interrupt control registers */ | 36 | /* interrupt control registers */ |
33 | #define TPS6586X_INT_ACK1 0xb5 | 37 | #define TPS6586X_INT_ACK1 0xb5 |
34 | #define TPS6586X_INT_ACK2 0xb6 | 38 | #define TPS6586X_INT_ACK2 0xb6 |
@@ -409,6 +413,7 @@ static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *clien | |||
409 | pdata->subdevs = devs; | 413 | pdata->subdevs = devs; |
410 | pdata->gpio_base = -1; | 414 | pdata->gpio_base = -1; |
411 | pdata->irq_base = -1; | 415 | pdata->irq_base = -1; |
416 | pdata->pm_off = of_property_read_bool(np, "ti,system-power-controller"); | ||
412 | 417 | ||
413 | return pdata; | 418 | return pdata; |
414 | } | 419 | } |
@@ -441,6 +446,15 @@ static const struct regmap_config tps6586x_regmap_config = { | |||
441 | .cache_type = REGCACHE_RBTREE, | 446 | .cache_type = REGCACHE_RBTREE, |
442 | }; | 447 | }; |
443 | 448 | ||
449 | static struct device *tps6586x_dev; | ||
450 | static void tps6586x_power_off(void) | ||
451 | { | ||
452 | if (tps6586x_clr_bits(tps6586x_dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT)) | ||
453 | return; | ||
454 | |||
455 | tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT); | ||
456 | } | ||
457 | |||
444 | static int __devinit tps6586x_i2c_probe(struct i2c_client *client, | 458 | static int __devinit tps6586x_i2c_probe(struct i2c_client *client, |
445 | const struct i2c_device_id *id) | 459 | const struct i2c_device_id *id) |
446 | { | 460 | { |
@@ -506,6 +520,11 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client, | |||
506 | goto err_add_devs; | 520 | goto err_add_devs; |
507 | } | 521 | } |
508 | 522 | ||
523 | if (pdata->pm_off && !pm_power_off) { | ||
524 | tps6586x_dev = &client->dev; | ||
525 | pm_power_off = tps6586x_power_off; | ||
526 | } | ||
527 | |||
509 | return 0; | 528 | return 0; |
510 | 529 | ||
511 | err_add_devs: | 530 | err_add_devs: |
diff --git a/include/linux/mfd/tps6586x.h b/include/linux/mfd/tps6586x.h index f350fd0ba1d..08f109f0f81 100644 --- a/include/linux/mfd/tps6586x.h +++ b/include/linux/mfd/tps6586x.h | |||
@@ -77,6 +77,7 @@ struct tps6586x_platform_data { | |||
77 | 77 | ||
78 | int gpio_base; | 78 | int gpio_base; |
79 | int irq_base; | 79 | int irq_base; |
80 | bool pm_off; | ||
80 | }; | 81 | }; |
81 | 82 | ||
82 | /* | 83 | /* |