diff options
| author | Alexey Starikovskiy <astarikovskiy@suse.de> | 2008-10-25 13:48:46 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2008-11-11 18:35:42 -0500 |
| commit | 0b7084ac67fb84f0cf2f8bc02d7e0dea8521dd2d (patch) | |
| tree | 0a619ac7a700543e6ba69aa5a568e5678ec0603d /drivers/acpi/events | |
| parent | a2f93aeadf97e870ff385030633a73e21146815d (diff) | |
ACPICA: Use spinlock for acpi_{en|dis}able_gpe
Disabling gpe might interfere with gpe detection/handling,
thus producing "interrupt not handled" errors.
Ironically, disabling of GPE from interrupt context is already
under spinlock, so only userspace needs to start using it.
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/events')
| -rw-r--r-- | drivers/acpi/events/evxfevnt.c | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/drivers/acpi/events/evxfevnt.c b/drivers/acpi/events/evxfevnt.c index 73bfd6bf962f..39db00874a22 100644 --- a/drivers/acpi/events/evxfevnt.c +++ b/drivers/acpi/events/evxfevnt.c | |||
| @@ -248,21 +248,15 @@ ACPI_EXPORT_SYMBOL(acpi_set_gpe_type) | |||
| 248 | * DESCRIPTION: Enable an ACPI event (general purpose) | 248 | * DESCRIPTION: Enable an ACPI event (general purpose) |
| 249 | * | 249 | * |
| 250 | ******************************************************************************/ | 250 | ******************************************************************************/ |
| 251 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | 251 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number) |
| 252 | { | 252 | { |
| 253 | acpi_status status = AE_OK; | 253 | acpi_status status = AE_OK; |
| 254 | acpi_cpu_flags flags; | ||
| 254 | struct acpi_gpe_event_info *gpe_event_info; | 255 | struct acpi_gpe_event_info *gpe_event_info; |
| 255 | 256 | ||
| 256 | ACPI_FUNCTION_TRACE(acpi_enable_gpe); | 257 | ACPI_FUNCTION_TRACE(acpi_enable_gpe); |
| 257 | 258 | ||
| 258 | /* Use semaphore lock if not executing at interrupt level */ | 259 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
| 259 | |||
| 260 | if (flags & ACPI_NOT_ISR) { | ||
| 261 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
| 262 | if (ACPI_FAILURE(status)) { | ||
| 263 | return_ACPI_STATUS(status); | ||
| 264 | } | ||
| 265 | } | ||
| 266 | 260 | ||
| 267 | /* Ensure that we have a valid GPE number */ | 261 | /* Ensure that we have a valid GPE number */ |
| 268 | 262 | ||
| @@ -277,9 +271,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | |||
| 277 | status = acpi_ev_enable_gpe(gpe_event_info, TRUE); | 271 | status = acpi_ev_enable_gpe(gpe_event_info, TRUE); |
| 278 | 272 | ||
| 279 | unlock_and_exit: | 273 | unlock_and_exit: |
| 280 | if (flags & ACPI_NOT_ISR) { | 274 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
| 281 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
| 282 | } | ||
| 283 | return_ACPI_STATUS(status); | 275 | return_ACPI_STATUS(status); |
| 284 | } | 276 | } |
| 285 | 277 | ||
| @@ -299,22 +291,15 @@ ACPI_EXPORT_SYMBOL(acpi_enable_gpe) | |||
| 299 | * DESCRIPTION: Disable an ACPI event (general purpose) | 291 | * DESCRIPTION: Disable an ACPI event (general purpose) |
| 300 | * | 292 | * |
| 301 | ******************************************************************************/ | 293 | ******************************************************************************/ |
| 302 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | 294 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number) |
| 303 | { | 295 | { |
| 304 | acpi_status status = AE_OK; | 296 | acpi_status status = AE_OK; |
| 297 | acpi_cpu_flags flags; | ||
| 305 | struct acpi_gpe_event_info *gpe_event_info; | 298 | struct acpi_gpe_event_info *gpe_event_info; |
| 306 | 299 | ||
| 307 | ACPI_FUNCTION_TRACE(acpi_disable_gpe); | 300 | ACPI_FUNCTION_TRACE(acpi_disable_gpe); |
| 308 | 301 | ||
| 309 | /* Use semaphore lock if not executing at interrupt level */ | 302 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
| 310 | |||
| 311 | if (flags & ACPI_NOT_ISR) { | ||
| 312 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
| 313 | if (ACPI_FAILURE(status)) { | ||
| 314 | return_ACPI_STATUS(status); | ||
| 315 | } | ||
| 316 | } | ||
| 317 | |||
| 318 | /* Ensure that we have a valid GPE number */ | 303 | /* Ensure that we have a valid GPE number */ |
| 319 | 304 | ||
| 320 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); | 305 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); |
| @@ -325,10 +310,8 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | |||
| 325 | 310 | ||
| 326 | status = acpi_ev_disable_gpe(gpe_event_info); | 311 | status = acpi_ev_disable_gpe(gpe_event_info); |
| 327 | 312 | ||
| 328 | unlock_and_exit: | 313 | unlock_and_exit: |
| 329 | if (flags & ACPI_NOT_ISR) { | 314 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
| 330 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
| 331 | } | ||
| 332 | return_ACPI_STATUS(status); | 315 | return_ACPI_STATUS(status); |
| 333 | } | 316 | } |
| 334 | 317 | ||
