aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2007-04-21 10:08:36 -0400
committerLen Brown <len.brown@intel.com>2007-04-21 23:30:34 -0400
commitd8fd94d9f08237ffda7e44e6825b057bf20a90e3 (patch)
tree0c0a818fd36aaa8ea708e64ac4db727df95724e3 /drivers/misc
parent926411779287ad4f7013c9d80aa44fd131b70cd9 (diff)
ACPI: thinkpad-acpi: use bitfields for module flags
Use a bitfield to hold boolean module-wide flags, to conserve some memory. It is easy and it is clean, so we do it just for the heck of it even if it saves very little space. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/thinkpad_acpi.c147
-rw-r--r--drivers/misc/thinkpad_acpi.h28
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
504static int hotkey_supported;
505static int hotkey_mask_supported;
506static int hotkey_orig_status; 504static int hotkey_orig_status;
507static int hotkey_orig_mask; 505static 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
537static void hotkey_exit(void) 535static 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
663static int bluetooth_supported;
664
665static int __init bluetooth_init(struct ibm_init_struct *iibm) 661static 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
682static int bluetooth_status(void) 678static 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
745static int wan_supported;
746
747static int __init wan_init(struct ibm_init_struct *iibm) 741static 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
762static int wan_status(void) 756static 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
1054static int light_supported;
1055static int light_status_supported;
1056
1057IBM_HANDLE(lght, root, "\\LGHT"); /* A21e, A2xm/p, T20-22, X20-21 */ 1049IBM_HANDLE(lght, root, "\\LGHT"); /* A21e, A2xm/p, T20-22, X20-21 */
1058IBM_HANDLE(ledb, ec, "LEDB"); /* G4x */ 1050IBM_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
1083static int light_read(char *p) 1075static 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
1254static int bay_status_supported;
1255static int bay_status2_supported;
1256static int bay_eject_supported;
1257static int bay_eject2_supported;
1258
1259IBM_HANDLE(bay, root, "\\_SB.PCI.IDE.SECN.MAST", /* 570 */ 1246IBM_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
1306static void bay_notify(struct ibm_struct *ibm, u32 event) 1293static 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;
2188static enum fan_control_access_mode fan_control_access_mode; 2176static enum fan_control_access_mode fan_control_access_mode;
2189static enum fan_control_commands fan_control_commands; 2177static enum fan_control_commands fan_control_commands;
2190 2178
2191static int fan_control_status_known;
2192static u8 fan_control_initial_status; 2179static u8 fan_control_initial_status;
2193 2180
2194static void fan_watchdog_fire(struct work_struct *ignored); 2181static 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
176static 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
176static struct list_head tpacpi_all_drivers; 192static struct list_head tpacpi_all_drivers;
177 193
178static struct ibm_init_struct ibms_init[]; 194static 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
196static int bay_status_supported, bay_eject_supported;
197static int bay_status2_supported, bay_eject2_supported;
198
199static acpi_handle bay_handle, bay_ej_handle; 212static acpi_handle bay_handle, bay_ej_handle;
200static acpi_handle bay2_handle, bay2_ej_handle; 213static 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
223static int bluetooth_supported;
224
225static int bluetooth_init(struct ibm_init_struct *iibm); 236static int bluetooth_init(struct ibm_init_struct *iibm);
226static int bluetooth_status(void); 237static int bluetooth_status(void);
227static int bluetooth_read(char *p); 238static int bluetooth_read(char *p);
@@ -311,7 +322,6 @@ enum fan_control_commands {
311static enum fan_status_access_mode fan_status_access_mode; 322static enum fan_status_access_mode fan_status_access_mode;
312static enum fan_control_access_mode fan_control_access_mode; 323static enum fan_control_access_mode fan_control_access_mode;
313static enum fan_control_commands fan_control_commands; 324static enum fan_control_commands fan_control_commands;
314static int fan_control_status_known;
315static u8 fan_control_initial_status; 325static u8 fan_control_initial_status;
316static int fan_watchdog_maxinterval; 326static 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
343static int hotkey_supported;
344static int hotkey_mask_supported;
345static int hotkey_orig_status; 353static int hotkey_orig_status;
346static int hotkey_orig_mask; 354static 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
385static int light_supported;
386static int light_status_supported;
387static acpi_handle lght_handle, ledb_handle; 393static acpi_handle lght_handle, ledb_handle;
388 394
389static int light_init(struct ibm_init_struct *iibm); 395static 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
456static int wan_supported;
457
458static int wan_init(struct ibm_init_struct *iibm); 462static int wan_init(struct ibm_init_struct *iibm);
459static int wan_status(void); 463static int wan_status(void);
460static int wan_read(char *p); 464static int wan_read(char *p);