From: Aaron Lu <aaron.lu@intel.com>
To: Jeff Garzik <jgarzik@pobox.com>,
"Rafael J. Wysocki" <rjw@sisk.pl>,
James Bottomley <James.Bottomley@hansenpartnership.com>,
Alan Stern <stern@rowland.harvard.edu>, Tejun Heo <tj@kernel.org>,
Oliver Neukum <oliver@neukum.org>
Cc: Jeff Wu <jeff.wu@amd.com>, Aaron Lu <aaron.lwe@gmail.com>,
Shane Huang <shane.huang@amd.com>,
linux-ide@vger.kernel.org, linux-pm@vger.kernel.org,
linux-scsi@vger.kernel.org, linux-acpi@vger.kernel.org
Subject: [PATCH v8 03/11] ata: zpodd: identify and init ZPODD devices
Date: Mon, 29 Oct 2012 17:01:30 +0800 [thread overview]
Message-ID: <1351501298-3716-4-git-send-email-aaron.lu@intel.com> (raw)
In-Reply-To: <1351501298-3716-1-git-send-email-aaron.lu@intel.com>
If the ODD supports device attention and the platform can runtime
power off it through ACPI, it means this ODD together with this platform
is ZPODD capable. For this case, zpodd_init is called and a new
structure is allocated for the device to store ZPODD related stuffs.
And the zpodd_dev_enabled function is used to test if ZPODD is currently
enabled for this ODD.
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
---
drivers/ata/libata-acpi.c | 32 ++++++++++++++++++++++++++++++++
drivers/ata/sata_zpodd.c | 23 +++++++++++++++++++++++
drivers/ata/sata_zpodd.h | 24 ++++++++++++++++++++++++
3 files changed, 79 insertions(+)
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
index fd9ecf7..53b2f10 100644
--- a/drivers/ata/libata-acpi.c
+++ b/drivers/ata/libata-acpi.c
@@ -19,6 +19,7 @@
#include <linux/pm_runtime.h>
#include <scsi/scsi_device.h>
#include "libata.h"
+#include "sata_zpodd.h"
#include <acpi/acpi_bus.h>
@@ -1051,14 +1052,45 @@ static void ata_acpi_unregister_power_resource(struct ata_device *dev)
acpi_power_resource_unregister_device(device, handle);
}
+static bool ata_acpi_device_poweroff(struct ata_device *ata_dev)
+{
+ acpi_handle handle;
+ acpi_status status;
+ struct acpi_device_power_state *states;
+ struct acpi_device *acpi_dev;
+
+ handle = DEVICE_ACPI_HANDLE(&ata_dev->sdev->sdev_gendev);
+ if (!handle)
+ return false;
+
+ status = acpi_bus_get_device(handle, &acpi_dev);
+ if (ACPI_FAILURE(status))
+ return false;
+
+ /*
+ * If firmware has _PS3 or _PR3 for this device,
+ * it means this device can be runtime powered off
+ */
+ states = acpi_dev->power.states;
+ if (states[ACPI_STATE_D3_HOT].flags.valid ||
+ states[ACPI_STATE_D3_COLD].flags.explicit_set)
+ return true;
+ else
+ return false;
+}
+
void ata_acpi_bind(struct ata_device *dev)
{
ata_acpi_add_pm_notifier(dev);
ata_acpi_register_power_resource(dev);
+ if (dev->flags & ATA_DFLAG_DA && ata_acpi_device_poweroff(dev))
+ zpodd_init(dev);
}
void ata_acpi_unbind(struct ata_device *dev)
{
+ if (zpodd_dev_enabled(dev))
+ zpodd_deinit(dev);
ata_acpi_remove_pm_notifier(dev);
ata_acpi_unregister_power_resource(dev);
}
diff --git a/drivers/ata/sata_zpodd.c b/drivers/ata/sata_zpodd.c
index e69de29..b37db2f 100644
--- a/drivers/ata/sata_zpodd.c
+++ b/drivers/ata/sata_zpodd.c
@@ -0,0 +1,23 @@
+#include <linux/libata.h>
+
+struct zpodd {
+ struct ata_device *dev;
+};
+
+
+void zpodd_init(struct ata_device *dev)
+{
+ struct zpodd *zpodd;
+ zpodd = kzalloc(sizeof(struct zpodd), GFP_KERNEL);
+ if (!zpodd)
+ return;
+
+ zpodd->dev = dev;
+ dev->private_data = zpodd;
+}
+
+void zpodd_deinit(struct ata_device *dev)
+{
+ kfree(dev->private_data);
+ dev->private_data = NULL;
+}
diff --git a/drivers/ata/sata_zpodd.h b/drivers/ata/sata_zpodd.h
index e69de29..e320c6f 100644
--- a/drivers/ata/sata_zpodd.h
+++ b/drivers/ata/sata_zpodd.h
@@ -0,0 +1,24 @@
+#ifndef __SATA_ZPODD_H__
+#define __SATA_ZPODD_H__
+
+#include <linux/libata.h>
+
+#ifdef CONFIG_SATA_ZPODD
+void zpodd_init(struct ata_device *);
+void zpodd_deinit(struct ata_device *);
+
+static bool zpodd_dev_enabled(struct ata_device *dev)
+{
+ if (dev->flags & ATA_DFLAG_DA && dev->private_data)
+ return true;
+ else
+ return false;
+}
+
+#else
+static inline void zpodd_init(struct ata_device *dev) {}
+static inline void zpodd_deinit(struct ata_device *dev) {}
+static inline bool zpodd_dev_enabled(struct ata_device *dev) { return false; }
+#endif
+
+#endif
--
1.7.12.4
next prev parent reply other threads:[~2012-10-29 9:01 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-29 9:01 [PATCH v8 00/11] ZPODD Patches Aaron Lu
2012-10-29 9:01 ` [PATCH v8 01/11] scsi: sr: support runtime pm Aaron Lu
2012-10-29 9:01 ` [PATCH v8 02/11] ata: zpodd: Add CONFIG_SATA_ZPODD Aaron Lu
2012-10-29 18:11 ` James Bottomley
2012-10-30 3:19 ` Aaron Lu
2012-10-29 9:01 ` Aaron Lu [this message]
2012-10-29 9:01 ` [PATCH v8 04/11] libata: acpi: move acpi notification code to sata_zpodd Aaron Lu
2012-10-29 9:01 ` [PATCH v8 05/11] libata-eh: allow defer in ata_exec_internal Aaron Lu
2012-10-29 15:20 ` Tejun Heo
2012-10-30 3:00 ` Aaron Lu
2012-10-30 3:01 ` Tejun Heo
2012-10-30 3:09 ` Aaron Lu
2012-10-31 21:52 ` Tejun Heo
2012-11-01 2:35 ` Aaron Lu
2012-11-01 16:03 ` Tejun Heo
2012-11-02 0:43 ` Aaron Lu
2012-10-29 9:01 ` [PATCH v8 06/11] ata: zpodd: check loading mechanism for ODD Aaron Lu
2012-10-29 9:01 ` [PATCH v8 07/11] libata: separate ATAPI code Aaron Lu
2012-10-29 9:01 ` [PATCH v8 08/11] ata: zpodd: check zero power ready status Aaron Lu
2012-10-29 9:01 ` [PATCH v8 09/11] block: add a new interface to block events Aaron Lu
2012-10-29 15:35 ` Tejun Heo
2012-10-30 7:04 ` Aaron Lu
2012-10-31 21:51 ` Tejun Heo
2012-11-01 6:30 ` Aaron Lu
2012-10-29 9:01 ` [PATCH v8 10/11] scsi: sr: support (un)block events Aaron Lu
2012-10-29 18:11 ` James Bottomley
2012-10-29 22:22 ` Alan Stern
2012-10-30 4:34 ` James Bottomley
2012-10-30 5:02 ` Aaron Lu
2012-10-29 9:01 ` [PATCH v8 11/11] ata: zpodd: handle power transition of ODD Aaron Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1351501298-3716-4-git-send-email-aaron.lu@intel.com \
--to=aaron.lu@intel.com \
--cc=James.Bottomley@hansenpartnership.com \
--cc=aaron.lwe@gmail.com \
--cc=jeff.wu@amd.com \
--cc=jgarzik@pobox.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=oliver@neukum.org \
--cc=rjw@sisk.pl \
--cc=shane.huang@amd.com \
--cc=stern@rowland.harvard.edu \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.