[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <6f40597aea1b16581d3ef13a35aa2318188b2d4d.1503314240.git.michal.simek@xilinx.com>
Date: Mon, 21 Aug 2017 13:17:23 +0200
From: Michal Simek <michal.simek@...inx.com>
To: linux-kernel@...r.kernel.org, monstr@...str.eu
Cc: Alexander Graf <agraf@...e.de>, Rob Herring <robh@...nel.org>,
Anurag Kumar Vulisha <anurag.kumar.vulisha@...inx.com>,
Tejun Heo <tj@...nel.org>, linux-ide@...r.kernel.org
Subject: [PATCH v2 8/9] ata: ceva: Correct the suspend and resume logic for SATA
From: Anurag Kumar Vulisha <anurag.kumar.vulisha@...inx.com>
The present suspend code disables the port interrupts
and stops the HBA. On resume it enables the interrupts and HBA.
This works fine until the FPD power domain is not off.
If FPD is off then the ceva vendor specific configurations like
OOB, AXI settings are lost, they need to be re-programmed and
also since SERDES is also in FPD , SATA lane phy init needs to
be called again (which is not happening in the present sequence)
Because of this incorrect sequence SATA fails to work on resume.
This patch corrects the code to make Suspend & Resume work in normal
and FPD off cases.
Signed-off-by: Anurag Kumar Vulisha <anuragku@...inx.com>
Reviewed-by: Shubhrajyoti Datta <shubhraj@...inx.com>
Signed-off-by: Michal Simek <michal.simek@...inx.com>
---
Changes in v2: None
drivers/ata/ahci_ceva.c | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/drivers/ata/ahci_ceva.c b/drivers/ata/ahci_ceva.c
index 113c1f617da9..c0742cbe4faa 100644
--- a/drivers/ata/ahci_ceva.c
+++ b/drivers/ata/ahci_ceva.c
@@ -298,12 +298,37 @@ static int ceva_ahci_probe(struct platform_device *pdev)
static int __maybe_unused ceva_ahci_suspend(struct device *dev)
{
- return ahci_platform_suspend_host(dev);
+ return ahci_platform_suspend(dev);
}
static int __maybe_unused ceva_ahci_resume(struct device *dev)
{
- return ahci_platform_resume_host(dev);
+ struct ata_host *host = dev_get_drvdata(dev);
+ struct ahci_host_priv *hpriv = host->private_data;
+ int rc;
+
+ rc = ahci_platform_enable_resources(hpriv);
+ if (rc)
+ return rc;
+
+ /* Configure CEVA specific config before resuming HBA */
+ ahci_ceva_setup(hpriv);
+
+ rc = ahci_platform_resume_host(dev);
+ if (rc)
+ goto disable_resources;
+
+ /* We resumed so update PM runtime state */
+ pm_runtime_disable(dev);
+ pm_runtime_set_active(dev);
+ pm_runtime_enable(dev);
+
+ return 0;
+
+disable_resources:
+ ahci_platform_disable_resources(hpriv);
+
+ return rc;
}
static SIMPLE_DEV_PM_OPS(ahci_ceva_pm_ops, ceva_ahci_suspend, ceva_ahci_resume);
--
1.9.1
Powered by blists - more mailing lists