aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/ibm_acpi.c
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2006-06-01 17:41:00 -0400
committerLen Brown <len.brown@intel.com>2006-06-01 20:42:32 -0400
commit42adb53cb36d19862a02d3087e2e3d9dab39e5fa (patch)
treecbf070073a1bedaf8ab2247864ba03269e3e7f26 /drivers/acpi/ibm_acpi.c
parentba8f5baba79da8eb502f8534c3a8ecb64aceb790 (diff)
ACPI: Allow a WAN module enable/disable on a Thinkpad X60.
The WAN (Sierra Wireless EV-DO) module is very similar to the Bluetooth module. It appears on the USB bus when enabled. It can be controlled via hot key, or directly via ACPI. This change enables direct control via ACPI. I have tested it on my Lenovo Thinkpad X60; I guess it will probably work on other Thinkpad models which come with this module installed. Signed-off-by: Jeremy Fitzhardinge <jeremy@goop.org> Ack'd by: Borislav Deianov <borislav@users.sf.net> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/ibm_acpi.c')
-rw-r--r--drivers/acpi/ibm_acpi.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/drivers/acpi/ibm_acpi.c b/drivers/acpi/ibm_acpi.c
index 262b1f41335a..15fc12482ba0 100644
--- a/drivers/acpi/ibm_acpi.c
+++ b/drivers/acpi/ibm_acpi.c
@@ -567,6 +567,69 @@ static int bluetooth_write(char *buf)
567 return 0; 567 return 0;
568} 568}
569 569
570static int wan_supported;
571
572static int wan_init(void)
573{
574 wan_supported = hkey_handle &&
575 acpi_evalf(hkey_handle, NULL, "GWAN", "qv");
576
577 return 0;
578}
579
580static int wan_status(void)
581{
582 int status;
583
584 if (!wan_supported ||
585 !acpi_evalf(hkey_handle, &status, "GWAN", "d"))
586 status = 0;
587
588 return status;
589}
590
591static int wan_read(char *p)
592{
593 int len = 0;
594 int status = wan_status();
595
596 if (!wan_supported)
597 len += sprintf(p + len, "status:\t\tnot supported\n");
598 else if (!(status & 1))
599 len += sprintf(p + len, "status:\t\tnot installed\n");
600 else {
601 len += sprintf(p + len, "status:\t\t%s\n", enabled(status, 1));
602 len += sprintf(p + len, "commands:\tenable, disable\n");
603 }
604
605 return len;
606}
607
608static int wan_write(char *buf)
609{
610 int status = wan_status();
611 char *cmd;
612 int do_cmd = 0;
613
614 if (!wan_supported)
615 return -ENODEV;
616
617 while ((cmd = next_cmd(&buf))) {
618 if (strlencmp(cmd, "enable") == 0) {
619 status |= 2;
620 } else if (strlencmp(cmd, "disable") == 0) {
621 status &= ~2;
622 } else
623 return -EINVAL;
624 do_cmd = 1;
625 }
626
627 if (do_cmd && !acpi_evalf(hkey_handle, NULL, "SWAN", "vd", status))
628 return -EIO;
629
630 return 0;
631}
632
570static int video_supported; 633static int video_supported;
571static int video_orig_autosw; 634static int video_orig_autosw;
572 635
@@ -1563,6 +1626,13 @@ static struct ibm_struct ibms[] = {
1563 .write = bluetooth_write, 1626 .write = bluetooth_write,
1564 }, 1627 },
1565 { 1628 {
1629 .name = "wan",
1630 .init = wan_init,
1631 .read = wan_read,
1632 .write = wan_write,
1633 .experimental = 1,
1634 },
1635 {
1566 .name = "video", 1636 .name = "video",
1567 .init = video_init, 1637 .init = video_init,
1568 .read = video_read, 1638 .read = video_read,