aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorLen Brown <len.brown@intel.com>2010-08-15 00:25:40 -0400
committerLen Brown <len.brown@intel.com>2010-08-15 00:25:40 -0400
commitc172cb73bc79fe69915b1a1a48e374aa4b1f8a59 (patch)
treeeb3d6415914968441c063f7282e824b14b5a5edb /drivers/acpi
parente8eb6228094bcf0c84d9aa32b6363e78da68e1f5 (diff)
parent28f4f8a9def2b1f3a6066bae791c77043ec49524 (diff)
Merge branch 'acpica-gpe' into release
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/acpica/acevents.h8
-rw-r--r--drivers/acpi/acpica/acglobal.h7
-rw-r--r--drivers/acpi/acpica/achware.h5
-rw-r--r--drivers/acpi/acpica/aclocal.h7
-rw-r--r--drivers/acpi/acpica/acnamesp.h7
-rw-r--r--drivers/acpi/acpica/acobject.h16
-rw-r--r--drivers/acpi/acpica/acpredef.h13
-rw-r--r--drivers/acpi/acpica/acstruct.h32
-rw-r--r--drivers/acpi/acpica/dsinit.c14
-rw-r--r--drivers/acpi/acpica/dsmethod.c20
-rw-r--r--drivers/acpi/acpica/dsmthdat.c16
-rw-r--r--drivers/acpi/acpica/dsobject.c16
-rw-r--r--drivers/acpi/acpica/dsopcode.c6
-rw-r--r--drivers/acpi/acpica/dsutils.c4
-rw-r--r--drivers/acpi/acpica/evevent.c5
-rw-r--r--drivers/acpi/acpica/evgpe.c142
-rw-r--r--drivers/acpi/acpica/evgpeblk.c70
-rw-r--r--drivers/acpi/acpica/evgpeinit.c236
-rw-r--r--drivers/acpi/acpica/evrgnini.c10
-rw-r--r--drivers/acpi/acpica/evxface.c77
-rw-r--r--drivers/acpi/acpica/evxfevnt.c233
-rw-r--r--drivers/acpi/acpica/exconfig.c2
-rw-r--r--drivers/acpi/acpica/exdump.c6
-rw-r--r--drivers/acpi/acpica/exfldio.c4
-rw-r--r--drivers/acpi/acpica/exprep.c23
-rw-r--r--drivers/acpi/acpica/exregion.c6
-rw-r--r--drivers/acpi/acpica/hwgpe.c35
-rw-r--r--drivers/acpi/acpica/hwsleep.c2
-rw-r--r--drivers/acpi/acpica/nsaccess.c9
-rw-r--r--drivers/acpi/acpica/nsalloc.c94
-rw-r--r--drivers/acpi/acpica/nsdump.c2
-rw-r--r--drivers/acpi/acpica/nsinit.c16
-rw-r--r--drivers/acpi/acpica/nsnames.c4
-rw-r--r--drivers/acpi/acpica/nsparse.c4
-rw-r--r--drivers/acpi/acpica/nsrepair.c2
-rw-r--r--drivers/acpi/acpica/nsrepair2.c7
-rw-r--r--drivers/acpi/acpica/nssearch.c15
-rw-r--r--drivers/acpi/acpica/nsutils.c113
-rw-r--r--drivers/acpi/acpica/nswalk.c15
-rw-r--r--drivers/acpi/acpica/nsxfobj.c2
-rw-r--r--drivers/acpi/acpica/utglobal.c2
-rw-r--r--drivers/acpi/acpica/utxface.c8
-rw-r--r--drivers/acpi/button.c6
-rw-r--r--drivers/acpi/ec.c39
-rw-r--r--drivers/acpi/osl.c20
-rw-r--r--drivers/acpi/scan.c7
-rw-r--r--drivers/acpi/sleep.c15
-rw-r--r--drivers/acpi/system.c6
-rw-r--r--drivers/acpi/wakeup.c18
49 files changed, 511 insertions, 915 deletions
diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h
index c3f43daa8be3..36867cd70eac 100644
--- a/drivers/acpi/acpica/acevents.h
+++ b/drivers/acpi/acpica/acevents.h
@@ -78,7 +78,13 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node *node,
78u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list); 78u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list);
79 79
80acpi_status 80acpi_status
81acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info); 81acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info);
82
83acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info);
84
85acpi_status acpi_raw_enable_gpe(struct acpi_gpe_event_info *gpe_event_info);
86
87acpi_status acpi_raw_disable_gpe(struct acpi_gpe_event_info *gpe_event_info);
82 88
83struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, 89struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
84 u32 gpe_number); 90 u32 gpe_number);
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h
index 92122292ef1f..1d192142c691 100644
--- a/drivers/acpi/acpica/acglobal.h
+++ b/drivers/acpi/acpica/acglobal.h
@@ -100,13 +100,6 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_all_methods_serialized, FALSE);
100u8 ACPI_INIT_GLOBAL(acpi_gbl_create_osi_method, TRUE); 100u8 ACPI_INIT_GLOBAL(acpi_gbl_create_osi_method, TRUE);
101 101
102/* 102/*
103 * Disable wakeup GPEs during runtime? Default is TRUE because WAKE and
104 * RUNTIME GPEs should never be shared, and WAKE GPEs should typically only
105 * be enabled just before going to sleep.
106 */
107u8 ACPI_INIT_GLOBAL(acpi_gbl_leave_wake_gpes_disabled, TRUE);
108
109/*
110 * Optionally use default values for the ACPI register widths. Set this to 103 * Optionally use default values for the ACPI register widths. Set this to
111 * TRUE to use the defaults, if an FADT contains incorrect widths/lengths. 104 * TRUE to use the defaults, if an FADT contains incorrect widths/lengths.
112 */ 105 */
diff --git a/drivers/acpi/acpica/achware.h b/drivers/acpi/acpica/achware.h
index 32391588e163..120b3af56596 100644
--- a/drivers/acpi/acpica/achware.h
+++ b/drivers/acpi/acpica/achware.h
@@ -90,16 +90,13 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width);
90/* 90/*
91 * hwgpe - GPE support 91 * hwgpe - GPE support
92 */ 92 */
93u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info, 93u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
94 struct acpi_gpe_register_info *gpe_register_info); 94 struct acpi_gpe_register_info *gpe_register_info);
95 95
96acpi_status 96acpi_status
97acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action); 97acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action);
98 98
99acpi_status 99acpi_status
100acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info);
101
102acpi_status
103acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 100acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
104 struct acpi_gpe_block_info *gpe_block, void *context); 101 struct acpi_gpe_block_info *gpe_block, void *context);
105 102
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h
index 147a7e6bd38f..df85b53a674f 100644
--- a/drivers/acpi/acpica/aclocal.h
+++ b/drivers/acpi/acpica/aclocal.h
@@ -184,8 +184,9 @@ struct acpi_namespace_node {
184 u8 flags; /* Miscellaneous flags */ 184 u8 flags; /* Miscellaneous flags */
185 acpi_owner_id owner_id; /* Node creator */ 185 acpi_owner_id owner_id; /* Node creator */
186 union acpi_name_union name; /* ACPI Name, always 4 chars per ACPI spec */ 186 union acpi_name_union name; /* ACPI Name, always 4 chars per ACPI spec */
187 struct acpi_namespace_node *parent; /* Parent node */
187 struct acpi_namespace_node *child; /* First child */ 188 struct acpi_namespace_node *child; /* First child */
188 struct acpi_namespace_node *peer; /* Peer. Parent if ANOBJ_END_OF_PEER_LIST set */ 189 struct acpi_namespace_node *peer; /* First peer */
189 190
190 /* 191 /*
191 * The following fields are used by the ASL compiler and disassembler only 192 * The following fields are used by the ASL compiler and disassembler only
@@ -199,7 +200,7 @@ struct acpi_namespace_node {
199 200
200/* Namespace Node flags */ 201/* Namespace Node flags */
201 202
202#define ANOBJ_END_OF_PEER_LIST 0x01 /* End-of-list, Peer field points to parent */ 203#define ANOBJ_RESERVED 0x01 /* Available for use */
203#define ANOBJ_TEMPORARY 0x02 /* Node is create by a method and is temporary */ 204#define ANOBJ_TEMPORARY 0x02 /* Node is create by a method and is temporary */
204#define ANOBJ_METHOD_ARG 0x04 /* Node is a method argument */ 205#define ANOBJ_METHOD_ARG 0x04 /* Node is a method argument */
205#define ANOBJ_METHOD_LOCAL 0x08 /* Node is a method local */ 206#define ANOBJ_METHOD_LOCAL 0x08 /* Node is a method local */
@@ -411,6 +412,7 @@ struct acpi_handler_info {
411 acpi_event_handler address; /* Address of handler, if any */ 412 acpi_event_handler address; /* Address of handler, if any */
412 void *context; /* Context to be passed to handler */ 413 void *context; /* Context to be passed to handler */
413 struct acpi_namespace_node *method_node; /* Method node for this GPE level (saved) */ 414 struct acpi_namespace_node *method_node; /* Method node for this GPE level (saved) */
415 u8 orig_flags; /* Original misc info about this GPE */
414}; 416};
415 417
416union acpi_gpe_dispatch_info { 418union acpi_gpe_dispatch_info {
@@ -428,7 +430,6 @@ struct acpi_gpe_event_info {
428 u8 flags; /* Misc info about this GPE */ 430 u8 flags; /* Misc info about this GPE */
429 u8 gpe_number; /* This GPE */ 431 u8 gpe_number; /* This GPE */
430 u8 runtime_count; /* References to a run GPE */ 432 u8 runtime_count; /* References to a run GPE */
431 u8 wakeup_count; /* References to a wake GPE */
432}; 433};
433 434
434/* Information about a GPE register pair, one per each status/enable pair in an array */ 435/* Information about a GPE register pair, one per each status/enable pair in an array */
diff --git a/drivers/acpi/acpica/acnamesp.h b/drivers/acpi/acpica/acnamesp.h
index 258159cfcdfa..9f60ff002203 100644
--- a/drivers/acpi/acpica/acnamesp.h
+++ b/drivers/acpi/acpica/acnamesp.h
@@ -369,11 +369,4 @@ struct acpi_namespace_node *acpi_ns_validate_handle(acpi_handle handle);
369 369
370void acpi_ns_terminate(void); 370void acpi_ns_terminate(void);
371 371
372struct acpi_namespace_node *acpi_ns_get_parent_node(struct acpi_namespace_node
373 *node);
374
375struct acpi_namespace_node *acpi_ns_get_next_valid_node(struct
376 acpi_namespace_node
377 *node);
378
379#endif /* __ACNAMESP_H__ */ 372#endif /* __ACNAMESP_H__ */
diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h
index cde18ea82656..54857fa87aaf 100644
--- a/drivers/acpi/acpica/acobject.h
+++ b/drivers/acpi/acpica/acobject.h
@@ -91,14 +91,14 @@
91 91
92/* Values for Flag byte above */ 92/* Values for Flag byte above */
93 93
94#define AOPOBJ_AML_CONSTANT 0x01 94#define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */
95#define AOPOBJ_STATIC_POINTER 0x02 95#define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */
96#define AOPOBJ_DATA_VALID 0x04 96#define AOPOBJ_DATA_VALID 0x04 /* Object is intialized and data is valid */
97#define AOPOBJ_OBJECT_INITIALIZED 0x08 97#define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */
98#define AOPOBJ_SETUP_COMPLETE 0x10 98#define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */
99#define AOPOBJ_SINGLE_DATUM 0x20 99#define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */
100#define AOPOBJ_INVALID 0x40 /* Used if host OS won't allow an op_region address */ 100#define AOPOBJ_MODULE_LEVEL 0x40 /* Method is actually module-level code */
101#define AOPOBJ_MODULE_LEVEL 0x80 101#define AOPOBJ_MODIFIED_NAMESPACE 0x80 /* Method modified the namespace */
102 102
103/****************************************************************************** 103/******************************************************************************
104 * 104 *
diff --git a/drivers/acpi/acpica/acpredef.h b/drivers/acpi/acpica/acpredef.h
index 97116082cb6c..10998d369ad0 100644
--- a/drivers/acpi/acpica/acpredef.h
+++ b/drivers/acpi/acpica/acpredef.h
@@ -503,15 +503,16 @@ static const union acpi_predefined_info predefined_names[] =
503 {{"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_INTEGER | ACPI_RTYPE_PACKAGE}}, 503 {{"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_INTEGER | ACPI_RTYPE_PACKAGE}},
504 {{{ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2,0}, 0,0}}, /* Fixed-length (2 Int), but is optional */ 504 {{{ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2,0}, 0,0}}, /* Fixed-length (2 Int), but is optional */
505 505
506 {{{0,0,0,0}, 0,0}} /* Table terminator */ 506 /* _WDG/_WED are MS extensions defined by "Windows Instrumentation" */
507};
508 507
509#if 0 508 {{"_WDG", 0, ACPI_RTYPE_BUFFER}},
510 /* Not implemented */ 509 {{"_WED", 1,
510 ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER}},
511 511
512 {{"_WDG", 0, ACPI_RTYPE_BUFFER}}, /* MS Extension */ 512 {{{0, 0, 0, 0}, 0, 0}} /* Table terminator */
513 {{"_WED", 1, ACPI_RTYPE_PACKAGE}}, /* MS Extension */ 513};
514 514
515#if 0
515 /* This is an internally implemented control method, no need to check */ 516 /* This is an internally implemented control method, no need to check */
516 {{"_OSI", 1, ACPI_RTYPE_INTEGER}}, 517 {{"_OSI", 1, ACPI_RTYPE_INTEGER}},
517 518
diff --git a/drivers/acpi/acpica/acstruct.h b/drivers/acpi/acpica/acstruct.h
index 161bc0e3d70a..6e5dd97949fe 100644
--- a/drivers/acpi/acpica/acstruct.h
+++ b/drivers/acpi/acpica/acstruct.h
@@ -127,22 +127,22 @@ struct acpi_walk_state {
127 acpi_parse_upwards ascending_callback; 127 acpi_parse_upwards ascending_callback;
128}; 128};
129 129
130/* Info used by acpi_ps_init_objects */ 130/* Info used by acpi_ns_initialize_objects and acpi_ds_initialize_objects */
131 131
132struct acpi_init_walk_info { 132struct acpi_init_walk_info {
133 u16 method_count;
134 u16 device_count;
135 u16 op_region_count;
136 u16 field_count;
137 u16 buffer_count;
138 u16 package_count;
139 u16 op_region_init;
140 u16 field_init;
141 u16 buffer_init;
142 u16 package_init;
143 u16 object_count;
144 acpi_owner_id owner_id;
145 u32 table_index; 133 u32 table_index;
134 u32 object_count;
135 u32 method_count;
136 u32 device_count;
137 u32 op_region_count;
138 u32 field_count;
139 u32 buffer_count;
140 u32 package_count;
141 u32 op_region_init;
142 u32 field_init;
143 u32 buffer_init;
144 u32 package_init;
145 acpi_owner_id owner_id;
146}; 146};
147 147
148struct acpi_get_devices_info { 148struct acpi_get_devices_info {
@@ -201,11 +201,11 @@ struct acpi_evaluate_info {
201/* Info used by acpi_ns_initialize_devices */ 201/* Info used by acpi_ns_initialize_devices */
202 202
203struct acpi_device_walk_info { 203struct acpi_device_walk_info {
204 u16 device_count;
205 u16 num_STA;
206 u16 num_INI;
207 struct acpi_table_desc *table_desc; 204 struct acpi_table_desc *table_desc;
208 struct acpi_evaluate_info *evaluate_info; 205 struct acpi_evaluate_info *evaluate_info;
206 u32 device_count;
207 u32 num_STA;
208 u32 num_INI;
209}; 209};
210 210
211/* TBD: [Restructure] Merge with struct above */ 211/* TBD: [Restructure] Merge with struct above */
diff --git a/drivers/acpi/acpica/dsinit.c b/drivers/acpi/acpica/dsinit.c
index abe140318a74..cc4a38c57558 100644
--- a/drivers/acpi/acpica/dsinit.c
+++ b/drivers/acpi/acpica/dsinit.c
@@ -171,12 +171,12 @@ acpi_ds_initialize_objects(u32 table_index,
171 "**** Starting initialization of namespace objects ****\n")); 171 "**** Starting initialization of namespace objects ****\n"));
172 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "Parsing all Control Methods:")); 172 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "Parsing all Control Methods:"));
173 173
174 info.method_count = 0; 174 /* Set all init info to zero */
175 info.op_region_count = 0; 175
176 info.object_count = 0; 176 ACPI_MEMSET(&info, 0, sizeof(struct acpi_init_walk_info));
177 info.device_count = 0; 177
178 info.table_index = table_index;
179 info.owner_id = owner_id; 178 info.owner_id = owner_id;
179 info.table_index = table_index;
180 180
181 /* Walk entire namespace from the supplied root */ 181 /* Walk entire namespace from the supplied root */
182 182
@@ -204,13 +204,13 @@ acpi_ds_initialize_objects(u32 table_index,
204 } 204 }
205 205
206 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 206 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
207 "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n", 207 "\nTable [%4.4s](id %4.4X) - %u Objects with %u Devices %u Methods %u Regions\n",
208 table->signature, owner_id, info.object_count, 208 table->signature, owner_id, info.object_count,
209 info.device_count, info.method_count, 209 info.device_count, info.method_count,
210 info.op_region_count)); 210 info.op_region_count));
211 211
212 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 212 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
213 "%hd Methods, %hd Regions\n", info.method_count, 213 "%u Methods, %u Regions\n", info.method_count,
214 info.op_region_count)); 214 info.op_region_count));
215 215
216 return_ACPI_STATUS(AE_OK); 216 return_ACPI_STATUS(AE_OK);
diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c
index 2a9a561c2f01..64750ee96e20 100644
--- a/drivers/acpi/acpica/dsmethod.c
+++ b/drivers/acpi/acpica/dsmethod.c
@@ -584,8 +584,22 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
584 * want make the objects permanent. 584 * want make the objects permanent.
585 */ 585 */
586 if (!(method_desc->method.flags & AOPOBJ_MODULE_LEVEL)) { 586 if (!(method_desc->method.flags & AOPOBJ_MODULE_LEVEL)) {
587 acpi_ns_delete_namespace_by_owner(method_desc->method. 587
588 owner_id); 588 /* Delete any direct children of (created by) this method */
589
590 acpi_ns_delete_namespace_subtree(walk_state->
591 method_node);
592
593 /*
594 * Delete any objects that were created by this method
595 * elsewhere in the namespace (if any were created).
596 */
597 if (method_desc->method.
598 flags & AOPOBJ_MODIFIED_NAMESPACE) {
599 acpi_ns_delete_namespace_by_owner(method_desc->
600 method.
601 owner_id);
602 }
589 } 603 }
590 } 604 }
591 605
@@ -605,7 +619,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
605 * we immediately reuse it for the next thread executing this method 619 * we immediately reuse it for the next thread executing this method
606 */ 620 */
607 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 621 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
608 "*** Completed execution of one thread, %d threads remaining\n", 622 "*** Completed execution of one thread, %u threads remaining\n",
609 method_desc->method.thread_count)); 623 method_desc->method.thread_count));
610 } else { 624 } else {
611 /* This is the only executing thread for this method */ 625 /* This is the only executing thread for this method */
diff --git a/drivers/acpi/acpica/dsmthdat.c b/drivers/acpi/acpica/dsmthdat.c
index f3d52f59250b..8095306fcd8c 100644
--- a/drivers/acpi/acpica/dsmthdat.c
+++ b/drivers/acpi/acpica/dsmthdat.c
@@ -102,8 +102,7 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state)
102 walk_state->arguments[i].name.integer |= (i << 24); 102 walk_state->arguments[i].name.integer |= (i << 24);
103 walk_state->arguments[i].descriptor_type = ACPI_DESC_TYPE_NAMED; 103 walk_state->arguments[i].descriptor_type = ACPI_DESC_TYPE_NAMED;
104 walk_state->arguments[i].type = ACPI_TYPE_ANY; 104 walk_state->arguments[i].type = ACPI_TYPE_ANY;
105 walk_state->arguments[i].flags = 105 walk_state->arguments[i].flags = ANOBJ_METHOD_ARG;
106 ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG;
107 } 106 }
108 107
109 /* Init the method locals */ 108 /* Init the method locals */
@@ -116,8 +115,7 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state)
116 walk_state->local_variables[i].descriptor_type = 115 walk_state->local_variables[i].descriptor_type =
117 ACPI_DESC_TYPE_NAMED; 116 ACPI_DESC_TYPE_NAMED;
118 walk_state->local_variables[i].type = ACPI_TYPE_ANY; 117 walk_state->local_variables[i].type = ACPI_TYPE_ANY;
119 walk_state->local_variables[i].flags = 118 walk_state->local_variables[i].flags = ANOBJ_METHOD_LOCAL;
120 ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL;
121 } 119 }
122 120
123 return_VOID; 121 return_VOID;
@@ -146,7 +144,7 @@ void acpi_ds_method_data_delete_all(struct acpi_walk_state *walk_state)
146 144
147 for (index = 0; index < ACPI_METHOD_NUM_LOCALS; index++) { 145 for (index = 0; index < ACPI_METHOD_NUM_LOCALS; index++) {
148 if (walk_state->local_variables[index].object) { 146 if (walk_state->local_variables[index].object) {
149 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Deleting Local%d=%p\n", 147 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Deleting Local%u=%p\n",
150 index, 148 index,
151 walk_state->local_variables[index]. 149 walk_state->local_variables[index].
152 object)); 150 object));
@@ -162,7 +160,7 @@ void acpi_ds_method_data_delete_all(struct acpi_walk_state *walk_state)
162 160
163 for (index = 0; index < ACPI_METHOD_NUM_ARGS; index++) { 161 for (index = 0; index < ACPI_METHOD_NUM_ARGS; index++) {
164 if (walk_state->arguments[index].object) { 162 if (walk_state->arguments[index].object) {
165 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Deleting Arg%d=%p\n", 163 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Deleting Arg%u=%p\n",
166 index, 164 index,
167 walk_state->arguments[index].object)); 165 walk_state->arguments[index].object));
168 166
@@ -226,7 +224,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
226 index++; 224 index++;
227 } 225 }
228 226
229 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%d args passed to method\n", index)); 227 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%u args passed to method\n", index));
230 return_ACPI_STATUS(AE_OK); 228 return_ACPI_STATUS(AE_OK);
231} 229}
232 230
@@ -323,7 +321,7 @@ acpi_ds_method_data_set_value(u8 type,
323 ACPI_FUNCTION_TRACE(ds_method_data_set_value); 321 ACPI_FUNCTION_TRACE(ds_method_data_set_value);
324 322
325 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 323 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
326 "NewObj %p Type %2.2X, Refs=%d [%s]\n", object, 324 "NewObj %p Type %2.2X, Refs=%u [%s]\n", object,
327 type, object->common.reference_count, 325 type, object->common.reference_count,
328 acpi_ut_get_type_name(object->common.type))); 326 acpi_ut_get_type_name(object->common.type)));
329 327
@@ -543,7 +541,7 @@ acpi_ds_store_object_to_local(u8 type,
543 union acpi_operand_object *new_obj_desc; 541 union acpi_operand_object *new_obj_desc;
544 542
545 ACPI_FUNCTION_TRACE(ds_store_object_to_local); 543 ACPI_FUNCTION_TRACE(ds_store_object_to_local);
546 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Type=%2.2X Index=%d Obj=%p\n", 544 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Type=%2.2X Index=%u Obj=%p\n",
547 type, index, obj_desc)); 545 type, index, obj_desc));
548 546
549 /* Parameter validation */ 547 /* Parameter validation */
diff --git a/drivers/acpi/acpica/dsobject.c b/drivers/acpi/acpica/dsobject.c
index 3607adcaf085..8e85f54a8e0e 100644
--- a/drivers/acpi/acpica/dsobject.c
+++ b/drivers/acpi/acpica/dsobject.c
@@ -81,6 +81,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
81{ 81{
82 union acpi_operand_object *obj_desc; 82 union acpi_operand_object *obj_desc;
83 acpi_status status; 83 acpi_status status;
84 acpi_object_type type;
84 85
85 ACPI_FUNCTION_TRACE(ds_build_internal_object); 86 ACPI_FUNCTION_TRACE(ds_build_internal_object);
86 87
@@ -172,7 +173,20 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
172 return_ACPI_STATUS(status); 173 return_ACPI_STATUS(status);
173 } 174 }
174 175
175 switch (op->common.node->type) { 176 /*
177 * Special handling for Alias objects. We need to setup the type
178 * and the Op->Common.Node to point to the Alias target. Note,
179 * Alias has at most one level of indirection internally.
180 */
181 type = op->common.node->type;
182 if (type == ACPI_TYPE_LOCAL_ALIAS) {
183 type = obj_desc->common.type;
184 op->common.node =
185 ACPI_CAST_PTR(struct acpi_namespace_node,
186 op->common.node->object);
187 }
188
189 switch (type) {
176 /* 190 /*
177 * For these types, we need the actual node, not the subobject. 191 * For these types, we need the actual node, not the subobject.
178 * However, the subobject did not get an extra reference count above. 192 * However, the subobject did not get an extra reference count above.
diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c
index 53a7e416f33e..7c0e74227171 100644
--- a/drivers/acpi/acpica/dsopcode.c
+++ b/drivers/acpi/acpica/dsopcode.c
@@ -213,7 +213,7 @@ acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc)
213 213
214 /* Execute the AML code for the term_arg arguments */ 214 /* Execute the AML code for the term_arg arguments */
215 215
216 status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node), 216 status = acpi_ds_execute_arguments(node, node->parent,
217 extra_desc->extra.aml_length, 217 extra_desc->extra.aml_length,
218 extra_desc->extra.aml_start); 218 extra_desc->extra.aml_start);
219 return_ACPI_STATUS(status); 219 return_ACPI_STATUS(status);
@@ -257,7 +257,7 @@ acpi_ds_get_bank_field_arguments(union acpi_operand_object *obj_desc)
257 257
258 /* Execute the AML code for the term_arg arguments */ 258 /* Execute the AML code for the term_arg arguments */
259 259
260 status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node), 260 status = acpi_ds_execute_arguments(node, node->parent,
261 extra_desc->extra.aml_length, 261 extra_desc->extra.aml_length,
262 extra_desc->extra.aml_start); 262 extra_desc->extra.aml_start);
263 return_ACPI_STATUS(status); 263 return_ACPI_STATUS(status);
@@ -394,7 +394,7 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
394 394
395 /* Execute the argument AML */ 395 /* Execute the argument AML */
396 396
397 status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node), 397 status = acpi_ds_execute_arguments(node, node->parent,
398 extra_desc->extra.aml_length, 398 extra_desc->extra.aml_length,
399 extra_desc->extra.aml_start); 399 extra_desc->extra.aml_start);
400 if (ACPI_FAILURE(status)) { 400 if (ACPI_FAILURE(status)) {
diff --git a/drivers/acpi/acpica/dsutils.c b/drivers/acpi/acpica/dsutils.c
index 306c62ab2e88..15135c25aa9b 100644
--- a/drivers/acpi/acpica/dsutils.c
+++ b/drivers/acpi/acpica/dsutils.c
@@ -746,7 +746,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state,
746 index--; 746 index--;
747 747
748 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 748 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
749 "Arg #%d (%p) done, Arg1=%p\n", index, arg, 749 "Arg #%u (%p) done, Arg1=%p\n", index, arg,
750 first_arg)); 750 first_arg));
751 } 751 }
752 752
@@ -760,7 +760,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state,
760 */ 760 */
761 acpi_ds_obj_stack_pop_and_delete(arg_count, walk_state); 761 acpi_ds_obj_stack_pop_and_delete(arg_count, walk_state);
762 762
763 ACPI_EXCEPTION((AE_INFO, status, "While creating Arg %d", index)); 763 ACPI_EXCEPTION((AE_INFO, status, "While creating Arg %u", index));
764 return_ACPI_STATUS(status); 764 return_ACPI_STATUS(status);
765} 765}
766 766
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c
index f5795915a2e9..303618889da0 100644
--- a/drivers/acpi/acpica/evevent.c
+++ b/drivers/acpi/acpica/evevent.c
@@ -102,9 +102,8 @@ acpi_status acpi_ev_initialize_events(void)
102 * RETURN: Status 102 * RETURN: Status
103 * 103 *
104 * DESCRIPTION: Completes initialization of the FADT-defined GPE blocks 104 * DESCRIPTION: Completes initialization of the FADT-defined GPE blocks
105 * (0 and 1). This causes the _PRW methods to be run, so the HW 105 * (0 and 1). The HW must be fully initialized at this point,
106 * must be fully initialized at this point, including global lock 106 * including global lock support.
107 * support.
108 * 107 *
109 ******************************************************************************/ 108 ******************************************************************************/
110 109
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c
index 7c2c336006a1..f226eac314db 100644
--- a/drivers/acpi/acpica/evgpe.c
+++ b/drivers/acpi/acpica/evgpe.c
@@ -54,51 +54,159 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context);
54 54
55/******************************************************************************* 55/*******************************************************************************
56 * 56 *
57 * FUNCTION: acpi_ev_update_gpe_enable_masks 57 * FUNCTION: acpi_ev_update_gpe_enable_mask
58 * 58 *
59 * PARAMETERS: gpe_event_info - GPE to update 59 * PARAMETERS: gpe_event_info - GPE to update
60 * 60 *
61 * RETURN: Status 61 * RETURN: Status
62 * 62 *
63 * DESCRIPTION: Updates GPE register enable masks based upon whether there are 63 * DESCRIPTION: Updates GPE register enable mask based upon whether there are
64 * references (either wake or run) to this GPE 64 * runtime references to this GPE
65 * 65 *
66 ******************************************************************************/ 66 ******************************************************************************/
67 67
68acpi_status 68acpi_status
69acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) 69acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info)
70{ 70{
71 struct acpi_gpe_register_info *gpe_register_info; 71 struct acpi_gpe_register_info *gpe_register_info;
72 u32 register_bit; 72 u32 register_bit;
73 73
74 ACPI_FUNCTION_TRACE(ev_update_gpe_enable_masks); 74 ACPI_FUNCTION_TRACE(ev_update_gpe_enable_mask);
75 75
76 gpe_register_info = gpe_event_info->register_info; 76 gpe_register_info = gpe_event_info->register_info;
77 if (!gpe_register_info) { 77 if (!gpe_register_info) {
78 return_ACPI_STATUS(AE_NOT_EXIST); 78 return_ACPI_STATUS(AE_NOT_EXIST);
79 } 79 }
80 80
81 register_bit = acpi_hw_gpe_register_bit(gpe_event_info, 81 register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info,
82 gpe_register_info); 82 gpe_register_info);
83 83
84 /* Clear the wake/run bits up front */ 84 /* Clear the run bit up front */
85 85
86 ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake, register_bit);
87 ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit); 86 ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit);
88 87
89 /* Set the mask bits only if there are references to this GPE */ 88 /* Set the mask bit only if there are references to this GPE */
90 89
91 if (gpe_event_info->runtime_count) { 90 if (gpe_event_info->runtime_count) {
92 ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit); 91 ACPI_SET_BIT(gpe_register_info->enable_for_run, (u8)register_bit);
93 } 92 }
94 93
95 if (gpe_event_info->wakeup_count) { 94 return_ACPI_STATUS(AE_OK);
96 ACPI_SET_BIT(gpe_register_info->enable_for_wake, register_bit); 95}
96
97/*******************************************************************************
98 *
99 * FUNCTION: acpi_ev_enable_gpe
100 *
101 * PARAMETERS: gpe_event_info - GPE to enable
102 *
103 * RETURN: Status
104 *
105 * DESCRIPTION: Clear the given GPE from stale events and enable it.
106 *
107 ******************************************************************************/
108acpi_status
109acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info)
110{
111 acpi_status status;
112
113 ACPI_FUNCTION_TRACE(ev_enable_gpe);
114
115 /*
116 * We will only allow a GPE to be enabled if it has either an
117 * associated method (_Lxx/_Exx) or a handler. Otherwise, the
118 * GPE will be immediately disabled by acpi_ev_gpe_dispatch the
119 * first time it fires.
120 */
121 if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) {
122 return_ACPI_STATUS(AE_NO_HANDLER);
97 } 123 }
98 124
99 return_ACPI_STATUS(AE_OK); 125 /* Clear the GPE (of stale events) */
126 status = acpi_hw_clear_gpe(gpe_event_info);
127 if (ACPI_FAILURE(status)) {
128 return_ACPI_STATUS(status);
129 }
130
131 /* Enable the requested GPE */
132 status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE);
133
134 return_ACPI_STATUS(status);
135}
136
137
138/*******************************************************************************
139 *
140 * FUNCTION: acpi_raw_enable_gpe
141 *
142 * PARAMETERS: gpe_event_info - GPE to enable
143 *
144 * RETURN: Status
145 *
146 * DESCRIPTION: Add a reference to a GPE. On the first reference, the GPE is
147 * hardware-enabled.
148 *
149 ******************************************************************************/
150
151acpi_status acpi_raw_enable_gpe(struct acpi_gpe_event_info *gpe_event_info)
152{
153 acpi_status status = AE_OK;
154
155 if (gpe_event_info->runtime_count == ACPI_UINT8_MAX) {
156 return_ACPI_STATUS(AE_LIMIT);
157 }
158
159 gpe_event_info->runtime_count++;
160 if (gpe_event_info->runtime_count == 1) {
161 status = acpi_ev_update_gpe_enable_mask(gpe_event_info);
162 if (ACPI_SUCCESS(status)) {
163 status = acpi_ev_enable_gpe(gpe_event_info);
164 }
165
166 if (ACPI_FAILURE(status)) {
167 gpe_event_info->runtime_count--;
168 }
169 }
170
171 return_ACPI_STATUS(status);
100} 172}
101 173
174/*******************************************************************************
175 *
176 * FUNCTION: acpi_raw_disable_gpe
177 *
178 * PARAMETERS: gpe_event_info - GPE to disable
179 *
180 * RETURN: Status
181 *
182 * DESCRIPTION: Remove a reference to a GPE. When the last reference is
183 * removed, the GPE is hardware-disabled.
184 *
185 ******************************************************************************/
186
187acpi_status acpi_raw_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
188{
189 acpi_status status = AE_OK;
190
191 if (!gpe_event_info->runtime_count) {
192 return_ACPI_STATUS(AE_LIMIT);
193 }
194
195 gpe_event_info->runtime_count--;
196 if (!gpe_event_info->runtime_count) {
197 status = acpi_ev_update_gpe_enable_mask(gpe_event_info);
198 if (ACPI_SUCCESS(status)) {
199 status = acpi_hw_low_set_gpe(gpe_event_info,
200 ACPI_GPE_DISABLE);
201 }
202
203 if (ACPI_FAILURE(status)) {
204 gpe_event_info->runtime_count++;
205 }
206 }
207
208 return_ACPI_STATUS(status);
209}
102 210
103/******************************************************************************* 211/*******************************************************************************
104 * 212 *
@@ -417,8 +525,12 @@ static void acpi_ev_asynch_enable_gpe(void *context)
417 } 525 }
418 } 526 }
419 527
420 /* Enable this GPE */ 528 /*
421 (void)acpi_hw_write_gpe_enable_reg(gpe_event_info); 529 * Enable this GPE, conditionally. This means that the GPE will only be
530 * physically enabled if the enable_for_run bit is set in the event_info
531 */
532 (void)acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_COND_ENABLE);
533
422 return_VOID; 534 return_VOID;
423} 535}
424 536
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c
index 341a38ce8aa6..85445fb5844e 100644
--- a/drivers/acpi/acpica/evgpeblk.c
+++ b/drivers/acpi/acpica/evgpeblk.c
@@ -439,8 +439,6 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
439{ 439{
440 acpi_status status; 440 acpi_status status;
441 struct acpi_gpe_event_info *gpe_event_info; 441 struct acpi_gpe_event_info *gpe_event_info;
442 struct acpi_gpe_walk_info walk_info;
443 u32 wake_gpe_count;
444 u32 gpe_enabled_count; 442 u32 gpe_enabled_count;
445 u32 gpe_index; 443 u32 gpe_index;
446 u32 gpe_number; 444 u32 gpe_number;
@@ -456,37 +454,9 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
456 } 454 }
457 455
458 /* 456 /*
459 * Runtime option: Should wake GPEs be enabled at runtime? The default 457 * Enable all GPEs that have a corresponding method. Any other GPEs
460 * is no, they should only be enabled just as the machine goes to sleep. 458 * within this block must be enabled via the acpi_enable_gpe interface.
461 */ 459 */
462 if (acpi_gbl_leave_wake_gpes_disabled) {
463 /*
464 * Differentiate runtime vs wake GPEs, via the _PRW control methods.
465 * Each GPE that has one or more _PRWs that reference it is by
466 * definition a wake GPE and will not be enabled while the machine
467 * is running.
468 */
469 walk_info.gpe_block = gpe_block;
470 walk_info.gpe_device = gpe_device;
471 walk_info.execute_by_owner_id = FALSE;
472
473 status =
474 acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
475 ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
476 acpi_ev_match_prw_and_gpe, NULL,
477 &walk_info, NULL);
478 if (ACPI_FAILURE(status)) {
479 ACPI_EXCEPTION((AE_INFO, status,
480 "While executing _PRW methods"));
481 }
482 }
483
484 /*
485 * Enable all GPEs that have a corresponding method and are not
486 * capable of generating wakeups. Any other GPEs within this block
487 * must be enabled via the acpi_enable_gpe interface.
488 */
489 wake_gpe_count = 0;
490 gpe_enabled_count = 0; 460 gpe_enabled_count = 0;
491 461
492 if (gpe_device == acpi_gbl_fadt_gpe_device) { 462 if (gpe_device == acpi_gbl_fadt_gpe_device) {
@@ -502,35 +472,21 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
502 gpe_event_info = &gpe_block->event_info[gpe_index]; 472 gpe_event_info = &gpe_block->event_info[gpe_index];
503 gpe_number = gpe_index + gpe_block->block_base_number; 473 gpe_number = gpe_index + gpe_block->block_base_number;
504 474
505 /*
506 * If the GPE has already been enabled for runtime
507 * signaling, make sure it remains enabled, but do not
508 * increment its reference counter.
509 */
510 if (gpe_event_info->runtime_count) {
511 acpi_set_gpe(gpe_device, gpe_number,
512 ACPI_GPE_ENABLE);
513 gpe_enabled_count++;
514 continue;
515 }
516
517 if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) {
518 wake_gpe_count++;
519 if (acpi_gbl_leave_wake_gpes_disabled) {
520 continue;
521 }
522 }
523
524 /* Ignore GPEs that have no corresponding _Lxx/_Exx method */ 475 /* Ignore GPEs that have no corresponding _Lxx/_Exx method */
525 476
526 if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD)) { 477 if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD)) {
527 continue; 478 continue;
528 } 479 }
529 480
530 /* Enable this GPE */ 481 /*
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);
531 489
532 status = acpi_enable_gpe(gpe_device, gpe_number,
533 ACPI_GPE_TYPE_RUNTIME);
534 if (ACPI_FAILURE(status)) { 490 if (ACPI_FAILURE(status)) {
535 ACPI_EXCEPTION((AE_INFO, status, 491 ACPI_EXCEPTION((AE_INFO, status,
536 "Could not enable GPE 0x%02X", 492 "Could not enable GPE 0x%02X",
@@ -542,10 +498,10 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
542 } 498 }
543 } 499 }
544 500
545 if (gpe_enabled_count || wake_gpe_count) { 501 if (gpe_enabled_count) {
546 ACPI_DEBUG_PRINT((ACPI_DB_INIT, 502 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
547 "Enabled %u Runtime GPEs, added %u Wake GPEs in this block\n", 503 "Enabled %u GPEs in this block\n",
548 gpe_enabled_count, wake_gpe_count)); 504 gpe_enabled_count));
549 } 505 }
550 506
551 return_ACPI_STATUS(AE_OK); 507 return_ACPI_STATUS(AE_OK);
diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c
index 3f6c2d26410d..3084c5de1bba 100644
--- a/drivers/acpi/acpica/evgpeinit.c
+++ b/drivers/acpi/acpica/evgpeinit.c
@@ -211,9 +211,7 @@ acpi_status acpi_ev_gpe_initialize(void)
211 * DESCRIPTION: Check for new GPE methods (_Lxx/_Exx) made available as a 211 * DESCRIPTION: Check for new GPE methods (_Lxx/_Exx) made available as a
212 * result of a Load() or load_table() operation. If new GPE 212 * result of a Load() or load_table() operation. If new GPE
213 * methods have been installed, register the new methods and 213 * methods have been installed, register the new methods and
214 * enable and runtime GPEs that are associated with them. Also, 214 * enable and runtime GPEs that are associated with them.
215 * run any newly loaded _PRW methods in order to discover any
216 * new CAN_WAKE GPEs.
217 * 215 *
218 ******************************************************************************/ 216 ******************************************************************************/
219 217
@@ -223,49 +221,12 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
223 struct acpi_gpe_block_info *gpe_block; 221 struct acpi_gpe_block_info *gpe_block;
224 struct acpi_gpe_walk_info walk_info; 222 struct acpi_gpe_walk_info walk_info;
225 acpi_status status = AE_OK; 223 acpi_status status = AE_OK;
226 u32 new_wake_gpe_count = 0;
227
228 /* We will examine only _PRW/_Lxx/_Exx methods owned by this table */
229
230 walk_info.owner_id = table_owner_id;
231 walk_info.execute_by_owner_id = TRUE;
232 walk_info.count = 0;
233
234 if (acpi_gbl_leave_wake_gpes_disabled) {
235 /*
236 * 1) Run any newly-loaded _PRW methods to find any GPEs that
237 * can now be marked as CAN_WAKE GPEs. Note: We must run the
238 * _PRW methods before we process the _Lxx/_Exx methods because
239 * we will enable all runtime GPEs associated with the new
240 * _Lxx/_Exx methods at the time we process those methods.
241 *
242 * Unlock interpreter so that we can run the _PRW methods.
243 */
244 walk_info.gpe_block = NULL;
245 walk_info.gpe_device = NULL;
246
247 acpi_ex_exit_interpreter();
248
249 status =
250 acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
251 ACPI_UINT32_MAX,
252 ACPI_NS_WALK_NO_UNLOCK,
253 acpi_ev_match_prw_and_gpe, NULL,
254 &walk_info, NULL);
255 if (ACPI_FAILURE(status)) {
256 ACPI_EXCEPTION((AE_INFO, status,
257 "While executing _PRW methods"));
258 }
259
260 acpi_ex_enter_interpreter();
261 new_wake_gpe_count = walk_info.count;
262 }
263 224
264 /* 225 /*
265 * 2) Find any _Lxx/_Exx GPE methods that have just been loaded. 226 * 2) Find any _Lxx/_Exx GPE methods that have just been loaded.
266 * 227 *
267 * Any GPEs that correspond to new _Lxx/_Exx methods and are not 228 * Any GPEs that correspond to new _Lxx/_Exx methods are immediately
268 * marked as CAN_WAKE are immediately enabled. 229 * enabled.
269 * 230 *
270 * Examine the namespace underneath each gpe_device within the 231 * Examine the namespace underneath each gpe_device within the
271 * gpe_block lists. 232 * gpe_block lists.
@@ -275,6 +236,8 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
275 return; 236 return;
276 } 237 }
277 238
239 walk_info.owner_id = table_owner_id;
240 walk_info.execute_by_owner_id = TRUE;
278 walk_info.count = 0; 241 walk_info.count = 0;
279 walk_info.enable_this_gpe = TRUE; 242 walk_info.enable_this_gpe = TRUE;
280 243
@@ -307,10 +270,8 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
307 gpe_xrupt_info = gpe_xrupt_info->next; 270 gpe_xrupt_info = gpe_xrupt_info->next;
308 } 271 }
309 272
310 if (walk_info.count || new_wake_gpe_count) { 273 if (walk_info.count) {
311 ACPI_INFO((AE_INFO, 274 ACPI_INFO((AE_INFO, "Enabled %u new GPEs", walk_info.count));
312 "Enabled %u new runtime GPEs, added %u new wakeup GPEs",
313 walk_info.count, new_wake_gpe_count));
314 } 275 }
315 276
316 (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); 277 (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
@@ -386,9 +347,6 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
386 /* 347 /*
387 * 3) Edge/Level determination is based on the 2nd character 348 * 3) Edge/Level determination is based on the 2nd character
388 * of the method name 349 * of the method name
389 *
390 * NOTE: Default GPE type is RUNTIME only. Later, if a _PRW object is
391 * found that points to this GPE, the ACPI_GPE_CAN_WAKE flag is set.
392 */ 350 */
393 switch (name[1]) { 351 switch (name[1]) {
394 case 'L': 352 case 'L':
@@ -471,24 +429,18 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
471 */ 429 */
472 if (walk_info->enable_this_gpe) { 430 if (walk_info->enable_this_gpe) {
473 431
474 /* Ignore GPEs that can wake the system */ 432 walk_info->count++;
433 gpe_device = walk_info->gpe_device;
475 434
476 if (!(gpe_event_info->flags & ACPI_GPE_CAN_WAKE) || 435 if (gpe_device == acpi_gbl_fadt_gpe_device) {
477 !acpi_gbl_leave_wake_gpes_disabled) { 436 gpe_device = NULL;
478 walk_info->count++; 437 }
479 gpe_device = walk_info->gpe_device;
480
481 if (gpe_device == acpi_gbl_fadt_gpe_device) {
482 gpe_device = NULL;
483 }
484 438
485 status = acpi_enable_gpe(gpe_device, gpe_number, 439 status = acpi_enable_gpe(gpe_device, gpe_number);
486 ACPI_GPE_TYPE_RUNTIME); 440 if (ACPI_FAILURE(status)) {
487 if (ACPI_FAILURE(status)) { 441 ACPI_EXCEPTION((AE_INFO, status,
488 ACPI_EXCEPTION((AE_INFO, status, 442 "Could not enable GPE 0x%02X",
489 "Could not enable GPE 0x%02X", 443 gpe_number));
490 gpe_number));
491 }
492 } 444 }
493 } 445 }
494 446
@@ -497,157 +449,3 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
497 name, gpe_number)); 449 name, gpe_number));
498 return_ACPI_STATUS(AE_OK); 450 return_ACPI_STATUS(AE_OK);
499} 451}
500
501/*******************************************************************************
502 *
503 * FUNCTION: acpi_ev_match_prw_and_gpe
504 *
505 * PARAMETERS: Callback from walk_namespace
506 *
507 * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is
508 * not aborted on a single _PRW failure.
509 *
510 * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a
511 * Device. Run the _PRW method. If present, extract the GPE
512 * number and mark the GPE as a CAN_WAKE GPE. Allows a
513 * per-owner_id execution if execute_by_owner_id is TRUE in the
514 * walk_info parameter block.
515 *
516 * If walk_info->execute_by_owner_id is TRUE, we only execute _PRWs with that
517 * owner.
518 * If walk_info->gpe_device is NULL, we execute every _PRW found. Otherwise,
519 * we only execute _PRWs that refer to the input gpe_device.
520 *
521 ******************************************************************************/
522
523acpi_status
524acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
525 u32 level, void *context, void **return_value)
526{
527 struct acpi_gpe_walk_info *walk_info =
528 ACPI_CAST_PTR(struct acpi_gpe_walk_info, context);
529 struct acpi_namespace_node *gpe_device;
530 struct acpi_gpe_block_info *gpe_block;
531 struct acpi_namespace_node *target_gpe_device;
532 struct acpi_namespace_node *prw_node;
533 struct acpi_gpe_event_info *gpe_event_info;
534 union acpi_operand_object *pkg_desc;
535 union acpi_operand_object *obj_desc;
536 u32 gpe_number;
537 acpi_status status;
538
539 ACPI_FUNCTION_TRACE(ev_match_prw_and_gpe);
540
541 /* Check for a _PRW method under this device */
542
543 status = acpi_ns_get_node(obj_handle, METHOD_NAME__PRW,
544 ACPI_NS_NO_UPSEARCH, &prw_node);
545 if (ACPI_FAILURE(status)) {
546 return_ACPI_STATUS(AE_OK);
547 }
548
549 /* Check if requested owner_id matches this owner_id */
550
551 if ((walk_info->execute_by_owner_id) &&
552 (prw_node->owner_id != walk_info->owner_id)) {
553 return_ACPI_STATUS(AE_OK);
554 }
555
556 /* Execute the _PRW */
557
558 status = acpi_ut_evaluate_object(prw_node, NULL,
559 ACPI_BTYPE_PACKAGE, &pkg_desc);
560 if (ACPI_FAILURE(status)) {
561 return_ACPI_STATUS(AE_OK);
562 }
563
564 /* The returned _PRW package must have at least two elements */
565
566 if (pkg_desc->package.count < 2) {
567 goto cleanup;
568 }
569
570 /* Extract pointers from the input context */
571
572 gpe_device = walk_info->gpe_device;
573 gpe_block = walk_info->gpe_block;
574
575 /*
576 * The _PRW object must return a package, we are only interested
577 * in the first element
578 */
579 obj_desc = pkg_desc->package.elements[0];
580
581 if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
582
583 /* Use FADT-defined GPE device (from definition of _PRW) */
584
585 target_gpe_device = NULL;
586 if (gpe_device) {
587 target_gpe_device = acpi_gbl_fadt_gpe_device;
588 }
589
590 /* Integer is the GPE number in the FADT described GPE blocks */
591
592 gpe_number = (u32)obj_desc->integer.value;
593 } else if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
594
595 /* Package contains a GPE reference and GPE number within a GPE block */
596
597 if ((obj_desc->package.count < 2) ||
598 ((obj_desc->package.elements[0])->common.type !=
599 ACPI_TYPE_LOCAL_REFERENCE) ||
600 ((obj_desc->package.elements[1])->common.type !=
601 ACPI_TYPE_INTEGER)) {
602 goto cleanup;
603 }
604
605 /* Get GPE block reference and decode */
606
607 target_gpe_device =
608 obj_desc->package.elements[0]->reference.node;
609 gpe_number = (u32)obj_desc->package.elements[1]->integer.value;
610 } else {
611 /* Unknown type, just ignore it */
612
613 goto cleanup;
614 }
615
616 /* Get the gpe_event_info for this GPE */
617
618 if (gpe_device) {
619 /*
620 * Is this GPE within this block?
621 *
622 * TRUE if and only if these conditions are true:
623 * 1) The GPE devices match.
624 * 2) The GPE index(number) is within the range of the Gpe Block
625 * associated with the GPE device.
626 */
627 if (gpe_device != target_gpe_device) {
628 goto cleanup;
629 }
630
631 gpe_event_info =
632 acpi_ev_low_get_gpe_info(gpe_number, gpe_block);
633 } else {
634 /* gpe_device is NULL, just match the target_device and gpe_number */
635
636 gpe_event_info =
637 acpi_ev_get_gpe_event_info(target_gpe_device, gpe_number);
638 }
639
640 if (gpe_event_info) {
641 if (!(gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) {
642
643 /* This GPE can wake the system */
644
645 gpe_event_info->flags |= ACPI_GPE_CAN_WAKE;
646 walk_info->count++;
647 }
648 }
649
650 cleanup:
651 acpi_ut_remove_reference(pkg_desc);
652 return_ACPI_STATUS(AE_OK);
653}
diff --git a/drivers/acpi/acpica/evrgnini.c b/drivers/acpi/acpica/evrgnini.c
index 2e3b0334072f..f40d271bf568 100644
--- a/drivers/acpi/acpica/evrgnini.c
+++ b/drivers/acpi/acpica/evrgnini.c
@@ -199,7 +199,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
199 return_ACPI_STATUS(status); 199 return_ACPI_STATUS(status);
200 } 200 }
201 201
202 parent_node = acpi_ns_get_parent_node(region_obj->region.node); 202 parent_node = region_obj->region.node->parent;
203 203
204 /* 204 /*
205 * Get the _SEG and _BBN values from the device upon which the handler 205 * Get the _SEG and _BBN values from the device upon which the handler
@@ -248,7 +248,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
248 break; 248 break;
249 } 249 }
250 250
251 pci_root_node = acpi_ns_get_parent_node(pci_root_node); 251 pci_root_node = pci_root_node->parent;
252 } 252 }
253 253
254 /* PCI root bridge not found, use namespace root node */ 254 /* PCI root bridge not found, use namespace root node */
@@ -280,7 +280,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
280 */ 280 */
281 pci_device_node = region_obj->region.node; 281 pci_device_node = region_obj->region.node;
282 while (pci_device_node && (pci_device_node->type != ACPI_TYPE_DEVICE)) { 282 while (pci_device_node && (pci_device_node->type != ACPI_TYPE_DEVICE)) {
283 pci_device_node = acpi_ns_get_parent_node(pci_device_node); 283 pci_device_node = pci_device_node->parent;
284 } 284 }
285 285
286 if (!pci_device_node) { 286 if (!pci_device_node) {
@@ -521,7 +521,7 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
521 return_ACPI_STATUS(AE_NOT_EXIST); 521 return_ACPI_STATUS(AE_NOT_EXIST);
522 } 522 }
523 523
524 node = acpi_ns_get_parent_node(region_obj->region.node); 524 node = region_obj->region.node->parent;
525 space_id = region_obj->region.space_id; 525 space_id = region_obj->region.space_id;
526 526
527 /* Setup defaults */ 527 /* Setup defaults */
@@ -654,7 +654,7 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
654 654
655 /* This node does not have the handler we need; Pop up one level */ 655 /* This node does not have the handler we need; Pop up one level */
656 656
657 node = acpi_ns_get_parent_node(node); 657 node = node->parent;
658 } 658 }
659 659
660 /* If we get here, there is no handler for this region */ 660 /* If we get here, there is no handler for this region */
diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c
index 4a531cdf7942..14e48add32fa 100644
--- a/drivers/acpi/acpica/evxface.c
+++ b/drivers/acpi/acpica/evxface.c
@@ -691,12 +691,22 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
691 return_ACPI_STATUS(status); 691 return_ACPI_STATUS(status);
692 } 692 }
693 693
694 /* Allocate memory for the handler object */
695
696 handler = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_handler_info));
697 if (!handler) {
698 status = AE_NO_MEMORY;
699 goto unlock_and_exit;
700 }
701
702 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
703
694 /* Ensure that we have a valid GPE number */ 704 /* Ensure that we have a valid GPE number */
695 705
696 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); 706 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number);
697 if (!gpe_event_info) { 707 if (!gpe_event_info) {
698 status = AE_BAD_PARAMETER; 708 status = AE_BAD_PARAMETER;
699 goto unlock_and_exit; 709 goto free_and_exit;
700 } 710 }
701 711
702 /* Make sure that there isn't a handler there already */ 712 /* Make sure that there isn't a handler there already */
@@ -704,24 +714,30 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
704 if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == 714 if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
705 ACPI_GPE_DISPATCH_HANDLER) { 715 ACPI_GPE_DISPATCH_HANDLER) {
706 status = AE_ALREADY_EXISTS; 716 status = AE_ALREADY_EXISTS;
707 goto unlock_and_exit; 717 goto free_and_exit;
708 } 718 }
709 719
710 /* Allocate and init handler object */ 720 /* Allocate and init handler object */
711 721
712 handler = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_handler_info));
713 if (!handler) {
714 status = AE_NO_MEMORY;
715 goto unlock_and_exit;
716 }
717
718 handler->address = address; 722 handler->address = address;
719 handler->context = context; 723 handler->context = context;
720 handler->method_node = gpe_event_info->dispatch.method_node; 724 handler->method_node = gpe_event_info->dispatch.method_node;
725 handler->orig_flags = gpe_event_info->flags &
726 (ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
727
728 /*
729 * If the GPE is associated with a method and it cannot wake up the
730 * system from sleep states, it was enabled automatically during
731 * initialization, so it has to be disabled now to avoid spurious
732 * execution of the handler.
733 */
734
735 if ((handler->orig_flags & ACPI_GPE_DISPATCH_METHOD)
736 && !(gpe_event_info->flags & ACPI_GPE_CAN_WAKE))
737 (void)acpi_raw_disable_gpe(gpe_event_info);
721 738
722 /* Install the handler */ 739 /* Install the handler */
723 740
724 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
725 gpe_event_info->dispatch.handler = handler; 741 gpe_event_info->dispatch.handler = handler;
726 742
727 /* Setup up dispatch flags to indicate handler (vs. method) */ 743 /* Setup up dispatch flags to indicate handler (vs. method) */
@@ -735,6 +751,11 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
735unlock_and_exit: 751unlock_and_exit:
736 (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); 752 (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
737 return_ACPI_STATUS(status); 753 return_ACPI_STATUS(status);
754
755free_and_exit:
756 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
757 ACPI_FREE(handler);
758 goto unlock_and_exit;
738} 759}
739 760
740ACPI_EXPORT_SYMBOL(acpi_install_gpe_handler) 761ACPI_EXPORT_SYMBOL(acpi_install_gpe_handler)
@@ -770,11 +791,17 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
770 return_ACPI_STATUS(AE_BAD_PARAMETER); 791 return_ACPI_STATUS(AE_BAD_PARAMETER);
771 } 792 }
772 793
794 /* Make sure all deferred tasks are completed */
795
796 acpi_os_wait_events_complete(NULL);
797
773 status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); 798 status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
774 if (ACPI_FAILURE(status)) { 799 if (ACPI_FAILURE(status)) {
775 return_ACPI_STATUS(status); 800 return_ACPI_STATUS(status);
776 } 801 }
777 802
803 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
804
778 /* Ensure that we have a valid GPE number */ 805 /* Ensure that we have a valid GPE number */
779 806
780 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); 807 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number);
@@ -798,34 +825,34 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
798 goto unlock_and_exit; 825 goto unlock_and_exit;
799 } 826 }
800 827
801 /* Make sure all deferred tasks are completed */
802
803 (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
804 acpi_os_wait_events_complete(NULL);
805 status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
806 if (ACPI_FAILURE(status)) {
807 return_ACPI_STATUS(status);
808 }
809
810 /* Remove the handler */ 828 /* Remove the handler */
811 829
812 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
813 handler = gpe_event_info->dispatch.handler; 830 handler = gpe_event_info->dispatch.handler;
814 831
815 /* Restore Method node (if any), set dispatch flags */ 832 /* Restore Method node (if any), set dispatch flags */
816 833
817 gpe_event_info->dispatch.method_node = handler->method_node; 834 gpe_event_info->dispatch.method_node = handler->method_node;
818 gpe_event_info->flags &= ~ACPI_GPE_DISPATCH_MASK; /* Clear bits */ 835 gpe_event_info->flags &=
819 if (handler->method_node) { 836 ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
820 gpe_event_info->flags |= ACPI_GPE_DISPATCH_METHOD; 837 gpe_event_info->flags |= handler->orig_flags;
821 } 838
822 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 839 /*
840 * If the GPE was previously associated with a method and it cannot wake
841 * up the system from sleep states, it should be enabled at this point
842 * to restore the post-initialization configuration.
843 */
844
845 if ((handler->orig_flags & ACPI_GPE_DISPATCH_METHOD)
846 && !(gpe_event_info->flags & ACPI_GPE_CAN_WAKE))
847 (void)acpi_raw_enable_gpe(gpe_event_info);
823 848
824 /* Now we can free the handler object */ 849 /* Now we can free the handler object */
825 850
826 ACPI_FREE(handler); 851 ACPI_FREE(handler);
827 852
828 unlock_and_exit: 853unlock_and_exit:
854 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
855
829 (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); 856 (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
830 return_ACPI_STATUS(status); 857 return_ACPI_STATUS(status);
831} 858}
diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c
index 18b3f1468b7d..304825528d48 100644
--- a/drivers/acpi/acpica/evxfevnt.c
+++ b/drivers/acpi/acpica/evxfevnt.c
@@ -213,101 +213,71 @@ ACPI_EXPORT_SYMBOL(acpi_enable_event)
213 213
214/******************************************************************************* 214/*******************************************************************************
215 * 215 *
216 * FUNCTION: acpi_clear_and_enable_gpe 216 * FUNCTION: acpi_gpe_wakeup
217 *
218 * PARAMETERS: gpe_event_info - GPE to enable
219 *
220 * RETURN: Status
221 *
222 * DESCRIPTION: Clear the given GPE from stale events and enable it.
223 *
224 ******************************************************************************/
225static acpi_status
226acpi_clear_and_enable_gpe(struct acpi_gpe_event_info *gpe_event_info)
227{
228 acpi_status status;
229
230 /*
231 * We will only allow a GPE to be enabled if it has either an
232 * associated method (_Lxx/_Exx) or a handler. Otherwise, the
233 * GPE will be immediately disabled by acpi_ev_gpe_dispatch the
234 * first time it fires.
235 */
236 if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) {
237 return_ACPI_STATUS(AE_NO_HANDLER);
238 }
239
240 /* Clear the GPE (of stale events) */
241 status = acpi_hw_clear_gpe(gpe_event_info);
242 if (ACPI_FAILURE(status)) {
243 return_ACPI_STATUS(status);
244 }
245
246 /* Enable the requested GPE */
247 status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE);
248
249 return_ACPI_STATUS(status);
250}
251
252/*******************************************************************************
253 *
254 * FUNCTION: acpi_set_gpe
255 * 217 *
256 * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 218 * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1
257 * gpe_number - GPE level within the GPE block 219 * gpe_number - GPE level within the GPE block
258 * action - ACPI_GPE_ENABLE or ACPI_GPE_DISABLE 220 * Action - Enable or Disable
259 * 221 *
260 * RETURN: Status 222 * RETURN: Status
261 * 223 *
262 * DESCRIPTION: Enable or disable an individual GPE. This function bypasses 224 * DESCRIPTION: Set or clear the GPE's wakeup enable mask bit.
263 * the reference count mechanism used in the acpi_enable_gpe and
264 * acpi_disable_gpe interfaces -- and should be used with care.
265 *
266 * Note: Typically used to disable a runtime GPE for short period of time,
267 * then re-enable it, without disturbing the existing reference counts. This
268 * is useful, for example, in the Embedded Controller (EC) driver.
269 * 225 *
270 ******************************************************************************/ 226 ******************************************************************************/
271acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action) 227acpi_status acpi_gpe_wakeup(acpi_handle gpe_device, u32 gpe_number, u8 action)
272{ 228{
229 acpi_status status = AE_OK;
273 struct acpi_gpe_event_info *gpe_event_info; 230 struct acpi_gpe_event_info *gpe_event_info;
274 acpi_status status; 231 struct acpi_gpe_register_info *gpe_register_info;
275 acpi_cpu_flags flags; 232 acpi_cpu_flags flags;
233 u32 register_bit;
276 234
277 ACPI_FUNCTION_TRACE(acpi_set_gpe); 235 ACPI_FUNCTION_TRACE(acpi_gpe_wakeup);
278 236
279 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 237 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
280 238
281 /* Ensure that we have a valid GPE number */ 239 /* Ensure that we have a valid GPE number */
282 240
283 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); 241 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number);
284 if (!gpe_event_info) { 242 if (!gpe_event_info || !(gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) {
285 status = AE_BAD_PARAMETER; 243 status = AE_BAD_PARAMETER;
286 goto unlock_and_exit; 244 goto unlock_and_exit;
287 } 245 }
288 246
247 gpe_register_info = gpe_event_info->register_info;
248 if (!gpe_register_info) {
249 status = AE_NOT_EXIST;
250 goto unlock_and_exit;
251 }
252
253 register_bit =
254 acpi_hw_get_gpe_register_bit(gpe_event_info, gpe_register_info);
255
289 /* Perform the action */ 256 /* Perform the action */
290 257
291 switch (action) { 258 switch (action) {
292 case ACPI_GPE_ENABLE: 259 case ACPI_GPE_ENABLE:
293 status = acpi_clear_and_enable_gpe(gpe_event_info); 260 ACPI_SET_BIT(gpe_register_info->enable_for_wake,
261 (u8)register_bit);
294 break; 262 break;
295 263
296 case ACPI_GPE_DISABLE: 264 case ACPI_GPE_DISABLE:
297 status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE); 265 ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake,
266 (u8)register_bit);
298 break; 267 break;
299 268
300 default: 269 default:
270 ACPI_ERROR((AE_INFO, "%u, Invalid action", action));
301 status = AE_BAD_PARAMETER; 271 status = AE_BAD_PARAMETER;
302 break; 272 break;
303 } 273 }
304 274
305 unlock_and_exit: 275unlock_and_exit:
306 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 276 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
307 return_ACPI_STATUS(status); 277 return_ACPI_STATUS(status);
308} 278}
309 279
310ACPI_EXPORT_SYMBOL(acpi_set_gpe) 280ACPI_EXPORT_SYMBOL(acpi_gpe_wakeup)
311 281
312/******************************************************************************* 282/*******************************************************************************
313 * 283 *
@@ -315,84 +285,30 @@ ACPI_EXPORT_SYMBOL(acpi_set_gpe)
315 * 285 *
316 * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 286 * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1
317 * gpe_number - GPE level within the GPE block 287 * gpe_number - GPE level within the GPE block
318 * gpe_type - ACPI_GPE_TYPE_RUNTIME or ACPI_GPE_TYPE_WAKE
319 * or both
320 * 288 *
321 * RETURN: Status 289 * RETURN: Status
322 * 290 *
323 * DESCRIPTION: Add a reference to a GPE. On the first reference, the GPE is 291 * DESCRIPTION: Add a reference to a GPE. On the first reference, the GPE is
324 * hardware-enabled (for runtime GPEs), or the GPE register mask 292 * hardware-enabled.
325 * is updated (for wake GPEs).
326 * 293 *
327 ******************************************************************************/ 294 ******************************************************************************/
328acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type) 295acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number)
329{ 296{
330 acpi_status status = AE_OK; 297 acpi_status status = AE_BAD_PARAMETER;
331 struct acpi_gpe_event_info *gpe_event_info; 298 struct acpi_gpe_event_info *gpe_event_info;
332 acpi_cpu_flags flags; 299 acpi_cpu_flags flags;
333 300
334 ACPI_FUNCTION_TRACE(acpi_enable_gpe); 301 ACPI_FUNCTION_TRACE(acpi_enable_gpe);
335 302
336 /* Parameter validation */
337
338 if (!gpe_type || (gpe_type & ~ACPI_GPE_TYPE_WAKE_RUN)) {
339 return_ACPI_STATUS(AE_BAD_PARAMETER);
340 }
341
342 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 303 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
343 304
344 /* Ensure that we have a valid GPE number */ 305 /* Ensure that we have a valid GPE number */
345 306
346 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); 307 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number);
347 if (!gpe_event_info) { 308 if (gpe_event_info) {
348 status = AE_BAD_PARAMETER; 309 status = acpi_raw_enable_gpe(gpe_event_info);
349 goto unlock_and_exit;
350 }
351
352 if (gpe_type & ACPI_GPE_TYPE_RUNTIME) {
353 if (gpe_event_info->runtime_count == ACPI_UINT8_MAX) {
354 status = AE_LIMIT; /* Too many references */
355 goto unlock_and_exit;
356 }
357
358 gpe_event_info->runtime_count++;
359 if (gpe_event_info->runtime_count == 1) {
360 status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
361 if (ACPI_SUCCESS(status)) {
362 status = acpi_clear_and_enable_gpe(gpe_event_info);
363 }
364
365 if (ACPI_FAILURE(status)) {
366 gpe_event_info->runtime_count--;
367 goto unlock_and_exit;
368 }
369 }
370 }
371
372 if (gpe_type & ACPI_GPE_TYPE_WAKE) {
373 /* The GPE must have the ability to wake the system */
374
375 if (!(gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) {
376 status = AE_TYPE;
377 goto unlock_and_exit;
378 }
379
380 if (gpe_event_info->wakeup_count == ACPI_UINT8_MAX) {
381 status = AE_LIMIT; /* Too many references */
382 goto unlock_and_exit;
383 }
384
385 /*
386 * Update the enable mask on the first wakeup reference. Wake GPEs
387 * are only hardware-enabled just before sleeping.
388 */
389 gpe_event_info->wakeup_count++;
390 if (gpe_event_info->wakeup_count == 1) {
391 status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
392 }
393 } 310 }
394 311
395unlock_and_exit:
396 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 312 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
397 return_ACPI_STATUS(status); 313 return_ACPI_STATUS(status);
398} 314}
@@ -404,8 +320,6 @@ ACPI_EXPORT_SYMBOL(acpi_enable_gpe)
404 * 320 *
405 * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 321 * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1
406 * gpe_number - GPE level within the GPE block 322 * gpe_number - GPE level within the GPE block
407 * gpe_type - ACPI_GPE_TYPE_RUNTIME or ACPI_GPE_TYPE_WAKE
408 * or both
409 * 323 *
410 * RETURN: Status 324 * RETURN: Status
411 * 325 *
@@ -414,20 +328,52 @@ ACPI_EXPORT_SYMBOL(acpi_enable_gpe)
414 * the GPE mask bit disabled (for wake GPEs) 328 * the GPE mask bit disabled (for wake GPEs)
415 * 329 *
416 ******************************************************************************/ 330 ******************************************************************************/
417acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type) 331acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number)
418{ 332{
419 acpi_status status = AE_OK; 333 acpi_status status = AE_BAD_PARAMETER;
420 struct acpi_gpe_event_info *gpe_event_info; 334 struct acpi_gpe_event_info *gpe_event_info;
421 acpi_cpu_flags flags; 335 acpi_cpu_flags flags;
422 336
423 ACPI_FUNCTION_TRACE(acpi_disable_gpe); 337 ACPI_FUNCTION_TRACE(acpi_disable_gpe);
424 338
425 /* Parameter validation */ 339 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
340
341 /* Ensure that we have a valid GPE number */
426 342
427 if (!gpe_type || (gpe_type & ~ACPI_GPE_TYPE_WAKE_RUN)) { 343 gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number);
428 return_ACPI_STATUS(AE_BAD_PARAMETER); 344 if (gpe_event_info) {
345 status = acpi_raw_disable_gpe(gpe_event_info) ;
429 } 346 }
430 347
348 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
349 return_ACPI_STATUS(status);
350}
351ACPI_EXPORT_SYMBOL(acpi_disable_gpe)
352
353/*******************************************************************************
354 *
355 * FUNCTION: acpi_gpe_can_wake
356 *
357 * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1
358 * gpe_number - GPE level within the GPE block
359 *
360 * RETURN: Status
361 *
362 * DESCRIPTION: Set the ACPI_GPE_CAN_WAKE flag for the given GPE. If the GPE
363 * has a corresponding method and is currently enabled, disable it
364 * (GPEs with corresponding methods are enabled unconditionally
365 * during initialization, but GPEs that can wake up are expected
366 * to be initially disabled).
367 *
368 ******************************************************************************/
369acpi_status acpi_gpe_can_wake(acpi_handle gpe_device, u32 gpe_number)
370{
371 acpi_status status = AE_OK;
372 struct acpi_gpe_event_info *gpe_event_info;
373 acpi_cpu_flags flags;
374
375 ACPI_FUNCTION_TRACE(acpi_gpe_can_wake);
376
431 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 377 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
432 378
433 /* Ensure that we have a valid GPE number */ 379 /* Ensure that we have a valid GPE number */
@@ -438,51 +384,20 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type
438 goto unlock_and_exit; 384 goto unlock_and_exit;
439 } 385 }
440 386
441 /* Hardware-disable a runtime GPE on removal of the last reference */ 387 if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) {
442 388 goto unlock_and_exit;
443 if (gpe_type & ACPI_GPE_TYPE_RUNTIME) {
444 if (!gpe_event_info->runtime_count) {
445 status = AE_LIMIT; /* There are no references to remove */
446 goto unlock_and_exit;
447 }
448
449 gpe_event_info->runtime_count--;
450 if (!gpe_event_info->runtime_count) {
451 status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
452 if (ACPI_SUCCESS(status)) {
453 status = acpi_hw_low_set_gpe(gpe_event_info,
454 ACPI_GPE_DISABLE);
455 }
456
457 if (ACPI_FAILURE(status)) {
458 gpe_event_info->runtime_count++;
459 goto unlock_and_exit;
460 }
461 }
462 } 389 }
463 390
464 /* 391 gpe_event_info->flags |= ACPI_GPE_CAN_WAKE;
465 * Update masks for wake GPE on removal of the last reference. 392 if (gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD) {
466 * No need to hardware-disable wake GPEs here, they are not currently 393 (void)acpi_raw_disable_gpe(gpe_event_info);
467 * enabled.
468 */
469 if (gpe_type & ACPI_GPE_TYPE_WAKE) {
470 if (!gpe_event_info->wakeup_count) {
471 status = AE_LIMIT; /* There are no references to remove */
472 goto unlock_and_exit;
473 }
474
475 gpe_event_info->wakeup_count--;
476 if (!gpe_event_info->wakeup_count) {
477 status = acpi_ev_update_gpe_enable_masks(gpe_event_info);
478 }
479 } 394 }
480 395
481unlock_and_exit: 396unlock_and_exit:
482 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 397 acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
483 return_ACPI_STATUS(status); 398 return_ACPI_STATUS(status);
484} 399}
485ACPI_EXPORT_SYMBOL(acpi_disable_gpe) 400ACPI_EXPORT_SYMBOL(acpi_gpe_can_wake)
486 401
487/******************************************************************************* 402/*******************************************************************************
488 * 403 *
@@ -800,7 +715,7 @@ acpi_install_gpe_block(acpi_handle gpe_device,
800 715
801 obj_desc->device.gpe_block = gpe_block; 716 obj_desc->device.gpe_block = gpe_block;
802 717
803 /* Run the _PRW methods and enable the runtime GPEs in the new block */ 718 /* Enable the runtime GPEs in the new block */
804 719
805 status = acpi_ev_initialize_gpe_block(node, gpe_block); 720 status = acpi_ev_initialize_gpe_block(node, gpe_block);
806 721
diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c
index 008621c5ad85..18832205b631 100644
--- a/drivers/acpi/acpica/exconfig.c
+++ b/drivers/acpi/acpica/exconfig.c
@@ -120,7 +120,7 @@ acpi_ex_add_table(u32 table_index,
120 acpi_ns_exec_module_code_list(); 120 acpi_ns_exec_module_code_list();
121 acpi_ex_enter_interpreter(); 121 acpi_ex_enter_interpreter();
122 122
123 /* Update GPEs for any new _PRW or _Lxx/_Exx methods. Ignore errors */ 123 /* Update GPEs for any new _Lxx/_Exx methods. Ignore errors */
124 124
125 status = acpi_tb_get_owner_id(table_index, &owner_id); 125 status = acpi_tb_get_owner_id(table_index, &owner_id);
126 if (ACPI_SUCCESS(status)) { 126 if (ACPI_SUCCESS(status)) {
diff --git a/drivers/acpi/acpica/exdump.c b/drivers/acpi/acpica/exdump.c
index d39d438ba1e3..f067bbb0d961 100644
--- a/drivers/acpi/acpica/exdump.c
+++ b/drivers/acpi/acpica/exdump.c
@@ -742,7 +742,7 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,
742 } 742 }
743 743
744 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 744 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
745 "**** Start operand dump for opcode [%s], %d operands\n", 745 "**** Start operand dump for opcode [%s], %u operands\n",
746 opcode_name, num_operands)); 746 opcode_name, num_operands));
747 747
748 if (num_operands == 0) { 748 if (num_operands == 0) {
@@ -812,7 +812,7 @@ void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags)
812 acpi_ex_out_string("Type", acpi_ut_get_type_name(node->type)); 812 acpi_ex_out_string("Type", acpi_ut_get_type_name(node->type));
813 acpi_ex_out_pointer("Attached Object", 813 acpi_ex_out_pointer("Attached Object",
814 acpi_ns_get_attached_object(node)); 814 acpi_ns_get_attached_object(node));
815 acpi_ex_out_pointer("Parent", acpi_ns_get_parent_node(node)); 815 acpi_ex_out_pointer("Parent", node->parent);
816 816
817 acpi_ex_dump_object(ACPI_CAST_PTR(union acpi_operand_object, node), 817 acpi_ex_dump_object(ACPI_CAST_PTR(union acpi_operand_object, node),
818 acpi_ex_dump_node); 818 acpi_ex_dump_node);
@@ -945,7 +945,7 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
945 945
946 case ACPI_TYPE_PACKAGE: 946 case ACPI_TYPE_PACKAGE:
947 947
948 acpi_os_printf("[Package] Contains %d Elements:\n", 948 acpi_os_printf("[Package] Contains %u Elements:\n",
949 obj_desc->package.count); 949 obj_desc->package.count);
950 950
951 for (i = 0; i < obj_desc->package.count; i++) { 951 for (i = 0; i < obj_desc->package.count; i++) {
diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c
index a6dc26f0b3be..047217303a4b 100644
--- a/drivers/acpi/acpica/exfldio.c
+++ b/drivers/acpi/acpica/exfldio.c
@@ -534,13 +534,13 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
534 if (ACPI_SUCCESS(status)) { 534 if (ACPI_SUCCESS(status)) {
535 if (read_write == ACPI_READ) { 535 if (read_write == ACPI_READ) {
536 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 536 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
537 "Value Read %8.8X%8.8X, Width %d\n", 537 "Value Read %8.8X%8.8X, Width %u\n",
538 ACPI_FORMAT_UINT64(*value), 538 ACPI_FORMAT_UINT64(*value),
539 obj_desc->common_field. 539 obj_desc->common_field.
540 access_byte_width)); 540 access_byte_width));
541 } else { 541 } else {
542 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 542 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
543 "Value Written %8.8X%8.8X, Width %d\n", 543 "Value Written %8.8X%8.8X, Width %u\n",
544 ACPI_FORMAT_UINT64(*value), 544 ACPI_FORMAT_UINT64(*value),
545 obj_desc->common_field. 545 obj_desc->common_field.
546 access_byte_width)); 546 access_byte_width));
diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c
index 25059dace0ad..98a331d2249b 100644
--- a/drivers/acpi/acpica/exprep.c
+++ b/drivers/acpi/acpica/exprep.c
@@ -108,11 +108,11 @@ acpi_ex_generate_access(u32 field_bit_offset,
108 field_byte_length = field_byte_end_offset - field_byte_offset; 108 field_byte_length = field_byte_end_offset - field_byte_offset;
109 109
110 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 110 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
111 "Bit length %d, Bit offset %d\n", 111 "Bit length %u, Bit offset %u\n",
112 field_bit_length, field_bit_offset)); 112 field_bit_length, field_bit_offset));
113 113
114 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 114 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
115 "Byte Length %d, Byte Offset %d, End Offset %d\n", 115 "Byte Length %u, Byte Offset %u, End Offset %u\n",
116 field_byte_length, field_byte_offset, 116 field_byte_length, field_byte_offset,
117 field_byte_end_offset)); 117 field_byte_end_offset));
118 118
@@ -147,11 +147,11 @@ acpi_ex_generate_access(u32 field_bit_offset,
147 accesses = field_end_offset - field_start_offset; 147 accesses = field_end_offset - field_start_offset;
148 148
149 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 149 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
150 "AccessWidth %d end is within region\n", 150 "AccessWidth %u end is within region\n",
151 access_byte_width)); 151 access_byte_width));
152 152
153 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 153 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
154 "Field Start %d, Field End %d -- requires %d accesses\n", 154 "Field Start %u, Field End %u -- requires %u accesses\n",
155 field_start_offset, field_end_offset, 155 field_start_offset, field_end_offset,
156 accesses)); 156 accesses));
157 157
@@ -159,7 +159,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
159 159
160 if (accesses <= 1) { 160 if (accesses <= 1) {
161 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 161 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
162 "Entire field can be accessed with one operation of size %d\n", 162 "Entire field can be accessed with one operation of size %u\n",
163 access_byte_width)); 163 access_byte_width));
164 return_VALUE(access_byte_width); 164 return_VALUE(access_byte_width);
165 } 165 }
@@ -174,7 +174,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
174 } 174 }
175 } else { 175 } else {
176 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 176 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
177 "AccessWidth %d end is NOT within region\n", 177 "AccessWidth %u end is NOT within region\n",
178 access_byte_width)); 178 access_byte_width));
179 if (access_byte_width == 1) { 179 if (access_byte_width == 1) {
180 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 180 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
@@ -190,7 +190,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
190 * previous access 190 * previous access
191 */ 191 */
192 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 192 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
193 "Backing off to previous optimal access width of %d\n", 193 "Backing off to previous optimal access width of %u\n",
194 minimum_access_width)); 194 minimum_access_width));
195 return_VALUE(minimum_access_width); 195 return_VALUE(minimum_access_width);
196 } 196 }
@@ -385,15 +385,6 @@ acpi_ex_prep_common_field_object(union acpi_operand_object *obj_desc,
385 (field_bit_position - 385 (field_bit_position -
386 ACPI_MUL_8(obj_desc->common_field.base_byte_offset)); 386 ACPI_MUL_8(obj_desc->common_field.base_byte_offset));
387 387
388 /*
389 * Does the entire field fit within a single field access element? (datum)
390 * (i.e., without crossing a datum boundary)
391 */
392 if ((obj_desc->common_field.start_field_bit_offset +
393 field_bit_length) <= (u16) access_bit_width) {
394 obj_desc->common.flags |= AOPOBJ_SINGLE_DATUM;
395 }
396
397 return_ACPI_STATUS(AE_OK); 388 return_ACPI_STATUS(AE_OK);
398} 389}
399 390
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c
index 531000fc77d2..8819d2ac5aee 100644
--- a/drivers/acpi/acpica/exregion.c
+++ b/drivers/acpi/acpica/exregion.c
@@ -194,7 +194,7 @@ acpi_ex_system_memory_space_handler(u32 function,
194 ((u64) address - (u64) mem_info->mapped_physical_address); 194 ((u64) address - (u64) mem_info->mapped_physical_address);
195 195
196 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 196 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
197 "System-Memory (width %d) R/W %d Address=%8.8X%8.8X\n", 197 "System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n",
198 bit_width, function, 198 bit_width, function,
199 ACPI_FORMAT_NATIVE_UINT(address))); 199 ACPI_FORMAT_NATIVE_UINT(address)));
200 200
@@ -297,7 +297,7 @@ acpi_ex_system_io_space_handler(u32 function,
297 ACPI_FUNCTION_TRACE(ex_system_io_space_handler); 297 ACPI_FUNCTION_TRACE(ex_system_io_space_handler);
298 298
299 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 299 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
300 "System-IO (width %d) R/W %d Address=%8.8X%8.8X\n", 300 "System-IO (width %u) R/W %u Address=%8.8X%8.8X\n",
301 bit_width, function, 301 bit_width, function,
302 ACPI_FORMAT_NATIVE_UINT(address))); 302 ACPI_FORMAT_NATIVE_UINT(address)));
303 303
@@ -373,7 +373,7 @@ acpi_ex_pci_config_space_handler(u32 function,
373 pci_register = (u16) (u32) address; 373 pci_register = (u16) (u32) address;
374 374
375 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 375 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
376 "Pci-Config %d (%d) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n", 376 "Pci-Config %u (%u) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n",
377 function, bit_width, pci_id->segment, pci_id->bus, 377 function, bit_width, pci_id->segment, pci_id->bus,
378 pci_id->device, pci_id->function, pci_register)); 378 pci_id->device, pci_id->function, pci_register));
379 379
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c
index 3450309c2786..14750db2a1b8 100644
--- a/drivers/acpi/acpica/hwgpe.c
+++ b/drivers/acpi/acpica/hwgpe.c
@@ -57,7 +57,7 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
57 57
58/****************************************************************************** 58/******************************************************************************
59 * 59 *
60 * FUNCTION: acpi_hw_gpe_register_bit 60 * FUNCTION: acpi_hw_get_gpe_register_bit
61 * 61 *
62 * PARAMETERS: gpe_event_info - Info block for the GPE 62 * PARAMETERS: gpe_event_info - Info block for the GPE
63 * gpe_register_info - Info block for the GPE register 63 * gpe_register_info - Info block for the GPE register
@@ -69,7 +69,7 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
69 * 69 *
70 ******************************************************************************/ 70 ******************************************************************************/
71 71
72u32 acpi_hw_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info, 72u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info,
73 struct acpi_gpe_register_info *gpe_register_info) 73 struct acpi_gpe_register_info *gpe_register_info)
74{ 74{
75 return (u32)1 << (gpe_event_info->gpe_number - 75 return (u32)1 << (gpe_event_info->gpe_number -
@@ -115,7 +115,7 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action)
115 115
116 /* Set ot clear just the bit that corresponds to this GPE */ 116 /* Set ot clear just the bit that corresponds to this GPE */
117 117
118 register_bit = acpi_hw_gpe_register_bit(gpe_event_info, 118 register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info,
119 gpe_register_info); 119 gpe_register_info);
120 switch (action) { 120 switch (action) {
121 case ACPI_GPE_COND_ENABLE: 121 case ACPI_GPE_COND_ENABLE:
@@ -143,31 +143,6 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 action)
143 143
144/****************************************************************************** 144/******************************************************************************
145 * 145 *
146 * FUNCTION: acpi_hw_write_gpe_enable_reg
147 *
148 * PARAMETERS: gpe_event_info - Info block for the GPE to be enabled
149 *
150 * RETURN: Status
151 *
152 * DESCRIPTION: Write a GPE enable register. Note: The bit for this GPE must
153 * already be cleared or set in the parent register
154 * enable_for_run mask.
155 *
156 ******************************************************************************/
157
158acpi_status
159acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info * gpe_event_info)
160{
161 acpi_status status;
162
163 ACPI_FUNCTION_ENTRY();
164
165 status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_COND_ENABLE);
166 return (status);
167}
168
169/******************************************************************************
170 *
171 * FUNCTION: acpi_hw_clear_gpe 146 * FUNCTION: acpi_hw_clear_gpe
172 * 147 *
173 * PARAMETERS: gpe_event_info - Info block for the GPE to be cleared 148 * PARAMETERS: gpe_event_info - Info block for the GPE to be cleared
@@ -193,7 +168,7 @@ acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
193 return (AE_NOT_EXIST); 168 return (AE_NOT_EXIST);
194 } 169 }
195 170
196 register_bit = acpi_hw_gpe_register_bit(gpe_event_info, 171 register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info,
197 gpe_register_info); 172 gpe_register_info);
198 173
199 /* 174 /*
@@ -241,7 +216,7 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info,
241 216
242 /* Get the register bitmask for this GPE */ 217 /* Get the register bitmask for this GPE */
243 218
244 register_bit = acpi_hw_gpe_register_bit(gpe_event_info, 219 register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info,
245 gpe_register_info); 220 gpe_register_info);
246 221
247 /* GPE currently enabled? (enabled for runtime?) */ 222 /* GPE currently enabled? (enabled for runtime?) */
diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c
index 36eb803dd9d0..3796811276ac 100644
--- a/drivers/acpi/acpica/hwsleep.c
+++ b/drivers/acpi/acpica/hwsleep.c
@@ -307,7 +307,7 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
307 return_ACPI_STATUS(status); 307 return_ACPI_STATUS(status);
308 } 308 }
309 ACPI_DEBUG_PRINT((ACPI_DB_INIT, 309 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
310 "Entering sleep state [S%d]\n", sleep_state)); 310 "Entering sleep state [S%u]\n", sleep_state));
311 311
312 /* Clear the SLP_EN and SLP_TYP fields */ 312 /* Clear the SLP_EN and SLP_TYP fields */
313 313
diff --git a/drivers/acpi/acpica/nsaccess.c b/drivers/acpi/acpica/nsaccess.c
index 3a2814676ac3..0cd925be5fc1 100644
--- a/drivers/acpi/acpica/nsaccess.c
+++ b/drivers/acpi/acpica/nsaccess.c
@@ -338,8 +338,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
338 */ 338 */
339 while (!acpi_ns_opens_scope(prefix_node->type) && 339 while (!acpi_ns_opens_scope(prefix_node->type) &&
340 prefix_node->type != ACPI_TYPE_ANY) { 340 prefix_node->type != ACPI_TYPE_ANY) {
341 prefix_node = 341 prefix_node = prefix_node->parent;
342 acpi_ns_get_parent_node(prefix_node);
343 } 342 }
344 } 343 }
345 } 344 }
@@ -419,7 +418,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
419 /* Backup to the parent node */ 418 /* Backup to the parent node */
420 419
421 num_carats++; 420 num_carats++;
422 this_node = acpi_ns_get_parent_node(this_node); 421 this_node = this_node->parent;
423 if (!this_node) { 422 if (!this_node) {
424 423
425 /* Current scope has no parent scope */ 424 /* Current scope has no parent scope */
@@ -433,7 +432,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
433 432
434 if (search_parent_flag == ACPI_NS_NO_UPSEARCH) { 433 if (search_parent_flag == ACPI_NS_NO_UPSEARCH) {
435 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 434 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
436 "Search scope is [%4.4s], path has %d carat(s)\n", 435 "Search scope is [%4.4s], path has %u carat(s)\n",
437 acpi_ut_get_node_name 436 acpi_ut_get_node_name
438 (this_node), num_carats)); 437 (this_node), num_carats));
439 } 438 }
@@ -495,7 +494,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
495 path++; 494 path++;
496 495
497 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 496 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
498 "Multi Pathname (%d Segments, Flags=%X)\n", 497 "Multi Pathname (%u Segments, Flags=%X)\n",
499 num_segments, flags)); 498 num_segments, flags));
500 break; 499 break;
501 500
diff --git a/drivers/acpi/acpica/nsalloc.c b/drivers/acpi/acpica/nsalloc.c
index 982269c1fa48..1e5ff803d9ad 100644
--- a/drivers/acpi/acpica/nsalloc.c
+++ b/drivers/acpi/acpica/nsalloc.c
@@ -159,7 +159,7 @@ void acpi_ns_remove_node(struct acpi_namespace_node *node)
159 159
160 ACPI_FUNCTION_TRACE_PTR(ns_remove_node, node); 160 ACPI_FUNCTION_TRACE_PTR(ns_remove_node, node);
161 161
162 parent_node = acpi_ns_get_parent_node(node); 162 parent_node = node->parent;
163 163
164 prev_node = NULL; 164 prev_node = NULL;
165 next_node = parent_node->child; 165 next_node = parent_node->child;
@@ -168,29 +168,20 @@ void acpi_ns_remove_node(struct acpi_namespace_node *node)
168 168
169 while (next_node != node) { 169 while (next_node != node) {
170 prev_node = next_node; 170 prev_node = next_node;
171 next_node = prev_node->peer; 171 next_node = next_node->peer;
172 } 172 }
173 173
174 if (prev_node) { 174 if (prev_node) {
175 175
176 /* Node is not first child, unlink it */ 176 /* Node is not first child, unlink it */
177 177
178 prev_node->peer = next_node->peer; 178 prev_node->peer = node->peer;
179 if (next_node->flags & ANOBJ_END_OF_PEER_LIST) {
180 prev_node->flags |= ANOBJ_END_OF_PEER_LIST;
181 }
182 } else { 179 } else {
183 /* Node is first child (has no previous peer) */ 180 /*
184 181 * Node is first child (has no previous peer).
185 if (next_node->flags & ANOBJ_END_OF_PEER_LIST) { 182 * Link peer list to parent
186 183 */
187 /* No peers at all */ 184 parent_node->child = node->peer;
188
189 parent_node->child = NULL;
190 } else { /* Link peer list to parent */
191
192 parent_node->child = next_node->peer;
193 }
194 } 185 }
195 186
196 /* Delete the node and any attached objects */ 187 /* Delete the node and any attached objects */
@@ -228,33 +219,42 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp
228 219
229 ACPI_FUNCTION_TRACE(ns_install_node); 220 ACPI_FUNCTION_TRACE(ns_install_node);
230 221
231 /*
232 * Get the owner ID from the Walk state. The owner ID is used to track
233 * table deletion and deletion of objects created by methods.
234 */
235 if (walk_state) { 222 if (walk_state) {
223 /*
224 * Get the owner ID from the Walk state. The owner ID is used to
225 * track table deletion and deletion of objects created by methods.
226 */
236 owner_id = walk_state->owner_id; 227 owner_id = walk_state->owner_id;
228
229 if ((walk_state->method_desc) &&
230 (parent_node != walk_state->method_node)) {
231 /*
232 * A method is creating a new node that is not a child of the
233 * method (it is non-local). Mark the executing method as having
234 * modified the namespace. This is used for cleanup when the
235 * method exits.
236 */
237 walk_state->method_desc->method.flags |=
238 AOPOBJ_MODIFIED_NAMESPACE;
239 }
237 } 240 }
238 241
239 /* Link the new entry into the parent and existing children */ 242 /* Link the new entry into the parent and existing children */
240 243
244 node->peer = NULL;
245 node->parent = parent_node;
241 child_node = parent_node->child; 246 child_node = parent_node->child;
247
242 if (!child_node) { 248 if (!child_node) {
243 parent_node->child = node; 249 parent_node->child = node;
244 node->flags |= ANOBJ_END_OF_PEER_LIST;
245 node->peer = parent_node;
246 } else { 250 } else {
247 while (!(child_node->flags & ANOBJ_END_OF_PEER_LIST)) { 251 /* Add node to the end of the peer list */
252
253 while (child_node->peer) {
248 child_node = child_node->peer; 254 child_node = child_node->peer;
249 } 255 }
250 256
251 child_node->peer = node; 257 child_node->peer = node;
252
253 /* Clear end-of-list flag */
254
255 child_node->flags &= ~ANOBJ_END_OF_PEER_LIST;
256 node->flags |= ANOBJ_END_OF_PEER_LIST;
257 node->peer = parent_node;
258 } 258 }
259 259
260 /* Init the new entry */ 260 /* Init the new entry */
@@ -288,9 +288,8 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp
288 288
289void acpi_ns_delete_children(struct acpi_namespace_node *parent_node) 289void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
290{ 290{
291 struct acpi_namespace_node *child_node;
292 struct acpi_namespace_node *next_node; 291 struct acpi_namespace_node *next_node;
293 u8 flags; 292 struct acpi_namespace_node *node_to_delete;
294 293
295 ACPI_FUNCTION_TRACE_PTR(ns_delete_children, parent_node); 294 ACPI_FUNCTION_TRACE_PTR(ns_delete_children, parent_node);
296 295
@@ -298,37 +297,26 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
298 return_VOID; 297 return_VOID;
299 } 298 }
300 299
301 /* If no children, all done! */
302
303 child_node = parent_node->child;
304 if (!child_node) {
305 return_VOID;
306 }
307
308 /* Deallocate all children at this level */ 300 /* Deallocate all children at this level */
309 301
310 do { 302 next_node = parent_node->child;
311 303 while (next_node) {
312 /* Get the things we need */
313
314 next_node = child_node->peer;
315 flags = child_node->flags;
316 304
317 /* Grandchildren should have all been deleted already */ 305 /* Grandchildren should have all been deleted already */
318 306
319 if (child_node->child) { 307 if (next_node->child) {
320 ACPI_ERROR((AE_INFO, "Found a grandchild! P=%p C=%p", 308 ACPI_ERROR((AE_INFO, "Found a grandchild! P=%p C=%p",
321 parent_node, child_node)); 309 parent_node, next_node));
322 } 310 }
323 311
324 /* 312 /*
325 * Delete this child node and move on to the next child in the list. 313 * Delete this child node and move on to the next child in the list.
326 * No need to unlink the node since we are deleting the entire branch. 314 * No need to unlink the node since we are deleting the entire branch.
327 */ 315 */
328 acpi_ns_delete_node(child_node); 316 node_to_delete = next_node;
329 child_node = next_node; 317 next_node = next_node->peer;
330 318 acpi_ns_delete_node(node_to_delete);
331 } while (!(flags & ANOBJ_END_OF_PEER_LIST)); 319 };
332 320
333 /* Clear the parent's child pointer */ 321 /* Clear the parent's child pointer */
334 322
@@ -405,7 +393,7 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
405 393
406 /* Move up the tree to the grandparent */ 394 /* Move up the tree to the grandparent */
407 395
408 parent_node = acpi_ns_get_parent_node(parent_node); 396 parent_node = parent_node->parent;
409 } 397 }
410 } 398 }
411 399
@@ -510,7 +498,7 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
510 498
511 /* Move up the tree to the grandparent */ 499 /* Move up the tree to the grandparent */
512 500
513 parent_node = acpi_ns_get_parent_node(parent_node); 501 parent_node = parent_node->parent;
514 } 502 }
515 } 503 }
516 504
diff --git a/drivers/acpi/acpica/nsdump.c b/drivers/acpi/acpica/nsdump.c
index 2110cc2360f0..a54dc39e304b 100644
--- a/drivers/acpi/acpica/nsdump.c
+++ b/drivers/acpi/acpica/nsdump.c
@@ -441,7 +441,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
441 return (AE_OK); 441 return (AE_OK);
442 } 442 }
443 443
444 acpi_os_printf("(R%d)", obj_desc->common.reference_count); 444 acpi_os_printf("(R%u)", obj_desc->common.reference_count);
445 445
446 switch (type) { 446 switch (type) {
447 case ACPI_TYPE_METHOD: 447 case ACPI_TYPE_METHOD:
diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c
index 4e5272c313e0..660a2728908d 100644
--- a/drivers/acpi/acpica/nsinit.c
+++ b/drivers/acpi/acpica/nsinit.c
@@ -103,8 +103,8 @@ acpi_status acpi_ns_initialize_objects(void)
103 } 103 }
104 104
105 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 105 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
106 "\nInitialized %hd/%hd Regions %hd/%hd Fields %hd/%hd " 106 "\nInitialized %u/%u Regions %u/%u Fields %u/%u "
107 "Buffers %hd/%hd Packages (%hd nodes)\n", 107 "Buffers %u/%u Packages (%u nodes)\n",
108 info.op_region_init, info.op_region_count, 108 info.op_region_init, info.op_region_count,
109 info.field_init, info.field_count, 109 info.field_init, info.field_count,
110 info.buffer_init, info.buffer_count, 110 info.buffer_init, info.buffer_count,
@@ -112,9 +112,9 @@ acpi_status acpi_ns_initialize_objects(void)
112 info.object_count)); 112 info.object_count));
113 113
114 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 114 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
115 "%hd Control Methods found\n", info.method_count)); 115 "%u Control Methods found\n", info.method_count));
116 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 116 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
117 "%hd Op Regions found\n", info.op_region_count)); 117 "%u Op Regions found\n", info.op_region_count));
118 118
119 return_ACPI_STATUS(AE_OK); 119 return_ACPI_STATUS(AE_OK);
120} 120}
@@ -208,8 +208,8 @@ acpi_status acpi_ns_initialize_devices(void)
208 } 208 }
209 209
210 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 210 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
211 "\nExecuted %hd _INI methods requiring %hd _STA executions " 211 "\nExecuted %u _INI methods requiring %u _STA executions "
212 "(examined %hd objects)\n", 212 "(examined %u objects)\n",
213 info.num_INI, info.num_STA, info.device_count)); 213 info.num_INI, info.num_STA, info.device_count));
214 214
215 return_ACPI_STATUS(status); 215 return_ACPI_STATUS(status);
@@ -410,7 +410,7 @@ acpi_ns_find_ini_methods(acpi_handle obj_handle,
410 * The only _INI methods that we care about are those that are 410 * The only _INI methods that we care about are those that are
411 * present under Device, Processor, and Thermal objects. 411 * present under Device, Processor, and Thermal objects.
412 */ 412 */
413 parent_node = acpi_ns_get_parent_node(node); 413 parent_node = node->parent;
414 switch (parent_node->type) { 414 switch (parent_node->type) {
415 case ACPI_TYPE_DEVICE: 415 case ACPI_TYPE_DEVICE:
416 case ACPI_TYPE_PROCESSOR: 416 case ACPI_TYPE_PROCESSOR:
@@ -420,7 +420,7 @@ acpi_ns_find_ini_methods(acpi_handle obj_handle,
420 420
421 while (parent_node) { 421 while (parent_node) {
422 parent_node->flags |= ANOBJ_SUBTREE_HAS_INI; 422 parent_node->flags |= ANOBJ_SUBTREE_HAS_INI;
423 parent_node = acpi_ns_get_parent_node(parent_node); 423 parent_node = parent_node->parent;
424 } 424 }
425 break; 425 break;
426 426
diff --git a/drivers/acpi/acpica/nsnames.c b/drivers/acpi/acpica/nsnames.c
index 7dea0031605c..d3104af57e13 100644
--- a/drivers/acpi/acpica/nsnames.c
+++ b/drivers/acpi/acpica/nsnames.c
@@ -93,7 +93,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
93 /* Put the name into the buffer */ 93 /* Put the name into the buffer */
94 94
95 ACPI_MOVE_32_TO_32((name_buffer + index), &parent_node->name); 95 ACPI_MOVE_32_TO_32((name_buffer + index), &parent_node->name);
96 parent_node = acpi_ns_get_parent_node(parent_node); 96 parent_node = parent_node->parent;
97 97
98 /* Prefix name with the path separator */ 98 /* Prefix name with the path separator */
99 99
@@ -198,7 +198,7 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
198 return 0; 198 return 0;
199 } 199 }
200 size += ACPI_PATH_SEGMENT_LENGTH; 200 size += ACPI_PATH_SEGMENT_LENGTH;
201 next_node = acpi_ns_get_parent_node(next_node); 201 next_node = next_node->parent;
202 } 202 }
203 203
204 if (!size) { 204 if (!size) {
diff --git a/drivers/acpi/acpica/nsparse.c b/drivers/acpi/acpica/nsparse.c
index 27cda52c76bc..5808c89e9fac 100644
--- a/drivers/acpi/acpica/nsparse.c
+++ b/drivers/acpi/acpica/nsparse.c
@@ -136,8 +136,8 @@ acpi_ns_one_complete_parse(u32 pass_number,
136 136
137 /* Parse the AML */ 137 /* Parse the AML */
138 138
139 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "*PARSE* pass %d parse\n", 139 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "*PARSE* pass %u parse\n",
140 (unsigned)pass_number)); 140 pass_number));
141 status = acpi_ps_parse_aml(walk_state); 141 status = acpi_ps_parse_aml(walk_state);
142 142
143 cleanup: 143 cleanup:
diff --git a/drivers/acpi/acpica/nsrepair.c b/drivers/acpi/acpica/nsrepair.c
index d4be37751be4..d1c136692667 100644
--- a/drivers/acpi/acpica/nsrepair.c
+++ b/drivers/acpi/acpica/nsrepair.c
@@ -556,7 +556,7 @@ acpi_ns_repair_null_element(struct acpi_predefined_data *data,
556 556
557 /* Need an Integer - create a zero-value integer */ 557 /* Need an Integer - create a zero-value integer */
558 558
559 new_object = acpi_ut_create_integer_object(0); 559 new_object = acpi_ut_create_integer_object((u64)0);
560 } else if (expected_btypes & ACPI_RTYPE_STRING) { 560 } else if (expected_btypes & ACPI_RTYPE_STRING) {
561 561
562 /* Need a String - create a NULL string */ 562 /* Need a String - create a NULL string */
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c
index 61bd0f6755d2..4009498fbabd 100644
--- a/drivers/acpi/acpica/nsrepair2.c
+++ b/drivers/acpi/acpica/nsrepair2.c
@@ -112,6 +112,13 @@ acpi_ns_sort_list(union acpi_operand_object **elements,
112 * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs 112 * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs
113 * _PSS: Sort the list descending by Power 113 * _PSS: Sort the list descending by Power
114 * _TSS: Sort the list descending by Power 114 * _TSS: Sort the list descending by Power
115 *
116 * Names that must be packages, but cannot be sorted:
117 *
118 * _BCL: Values are tied to the Package index where they appear, and cannot
119 * be moved or sorted. These index values are used for _BQC and _BCM.
120 * However, we can fix the case where a buffer is returned, by converting
121 * it to a Package of integers.
115 */ 122 */
116static const struct acpi_repair_info acpi_ns_repairable_names[] = { 123static const struct acpi_repair_info acpi_ns_repairable_names[] = {
117 {"_ALR", acpi_ns_repair_ALR}, 124 {"_ALR", acpi_ns_repair_ALR},
diff --git a/drivers/acpi/acpica/nssearch.c b/drivers/acpi/acpica/nssearch.c
index a8e42b5e9463..41102a84272f 100644
--- a/drivers/acpi/acpica/nssearch.c
+++ b/drivers/acpi/acpica/nssearch.c
@@ -152,17 +152,6 @@ acpi_ns_search_one_scope(u32 target_name,
152 return_ACPI_STATUS(AE_OK); 152 return_ACPI_STATUS(AE_OK);
153 } 153 }
154 154
155 /*
156 * The last entry in the list points back to the parent,
157 * so a flag is used to indicate the end-of-list
158 */
159 if (node->flags & ANOBJ_END_OF_PEER_LIST) {
160
161 /* Searched entire list, we are done */
162
163 break;
164 }
165
166 /* Didn't match name, move on to the next peer object */ 155 /* Didn't match name, move on to the next peer object */
167 156
168 node = node->peer; 157 node = node->peer;
@@ -217,7 +206,7 @@ acpi_ns_search_parent_tree(u32 target_name,
217 206
218 ACPI_FUNCTION_TRACE(ns_search_parent_tree); 207 ACPI_FUNCTION_TRACE(ns_search_parent_tree);
219 208
220 parent_node = acpi_ns_get_parent_node(node); 209 parent_node = node->parent;
221 210
222 /* 211 /*
223 * If there is no parent (i.e., we are at the root) or type is "local", 212 * If there is no parent (i.e., we are at the root) or type is "local",
@@ -261,7 +250,7 @@ acpi_ns_search_parent_tree(u32 target_name,
261 250
262 /* Not found here, go up another level (until we reach the root) */ 251 /* Not found here, go up another level (until we reach the root) */
263 252
264 parent_node = acpi_ns_get_parent_node(parent_node); 253 parent_node = parent_node->parent;
265 } 254 }
266 255
267 /* Not found in parent tree */ 256 /* Not found in parent tree */
diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c
index bab559712da1..e1add3491b04 100644
--- a/drivers/acpi/acpica/nsutils.c
+++ b/drivers/acpi/acpica/nsutils.c
@@ -847,116 +847,3 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
847 ACPI_FREE(internal_path); 847 ACPI_FREE(internal_path);
848 return_ACPI_STATUS(status); 848 return_ACPI_STATUS(status);
849} 849}
850
851/*******************************************************************************
852 *
853 * FUNCTION: acpi_ns_get_parent_node
854 *
855 * PARAMETERS: Node - Current table entry
856 *
857 * RETURN: Parent entry of the given entry
858 *
859 * DESCRIPTION: Obtain the parent entry for a given entry in the namespace.
860 *
861 ******************************************************************************/
862
863struct acpi_namespace_node *acpi_ns_get_parent_node(struct acpi_namespace_node
864 *node)
865{
866 ACPI_FUNCTION_ENTRY();
867
868 if (!node) {
869 return (NULL);
870 }
871
872 /*
873 * Walk to the end of this peer list. The last entry is marked with a flag
874 * and the peer pointer is really a pointer back to the parent. This saves
875 * putting a parent back pointer in each and every named object!
876 */
877 while (!(node->flags & ANOBJ_END_OF_PEER_LIST)) {
878 node = node->peer;
879 }
880
881 return (node->peer);
882}
883
884/*******************************************************************************
885 *
886 * FUNCTION: acpi_ns_get_next_valid_node
887 *
888 * PARAMETERS: Node - Current table entry
889 *
890 * RETURN: Next valid Node in the linked node list. NULL if no more valid
891 * nodes.
892 *
893 * DESCRIPTION: Find the next valid node within a name table.
894 * Useful for implementing NULL-end-of-list loops.
895 *
896 ******************************************************************************/
897
898struct acpi_namespace_node *acpi_ns_get_next_valid_node(struct
899 acpi_namespace_node
900 *node)
901{
902
903 /* If we are at the end of this peer list, return NULL */
904
905 if (node->flags & ANOBJ_END_OF_PEER_LIST) {
906 return NULL;
907 }
908
909 /* Otherwise just return the next peer */
910
911 return (node->peer);
912}
913
914#ifdef ACPI_OBSOLETE_FUNCTIONS
915/*******************************************************************************
916 *
917 * FUNCTION: acpi_ns_find_parent_name
918 *
919 * PARAMETERS: *child_node - Named Obj whose name is to be found
920 *
921 * RETURN: The ACPI name
922 *
923 * DESCRIPTION: Search for the given obj in its parent scope and return the
924 * name segment, or "????" if the parent name can't be found
925 * (which "should not happen").
926 *
927 ******************************************************************************/
928
929acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node * child_node)
930{
931 struct acpi_namespace_node *parent_node;
932
933 ACPI_FUNCTION_TRACE(ns_find_parent_name);
934
935 if (child_node) {
936
937 /* Valid entry. Get the parent Node */
938
939 parent_node = acpi_ns_get_parent_node(child_node);
940 if (parent_node) {
941 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
942 "Parent of %p [%4.4s] is %p [%4.4s]\n",
943 child_node,
944 acpi_ut_get_node_name(child_node),
945 parent_node,
946 acpi_ut_get_node_name(parent_node)));
947
948 if (parent_node->name.integer) {
949 return_VALUE((acpi_name) parent_node->name.
950 integer);
951 }
952 }
953
954 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
955 "Unable to find parent of %p (%4.4s)\n",
956 child_node,
957 acpi_ut_get_node_name(child_node)));
958 }
959
960 return_VALUE(ACPI_UNKNOWN_NAME);
961}
962#endif
diff --git a/drivers/acpi/acpica/nswalk.c b/drivers/acpi/acpica/nswalk.c
index 00e79fb26029..2cd5be8fe10f 100644
--- a/drivers/acpi/acpica/nswalk.c
+++ b/drivers/acpi/acpica/nswalk.c
@@ -79,15 +79,6 @@ struct acpi_namespace_node *acpi_ns_get_next_node(struct acpi_namespace_node
79 return parent_node->child; 79 return parent_node->child;
80 } 80 }
81 81
82 /*
83 * Get the next node.
84 *
85 * If we are at the end of this peer list, return NULL
86 */
87 if (child_node->flags & ANOBJ_END_OF_PEER_LIST) {
88 return NULL;
89 }
90
91 /* Otherwise just return the next peer */ 82 /* Otherwise just return the next peer */
92 83
93 return child_node->peer; 84 return child_node->peer;
@@ -146,9 +137,9 @@ struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
146 return (next_node); 137 return (next_node);
147 } 138 }
148 139
149 /* Otherwise, move on to the next node */ 140 /* Otherwise, move on to the next peer node */
150 141
151 next_node = acpi_ns_get_next_valid_node(next_node); 142 next_node = next_node->peer;
152 } 143 }
153 144
154 /* Not found */ 145 /* Not found */
@@ -355,7 +346,7 @@ acpi_ns_walk_namespace(acpi_object_type type,
355 */ 346 */
356 level--; 347 level--;
357 child_node = parent_node; 348 child_node = parent_node;
358 parent_node = acpi_ns_get_parent_node(parent_node); 349 parent_node = parent_node->parent;
359 350
360 node_previously_visited = TRUE; 351 node_previously_visited = TRUE;
361 } 352 }
diff --git a/drivers/acpi/acpica/nsxfobj.c b/drivers/acpi/acpica/nsxfobj.c
index eafef24ea448..a1f04e9b8030 100644
--- a/drivers/acpi/acpica/nsxfobj.c
+++ b/drivers/acpi/acpica/nsxfobj.c
@@ -190,7 +190,7 @@ acpi_status acpi_get_parent(acpi_handle handle, acpi_handle * ret_handle)
190 190
191 /* Get the parent entry */ 191 /* Get the parent entry */
192 192
193 parent_node = acpi_ns_get_parent_node(node); 193 parent_node = node->parent;
194 *ret_handle = ACPI_CAST_PTR(acpi_handle, parent_node); 194 *ret_handle = ACPI_CAST_PTR(acpi_handle, parent_node);
195 195
196 /* Return exception if parent is null */ 196 /* Return exception if parent is null */
diff --git a/drivers/acpi/acpica/utglobal.c b/drivers/acpi/acpica/utglobal.c
index 66116750a0f9..0558747579ef 100644
--- a/drivers/acpi/acpica/utglobal.c
+++ b/drivers/acpi/acpica/utglobal.c
@@ -813,10 +813,10 @@ acpi_status acpi_ut_init_globals(void)
813 acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME; 813 acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
814 acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED; 814 acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED;
815 acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE; 815 acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
816 acpi_gbl_root_node_struct.parent = NULL;
816 acpi_gbl_root_node_struct.child = NULL; 817 acpi_gbl_root_node_struct.child = NULL;
817 acpi_gbl_root_node_struct.peer = NULL; 818 acpi_gbl_root_node_struct.peer = NULL;
818 acpi_gbl_root_node_struct.object = NULL; 819 acpi_gbl_root_node_struct.object = NULL;
819 acpi_gbl_root_node_struct.flags = ANOBJ_END_OF_PEER_LIST;
820 820
821#ifdef ACPI_DEBUG_OUTPUT 821#ifdef ACPI_DEBUG_OUTPUT
822 acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX); 822 acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX);
diff --git a/drivers/acpi/acpica/utxface.c b/drivers/acpi/acpica/utxface.c
index db9d8ca57987..7f8cefcb2b32 100644
--- a/drivers/acpi/acpica/utxface.c
+++ b/drivers/acpi/acpica/utxface.c
@@ -293,12 +293,8 @@ acpi_status acpi_initialize_objects(u32 flags)
293 * Complete the GPE initialization for the GPE blocks defined in the FADT 293 * Complete the GPE initialization for the GPE blocks defined in the FADT
294 * (GPE block 0 and 1). 294 * (GPE block 0 and 1).
295 * 295 *
296 * Note1: This is where the _PRW methods are executed for the GPEs. These 296 * NOTE: Currently, there seems to be no need to run the _REG methods
297 * methods can only be executed after the SCI and Global Lock handlers are 297 * before enabling the GPEs.
298 * installed and initialized.
299 *
300 * Note2: Currently, there seems to be no need to run the _REG methods
301 * before execution of the _PRW methods and enabling of the GPEs.
302 */ 298 */
303 if (!(flags & ACPI_NO_EVENT_INIT)) { 299 if (!(flags & ACPI_NO_EVENT_INIT)) {
304 status = acpi_ev_install_fadt_gpes(); 300 status = acpi_ev_install_fadt_gpes();
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 7d857dabdde4..1575a9b51f1d 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -424,8 +424,7 @@ static int acpi_button_add(struct acpi_device *device)
424 if (device->wakeup.flags.valid) { 424 if (device->wakeup.flags.valid) {
425 /* Button's GPE is run-wake GPE */ 425 /* Button's GPE is run-wake GPE */
426 acpi_enable_gpe(device->wakeup.gpe_device, 426 acpi_enable_gpe(device->wakeup.gpe_device,
427 device->wakeup.gpe_number, 427 device->wakeup.gpe_number);
428 ACPI_GPE_TYPE_RUNTIME);
429 device->wakeup.run_wake_count++; 428 device->wakeup.run_wake_count++;
430 device->wakeup.state.enabled = 1; 429 device->wakeup.state.enabled = 1;
431 } 430 }
@@ -448,8 +447,7 @@ static int acpi_button_remove(struct acpi_device *device, int type)
448 447
449 if (device->wakeup.flags.valid) { 448 if (device->wakeup.flags.valid) {
450 acpi_disable_gpe(device->wakeup.gpe_device, 449 acpi_disable_gpe(device->wakeup.gpe_device,
451 device->wakeup.gpe_number, 450 device->wakeup.gpe_number);
452 ACPI_GPE_TYPE_RUNTIME);
453 device->wakeup.run_wake_count--; 451 device->wakeup.run_wake_count--;
454 device->wakeup.state.enabled = 0; 452 device->wakeup.state.enabled = 0;
455 } 453 }
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 5f2027d782e8..1e6d4184f0ea 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -313,11 +313,8 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
313 pr_debug(PREFIX "transaction start\n"); 313 pr_debug(PREFIX "transaction start\n");
314 /* disable GPE during transaction if storm is detected */ 314 /* disable GPE during transaction if storm is detected */
315 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { 315 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
316 /* 316 /* It has to be disabled, so that it doesn't trigger. */
317 * It has to be disabled at the hardware level regardless of the 317 acpi_disable_gpe(NULL, ec->gpe);
318 * GPE reference counting, so that it doesn't trigger.
319 */
320 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
321 } 318 }
322 319
323 status = acpi_ec_transaction_unlocked(ec, t); 320 status = acpi_ec_transaction_unlocked(ec, t);
@@ -326,12 +323,8 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
326 ec_check_sci_sync(ec, acpi_ec_read_status(ec)); 323 ec_check_sci_sync(ec, acpi_ec_read_status(ec));
327 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { 324 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
328 msleep(1); 325 msleep(1);
329 /* 326 /* It is safe to enable the GPE outside of the transaction. */
330 * It is safe to enable the GPE outside of the transaction. Use 327 acpi_enable_gpe(NULL, ec->gpe);
331 * acpi_set_gpe() for that, since we used it to disable the GPE
332 * above.
333 */
334 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
335 } else if (t->irq_count > ACPI_EC_STORM_THRESHOLD) { 328 } else if (t->irq_count > ACPI_EC_STORM_THRESHOLD) {
336 pr_info(PREFIX "GPE storm detected, " 329 pr_info(PREFIX "GPE storm detected, "
337 "transactions will use polling mode\n"); 330 "transactions will use polling mode\n");
@@ -822,7 +815,7 @@ static int ec_install_handlers(struct acpi_ec *ec)
822 if (ACPI_FAILURE(status)) 815 if (ACPI_FAILURE(status))
823 return -ENODEV; 816 return -ENODEV;
824 817
825 acpi_enable_gpe(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME); 818 acpi_enable_gpe(NULL, ec->gpe);
826 status = acpi_install_address_space_handler(ec->handle, 819 status = acpi_install_address_space_handler(ec->handle,
827 ACPI_ADR_SPACE_EC, 820 ACPI_ADR_SPACE_EC,
828 &acpi_ec_space_handler, 821 &acpi_ec_space_handler,
@@ -839,7 +832,7 @@ static int ec_install_handlers(struct acpi_ec *ec)
839 } else { 832 } else {
840 acpi_remove_gpe_handler(NULL, ec->gpe, 833 acpi_remove_gpe_handler(NULL, ec->gpe,
841 &acpi_ec_gpe_handler); 834 &acpi_ec_gpe_handler);
842 acpi_disable_gpe(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME); 835 acpi_disable_gpe(NULL, ec->gpe);
843 return -ENODEV; 836 return -ENODEV;
844 } 837 }
845 } 838 }
@@ -850,7 +843,7 @@ static int ec_install_handlers(struct acpi_ec *ec)
850 843
851static void ec_remove_handlers(struct acpi_ec *ec) 844static void ec_remove_handlers(struct acpi_ec *ec)
852{ 845{
853 acpi_disable_gpe(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME); 846 acpi_disable_gpe(NULL, ec->gpe);
854 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, 847 if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
855 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler))) 848 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
856 pr_err(PREFIX "failed to remove space handler\n"); 849 pr_err(PREFIX "failed to remove space handler\n");
@@ -1088,22 +1081,6 @@ error:
1088 return -ENODEV; 1081 return -ENODEV;
1089} 1082}
1090 1083
1091static int acpi_ec_suspend(struct acpi_device *device, pm_message_t state)
1092{
1093 struct acpi_ec *ec = acpi_driver_data(device);
1094 /* Stop using the GPE, but keep it reference counted. */
1095 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
1096 return 0;
1097}
1098
1099static int acpi_ec_resume(struct acpi_device *device)
1100{
1101 struct acpi_ec *ec = acpi_driver_data(device);
1102 /* Enable the GPE again, but don't reference count it once more. */
1103 acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
1104 return 0;
1105}
1106
1107static struct acpi_driver acpi_ec_driver = { 1084static struct acpi_driver acpi_ec_driver = {
1108 .name = "ec", 1085 .name = "ec",
1109 .class = ACPI_EC_CLASS, 1086 .class = ACPI_EC_CLASS,
@@ -1111,8 +1088,6 @@ static struct acpi_driver acpi_ec_driver = {
1111 .ops = { 1088 .ops = {
1112 .add = acpi_ec_add, 1089 .add = acpi_ec_add,
1113 .remove = acpi_ec_remove, 1090 .remove = acpi_ec_remove,
1114 .suspend = acpi_ec_suspend,
1115 .resume = acpi_ec_resume,
1116 }, 1091 },
1117}; 1092};
1118 1093
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 78418ce4fc78..44bddc5bc6ad 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -1064,26 +1064,6 @@ static int __init acpi_serialize_setup(char *str)
1064 1064
1065__setup("acpi_serialize", acpi_serialize_setup); 1065__setup("acpi_serialize", acpi_serialize_setup);
1066 1066
1067/*
1068 * Wake and Run-Time GPES are expected to be separate.
1069 * We disable wake-GPEs at run-time to prevent spurious
1070 * interrupts.
1071 *
1072 * However, if a system exists that shares Wake and
1073 * Run-time events on the same GPE this flag is available
1074 * to tell Linux to keep the wake-time GPEs enabled at run-time.
1075 */
1076static int __init acpi_wake_gpes_always_on_setup(char *str)
1077{
1078 printk(KERN_INFO PREFIX "wake GPEs not disabled\n");
1079
1080 acpi_gbl_leave_wake_gpes_disabled = FALSE;
1081
1082 return 1;
1083}
1084
1085__setup("acpi_wake_gpes_always_on", acpi_wake_gpes_always_on_setup);
1086
1087/* Check of resource interference between native drivers and ACPI 1067/* Check of resource interference between native drivers and ACPI
1088 * OperationRegions (SystemIO and System Memory only). 1068 * OperationRegions (SystemIO and System Memory only).
1089 * IO ports and memory declared in ACPI might be used by the ACPI subsystem 1069 * IO ports and memory declared in ACPI might be used by the ACPI subsystem
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 7f2e051ed4f1..b23825ecfa37 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -740,6 +740,8 @@ acpi_bus_extract_wakeup_device_power_package(struct acpi_device *device,
740 device->wakeup.resources.handles[i] = element->reference.handle; 740 device->wakeup.resources.handles[i] = element->reference.handle;
741 } 741 }
742 742
743 acpi_gpe_can_wake(device->wakeup.gpe_device, device->wakeup.gpe_number);
744
743 return AE_OK; 745 return AE_OK;
744} 746}
745 747
@@ -764,8 +766,9 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
764 return; 766 return;
765 } 767 }
766 768
767 status = acpi_get_gpe_status(NULL, device->wakeup.gpe_number, 769 status = acpi_get_gpe_status(device->wakeup.gpe_device,
768 &event_status); 770 device->wakeup.gpe_number,
771 &event_status);
769 if (status == AE_OK) 772 if (status == AE_OK)
770 device->wakeup.flags.run_wake = 773 device->wakeup.flags.run_wake =
771 !!(event_status & ACPI_EVENT_FLAG_HANDLE); 774 !!(event_status & ACPI_EVENT_FLAG_HANDLE);
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index e4625f919814..cf82989ae756 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -646,18 +646,9 @@ int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
646 return -ENODEV; 646 return -ENODEV;
647 } 647 }
648 648
649 if (enable) { 649 error = enable ?
650 error = acpi_enable_wakeup_device_power(adev, 650 acpi_enable_wakeup_device_power(adev, acpi_target_sleep_state) :
651 acpi_target_sleep_state); 651 acpi_disable_wakeup_device_power(adev);
652 if (!error)
653 acpi_enable_gpe(adev->wakeup.gpe_device,
654 adev->wakeup.gpe_number,
655 ACPI_GPE_TYPE_WAKE);
656 } else {
657 acpi_disable_gpe(adev->wakeup.gpe_device, adev->wakeup.gpe_number,
658 ACPI_GPE_TYPE_WAKE);
659 error = acpi_disable_wakeup_device_power(adev);
660 }
661 if (!error) 652 if (!error)
662 dev_info(dev, "wake-up capability %s by ACPI\n", 653 dev_info(dev, "wake-up capability %s by ACPI\n",
663 enable ? "enabled" : "disabled"); 654 enable ? "enabled" : "disabled");
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
index f8db50a0941c..5981bd07e20e 100644
--- a/drivers/acpi/system.c
+++ b/drivers/acpi/system.c
@@ -388,12 +388,10 @@ static ssize_t counter_set(struct kobject *kobj,
388 if (index < num_gpes) { 388 if (index < num_gpes) {
389 if (!strcmp(buf, "disable\n") && 389 if (!strcmp(buf, "disable\n") &&
390 (status & ACPI_EVENT_FLAG_ENABLED)) 390 (status & ACPI_EVENT_FLAG_ENABLED))
391 result = acpi_disable_gpe(handle, index, 391 result = acpi_disable_gpe(handle, index);
392 ACPI_GPE_TYPE_RUNTIME);
393 else if (!strcmp(buf, "enable\n") && 392 else if (!strcmp(buf, "enable\n") &&
394 !(status & ACPI_EVENT_FLAG_ENABLED)) 393 !(status & ACPI_EVENT_FLAG_ENABLED))
395 result = acpi_enable_gpe(handle, index, 394 result = acpi_enable_gpe(handle, index);
396 ACPI_GPE_TYPE_RUNTIME);
397 else if (!strcmp(buf, "clear\n") && 395 else if (!strcmp(buf, "clear\n") &&
398 (status & ACPI_EVENT_FLAG_SET)) 396 (status & ACPI_EVENT_FLAG_SET))
399 result = acpi_clear_gpe(handle, index); 397 result = acpi_clear_gpe(handle, index);
diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c
index dc6d1d9112fb..f62a50c3ed34 100644
--- a/drivers/acpi/wakeup.c
+++ b/drivers/acpi/wakeup.c
@@ -36,7 +36,8 @@ void acpi_enable_wakeup_devices(u8 sleep_state)
36 struct acpi_device *dev = 36 struct acpi_device *dev =
37 container_of(node, struct acpi_device, wakeup_list); 37 container_of(node, struct acpi_device, wakeup_list);
38 38
39 if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled 39 if (!dev->wakeup.flags.valid
40 || !(dev->wakeup.state.enabled || dev->wakeup.prepare_count)
40 || sleep_state > (u32) dev->wakeup.sleep_state) 41 || sleep_state > (u32) dev->wakeup.sleep_state)
41 continue; 42 continue;
42 43
@@ -44,8 +45,8 @@ void acpi_enable_wakeup_devices(u8 sleep_state)
44 acpi_enable_wakeup_device_power(dev, sleep_state); 45 acpi_enable_wakeup_device_power(dev, sleep_state);
45 46
46 /* The wake-up power should have been enabled already. */ 47 /* The wake-up power should have been enabled already. */
47 acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, 48 acpi_gpe_wakeup(dev->wakeup.gpe_device, dev->wakeup.gpe_number,
48 ACPI_GPE_TYPE_WAKE); 49 ACPI_GPE_ENABLE);
49 } 50 }
50} 51}
51 52
@@ -61,13 +62,16 @@ void acpi_disable_wakeup_devices(u8 sleep_state)
61 struct acpi_device *dev = 62 struct acpi_device *dev =
62 container_of(node, struct acpi_device, wakeup_list); 63 container_of(node, struct acpi_device, wakeup_list);
63 64
64 if (!dev->wakeup.flags.valid || !dev->wakeup.state.enabled 65 if (!dev->wakeup.flags.valid
66 || !(dev->wakeup.state.enabled || dev->wakeup.prepare_count)
65 || (sleep_state > (u32) dev->wakeup.sleep_state)) 67 || (sleep_state > (u32) dev->wakeup.sleep_state))
66 continue; 68 continue;
67 69
68 acpi_disable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number, 70 acpi_gpe_wakeup(dev->wakeup.gpe_device, dev->wakeup.gpe_number,
69 ACPI_GPE_TYPE_WAKE); 71 ACPI_GPE_DISABLE);
70 acpi_disable_wakeup_device_power(dev); 72
73 if (dev->wakeup.state.enabled)
74 acpi_disable_wakeup_device_power(dev);
71 } 75 }
72} 76}
73 77