diff options
Diffstat (limited to 'drivers/acpi/acpica/evgpe.c')
-rw-r--r-- | drivers/acpi/acpica/evgpe.c | 115 |
1 files changed, 5 insertions, 110 deletions
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index a221ad404167..7c2c336006a1 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
@@ -69,7 +69,7 @@ acpi_status | |||
69 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | 69 | acpi_ev_update_gpe_enable_masks(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 | u8 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_masks); |
75 | 75 | ||
@@ -78,9 +78,8 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | |||
78 | return_ACPI_STATUS(AE_NOT_EXIST); | 78 | return_ACPI_STATUS(AE_NOT_EXIST); |
79 | } | 79 | } |
80 | 80 | ||
81 | register_bit = (u8) | 81 | register_bit = acpi_hw_gpe_register_bit(gpe_event_info, |
82 | (1 << | 82 | gpe_register_info); |
83 | (gpe_event_info->gpe_number - gpe_register_info->base_gpe_number)); | ||
84 | 83 | ||
85 | /* Clear the wake/run bits up front */ | 84 | /* Clear the wake/run bits up front */ |
86 | 85 | ||
@@ -100,106 +99,6 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | |||
100 | return_ACPI_STATUS(AE_OK); | 99 | return_ACPI_STATUS(AE_OK); |
101 | } | 100 | } |
102 | 101 | ||
103 | /******************************************************************************* | ||
104 | * | ||
105 | * FUNCTION: acpi_ev_enable_gpe | ||
106 | * | ||
107 | * PARAMETERS: gpe_event_info - GPE to enable | ||
108 | * | ||
109 | * RETURN: Status | ||
110 | * | ||
111 | * DESCRIPTION: Hardware-enable a GPE. Always enables the GPE, regardless | ||
112 | * of type or number of references. | ||
113 | * | ||
114 | * Note: The GPE lock should be already acquired when this function is called. | ||
115 | * | ||
116 | ******************************************************************************/ | ||
117 | |||
118 | acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
119 | { | ||
120 | acpi_status status; | ||
121 | |||
122 | |||
123 | ACPI_FUNCTION_TRACE(ev_enable_gpe); | ||
124 | |||
125 | |||
126 | /* | ||
127 | * We will only allow a GPE to be enabled if it has either an | ||
128 | * associated method (_Lxx/_Exx) or a handler. Otherwise, the | ||
129 | * GPE will be immediately disabled by acpi_ev_gpe_dispatch the | ||
130 | * first time it fires. | ||
131 | */ | ||
132 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) { | ||
133 | return_ACPI_STATUS(AE_NO_HANDLER); | ||
134 | } | ||
135 | |||
136 | /* Ensure the HW enable masks are current */ | ||
137 | |||
138 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
139 | if (ACPI_FAILURE(status)) { | ||
140 | return_ACPI_STATUS(status); | ||
141 | } | ||
142 | |||
143 | /* Clear the GPE (of stale events) */ | ||
144 | |||
145 | status = acpi_hw_clear_gpe(gpe_event_info); | ||
146 | if (ACPI_FAILURE(status)) { | ||
147 | return_ACPI_STATUS(status); | ||
148 | } | ||
149 | |||
150 | /* Enable the requested GPE */ | ||
151 | |||
152 | status = acpi_hw_write_gpe_enable_reg(gpe_event_info); | ||
153 | return_ACPI_STATUS(status); | ||
154 | } | ||
155 | |||
156 | /******************************************************************************* | ||
157 | * | ||
158 | * FUNCTION: acpi_ev_disable_gpe | ||
159 | * | ||
160 | * PARAMETERS: gpe_event_info - GPE to disable | ||
161 | * | ||
162 | * RETURN: Status | ||
163 | * | ||
164 | * DESCRIPTION: Hardware-disable a GPE. Always disables the requested GPE, | ||
165 | * regardless of the type or number of references. | ||
166 | * | ||
167 | * Note: The GPE lock should be already acquired when this function is called. | ||
168 | * | ||
169 | ******************************************************************************/ | ||
170 | |||
171 | acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
172 | { | ||
173 | acpi_status status; | ||
174 | |||
175 | ACPI_FUNCTION_TRACE(ev_disable_gpe); | ||
176 | |||
177 | |||
178 | /* | ||
179 | * Note: Always disable the GPE, even if we think that that it is already | ||
180 | * disabled. It is possible that the AML or some other code has enabled | ||
181 | * the GPE behind our back. | ||
182 | */ | ||
183 | |||
184 | /* Ensure the HW enable masks are current */ | ||
185 | |||
186 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
187 | if (ACPI_FAILURE(status)) { | ||
188 | return_ACPI_STATUS(status); | ||
189 | } | ||
190 | |||
191 | /* | ||
192 | * Always H/W disable this GPE, even if we don't know the GPE type. | ||
193 | * Simply clear the enable bit for this particular GPE, but do not | ||
194 | * write out the current GPE enable mask since this may inadvertently | ||
195 | * enable GPEs too early. An example is a rogue GPE that has arrived | ||
196 | * during ACPICA initialization - possibly because AML or other code | ||
197 | * has enabled the GPE. | ||
198 | */ | ||
199 | status = acpi_hw_low_disable_gpe(gpe_event_info); | ||
200 | return_ACPI_STATUS(status); | ||
201 | } | ||
202 | |||
203 | 102 | ||
204 | /******************************************************************************* | 103 | /******************************************************************************* |
205 | * | 104 | * |
@@ -451,10 +350,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
451 | return_VOID; | 350 | return_VOID; |
452 | } | 351 | } |
453 | 352 | ||
454 | /* Update the GPE register masks for return to enabled state */ | ||
455 | |||
456 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
457 | |||
458 | /* | 353 | /* |
459 | * Take a snapshot of the GPE info for this level - we copy the info to | 354 | * Take a snapshot of the GPE info for this level - we copy the info to |
460 | * prevent a race condition with remove_handler/remove_block. | 355 | * prevent a race condition with remove_handler/remove_block. |
@@ -607,7 +502,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
607 | * Disable the GPE, so it doesn't keep firing before the method has a | 502 | * Disable the GPE, so it doesn't keep firing before the method has a |
608 | * chance to run (it runs asynchronously with interrupts enabled). | 503 | * chance to run (it runs asynchronously with interrupts enabled). |
609 | */ | 504 | */ |
610 | status = acpi_ev_disable_gpe(gpe_event_info); | 505 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE); |
611 | if (ACPI_FAILURE(status)) { | 506 | if (ACPI_FAILURE(status)) { |
612 | ACPI_EXCEPTION((AE_INFO, status, | 507 | ACPI_EXCEPTION((AE_INFO, status, |
613 | "Unable to disable GPE[0x%2X]", | 508 | "Unable to disable GPE[0x%2X]", |
@@ -644,7 +539,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
644 | * Disable the GPE. The GPE will remain disabled a handler | 539 | * Disable the GPE. The GPE will remain disabled a handler |
645 | * is installed or ACPICA is restarted. | 540 | * is installed or ACPICA is restarted. |
646 | */ | 541 | */ |
647 | status = acpi_ev_disable_gpe(gpe_event_info); | 542 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE); |
648 | if (ACPI_FAILURE(status)) { | 543 | if (ACPI_FAILURE(status)) { |
649 | ACPI_EXCEPTION((AE_INFO, status, | 544 | ACPI_EXCEPTION((AE_INFO, status, |
650 | "Unable to disable GPE[0x%2X]", | 545 | "Unable to disable GPE[0x%2X]", |