aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/thinkpad_acpi.c
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2007-04-27 21:00:15 -0400
committerLen Brown <len.brown@intel.com>2007-04-28 21:41:20 -0400
commitd94a7f16cad7700f8d2b142cc13cfba5387af3db (patch)
treec05c534bb1ef98a5c45321a107c8cd28894f0e84 /drivers/misc/thinkpad_acpi.c
parent5ae930e685018e2dc6d4139362213e4b283e5700 (diff)
ACPI: thinkpad-acpi: improve dock subdriver initialization
The dock sub-driver has split-personality (two subdrivers), and it was doing some unoptimal things on init because of that. Fix it so that the second half of it will only init when necessary, and only if the first half initialized sucessfully in the first place. 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/thinkpad_acpi.c')
-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