aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/events/evgpeblk.c25
-rw-r--r--drivers/acpi/events/evmisc.c4
-rw-r--r--drivers/acpi/events/evxfevnt.c93
-rw-r--r--drivers/acpi/hardware/hwgpe.c26
-rw-r--r--drivers/acpi/hardware/hwregs.c2
-rw-r--r--drivers/acpi/system.c63
-rw-r--r--drivers/acpi/utilities/utglobal.c6
-rw-r--r--include/acpi/acevents.h6
-rw-r--r--include/acpi/acglobal.h1
-rw-r--r--include/acpi/achware.h7
-rw-r--r--include/acpi/aclocal.h13
-rw-r--r--include/acpi/acpixf.h2
12 files changed, 156 insertions, 92 deletions
diff --git a/drivers/acpi/events/evgpeblk.c b/drivers/acpi/events/evgpeblk.c
index 7537cda54050..2872be2b9be5 100644
--- a/drivers/acpi/events/evgpeblk.c
+++ b/drivers/acpi/events/evgpeblk.c
@@ -124,6 +124,7 @@ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info)
124 * FUNCTION: acpi_ev_walk_gpe_list 124 * FUNCTION: acpi_ev_walk_gpe_list
125 * 125 *
126 * PARAMETERS: gpe_walk_callback - Routine called for each GPE block 126 * PARAMETERS: gpe_walk_callback - Routine called for each GPE block
127 * Context - Value passed to callback
127 * 128 *
128 * RETURN: Status 129 * RETURN: Status
129 * 130 *
@@ -131,7 +132,8 @@ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info)
131 * 132 *
132 ******************************************************************************/ 133 ******************************************************************************/
133 134
134acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback) 135acpi_status
136acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context)
135{ 137{
136 struct acpi_gpe_block_info *gpe_block; 138 struct acpi_gpe_block_info *gpe_block;
137 struct acpi_gpe_xrupt_info *gpe_xrupt_info; 139 struct acpi_gpe_xrupt_info *gpe_xrupt_info;
@@ -154,8 +156,13 @@ acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback)
154 156
155 /* One callback per GPE block */ 157 /* One callback per GPE block */
156 158
157 status = gpe_walk_callback(gpe_xrupt_info, gpe_block); 159 status =
160 gpe_walk_callback(gpe_xrupt_info, gpe_block,
161 context);
158 if (ACPI_FAILURE(status)) { 162 if (ACPI_FAILURE(status)) {
163 if (status == AE_CTRL_END) { /* Callback abort */
164 status = AE_OK;
165 }
159 goto unlock_and_exit; 166 goto unlock_and_exit;
160 } 167 }
161 168
@@ -186,7 +193,8 @@ acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback)
186 193
187acpi_status 194acpi_status
188acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 195acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
189 struct acpi_gpe_block_info *gpe_block) 196 struct acpi_gpe_block_info *gpe_block,
197 void *context)
190{ 198{
191 struct acpi_gpe_event_info *gpe_event_info; 199 struct acpi_gpe_event_info *gpe_event_info;
192 u32 i; 200 u32 i;
@@ -690,7 +698,8 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
690 698
691 /* Disable all GPEs in this block */ 699 /* Disable all GPEs in this block */
692 700
693 status = acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block); 701 status =
702 acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block, NULL);
694 703
695 if (!gpe_block->previous && !gpe_block->next) { 704 if (!gpe_block->previous && !gpe_block->next) {
696 705
@@ -717,6 +726,9 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
717 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 726 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
718 } 727 }
719 728
729 acpi_current_gpe_count -=
730 gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH;
731
720 /* Free the gpe_block */ 732 /* Free the gpe_block */
721 733
722 ACPI_FREE(gpe_block->register_info); 734 ACPI_FREE(gpe_block->register_info);
@@ -958,6 +970,9 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
958 gpe_device->name.ascii, gpe_block->register_count, 970 gpe_device->name.ascii, gpe_block->register_count,
959 interrupt_number)); 971 interrupt_number));
960 972
973 /* Update global count of currently available GPEs */
974
975 acpi_current_gpe_count += register_count * ACPI_GPE_REGISTER_WIDTH;
961 return_ACPI_STATUS(AE_OK); 976 return_ACPI_STATUS(AE_OK);
962} 977}
963 978
@@ -1057,7 +1072,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
1057 1072
1058 /* Enable all valid runtime GPEs found above */ 1073 /* Enable all valid runtime GPEs found above */
1059 1074
1060 status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block); 1075 status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block, NULL);
1061 if (ACPI_FAILURE(status)) { 1076 if (ACPI_FAILURE(status)) {
1062 ACPI_ERROR((AE_INFO, "Could not enable GPEs in GpeBlock %p", 1077 ACPI_ERROR((AE_INFO, "Could not enable GPEs in GpeBlock %p",
1063 gpe_block)); 1078 gpe_block));
diff --git a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c
index dbac5b3248a0..d807158c6401 100644
--- a/drivers/acpi/events/evmisc.c
+++ b/drivers/acpi/events/evmisc.c
@@ -588,7 +588,7 @@ void acpi_ev_terminate(void)
588 588
589 /* Disable all GPEs in all GPE blocks */ 589 /* Disable all GPEs in all GPE blocks */
590 590
591 status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block); 591 status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block, NULL);
592 592
593 /* Remove SCI handler */ 593 /* Remove SCI handler */
594 594
@@ -606,7 +606,7 @@ void acpi_ev_terminate(void)
606 606
607 /* Deallocate all handler objects installed within GPE info structs */ 607 /* Deallocate all handler objects installed within GPE info structs */
608 608
609 status = acpi_ev_walk_gpe_list(acpi_ev_delete_gpe_handlers); 609 status = acpi_ev_walk_gpe_list(acpi_ev_delete_gpe_handlers, NULL);
610 610
611 /* Return to original mode if necessary */ 611 /* Return to original mode if necessary */
612 612
diff --git a/drivers/acpi/events/evxfevnt.c b/drivers/acpi/events/evxfevnt.c
index 669b8ca4984b..aa4dec8edfc5 100644
--- a/drivers/acpi/events/evxfevnt.c
+++ b/drivers/acpi/events/evxfevnt.c
@@ -49,6 +49,11 @@
49#define _COMPONENT ACPI_EVENTS 49#define _COMPONENT ACPI_EVENTS
50ACPI_MODULE_NAME("evxfevnt") 50ACPI_MODULE_NAME("evxfevnt")
51 51
52/* Local prototypes */
53acpi_status
54acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
55 struct acpi_gpe_block_info *gpe_block, void *context);
56
52/******************************************************************************* 57/*******************************************************************************
53 * 58 *
54 * FUNCTION: acpi_enable 59 * FUNCTION: acpi_enable
@@ -60,6 +65,7 @@ ACPI_MODULE_NAME("evxfevnt")
60 * DESCRIPTION: Transfers the system into ACPI mode. 65 * DESCRIPTION: Transfers the system into ACPI mode.
61 * 66 *
62 ******************************************************************************/ 67 ******************************************************************************/
68
63acpi_status acpi_enable(void) 69acpi_status acpi_enable(void)
64{ 70{
65 acpi_status status = AE_OK; 71 acpi_status status = AE_OK;
@@ -717,3 +723,90 @@ acpi_status acpi_remove_gpe_block(acpi_handle gpe_device)
717} 723}
718 724
719ACPI_EXPORT_SYMBOL(acpi_remove_gpe_block) 725ACPI_EXPORT_SYMBOL(acpi_remove_gpe_block)
726
727/*******************************************************************************
728 *
729 * FUNCTION: acpi_get_gpe_device
730 *
731 * PARAMETERS: Index - System GPE index (0-current_gpe_count)
732 * gpe_device - Where the parent GPE Device is returned
733 *
734 * RETURN: Status
735 *
736 * DESCRIPTION: Obtain the GPE device associated with the input index. A NULL
737 * gpe device indicates that the gpe number is contained in one of
738 * the FADT-defined gpe blocks. Otherwise, the GPE block device.
739 *
740 ******************************************************************************/
741acpi_status
742acpi_get_gpe_device(u32 index, acpi_handle *gpe_device)
743{
744 struct acpi_gpe_device_info info;
745 acpi_status status;
746
747 ACPI_FUNCTION_TRACE(acpi_get_gpe_device);
748
749 if (!gpe_device) {
750 return_ACPI_STATUS(AE_BAD_PARAMETER);
751 }
752
753 if (index >= acpi_current_gpe_count) {
754 return_ACPI_STATUS(AE_NOT_EXIST);
755 }
756
757 /* Setup and walk the GPE list */
758
759 info.index = index;
760 info.status = AE_NOT_EXIST;
761 info.gpe_device = NULL;
762 info.next_block_base_index = 0;
763
764 status = acpi_ev_walk_gpe_list(acpi_ev_get_gpe_device, &info);
765 if (ACPI_FAILURE(status)) {
766 return_ACPI_STATUS(status);
767 }
768
769 *gpe_device = info.gpe_device;
770 return_ACPI_STATUS(info.status);
771}
772
773ACPI_EXPORT_SYMBOL(acpi_get_gpe_device)
774
775/*******************************************************************************
776 *
777 * FUNCTION: acpi_ev_get_gpe_device
778 *
779 * PARAMETERS: GPE_WALK_CALLBACK
780 *
781 * RETURN: Status
782 *
783 * DESCRIPTION: Matches the input GPE index (0-current_gpe_count) with a GPE
784 * block device. NULL if the GPE is one of the FADT-defined GPEs.
785 *
786 ******************************************************************************/
787acpi_status
788acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
789 struct acpi_gpe_block_info *gpe_block, void *context)
790{
791 struct acpi_gpe_device_info *info = context;
792
793 /* Increment Index by the number of GPEs in this block */
794
795 info->next_block_base_index +=
796 (gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH);
797
798 if (info->index < info->next_block_base_index) {
799 /*
800 * The GPE index is within this block, get the node. Leave the node
801 * NULL for the FADT-defined GPEs
802 */
803 if ((gpe_block->node)->type == ACPI_TYPE_DEVICE) {
804 info->gpe_device = gpe_block->node;
805 }
806
807 info->status = AE_OK;
808 return (AE_CTRL_END);
809 }
810
811 return (AE_OK);
812}
diff --git a/drivers/acpi/hardware/hwgpe.c b/drivers/acpi/hardware/hwgpe.c
index 0b80db9d9197..5ab7cac6fbb9 100644
--- a/drivers/acpi/hardware/hwgpe.c
+++ b/drivers/acpi/hardware/hwgpe.c
@@ -51,7 +51,8 @@ ACPI_MODULE_NAME("hwgpe")
51/* Local prototypes */ 51/* Local prototypes */
52static acpi_status 52static acpi_status
53acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 53acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
54 struct acpi_gpe_block_info *gpe_block); 54 struct acpi_gpe_block_info *gpe_block,
55 void *context);
55 56
56/****************************************************************************** 57/******************************************************************************
57 * 58 *
@@ -260,8 +261,8 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
260 ******************************************************************************/ 261 ******************************************************************************/
261 262
262acpi_status 263acpi_status
263acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info, 264acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
264 struct acpi_gpe_block_info * gpe_block) 265 struct acpi_gpe_block_info *gpe_block, void *context)
265{ 266{
266 u32 i; 267 u32 i;
267 acpi_status status; 268 acpi_status status;
@@ -297,8 +298,8 @@ acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
297 ******************************************************************************/ 298 ******************************************************************************/
298 299
299acpi_status 300acpi_status
300acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info, 301acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
301 struct acpi_gpe_block_info * gpe_block) 302 struct acpi_gpe_block_info *gpe_block, void *context)
302{ 303{
303 u32 i; 304 u32 i;
304 acpi_status status; 305 acpi_status status;
@@ -335,8 +336,8 @@ acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
335 ******************************************************************************/ 336 ******************************************************************************/
336 337
337acpi_status 338acpi_status
338acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info, 339acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
339 struct acpi_gpe_block_info * gpe_block) 340 struct acpi_gpe_block_info *gpe_block, void *context)
340{ 341{
341 u32 i; 342 u32 i;
342 acpi_status status; 343 acpi_status status;
@@ -382,7 +383,8 @@ acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info * gpe_xrupt_info,
382 383
383static acpi_status 384static acpi_status
384acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 385acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
385 struct acpi_gpe_block_info *gpe_block) 386 struct acpi_gpe_block_info *gpe_block,
387 void *context)
386{ 388{
387 u32 i; 389 u32 i;
388 acpi_status status; 390 acpi_status status;
@@ -427,8 +429,8 @@ acpi_status acpi_hw_disable_all_gpes(void)
427 429
428 ACPI_FUNCTION_TRACE(hw_disable_all_gpes); 430 ACPI_FUNCTION_TRACE(hw_disable_all_gpes);
429 431
430 status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block); 432 status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block, NULL);
431 status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block); 433 status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block, NULL);
432 return_ACPI_STATUS(status); 434 return_ACPI_STATUS(status);
433} 435}
434 436
@@ -450,7 +452,7 @@ acpi_status acpi_hw_enable_all_runtime_gpes(void)
450 452
451 ACPI_FUNCTION_TRACE(hw_enable_all_runtime_gpes); 453 ACPI_FUNCTION_TRACE(hw_enable_all_runtime_gpes);
452 454
453 status = acpi_ev_walk_gpe_list(acpi_hw_enable_runtime_gpe_block); 455 status = acpi_ev_walk_gpe_list(acpi_hw_enable_runtime_gpe_block, NULL);
454 return_ACPI_STATUS(status); 456 return_ACPI_STATUS(status);
455} 457}
456 458
@@ -472,6 +474,6 @@ acpi_status acpi_hw_enable_all_wakeup_gpes(void)
472 474
473 ACPI_FUNCTION_TRACE(hw_enable_all_wakeup_gpes); 475 ACPI_FUNCTION_TRACE(hw_enable_all_wakeup_gpes);
474 476
475 status = acpi_ev_walk_gpe_list(acpi_hw_enable_wakeup_gpe_block); 477 status = acpi_ev_walk_gpe_list(acpi_hw_enable_wakeup_gpe_block, NULL);
476 return_ACPI_STATUS(status); 478 return_ACPI_STATUS(status);
477} 479}
diff --git a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c
index ddf792adcf96..69dc8b45d76c 100644
--- a/drivers/acpi/hardware/hwregs.c
+++ b/drivers/acpi/hardware/hwregs.c
@@ -94,7 +94,7 @@ acpi_status acpi_hw_clear_acpi_status(void)
94 94
95 /* Clear the GPE Bits in all GPE registers in all GPE blocks */ 95 /* Clear the GPE Bits in all GPE registers in all GPE blocks */
96 96
97 status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block); 97 status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block, NULL);
98 98
99 unlock_and_exit: 99 unlock_and_exit:
100 acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); 100 acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags);
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
index 6e4107f82403..391d0358a592 100644
--- a/drivers/acpi/system.c
+++ b/drivers/acpi/system.c
@@ -192,65 +192,6 @@ static struct attribute_group interrupt_stats_attr_group = {
192}; 192};
193static struct kobj_attribute *counter_attrs; 193static struct kobj_attribute *counter_attrs;
194 194
195static int count_num_gpes(void)
196{
197 int count = 0;
198 struct acpi_gpe_xrupt_info *gpe_xrupt_info;
199 struct acpi_gpe_block_info *gpe_block;
200 acpi_cpu_flags flags;
201
202 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
203
204 gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
205 while (gpe_xrupt_info) {
206 gpe_block = gpe_xrupt_info->gpe_block_list_head;
207 while (gpe_block) {
208 count += gpe_block->register_count *
209 ACPI_GPE_REGISTER_WIDTH;
210 gpe_block = gpe_block->next;
211 }
212 gpe_xrupt_info = gpe_xrupt_info->next;
213 }
214 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
215
216 return count;
217}
218
219static int get_gpe_device(int index, acpi_handle *handle)
220{
221 struct acpi_gpe_xrupt_info *gpe_xrupt_info;
222 struct acpi_gpe_block_info *gpe_block;
223 acpi_cpu_flags flags;
224 struct acpi_namespace_node *node;
225
226 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
227
228 gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
229 while (gpe_xrupt_info) {
230 gpe_block = gpe_xrupt_info->gpe_block_list_head;
231 node = gpe_block->node;
232 while (gpe_block) {
233 index -= gpe_block->register_count *
234 ACPI_GPE_REGISTER_WIDTH;
235 if (index < 0) {
236 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
237 /* return NULL if it's FADT GPE */
238 if (node->type != ACPI_TYPE_DEVICE)
239 *handle = NULL;
240 else
241 *handle = node;
242 return 0;
243 }
244 node = gpe_block->node;
245 gpe_block = gpe_block->next;
246 }
247 gpe_xrupt_info = gpe_xrupt_info->next;
248 }
249 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
250
251 return -ENODEV;
252}
253
254static void delete_gpe_attr_array(void) 195static void delete_gpe_attr_array(void)
255{ 196{
256 struct event_counter *tmp = all_counters; 197 struct event_counter *tmp = all_counters;
@@ -309,7 +250,7 @@ static int get_status(u32 index, acpi_event_status *status, acpi_handle *handle)
309 goto end; 250 goto end;
310 251
311 if (index < num_gpes) { 252 if (index < num_gpes) {
312 result = get_gpe_device(index, handle); 253 result = acpi_get_gpe_device(index, handle);
313 if (result) { 254 if (result) {
314 ACPI_EXCEPTION((AE_INFO, AE_NOT_FOUND, 255 ACPI_EXCEPTION((AE_INFO, AE_NOT_FOUND,
315 "Invalid GPE 0x%x\n", index)); 256 "Invalid GPE 0x%x\n", index));
@@ -436,7 +377,7 @@ void acpi_irq_stats_init(void)
436 if (all_counters) 377 if (all_counters)
437 return; 378 return;
438 379
439 num_gpes = count_num_gpes(); 380 num_gpes = acpi_current_gpe_count;
440 num_counters = num_gpes + ACPI_NUM_FIXED_EVENTS + NUM_COUNTERS_EXTRA; 381 num_counters = num_gpes + ACPI_NUM_FIXED_EVENTS + NUM_COUNTERS_EXTRA;
441 382
442 all_attrs = kzalloc(sizeof(struct attribute *) * (num_counters + 1), 383 all_attrs = kzalloc(sizeof(struct attribute *) * (num_counters + 1),
diff --git a/drivers/acpi/utilities/utglobal.c b/drivers/acpi/utilities/utglobal.c
index 211d621f42a9..06112bf976dc 100644
--- a/drivers/acpi/utilities/utglobal.c
+++ b/drivers/acpi/utilities/utglobal.c
@@ -46,9 +46,8 @@
46#include <acpi/acpi.h> 46#include <acpi/acpi.h>
47#include <acpi/acnamesp.h> 47#include <acpi/acnamesp.h>
48 48
49ACPI_EXPORT_SYMBOL(acpi_gbl_FADT)
50#define _COMPONENT ACPI_UTILITIES 49#define _COMPONENT ACPI_UTILITIES
51 ACPI_MODULE_NAME("utglobal") 50ACPI_MODULE_NAME("utglobal")
52 51
53/******************************************************************************* 52/*******************************************************************************
54 * 53 *
@@ -756,6 +755,7 @@ acpi_status acpi_ut_init_globals(void)
756 acpi_gbl_gpe_xrupt_list_head = NULL; 755 acpi_gbl_gpe_xrupt_list_head = NULL;
757 acpi_gbl_gpe_fadt_blocks[0] = NULL; 756 acpi_gbl_gpe_fadt_blocks[0] = NULL;
758 acpi_gbl_gpe_fadt_blocks[1] = NULL; 757 acpi_gbl_gpe_fadt_blocks[1] = NULL;
758 acpi_current_gpe_count = 0;
759 759
760 /* Global handlers */ 760 /* Global handlers */
761 761
@@ -816,5 +816,7 @@ acpi_status acpi_ut_init_globals(void)
816 return_ACPI_STATUS(AE_OK); 816 return_ACPI_STATUS(AE_OK);
817} 817}
818 818
819ACPI_EXPORT_SYMBOL(acpi_gbl_FADT)
819ACPI_EXPORT_SYMBOL(acpi_dbg_level) 820ACPI_EXPORT_SYMBOL(acpi_dbg_level)
820ACPI_EXPORT_SYMBOL(acpi_dbg_layer) 821ACPI_EXPORT_SYMBOL(acpi_dbg_layer)
822ACPI_EXPORT_SYMBOL(acpi_current_gpe_count)
diff --git a/include/acpi/acevents.h b/include/acpi/acevents.h
index d5d099bf349c..07e20135f01b 100644
--- a/include/acpi/acevents.h
+++ b/include/acpi/acevents.h
@@ -93,11 +93,13 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
93 */ 93 */
94u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info); 94u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info);
95 95
96acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback); 96acpi_status
97acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context);
97 98
98acpi_status 99acpi_status
99acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 100acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
100 struct acpi_gpe_block_info *gpe_block); 101 struct acpi_gpe_block_info *gpe_block,
102 void *context);
101 103
102acpi_status 104acpi_status
103acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, 105acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
diff --git a/include/acpi/acglobal.h b/include/acpi/acglobal.h
index 90cc82067c72..78f3c149f7ba 100644
--- a/include/acpi/acglobal.h
+++ b/include/acpi/acglobal.h
@@ -326,6 +326,7 @@ ACPI_EXTERN struct acpi_fixed_event_handler
326ACPI_EXTERN struct acpi_gpe_xrupt_info *acpi_gbl_gpe_xrupt_list_head; 326ACPI_EXTERN struct acpi_gpe_xrupt_info *acpi_gbl_gpe_xrupt_list_head;
327ACPI_EXTERN struct acpi_gpe_block_info 327ACPI_EXTERN struct acpi_gpe_block_info
328*acpi_gbl_gpe_fadt_blocks[ACPI_MAX_GPE_BLOCKS]; 328*acpi_gbl_gpe_fadt_blocks[ACPI_MAX_GPE_BLOCKS];
329ACPI_EXTERN u32 acpi_current_gpe_count;
329 330
330/***************************************************************************** 331/*****************************************************************************
331 * 332 *
diff --git a/include/acpi/achware.h b/include/acpi/achware.h
index 97a72b193276..960f8162ecfe 100644
--- a/include/acpi/achware.h
+++ b/include/acpi/achware.h
@@ -94,13 +94,13 @@ acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info);
94 94
95acpi_status 95acpi_status
96acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 96acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
97 struct acpi_gpe_block_info *gpe_block); 97 struct acpi_gpe_block_info *gpe_block, void *context);
98 98
99acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info *gpe_event_info); 99acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info *gpe_event_info);
100 100
101acpi_status 101acpi_status
102acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 102acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
103 struct acpi_gpe_block_info *gpe_block); 103 struct acpi_gpe_block_info *gpe_block, void *context);
104 104
105acpi_status 105acpi_status
106acpi_hw_get_gpe_status(struct acpi_gpe_event_info *gpe_event_info, 106acpi_hw_get_gpe_status(struct acpi_gpe_event_info *gpe_event_info,
@@ -114,7 +114,8 @@ acpi_status acpi_hw_enable_all_wakeup_gpes(void);
114 114
115acpi_status 115acpi_status
116acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 116acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
117 struct acpi_gpe_block_info *gpe_block); 117 struct acpi_gpe_block_info *gpe_block,
118 void *context);
118 119
119#ifdef ACPI_FUTURE_USAGE 120#ifdef ACPI_FUTURE_USAGE
120/* 121/*
diff --git a/include/acpi/aclocal.h b/include/acpi/aclocal.h
index 0323fa9aa3e6..b43496080fdf 100644
--- a/include/acpi/aclocal.h
+++ b/include/acpi/aclocal.h
@@ -487,10 +487,15 @@ struct acpi_gpe_walk_info {
487 struct acpi_gpe_block_info *gpe_block; 487 struct acpi_gpe_block_info *gpe_block;
488}; 488};
489 489
490typedef acpi_status(*acpi_gpe_callback) (struct acpi_gpe_xrupt_info * 490struct acpi_gpe_device_info {
491 gpe_xrupt_info, 491 u32 index;
492 struct acpi_gpe_block_info * 492 u32 next_block_base_index;
493 gpe_block); 493 acpi_status status;
494 struct acpi_namespace_node *gpe_device;
495};
496
497typedef acpi_status(*acpi_gpe_callback) (struct acpi_gpe_xrupt_info *gpe_xrupt_info,
498 struct acpi_gpe_block_info *gpe_block, void *context);
494 499
495/* Information about each particular fixed event */ 500/* Information about each particular fixed event */
496 501
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index be0aa5eb0ba7..e09c23719e42 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -265,6 +265,8 @@ acpi_get_gpe_status(acpi_handle gpe_device,
265 u32 gpe_number, 265 u32 gpe_number,
266 u32 flags, acpi_event_status * event_status); 266 u32 flags, acpi_event_status * event_status);
267 267
268acpi_status acpi_get_gpe_device(u32 gpe_index, acpi_handle *gpe_device);
269
268acpi_status 270acpi_status
269acpi_install_gpe_block(acpi_handle gpe_device, 271acpi_install_gpe_block(acpi_handle gpe_device,
270 struct acpi_generic_address *gpe_block_address, 272 struct acpi_generic_address *gpe_block_address,