aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/thinkpad_acpi.c78
1 files changed, 50 insertions, 28 deletions
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index 68f1cc0d7fae..a56526500c18 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -1519,6 +1519,33 @@ IBM_HANDLE(dock, root, "\\_SB.GDCK", /* X30, X31, X40 */
1519/* don't list other alternatives as we install a notify handler on the 570 */ 1519/* don't list other alternatives as we install a notify handler on the 570 */
1520IBM_HANDLE(pci, root, "\\_SB.PCI"); /* 570 */ 1520IBM_HANDLE(pci, root, "\\_SB.PCI"); /* 570 */
1521 1521
1522static struct tp_acpi_drv_struct ibm_dock_acpidriver[2] = {
1523 {
1524 .notify = dock_notify,
1525 .handle = &dock_handle,
1526 .type = ACPI_SYSTEM_NOTIFY,
1527 },
1528 {
1529 .hid = IBM_PCI_HID,
1530 .notify = dock_notify,
1531 .handle = &pci_handle,
1532 .type = ACPI_SYSTEM_NOTIFY,
1533 },
1534};
1535
1536static struct ibm_struct dock_driver_data[2] = {
1537 {
1538 .name = "dock",
1539 .read = dock_read,
1540 .write = dock_write,
1541 .acpi = &ibm_dock_acpidriver[0],
1542 },
1543 {
1544 .name = "dock",
1545 .acpi = &ibm_dock_acpidriver[1],
1546 },
1547};
1548
1522#define dock_docked() (_sta(dock_handle) & 1) 1549#define dock_docked() (_sta(dock_handle) & 1)
1523 1550
1524static int __init dock_init(struct ibm_init_struct *iibm) 1551static int __init dock_init(struct ibm_init_struct *iibm)
@@ -1526,7 +1553,6 @@ static int __init dock_init(struct ibm_init_struct *iibm)
1526 vdbg_printk(TPACPI_DBG_INIT, "initializing dock subdriver\n"); 1553 vdbg_printk(TPACPI_DBG_INIT, "initializing dock subdriver\n");
1527 1554
1528 IBM_ACPIHANDLE_INIT(dock); 1555 IBM_ACPIHANDLE_INIT(dock);
1529 IBM_ACPIHANDLE_INIT(pci);
1530 1556
1531 vdbg_printk(TPACPI_DBG_INIT, "dock is %s\n", 1557 vdbg_printk(TPACPI_DBG_INIT, "dock is %s\n",
1532 str_supported(dock_handle != NULL)); 1558 str_supported(dock_handle != NULL));
@@ -1534,6 +1560,28 @@ static int __init dock_init(struct ibm_init_struct *iibm)
1534 return (dock_handle)? 0 : 1; 1560 return (dock_handle)? 0 : 1;
1535} 1561}
1536 1562
1563static int __init dock_init2(struct ibm_init_struct *iibm)
1564{
1565 int dock2_needed;
1566
1567 vdbg_printk(TPACPI_DBG_INIT, "initializing dock subdriver part 2\n");
1568
1569 if (dock_driver_data[0].flags.acpi_driver_registered &&
1570 dock_driver_data[0].flags.acpi_notify_installed) {
1571 IBM_ACPIHANDLE_INIT(pci);
1572 dock2_needed = (pci_handle != NULL);
1573 vdbg_printk(TPACPI_DBG_INIT,
1574 "dock PCI handler for the TP 570 is %s\n",
1575 str_supported(dock2_needed));
1576 } else {
1577 vdbg_printk(TPACPI_DBG_INIT,
1578 "dock subdriver part 2 not required\n");
1579 dock2_needed = 0;
1580 }
1581
1582 return (dock2_needed)? 0 : 1;
1583}
1584
1537static void dock_notify(struct ibm_struct *ibm, u32 event) 1585static void dock_notify(struct ibm_struct *ibm, u32 event)
1538{ 1586{
1539 int docked = dock_docked(); 1587 int docked = dock_docked();
@@ -1595,33 +1643,6 @@ static int dock_write(char *buf)
1595 return 0; 1643 return 0;
1596} 1644}
1597 1645
1598static struct tp_acpi_drv_struct ibm_dock_acpidriver[2] = {
1599 {
1600 .notify = dock_notify,
1601 .handle = &dock_handle,
1602 .type = ACPI_SYSTEM_NOTIFY,
1603 },
1604 {
1605 .hid = IBM_PCI_HID,
1606 .notify = dock_notify,
1607 .handle = &pci_handle,
1608 .type = ACPI_SYSTEM_NOTIFY,
1609 },
1610};
1611
1612static struct ibm_struct dock_driver_data[2] = {
1613 {
1614 .name = "dock",
1615 .read = dock_read,
1616 .write = dock_write,
1617 .acpi = &ibm_dock_acpidriver[0],
1618 },
1619 {
1620 .name = "dock",
1621 .acpi = &ibm_dock_acpidriver[1],
1622 },
1623};
1624
1625#endif /* CONFIG_THINKPAD_ACPI_DOCK */ 1646#endif /* CONFIG_THINKPAD_ACPI_DOCK */
1626 1647
1627/************************************************************************* 1648/*************************************************************************
@@ -3850,6 +3871,7 @@ static struct ibm_init_struct ibms_init[] __initdata = {
3850 .data = &dock_driver_data[0], 3871 .data = &dock_driver_data[0],
3851 }, 3872 },
3852 { 3873 {
3874 .init = dock_init2,
3853 .data = &dock_driver_data[1], 3875 .data = &dock_driver_data[1],
3854 }, 3876 },
3855#endif 3877#endif