diff options
| author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2016-09-07 08:39:55 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2016-09-08 02:03:58 -0400 |
| commit | bda7b072de999280ef78aaea4335ec58afc4bdb2 (patch) | |
| tree | 57b48f6f54d942066930831c725f05aa7d8a71b9 /arch/x86/platform | |
| parent | 3976b0380b315651137ce4321b1171ac0a1d26ed (diff) | |
x86/platform/intel-mid: Implement power off sequence
Tell SCU that we are about powering off the device.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20160907123955.21228-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/platform')
| -rw-r--r-- | arch/x86/platform/intel-mid/intel-mid.c | 5 | ||||
| -rw-r--r-- | arch/x86/platform/intel-mid/pwr.c | 24 |
2 files changed, 28 insertions, 1 deletions
diff --git a/arch/x86/platform/intel-mid/intel-mid.c b/arch/x86/platform/intel-mid/intel-mid.c index ce119d2ba0d0..7850128f0026 100644 --- a/arch/x86/platform/intel-mid/intel-mid.c +++ b/arch/x86/platform/intel-mid/intel-mid.c | |||
| @@ -70,6 +70,11 @@ EXPORT_SYMBOL_GPL(__intel_mid_cpu_chip); | |||
| 70 | 70 | ||
| 71 | static void intel_mid_power_off(void) | 71 | static void intel_mid_power_off(void) |
| 72 | { | 72 | { |
| 73 | /* Shut down South Complex via PWRMU */ | ||
| 74 | intel_mid_pwr_power_off(); | ||
| 75 | |||
| 76 | /* Only for Tangier, the rest will ignore this command */ | ||
| 77 | intel_scu_ipc_simple_command(IPCMSG_COLD_OFF, 1); | ||
| 73 | }; | 78 | }; |
| 74 | 79 | ||
| 75 | static void intel_mid_reboot(void) | 80 | static void intel_mid_reboot(void) |
diff --git a/arch/x86/platform/intel-mid/pwr.c b/arch/x86/platform/intel-mid/pwr.c index 0548741b6894..2dfe998a5afd 100644 --- a/arch/x86/platform/intel-mid/pwr.c +++ b/arch/x86/platform/intel-mid/pwr.c | |||
| @@ -48,7 +48,15 @@ | |||
| 48 | #define PM_CMD_CM_IMMEDIATE (1 << 9) | 48 | #define PM_CMD_CM_IMMEDIATE (1 << 9) |
| 49 | #define PM_CMD_CM_DELAY (2 << 9) | 49 | #define PM_CMD_CM_DELAY (2 << 9) |
| 50 | #define PM_CMD_CM_TRIGGER (3 << 9) | 50 | #define PM_CMD_CM_TRIGGER (3 << 9) |
| 51 | #define PM_CMD_D3cold (1 << 21) | 51 | |
| 52 | /* System states */ | ||
| 53 | #define PM_CMD_SYS_STATE_S5 (5 << 16) | ||
| 54 | |||
| 55 | /* Trigger variants */ | ||
| 56 | #define PM_CMD_CFG_TRIGGER_NC (3 << 19) | ||
| 57 | |||
| 58 | /* Message to wait for TRIGGER_NC case */ | ||
| 59 | #define TRIGGER_NC_MSG_2 (2 << 22) | ||
| 52 | 60 | ||
| 53 | /* List of commands */ | 61 | /* List of commands */ |
| 54 | #define CMD_SET_CFG 0x01 | 62 | #define CMD_SET_CFG 0x01 |
| @@ -264,6 +272,20 @@ int intel_mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state) | |||
| 264 | } | 272 | } |
| 265 | EXPORT_SYMBOL_GPL(intel_mid_pci_set_power_state); | 273 | EXPORT_SYMBOL_GPL(intel_mid_pci_set_power_state); |
| 266 | 274 | ||
| 275 | void intel_mid_pwr_power_off(void) | ||
| 276 | { | ||
| 277 | struct mid_pwr *pwr = midpwr; | ||
| 278 | u32 cmd = PM_CMD_SYS_STATE_S5 | | ||
| 279 | PM_CMD_CMD(CMD_SET_CFG) | | ||
| 280 | PM_CMD_CM_TRIGGER | | ||
| 281 | PM_CMD_CFG_TRIGGER_NC | | ||
| 282 | TRIGGER_NC_MSG_2; | ||
| 283 | |||
| 284 | /* Send command to SCU */ | ||
| 285 | writel(cmd, pwr->regs + PM_CMD); | ||
| 286 | mid_pwr_wait(pwr); | ||
| 287 | } | ||
| 288 | |||
| 267 | int intel_mid_pwr_get_lss_id(struct pci_dev *pdev) | 289 | int intel_mid_pwr_get_lss_id(struct pci_dev *pdev) |
| 268 | { | 290 | { |
| 269 | int vndr; | 291 | int vndr; |
