aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/evgpeblk.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/acpica/evgpeblk.c')
-rw-r--r--drivers/acpi/acpica/evgpeblk.c47
1 files changed, 21 insertions, 26 deletions
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c
index 85445fb5844e..020add3eee1c 100644
--- a/drivers/acpi/acpica/evgpeblk.c
+++ b/drivers/acpi/acpica/evgpeblk.c
@@ -363,6 +363,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
363 gpe_block->gpe_count = (u16)(register_count * ACPI_GPE_REGISTER_WIDTH); 363 gpe_block->gpe_count = (u16)(register_count * ACPI_GPE_REGISTER_WIDTH);
364 gpe_block->register_count = register_count; 364 gpe_block->register_count = register_count;
365 gpe_block->block_base_number = gpe_block_base_number; 365 gpe_block->block_base_number = gpe_block_base_number;
366 gpe_block->initialized = FALSE;
366 367
367 ACPI_MEMCPY(&gpe_block->block_address, gpe_block_address, 368 ACPI_MEMCPY(&gpe_block->block_address, gpe_block_address,
368 sizeof(struct acpi_generic_address)); 369 sizeof(struct acpi_generic_address));
@@ -385,11 +386,12 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
385 return_ACPI_STATUS(status); 386 return_ACPI_STATUS(status);
386 } 387 }
387 388
389 acpi_all_gpes_initialized = FALSE;
390
388 /* Find all GPE methods (_Lxx or_Exx) for this block */ 391 /* Find all GPE methods (_Lxx or_Exx) for this block */
389 392
390 walk_info.gpe_block = gpe_block; 393 walk_info.gpe_block = gpe_block;
391 walk_info.gpe_device = gpe_device; 394 walk_info.gpe_device = gpe_device;
392 walk_info.enable_this_gpe = FALSE;
393 walk_info.execute_by_owner_id = FALSE; 395 walk_info.execute_by_owner_id = FALSE;
394 396
395 status = acpi_ns_walk_namespace(ACPI_TYPE_METHOD, gpe_device, 397 status = acpi_ns_walk_namespace(ACPI_TYPE_METHOD, gpe_device,
@@ -434,35 +436,34 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
434 ******************************************************************************/ 436 ******************************************************************************/
435 437
436acpi_status 438acpi_status
437acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, 439acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
438 struct acpi_gpe_block_info *gpe_block) 440 struct acpi_gpe_block_info *gpe_block,
441 void *ignored)
439{ 442{
440 acpi_status status; 443 acpi_status status;
441 struct acpi_gpe_event_info *gpe_event_info; 444 struct acpi_gpe_event_info *gpe_event_info;
442 u32 gpe_enabled_count; 445 u32 gpe_enabled_count;
443 u32 gpe_index; 446 u32 gpe_index;
444 u32 gpe_number;
445 u32 i; 447 u32 i;
446 u32 j; 448 u32 j;
447 449
448 ACPI_FUNCTION_TRACE(ev_initialize_gpe_block); 450 ACPI_FUNCTION_TRACE(ev_initialize_gpe_block);
449 451
450 /* Ignore a null GPE block (e.g., if no GPE block 1 exists) */ 452 /*
451 453 * Ignore a null GPE block (e.g., if no GPE block 1 exists) and
452 if (!gpe_block) { 454 * GPE blocks that have been initialized already.
455 */
456 if (!gpe_block || gpe_block->initialized) {
453 return_ACPI_STATUS(AE_OK); 457 return_ACPI_STATUS(AE_OK);
454 } 458 }
455 459
456 /* 460 /*
457 * Enable all GPEs that have a corresponding method. Any other GPEs 461 * Enable all GPEs that have a corresponding method and have the
458 * within this block must be enabled via the acpi_enable_gpe interface. 462 * ACPI_GPE_CAN_WAKE flag unset. Any other GPEs within this block must
463 * be enabled via the acpi_enable_gpe() interface.
459 */ 464 */
460 gpe_enabled_count = 0; 465 gpe_enabled_count = 0;
461 466
462 if (gpe_device == acpi_gbl_fadt_gpe_device) {
463 gpe_device = NULL;
464 }
465
466 for (i = 0; i < gpe_block->register_count; i++) { 467 for (i = 0; i < gpe_block->register_count; i++) {
467 for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { 468 for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
468 469
@@ -470,27 +471,19 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
470 471
471 gpe_index = (i * ACPI_GPE_REGISTER_WIDTH) + j; 472 gpe_index = (i * ACPI_GPE_REGISTER_WIDTH) + j;
472 gpe_event_info = &gpe_block->event_info[gpe_index]; 473 gpe_event_info = &gpe_block->event_info[gpe_index];
473 gpe_number = gpe_index + gpe_block->block_base_number;
474 474
475 /* Ignore GPEs that have no corresponding _Lxx/_Exx method */ 475 /* Ignore GPEs that have no corresponding _Lxx/_Exx method */
476 476
477 if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD)) { 477 if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD)
478 || (gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) {
478 continue; 479 continue;
479 } 480 }
480 481
481 /* 482 status = acpi_raw_enable_gpe(gpe_event_info);
482 * If the GPE has already been enabled for runtime
483 * signaling, make sure it remains enabled, but do not
484 * increment its reference counter.
485 */
486 status = gpe_event_info->runtime_count ?
487 acpi_ev_enable_gpe(gpe_event_info) :
488 acpi_enable_gpe(gpe_device, gpe_number);
489
490 if (ACPI_FAILURE(status)) { 483 if (ACPI_FAILURE(status)) {
491 ACPI_EXCEPTION((AE_INFO, status, 484 ACPI_EXCEPTION((AE_INFO, status,
492 "Could not enable GPE 0x%02X", 485 "Could not enable GPE 0x%02X",
493 gpe_number)); 486 gpe_index + gpe_block->block_base_number));
494 continue; 487 continue;
495 } 488 }
496 489
@@ -504,5 +497,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
504 gpe_enabled_count)); 497 gpe_enabled_count));
505 } 498 }
506 499
500 gpe_block->initialized = TRUE;
501
507 return_ACPI_STATUS(AE_OK); 502 return_ACPI_STATUS(AE_OK);
508} 503}