aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/ibm_acpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/ibm_acpi.c')
-rw-r--r--drivers/acpi/ibm_acpi.c83
1 files changed, 80 insertions, 3 deletions
diff --git a/drivers/acpi/ibm_acpi.c b/drivers/acpi/ibm_acpi.c
index 5cc090326ddc..15fc12482ba0 100644
--- a/drivers/acpi/ibm_acpi.c
+++ b/drivers/acpi/ibm_acpi.c
@@ -160,13 +160,13 @@ IBM_HANDLE(cmos, root, "\\UCMS", /* R50, R50e, R50p, R51, T4x, X31, X40 */
160 "\\CMOS", /* A3x, G4x, R32, T23, T30, X22-24, X30 */ 160 "\\CMOS", /* A3x, G4x, R32, T23, T30, X22-24, X30 */
161 "\\CMS", /* R40, R40e */ 161 "\\CMS", /* R40, R40e */
162 ); /* all others */ 162 ); /* all others */
163 163#ifdef CONFIG_ACPI_IBM_DOCK
164IBM_HANDLE(dock, root, "\\_SB.GDCK", /* X30, X31, X40 */ 164IBM_HANDLE(dock, root, "\\_SB.GDCK", /* X30, X31, X40 */
165 "\\_SB.PCI0.DOCK", /* 600e/x,770e,770x,A2xm/p,T20-22,X20-21 */ 165 "\\_SB.PCI0.DOCK", /* 600e/x,770e,770x,A2xm/p,T20-22,X20-21 */
166 "\\_SB.PCI0.PCI1.DOCK", /* all others */ 166 "\\_SB.PCI0.PCI1.DOCK", /* all others */
167 "\\_SB.PCI.ISA.SLCE", /* 570 */ 167 "\\_SB.PCI.ISA.SLCE", /* 570 */
168 ); /* A21e,G4x,R30,R31,R32,R40,R40e,R50e */ 168 ); /* A21e,G4x,R30,R31,R32,R40,R40e,R50e */
169 169#endif
170IBM_HANDLE(bay, root, "\\_SB.PCI.IDE.SECN.MAST", /* 570 */ 170IBM_HANDLE(bay, root, "\\_SB.PCI.IDE.SECN.MAST", /* 570 */
171 "\\_SB.PCI0.IDE0.IDES.IDSM", /* 600e/x, 770e, 770x */ 171 "\\_SB.PCI0.IDE0.IDES.IDSM", /* 600e/x, 770e, 770x */
172 "\\_SB.PCI0.IDE0.SCND.MSTR", /* all others */ 172 "\\_SB.PCI0.IDE0.SCND.MSTR", /* all others */
@@ -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
@@ -844,7 +907,7 @@ static int _sta(acpi_handle handle)
844 907
845 return status; 908 return status;
846} 909}
847 910#ifdef CONFIG_ACPI_IBM_DOCK
848#define dock_docked() (_sta(dock_handle) & 1) 911#define dock_docked() (_sta(dock_handle) & 1)
849 912
850static int dock_read(char *p) 913static int dock_read(char *p)
@@ -907,6 +970,7 @@ static void dock_notify(struct ibm_struct *ibm, u32 event)
907 acpi_bus_generate_event(ibm->device, event, 0); /* unknown */ 970 acpi_bus_generate_event(ibm->device, event, 0); /* unknown */
908 } 971 }
909} 972}
973#endif
910 974
911static int bay_status_supported; 975static int bay_status_supported;
912static int bay_status2_supported; 976static int bay_status2_supported;
@@ -1562,6 +1626,13 @@ static struct ibm_struct ibms[] = {
1562 .write = bluetooth_write, 1626 .write = bluetooth_write,
1563 }, 1627 },
1564 { 1628 {
1629 .name = "wan",
1630 .init = wan_init,
1631 .read = wan_read,
1632 .write = wan_write,
1633 .experimental = 1,
1634 },
1635 {
1565 .name = "video", 1636 .name = "video",
1566 .init = video_init, 1637 .init = video_init,
1567 .read = video_read, 1638 .read = video_read,
@@ -1574,6 +1645,7 @@ static struct ibm_struct ibms[] = {
1574 .read = light_read, 1645 .read = light_read,
1575 .write = light_write, 1646 .write = light_write,
1576 }, 1647 },
1648#ifdef CONFIG_ACPI_IBM_DOCK
1577 { 1649 {
1578 .name = "dock", 1650 .name = "dock",
1579 .read = dock_read, 1651 .read = dock_read,
@@ -1589,6 +1661,7 @@ static struct ibm_struct ibms[] = {
1589 .handle = &pci_handle, 1661 .handle = &pci_handle,
1590 .type = ACPI_SYSTEM_NOTIFY, 1662 .type = ACPI_SYSTEM_NOTIFY,
1591 }, 1663 },
1664#endif
1592 { 1665 {
1593 .name = "bay", 1666 .name = "bay",
1594 .init = bay_init, 1667 .init = bay_init,
@@ -1880,7 +1953,9 @@ IBM_PARAM(hotkey);
1880IBM_PARAM(bluetooth); 1953IBM_PARAM(bluetooth);
1881IBM_PARAM(video); 1954IBM_PARAM(video);
1882IBM_PARAM(light); 1955IBM_PARAM(light);
1956#ifdef CONFIG_ACPI_IBM_DOCK
1883IBM_PARAM(dock); 1957IBM_PARAM(dock);
1958#endif
1884IBM_PARAM(bay); 1959IBM_PARAM(bay);
1885IBM_PARAM(cmos); 1960IBM_PARAM(cmos);
1886IBM_PARAM(led); 1961IBM_PARAM(led);
@@ -1927,7 +2002,9 @@ static int __init acpi_ibm_init(void)
1927 IBM_HANDLE_INIT(hkey); 2002 IBM_HANDLE_INIT(hkey);
1928 IBM_HANDLE_INIT(lght); 2003 IBM_HANDLE_INIT(lght);
1929 IBM_HANDLE_INIT(cmos); 2004 IBM_HANDLE_INIT(cmos);
2005#ifdef CONFIG_ACPI_IBM_DOCK
1930 IBM_HANDLE_INIT(dock); 2006 IBM_HANDLE_INIT(dock);
2007#endif
1931 IBM_HANDLE_INIT(pci); 2008 IBM_HANDLE_INIT(pci);
1932 IBM_HANDLE_INIT(bay); 2009 IBM_HANDLE_INIT(bay);
1933 if (bay_handle) 2010 if (bay_handle)