diff options
author | Aaron Lu <aaron.lu@intel.com> | 2013-08-23 10:17:54 +0800 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-08-23 12:09:23 -0400 |
commit | f1bc1e4c44b1b78fe34431936c60759b5aad5e3f (patch) | |
tree | 8412ab2e71faa0e8d55be7a4565090af6669d4fa /drivers/ata/libata.h | |
parent | 2b79c56fb41d3956f672990fe83e342a809c89ab (diff) | |
download | linux-f1bc1e4c44b1b78fe34431936c60759b5aad5e3f.tar.gz linux-f1bc1e4c44b1b78fe34431936c60759b5aad5e3f.tar.bz2 linux-f1bc1e4c44b1b78fe34431936c60759b5aad5e3f.zip |
ata: acpi: rework the ata acpi bind support
Binding ACPI handle to SCSI device has several drawbacks, namely:
1 During ATA device initialization time, ACPI handle will be needed
while SCSI devices are not created yet. So each time ACPI handle is
needed, instead of retrieving the handle by ACPI_HANDLE macro,
a namespace scan is performed to find the handle for the corresponding
ATA device. This is inefficient, and also expose a restriction on
calling path not holding any lock.
2 The binding to SCSI device tree makes code complex, while at the same
time doesn't bring us any benefit. All ACPI handlings are still done
in ATA module, not in SCSI.
Rework the ATA ACPI binding code to bind ACPI handle to ATA transport
devices(ATA port and ATA device). The binding needs to be done only once,
since the ATA transport devices do not go away with hotplug. And due to
this, the flush_work call in hotplug handler for ATA bay is no longer
needed.
Tested on an Intel test platform for binding and runtime power off for
ODD(ZPODD) and hard disk; on an ASUS S400C for binding and normal boot
and S3, where its SATA port node has _SDD and _GTF control methods when
configured as an AHCI controller and its PATA device node has _GTF
control method when configured as an IDE controller. SATA PMP binding
and ATA hotplug is not tested.
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
Tested-by: Dirk Griesbach <spamthis@freenet.de>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ata/libata.h')
-rw-r--r-- | drivers/ata/libata.h | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index cc8a6e879dfb..3e9cc95a0222 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h @@ -118,9 +118,11 @@ extern void ata_acpi_on_resume(struct ata_port *ap); extern int ata_acpi_on_devcfg(struct ata_device *dev); extern void ata_acpi_on_disable(struct ata_device *dev); extern void ata_acpi_set_state(struct ata_port *ap, pm_message_t state); -extern int ata_acpi_register(void); -extern void ata_acpi_unregister(void); -extern void ata_acpi_hotplug_init(struct ata_host *host); +extern void ata_acpi_bind_port(struct ata_port *ap); +extern void ata_acpi_bind_dev(struct ata_device *dev); +extern acpi_handle ata_dev_acpi_handle(struct ata_device *dev); +extern void ata_scsi_acpi_bind(struct ata_device *dev); +extern void ata_scsi_acpi_unbind(struct ata_device *dev); #else static inline void ata_acpi_dissociate(struct ata_host *host) { } static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } @@ -129,9 +131,11 @@ static inline int ata_acpi_on_devcfg(struct ata_device *dev) { return 0; } static inline void ata_acpi_on_disable(struct ata_device *dev) { } static inline void ata_acpi_set_state(struct ata_port *ap, pm_message_t state) { } -static inline int ata_acpi_register(void) { return 0; } -static inline void ata_acpi_unregister(void) { } -static inline void ata_acpi_hotplug_init(struct ata_host *host) {} +static inline void ata_acpi_bind_port(struct ata_port *ap) {} +static inline void ata_acpi_bind_dev(struct ata_device *dev) {} +static inline acpi_handle ata_dev_acpi_handle(struct ata_device *dev) { return NULL; } +static inline void ata_scsi_acpi_bind(struct ata_device *dev) {} +static inline void ata_scsi_acpi_unbind(struct ata_device *dev) {} #endif /* libata-scsi.c */ |