⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwsleep.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface * *****************************************************************************//* * Copyright (C) 2000 - 2005, R. Byron Moore * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions, and the following disclaimer, *    without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer *    substantially similar to the "NO WARRANTY" disclaimer below *    ("Disclaimer") and any redistribution must be conditioned upon *    including a substantially similar Disclaimer requirement for further *    binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names *    of any contributors may be used to endorse or promote products derived *    from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */#include <linux/module.h>#include <acpi/acpi.h>#define _COMPONENT          ACPI_HARDWARE	 ACPI_MODULE_NAME    ("hwsleep")#define METHOD_NAME__BFS        "\\_BFS"#define METHOD_NAME__GTS        "\\_GTS"#define METHOD_NAME__PTS        "\\_PTS"#define METHOD_NAME__SST        "\\_SI._SST"#define METHOD_NAME__WAK        "\\_WAK"#define ACPI_SST_INDICATOR_OFF  0#define ACPI_SST_WORKING        1#define ACPI_SST_WAKING         2#define ACPI_SST_SLEEPING       3#define ACPI_SST_SLEEP_CONTEXT  4/****************************************************************************** * * FUNCTION:    acpi_set_firmware_waking_vector * * PARAMETERS:  physical_address    - Physical address of ACPI real mode *                                    entry point. * * RETURN:      Status * * DESCRIPTION: access function for d_firmware_waking_vector field in FACS * ******************************************************************************/acpi_statusacpi_set_firmware_waking_vector (	acpi_physical_address physical_address){	ACPI_FUNCTION_TRACE ("acpi_set_firmware_waking_vector");	/* Set the vector */	if (acpi_gbl_common_fACS.vector_width == 32) {		*(ACPI_CAST_PTR (u32, acpi_gbl_common_fACS.firmware_waking_vector))				= (u32) physical_address;	}	else {		*acpi_gbl_common_fACS.firmware_waking_vector				= physical_address;	}	return_ACPI_STATUS (AE_OK);}/****************************************************************************** * * FUNCTION:    acpi_get_firmware_waking_vector * * PARAMETERS:  *physical_address   - Output buffer where contents of *                                    the firmware_waking_vector field of *                                    the FACS will be stored. * * RETURN:      Status * * DESCRIPTION: Access function for firmware_waking_vector field in FACS * ******************************************************************************/#ifdef ACPI_FUTURE_USAGEacpi_statusacpi_get_firmware_waking_vector (	acpi_physical_address *physical_address){	ACPI_FUNCTION_TRACE ("acpi_get_firmware_waking_vector");	if (!physical_address) {		return_ACPI_STATUS (AE_BAD_PARAMETER);	}	/* Get the vector */	if (acpi_gbl_common_fACS.vector_width == 32) {		*physical_address = (acpi_physical_address)			*(ACPI_CAST_PTR (u32, acpi_gbl_common_fACS.firmware_waking_vector));	}	else {		*physical_address =			*acpi_gbl_common_fACS.firmware_waking_vector;	}	return_ACPI_STATUS (AE_OK);}#endif/****************************************************************************** * * FUNCTION:    acpi_enter_sleep_state_prep * * PARAMETERS:  sleep_state         - Which sleep state to enter * * RETURN:      Status * * DESCRIPTION: Prepare to enter a system sleep state (see ACPI 2.0 spec p 231) *              This function must execute with interrupts enabled. *              We break sleeping into 2 stages so that OSPM can handle *              various OS-specific tasks between the two steps. * ******************************************************************************/acpi_statusacpi_enter_sleep_state_prep (	u8                          sleep_state){	acpi_status                 status;	struct acpi_object_list     arg_list;	union acpi_object           arg;	ACPI_FUNCTION_TRACE ("acpi_enter_sleep_state_prep");	/*	 * _PSW methods could be run here to enable wake-on keyboard, LAN, etc.	 */	status = acpi_get_sleep_type_data (sleep_state,			  &acpi_gbl_sleep_type_a, &acpi_gbl_sleep_type_b);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	/* Setup parameter object */	arg_list.count = 1;	arg_list.pointer = &arg;	arg.type = ACPI_TYPE_INTEGER;	arg.integer.value = sleep_state;	/* Run the _PTS and _GTS methods */	status = acpi_evaluate_object (NULL, METHOD_NAME__PTS, &arg_list, NULL);	if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {		return_ACPI_STATUS (status);	}	status = acpi_evaluate_object (NULL, METHOD_NAME__GTS, &arg_list, NULL);	if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {		return_ACPI_STATUS (status);	}	/* Setup the argument to _SST */	switch (sleep_state) {	case ACPI_STATE_S0:		arg.integer.value = ACPI_SST_WORKING;		break;	case ACPI_STATE_S1:	case ACPI_STATE_S2:	case ACPI_STATE_S3:		arg.integer.value = ACPI_SST_SLEEPING;		break;	case ACPI_STATE_S4:		arg.integer.value = ACPI_SST_SLEEP_CONTEXT;		break;	default:		arg.integer.value = ACPI_SST_INDICATOR_OFF; /* Default is indicator off */		break;	}	/* Set the system indicators to show the desired sleep state. */	status = acpi_evaluate_object (NULL, METHOD_NAME__SST, &arg_list, NULL);	if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {		 ACPI_REPORT_ERROR (("Method _SST failed, %s\n", acpi_format_exception (status)));	}	return_ACPI_STATUS (AE_OK);}/****************************************************************************** * * FUNCTION:    acpi_enter_sleep_state * * PARAMETERS:  sleep_state         - Which sleep state to enter * * RETURN:      Status * * DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231) *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED * ******************************************************************************/acpi_status asmlinkageacpi_enter_sleep_state (	u8                              sleep_state){	u32                             PM1Acontrol;	u32                             PM1Bcontrol;	struct acpi_bit_register_info   *sleep_type_reg_info;	struct acpi_bit_register_info   *sleep_enable_reg_info;	u32                             in_value;	acpi_status                     status;	ACPI_FUNCTION_TRACE ("acpi_enter_sleep_state");	if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) ||		(acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) {		ACPI_REPORT_ERROR (("Sleep values out of range: A=%X B=%X\n",			acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b));		return_ACPI_STATUS (AE_AML_OPERAND_VALUE);	}	sleep_type_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_TYPE_A);	sleep_enable_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_ENABLE);	/* Clear wake status */	status = acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	/* Clear all fixed and general purpose status bits */	status = acpi_hw_clear_acpi_status (ACPI_MTX_DO_NOT_LOCK);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	/*	 * 1) Disable/Clear all GPEs	 * 2) Enable all wakeup GPEs	 */	status = acpi_hw_disable_all_gpes (ACPI_ISR);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -