diff options
| author | Paul Kocialkowski <[email protected]> | 2015-07-20 15:17:07 +0200 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2015-08-12 20:47:35 -0400 |
| commit | 6dc443e6d7bc2e7e9e2145ba5657dbf309c27c62 (patch) | |
| tree | 1ea51b06949f396f73012b7a8fb1ddc730f062b1 /drivers | |
| parent | e9b3ce3f7ebf1c0dd13bff799de854a7f2f905e1 (diff) | |
power: twl4030: Power off support
This adds support for powering off (the omap3 SoC) from the twl4030. This is
especially useful when the kernel does not actually power off the device using
this method but reboots and leaves it up to the bootloader to actually turn the
power off.
Reviewed-by: Tom Rini <[email protected]>
Acked-by: Przemyslaw Marczak <[email protected]>
Signed-off-by: Paul Kocialkowski <[email protected]>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/power/twl4030.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/drivers/power/twl4030.c b/drivers/power/twl4030.c index 7f1fdd1534c..8866bf1b19e 100644 --- a/drivers/power/twl4030.c +++ b/drivers/power/twl4030.c @@ -46,6 +46,66 @@ void twl4030_power_reset_init(void) } /* + * Power off + */ +void twl4030_power_off(void) +{ + u8 data; + + /* PM master unlock (CFG and TST keys) */ + + data = 0xCE; + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_PROTECT_KEY, data); + data = 0xEC; + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_PROTECT_KEY, data); + + /* VBAT start disable */ + + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_P1_TRANSITION, &data); + data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT; + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_P1_TRANSITION, data); + + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_P2_TRANSITION, &data); + data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT; + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_P2_TRANSITION, data); + + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_P3_TRANSITION, &data); + data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT; + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_P3_TRANSITION, data); + + /* High jitter for PWRANA2 */ + + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_PWRANA2, &data); + data &= ~(TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT0_LOWV | + TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT1_LOWV); + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_CFG_PWRANA2, data); + + /* PM master lock */ + + data = 0xFF; + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_PROTECT_KEY, data); + + /* Power off */ + + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_P1_SW_EVENTS, &data); + data |= TWL4030_PM_MASTER_SW_EVENTS_DEVOFF; + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, + TWL4030_PM_MASTER_P1_SW_EVENTS, data); +} + +/* * Set Device Group and Voltage */ void twl4030_pmrecv_vsel_cfg(u8 vsel_reg, u8 vsel_val, |
