aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/ibm_acpi.c100
1 files changed, 43 insertions, 57 deletions
diff --git a/drivers/acpi/ibm_acpi.c b/drivers/acpi/ibm_acpi.c
index 36e2667d8652..8bb41bd85cd3 100644
--- a/drivers/acpi/ibm_acpi.c
+++ b/drivers/acpi/ibm_acpi.c
@@ -78,9 +78,11 @@
78#include <linux/init.h> 78#include <linux/init.h>
79#include <linux/types.h> 79#include <linux/types.h>
80#include <linux/string.h> 80#include <linux/string.h>
81
81#include <linux/proc_fs.h> 82#include <linux/proc_fs.h>
82#include <linux/backlight.h> 83#include <linux/backlight.h>
83#include <asm/uaccess.h> 84#include <asm/uaccess.h>
85
84#include <linux/dmi.h> 86#include <linux/dmi.h>
85#include <linux/jiffies.h> 87#include <linux/jiffies.h>
86#include <linux/workqueue.h> 88#include <linux/workqueue.h>
@@ -121,28 +123,6 @@ static acpi_handle root_handle = NULL;
121 static char *object##_path; \ 123 static char *object##_path; \
122 static char *object##_paths[] = { paths } 124 static char *object##_paths[] = { paths }
123 125
124/*
125 * The following models are supported to various degrees:
126 *
127 * 570, 600e, 600x, 770e, 770x
128 * A20m, A21e, A21m, A21p, A22p, A30, A30p, A31, A31p
129 * G40, G41
130 * R30, R31, R32, R40, R40e, R50, R50e, R50p, R51
131 * T20, T21, T22, T23, T30, T40, T40p, T41, T41p, T42, T42p, T43
132 * X20, X21, X22, X23, X24, X30, X31, X40
133 *
134 * The following models have no supported features:
135 *
136 * 240, 240x, i1400
137 *
138 * Still missing DSDTs for the following models:
139 *
140 * A20p, A22e, A22m
141 * R52
142 * S31
143 * T43p
144 */
145
146IBM_HANDLE(ec, root, "\\_SB.PCI0.ISA.EC0", /* 240, 240x */ 126IBM_HANDLE(ec, root, "\\_SB.PCI0.ISA.EC0", /* 240, 240x */
147 "\\_SB.PCI.ISA.EC", /* 570 */ 127 "\\_SB.PCI.ISA.EC", /* 570 */
148 "\\_SB.PCI0.ISA0.EC0", /* 600e/x, 770e, 770x */ 128 "\\_SB.PCI0.ISA0.EC0", /* 600e/x, 770e, 770x */
@@ -785,12 +765,15 @@ static int wan_write(char *buf)
785 return 0; 765 return 0;
786} 766}
787 767
788static int video_supported; 768enum video_access_mode {
789static int video_orig_autosw; 769 IBMACPI_VIDEO_NONE = 0,
770 IBMACPI_VIDEO_570, /* 570 */
771 IBMACPI_VIDEO_770, /* 600e/x, 770e, 770x */
772 IBMACPI_VIDEO_NEW, /* all others */
773};
790 774
791#define VIDEO_570 1 775static enum video_access_mode video_supported;
792#define VIDEO_770 2 776static int video_orig_autosw;
793#define VIDEO_NEW 3
794 777
795static int video_init(void) 778static int video_init(void)
796{ 779{
@@ -802,16 +785,16 @@ static int video_init(void)
802 785
803 if (!vid_handle) 786 if (!vid_handle)
804 /* video switching not supported on R30, R31 */ 787 /* video switching not supported on R30, R31 */
805 video_supported = 0; 788 video_supported = IBMACPI_VIDEO_NONE;
806 else if (acpi_evalf(vid_handle, &video_orig_autosw, "SWIT", "qd")) 789 else if (acpi_evalf(vid_handle, &video_orig_autosw, "SWIT", "qd"))
807 /* 570 */ 790 /* 570 */
808 video_supported = VIDEO_570; 791 video_supported = IBMACPI_VIDEO_570;
809 else if (acpi_evalf(vid_handle, &video_orig_autosw, "^VADL", "qd")) 792 else if (acpi_evalf(vid_handle, &video_orig_autosw, "^VADL", "qd"))
810 /* 600e/x, 770e, 770x */ 793 /* 600e/x, 770e, 770x */
811 video_supported = VIDEO_770; 794 video_supported = IBMACPI_VIDEO_770;
812 else 795 else
813 /* all others */ 796 /* all others */
814 video_supported = VIDEO_NEW; 797 video_supported = IBMACPI_VIDEO_NEW;
815 798
816 return 0; 799 return 0;
817} 800}
@@ -821,15 +804,15 @@ static int video_status(void)
821 int status = 0; 804 int status = 0;
822 int i; 805 int i;
823 806
824 if (video_supported == VIDEO_570) { 807 if (video_supported == IBMACPI_VIDEO_570) {
825 if (acpi_evalf(NULL, &i, "\\_SB.PHS", "dd", 0x87)) 808 if (acpi_evalf(NULL, &i, "\\_SB.PHS", "dd", 0x87))
826 status = i & 3; 809 status = i & 3;
827 } else if (video_supported == VIDEO_770) { 810 } else if (video_supported == IBMACPI_VIDEO_770) {
828 if (acpi_evalf(NULL, &i, "\\VCDL", "d")) 811 if (acpi_evalf(NULL, &i, "\\VCDL", "d"))
829 status |= 0x01 * i; 812 status |= 0x01 * i;
830 if (acpi_evalf(NULL, &i, "\\VCDC", "d")) 813 if (acpi_evalf(NULL, &i, "\\VCDC", "d"))
831 status |= 0x02 * i; 814 status |= 0x02 * i;
832 } else if (video_supported == VIDEO_NEW) { 815 } else if (video_supported == IBMACPI_VIDEO_NEW) {
833 acpi_evalf(NULL, NULL, "\\VUPS", "vd", 1); 816 acpi_evalf(NULL, NULL, "\\VUPS", "vd", 1);
834 if (acpi_evalf(NULL, &i, "\\VCDC", "d")) 817 if (acpi_evalf(NULL, &i, "\\VCDC", "d"))
835 status |= 0x02 * i; 818 status |= 0x02 * i;
@@ -848,9 +831,10 @@ static int video_autosw(void)
848{ 831{
849 int autosw = 0; 832 int autosw = 0;
850 833
851 if (video_supported == VIDEO_570) 834 if (video_supported == IBMACPI_VIDEO_570)
852 acpi_evalf(vid_handle, &autosw, "SWIT", "d"); 835 acpi_evalf(vid_handle, &autosw, "SWIT", "d");
853 else if (video_supported == VIDEO_770 || video_supported == VIDEO_NEW) 836 else if (video_supported == IBMACPI_VIDEO_770 ||
837 video_supported == IBMACPI_VIDEO_NEW)
854 acpi_evalf(vid_handle, &autosw, "^VDEE", "d"); 838 acpi_evalf(vid_handle, &autosw, "^VDEE", "d");
855 839
856 return autosw & 1; 840 return autosw & 1;
@@ -870,12 +854,12 @@ static int video_read(char *p)
870 len += sprintf(p + len, "status:\t\tsupported\n"); 854 len += sprintf(p + len, "status:\t\tsupported\n");
871 len += sprintf(p + len, "lcd:\t\t%s\n", enabled(status, 0)); 855 len += sprintf(p + len, "lcd:\t\t%s\n", enabled(status, 0));
872 len += sprintf(p + len, "crt:\t\t%s\n", enabled(status, 1)); 856 len += sprintf(p + len, "crt:\t\t%s\n", enabled(status, 1));
873 if (video_supported == VIDEO_NEW) 857 if (video_supported == IBMACPI_VIDEO_NEW)
874 len += sprintf(p + len, "dvi:\t\t%s\n", enabled(status, 3)); 858 len += sprintf(p + len, "dvi:\t\t%s\n", enabled(status, 3));
875 len += sprintf(p + len, "auto:\t\t%s\n", enabled(autosw, 0)); 859 len += sprintf(p + len, "auto:\t\t%s\n", enabled(autosw, 0));
876 len += sprintf(p + len, "commands:\tlcd_enable, lcd_disable\n"); 860 len += sprintf(p + len, "commands:\tlcd_enable, lcd_disable\n");
877 len += sprintf(p + len, "commands:\tcrt_enable, crt_disable\n"); 861 len += sprintf(p + len, "commands:\tcrt_enable, crt_disable\n");
878 if (video_supported == VIDEO_NEW) 862 if (video_supported == IBMACPI_VIDEO_NEW)
879 len += sprintf(p + len, "commands:\tdvi_enable, dvi_disable\n"); 863 len += sprintf(p + len, "commands:\tdvi_enable, dvi_disable\n");
880 len += sprintf(p + len, "commands:\tauto_enable, auto_disable\n"); 864 len += sprintf(p + len, "commands:\tauto_enable, auto_disable\n");
881 len += sprintf(p + len, "commands:\tvideo_switch, expand_toggle\n"); 865 len += sprintf(p + len, "commands:\tvideo_switch, expand_toggle\n");
@@ -890,7 +874,7 @@ static int video_switch(void)
890 874
891 if (!acpi_evalf(vid_handle, NULL, "_DOS", "vd", 1)) 875 if (!acpi_evalf(vid_handle, NULL, "_DOS", "vd", 1))
892 return -EIO; 876 return -EIO;
893 ret = video_supported == VIDEO_570 ? 877 ret = video_supported == IBMACPI_VIDEO_570 ?
894 acpi_evalf(ec_handle, NULL, "_Q16", "v") : 878 acpi_evalf(ec_handle, NULL, "_Q16", "v") :
895 acpi_evalf(vid_handle, NULL, "VSWT", "v"); 879 acpi_evalf(vid_handle, NULL, "VSWT", "v");
896 acpi_evalf(vid_handle, NULL, "_DOS", "vd", autosw); 880 acpi_evalf(vid_handle, NULL, "_DOS", "vd", autosw);
@@ -900,9 +884,9 @@ static int video_switch(void)
900 884
901static int video_expand(void) 885static int video_expand(void)
902{ 886{
903 if (video_supported == VIDEO_570) 887 if (video_supported == IBMACPI_VIDEO_570)
904 return acpi_evalf(ec_handle, NULL, "_Q17", "v"); 888 return acpi_evalf(ec_handle, NULL, "_Q17", "v");
905 else if (video_supported == VIDEO_770) 889 else if (video_supported == IBMACPI_VIDEO_770)
906 return acpi_evalf(vid_handle, NULL, "VEXP", "v"); 890 return acpi_evalf(vid_handle, NULL, "VEXP", "v");
907 else 891 else
908 return acpi_evalf(NULL, NULL, "\\VEXP", "v"); 892 return acpi_evalf(NULL, NULL, "\\VEXP", "v");
@@ -912,10 +896,10 @@ static int video_switch2(int status)
912{ 896{
913 int ret; 897 int ret;
914 898
915 if (video_supported == VIDEO_570) { 899 if (video_supported == IBMACPI_VIDEO_570) {
916 ret = acpi_evalf(NULL, NULL, 900 ret = acpi_evalf(NULL, NULL,
917 "\\_SB.PHS2", "vdd", 0x8b, status | 0x80); 901 "\\_SB.PHS2", "vdd", 0x8b, status | 0x80);
918 } else if (video_supported == VIDEO_770) { 902 } else if (video_supported == IBMACPI_VIDEO_770) {
919 int autosw = video_autosw(); 903 int autosw = video_autosw();
920 if (!acpi_evalf(vid_handle, NULL, "_DOS", "vd", 1)) 904 if (!acpi_evalf(vid_handle, NULL, "_DOS", "vd", 1))
921 return -EIO; 905 return -EIO;
@@ -951,10 +935,10 @@ static int video_write(char *buf)
951 enable |= 0x02; 935 enable |= 0x02;
952 } else if (strlencmp(cmd, "crt_disable") == 0) { 936 } else if (strlencmp(cmd, "crt_disable") == 0) {
953 disable |= 0x02; 937 disable |= 0x02;
954 } else if (video_supported == VIDEO_NEW && 938 } else if (video_supported == IBMACPI_VIDEO_NEW &&
955 strlencmp(cmd, "dvi_enable") == 0) { 939 strlencmp(cmd, "dvi_enable") == 0) {
956 enable |= 0x08; 940 enable |= 0x08;
957 } else if (video_supported == VIDEO_NEW && 941 } else if (video_supported == IBMACPI_VIDEO_NEW &&
958 strlencmp(cmd, "dvi_disable") == 0) { 942 strlencmp(cmd, "dvi_disable") == 0) {
959 disable |= 0x08; 943 disable |= 0x08;
960 } else if (strlencmp(cmd, "auto_enable") == 0) { 944 } else if (strlencmp(cmd, "auto_enable") == 0) {
@@ -1253,26 +1237,28 @@ static int cmos_write(char *buf)
1253 return 0; 1237 return 0;
1254} 1238}
1255 1239
1256static int led_supported; 1240enum led_access_mode {
1257 1241 IBMACPI_LED_NONE = 0,
1258#define LED_570 1 1242 IBMACPI_LED_570, /* 570 */
1259#define LED_OLD 2 1243 IBMACPI_LED_OLD, /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20-21 */
1260#define LED_NEW 3 1244 IBMACPI_LED_NEW, /* all others */
1245};
1246static enum led_access_mode led_supported;
1261 1247
1262static int led_init(void) 1248static int led_init(void)
1263{ 1249{
1264 if (!led_handle) 1250 if (!led_handle)
1265 /* led not supported on R30, R31 */ 1251 /* led not supported on R30, R31 */
1266 led_supported = 0; 1252 led_supported = IBMACPI_LED_NONE;
1267 else if (strlencmp(led_path, "SLED") == 0) 1253 else if (strlencmp(led_path, "SLED") == 0)
1268 /* 570 */ 1254 /* 570 */
1269 led_supported = LED_570; 1255 led_supported = IBMACPI_LED_570;
1270 else if (strlencmp(led_path, "SYSL") == 0) 1256 else if (strlencmp(led_path, "SYSL") == 0)
1271 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20-21 */ 1257 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20-21 */
1272 led_supported = LED_OLD; 1258 led_supported = IBMACPI_LED_OLD;
1273 else 1259 else
1274 /* all others */ 1260 /* all others */
1275 led_supported = LED_NEW; 1261 led_supported = IBMACPI_LED_NEW;
1276 1262
1277 return 0; 1263 return 0;
1278} 1264}
@@ -1289,7 +1275,7 @@ static int led_read(char *p)
1289 } 1275 }
1290 len += sprintf(p + len, "status:\t\tsupported\n"); 1276 len += sprintf(p + len, "status:\t\tsupported\n");
1291 1277
1292 if (led_supported == LED_570) { 1278 if (led_supported == IBMACPI_LED_570) {
1293 /* 570 */ 1279 /* 570 */
1294 int i, status; 1280 int i, status;
1295 for (i = 0; i < 8; i++) { 1281 for (i = 0; i < 8; i++) {
@@ -1338,13 +1324,13 @@ static int led_write(char *buf)
1338 } else 1324 } else
1339 return -EINVAL; 1325 return -EINVAL;
1340 1326
1341 if (led_supported == LED_570) { 1327 if (led_supported == IBMACPI_LED_570) {
1342 /* 570 */ 1328 /* 570 */
1343 led = 1 << led; 1329 led = 1 << led;
1344 if (!acpi_evalf(led_handle, NULL, NULL, "vdd", 1330 if (!acpi_evalf(led_handle, NULL, NULL, "vdd",
1345 led, led_sled_arg1[ind])) 1331 led, led_sled_arg1[ind]))
1346 return -EIO; 1332 return -EIO;
1347 } else if (led_supported == LED_OLD) { 1333 } else if (led_supported == IBMACPI_LED_OLD) {
1348 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20 */ 1334 /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20 */
1349 led = 1 << led; 1335 led = 1 << led;
1350 ret = ec_write(EC_HLMS, led); 1336 ret = ec_write(EC_HLMS, led);