diff options
author | Aaron Lu <aaron.lu@intel.com> | 2013-08-22 22:17:54 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-08-23 12:09:23 -0400 |
commit | f1bc1e4c44b1b78fe34431936c60759b5aad5e3f (patch) | |
tree | 8412ab2e71faa0e8d55be7a4565090af6669d4fa /drivers/ata/pata_acpi.c | |
parent | 2b79c56fb41d3956f672990fe83e342a809c89ab (diff) |
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/pata_acpi.c')
-rw-r--r-- | drivers/ata/pata_acpi.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c index 09723b76beac..73212c9c6d5b 100644 --- a/drivers/ata/pata_acpi.c +++ b/drivers/ata/pata_acpi.c | |||
@@ -39,7 +39,7 @@ static int pacpi_pre_reset(struct ata_link *link, unsigned long deadline) | |||
39 | { | 39 | { |
40 | struct ata_port *ap = link->ap; | 40 | struct ata_port *ap = link->ap; |
41 | struct pata_acpi *acpi = ap->private_data; | 41 | struct pata_acpi *acpi = ap->private_data; |
42 | if (ata_ap_acpi_handle(ap) == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0) | 42 | if (ACPI_HANDLE(&ap->tdev) == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0) |
43 | return -ENODEV; | 43 | return -ENODEV; |
44 | 44 | ||
45 | return ata_sff_prereset(link, deadline); | 45 | return ata_sff_prereset(link, deadline); |
@@ -195,7 +195,7 @@ static int pacpi_port_start(struct ata_port *ap) | |||
195 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 195 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
196 | struct pata_acpi *acpi; | 196 | struct pata_acpi *acpi; |
197 | 197 | ||
198 | if (ata_ap_acpi_handle(ap) == NULL) | 198 | if (ACPI_HANDLE(&ap->tdev) == NULL) |
199 | return -ENODEV; | 199 | return -ENODEV; |
200 | 200 | ||
201 | acpi = ap->private_data = devm_kzalloc(&pdev->dev, sizeof(struct pata_acpi), GFP_KERNEL); | 201 | acpi = ap->private_data = devm_kzalloc(&pdev->dev, sizeof(struct pata_acpi), GFP_KERNEL); |