diff options
author | Che-Liang Chiou <clchiou@chromium.org> | 2011-07-28 20:32:26 +0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-29 10:59:18 -0700 |
commit | cc84fde2753fd911cf96f909daf1ceb03c3e0d34 (patch) | |
tree | 00fa7cb875a45e0b2596e734f08e09db69fb49ac /board | |
parent | ad18dcf6672745edea6c1df284dde3ff6904bae9 (diff) |
CHRIMIUM: aebl: kaen: seaboard: implement machine power off
This patch is derived from kernel's seaboard power management driver and
tps6586x regulator driver.
BUG=chrome-os-partner:4738
TEST=press power button or close lid in dev and rec mode
Change-Id: I285856b52dcaba6ba3c29cacf47a8c592fbe3256
Reviewed-on: http://gerrit.chromium.org/gerrit/4922
Reviewed-by: Che-Liang Chiou <clchiou@chromium.org>
Tested-by: Che-Liang Chiou <clchiou@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/chromebook-x86/chromeos/power_management.c | 6 | ||||
-rw-r--r-- | board/nvidia/chromeos/power_management.c | 70 |
2 files changed, 60 insertions, 16 deletions
diff --git a/board/chromebook-x86/chromeos/power_management.c b/board/chromebook-x86/chromeos/power_management.c index 1c92f35fbd..8510c8e7b5 100644 --- a/board/chromebook-x86/chromeos/power_management.c +++ b/board/chromebook-x86/chromeos/power_management.c @@ -24,3 +24,9 @@ void cold_reboot(void) { printf("cold_reboot used but not implemented.\n"); } + +/* This function never returns */ +void power_off(void) +{ + printf("power_off used but not implemented.\n"); +} diff --git a/board/nvidia/chromeos/power_management.c b/board/nvidia/chromeos/power_management.c index c41d4ceede..66edf786d9 100644 --- a/board/nvidia/chromeos/power_management.c +++ b/board/nvidia/chromeos/power_management.c @@ -20,6 +20,10 @@ #define PMIC_I2C_BUS 0x00 #define PMIC_I2C_DEVICE_ADDRESS 0x34 +#define TPS6586X_SUPPLYENA 0x10 +#define TPS6586X_SUPPLYENB 0x11 +#define TPS6586X_SUPPLYENC 0x12 +#define TPS6586X_SUPPLYEND 0x13 #define TPS6586X_SUPPLYENE 0x14 extern uint32_t is_tegra2_processor_reset; @@ -33,36 +37,70 @@ int is_processor_reset(void) return is_tegra2_processor_reset ? 1 : 0; } -/* This function never returns */ -void cold_reboot(void) +static int pmic_set_bit(int reg, int bit, int value) { uint8_t byte; + if (i2c_read(PMIC_I2C_DEVICE_ADDRESS, reg, 1, &byte, sizeof(byte))) { + VBDEBUG(PREFIX "i2c_read fail: reg=%02x\n", reg); + return 1; + } + + if (value) + byte |= 1 << bit; + else + byte &= ~(1 << bit); + + if (i2c_write(PMIC_I2C_DEVICE_ADDRESS, reg, 1, &byte, sizeof(byte))) { + VBDEBUG(PREFIX "i2c_write fail: reg=%02x\n", reg); + return 1; + } + + return 0; +} + +/* This function never returns */ +void cold_reboot(void) +{ if (i2c_set_bus_num(PMIC_I2C_BUS)) { VBDEBUG(PREFIX "i2c_set_bus_num fail\n"); goto FATAL; } - if (i2c_read(PMIC_I2C_DEVICE_ADDRESS, TPS6586X_SUPPLYENE, 1, - &byte, sizeof(byte))) { - VBDEBUG(PREFIX "i2c_read fail\n"); - goto FATAL; - } + pmic_set_bit(TPS6586X_SUPPLYENE, 0, 1); - /* Set TPS6586X_SUPPLYENE bit0 to 1 */ - byte |= 1; + /* Wait for 10 ms. If not rebootting, go to endless loop */ + udelay(10 * 1000); - if (i2c_write(PMIC_I2C_DEVICE_ADDRESS, TPS6586X_SUPPLYENE, 1, - &byte, sizeof(byte))) { - VBDEBUG(PREFIX "i2c_write fail\n"); +FATAL: + printf("Please press cold reboot button\n"); + while (1); +} + +/* This function never returns */ +void power_off(void) +{ + if (i2c_set_bus_num(PMIC_I2C_BUS)) { + VBDEBUG(PREFIX "i2c_set_bus_num fail\n"); goto FATAL; } - /* The PMIC will reboot the whole system after 10 ms */ - udelay(100); + /* Disable vdd_sm2 */ + pmic_set_bit(TPS6586X_SUPPLYENC, 7, 0); + pmic_set_bit(TPS6586X_SUPPLYEND, 7, 0); + + /* Disable vdd_core */ + pmic_set_bit(TPS6586X_SUPPLYENA, 1, 0); + pmic_set_bit(TPS6586X_SUPPLYENB, 1, 0); + + /* Disable vdd_cpu */ + pmic_set_bit(TPS6586X_SUPPLYENA, 0, 0); + pmic_set_bit(TPS6586X_SUPPLYENB, 0, 0); + + /* Wait for 10 ms. If not powering off, go to endless loop */ + udelay(10 * 1000); FATAL: - /* The final solution of doing a cold reboot */ - printf("Please press cold reboot button\n"); + printf("Please unplug the power cable and battery\n"); while (1); } |