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

📄 hwsleep.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	    (acpi_gbl_sleep_type_b << sleep_type_reg_info->bit_position);	/*	 * We split the writes of SLP_TYP and SLP_EN to workaround	 * poorly implemented hardware.	 */	/* Write #1: fill in SLP_TYP data */	status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,					ACPI_REGISTER_PM1A_CONTROL,					PM1Acontrol);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,					ACPI_REGISTER_PM1B_CONTROL,					PM1Bcontrol);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Insert SLP_ENABLE bit */	PM1Acontrol |= sleep_enable_reg_info->access_bit_mask;	PM1Bcontrol |= sleep_enable_reg_info->access_bit_mask;	/* Write #2: SLP_TYP + SLP_EN */	ACPI_FLUSH_CPU_CACHE();	status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,					ACPI_REGISTER_PM1A_CONTROL,					PM1Acontrol);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,					ACPI_REGISTER_PM1B_CONTROL,					PM1Bcontrol);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	if (sleep_state > ACPI_STATE_S3) {		/*		 * We wanted to sleep > S3, but it didn't happen (by virtue of the		 * fact that we are still executing!)		 *		 * Wait ten seconds, then try again. This is to get S4/S5 to work on		 * all machines.		 *		 * We wait so long to allow chipsets that poll this reg very slowly to		 * still read the right value. Ideally, this block would go		 * away entirely.		 */		acpi_os_stall(10000000);		status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,						ACPI_REGISTER_PM1_CONTROL,						sleep_enable_reg_info->						access_bit_mask);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}	}	/* Wait until we enter sleep state */	do {		status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value,					   ACPI_MTX_DO_NOT_LOCK);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}		/* Spin until we wake */	} while (!in_value);	return_ACPI_STATUS(AE_OK);}EXPORT_SYMBOL(acpi_enter_sleep_state);/******************************************************************************* * * FUNCTION:    acpi_enter_sleep_state_s4bios * * PARAMETERS:  None * * RETURN:      Status * * DESCRIPTION: Perform a S4 bios request. *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED * ******************************************************************************/acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void){	u32 in_value;	acpi_status status;	ACPI_FUNCTION_TRACE("acpi_enter_sleep_state_s4bios");	status =	    acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	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();	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	acpi_gbl_system_awake_and_running = FALSE;	status = acpi_hw_enable_all_wakeup_gpes();	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	ACPI_FLUSH_CPU_CACHE();	status = acpi_os_write_port(acpi_gbl_FADT->smi_cmd,				    (u32) acpi_gbl_FADT->S4bios_req, 8);	do {		acpi_os_stall(1000);		status = acpi_get_register(ACPI_BITREG_WAKE_STATUS, &in_value,					   ACPI_MTX_DO_NOT_LOCK);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}	} while (!in_value);	return_ACPI_STATUS(AE_OK);}EXPORT_SYMBOL(acpi_enter_sleep_state_s4bios);/******************************************************************************* * * FUNCTION:    acpi_leave_sleep_state * * PARAMETERS:  sleep_state         - Which sleep state we just exited * * RETURN:      Status * * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep *              Called with interrupts ENABLED. * ******************************************************************************/acpi_status acpi_leave_sleep_state(u8 sleep_state){	struct acpi_object_list arg_list;	union acpi_object arg;	acpi_status status;	struct acpi_bit_register_info *sleep_type_reg_info;	struct acpi_bit_register_info *sleep_enable_reg_info;	u32 PM1Acontrol;	u32 PM1Bcontrol;	ACPI_FUNCTION_TRACE("acpi_leave_sleep_state");	/*	 * Set SLP_TYPE and SLP_EN to state S0.	 * This is unclear from the ACPI Spec, but it is required	 * by some machines.	 */	status = acpi_get_sleep_type_data(ACPI_STATE_S0,					  &acpi_gbl_sleep_type_a,					  &acpi_gbl_sleep_type_b);	if (ACPI_SUCCESS(status)) {		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);		/* Get current value of PM1A control */		status = acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK,					       ACPI_REGISTER_PM1_CONTROL,					       &PM1Acontrol);		if (ACPI_SUCCESS(status)) {			/* Clear SLP_EN and SLP_TYP fields */			PM1Acontrol &= ~(sleep_type_reg_info->access_bit_mask |					 sleep_enable_reg_info->					 access_bit_mask);			PM1Bcontrol = PM1Acontrol;			/* Insert SLP_TYP bits */			PM1Acontrol |=			    (acpi_gbl_sleep_type_a << sleep_type_reg_info->			     bit_position);			PM1Bcontrol |=			    (acpi_gbl_sleep_type_b << sleep_type_reg_info->			     bit_position);			/* Just ignore any errors */			(void)acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,						     ACPI_REGISTER_PM1A_CONTROL,						     PM1Acontrol);			(void)acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,						     ACPI_REGISTER_PM1B_CONTROL,						     PM1Bcontrol);		}	}	/* Ensure enter_sleep_state_prep -> enter_sleep_state ordering */	acpi_gbl_sleep_type_a = ACPI_SLEEP_TYPE_INVALID;	/* Setup parameter object */	arg_list.count = 1;	arg_list.pointer = &arg;	arg.type = ACPI_TYPE_INTEGER;	/* Ignore any errors from these methods */	arg.integer.value = ACPI_SST_WAKING;	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)));	}	arg.integer.value = sleep_state;	status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {		ACPI_REPORT_ERROR(("Method _BFS failed, %s\n",				   acpi_format_exception(status)));	}	status = acpi_evaluate_object(NULL, METHOD_NAME__WAK, &arg_list, NULL);	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {		ACPI_REPORT_ERROR(("Method _WAK failed, %s\n",				   acpi_format_exception(status)));	}	/* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */	/*	 * Restore the GPEs:	 * 1) Disable/Clear all GPEs	 * 2) Enable all runtime GPEs	 */	status = acpi_hw_disable_all_gpes();	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	acpi_gbl_system_awake_and_running = TRUE;	status = acpi_hw_enable_all_runtime_gpes();	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Enable power button */	(void)	    acpi_set_register(acpi_gbl_fixed_event_info			      [ACPI_EVENT_POWER_BUTTON].enable_register_id, 1,			      ACPI_MTX_DO_NOT_LOCK);	(void)	    acpi_set_register(acpi_gbl_fixed_event_info			      [ACPI_EVENT_POWER_BUTTON].status_register_id, 1,			      ACPI_MTX_DO_NOT_LOCK);	arg.integer.value = ACPI_SST_WORKING;	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(status);}

⌨️ 快捷键说明

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