diff options
Diffstat (limited to 'drivers/acpi/hardware/hwgpe.c')
| -rw-r--r-- | drivers/acpi/hardware/hwgpe.c | 52 | 
1 files changed, 49 insertions, 3 deletions
diff --git a/drivers/acpi/hardware/hwgpe.c b/drivers/acpi/hardware/hwgpe.c index 14bc4f456ae..0b80db9d919 100644 --- a/drivers/acpi/hardware/hwgpe.c +++ b/drivers/acpi/hardware/hwgpe.c @@ -55,6 +55,54 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,  /******************************************************************************   * + * FUNCTION:	acpi_hw_low_disable_gpe + * + * PARAMETERS:	gpe_event_info	    - Info block for the GPE to be disabled + * + * RETURN:	Status + * + * DESCRIPTION: Disable a single GPE in the enable register. + * + ******************************************************************************/ + +acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) +{ +	struct acpi_gpe_register_info *gpe_register_info; +	acpi_status status; +	u32 enable_mask; + +	/* Get the info block for the entire GPE register */ + +	gpe_register_info = gpe_event_info->register_info; +	if (!gpe_register_info) { +		return (AE_NOT_EXIST); +	} + +	/* Get current value of the enable register that contains this GPE */ + +	status = acpi_hw_low_level_read(ACPI_GPE_REGISTER_WIDTH, &enable_mask, +					&gpe_register_info->enable_address); +	if (ACPI_FAILURE(status)) { +		return (status); +	} + +	/* Clear just the bit that corresponds to this GPE */ + +	ACPI_CLEAR_BIT(enable_mask, +		       ((u32) 1 << +			(gpe_event_info->gpe_number - +			 gpe_register_info->base_gpe_number))); + +	/* Write the updated enable mask */ + +	status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, enable_mask, +					 &gpe_register_info->enable_address); + +	return (status); +} + +/****************************************************************************** + *   * FUNCTION:    acpi_hw_write_gpe_enable_reg   *   * PARAMETERS:  gpe_event_info      - Info block for the GPE to be enabled @@ -68,7 +116,7 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,   ******************************************************************************/  acpi_status -acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info) +acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info)  {  	struct acpi_gpe_register_info *gpe_register_info;  	acpi_status status; @@ -138,7 +186,6 @@ acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)   *   ******************************************************************************/ -#ifdef ACPI_FUTURE_USAGE  acpi_status  acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,  		       acpi_event_status * event_status) @@ -198,7 +245,6 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,        unlock_and_exit:  	return (status);  } -#endif				/*  ACPI_FUTURE_USAGE  */  /******************************************************************************   *  |