summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authorChe-Liang Chiou <clchiou@chromium.org>2011-07-28 20:32:26 +0800
committerSimon Glass <sjg@chromium.org>2011-08-29 10:59:18 -0700
commitcc84fde2753fd911cf96f909daf1ceb03c3e0d34 (patch)
tree00fa7cb875a45e0b2596e734f08e09db69fb49ac /board
parentad18dcf6672745edea6c1df284dde3ff6904bae9 (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.c6
-rw-r--r--board/nvidia/chromeos/power_management.c70
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);
}