1709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore/****************************************************************************** 2709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 3709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Name: hwesleep.c - ACPI Hardware Sleep/Wake Support functions for the 4709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * extended FADT-V5 sleep registers. 5709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 6709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore *****************************************************************************/ 7709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 8709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore/* 9fbb7a2dc2be493c87399550bdc2ddaa510cdf450Bob Moore * Copyright (C) 2000 - 2014, Intel Corp. 10709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * All rights reserved. 11709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 12709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Redistribution and use in source and binary forms, with or without 13709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * modification, are permitted provided that the following conditions 14709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * are met: 15709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 1. Redistributions of source code must retain the above copyright 16709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * notice, this list of conditions, and the following disclaimer, 17709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * without modification. 18709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * substantially similar to the "NO WARRANTY" disclaimer below 20709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * ("Disclaimer") and any redistribution must be conditioned upon 21709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * including a substantially similar Disclaimer requirement for further 22709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * binary redistribution. 23709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 3. Neither the names of the above-listed copyright holders nor the names 24709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * of any contributors may be used to endorse or promote products derived 25709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * from this software without specific prior written permission. 26709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 27709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Alternatively, this software may be distributed under the terms of the 28709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * GNU General Public License ("GPL") version 2 as published by the Free 29709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Software Foundation. 30709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 31709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * NO WARRANTY 32709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * POSSIBILITY OF SUCH DAMAGES. 43709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore */ 44709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 45709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore#include <acpi/acpi.h> 46d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro#include <linux/acpi.h> 47709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore#include "accommon.h" 48709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 49709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore#define _COMPONENT ACPI_HARDWARE 50709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob MooreACPI_MODULE_NAME("hwesleep") 51709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 52709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore/******************************************************************************* 53709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 54709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * FUNCTION: acpi_hw_execute_sleep_method 55709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 564efeeecd884de36b77c64489dee7eb7ca4d6bed0Bob Moore * PARAMETERS: method_pathname - Pathname of method to execute 57709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * integer_argument - Argument to pass to the method 58709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 59709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * RETURN: None 60709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 61709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * DESCRIPTION: Execute a sleep/wake related method with one integer argument 62709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * and no return value. 63709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 64709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ******************************************************************************/ 654efeeecd884de36b77c64489dee7eb7ca4d6bed0Bob Moorevoid acpi_hw_execute_sleep_method(char *method_pathname, u32 integer_argument) 66709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore{ 67709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore struct acpi_object_list arg_list; 68709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore union acpi_object arg; 69709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore acpi_status status; 70709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 71709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_FUNCTION_TRACE(hw_execute_sleep_method); 72709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 73709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* One argument, integer_argument; No return value expected */ 74709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 75709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore arg_list.count = 1; 76709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore arg_list.pointer = &arg; 77709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore arg.type = ACPI_TYPE_INTEGER; 78709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore arg.integer.value = (u64)integer_argument; 79709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 804efeeecd884de36b77c64489dee7eb7ca4d6bed0Bob Moore status = acpi_evaluate_object(NULL, method_pathname, &arg_list, NULL); 81709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 82709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_EXCEPTION((AE_INFO, status, "While executing method %s", 834efeeecd884de36b77c64489dee7eb7ca4d6bed0Bob Moore method_pathname)); 84709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore } 85709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 86709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_VOID; 87709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore} 88709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 89709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore/******************************************************************************* 90709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 91709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * FUNCTION: acpi_hw_extended_sleep 92709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 93709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * PARAMETERS: sleep_state - Which sleep state to enter 94709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 95709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * RETURN: Status 96709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 97709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * DESCRIPTION: Enter a system sleep state via the extended FADT sleep 98709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * registers (V5 FADT). 99709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED 100709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 101709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ******************************************************************************/ 102709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 1033f6f49c7854c9294119437a82c5b35be78f9cea6Len Brownacpi_status acpi_hw_extended_sleep(u8 sleep_state) 104709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore{ 105709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore acpi_status status; 106709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore u8 sleep_type_value; 107709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore u64 sleep_status; 108709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 109709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_FUNCTION_TRACE(hw_extended_sleep); 110709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 111709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* Extended sleep registers must be valid */ 112709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 113709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore if (!acpi_gbl_FADT.sleep_control.address || 114709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore !acpi_gbl_FADT.sleep_status.address) { 115709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_ACPI_STATUS(AE_NOT_EXIST); 116709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore } 117709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 118709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* Clear wake status (WAK_STS) */ 119709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 1205134abfcfb4a8a9ef42c82dabad05762fbf04376Bob Moore status = 1215134abfcfb4a8a9ef42c82dabad05762fbf04376Bob Moore acpi_write((u64)ACPI_X_WAKE_STATUS, &acpi_gbl_FADT.sleep_status); 122709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore if (ACPI_FAILURE(status)) { 123709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_ACPI_STATUS(status); 124709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore } 125709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 126709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore acpi_gbl_system_awake_and_running = FALSE; 127709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 128709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* Flush caches, as per ACPI specification */ 129709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 130709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_FLUSH_CPU_CACHE(); 131709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 132d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro status = acpi_os_prepare_extended_sleep(sleep_state, 133d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro acpi_gbl_sleep_type_a, 134d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro acpi_gbl_sleep_type_b); 135d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro if (ACPI_SKIP(status)) 136d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro return_ACPI_STATUS(AE_OK); 137d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro if (ACPI_FAILURE(status)) 138d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro return_ACPI_STATUS(status); 139d6b47b122473885abc882e337ac2d321bbcfb378Ben Guthro 140709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* 141709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Set the SLP_TYP and SLP_EN bits. 142709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 143709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Note: We only use the first value returned by the \_Sx method 144709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * (acpi_gbl_sleep_type_a) - As per ACPI specification. 145709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore */ 146709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_DEBUG_PRINT((ACPI_DB_INIT, 147709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore "Entering sleep state [S%u]\n", sleep_state)); 148709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 149709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore sleep_type_value = 150709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ((acpi_gbl_sleep_type_a << ACPI_X_SLEEP_TYPE_POSITION) & 151709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_X_SLEEP_TYPE_MASK); 152709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 1535134abfcfb4a8a9ef42c82dabad05762fbf04376Bob Moore status = acpi_write((u64)(sleep_type_value | ACPI_X_SLEEP_ENABLE), 154709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore &acpi_gbl_FADT.sleep_control); 155709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore if (ACPI_FAILURE(status)) { 156709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_ACPI_STATUS(status); 157709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore } 158709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 159709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* Wait for transition back to Working State */ 160709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 161709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore do { 162709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore status = acpi_read(&sleep_status, &acpi_gbl_FADT.sleep_status); 163709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore if (ACPI_FAILURE(status)) { 164709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_ACPI_STATUS(status); 165709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore } 166709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 167709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore } while (!(((u8)sleep_status) & ACPI_X_WAKE_STATUS)); 168709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 169709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_ACPI_STATUS(AE_OK); 170709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore} 171709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 172709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore/******************************************************************************* 173709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 174709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * FUNCTION: acpi_hw_extended_wake_prep 175709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 176709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * PARAMETERS: sleep_state - Which sleep state we just exited 177709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 178709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * RETURN: Status 179709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 180709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * DESCRIPTION: Perform first part of OS-independent ACPI cleanup after 181709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * a sleep. Called with interrupts ENABLED. 182709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 183709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ******************************************************************************/ 184709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 1853f6f49c7854c9294119437a82c5b35be78f9cea6Len Brownacpi_status acpi_hw_extended_wake_prep(u8 sleep_state) 186709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore{ 187709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore acpi_status status; 188709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore u8 sleep_type_value; 189709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 190709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_FUNCTION_TRACE(hw_extended_wake_prep); 191709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 192709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore status = acpi_get_sleep_type_data(ACPI_STATE_S0, 193709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore &acpi_gbl_sleep_type_a, 194709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore &acpi_gbl_sleep_type_b); 195709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore if (ACPI_SUCCESS(status)) { 196709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore sleep_type_value = 197709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ((acpi_gbl_sleep_type_a << ACPI_X_SLEEP_TYPE_POSITION) & 198709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_X_SLEEP_TYPE_MASK); 199709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 2005134abfcfb4a8a9ef42c82dabad05762fbf04376Bob Moore (void)acpi_write((u64)(sleep_type_value | ACPI_X_SLEEP_ENABLE), 201709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore &acpi_gbl_FADT.sleep_control); 202709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore } 203709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 204709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_ACPI_STATUS(AE_OK); 205709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore} 206709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 207709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore/******************************************************************************* 208709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 209709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * FUNCTION: acpi_hw_extended_wake 210709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 211709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * PARAMETERS: sleep_state - Which sleep state we just exited 212709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 213709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * RETURN: Status 214709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 215709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep 216709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Called with interrupts ENABLED. 217709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * 218709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ******************************************************************************/ 219709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 2203f6f49c7854c9294119437a82c5b35be78f9cea6Len Brownacpi_status acpi_hw_extended_wake(u8 sleep_state) 221709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore{ 222709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore ACPI_FUNCTION_TRACE(hw_extended_wake); 223709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 224709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* Ensure enter_sleep_state_prep -> enter_sleep_state ordering */ 225709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 226709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore acpi_gbl_sleep_type_a = ACPI_SLEEP_TYPE_INVALID; 227709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 228709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* Execute the wake methods */ 229709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 2304efeeecd884de36b77c64489dee7eb7ca4d6bed0Bob Moore acpi_hw_execute_sleep_method(METHOD_PATHNAME__SST, ACPI_SST_WAKING); 2314efeeecd884de36b77c64489dee7eb7ca4d6bed0Bob Moore acpi_hw_execute_sleep_method(METHOD_PATHNAME__WAK, sleep_state); 232709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 233709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore /* 234709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * Some BIOS code assumes that WAK_STS will be cleared on resume 235709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * and use it to determine whether the system is rebooting or 236709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore * resuming. Clear WAK_STS for compatibility. 237709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore */ 2385134abfcfb4a8a9ef42c82dabad05762fbf04376Bob Moore (void)acpi_write((u64)ACPI_X_WAKE_STATUS, &acpi_gbl_FADT.sleep_status); 239709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore acpi_gbl_system_awake_and_running = TRUE; 240709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore 2414efeeecd884de36b77c64489dee7eb7ca4d6bed0Bob Moore acpi_hw_execute_sleep_method(METHOD_PATHNAME__SST, ACPI_SST_WORKING); 242709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore return_ACPI_STATUS(AE_OK); 243709585765734e90d9fe0a2dc9c6f4e49eff5c6ecBob Moore} 244