summaryrefslogtreecommitdiffstats
path: root/drivers/crypto/ux500/cryp
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2013-05-15 11:51:38 +0200
committerLinus Walleij <linus.walleij@linaro.org>2013-05-23 21:14:14 +0200
commit8703ffdd90c696bd66bb3247e59e76811fbdf22e (patch)
treec55e926e56954780d1cf26e3c92915cdcdb3deb3 /drivers/crypto/ux500/cryp
parentARM: ux500: Stop passing Hash DMA channel config information though pdata (diff)
downloadlinux-8703ffdd90c696bd66bb3247e59e76811fbdf22e.tar.xz
linux-8703ffdd90c696bd66bb3247e59e76811fbdf22e.zip
crypto: ux500/cryp - Prepare clock before enabling it
If we fail to prepare the ux500-cryp clock before enabling it the platform will fail to boot. Here we insure this happens. Cc: David S. Miller <davem@davemloft.net> Cc: Andreas Westin <andreas.westin@stericsson.com> Cc: linux-crypto@vger.kernel.org Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Acked-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/crypto/ux500/cryp')
-rw-r--r--drivers/crypto/ux500/cryp/cryp_core.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/crypto/ux500/cryp/cryp_core.c b/drivers/crypto/ux500/cryp/cryp_core.c
index 32f480622b97..ccdf17392411 100644
--- a/drivers/crypto/ux500/cryp/cryp_core.c
+++ b/drivers/crypto/ux500/cryp/cryp_core.c
@@ -1458,11 +1458,17 @@ static int ux500_cryp_probe(struct platform_device *pdev)
goto out_regulator;
}
+ ret = clk_prepare(device_data->clk);
+ if (ret) {
+ dev_err(dev, "[%s]: clk_prepare() failed!", __func__);
+ goto out_clk;
+ }
+
/* Enable device power (and clock) */
ret = cryp_enable_power(device_data->dev, device_data, false);
if (ret) {
dev_err(dev, "[%s]: cryp_enable_power() failed!", __func__);
- goto out_clk;
+ goto out_clk_unprepare;
}
cryp_error = cryp_check(device_data);
@@ -1523,6 +1529,9 @@ static int ux500_cryp_probe(struct platform_device *pdev)
out_power:
cryp_disable_power(device_data->dev, device_data, false);
+out_clk_unprepare:
+ clk_unprepare(device_data->clk);
+
out_clk:
clk_put(device_data->clk);
@@ -1593,6 +1602,7 @@ static int ux500_cryp_remove(struct platform_device *pdev)
dev_err(&pdev->dev, "[%s]: cryp_disable_power() failed",
__func__);
+ clk_unprepare(device_data->clk);
clk_put(device_data->clk);
regulator_put(device_data->pwr_regulator);