diff options
Diffstat (limited to 'drivers/ata/libata-acpi.c')
| -rw-r--r-- | drivers/ata/libata-acpi.c | 82 | 
1 files changed, 29 insertions, 53 deletions
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 8a52dab412e..87f2f395d79 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c @@ -17,7 +17,6 @@  #include <linux/pci.h>  #include <linux/slab.h>  #include <linux/pm_runtime.h> -#include <linux/pm_qos.h>  #include <scsi/scsi_device.h>  #include "libata.h" @@ -61,7 +60,8 @@ acpi_handle ata_ap_acpi_handle(struct ata_port *ap)  	if (ap->flags & ATA_FLAG_ACPI_SATA)  		return NULL; -	return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), ap->port_no); +	return ap->scsi_host ? +		DEVICE_ACPI_HANDLE(&ap->scsi_host->shost_gendev) : NULL;  }  EXPORT_SYMBOL(ata_ap_acpi_handle); @@ -77,7 +77,7 @@ acpi_handle ata_dev_acpi_handle(struct ata_device *dev)  	acpi_integer adr;  	struct ata_port *ap = dev->link->ap; -	if (dev->flags & ATA_DFLAG_ACPI_DISABLED) +	if (libata_noacpi || dev->flags & ATA_DFLAG_ACPI_DISABLED)  		return NULL;  	if (ap->flags & ATA_FLAG_ACPI_SATA) { @@ -240,28 +240,15 @@ void ata_acpi_dissociate(struct ata_host *host)  	}  } -/** - * ata_acpi_gtm - execute _GTM - * @ap: target ATA port - * @gtm: out parameter for _GTM result - * - * Evaluate _GTM and store the result in @gtm. - * - * LOCKING: - * EH context. - * - * RETURNS: - * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure. - */ -int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) +static int __ata_acpi_gtm(struct ata_port *ap, acpi_handle handle, +			  struct ata_acpi_gtm *gtm)  {  	struct acpi_buffer output = { .length = ACPI_ALLOCATE_BUFFER };  	union acpi_object *out_obj;  	acpi_status status;  	int rc = 0; -	status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_GTM", NULL, -				      &output); +	status = acpi_evaluate_object(handle, "_GTM", NULL, &output);  	rc = -ENOENT;  	if (status == AE_NOT_FOUND) @@ -295,6 +282,27 @@ int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm)  	return rc;  } +/** + * ata_acpi_gtm - execute _GTM + * @ap: target ATA port + * @gtm: out parameter for _GTM result + * + * Evaluate _GTM and store the result in @gtm. + * + * LOCKING: + * EH context. + * + * RETURNS: + * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure. + */ +int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) +{ +	if (ata_ap_acpi_handle(ap)) +		return __ata_acpi_gtm(ap, ata_ap_acpi_handle(ap), gtm); +	else +		return -EINVAL; +} +  EXPORT_SYMBOL_GPL(ata_acpi_gtm);  /** @@ -1020,38 +1028,6 @@ void ata_acpi_on_disable(struct ata_device *dev)  	ata_acpi_clear_gtf(dev);  } -static void ata_acpi_register_power_resource(struct ata_device *dev) -{ -	struct scsi_device *sdev = dev->sdev; -	acpi_handle handle; - -	handle = ata_dev_acpi_handle(dev); -	if (handle) -		acpi_dev_pm_add_dependent(handle, &sdev->sdev_gendev); -} - -static void ata_acpi_unregister_power_resource(struct ata_device *dev) -{ -	struct scsi_device *sdev = dev->sdev; -	acpi_handle handle; - -	handle = ata_dev_acpi_handle(dev); -	if (handle) -		acpi_dev_pm_remove_dependent(handle, &sdev->sdev_gendev); -} - -void ata_acpi_bind(struct ata_device *dev) -{ -	ata_acpi_register_power_resource(dev); -	if (zpodd_dev_enabled(dev)) -		dev_pm_qos_expose_flags(&dev->sdev->sdev_gendev, 0); -} - -void ata_acpi_unbind(struct ata_device *dev) -{ -	ata_acpi_unregister_power_resource(dev); -} -  static int compat_pci_ata(struct ata_port *ap)  {  	struct device *dev = ap->tdev.parent; @@ -1071,7 +1047,7 @@ static int compat_pci_ata(struct ata_port *ap)  static int ata_acpi_bind_host(struct ata_port *ap, acpi_handle *handle)  { -	if (ap->flags & ATA_FLAG_ACPI_SATA) +	if (libata_noacpi || ap->flags & ATA_FLAG_ACPI_SATA)  		return -ENODEV;  	*handle = acpi_get_child(DEVICE_ACPI_HANDLE(ap->tdev.parent), @@ -1080,7 +1056,7 @@ static int ata_acpi_bind_host(struct ata_port *ap, acpi_handle *handle)  	if (!*handle)  		return -ENODEV; -	if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0) +	if (__ata_acpi_gtm(ap, *handle, &ap->__acpi_init_gtm) == 0)  		ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;  	return 0;  |