提交 d0df8b5d 编写于 作者: T Tejun Heo 提交者: Jeff Garzik

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: NTejun Heo <htejun@gmail.com>
Cc: Petr Vandrovec <petr@vandrovec.name>
Signed-off-by: NJeff Garzik <jeff@garzik.org>
上级 633273a3
...@@ -40,12 +40,40 @@ static int is_pci_dev(struct device *dev) ...@@ -40,12 +40,40 @@ static int is_pci_dev(struct device *dev)
return (dev->bus == &pci_bus_type); return (dev->bus == &pci_bus_type);
} }
static void ata_acpi_associate_sata_port(struct ata_port *ap) /**
* ata_acpi_associate_sata_port - associate SATA port with ACPI objects
* @ap: target SATA port
*
* Look up ACPI objects associated with @ap and initialize acpi_handle
* fields of @ap, the port and devices accordingly.
*
* LOCKING:
* EH context.
*
* RETURNS:
* 0 on success, -errno on failure.
*/
void ata_acpi_associate_sata_port(struct ata_port *ap)
{ {
acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT); WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA));
if (!ap->nr_pmp_links) {
acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
ap->link.device->acpi_handle =
acpi_get_child(ap->host->acpi_handle, adr);
} else {
struct ata_link *link;
ap->link.device->acpi_handle = NULL;
ap->link.device->acpi_handle = ata_port_for_each_link(link, ap) {
acpi_get_child(ap->host->acpi_handle, adr); acpi_integer adr = SATA_ADR(ap->port_no, link->pmp);
link->device->acpi_handle =
acpi_get_child(ap->host->acpi_handle, adr);
}
}
} }
static void ata_acpi_associate_ide_port(struct ata_port *ap) static void ata_acpi_associate_ide_port(struct ata_port *ap)
......
...@@ -607,6 +607,8 @@ int sata_pmp_attach(struct ata_device *dev) ...@@ -607,6 +607,8 @@ int sata_pmp_attach(struct ata_device *dev)
ata_port_for_each_link(tlink, ap) ata_port_for_each_link(tlink, ap)
sata_link_init_spd(tlink); sata_link_init_spd(tlink);
ata_acpi_associate_sata_port(ap);
return 0; return 0;
fail: fail:
...@@ -646,6 +648,8 @@ static void sata_pmp_detach(struct ata_device *dev) ...@@ -646,6 +648,8 @@ static void sata_pmp_detach(struct ata_device *dev)
ap->nr_pmp_links = 0; ap->nr_pmp_links = 0;
link->pmp = 0; link->pmp = 0;
spin_unlock_irqrestore(ap->lock, flags); spin_unlock_irqrestore(ap->lock, flags);
ata_acpi_associate_sata_port(ap);
} }
/** /**
......
...@@ -103,11 +103,13 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host); ...@@ -103,11 +103,13 @@ extern struct ata_port *ata_port_alloc(struct ata_host *host);
/* libata-acpi.c */ /* libata-acpi.c */
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
extern void ata_acpi_associate_sata_port(struct ata_port *ap);
extern void ata_acpi_associate(struct ata_host *host); extern void ata_acpi_associate(struct ata_host *host);
extern int ata_acpi_on_suspend(struct ata_port *ap); extern int ata_acpi_on_suspend(struct ata_port *ap);
extern void ata_acpi_on_resume(struct ata_port *ap); extern void ata_acpi_on_resume(struct ata_port *ap);
extern int ata_acpi_on_devcfg(struct ata_device *adev); extern int ata_acpi_on_devcfg(struct ata_device *adev);
#else #else
static inline void ata_acpi_associate_sata_port(struct ata_port *ap) { }
static inline void ata_acpi_associate(struct ata_host *host) { } static inline void ata_acpi_associate(struct ata_host *host) { }
static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
static inline void ata_acpi_on_resume(struct ata_port *ap) { } static inline void ata_acpi_on_resume(struct ata_port *ap) { }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册