diff options
author | Tejun Heo <htejun@gmail.com> | 2007-09-23 00:19:54 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 14:55:44 -0400 |
commit | d0df8b5d0fb547a3351c2a4b1ded7f7cde5d713a (patch) | |
tree | a2005ec3be6e493844b092edeca9306fbc70f4b8 | |
parent | 633273a3ed1cf37ced90475b0f95cf81deab04f1 (diff) |
libata-pmp: extend ACPI support to cover PMP
Extend ata_acpi_associate_sata_port() such that it can handle PMP and
call it when PMP is attached and detached.
Build breakage when !CONFIG_ATA_ACPI was spotted and fixed by Petr
Vandrovec.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | drivers/ata/libata-acpi.c | 36 | ||||
-rw-r--r-- | drivers/ata/libata-pmp.c | 4 | ||||
-rw-r--r-- | drivers/ata/libata.h | 2 |
3 files changed, 38 insertions, 4 deletions
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index dc9842ec6f06..a276c06dda95 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
@@ -40,12 +40,40 @@ static int is_pci_dev(struct device *dev) | |||
40 | return (dev->bus == &pci_bus_type); | 40 | return (dev->bus == &pci_bus_type); |
41 | } | 41 | } |
42 | 42 | ||
43 | static void ata_acpi_associate_sata_port(struct ata_port *ap) | 43 | /** |
44 | * ata_acpi_associate_sata_port - associate SATA port with ACPI objects | ||
45 | * @ap: target SATA port | ||
46 | * | ||
47 | * Look up ACPI objects associated with @ap and initialize acpi_handle | ||
48 | * fields of @ap, the port and devices accordingly. | ||
49 | * | ||
50 | * LOCKING: | ||
51 | * EH context. | ||
52 | * | ||
53 | * RETURNS: | ||
54 | * 0 on success, -errno on failure. | ||
55 | */ | ||
56 | void ata_acpi_associate_sata_port(struct ata_port *ap) | ||
44 | { | 57 | { |
45 | acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT); | 58 | WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA)); |
59 | |||
60 | if (!ap->nr_pmp_links) { | ||
61 | acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT); | ||
62 | |||
63 | ap->link.device->acpi_handle = | ||
64 | acpi_get_child(ap->host->acpi_handle, adr); | ||
65 | } else { | ||
66 | struct ata_link *link; | ||
67 | |||
68 | ap->link.device->acpi_handle = NULL; | ||
46 | 69 | ||
47 | ap->link.device->acpi_handle = | 70 | ata_port_for_each_link(link, ap) { |
48 | acpi_get_child(ap->host->acpi_handle, adr); | 71 | acpi_integer adr = SATA_ADR(ap->port_no, link->pmp); |
72 | |||
73 | link->device->acpi_handle = | ||
74 | acpi_get_child(ap->host->acpi_handle, adr); | ||
75 | } | ||
76 | } | ||
49 | } | 77 | } |
50 | 78 | ||
51 | static void ata_acpi_associate_ide_port(struct ata_port *ap) | 79 | static void ata_acpi_associate_ide_port(struct ata_port *ap) |
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index 671d171055a3..eeffce636d0c 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
@@ -607,6 +607,8 @@ int sata_pmp_attach(struct ata_device *dev) | |||
607 | ata_port_for_each_link(tlink, ap) | 607 | ata_port_for_each_link(tlink, ap) |
608 | sata_link_init_spd(tlink); | 608 | sata_link_init_spd(tlink); |
609 | 609 | ||
610 | ata_acpi_associate_sata_port(ap); | ||
611 | |||
610 | return 0; | 612 | return 0; |
611 | 613 | ||
612 | fail: | 614 | fail: |
@@ -646,6 +648,8 @@ static void sata_pmp_detach(struct ata_device *dev) | |||
646 | ap->nr_pmp_links = 0; | 648 | ap->nr_pmp_links = 0; |
647 | link->pmp = 0; | 649 | link->pmp = 0; |
648 | spin_unlock_irqrestore(ap->lock, flags); | 650 | spin_unlock_irqrestore(ap->lock, flags); |
651 | |||
652 | ata_acpi_associate_sata_port(ap); | ||
649 | } | 653 | } |
650 | 654 | ||
651 | /** | 655 | /** |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index a44172fd1f5c..f8bd955c5ba7 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -103,11 +103,13 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host); | |||
103 | 103 | ||
104 | /* libata-acpi.c */ | 104 | /* libata-acpi.c */ |
105 | #ifdef CONFIG_ATA_ACPI | 105 | #ifdef CONFIG_ATA_ACPI |
106 | extern void ata_acpi_associate_sata_port(struct ata_port *ap); | ||
106 | extern void ata_acpi_associate(struct ata_host *host); | 107 | extern void ata_acpi_associate(struct ata_host *host); |
107 | extern int ata_acpi_on_suspend(struct ata_port *ap); | 108 | extern int ata_acpi_on_suspend(struct ata_port *ap); |
108 | extern void ata_acpi_on_resume(struct ata_port *ap); | 109 | extern void ata_acpi_on_resume(struct ata_port *ap); |
109 | extern int ata_acpi_on_devcfg(struct ata_device *adev); | 110 | extern int ata_acpi_on_devcfg(struct ata_device *adev); |
110 | #else | 111 | #else |
112 | static inline void ata_acpi_associate_sata_port(struct ata_port *ap) { } | ||
111 | static inline void ata_acpi_associate(struct ata_host *host) { } | 113 | static inline void ata_acpi_associate(struct ata_host *host) { } |
112 | static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } | 114 | static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } |
113 | static inline void ata_acpi_on_resume(struct ata_port *ap) { } | 115 | static inline void ata_acpi_on_resume(struct ata_port *ap) { } |