Commit 30dcf76a authored by Matthew Garrett's avatar Matthew Garrett Committed by Jeff Garzik

libata: migrate ACPI code over to new bindings

Now that we have the ability to directly glue the ACPI namespace to the
driver model in libata, we don't need the custom code to handle the same
thing. Remove it and migrate the functions over to the new code.
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
Signed-off-by: default avatarHolger Macht <holger@homac.de>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 6b66d958
...@@ -47,7 +47,14 @@ static void ata_acpi_clear_gtf(struct ata_device *dev) ...@@ -47,7 +47,14 @@ static void ata_acpi_clear_gtf(struct ata_device *dev)
dev->gtf_cache = NULL; dev->gtf_cache = NULL;
} }
static acpi_handle ap_acpi_handle(struct ata_port *ap) /**
* ata_ap_acpi_handle - provide the acpi_handle for an ata_port
* @ap: the acpi_handle returned will correspond to this port
*
* Returns the acpi_handle for the ACPI namespace object corresponding to
* the ata_port passed into the function, or NULL if no such object exists
*/
acpi_handle ata_ap_acpi_handle(struct ata_port *ap)
{ {
if (ap->flags & ATA_FLAG_ACPI_SATA) if (ap->flags & ATA_FLAG_ACPI_SATA)
return NULL; return NULL;
...@@ -64,8 +71,16 @@ static acpi_handle ap_acpi_handle(struct ata_port *ap) ...@@ -64,8 +71,16 @@ static acpi_handle ap_acpi_handle(struct ata_port *ap)
return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev),
ap->port_no); ap->port_no);
} }
EXPORT_SYMBOL(ata_ap_acpi_handle);
static acpi_handle dev_acpi_handle(struct ata_device *dev) /**
* ata_dev_acpi_handle - provide the acpi_handle for an ata_device
* @dev: the acpi_device returned will correspond to this port
*
* Returns the acpi_handle for the ACPI namespace object corresponding to
* the ata_device passed into the function, or NULL if no such object exists
*/
acpi_handle ata_dev_acpi_handle(struct ata_device *dev)
{ {
acpi_integer adr; acpi_integer adr;
struct ata_port *ap = dev->link->ap; struct ata_port *ap = dev->link->ap;
...@@ -77,66 +92,9 @@ static acpi_handle dev_acpi_handle(struct ata_device *dev) ...@@ -77,66 +92,9 @@ static acpi_handle dev_acpi_handle(struct ata_device *dev)
adr = SATA_ADR(ap->port_no, dev->link->pmp); adr = SATA_ADR(ap->port_no, dev->link->pmp);
return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), adr); return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), adr);
} else } else
return acpi_get_child(ap_acpi_handle(ap), dev->devno); return acpi_get_child(ata_ap_acpi_handle(ap), dev->devno);
}
/**
* 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)
{
WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA));
if (!sata_pmp_attached(ap)) {
u64 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_for_each_link(link, ap, EDGE) {
u64 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)
{
int max_devices, i;
ap->acpi_handle = acpi_get_child(ap->host->acpi_handle, ap->port_no);
if (!ap->acpi_handle)
return;
max_devices = 1;
if (ap->flags & ATA_FLAG_SLAVE_POSS)
max_devices++;
for (i = 0; i < max_devices; i++) {
struct ata_device *dev = &ap->link.device[i];
dev->acpi_handle = acpi_get_child(ap->acpi_handle, i);
}
if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0)
ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
} }
EXPORT_SYMBOL(ata_dev_acpi_handle);
/* @ap and @dev are the same as ata_acpi_handle_hotplug() */ /* @ap and @dev are the same as ata_acpi_handle_hotplug() */
static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev) static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev)
...@@ -261,56 +219,6 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = { ...@@ -261,56 +219,6 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = {
.uevent = ata_acpi_ap_uevent, .uevent = ata_acpi_ap_uevent,
}; };
/**
* ata_acpi_associate - associate ATA host with ACPI objects
* @host: target ATA host
*
* Look up ACPI objects associated with @host and initialize
* acpi_handle fields of @host, its ports and devices accordingly.
*
* LOCKING:
* EH context.
*
* RETURNS:
* 0 on success, -errno on failure.
*/
void ata_acpi_associate(struct ata_host *host)
{
int i, j;
if (!is_pci_dev(host->dev) || libata_noacpi)
return;
host->acpi_handle = DEVICE_ACPI_HANDLE(host->dev);
if (!host->acpi_handle)
return;
for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];
if (host->ports[0]->flags & ATA_FLAG_ACPI_SATA)
ata_acpi_associate_sata_port(ap);
else
ata_acpi_associate_ide_port(ap);
if (ap->acpi_handle) {
/* we might be on a docking station */
register_hotplug_dock_device(ap->acpi_handle,
&ata_acpi_ap_dock_ops, ap);
}
for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
struct ata_device *dev = &ap->link.device[j];
if (dev->acpi_handle) {
/* we might be on a docking station */
register_hotplug_dock_device(dev->acpi_handle,
&ata_acpi_dev_dock_ops, dev);
}
}
}
}
/** /**
* ata_acpi_dissociate - dissociate ATA host from ACPI objects * ata_acpi_dissociate - dissociate ATA host from ACPI objects
* @host: target ATA host * @host: target ATA host
...@@ -332,7 +240,7 @@ void ata_acpi_dissociate(struct ata_host *host) ...@@ -332,7 +240,7 @@ void ata_acpi_dissociate(struct ata_host *host)
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap); const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
if (ap->acpi_handle && gtm) if (ata_ap_acpi_handle(ap) && gtm)
ata_acpi_stm(ap, gtm); ata_acpi_stm(ap, gtm);
} }
} }
...@@ -357,7 +265,8 @@ int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) ...@@ -357,7 +265,8 @@ int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm)
acpi_status status; acpi_status status;
int rc = 0; int rc = 0;
status = acpi_evaluate_object(ap->acpi_handle, "_GTM", NULL, &output); status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_GTM", NULL,
&output);
rc = -ENOENT; rc = -ENOENT;
if (status == AE_NOT_FOUND) if (status == AE_NOT_FOUND)
...@@ -427,7 +336,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm) ...@@ -427,7 +336,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm)
input.count = 3; input.count = 3;
input.pointer = in_params; input.pointer = in_params;
status = acpi_evaluate_object(ap->acpi_handle, "_STM", &input, NULL); status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_STM", &input,
NULL);
if (status == AE_NOT_FOUND) if (status == AE_NOT_FOUND)
return -ENOENT; return -ENOENT;
...@@ -484,7 +394,8 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf) ...@@ -484,7 +394,8 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
__func__, ap->port_no); __func__, ap->port_no);
/* _GTF has no input parameters */ /* _GTF has no input parameters */
status = acpi_evaluate_object(dev->acpi_handle, "_GTF", NULL, &output); status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_GTF", NULL,
&output);
out_obj = dev->gtf_cache = output.pointer; out_obj = dev->gtf_cache = output.pointer;
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -850,7 +761,8 @@ static int ata_acpi_push_id(struct ata_device *dev) ...@@ -850,7 +761,8 @@ static int ata_acpi_push_id(struct ata_device *dev)
/* It's OK for _SDD to be missing too. */ /* It's OK for _SDD to be missing too. */
swap_buf_le16(dev->id, ATA_ID_WORDS); swap_buf_le16(dev->id, ATA_ID_WORDS);
status = acpi_evaluate_object(dev->acpi_handle, "_SDD", &input, NULL); status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_SDD", &input,
NULL);
swap_buf_le16(dev->id, ATA_ID_WORDS); swap_buf_le16(dev->id, ATA_ID_WORDS);
if (status == AE_NOT_FOUND) if (status == AE_NOT_FOUND)
...@@ -900,7 +812,7 @@ void ata_acpi_on_resume(struct ata_port *ap) ...@@ -900,7 +812,7 @@ void ata_acpi_on_resume(struct ata_port *ap)
const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap); const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
struct ata_device *dev; struct ata_device *dev;
if (ap->acpi_handle && gtm) { if (ata_ap_acpi_handle(ap) && gtm) {
/* _GTM valid */ /* _GTM valid */
/* restore timing parameters */ /* restore timing parameters */
...@@ -941,22 +853,22 @@ void ata_acpi_set_state(struct ata_port *ap, pm_message_t state) ...@@ -941,22 +853,22 @@ void ata_acpi_set_state(struct ata_port *ap, pm_message_t state)
{ {
struct ata_device *dev; struct ata_device *dev;
if (!ap->acpi_handle || (ap->flags & ATA_FLAG_ACPI_SATA)) if (!ata_ap_acpi_handle(ap) || (ap->flags & ATA_FLAG_ACPI_SATA))
return; return;
/* channel first and then drives for power on and vica versa /* channel first and then drives for power on and vica versa
for power off */ for power off */
if (state.event == PM_EVENT_ON) if (state.event == PM_EVENT_ON)
acpi_bus_set_power(ap->acpi_handle, ACPI_STATE_D0); acpi_bus_set_power(ata_ap_acpi_handle(ap), ACPI_STATE_D0);
ata_for_each_dev(dev, &ap->link, ENABLED) { ata_for_each_dev(dev, &ap->link, ENABLED) {
if (dev->acpi_handle) if (ata_dev_acpi_handle(dev))
acpi_bus_set_power(dev->acpi_handle, acpi_bus_set_power(ata_dev_acpi_handle(dev),
state.event == PM_EVENT_ON ? state.event == PM_EVENT_ON ?
ACPI_STATE_D0 : ACPI_STATE_D3); ACPI_STATE_D0 : ACPI_STATE_D3);
} }
if (state.event != PM_EVENT_ON) if (state.event != PM_EVENT_ON)
acpi_bus_set_power(ap->acpi_handle, ACPI_STATE_D3); acpi_bus_set_power(ata_ap_acpi_handle(ap), ACPI_STATE_D3);
} }
/** /**
...@@ -981,7 +893,7 @@ int ata_acpi_on_devcfg(struct ata_device *dev) ...@@ -981,7 +893,7 @@ int ata_acpi_on_devcfg(struct ata_device *dev)
int nr_executed = 0; int nr_executed = 0;
int rc; int rc;
if (!dev->acpi_handle) if (!ata_dev_acpi_handle(dev))
return 0; return 0;
/* do we need to do _GTF? */ /* do we need to do _GTF? */
...@@ -1027,7 +939,6 @@ int ata_acpi_on_devcfg(struct ata_device *dev) ...@@ -1027,7 +939,6 @@ int ata_acpi_on_devcfg(struct ata_device *dev)
} }
ata_dev_warn(dev, "ACPI: failed the second time, disabled\n"); ata_dev_warn(dev, "ACPI: failed the second time, disabled\n");
dev->acpi_handle = NULL;
/* We can safely continue if no _GTF command has been executed /* We can safely continue if no _GTF command has been executed
* and port is not frozen. * and port is not frozen.
...@@ -1093,7 +1004,7 @@ static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev, ...@@ -1093,7 +1004,7 @@ static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev,
else else
ata_dev = &ap->link.device[sdev->id]; ata_dev = &ap->link.device[sdev->id];
*handle = dev_acpi_handle(ata_dev); *handle = ata_dev_acpi_handle(ata_dev);
if (!*handle) if (!*handle)
return -ENODEV; return -ENODEV;
......
...@@ -6049,9 +6049,6 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) ...@@ -6049,9 +6049,6 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
if (rc) if (rc)
goto err_tadd; goto err_tadd;
/* associate with ACPI nodes */
ata_acpi_associate(host);
/* set cable, sata_spd_limit and report */ /* set cable, sata_spd_limit and report */
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
......
...@@ -529,8 +529,6 @@ int sata_pmp_attach(struct ata_device *dev) ...@@ -529,8 +529,6 @@ int sata_pmp_attach(struct ata_device *dev)
ata_for_each_link(tlink, ap, EDGE) ata_for_each_link(tlink, ap, EDGE)
sata_link_init_spd(tlink); sata_link_init_spd(tlink);
ata_acpi_associate_sata_port(ap);
return 0; return 0;
fail: fail:
...@@ -570,8 +568,6 @@ static void sata_pmp_detach(struct ata_device *dev) ...@@ -570,8 +568,6 @@ 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);
} }
/** /**
......
...@@ -112,9 +112,6 @@ extern void __ata_port_probe(struct ata_port *ap); ...@@ -112,9 +112,6 @@ extern void __ata_port_probe(struct ata_port *ap);
/* libata-acpi.c */ /* libata-acpi.c */
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
extern unsigned int ata_acpi_gtf_filter; extern unsigned int ata_acpi_gtf_filter;
extern void ata_acpi_associate_sata_port(struct ata_port *ap);
extern void ata_acpi_associate(struct ata_host *host);
extern void ata_acpi_dissociate(struct ata_host *host); extern void ata_acpi_dissociate(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);
...@@ -124,8 +121,6 @@ extern void ata_acpi_set_state(struct ata_port *ap, pm_message_t state); ...@@ -124,8 +121,6 @@ extern void ata_acpi_set_state(struct ata_port *ap, pm_message_t state);
extern int ata_acpi_register(void); extern int ata_acpi_register(void);
extern void ata_acpi_unregister(void); extern void ata_acpi_unregister(void);
#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_dissociate(struct ata_host *host) { } static inline void ata_acpi_dissociate(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) { }
......
...@@ -39,7 +39,7 @@ static int pacpi_pre_reset(struct ata_link *link, unsigned long deadline) ...@@ -39,7 +39,7 @@ static int pacpi_pre_reset(struct ata_link *link, unsigned long deadline)
{ {
struct ata_port *ap = link->ap; struct ata_port *ap = link->ap;
struct pata_acpi *acpi = ap->private_data; struct pata_acpi *acpi = ap->private_data;
if (ap->acpi_handle == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0) if (ata_ap_acpi_handle(ap) == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0)
return -ENODEV; return -ENODEV;
return ata_sff_prereset(link, deadline); return ata_sff_prereset(link, deadline);
...@@ -195,7 +195,7 @@ static int pacpi_port_start(struct ata_port *ap) ...@@ -195,7 +195,7 @@ static int pacpi_port_start(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct pci_dev *pdev = to_pci_dev(ap->host->dev);
struct pata_acpi *acpi; struct pata_acpi *acpi;
if (ap->acpi_handle == NULL) if (ata_ap_acpi_handle(ap) == NULL)
return -ENODEV; return -ENODEV;
acpi = ap->private_data = devm_kzalloc(&pdev->dev, sizeof(struct pata_acpi), GFP_KERNEL); acpi = ap->private_data = devm_kzalloc(&pdev->dev, sizeof(struct pata_acpi), GFP_KERNEL);
......
...@@ -545,9 +545,6 @@ struct ata_host { ...@@ -545,9 +545,6 @@ struct ata_host {
struct mutex eh_mutex; struct mutex eh_mutex;
struct task_struct *eh_owner; struct task_struct *eh_owner;
#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
#endif
struct ata_port *simplex_claimed; /* channel owning the DMA */ struct ata_port *simplex_claimed; /* channel owning the DMA */
struct ata_port *ports[0]; struct ata_port *ports[0];
}; };
...@@ -615,7 +612,6 @@ struct ata_device { ...@@ -615,7 +612,6 @@ struct ata_device {
struct scsi_device *sdev; /* attached SCSI device */ struct scsi_device *sdev; /* attached SCSI device */
void *private_data; void *private_data;
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
union acpi_object *gtf_cache; union acpi_object *gtf_cache;
unsigned int gtf_filter; unsigned int gtf_filter;
#endif #endif
...@@ -797,7 +793,6 @@ struct ata_port { ...@@ -797,7 +793,6 @@ struct ata_port {
void *private_data; void *private_data;
#ifdef CONFIG_ATA_ACPI #ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
#endif #endif
/* owned by EH */ /* owned by EH */
...@@ -1114,6 +1109,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm); ...@@ -1114,6 +1109,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm);
int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm); int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm);
unsigned long ata_acpi_gtm_xfermask(struct ata_device *dev, unsigned long ata_acpi_gtm_xfermask(struct ata_device *dev,
const struct ata_acpi_gtm *gtm); const struct ata_acpi_gtm *gtm);
acpi_handle ata_ap_acpi_handle(struct ata_port *ap);
acpi_handle ata_dev_acpi_handle(struct ata_device *dev);
int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm); int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm);
#else #else
static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap) static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment