diff options
Diffstat (limited to 'drivers/acpi/acpica/hwgpe.c')
-rw-r--r-- | drivers/acpi/acpica/hwgpe.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c index bdecd5e76e87..76b0e350f5bb 100644 --- a/drivers/acpi/acpica/hwgpe.c +++ b/drivers/acpi/acpica/hwgpe.c | |||
@@ -98,7 +98,7 @@ acpi_status | |||
98 | acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) | 98 | acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) |
99 | { | 99 | { |
100 | struct acpi_gpe_register_info *gpe_register_info; | 100 | struct acpi_gpe_register_info *gpe_register_info; |
101 | acpi_status status; | 101 | acpi_status status = AE_OK; |
102 | u32 enable_mask; | 102 | u32 enable_mask; |
103 | u32 register_bit; | 103 | u32 register_bit; |
104 | 104 | ||
@@ -148,9 +148,14 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) | |||
148 | return (AE_BAD_PARAMETER); | 148 | return (AE_BAD_PARAMETER); |
149 | } | 149 | } |
150 | 150 | ||
151 | /* Write the updated enable mask */ | 151 | if (!(register_bit & gpe_register_info->mask_for_run)) { |
152 | 152 | ||
153 | status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address); | 153 | /* Write the updated enable mask */ |
154 | |||
155 | status = | ||
156 | acpi_hw_write(enable_mask, | ||
157 | &gpe_register_info->enable_address); | ||
158 | } | ||
154 | return (status); | 159 | return (status); |
155 | } | 160 | } |
156 | 161 | ||
@@ -242,6 +247,12 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info *gpe_event_info, | |||
242 | local_event_status |= ACPI_EVENT_FLAG_ENABLED; | 247 | local_event_status |= ACPI_EVENT_FLAG_ENABLED; |
243 | } | 248 | } |
244 | 249 | ||
250 | /* GPE currently masked? (masked for runtime?) */ | ||
251 | |||
252 | if (register_bit & gpe_register_info->mask_for_run) { | ||
253 | local_event_status |= ACPI_EVENT_FLAG_MASKED; | ||
254 | } | ||
255 | |||
245 | /* GPE enabled for wake? */ | 256 | /* GPE enabled for wake? */ |
246 | 257 | ||
247 | if (register_bit & gpe_register_info->enable_for_wake) { | 258 | if (register_bit & gpe_register_info->enable_for_wake) { |
@@ -397,6 +408,7 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
397 | u32 i; | 408 | u32 i; |
398 | acpi_status status; | 409 | acpi_status status; |
399 | struct acpi_gpe_register_info *gpe_register_info; | 410 | struct acpi_gpe_register_info *gpe_register_info; |
411 | u8 enable_mask; | ||
400 | 412 | ||
401 | /* NOTE: assumes that all GPEs are currently disabled */ | 413 | /* NOTE: assumes that all GPEs are currently disabled */ |
402 | 414 | ||
@@ -410,9 +422,10 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
410 | 422 | ||
411 | /* Enable all "runtime" GPEs in this register */ | 423 | /* Enable all "runtime" GPEs in this register */ |
412 | 424 | ||
425 | enable_mask = gpe_register_info->enable_for_run & | ||
426 | ~gpe_register_info->mask_for_run; | ||
413 | status = | 427 | status = |
414 | acpi_hw_gpe_enable_write(gpe_register_info->enable_for_run, | 428 | acpi_hw_gpe_enable_write(enable_mask, gpe_register_info); |
415 | gpe_register_info); | ||
416 | if (ACPI_FAILURE(status)) { | 429 | if (ACPI_FAILURE(status)) { |
417 | return (status); | 430 | return (status); |
418 | } | 431 | } |