Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Name: hwxfsleep.c - ACPI Hardware Sleep/Wake External Interfaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #define EXPORT_ACPI_INTERFACES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #define _COMPONENT          ACPI_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) ACPI_MODULE_NAME("hwxfsleep")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #if (!ACPI_REDUCED_HARDWARE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 				   acpi_physical_address physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 				   acpi_physical_address physical_address64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * These functions are removed for the ACPI_REDUCED_HARDWARE case:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  *      acpi_set_firmware_waking_vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  *      acpi_enter_sleep_state_s4bios
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #if (!ACPI_REDUCED_HARDWARE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  * FUNCTION:    acpi_hw_set_firmware_waking_vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * PARAMETERS:  facs                - Pointer to FACS table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  *              physical_address    - 32-bit physical address of ACPI real mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  *                                    entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  *              physical_address64  - 64-bit physical address of ACPI protected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  *                                    mode entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 				   acpi_physical_address physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 				   acpi_physical_address physical_address64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	 * According to the ACPI specification 2.0c and later, the 64-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	 * waking vector should be cleared and the 32-bit waking vector should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	 * be used, unless we want the wake-up code to be called by the BIOS in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	 * Protected Mode.  Some systems (for example HP dv5-1004nr) are known
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	 * to fail to resume if the 64-bit vector is used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	/* Set the 32-bit vector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	facs->firmware_waking_vector = (u32)physical_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	if (facs->length > 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		if (facs->version >= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 			/* Set the 64-bit vector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 			facs->xfirmware_waking_vector = physical_address64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 			/* Clear the 64-bit vector if it exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 			facs->xfirmware_waking_vector = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)  * FUNCTION:    acpi_set_firmware_waking_vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)  * PARAMETERS:  physical_address    - 32-bit physical address of ACPI real mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)  *                                    entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)  *              physical_address64  - 64-bit physical address of ACPI protected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)  *                                    mode entry point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)  * DESCRIPTION: Sets the firmware_waking_vector fields of the FACS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) acpi_set_firmware_waking_vector(acpi_physical_address physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 				acpi_physical_address physical_address64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	if (acpi_gbl_FACS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		(void)acpi_hw_set_firmware_waking_vector(acpi_gbl_FACS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 							 physical_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 							 physical_address64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)  * FUNCTION:    acpi_enter_sleep_state_s4bios
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)  * PARAMETERS:  None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)  * DESCRIPTION: Perform a S4 bios request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)  *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) acpi_status acpi_enter_sleep_state_s4bios(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	u32 in_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_s4bios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	/* Clear the wake status bit (PM1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	    acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	status = acpi_hw_clear_acpi_status();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	 * 1) Disable all GPEs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	 * 2) Enable all wakeup GPEs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	status = acpi_hw_disable_all_gpes();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	acpi_gbl_system_awake_and_running = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	status = acpi_hw_enable_all_wakeup_gpes();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 				    (u32)acpi_gbl_FADT.s4_bios_request, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		acpi_os_stall(ACPI_USEC_PER_MSEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 		    acpi_read_bit_register(ACPI_BITREG_WAKE_STATUS, &in_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 		if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 			return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	} while (!in_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #endif				/* !ACPI_REDUCED_HARDWARE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)  * FUNCTION:    acpi_enter_sleep_state_prep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)  * PARAMETERS:  sleep_state         - Which sleep state to enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)  * DESCRIPTION: Prepare to enter a system sleep state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)  *              This function must execute with interrupts enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)  *              We break sleeping into 2 stages so that OSPM can handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)  *              various OS-specific tasks between the two steps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	struct acpi_object_list arg_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	union acpi_object arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	u32 sst_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	ACPI_FUNCTION_TRACE(acpi_enter_sleep_state_prep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	status = acpi_get_sleep_type_data(sleep_state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 					  &acpi_gbl_sleep_type_a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 					  &acpi_gbl_sleep_type_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	status = acpi_get_sleep_type_data(ACPI_STATE_S0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 					  &acpi_gbl_sleep_type_a_s0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 					  &acpi_gbl_sleep_type_b_s0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		acpi_gbl_sleep_type_a_s0 = ACPI_SLEEP_TYPE_INVALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	/* Execute the _PTS method (Prepare To Sleep) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	arg_list.count = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	arg_list.pointer = &arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	arg.type = ACPI_TYPE_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	arg.integer.value = sleep_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	    acpi_evaluate_object(NULL, METHOD_PATHNAME__PTS, &arg_list, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	/* Setup the argument to the _SST method (System STatus) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	switch (sleep_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	case ACPI_STATE_S0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		sst_value = ACPI_SST_WORKING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	case ACPI_STATE_S1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	case ACPI_STATE_S2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	case ACPI_STATE_S3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 		sst_value = ACPI_SST_SLEEPING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	case ACPI_STATE_S4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		sst_value = ACPI_SST_SLEEP_CONTEXT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 		sst_value = ACPI_SST_INDICATOR_OFF;	/* Default is off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	 * Set the system indicators to show the desired sleep state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	 * _SST is an optional method (return no error if not found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	acpi_hw_execute_sleep_method(METHOD_PATHNAME__SST, sst_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)  * FUNCTION:    acpi_enter_sleep_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)  * PARAMETERS:  sleep_state         - Which sleep state to enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)  * DESCRIPTION: Enter a system sleep state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)  *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) acpi_status acpi_enter_sleep_state(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	ACPI_FUNCTION_TRACE(acpi_enter_sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	    (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 		ACPI_ERROR((AE_INFO, "Sleep values out of range: A=0x%X B=0x%X",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 			    acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 		return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #if !ACPI_REDUCED_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	if (!acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		status = acpi_hw_legacy_sleep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 		status = acpi_hw_extended_sleep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)  * FUNCTION:    acpi_leave_sleep_state_prep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)  * PARAMETERS:  sleep_state         - Which sleep state we are exiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)  * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)  *              sleep. Called with interrupts DISABLED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)  *              We break wake/resume into 2 stages so that OSPM can handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)  *              various OS-specific tasks between the two steps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	ACPI_FUNCTION_TRACE(acpi_leave_sleep_state_prep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #if !ACPI_REDUCED_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	if (!acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 		status = acpi_hw_legacy_wake_prep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 		status = acpi_hw_extended_wake_prep(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ACPI_EXPORT_SYMBOL(acpi_leave_sleep_state_prep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)  * FUNCTION:    acpi_leave_sleep_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)  * PARAMETERS:  sleep_state         - Which sleep state we are exiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)  * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)  *              Called with interrupts ENABLED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) acpi_status acpi_leave_sleep_state(u8 sleep_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	ACPI_FUNCTION_TRACE(acpi_leave_sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #if !ACPI_REDUCED_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	if (!acpi_gbl_reduced_hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		status = acpi_hw_legacy_wake(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 		status = acpi_hw_extended_wake(sleep_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) ACPI_EXPORT_SYMBOL(acpi_leave_sleep_state)