summaryrefslogtreecommitdiff
path: root/drivers/crypto/mxs-dcp.c
diff options
context:
space:
mode:
authorDan Douglass <dan.douglass@freescale.com>2016-08-23 22:52:01 -0500
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:24:53 +0800
commitaa691c2db1ac174a35dbb26554d782b21f7c7b9e (patch)
tree0e80311974ddd369d9e9d5b5328877c135c32c3b /drivers/crypto/mxs-dcp.c
parent971045dee20327648b38b1f22197218d94016b1f (diff)
MLK-13095 DCP driver doesn't initialize the DCP clock
Added clock enable and disable to the probe and remove functions where appropriate. Signed-off-by: Dan Douglass <dan.douglass@nxp.com>
Diffstat (limited to 'drivers/crypto/mxs-dcp.c')
-rw-r--r--drivers/crypto/mxs-dcp.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c
index 4368e9450a8e..821587db9a88 100644
--- a/drivers/crypto/mxs-dcp.c
+++ b/drivers/crypto/mxs-dcp.c
@@ -20,6 +20,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/stmp_device.h>
+#include <linux/clk.h>
#include <crypto/aes.h>
#include <crypto/sha.h>
@@ -66,6 +67,9 @@ struct dcp {
spinlock_t lock[DCP_MAX_CHANS];
struct task_struct *thread[DCP_MAX_CHANS];
struct crypto_queue queue[DCP_MAX_CHANS];
+#ifdef CONFIG_ARM
+ struct clk *dcp_clk;
+#endif
};
enum dcp_chan {
@@ -975,6 +979,26 @@ static int mxs_dcp_probe(struct platform_device *pdev)
if (IS_ERR(sdcp->base))
return PTR_ERR(sdcp->base);
+#ifdef CONFIG_ARM
+ sdcp->dcp_clk = devm_clk_get(dev, "dcp");
+
+ if (IS_ERR(sdcp->dcp_clk)) {
+ ret = PTR_ERR(sdcp->dcp_clk);
+ dev_err(dev, "can't identify DCP clk: %d\n", ret);
+ return -ENODEV;
+ }
+
+ ret = clk_prepare(sdcp->dcp_clk);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "can't prepare DCP clock: %d\n", ret);
+ return -ENODEV;
+ }
+ ret = clk_enable(sdcp->dcp_clk);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "can't enable DCP clock: %d\n", ret);
+ return -ENODEV;
+ }
+#endif
ret = devm_request_irq(dev, dcp_vmi_irq, mxs_dcp_irq, 0,
"dcp-vmi-irq", sdcp);
@@ -1116,6 +1140,11 @@ static int mxs_dcp_remove(struct platform_device *pdev)
kthread_stop(sdcp->thread[DCP_CHAN_HASH_SHA]);
kthread_stop(sdcp->thread[DCP_CHAN_CRYPTO]);
+#ifdef CONFIG_ARM
+ /* shut clocks off before finalizing shutdown */
+ clk_disable(sdcp->dcp_clk);
+#endif
+
platform_set_drvdata(pdev, NULL);
global_sdcp = NULL;