diff options
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/thinkpad_acpi.c | 147 | ||||
-rw-r--r-- | drivers/misc/thinkpad_acpi.h | 28 |
2 files changed, 83 insertions, 92 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index a5efd06523dd..e2a1b63a812f 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -501,8 +501,6 @@ static struct ibm_struct thinkpad_acpi_driver_data = { | |||
501 | * Hotkey subdriver | 501 | * Hotkey subdriver |
502 | */ | 502 | */ |
503 | 503 | ||
504 | static int hotkey_supported; | ||
505 | static int hotkey_mask_supported; | ||
506 | static int hotkey_orig_status; | 504 | static int hotkey_orig_status; |
507 | static int hotkey_orig_mask; | 505 | static int hotkey_orig_mask; |
508 | 506 | ||
@@ -513,30 +511,30 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) | |||
513 | IBM_HANDLE_INIT(hkey); | 511 | IBM_HANDLE_INIT(hkey); |
514 | 512 | ||
515 | /* hotkey not supported on 570 */ | 513 | /* hotkey not supported on 570 */ |
516 | hotkey_supported = hkey_handle != NULL; | 514 | tp_features.hotkey = hkey_handle != NULL; |
517 | 515 | ||
518 | vdbg_printk(TPACPI_DBG_INIT, "hotkeys are %s\n", | 516 | vdbg_printk(TPACPI_DBG_INIT, "hotkeys are %s\n", |
519 | str_supported(hotkey_supported)); | 517 | str_supported(tp_features.hotkey)); |
520 | 518 | ||
521 | if (hotkey_supported) { | 519 | if (tp_features.hotkey) { |
522 | /* mask not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, | 520 | /* mask not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, |
523 | A30, R30, R31, T20-22, X20-21, X22-24 */ | 521 | A30, R30, R31, T20-22, X20-21, X22-24 */ |
524 | hotkey_mask_supported = | 522 | tp_features.hotkey_mask = |
525 | acpi_evalf(hkey_handle, NULL, "DHKN", "qv"); | 523 | acpi_evalf(hkey_handle, NULL, "DHKN", "qv"); |
526 | 524 | ||
527 | vdbg_printk(TPACPI_DBG_INIT, "hotkey masks are %s\n", | 525 | vdbg_printk(TPACPI_DBG_INIT, "hotkey masks are %s\n", |
528 | str_supported(hotkey_mask_supported)); | 526 | str_supported(tp_features.hotkey_mask)); |
529 | 527 | ||
530 | if (!hotkey_get(&hotkey_orig_status, &hotkey_orig_mask)) | 528 | if (!hotkey_get(&hotkey_orig_status, &hotkey_orig_mask)) |
531 | return -ENODEV; | 529 | return -ENODEV; |
532 | } | 530 | } |
533 | 531 | ||
534 | return (hotkey_supported)? 0 : 1; | 532 | return (tp_features.hotkey)? 0 : 1; |
535 | } | 533 | } |
536 | 534 | ||
537 | static void hotkey_exit(void) | 535 | static void hotkey_exit(void) |
538 | { | 536 | { |
539 | if (hotkey_supported) { | 537 | if (tp_features.hotkey) { |
540 | dbg_printk(TPACPI_DBG_EXIT, "restoring original hotkey mask\n"); | 538 | dbg_printk(TPACPI_DBG_EXIT, "restoring original hotkey mask\n"); |
541 | hotkey_set(hotkey_orig_status, hotkey_orig_mask); | 539 | hotkey_set(hotkey_orig_status, hotkey_orig_mask); |
542 | } | 540 | } |
@@ -559,7 +557,7 @@ static int hotkey_get(int *status, int *mask) | |||
559 | if (!acpi_evalf(hkey_handle, status, "DHKC", "d")) | 557 | if (!acpi_evalf(hkey_handle, status, "DHKC", "d")) |
560 | return 0; | 558 | return 0; |
561 | 559 | ||
562 | if (hotkey_mask_supported) | 560 | if (tp_features.hotkey_mask) |
563 | if (!acpi_evalf(hkey_handle, mask, "DHKN", "d")) | 561 | if (!acpi_evalf(hkey_handle, mask, "DHKN", "d")) |
564 | return 0; | 562 | return 0; |
565 | 563 | ||
@@ -573,7 +571,7 @@ static int hotkey_set(int status, int mask) | |||
573 | if (!acpi_evalf(hkey_handle, NULL, "MHKC", "vd", status)) | 571 | if (!acpi_evalf(hkey_handle, NULL, "MHKC", "vd", status)) |
574 | return 0; | 572 | return 0; |
575 | 573 | ||
576 | if (hotkey_mask_supported) | 574 | if (tp_features.hotkey_mask) |
577 | for (i = 0; i < 32; i++) { | 575 | for (i = 0; i < 32; i++) { |
578 | int bit = ((1 << i) & mask) != 0; | 576 | int bit = ((1 << i) & mask) != 0; |
579 | if (!acpi_evalf(hkey_handle, | 577 | if (!acpi_evalf(hkey_handle, |
@@ -589,7 +587,7 @@ static int hotkey_read(char *p) | |||
589 | int status, mask; | 587 | int status, mask; |
590 | int len = 0; | 588 | int len = 0; |
591 | 589 | ||
592 | if (!hotkey_supported) { | 590 | if (!tp_features.hotkey) { |
593 | len += sprintf(p + len, "status:\t\tnot supported\n"); | 591 | len += sprintf(p + len, "status:\t\tnot supported\n"); |
594 | return len; | 592 | return len; |
595 | } | 593 | } |
@@ -598,7 +596,7 @@ static int hotkey_read(char *p) | |||
598 | return -EIO; | 596 | return -EIO; |
599 | 597 | ||
600 | len += sprintf(p + len, "status:\t\t%s\n", enabled(status, 0)); | 598 | len += sprintf(p + len, "status:\t\t%s\n", enabled(status, 0)); |
601 | if (hotkey_mask_supported) { | 599 | if (tp_features.hotkey_mask) { |
602 | len += sprintf(p + len, "mask:\t\t0x%04x\n", mask); | 600 | len += sprintf(p + len, "mask:\t\t0x%04x\n", mask); |
603 | len += sprintf(p + len, | 601 | len += sprintf(p + len, |
604 | "commands:\tenable, disable, reset, <mask>\n"); | 602 | "commands:\tenable, disable, reset, <mask>\n"); |
@@ -616,7 +614,7 @@ static int hotkey_write(char *buf) | |||
616 | char *cmd; | 614 | char *cmd; |
617 | int do_cmd = 0; | 615 | int do_cmd = 0; |
618 | 616 | ||
619 | if (!hotkey_supported) | 617 | if (!tp_features.hotkey) |
620 | return -ENODEV; | 618 | return -ENODEV; |
621 | 619 | ||
622 | if (!hotkey_get(&status, &mask)) | 620 | if (!hotkey_get(&status, &mask)) |
@@ -660,8 +658,6 @@ static struct ibm_struct hotkey_driver_data = { | |||
660 | * Bluetooth subdriver | 658 | * Bluetooth subdriver |
661 | */ | 659 | */ |
662 | 660 | ||
663 | static int bluetooth_supported; | ||
664 | |||
665 | static int __init bluetooth_init(struct ibm_init_struct *iibm) | 661 | static int __init bluetooth_init(struct ibm_init_struct *iibm) |
666 | { | 662 | { |
667 | vdbg_printk(TPACPI_DBG_INIT, "initializing bluetooth subdriver\n"); | 663 | vdbg_printk(TPACPI_DBG_INIT, "initializing bluetooth subdriver\n"); |
@@ -670,20 +666,20 @@ static int __init bluetooth_init(struct ibm_init_struct *iibm) | |||
670 | 666 | ||
671 | /* bluetooth not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, | 667 | /* bluetooth not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, |
672 | G4x, R30, R31, R40e, R50e, T20-22, X20-21 */ | 668 | G4x, R30, R31, R40e, R50e, T20-22, X20-21 */ |
673 | bluetooth_supported = hkey_handle && | 669 | tp_features.bluetooth = hkey_handle && |
674 | acpi_evalf(hkey_handle, NULL, "GBDC", "qv"); | 670 | acpi_evalf(hkey_handle, NULL, "GBDC", "qv"); |
675 | 671 | ||
676 | vdbg_printk(TPACPI_DBG_INIT, "bluetooth is %s\n", | 672 | vdbg_printk(TPACPI_DBG_INIT, "bluetooth is %s\n", |
677 | str_supported(bluetooth_supported)); | 673 | str_supported(tp_features.bluetooth)); |
678 | 674 | ||
679 | return (bluetooth_supported)? 0 : 1; | 675 | return (tp_features.bluetooth)? 0 : 1; |
680 | } | 676 | } |
681 | 677 | ||
682 | static int bluetooth_status(void) | 678 | static int bluetooth_status(void) |
683 | { | 679 | { |
684 | int status; | 680 | int status; |
685 | 681 | ||
686 | if (!bluetooth_supported || | 682 | if (!tp_features.bluetooth || |
687 | !acpi_evalf(hkey_handle, &status, "GBDC", "d")) | 683 | !acpi_evalf(hkey_handle, &status, "GBDC", "d")) |
688 | status = 0; | 684 | status = 0; |
689 | 685 | ||
@@ -695,7 +691,7 @@ static int bluetooth_read(char *p) | |||
695 | int len = 0; | 691 | int len = 0; |
696 | int status = bluetooth_status(); | 692 | int status = bluetooth_status(); |
697 | 693 | ||
698 | if (!bluetooth_supported) | 694 | if (!tp_features.bluetooth) |
699 | len += sprintf(p + len, "status:\t\tnot supported\n"); | 695 | len += sprintf(p + len, "status:\t\tnot supported\n"); |
700 | else if (!(status & 1)) | 696 | else if (!(status & 1)) |
701 | len += sprintf(p + len, "status:\t\tnot installed\n"); | 697 | len += sprintf(p + len, "status:\t\tnot installed\n"); |
@@ -713,7 +709,7 @@ static int bluetooth_write(char *buf) | |||
713 | char *cmd; | 709 | char *cmd; |
714 | int do_cmd = 0; | 710 | int do_cmd = 0; |
715 | 711 | ||
716 | if (!bluetooth_supported) | 712 | if (!tp_features.bluetooth) |
717 | return -ENODEV; | 713 | return -ENODEV; |
718 | 714 | ||
719 | while ((cmd = next_cmd(&buf))) { | 715 | while ((cmd = next_cmd(&buf))) { |
@@ -742,28 +738,27 @@ static struct ibm_struct bluetooth_driver_data = { | |||
742 | * Wan subdriver | 738 | * Wan subdriver |
743 | */ | 739 | */ |
744 | 740 | ||
745 | static int wan_supported; | ||
746 | |||
747 | static int __init wan_init(struct ibm_init_struct *iibm) | 741 | static int __init wan_init(struct ibm_init_struct *iibm) |
748 | { | 742 | { |
749 | vdbg_printk(TPACPI_DBG_INIT, "initializing wan subdriver\n"); | 743 | vdbg_printk(TPACPI_DBG_INIT, "initializing wan subdriver\n"); |
750 | 744 | ||
751 | IBM_HANDLE_INIT(hkey); | 745 | IBM_HANDLE_INIT(hkey); |
752 | 746 | ||
753 | wan_supported = hkey_handle && | 747 | tp_features.wan = hkey_handle && |
754 | acpi_evalf(hkey_handle, NULL, "GWAN", "qv"); | 748 | acpi_evalf(hkey_handle, NULL, "GWAN", "qv"); |
755 | 749 | ||
756 | vdbg_printk(TPACPI_DBG_INIT, "wan is %s\n", | 750 | vdbg_printk(TPACPI_DBG_INIT, "wan is %s\n", |
757 | str_supported(wan_supported)); | 751 | str_supported(tp_features.wan)); |
758 | 752 | ||
759 | return (wan_supported)? 0 : 1; | 753 | return (tp_features.wan)? 0 : 1; |
760 | } | 754 | } |
761 | 755 | ||
762 | static int wan_status(void) | 756 | static int wan_status(void) |
763 | { | 757 | { |
764 | int status; | 758 | int status; |
765 | 759 | ||
766 | if (!wan_supported || !acpi_evalf(hkey_handle, &status, "GWAN", "d")) | 760 | if (!tp_features.wan || |
761 | !acpi_evalf(hkey_handle, &status, "GWAN", "d")) | ||
767 | status = 0; | 762 | status = 0; |
768 | 763 | ||
769 | return status; | 764 | return status; |
@@ -774,7 +769,7 @@ static int wan_read(char *p) | |||
774 | int len = 0; | 769 | int len = 0; |
775 | int status = wan_status(); | 770 | int status = wan_status(); |
776 | 771 | ||
777 | if (!wan_supported) | 772 | if (!tp_features.wan) |
778 | len += sprintf(p + len, "status:\t\tnot supported\n"); | 773 | len += sprintf(p + len, "status:\t\tnot supported\n"); |
779 | else if (!(status & 1)) | 774 | else if (!(status & 1)) |
780 | len += sprintf(p + len, "status:\t\tnot installed\n"); | 775 | len += sprintf(p + len, "status:\t\tnot installed\n"); |
@@ -792,7 +787,7 @@ static int wan_write(char *buf) | |||
792 | char *cmd; | 787 | char *cmd; |
793 | int do_cmd = 0; | 788 | int do_cmd = 0; |
794 | 789 | ||
795 | if (!wan_supported) | 790 | if (!tp_features.wan) |
796 | return -ENODEV; | 791 | return -ENODEV; |
797 | 792 | ||
798 | while ((cmd = next_cmd(&buf))) { | 793 | while ((cmd = next_cmd(&buf))) { |
@@ -1051,9 +1046,6 @@ static struct ibm_struct video_driver_data = { | |||
1051 | * Light (thinklight) subdriver | 1046 | * Light (thinklight) subdriver |
1052 | */ | 1047 | */ |
1053 | 1048 | ||
1054 | static int light_supported; | ||
1055 | static int light_status_supported; | ||
1056 | |||
1057 | IBM_HANDLE(lght, root, "\\LGHT"); /* A21e, A2xm/p, T20-22, X20-21 */ | 1049 | IBM_HANDLE(lght, root, "\\LGHT"); /* A21e, A2xm/p, T20-22, X20-21 */ |
1058 | IBM_HANDLE(ledb, ec, "LEDB"); /* G4x */ | 1050 | IBM_HANDLE(ledb, ec, "LEDB"); /* G4x */ |
1059 | 1051 | ||
@@ -1066,18 +1058,18 @@ static int __init light_init(struct ibm_init_struct *iibm) | |||
1066 | IBM_HANDLE_INIT(cmos); | 1058 | IBM_HANDLE_INIT(cmos); |
1067 | 1059 | ||
1068 | /* light not supported on 570, 600e/x, 770e, 770x, G4x, R30, R31 */ | 1060 | /* light not supported on 570, 600e/x, 770e, 770x, G4x, R30, R31 */ |
1069 | light_supported = (cmos_handle || lght_handle) && !ledb_handle; | 1061 | tp_features.light = (cmos_handle || lght_handle) && !ledb_handle; |
1070 | 1062 | ||
1071 | if (light_supported) | 1063 | if (tp_features.light) |
1072 | /* light status not supported on | 1064 | /* light status not supported on |
1073 | 570, 600e/x, 770e, 770x, G4x, R30, R31, R32, X20 */ | 1065 | 570, 600e/x, 770e, 770x, G4x, R30, R31, R32, X20 */ |
1074 | light_status_supported = acpi_evalf(ec_handle, NULL, | 1066 | tp_features.light_status = |
1075 | "KBLT", "qv"); | 1067 | acpi_evalf(ec_handle, NULL, "KBLT", "qv"); |
1076 | 1068 | ||
1077 | vdbg_printk(TPACPI_DBG_INIT, "light is %s\n", | 1069 | vdbg_printk(TPACPI_DBG_INIT, "light is %s\n", |
1078 | str_supported(light_supported)); | 1070 | str_supported(tp_features.light)); |
1079 | 1071 | ||
1080 | return (light_supported)? 0 : 1; | 1072 | return (tp_features.light)? 0 : 1; |
1081 | } | 1073 | } |
1082 | 1074 | ||
1083 | static int light_read(char *p) | 1075 | static int light_read(char *p) |
@@ -1085,9 +1077,9 @@ static int light_read(char *p) | |||
1085 | int len = 0; | 1077 | int len = 0; |
1086 | int status = 0; | 1078 | int status = 0; |
1087 | 1079 | ||
1088 | if (!light_supported) { | 1080 | if (!tp_features.light) { |
1089 | len += sprintf(p + len, "status:\t\tnot supported\n"); | 1081 | len += sprintf(p + len, "status:\t\tnot supported\n"); |
1090 | } else if (!light_status_supported) { | 1082 | } else if (!tp_features.light_status) { |
1091 | len += sprintf(p + len, "status:\t\tunknown\n"); | 1083 | len += sprintf(p + len, "status:\t\tunknown\n"); |
1092 | len += sprintf(p + len, "commands:\ton, off\n"); | 1084 | len += sprintf(p + len, "commands:\ton, off\n"); |
1093 | } else { | 1085 | } else { |
@@ -1106,7 +1098,7 @@ static int light_write(char *buf) | |||
1106 | char *cmd; | 1098 | char *cmd; |
1107 | int success; | 1099 | int success; |
1108 | 1100 | ||
1109 | if (!light_supported) | 1101 | if (!tp_features.light) |
1110 | return -ENODEV; | 1102 | return -ENODEV; |
1111 | 1103 | ||
1112 | while ((cmd = next_cmd(&buf))) { | 1104 | while ((cmd = next_cmd(&buf))) { |
@@ -1251,11 +1243,6 @@ static struct ibm_struct dock_driver_data[2] = { | |||
1251 | */ | 1243 | */ |
1252 | 1244 | ||
1253 | #ifdef CONFIG_THINKPAD_ACPI_BAY | 1245 | #ifdef CONFIG_THINKPAD_ACPI_BAY |
1254 | static int bay_status_supported; | ||
1255 | static int bay_status2_supported; | ||
1256 | static int bay_eject_supported; | ||
1257 | static int bay_eject2_supported; | ||
1258 | |||
1259 | IBM_HANDLE(bay, root, "\\_SB.PCI.IDE.SECN.MAST", /* 570 */ | 1246 | IBM_HANDLE(bay, root, "\\_SB.PCI.IDE.SECN.MAST", /* 570 */ |
1260 | "\\_SB.PCI0.IDE0.IDES.IDSM", /* 600e/x, 770e, 770x */ | 1247 | "\\_SB.PCI0.IDE0.IDES.IDSM", /* 600e/x, 770e, 770x */ |
1261 | "\\_SB.PCI0.SATA.SCND.MSTR", /* T60, X60, Z60 */ | 1248 | "\\_SB.PCI0.SATA.SCND.MSTR", /* T60, X60, Z60 */ |
@@ -1282,25 +1269,25 @@ static int __init bay_init(struct ibm_init_struct *iibm) | |||
1282 | if (bay2_handle) | 1269 | if (bay2_handle) |
1283 | IBM_HANDLE_INIT(bay2_ej); | 1270 | IBM_HANDLE_INIT(bay2_ej); |
1284 | 1271 | ||
1285 | bay_status_supported = bay_handle && | 1272 | tp_features.bay_status = bay_handle && |
1286 | acpi_evalf(bay_handle, NULL, "_STA", "qv"); | 1273 | acpi_evalf(bay_handle, NULL, "_STA", "qv"); |
1287 | bay_status2_supported = bay2_handle && | 1274 | tp_features.bay_status2 = bay2_handle && |
1288 | acpi_evalf(bay2_handle, NULL, "_STA", "qv"); | 1275 | acpi_evalf(bay2_handle, NULL, "_STA", "qv"); |
1289 | 1276 | ||
1290 | bay_eject_supported = bay_handle && bay_ej_handle && | 1277 | tp_features.bay_eject = bay_handle && bay_ej_handle && |
1291 | (strlencmp(bay_ej_path, "_EJ0") == 0 || experimental); | 1278 | (strlencmp(bay_ej_path, "_EJ0") == 0 || experimental); |
1292 | bay_eject2_supported = bay2_handle && bay2_ej_handle && | 1279 | tp_features.bay_eject2 = bay2_handle && bay2_ej_handle && |
1293 | (strlencmp(bay2_ej_path, "_EJ0") == 0 || experimental); | 1280 | (strlencmp(bay2_ej_path, "_EJ0") == 0 || experimental); |
1294 | 1281 | ||
1295 | vdbg_printk(TPACPI_DBG_INIT, | 1282 | vdbg_printk(TPACPI_DBG_INIT, |
1296 | "bay 1: status %s, eject %s; bay 2: status %s, eject %s\n", | 1283 | "bay 1: status %s, eject %s; bay 2: status %s, eject %s\n", |
1297 | str_supported(bay_status_supported), | 1284 | str_supported(tp_features.bay_status), |
1298 | str_supported(bay_eject_supported), | 1285 | str_supported(tp_features.bay_eject), |
1299 | str_supported(bay_status2_supported), | 1286 | str_supported(tp_features.bay_status2), |
1300 | str_supported(bay_eject2_supported)); | 1287 | str_supported(tp_features.bay_eject2)); |
1301 | 1288 | ||
1302 | return (bay_status_supported || bay_eject_supported || | 1289 | return (tp_features.bay_status || tp_features.bay_eject || |
1303 | bay_status2_supported || bay_eject2_supported)? 0 : 1; | 1290 | tp_features.bay_status2 || tp_features.bay_eject2)? 0 : 1; |
1304 | } | 1291 | } |
1305 | 1292 | ||
1306 | static void bay_notify(struct ibm_struct *ibm, u32 event) | 1293 | static void bay_notify(struct ibm_struct *ibm, u32 event) |
@@ -1317,15 +1304,16 @@ static int bay_read(char *p) | |||
1317 | int occupied2 = bay_occupied(bay2); | 1304 | int occupied2 = bay_occupied(bay2); |
1318 | int eject, eject2; | 1305 | int eject, eject2; |
1319 | 1306 | ||
1320 | len += sprintf(p + len, "status:\t\t%s\n", bay_status_supported ? | 1307 | len += sprintf(p + len, "status:\t\t%s\n", |
1321 | (occupied ? "occupied" : "unoccupied") : | 1308 | tp_features.bay_status ? |
1322 | "not supported"); | 1309 | (occupied ? "occupied" : "unoccupied") : |
1323 | if (bay_status2_supported) | 1310 | "not supported"); |
1311 | if (tp_features.bay_status2) | ||
1324 | len += sprintf(p + len, "status2:\t%s\n", occupied2 ? | 1312 | len += sprintf(p + len, "status2:\t%s\n", occupied2 ? |
1325 | "occupied" : "unoccupied"); | 1313 | "occupied" : "unoccupied"); |
1326 | 1314 | ||
1327 | eject = bay_eject_supported && occupied; | 1315 | eject = tp_features.bay_eject && occupied; |
1328 | eject2 = bay_eject2_supported && occupied2; | 1316 | eject2 = tp_features.bay_eject2 && occupied2; |
1329 | 1317 | ||
1330 | if (eject && eject2) | 1318 | if (eject && eject2) |
1331 | len += sprintf(p + len, "commands:\teject, eject2\n"); | 1319 | len += sprintf(p + len, "commands:\teject, eject2\n"); |
@@ -1341,14 +1329,14 @@ static int bay_write(char *buf) | |||
1341 | { | 1329 | { |
1342 | char *cmd; | 1330 | char *cmd; |
1343 | 1331 | ||
1344 | if (!bay_eject_supported && !bay_eject2_supported) | 1332 | if (!tp_features.bay_eject && !tp_features.bay_eject2) |
1345 | return -ENODEV; | 1333 | return -ENODEV; |
1346 | 1334 | ||
1347 | while ((cmd = next_cmd(&buf))) { | 1335 | while ((cmd = next_cmd(&buf))) { |
1348 | if (bay_eject_supported && strlencmp(cmd, "eject") == 0) { | 1336 | if (tp_features.bay_eject && strlencmp(cmd, "eject") == 0) { |
1349 | if (!acpi_evalf(bay_ej_handle, NULL, NULL, "vd", 1)) | 1337 | if (!acpi_evalf(bay_ej_handle, NULL, NULL, "vd", 1)) |
1350 | return -EIO; | 1338 | return -EIO; |
1351 | } else if (bay_eject2_supported && | 1339 | } else if (tp_features.bay_eject2 && |
1352 | strlencmp(cmd, "eject2") == 0) { | 1340 | strlencmp(cmd, "eject2") == 0) { |
1353 | if (!acpi_evalf(bay2_ej_handle, NULL, NULL, "vd", 1)) | 1341 | if (!acpi_evalf(bay2_ej_handle, NULL, NULL, "vd", 1)) |
1354 | return -EIO; | 1342 | return -EIO; |
@@ -2188,7 +2176,6 @@ static enum fan_status_access_mode fan_status_access_mode; | |||
2188 | static enum fan_control_access_mode fan_control_access_mode; | 2176 | static enum fan_control_access_mode fan_control_access_mode; |
2189 | static enum fan_control_commands fan_control_commands; | 2177 | static enum fan_control_commands fan_control_commands; |
2190 | 2178 | ||
2191 | static int fan_control_status_known; | ||
2192 | static u8 fan_control_initial_status; | 2179 | static u8 fan_control_initial_status; |
2193 | 2180 | ||
2194 | static void fan_watchdog_fire(struct work_struct *ignored); | 2181 | static void fan_watchdog_fire(struct work_struct *ignored); |
@@ -2210,8 +2197,8 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
2210 | fan_status_access_mode = TPACPI_FAN_NONE; | 2197 | fan_status_access_mode = TPACPI_FAN_NONE; |
2211 | fan_control_access_mode = TPACPI_FAN_WR_NONE; | 2198 | fan_control_access_mode = TPACPI_FAN_WR_NONE; |
2212 | fan_control_commands = 0; | 2199 | fan_control_commands = 0; |
2213 | fan_control_status_known = 1; | ||
2214 | fan_watchdog_maxinterval = 0; | 2200 | fan_watchdog_maxinterval = 0; |
2201 | tp_features.fan_ctrl_status_undef = 0; | ||
2215 | 2202 | ||
2216 | IBM_HANDLE_INIT(fans); | 2203 | IBM_HANDLE_INIT(fans); |
2217 | IBM_HANDLE_INIT(gfan); | 2204 | IBM_HANDLE_INIT(gfan); |
@@ -2248,7 +2235,7 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
2248 | "fan_init: initial fan status is " | 2235 | "fan_init: initial fan status is " |
2249 | "unknown, assuming it is in auto " | 2236 | "unknown, assuming it is in auto " |
2250 | "mode\n"); | 2237 | "mode\n"); |
2251 | fan_control_status_known = 0; | 2238 | tp_features.fan_ctrl_status_undef = 1; |
2252 | } | 2239 | } |
2253 | } else { | 2240 | } else { |
2254 | printk(IBM_ERR | 2241 | printk(IBM_ERR |
@@ -2411,7 +2398,7 @@ static int fan_set_level(int level) | |||
2411 | if (!acpi_ec_write(fan_status_offset, level)) | 2398 | if (!acpi_ec_write(fan_status_offset, level)) |
2412 | return -EIO; | 2399 | return -EIO; |
2413 | else | 2400 | else |
2414 | fan_control_status_known = 1; | 2401 | tp_features.fan_ctrl_status_undef = 0; |
2415 | break; | 2402 | break; |
2416 | 2403 | ||
2417 | default: | 2404 | default: |
@@ -2438,7 +2425,7 @@ static int fan_set_enable(void) | |||
2438 | if (!acpi_ec_write(fan_status_offset, s)) | 2425 | if (!acpi_ec_write(fan_status_offset, s)) |
2439 | return -EIO; | 2426 | return -EIO; |
2440 | else | 2427 | else |
2441 | fan_control_status_known = 1; | 2428 | tp_features.fan_ctrl_status_undef = 0; |
2442 | break; | 2429 | break; |
2443 | 2430 | ||
2444 | case TPACPI_FAN_WR_ACPI_SFAN: | 2431 | case TPACPI_FAN_WR_ACPI_SFAN: |
@@ -2469,7 +2456,7 @@ static int fan_set_disable(void) | |||
2469 | if (!acpi_ec_write(fan_status_offset, 0x00)) | 2456 | if (!acpi_ec_write(fan_status_offset, 0x00)) |
2470 | return -EIO; | 2457 | return -EIO; |
2471 | else | 2458 | else |
2472 | fan_control_status_known = 1; | 2459 | tp_features.fan_ctrl_status_undef = 0; |
2473 | break; | 2460 | break; |
2474 | 2461 | ||
2475 | case TPACPI_FAN_WR_ACPI_SFAN: | 2462 | case TPACPI_FAN_WR_ACPI_SFAN: |
@@ -2524,9 +2511,9 @@ static int fan_read(char *p) | |||
2524 | if ((rc = fan_get_status(&status)) < 0) | 2511 | if ((rc = fan_get_status(&status)) < 0) |
2525 | return rc; | 2512 | return rc; |
2526 | 2513 | ||
2527 | if (unlikely(!fan_control_status_known)) { | 2514 | if (unlikely(tp_features.fan_ctrl_status_undef)) { |
2528 | if (status != fan_control_initial_status) | 2515 | if (status != fan_control_initial_status) |
2529 | fan_control_status_known = 1; | 2516 | tp_features.fan_ctrl_status_undef = 0; |
2530 | else | 2517 | else |
2531 | /* Return most likely status. In fact, it | 2518 | /* Return most likely status. In fact, it |
2532 | * might be the only possible status */ | 2519 | * might be the only possible status */ |
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h index 8b72061d8f0e..4d3ab4015ff2 100644 --- a/drivers/misc/thinkpad_acpi.h +++ b/drivers/misc/thinkpad_acpi.h | |||
@@ -173,6 +173,22 @@ struct ibm_init_struct { | |||
173 | struct ibm_struct *data; | 173 | struct ibm_struct *data; |
174 | }; | 174 | }; |
175 | 175 | ||
176 | static struct { | ||
177 | #ifdef CONFIG_THINKPAD_ACPI_BAY | ||
178 | u16 bay_status:1; | ||
179 | u16 bay_eject:1; | ||
180 | u16 bay_status2:1; | ||
181 | u16 bay_eject2:1; | ||
182 | #endif | ||
183 | u16 bluetooth:1; | ||
184 | u16 hotkey:1; | ||
185 | u16 hotkey_mask:1; | ||
186 | u16 light:1; | ||
187 | u16 light_status:1; | ||
188 | u16 wan:1; | ||
189 | u16 fan_ctrl_status_undef:1; | ||
190 | } tp_features; | ||
191 | |||
176 | static struct list_head tpacpi_all_drivers; | 192 | static struct list_head tpacpi_all_drivers; |
177 | 193 | ||
178 | static struct ibm_init_struct ibms_init[]; | 194 | static struct ibm_init_struct ibms_init[]; |
@@ -193,9 +209,6 @@ static int thinkpad_acpi_driver_read(char *p); | |||
193 | */ | 209 | */ |
194 | 210 | ||
195 | #ifdef CONFIG_THINKPAD_ACPI_BAY | 211 | #ifdef CONFIG_THINKPAD_ACPI_BAY |
196 | static int bay_status_supported, bay_eject_supported; | ||
197 | static int bay_status2_supported, bay_eject2_supported; | ||
198 | |||
199 | static acpi_handle bay_handle, bay_ej_handle; | 212 | static acpi_handle bay_handle, bay_ej_handle; |
200 | static acpi_handle bay2_handle, bay2_ej_handle; | 213 | static acpi_handle bay2_handle, bay2_ej_handle; |
201 | 214 | ||
@@ -220,8 +233,6 @@ static int beep_write(char *buf); | |||
220 | * Bluetooth subdriver | 233 | * Bluetooth subdriver |
221 | */ | 234 | */ |
222 | 235 | ||
223 | static int bluetooth_supported; | ||
224 | |||
225 | static int bluetooth_init(struct ibm_init_struct *iibm); | 236 | static int bluetooth_init(struct ibm_init_struct *iibm); |
226 | static int bluetooth_status(void); | 237 | static int bluetooth_status(void); |
227 | static int bluetooth_read(char *p); | 238 | static int bluetooth_read(char *p); |
@@ -311,7 +322,6 @@ enum fan_control_commands { | |||
311 | static enum fan_status_access_mode fan_status_access_mode; | 322 | static enum fan_status_access_mode fan_status_access_mode; |
312 | static enum fan_control_access_mode fan_control_access_mode; | 323 | static enum fan_control_access_mode fan_control_access_mode; |
313 | static enum fan_control_commands fan_control_commands; | 324 | static enum fan_control_commands fan_control_commands; |
314 | static int fan_control_status_known; | ||
315 | static u8 fan_control_initial_status; | 325 | static u8 fan_control_initial_status; |
316 | static int fan_watchdog_maxinterval; | 326 | static int fan_watchdog_maxinterval; |
317 | 327 | ||
@@ -340,8 +350,6 @@ static int fan_write_cmd_watchdog(const char *cmd, int *rc); | |||
340 | * Hotkey subdriver | 350 | * Hotkey subdriver |
341 | */ | 351 | */ |
342 | 352 | ||
343 | static int hotkey_supported; | ||
344 | static int hotkey_mask_supported; | ||
345 | static int hotkey_orig_status; | 353 | static int hotkey_orig_status; |
346 | static int hotkey_orig_mask; | 354 | static int hotkey_orig_mask; |
347 | 355 | ||
@@ -382,8 +390,6 @@ static int led_write(char *buf); | |||
382 | * Light (thinklight) subdriver | 390 | * Light (thinklight) subdriver |
383 | */ | 391 | */ |
384 | 392 | ||
385 | static int light_supported; | ||
386 | static int light_status_supported; | ||
387 | static acpi_handle lght_handle, ledb_handle; | 393 | static acpi_handle lght_handle, ledb_handle; |
388 | 394 | ||
389 | static int light_init(struct ibm_init_struct *iibm); | 395 | static int light_init(struct ibm_init_struct *iibm); |
@@ -453,8 +459,6 @@ static int volume_write(char *buf); | |||
453 | * Wan subdriver | 459 | * Wan subdriver |
454 | */ | 460 | */ |
455 | 461 | ||
456 | static int wan_supported; | ||
457 | |||
458 | static int wan_init(struct ibm_init_struct *iibm); | 462 | static int wan_init(struct ibm_init_struct *iibm); |
459 | static int wan_status(void); | 463 | static int wan_status(void); |
460 | static int wan_read(char *p); | 464 | static int wan_read(char *p); |