Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 356947
b: refs/heads/master
c: f064a20
h: refs/heads/master
i:
  356945: a3f629f
  356943: 1bb12f3
v: v3
  • Loading branch information
Aaron Lu authored and Jeff Garzik committed Jan 21, 2013
1 parent f94f0d6 commit 13d94ec
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 72 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: afe759511808cd5bb508b598007cf0c7b0ca8e08
refs/heads/master: f064a20dded807448669426c9bfb7d03aba5659c
71 changes: 0 additions & 71 deletions trunk/drivers/ata/libata-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -974,57 +974,6 @@ void ata_acpi_on_disable(struct ata_device *dev)
ata_acpi_clear_gtf(dev);
}

static void ata_acpi_wake_dev(acpi_handle handle, u32 event, void *context)
{
struct ata_device *ata_dev = context;

if (event == ACPI_NOTIFY_DEVICE_WAKE && ata_dev &&
pm_runtime_suspended(&ata_dev->sdev->sdev_gendev))
scsi_autopm_get_device(ata_dev->sdev);
}

static void ata_acpi_add_pm_notifier(struct ata_device *dev)
{
struct acpi_device *acpi_dev;
acpi_handle handle;
acpi_status status;

handle = ata_dev_acpi_handle(dev);
if (!handle)
return;

status = acpi_bus_get_device(handle, &acpi_dev);
if (ACPI_FAILURE(status))
return;

if (dev->sdev->can_power_off) {
acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
ata_acpi_wake_dev, dev);
device_set_run_wake(&dev->sdev->sdev_gendev, true);
}
}

static void ata_acpi_remove_pm_notifier(struct ata_device *dev)
{
struct acpi_device *acpi_dev;
acpi_handle handle;
acpi_status status;

handle = ata_dev_acpi_handle(dev);
if (!handle)
return;

status = acpi_bus_get_device(handle, &acpi_dev);
if (ACPI_FAILURE(status))
return;

if (dev->sdev->can_power_off) {
device_set_run_wake(&dev->sdev->sdev_gendev, false);
acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
ata_acpi_wake_dev);
}
}

static void ata_acpi_register_power_resource(struct ata_device *dev)
{
struct scsi_device *sdev = dev->sdev;
Expand Down Expand Up @@ -1057,13 +1006,11 @@ static void ata_acpi_unregister_power_resource(struct ata_device *dev)

void ata_acpi_bind(struct ata_device *dev)
{
ata_acpi_add_pm_notifier(dev);
ata_acpi_register_power_resource(dev);
}

void ata_acpi_unbind(struct ata_device *dev)
{
ata_acpi_remove_pm_notifier(dev);
ata_acpi_unregister_power_resource(dev);
}

Expand Down Expand Up @@ -1105,9 +1052,6 @@ static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev,
acpi_handle *handle)
{
struct ata_device *ata_dev;
acpi_status status;
struct acpi_device *acpi_dev;
struct acpi_device_power_state *states;

if (ap->flags & ATA_FLAG_ACPI_SATA) {
if (!sata_pmp_attached(ap))
Expand All @@ -1124,21 +1068,6 @@ static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev,
if (!*handle)
return -ENODEV;

status = acpi_bus_get_device(*handle, &acpi_dev);
if (ACPI_FAILURE(status))
return 0;

/*
* If firmware has _PS3 or _PR3 for this device,
* and this ata ODD device support device attention,
* it means this device can be powered off
*/
states = acpi_dev->power.states;
if ((states[ACPI_STATE_D3_HOT].flags.valid ||
states[ACPI_STATE_D3_COLD].flags.explicit_set) &&
ata_dev->flags & ATA_DFLAG_DA)
sdev->can_power_off = 1;

return 0;
}

Expand Down
34 changes: 34 additions & 0 deletions trunk/drivers/ata/libata-zpodd.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include <linux/libata.h>
#include <linux/cdrom.h>
#include <linux/pm_runtime.h>
#include <scsi/scsi_device.h>

#include "libata.h"

Expand All @@ -12,6 +14,10 @@ enum odd_mech_type {
struct zpodd {
enum odd_mech_type mech_type; /* init during probe, RO afterwards */
struct ata_device *dev;

/* The following fields are synchronized by PM core. */
bool from_notify; /* resumed as a result of
* acpi wake notification */
};

/* Per the spec, only slot type and drawer type ODD can be supported */
Expand Down Expand Up @@ -68,6 +74,32 @@ static bool odd_can_poweroff(struct ata_device *ata_dev)
return acpi_device_can_poweroff(acpi_dev);
}

static void zpodd_wake_dev(acpi_handle handle, u32 event, void *context)
{
struct ata_device *ata_dev = context;
struct zpodd *zpodd = ata_dev->zpodd;
struct device *dev = &ata_dev->sdev->sdev_gendev;

if (event == ACPI_NOTIFY_DEVICE_WAKE && ata_dev &&
pm_runtime_suspended(dev)) {
zpodd->from_notify = true;
pm_runtime_resume(dev);
}
}

static void ata_acpi_add_pm_notifier(struct ata_device *dev)
{
acpi_handle handle = ata_dev_acpi_handle(dev);
acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
zpodd_wake_dev, dev);
}

static void ata_acpi_remove_pm_notifier(struct ata_device *dev)
{
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->sdev->sdev_gendev);
acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, zpodd_wake_dev);
}

void zpodd_init(struct ata_device *dev)
{
enum odd_mech_type mech_type;
Expand All @@ -89,12 +121,14 @@ void zpodd_init(struct ata_device *dev)

zpodd->mech_type = mech_type;

ata_acpi_add_pm_notifier(dev);
zpodd->dev = dev;
dev->zpodd = zpodd;
}

void zpodd_exit(struct ata_device *dev)
{
ata_acpi_remove_pm_notifier(dev);
kfree(dev->zpodd);
dev->zpodd = NULL;
}

0 comments on commit 13d94ec

Please sign in to comment.