summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@stericsson.com>2011-10-19 10:25:24 +0200
committerUlf HANSSON <ulf.hansson@stericsson.com>2011-10-21 12:37:26 +0200
commit42b4821b4731cdc19498bc654178b2d073b64ad1 (patch)
tree3fc8a330824ced5e33d572fbc9e98c3a72cfbec0
parent79ebe44c7515f55988d9d4c0d822bb37fece9637 (diff)
spi/pl022: Enable clock in probe an use runtime_idle
Since we are always runtime resumed when leaving probe the clock must be enabled. To accomplish that we are able to be runtime suspended after probe in the case when no request is going to be recieved, a runtime_idle function has been implemented. Change-Id: I6cb86f2cad30ecaab16f512daf4674b039b18213 Signed-off-by: Ulf Hansson <ulf.hansson@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/34447
-rw-r--r--drivers/spi/spi-pl022.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c
index 1dd3d175894..c8310834378 100644
--- a/drivers/spi/spi-pl022.c
+++ b/drivers/spi/spi-pl022.c
@@ -2177,6 +2177,12 @@ pl022_probe(struct amba_device *adev, const struct amba_id *id)
dev_err(&adev->dev, "could not retrieve SSP/SPI bus clock\n");
goto err_no_clk;
}
+ status = clk_enable(pl022->clk);
+ if (status) {
+ dev_err(&adev->dev, "could not enable SSP/SPI bus clock\n");
+ goto err_no_clk_en;
+ }
+
/* Disable SSP */
writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)),
SSP_CR1(pl022->virtbase));
@@ -2230,6 +2236,8 @@ pl022_probe(struct amba_device *adev, const struct amba_id *id)
free_irq(adev->irq[0], pl022);
err_no_irq:
+ clk_disable(pl022->clk);
+ err_no_clk_en:
clk_put(pl022->clk);
err_no_clk:
iounmap(pl022->virtbase);
@@ -2332,11 +2340,19 @@ static int pl022_runtime_resume(struct device *dev)
return 0;
}
+
+static int pl022_runtime_idle(struct device *dev)
+{
+ pm_runtime_suspend(dev);
+ return 0;
+}
#endif
static const struct dev_pm_ops pl022_dev_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(pl022_suspend, pl022_resume)
- SET_RUNTIME_PM_OPS(pl022_runtime_suspend, pl022_runtime_resume, NULL)
+ SET_RUNTIME_PM_OPS(pl022_runtime_suspend,
+ pl022_runtime_resume,
+ pl022_runtime_idle)
};
static struct vendor_data vendor_arm = {