diff options
| author | Bob Moore <robert.moore@intel.com> | 2006-06-08 16:29:00 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2006-06-14 02:45:47 -0400 |
| commit | 4c90ece249992c7a2e3fc921e5cdb8eb92193067 (patch) | |
| tree | e145ffe472802ef870ba1eaea150b688c19e45ca /drivers/acpi/hardware | |
| parent | 4119532c95547821dbe72d6916dfa1b2148475b3 (diff) | |
ACPI: ACPICA 20060608
Converted the locking mutex used for the ACPI hardware
to a spinlock. This change should eliminate all problems
caused by attempting to acquire a semaphore at interrupt
level, and it means that all ACPICA external interfaces
that directly access the ACPI hardware can be safely
called from interrupt level.
Fixed a regression introduced in 20060526 where the ACPI
device initialization could be prematurely aborted with
an AE_NOT_FOUND if a device did not have an optional
_INI method.
Fixed an IndexField issue where a write to the Data
Register should be limited in size to the AccessSize
(width) of the IndexField itself. (BZ 433, Fiodor Suietov)
Fixed problem reports (Valery Podrezov) integrated: - Allow
store of ThermalZone objects to Debug object.
http://bugzilla.kernel.org/show_bug.cgi?id=5369
http://bugzilla.kernel.org/show_bug.cgi?id=5370
Fixed problem reports (Fiodor Suietov) integrated: -
acpi_get_table_header() doesn't handle multiple instances
correctly (BZ 364)
Removed four global mutexes that were obsolete and were
no longer being used.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/hardware')
| -rw-r--r-- | drivers/acpi/hardware/hwregs.c | 59 |
1 files changed, 19 insertions, 40 deletions
diff --git a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c index 5a3aa8dd8cb7..ae142de19507 100644 --- a/drivers/acpi/hardware/hwregs.c +++ b/drivers/acpi/hardware/hwregs.c | |||
| @@ -61,10 +61,13 @@ ACPI_MODULE_NAME("hwregs") | |||
| 61 | * DESCRIPTION: Clears all fixed and general purpose status bits | 61 | * DESCRIPTION: Clears all fixed and general purpose status bits |
| 62 | * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED | 62 | * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED |
| 63 | * | 63 | * |
| 64 | * NOTE: TBD: Flags parameter is obsolete, to be removed | ||
| 65 | * | ||
| 64 | ******************************************************************************/ | 66 | ******************************************************************************/ |
| 65 | acpi_status acpi_hw_clear_acpi_status(u32 flags) | 67 | acpi_status acpi_hw_clear_acpi_status(u32 flags) |
| 66 | { | 68 | { |
| 67 | acpi_status status; | 69 | acpi_status status; |
| 70 | acpi_cpu_flags lock_flags = 0; | ||
| 68 | 71 | ||
| 69 | ACPI_FUNCTION_TRACE(hw_clear_acpi_status); | 72 | ACPI_FUNCTION_TRACE(hw_clear_acpi_status); |
| 70 | 73 | ||
| @@ -72,12 +75,7 @@ acpi_status acpi_hw_clear_acpi_status(u32 flags) | |||
| 72 | ACPI_BITMASK_ALL_FIXED_STATUS, | 75 | ACPI_BITMASK_ALL_FIXED_STATUS, |
| 73 | (u16) acpi_gbl_FADT->xpm1a_evt_blk.address)); | 76 | (u16) acpi_gbl_FADT->xpm1a_evt_blk.address)); |
| 74 | 77 | ||
| 75 | if (flags & ACPI_MTX_LOCK) { | 78 | lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); |
| 76 | status = acpi_ut_acquire_mutex(ACPI_MTX_HARDWARE); | ||
| 77 | if (ACPI_FAILURE(status)) { | ||
| 78 | return_ACPI_STATUS(status); | ||
| 79 | } | ||
| 80 | } | ||
| 81 | 79 | ||
| 82 | status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, | 80 | status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, |
| 83 | ACPI_REGISTER_PM1_STATUS, | 81 | ACPI_REGISTER_PM1_STATUS, |
| @@ -102,9 +100,7 @@ acpi_status acpi_hw_clear_acpi_status(u32 flags) | |||
| 102 | status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block); | 100 | status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block); |
| 103 | 101 | ||
| 104 | unlock_and_exit: | 102 | unlock_and_exit: |
| 105 | if (flags & ACPI_MTX_LOCK) { | 103 | acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); |
| 106 | (void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE); | ||
| 107 | } | ||
| 108 | return_ACPI_STATUS(status); | 104 | return_ACPI_STATUS(status); |
| 109 | } | 105 | } |
| 110 | 106 | ||
| @@ -264,6 +260,8 @@ struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id) | |||
| 264 | * | 260 | * |
| 265 | * DESCRIPTION: ACPI bit_register read function. | 261 | * DESCRIPTION: ACPI bit_register read function. |
| 266 | * | 262 | * |
| 263 | * NOTE: TBD: Flags parameter is obsolete, to be removed | ||
| 264 | * | ||
| 267 | ******************************************************************************/ | 265 | ******************************************************************************/ |
| 268 | 266 | ||
| 269 | acpi_status acpi_get_register(u32 register_id, u32 * return_value, u32 flags) | 267 | acpi_status acpi_get_register(u32 register_id, u32 * return_value, u32 flags) |
| @@ -281,23 +279,12 @@ acpi_status acpi_get_register(u32 register_id, u32 * return_value, u32 flags) | |||
| 281 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 279 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 282 | } | 280 | } |
| 283 | 281 | ||
| 284 | if (flags & ACPI_MTX_LOCK) { | ||
| 285 | status = acpi_ut_acquire_mutex(ACPI_MTX_HARDWARE); | ||
| 286 | if (ACPI_FAILURE(status)) { | ||
| 287 | return_ACPI_STATUS(status); | ||
| 288 | } | ||
| 289 | } | ||
| 290 | |||
| 291 | /* Read from the register */ | 282 | /* Read from the register */ |
| 292 | 283 | ||
| 293 | status = acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK, | 284 | status = acpi_hw_register_read(ACPI_MTX_LOCK, |
| 294 | bit_reg_info->parent_register, | 285 | bit_reg_info->parent_register, |
| 295 | ®ister_value); | 286 | ®ister_value); |
| 296 | 287 | ||
| 297 | if (flags & ACPI_MTX_LOCK) { | ||
| 298 | (void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE); | ||
| 299 | } | ||
| 300 | |||
| 301 | if (ACPI_SUCCESS(status)) { | 288 | if (ACPI_SUCCESS(status)) { |
| 302 | 289 | ||
| 303 | /* Normalize the value that was read */ | 290 | /* Normalize the value that was read */ |
| @@ -331,12 +318,15 @@ ACPI_EXPORT_SYMBOL(acpi_get_register) | |||
| 331 | * | 318 | * |
| 332 | * DESCRIPTION: ACPI Bit Register write function. | 319 | * DESCRIPTION: ACPI Bit Register write function. |
| 333 | * | 320 | * |
| 321 | * NOTE: TBD: Flags parameter is obsolete, to be removed | ||
| 322 | * | ||
| 334 | ******************************************************************************/ | 323 | ******************************************************************************/ |
| 335 | acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags) | 324 | acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags) |
| 336 | { | 325 | { |
| 337 | u32 register_value = 0; | 326 | u32 register_value = 0; |
| 338 | struct acpi_bit_register_info *bit_reg_info; | 327 | struct acpi_bit_register_info *bit_reg_info; |
| 339 | acpi_status status; | 328 | acpi_status status; |
| 329 | acpi_cpu_flags lock_flags; | ||
| 340 | 330 | ||
| 341 | ACPI_FUNCTION_TRACE_U32(acpi_set_register, register_id); | 331 | ACPI_FUNCTION_TRACE_U32(acpi_set_register, register_id); |
| 342 | 332 | ||
| @@ -349,12 +339,7 @@ acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags) | |||
| 349 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 339 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 350 | } | 340 | } |
| 351 | 341 | ||
| 352 | if (flags & ACPI_MTX_LOCK) { | 342 | lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); |
| 353 | status = acpi_ut_acquire_mutex(ACPI_MTX_HARDWARE); | ||
| 354 | if (ACPI_FAILURE(status)) { | ||
| 355 | return_ACPI_STATUS(status); | ||
| 356 | } | ||
| 357 | } | ||
| 358 | 343 | ||
| 359 | /* Always do a register read first so we can insert the new bits */ | 344 | /* Always do a register read first so we can insert the new bits */ |
| 360 | 345 | ||
| @@ -462,9 +447,7 @@ acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags) | |||
| 462 | 447 | ||
| 463 | unlock_and_exit: | 448 | unlock_and_exit: |
| 464 | 449 | ||
| 465 | if (flags & ACPI_MTX_LOCK) { | 450 | acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); |
| 466 | (void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE); | ||
| 467 | } | ||
| 468 | 451 | ||
| 469 | /* Normalize the value that was read */ | 452 | /* Normalize the value that was read */ |
| 470 | 453 | ||
| @@ -500,14 +483,12 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value) | |||
| 500 | u32 value1 = 0; | 483 | u32 value1 = 0; |
| 501 | u32 value2 = 0; | 484 | u32 value2 = 0; |
| 502 | acpi_status status; | 485 | acpi_status status; |
| 486 | acpi_cpu_flags lock_flags = 0; | ||
| 503 | 487 | ||
| 504 | ACPI_FUNCTION_TRACE(hw_register_read); | 488 | ACPI_FUNCTION_TRACE(hw_register_read); |
| 505 | 489 | ||
| 506 | if (ACPI_MTX_LOCK == use_lock) { | 490 | if (ACPI_MTX_LOCK == use_lock) { |
| 507 | status = acpi_ut_acquire_mutex(ACPI_MTX_HARDWARE); | 491 | lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); |
| 508 | if (ACPI_FAILURE(status)) { | ||
| 509 | return_ACPI_STATUS(status); | ||
| 510 | } | ||
| 511 | } | 492 | } |
| 512 | 493 | ||
| 513 | switch (register_id) { | 494 | switch (register_id) { |
| @@ -585,7 +566,7 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value) | |||
| 585 | 566 | ||
| 586 | unlock_and_exit: | 567 | unlock_and_exit: |
| 587 | if (ACPI_MTX_LOCK == use_lock) { | 568 | if (ACPI_MTX_LOCK == use_lock) { |
| 588 | (void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE); | 569 | acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); |
| 589 | } | 570 | } |
| 590 | 571 | ||
| 591 | if (ACPI_SUCCESS(status)) { | 572 | if (ACPI_SUCCESS(status)) { |
| @@ -613,14 +594,12 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value) | |||
| 613 | acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value) | 594 | acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value) |
| 614 | { | 595 | { |
| 615 | acpi_status status; | 596 | acpi_status status; |
| 597 | acpi_cpu_flags lock_flags = 0; | ||
| 616 | 598 | ||
| 617 | ACPI_FUNCTION_TRACE(hw_register_write); | 599 | ACPI_FUNCTION_TRACE(hw_register_write); |
| 618 | 600 | ||
| 619 | if (ACPI_MTX_LOCK == use_lock) { | 601 | if (ACPI_MTX_LOCK == use_lock) { |
| 620 | status = acpi_ut_acquire_mutex(ACPI_MTX_HARDWARE); | 602 | lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); |
| 621 | if (ACPI_FAILURE(status)) { | ||
| 622 | return_ACPI_STATUS(status); | ||
| 623 | } | ||
| 624 | } | 603 | } |
| 625 | 604 | ||
| 626 | switch (register_id) { | 605 | switch (register_id) { |
| @@ -710,7 +689,7 @@ acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value) | |||
| 710 | 689 | ||
| 711 | unlock_and_exit: | 690 | unlock_and_exit: |
| 712 | if (ACPI_MTX_LOCK == use_lock) { | 691 | if (ACPI_MTX_LOCK == use_lock) { |
| 713 | (void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE); | 692 | acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); |
| 714 | } | 693 | } |
| 715 | 694 | ||
| 716 | return_ACPI_STATUS(status); | 695 | return_ACPI_STATUS(status); |
