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>
This commit is contained in:
parent
633273a3ed
commit
d0df8b5d0f
|
@ -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));
|
||||||
|
|
||||||
ap->link.device->acpi_handle =
|
if (!ap->nr_pmp_links) {
|
||||||
acpi_get_child(ap->host->acpi_handle, adr);
|
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;
|
||||||
|
|
||||||
|
ata_port_for_each_link(link, ap) {
|
||||||
|
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
||||||
/* 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) { }
|
||||||
|
|
Loading…
Reference in a new issue