diff options
-rw-r--r-- | drivers/acpi/ec.c | 171 |
1 files changed, 76 insertions, 95 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index e05bb148754c..d713f769b72d 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -45,36 +45,33 @@ ACPI_MODULE_NAME("acpi_ec") | |||
45 | #define ACPI_EC_DRIVER_NAME "ACPI Embedded Controller Driver" | 45 | #define ACPI_EC_DRIVER_NAME "ACPI Embedded Controller Driver" |
46 | #define ACPI_EC_DEVICE_NAME "Embedded Controller" | 46 | #define ACPI_EC_DEVICE_NAME "Embedded Controller" |
47 | #define ACPI_EC_FILE_INFO "info" | 47 | #define ACPI_EC_FILE_INFO "info" |
48 | |||
49 | #undef PREFIX | 48 | #undef PREFIX |
50 | #define PREFIX "ACPI: EC: " | 49 | #define PREFIX "ACPI: EC: " |
51 | |||
52 | /* EC status register */ | 50 | /* EC status register */ |
53 | #define ACPI_EC_FLAG_OBF 0x01 /* Output buffer full */ | 51 | #define ACPI_EC_FLAG_OBF 0x01 /* Output buffer full */ |
54 | #define ACPI_EC_FLAG_IBF 0x02 /* Input buffer full */ | 52 | #define ACPI_EC_FLAG_IBF 0x02 /* Input buffer full */ |
55 | #define ACPI_EC_FLAG_BURST 0x10 /* burst mode */ | 53 | #define ACPI_EC_FLAG_BURST 0x10 /* burst mode */ |
56 | #define ACPI_EC_FLAG_SCI 0x20 /* EC-SCI occurred */ | 54 | #define ACPI_EC_FLAG_SCI 0x20 /* EC-SCI occurred */ |
57 | |||
58 | /* EC commands */ | 55 | /* EC commands */ |
59 | enum ec_command { | 56 | enum ec_command { |
60 | ACPI_EC_COMMAND_READ = 0x80, | 57 | ACPI_EC_COMMAND_READ = 0x80, |
61 | ACPI_EC_COMMAND_WRITE = 0x81, | 58 | ACPI_EC_COMMAND_WRITE = 0x81, |
62 | ACPI_EC_BURST_ENABLE = 0x82, | 59 | ACPI_EC_BURST_ENABLE = 0x82, |
63 | ACPI_EC_BURST_DISABLE = 0x83, | 60 | ACPI_EC_BURST_DISABLE = 0x83, |
64 | ACPI_EC_COMMAND_QUERY = 0x84, | 61 | ACPI_EC_COMMAND_QUERY = 0x84, |
65 | }; | 62 | }; |
66 | /* EC events */ | 63 | /* EC events */ |
67 | enum ec_event { | 64 | enum ec_event { |
68 | ACPI_EC_EVENT_OBF_1 = 1, /* Output buffer full */ | 65 | ACPI_EC_EVENT_OBF_1 = 1, /* Output buffer full */ |
69 | ACPI_EC_EVENT_IBF_0, /* Input buffer empty */ | 66 | ACPI_EC_EVENT_IBF_0, /* Input buffer empty */ |
70 | }; | 67 | }; |
71 | 68 | ||
72 | #define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ | 69 | #define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ |
73 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ | 70 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ |
74 | 71 | ||
75 | static enum ec_mode { | 72 | static enum ec_mode { |
76 | EC_INTR = 1, /* Output buffer full */ | 73 | EC_INTR = 1, /* Output buffer full */ |
77 | EC_POLL, /* Input buffer empty */ | 74 | EC_POLL, /* Input buffer empty */ |
78 | } acpi_ec_mode = EC_INTR; | 75 | } acpi_ec_mode = EC_INTR; |
79 | 76 | ||
80 | static int acpi_ec_remove(struct acpi_device *device, int type); | 77 | static int acpi_ec_remove(struct acpi_device *device, int type); |
@@ -167,7 +164,7 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event) | |||
167 | } else { | 164 | } else { |
168 | printk(KERN_ERR PREFIX "acpi_ec_wait timeout," | 165 | printk(KERN_ERR PREFIX "acpi_ec_wait timeout," |
169 | " status = %d, expect_event = %d\n", | 166 | " status = %d, expect_event = %d\n", |
170 | acpi_ec_read_status(ec), event); | 167 | acpi_ec_read_status(ec), event); |
171 | } | 168 | } |
172 | } | 169 | } |
173 | 170 | ||
@@ -184,7 +181,6 @@ int acpi_ec_enter_burst_mode(struct acpi_ec *ec) | |||
184 | u8 tmp = 0; | 181 | u8 tmp = 0; |
185 | u8 status = 0; | 182 | u8 status = 0; |
186 | 183 | ||
187 | |||
188 | status = acpi_ec_read_status(ec); | 184 | status = acpi_ec_read_status(ec); |
189 | if (status != -EINVAL && !(status & ACPI_EC_FLAG_BURST)) { | 185 | if (status != -EINVAL && !(status & ACPI_EC_FLAG_BURST)) { |
190 | status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); | 186 | status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); |
@@ -200,7 +196,7 @@ int acpi_ec_enter_burst_mode(struct acpi_ec *ec) | |||
200 | 196 | ||
201 | atomic_set(&ec->leaving_burst, 0); | 197 | atomic_set(&ec->leaving_burst, 0); |
202 | return 0; | 198 | return 0; |
203 | end: | 199 | end: |
204 | ACPI_EXCEPTION((AE_INFO, status, "EC wait, burst mode")); | 200 | ACPI_EXCEPTION((AE_INFO, status, "EC wait, burst mode")); |
205 | return -1; | 201 | return -1; |
206 | } | 202 | } |
@@ -209,26 +205,25 @@ int acpi_ec_leave_burst_mode(struct acpi_ec *ec) | |||
209 | { | 205 | { |
210 | u8 status = 0; | 206 | u8 status = 0; |
211 | 207 | ||
212 | |||
213 | status = acpi_ec_read_status(ec); | 208 | status = acpi_ec_read_status(ec); |
214 | if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)){ | 209 | if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)) { |
215 | status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); | 210 | status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); |
216 | if(status) | 211 | if (status) |
217 | goto end; | 212 | goto end; |
218 | acpi_ec_write_cmd(ec, ACPI_EC_BURST_DISABLE); | 213 | acpi_ec_write_cmd(ec, ACPI_EC_BURST_DISABLE); |
219 | acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); | 214 | acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); |
220 | } | 215 | } |
221 | atomic_set(&ec->leaving_burst, 1); | 216 | atomic_set(&ec->leaving_burst, 1); |
222 | return 0; | 217 | return 0; |
223 | end: | 218 | end: |
224 | ACPI_EXCEPTION((AE_INFO, status, "EC leave burst mode")); | 219 | ACPI_EXCEPTION((AE_INFO, status, "EC leave burst mode")); |
225 | return -1; | 220 | return -1; |
226 | } | 221 | } |
227 | #endif /* ACPI_FUTURE_USAGE */ | 222 | #endif /* ACPI_FUTURE_USAGE */ |
228 | 223 | ||
229 | static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, | 224 | static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, |
230 | const u8 *wdata, unsigned wdata_len, | 225 | const u8 * wdata, unsigned wdata_len, |
231 | u8 *rdata, unsigned rdata_len) | 226 | u8 * rdata, unsigned rdata_len) |
232 | { | 227 | { |
233 | int result = 0; | 228 | int result = 0; |
234 | 229 | ||
@@ -237,8 +232,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, | |||
237 | for (; wdata_len > 0; --wdata_len) { | 232 | for (; wdata_len > 0; --wdata_len) { |
238 | result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); | 233 | result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); |
239 | if (result) { | 234 | if (result) { |
240 | printk(KERN_ERR PREFIX "write_cmd timeout, command = %d\n", | 235 | printk(KERN_ERR PREFIX |
241 | command); | 236 | "write_cmd timeout, command = %d\n", command); |
242 | goto end; | 237 | goto end; |
243 | } | 238 | } |
244 | acpi_ec_write_data(ec, *(wdata++)); | 239 | acpi_ec_write_data(ec, *(wdata++)); |
@@ -247,8 +242,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, | |||
247 | if (!rdata_len) { | 242 | if (!rdata_len) { |
248 | result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); | 243 | result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); |
249 | if (result) { | 244 | if (result) { |
250 | printk(KERN_ERR PREFIX "finish-write timeout, command = %d\n", | 245 | printk(KERN_ERR PREFIX |
251 | command); | 246 | "finish-write timeout, command = %d\n", command); |
252 | goto end; | 247 | goto end; |
253 | } | 248 | } |
254 | } else if (command == ACPI_EC_COMMAND_QUERY) { | 249 | } else if (command == ACPI_EC_COMMAND_QUERY) { |
@@ -259,7 +254,7 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, | |||
259 | result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1); | 254 | result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1); |
260 | if (result) { | 255 | if (result) { |
261 | printk(KERN_ERR PREFIX "read timeout, command = %d\n", | 256 | printk(KERN_ERR PREFIX "read timeout, command = %d\n", |
262 | command); | 257 | command); |
263 | goto end; | 258 | goto end; |
264 | } | 259 | } |
265 | 260 | ||
@@ -270,8 +265,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, | |||
270 | } | 265 | } |
271 | 266 | ||
272 | static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, | 267 | static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, |
273 | const u8 *wdata, unsigned wdata_len, | 268 | const u8 * wdata, unsigned wdata_len, |
274 | u8 *rdata, unsigned rdata_len) | 269 | u8 * rdata, unsigned rdata_len) |
275 | { | 270 | { |
276 | int status; | 271 | int status; |
277 | u32 glk; | 272 | u32 glk; |
@@ -279,8 +274,8 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, | |||
279 | if (!ec || (wdata_len && !wdata) || (rdata_len && !rdata)) | 274 | if (!ec || (wdata_len && !wdata) || (rdata_len && !rdata)) |
280 | return -EINVAL; | 275 | return -EINVAL; |
281 | 276 | ||
282 | if (rdata) | 277 | if (rdata) |
283 | memset(rdata, 0, rdata_len); | 278 | memset(rdata, 0, rdata_len); |
284 | 279 | ||
285 | mutex_lock(&ec->lock); | 280 | mutex_lock(&ec->lock); |
286 | if (ec->global_lock) { | 281 | if (ec->global_lock) { |
@@ -294,15 +289,16 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, | |||
294 | 289 | ||
295 | status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); | 290 | status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0); |
296 | if (status) { | 291 | if (status) { |
297 | printk(KERN_DEBUG PREFIX "read EC, IB not empty\n"); | 292 | printk(KERN_DEBUG PREFIX |
293 | "input buffer is not empty, aborting transaction\n"); | ||
298 | goto end; | 294 | goto end; |
299 | } | 295 | } |
300 | 296 | ||
301 | status = acpi_ec_transaction_unlocked(ec, command, | 297 | status = acpi_ec_transaction_unlocked(ec, command, |
302 | wdata, wdata_len, | 298 | wdata, wdata_len, |
303 | rdata, rdata_len); | 299 | rdata, rdata_len); |
304 | 300 | ||
305 | end: | 301 | end: |
306 | 302 | ||
307 | if (ec->global_lock) | 303 | if (ec->global_lock) |
308 | acpi_release_global_lock(glk); | 304 | acpi_release_global_lock(glk); |
@@ -311,7 +307,7 @@ end: | |||
311 | return status; | 307 | return status; |
312 | } | 308 | } |
313 | 309 | ||
314 | static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data) | 310 | static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data) |
315 | { | 311 | { |
316 | int result; | 312 | int result; |
317 | u8 d; | 313 | u8 d; |
@@ -324,15 +320,15 @@ static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data) | |||
324 | 320 | ||
325 | static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data) | 321 | static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data) |
326 | { | 322 | { |
327 | u8 wdata[2] = { address, data }; | 323 | u8 wdata[2] = { address, data }; |
328 | return acpi_ec_transaction(ec, ACPI_EC_COMMAND_WRITE, | 324 | return acpi_ec_transaction(ec, ACPI_EC_COMMAND_WRITE, |
329 | wdata, 2, NULL, 0); | 325 | wdata, 2, NULL, 0); |
330 | } | 326 | } |
331 | 327 | ||
332 | /* | 328 | /* |
333 | * Externally callable EC access functions. For now, assume 1 EC only | 329 | * Externally callable EC access functions. For now, assume 1 EC only |
334 | */ | 330 | */ |
335 | int ec_read(u8 addr, u8 *val) | 331 | int ec_read(u8 addr, u8 * val) |
336 | { | 332 | { |
337 | struct acpi_ec *ec; | 333 | struct acpi_ec *ec; |
338 | int err; | 334 | int err; |
@@ -372,8 +368,8 @@ int ec_write(u8 addr, u8 val) | |||
372 | EXPORT_SYMBOL(ec_write); | 368 | EXPORT_SYMBOL(ec_write); |
373 | 369 | ||
374 | extern int ec_transaction(u8 command, | 370 | extern int ec_transaction(u8 command, |
375 | const u8 *wdata, unsigned wdata_len, | 371 | const u8 * wdata, unsigned wdata_len, |
376 | u8 *rdata, unsigned rdata_len) | 372 | u8 * rdata, unsigned rdata_len) |
377 | { | 373 | { |
378 | struct acpi_ec *ec; | 374 | struct acpi_ec *ec; |
379 | 375 | ||
@@ -388,29 +384,29 @@ extern int ec_transaction(u8 command, | |||
388 | 384 | ||
389 | EXPORT_SYMBOL(ec_transaction); | 385 | EXPORT_SYMBOL(ec_transaction); |
390 | 386 | ||
391 | static int acpi_ec_query(struct acpi_ec *ec, u8 *data) | 387 | static int acpi_ec_query(struct acpi_ec *ec, u8 * data) |
392 | { | 388 | { |
393 | int result; | 389 | int result; |
394 | u8 d; | 390 | u8 d; |
395 | 391 | ||
396 | if (!ec || !data) | 392 | if (!ec || !data) |
397 | return -EINVAL; | 393 | return -EINVAL; |
398 | 394 | ||
399 | /* | 395 | /* |
400 | * Query the EC to find out which _Qxx method we need to evaluate. | 396 | * Query the EC to find out which _Qxx method we need to evaluate. |
401 | * Note that successful completion of the query causes the ACPI_EC_SCI | 397 | * Note that successful completion of the query causes the ACPI_EC_SCI |
402 | * bit to be cleared (and thus clearing the interrupt source). | 398 | * bit to be cleared (and thus clearing the interrupt source). |
403 | */ | 399 | */ |
404 | 400 | ||
405 | result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_QUERY, NULL, 0, &d, 1); | 401 | result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_QUERY, NULL, 0, &d, 1); |
406 | if (result) | 402 | if (result) |
407 | return result; | 403 | return result; |
408 | 404 | ||
409 | if (!d) | 405 | if (!d) |
410 | return -ENODATA; | 406 | return -ENODATA; |
411 | 407 | ||
412 | *data = d; | 408 | *data = d; |
413 | return 0; | 409 | return 0; |
414 | } | 410 | } |
415 | 411 | ||
416 | /* -------------------------------------------------------------------------- | 412 | /* -------------------------------------------------------------------------- |
@@ -439,7 +435,6 @@ static u32 acpi_ec_gpe_handler(void *data) | |||
439 | u8 value; | 435 | u8 value; |
440 | struct acpi_ec *ec = (struct acpi_ec *)data; | 436 | struct acpi_ec *ec = (struct acpi_ec *)data; |
441 | 437 | ||
442 | |||
443 | if (acpi_ec_mode == EC_INTR) { | 438 | if (acpi_ec_mode == EC_INTR) { |
444 | wake_up(&ec->wait); | 439 | wake_up(&ec->wait); |
445 | } | 440 | } |
@@ -447,7 +442,9 @@ static u32 acpi_ec_gpe_handler(void *data) | |||
447 | value = acpi_ec_read_status(ec); | 442 | value = acpi_ec_read_status(ec); |
448 | if ((value & ACPI_EC_FLAG_SCI) && !atomic_read(&ec->query_pending)) { | 443 | if ((value & ACPI_EC_FLAG_SCI) && !atomic_read(&ec->query_pending)) { |
449 | atomic_set(&ec->query_pending, 1); | 444 | atomic_set(&ec->query_pending, 1); |
450 | status = acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, ec); | 445 | status = |
446 | acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, | ||
447 | ec); | ||
451 | } | 448 | } |
452 | 449 | ||
453 | return status == AE_OK ? | 450 | return status == AE_OK ? |
@@ -485,7 +482,6 @@ acpi_ec_space_handler(u32 function, | |||
485 | acpi_integer f_v = 0; | 482 | acpi_integer f_v = 0; |
486 | int i = 0; | 483 | int i = 0; |
487 | 484 | ||
488 | |||
489 | if ((address > 0xFF) || !value || !handler_context) | 485 | if ((address > 0xFF) || !value || !handler_context) |
490 | return AE_BAD_PARAMETER; | 486 | return AE_BAD_PARAMETER; |
491 | 487 | ||
@@ -499,7 +495,7 @@ acpi_ec_space_handler(u32 function, | |||
499 | switch (function) { | 495 | switch (function) { |
500 | case ACPI_READ: | 496 | case ACPI_READ: |
501 | temp = 0; | 497 | temp = 0; |
502 | result = acpi_ec_read(ec, (u8) address, (u8 *) &temp); | 498 | result = acpi_ec_read(ec, (u8) address, (u8 *) & temp); |
503 | break; | 499 | break; |
504 | case ACPI_WRITE: | 500 | case ACPI_WRITE: |
505 | result = acpi_ec_write(ec, (u8) address, (u8) temp); | 501 | result = acpi_ec_write(ec, (u8) address, (u8) temp); |
@@ -552,15 +548,12 @@ static int acpi_ec_read_info(struct seq_file *seq, void *offset) | |||
552 | { | 548 | { |
553 | struct acpi_ec *ec = (struct acpi_ec *)seq->private; | 549 | struct acpi_ec *ec = (struct acpi_ec *)seq->private; |
554 | 550 | ||
555 | |||
556 | if (!ec) | 551 | if (!ec) |
557 | goto end; | 552 | goto end; |
558 | 553 | ||
559 | seq_printf(seq, "gpe: 0x%02x\n", | 554 | seq_printf(seq, "gpe: 0x%02x\n", (u32) ec->gpe); |
560 | (u32) ec->gpe); | ||
561 | seq_printf(seq, "ports: 0x%02x, 0x%02x\n", | 555 | seq_printf(seq, "ports: 0x%02x, 0x%02x\n", |
562 | (u32) ec->command_addr, | 556 | (u32) ec->command_addr, (u32) ec->data_addr); |
563 | (u32) ec->data_addr); | ||
564 | seq_printf(seq, "use global lock: %s\n", | 557 | seq_printf(seq, "use global lock: %s\n", |
565 | ec->global_lock ? "yes" : "no"); | 558 | ec->global_lock ? "yes" : "no"); |
566 | acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); | 559 | acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); |
@@ -586,7 +579,6 @@ static int acpi_ec_add_fs(struct acpi_device *device) | |||
586 | { | 579 | { |
587 | struct proc_dir_entry *entry = NULL; | 580 | struct proc_dir_entry *entry = NULL; |
588 | 581 | ||
589 | |||
590 | if (!acpi_device_dir(device)) { | 582 | if (!acpi_device_dir(device)) { |
591 | acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), | 583 | acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), |
592 | acpi_ec_dir); | 584 | acpi_ec_dir); |
@@ -629,7 +621,6 @@ static int acpi_ec_add(struct acpi_device *device) | |||
629 | acpi_status status = AE_OK; | 621 | acpi_status status = AE_OK; |
630 | struct acpi_ec *ec = NULL; | 622 | struct acpi_ec *ec = NULL; |
631 | 623 | ||
632 | |||
633 | if (!device) | 624 | if (!device) |
634 | return -EINVAL; | 625 | return -EINVAL; |
635 | 626 | ||
@@ -651,8 +642,7 @@ static int acpi_ec_add(struct acpi_device *device) | |||
651 | acpi_driver_data(device) = ec; | 642 | acpi_driver_data(device) = ec; |
652 | 643 | ||
653 | /* Use the global lock for all EC transactions? */ | 644 | /* Use the global lock for all EC transactions? */ |
654 | acpi_evaluate_integer(ec->handle, "_GLK", NULL, | 645 | acpi_evaluate_integer(ec->handle, "_GLK", NULL, &ec->global_lock); |
655 | &ec->global_lock); | ||
656 | 646 | ||
657 | /* XXX we don't test uids, because on some boxes ecdt uid = 0, see: | 647 | /* XXX we don't test uids, because on some boxes ecdt uid = 0, see: |
658 | http://bugzilla.kernel.org/show_bug.cgi?id=6111 */ | 648 | http://bugzilla.kernel.org/show_bug.cgi?id=6111 */ |
@@ -669,11 +659,10 @@ static int acpi_ec_add(struct acpi_device *device) | |||
669 | 659 | ||
670 | /* Get GPE bit assignment (EC events). */ | 660 | /* Get GPE bit assignment (EC events). */ |
671 | /* TODO: Add support for _GPE returning a package */ | 661 | /* TODO: Add support for _GPE returning a package */ |
672 | status = | 662 | status = acpi_evaluate_integer(ec->handle, "_GPE", NULL, &ec->gpe); |
673 | acpi_evaluate_integer(ec->handle, "_GPE", NULL, | ||
674 | &ec->gpe); | ||
675 | if (ACPI_FAILURE(status)) { | 663 | if (ACPI_FAILURE(status)) { |
676 | ACPI_EXCEPTION((AE_INFO, status, "Obtaining GPE bit assignment")); | 664 | ACPI_EXCEPTION((AE_INFO, status, |
665 | "Obtaining GPE bit assignment")); | ||
677 | result = -ENODEV; | 666 | result = -ENODEV; |
678 | goto end; | 667 | goto end; |
679 | } | 668 | } |
@@ -683,13 +672,13 @@ static int acpi_ec_add(struct acpi_device *device) | |||
683 | goto end; | 672 | goto end; |
684 | 673 | ||
685 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s [%s] (gpe %d) interrupt mode.", | 674 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s [%s] (gpe %d) interrupt mode.", |
686 | acpi_device_name(device), acpi_device_bid(device), | 675 | acpi_device_name(device), acpi_device_bid(device), |
687 | (u32) ec->gpe)); | 676 | (u32) ec->gpe)); |
688 | 677 | ||
689 | if (!first_ec) | 678 | if (!first_ec) |
690 | first_ec = device; | 679 | first_ec = device; |
691 | 680 | ||
692 | end: | 681 | end: |
693 | if (result) | 682 | if (result) |
694 | kfree(ec); | 683 | kfree(ec); |
695 | 684 | ||
@@ -700,7 +689,6 @@ static int acpi_ec_remove(struct acpi_device *device, int type) | |||
700 | { | 689 | { |
701 | struct acpi_ec *ec = NULL; | 690 | struct acpi_ec *ec = NULL; |
702 | 691 | ||
703 | |||
704 | if (!device) | 692 | if (!device) |
705 | return -EINVAL; | 693 | return -EINVAL; |
706 | 694 | ||
@@ -743,7 +731,6 @@ static int acpi_ec_start(struct acpi_device *device) | |||
743 | acpi_status status = AE_OK; | 731 | acpi_status status = AE_OK; |
744 | struct acpi_ec *ec = NULL; | 732 | struct acpi_ec *ec = NULL; |
745 | 733 | ||
746 | |||
747 | if (!device) | 734 | if (!device) |
748 | return -EINVAL; | 735 | return -EINVAL; |
749 | 736 | ||
@@ -783,8 +770,7 @@ static int acpi_ec_start(struct acpi_device *device) | |||
783 | &acpi_ec_space_handler, | 770 | &acpi_ec_space_handler, |
784 | &acpi_ec_space_setup, ec); | 771 | &acpi_ec_space_setup, ec); |
785 | if (ACPI_FAILURE(status)) { | 772 | if (ACPI_FAILURE(status)) { |
786 | acpi_remove_gpe_handler(NULL, ec->gpe, | 773 | acpi_remove_gpe_handler(NULL, ec->gpe, &acpi_ec_gpe_handler); |
787 | &acpi_ec_gpe_handler); | ||
788 | return -ENODEV; | 774 | return -ENODEV; |
789 | } | 775 | } |
790 | 776 | ||
@@ -796,7 +782,6 @@ static int acpi_ec_stop(struct acpi_device *device, int type) | |||
796 | acpi_status status = AE_OK; | 782 | acpi_status status = AE_OK; |
797 | struct acpi_ec *ec = NULL; | 783 | struct acpi_ec *ec = NULL; |
798 | 784 | ||
799 | |||
800 | if (!device) | 785 | if (!device) |
801 | return -EINVAL; | 786 | return -EINVAL; |
802 | 787 | ||
@@ -808,9 +793,7 @@ static int acpi_ec_stop(struct acpi_device *device, int type) | |||
808 | if (ACPI_FAILURE(status)) | 793 | if (ACPI_FAILURE(status)) |
809 | return -ENODEV; | 794 | return -ENODEV; |
810 | 795 | ||
811 | status = | 796 | status = acpi_remove_gpe_handler(NULL, ec->gpe, &acpi_ec_gpe_handler); |
812 | acpi_remove_gpe_handler(NULL, ec->gpe, | ||
813 | &acpi_ec_gpe_handler); | ||
814 | if (ACPI_FAILURE(status)) | 797 | if (ACPI_FAILURE(status)) |
815 | return -ENODEV; | 798 | return -ENODEV; |
816 | 799 | ||
@@ -835,16 +818,15 @@ acpi_fake_ecdt_callback(acpi_handle handle, | |||
835 | ec_ecdt->uid = -1; | 818 | ec_ecdt->uid = -1; |
836 | acpi_evaluate_integer(handle, "_UID", NULL, &ec_ecdt->uid); | 819 | acpi_evaluate_integer(handle, "_UID", NULL, &ec_ecdt->uid); |
837 | 820 | ||
838 | status = | 821 | status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec_ecdt->gpe); |
839 | acpi_evaluate_integer(handle, "_GPE", NULL, | ||
840 | &ec_ecdt->gpe); | ||
841 | if (ACPI_FAILURE(status)) | 822 | if (ACPI_FAILURE(status)) |
842 | return status; | 823 | return status; |
843 | ec_ecdt->global_lock = TRUE; | 824 | ec_ecdt->global_lock = TRUE; |
844 | ec_ecdt->handle = handle; | 825 | ec_ecdt->handle = handle; |
845 | 826 | ||
846 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "GPE=0x%02lx, ports=0x%2lx, 0x%2lx", | 827 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "GPE=0x%02lx, ports=0x%2lx, 0x%2lx", |
847 | ec_ecdt->gpe, ec_ecdt->command_addr, ec_ecdt->data_addr)); | 828 | ec_ecdt->gpe, ec_ecdt->command_addr, |
829 | ec_ecdt->data_addr)); | ||
848 | 830 | ||
849 | return AE_CTRL_TERMINATE; | 831 | return AE_CTRL_TERMINATE; |
850 | } | 832 | } |
@@ -883,7 +865,7 @@ static int __init acpi_ec_fake_ecdt(void) | |||
883 | goto error; | 865 | goto error; |
884 | } | 866 | } |
885 | return 0; | 867 | return 0; |
886 | error: | 868 | error: |
887 | return ret; | 869 | return ret; |
888 | } | 870 | } |
889 | 871 | ||
@@ -919,14 +901,13 @@ static int __init acpi_ec_get_real_ecdt(void) | |||
919 | ec_ecdt->global_lock = TRUE; | 901 | ec_ecdt->global_lock = TRUE; |
920 | ec_ecdt->uid = ecdt_ptr->uid; | 902 | ec_ecdt->uid = ecdt_ptr->uid; |
921 | 903 | ||
922 | status = | 904 | status = acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle); |
923 | acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle); | ||
924 | if (ACPI_FAILURE(status)) { | 905 | if (ACPI_FAILURE(status)) { |
925 | goto error; | 906 | goto error; |
926 | } | 907 | } |
927 | 908 | ||
928 | return 0; | 909 | return 0; |
929 | error: | 910 | error: |
930 | ACPI_EXCEPTION((AE_INFO, status, "Could not use ECDT")); | 911 | ACPI_EXCEPTION((AE_INFO, status, "Could not use ECDT")); |
931 | kfree(ec_ecdt); | 912 | kfree(ec_ecdt); |
932 | ec_ecdt = NULL; | 913 | ec_ecdt = NULL; |
@@ -986,7 +967,6 @@ static int __init acpi_ec_init(void) | |||
986 | { | 967 | { |
987 | int result = 0; | 968 | int result = 0; |
988 | 969 | ||
989 | |||
990 | if (acpi_disabled) | 970 | if (acpi_disabled) |
991 | return 0; | 971 | return 0; |
992 | 972 | ||
@@ -1039,7 +1019,8 @@ static int __init acpi_ec_set_intr_mode(char *str) | |||
1039 | acpi_ec_mode = EC_POLL; | 1019 | acpi_ec_mode = EC_POLL; |
1040 | } | 1020 | } |
1041 | acpi_ec_driver.ops.add = acpi_ec_add; | 1021 | acpi_ec_driver.ops.add = acpi_ec_add; |
1042 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "EC %s mode.\n", intr ? "interrupt" : "polling")); | 1022 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "EC %s mode.\n", |
1023 | intr ? "interrupt" : "polling")); | ||
1043 | 1024 | ||
1044 | return 1; | 1025 | return 1; |
1045 | } | 1026 | } |