aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/thinkpad_acpi.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index 809ec8400ec5..344eb551c443 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -511,6 +511,8 @@ static int hotkey_orig_mask;
511 511
512static int __init hotkey_init(struct ibm_init_struct *iibm) 512static int __init hotkey_init(struct ibm_init_struct *iibm)
513{ 513{
514 int res;
515
514 vdbg_printk(TPACPI_DBG_INIT, "initializing hotkey subdriver\n"); 516 vdbg_printk(TPACPI_DBG_INIT, "initializing hotkey subdriver\n");
515 517
516 IBM_ACPIHANDLE_INIT(hkey); 518 IBM_ACPIHANDLE_INIT(hkey);
@@ -530,8 +532,9 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
530 vdbg_printk(TPACPI_DBG_INIT, "hotkey masks are %s\n", 532 vdbg_printk(TPACPI_DBG_INIT, "hotkey masks are %s\n",
531 str_supported(tp_features.hotkey_mask)); 533 str_supported(tp_features.hotkey_mask));
532 534
533 if (!hotkey_get(&hotkey_orig_status, &hotkey_orig_mask)) 535 res = hotkey_get(&hotkey_orig_status, &hotkey_orig_mask);
534 return -ENODEV; 536 if (res)
537 return res;
535 } 538 }
536 539
537 return (tp_features.hotkey)? 0 : 1; 540 return (tp_features.hotkey)? 0 : 1;
@@ -539,9 +542,13 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
539 542
540static void hotkey_exit(void) 543static void hotkey_exit(void)
541{ 544{
545 int res;
546
542 if (tp_features.hotkey) { 547 if (tp_features.hotkey) {
543 dbg_printk(TPACPI_DBG_EXIT, "restoring original hotkey mask\n"); 548 dbg_printk(TPACPI_DBG_EXIT, "restoring original hotkey mask\n");
544 hotkey_set(hotkey_orig_status, hotkey_orig_mask); 549 res = hotkey_set(hotkey_orig_status, hotkey_orig_mask);
550 if (res)
551 printk(IBM_ERR "failed to restore hotkey to BIOS defaults\n");
545 } 552 }
546} 553}
547 554
@@ -560,13 +567,13 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
560static int hotkey_get(int *status, int *mask) 567static int hotkey_get(int *status, int *mask)
561{ 568{
562 if (!acpi_evalf(hkey_handle, status, "DHKC", "d")) 569 if (!acpi_evalf(hkey_handle, status, "DHKC", "d"))
563 return 0; 570 return -EIO;
564 571
565 if (tp_features.hotkey_mask) 572 if (tp_features.hotkey_mask)
566 if (!acpi_evalf(hkey_handle, mask, "DHKN", "d")) 573 if (!acpi_evalf(hkey_handle, mask, "DHKN", "d"))
567 return 0; 574 return -EIO;
568 575
569 return 1; 576 return 0;
570} 577}
571 578
572static int hotkey_set(int status, int mask) 579static int hotkey_set(int status, int mask)
@@ -574,22 +581,22 @@ static int hotkey_set(int status, int mask)
574 int i; 581 int i;
575 582
576 if (!acpi_evalf(hkey_handle, NULL, "MHKC", "vd", status)) 583 if (!acpi_evalf(hkey_handle, NULL, "MHKC", "vd", status))
577 return 0; 584 return -EIO;
578 585
579 if (tp_features.hotkey_mask) 586 if (tp_features.hotkey_mask)
580 for (i = 0; i < 32; i++) { 587 for (i = 0; i < 32; i++) {
581 int bit = ((1 << i) & mask) != 0; 588 int bit = ((1 << i) & mask) != 0;
582 if (!acpi_evalf(hkey_handle, 589 if (!acpi_evalf(hkey_handle,
583 NULL, "MHKM", "vdd", i + 1, bit)) 590 NULL, "MHKM", "vdd", i + 1, bit))
584 return 0; 591 return -EIO;
585 } 592 }
586 593
587 return 1; 594 return 0;
588} 595}
589 596
590static int hotkey_read(char *p) 597static int hotkey_read(char *p)
591{ 598{
592 int status, mask; 599 int res, status, mask;
593 int len = 0; 600 int len = 0;
594 601
595 if (!tp_features.hotkey) { 602 if (!tp_features.hotkey) {
@@ -597,8 +604,9 @@ static int hotkey_read(char *p)
597 return len; 604 return len;
598 } 605 }
599 606
600 if (!hotkey_get(&status, &mask)) 607 res = hotkey_get(&status, &mask);
601 return -EIO; 608 if (res)
609 return res;
602 610
603 len += sprintf(p + len, "status:\t\t%s\n", enabled(status, 0)); 611 len += sprintf(p + len, "status:\t\t%s\n", enabled(status, 0));
604 if (tp_features.hotkey_mask) { 612 if (tp_features.hotkey_mask) {
@@ -615,15 +623,16 @@ static int hotkey_read(char *p)
615 623
616static int hotkey_write(char *buf) 624static int hotkey_write(char *buf)
617{ 625{
618 int status, mask; 626 int res, status, mask;
619 char *cmd; 627 char *cmd;
620 int do_cmd = 0; 628 int do_cmd = 0;
621 629
622 if (!tp_features.hotkey) 630 if (!tp_features.hotkey)
623 return -ENODEV; 631 return -ENODEV;
624 632
625 if (!hotkey_get(&status, &mask)) 633 res = hotkey_get(&status, &mask);
626 return -EIO; 634 if (res)
635 return res;
627 636
628 while ((cmd = next_cmd(&buf))) { 637 while ((cmd = next_cmd(&buf))) {
629 if (strlencmp(cmd, "enable") == 0) { 638 if (strlencmp(cmd, "enable") == 0) {
@@ -642,8 +651,11 @@ static int hotkey_write(char *buf)
642 do_cmd = 1; 651 do_cmd = 1;
643 } 652 }
644 653
645 if (do_cmd && !hotkey_set(status, mask)) 654 if (do_cmd) {
646 return -EIO; 655 res = hotkey_set(status, mask);
656 if (res)
657 return res;
658 }
647 659
648 return 0; 660 return 0;
649} 661}