Commit 6dc443e6d7bc2e7e9e2145ba5657dbf309c27c62

Authored by Paul Kocialkowski
Committed by Tom Rini
1 parent e9b3ce3f7e

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 <trini@konsulko.com>
Acked-by: Przemyslaw Marczak <p.marczak@samsung.com>
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>

Showing 2 changed files with 84 additions and 8 deletions Side-by-side Diff

drivers/power/twl4030.c
... ... @@ -46,6 +46,66 @@
46 46 }
47 47  
48 48 /*
  49 + * Power off
  50 + */
  51 +void twl4030_power_off(void)
  52 +{
  53 + u8 data;
  54 +
  55 + /* PM master unlock (CFG and TST keys) */
  56 +
  57 + data = 0xCE;
  58 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  59 + TWL4030_PM_MASTER_PROTECT_KEY, data);
  60 + data = 0xEC;
  61 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  62 + TWL4030_PM_MASTER_PROTECT_KEY, data);
  63 +
  64 + /* VBAT start disable */
  65 +
  66 + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  67 + TWL4030_PM_MASTER_CFG_P1_TRANSITION, &data);
  68 + data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT;
  69 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  70 + TWL4030_PM_MASTER_CFG_P1_TRANSITION, data);
  71 +
  72 + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  73 + TWL4030_PM_MASTER_CFG_P2_TRANSITION, &data);
  74 + data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT;
  75 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  76 + TWL4030_PM_MASTER_CFG_P2_TRANSITION, data);
  77 +
  78 + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  79 + TWL4030_PM_MASTER_CFG_P3_TRANSITION, &data);
  80 + data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT;
  81 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  82 + TWL4030_PM_MASTER_CFG_P3_TRANSITION, data);
  83 +
  84 + /* High jitter for PWRANA2 */
  85 +
  86 + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  87 + TWL4030_PM_MASTER_CFG_PWRANA2, &data);
  88 + data &= ~(TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT0_LOWV |
  89 + TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT1_LOWV);
  90 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  91 + TWL4030_PM_MASTER_CFG_PWRANA2, data);
  92 +
  93 + /* PM master lock */
  94 +
  95 + data = 0xFF;
  96 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  97 + TWL4030_PM_MASTER_PROTECT_KEY, data);
  98 +
  99 + /* Power off */
  100 +
  101 + twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  102 + TWL4030_PM_MASTER_P1_SW_EVENTS, &data);
  103 + data |= TWL4030_PM_MASTER_SW_EVENTS_DEVOFF;
  104 + twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER,
  105 + TWL4030_PM_MASTER_P1_SW_EVENTS, data);
  106 +}
  107 +
  108 +/*
49 109 * Set Device Group and Voltage
50 110 */
51 111 void twl4030_pmrecv_vsel_cfg(u8 vsel_reg, u8 vsel_val,
... ... @@ -129,14 +129,6 @@
129 129 #define TWL4030_PM_MASTER_BB_CFG 0x6D
130 130 #define TWL4030_PM_MASTER_MISC_TST 0x6E
131 131 #define TWL4030_PM_MASTER_TRIM1 0x6F
132   -/* P[1-3]_SW_EVENTS */
133   -#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_PWRON (1 << 6)
134   -#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_SYSEN (1 << 5)
135   -#define TWL4030_PM_MASTER_SW_EVENTS_ENABLE_WARMRESET (1 << 4)
136   -#define TWL4030_PM_MASTER_SW_EVENTS_LVL_WAKEUP (1 << 3)
137   -#define TWL4030_PM_MASTER_SW_EVENTS_DEVACT (1 << 2)
138   -#define TWL4030_PM_MASTER_SW_EVENTS_DEVSLP (1 << 1)
139   -#define TWL4030_PM_MASTER_SW_EVENTS_DEVOFF (1 << 0)
140 132  
141 133 /* Power bus message definitions */
142 134  
... ... @@ -207,6 +199,28 @@
207 199 /* Power Reference */
208 200 #define RES_Main_Ref 28
209 201  
  202 +/* P[1-3]_SW_EVENTS */
  203 +#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_PWRON (1 << 6)
  204 +#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_SYSEN (1 << 5)
  205 +#define TWL4030_PM_MASTER_SW_EVENTS_ENABLE_WARMRESET (1 << 4)
  206 +#define TWL4030_PM_MASTER_SW_EVENTS_LVL_WAKEUP (1 << 3)
  207 +#define TWL4030_PM_MASTER_SW_EVENTS_DEVACT (1 << 2)
  208 +#define TWL4030_PM_MASTER_SW_EVENTS_DEVSLP (1 << 1)
  209 +#define TWL4030_PM_MASTER_SW_EVENTS_DEVOFF (1 << 0)
  210 +
  211 +/* Power transition */
  212 +#define TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_PWON (1 << 0)
  213 +#define TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_CHG (1 << 1)
  214 +#define TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_USB (1 << 2)
  215 +#define TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_RTC (1 << 3)
  216 +#define TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT (1 << 4)
  217 +#define TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBUS (1 << 5)
  218 +#define TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_SWBUG (1 << 7)
  219 +
  220 +/* PWRANA2 */
  221 +#define TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT0_LOWV (1 << 1)
  222 +#define TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT1_LOWV (1 << 2)
  223 +
210 224 #define TOTAL_RESOURCES 28
211 225 /*
212 226 * Power Bus Message Format ... these can be sent individually by Linux,
... ... @@ -645,6 +659,8 @@
645 659  
646 660 /* For hardware resetting */
647 661 void twl4030_power_reset_init(void);
  662 +/* For power off */
  663 +void twl4030_power_off(void);
648 664 /* For setting device group and voltage */
649 665 void twl4030_pmrecv_vsel_cfg(u8 vsel_reg, u8 vsel_val,
650 666 u8 dev_grp, u8 dev_grp_sel);