summaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorLin Ming <ming.m.lin@intel.com>2011-12-22 07:50:48 +0100
committerJeff Garzik <jgarzik@redhat.com>2012-01-09 01:14:59 +0100
commite90b1e5a6e04c8892007ff8db20ef6d4fbdb5402 (patch)
tree0a08c16dcf48edbaa1307a873440bddd04c994b7 /drivers/ata
parent[SCSI] runtime resume parent for child's system-resume (diff)
downloadlinux-e90b1e5a6e04c8892007ff8db20ef6d4fbdb5402.tar.xz
linux-e90b1e5a6e04c8892007ff8db20ef6d4fbdb5402.zip
ata: update ata port's runtime status during system resume
The ata port is brought back to full power state during system resume. So its runtime PM status will have to be updated to reflect the actual post-system sleep status. This also fixes below warning during system suspend/resume. WARNING: at /work/linux/drivers/ata/libata-eh.c:4034 ata_scsi_port_error_handler+0x89/0x557() 4034 WARN_ON(!(ap->pflags & ATA_PFLAG_SUSPENDED)); Signed-off-by: Lin Ming <ming.m.lin@intel.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-core.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index d5935e4f3529..ba1ed9b3acc3 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -5298,7 +5298,7 @@ static int ata_port_suspend(struct device *dev)
return ata_port_suspend_common(dev);
}
-static int ata_port_resume(struct device *dev)
+static int ata_port_resume_common(struct device *dev)
{
struct ata_port *ap = to_ata_port(dev);
int rc;
@@ -5308,6 +5308,20 @@ static int ata_port_resume(struct device *dev)
return rc;
}
+static int ata_port_resume(struct device *dev)
+{
+ int rc;
+
+ rc = ata_port_resume_common(dev);
+ if (!rc) {
+ pm_runtime_disable(dev);
+ pm_runtime_set_active(dev);
+ pm_runtime_enable(dev);
+ }
+
+ return rc;
+}
+
static int ata_port_runtime_idle(struct device *dev)
{
return pm_runtime_suspend(dev);
@@ -5318,7 +5332,7 @@ static const struct dev_pm_ops ata_port_pm_ops = {
.resume = ata_port_resume,
.runtime_suspend = ata_port_suspend_common,
- .runtime_resume = ata_port_resume,
+ .runtime_resume = ata_port_resume_common,
.runtime_idle = ata_port_runtime_idle,
};