Skip to content

Commit 57f0028

Browse files
cdleonardherbertx
authored andcommitted
crypto: mxs-dcp - Add support for dcp clk
On 6ull and 6sll the DCP block has a clock which needs to be explicitly enabled. Add minimal handling for this at probe/remove time. Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com> Reviewed-by: Fabio Estevam <festevam@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 70db8b7 commit 57f0028

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

drivers/crypto/mxs-dcp.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <linux/of.h>
2121
#include <linux/platform_device.h>
2222
#include <linux/stmp_device.h>
23+
#include <linux/clk.h>
2324

2425
#include <crypto/aes.h>
2526
#include <crypto/sha.h>
@@ -82,6 +83,7 @@ struct dcp {
8283
spinlock_t lock[DCP_MAX_CHANS];
8384
struct task_struct *thread[DCP_MAX_CHANS];
8485
struct crypto_queue queue[DCP_MAX_CHANS];
86+
struct clk *dcp_clk;
8587
};
8688

8789
enum dcp_chan {
@@ -1053,11 +1055,24 @@ static int mxs_dcp_probe(struct platform_device *pdev)
10531055
/* Re-align the structure so it fits the DCP constraints. */
10541056
sdcp->coh = PTR_ALIGN(sdcp->coh, DCP_ALIGNMENT);
10551057

1056-
/* Restart the DCP block. */
1057-
ret = stmp_reset_block(sdcp->base);
1058+
/* DCP clock is optional, only used on some SOCs */
1059+
sdcp->dcp_clk = devm_clk_get(dev, "dcp");
1060+
if (IS_ERR(sdcp->dcp_clk)) {
1061+
if (sdcp->dcp_clk != ERR_PTR(-ENOENT))
1062+
return PTR_ERR(sdcp->dcp_clk);
1063+
sdcp->dcp_clk = NULL;
1064+
}
1065+
ret = clk_prepare_enable(sdcp->dcp_clk);
10581066
if (ret)
10591067
return ret;
10601068

1069+
/* Restart the DCP block. */
1070+
ret = stmp_reset_block(sdcp->base);
1071+
if (ret) {
1072+
dev_err(dev, "Failed reset\n");
1073+
goto err_disable_unprepare_clk;
1074+
}
1075+
10611076
/* Initialize control register. */
10621077
writel(MXS_DCP_CTRL_GATHER_RESIDUAL_WRITES |
10631078
MXS_DCP_CTRL_ENABLE_CONTEXT_CACHING | 0xf,
@@ -1094,7 +1109,8 @@ static int mxs_dcp_probe(struct platform_device *pdev)
10941109
NULL, "mxs_dcp_chan/sha");
10951110
if (IS_ERR(sdcp->thread[DCP_CHAN_HASH_SHA])) {
10961111
dev_err(dev, "Error starting SHA thread!\n");
1097-
return PTR_ERR(sdcp->thread[DCP_CHAN_HASH_SHA]);
1112+
ret = PTR_ERR(sdcp->thread[DCP_CHAN_HASH_SHA]);
1113+
goto err_disable_unprepare_clk;
10981114
}
10991115

11001116
sdcp->thread[DCP_CHAN_CRYPTO] = kthread_run(dcp_chan_thread_aes,
@@ -1151,6 +1167,10 @@ static int mxs_dcp_probe(struct platform_device *pdev)
11511167

11521168
err_destroy_sha_thread:
11531169
kthread_stop(sdcp->thread[DCP_CHAN_HASH_SHA]);
1170+
1171+
err_disable_unprepare_clk:
1172+
clk_disable_unprepare(sdcp->dcp_clk);
1173+
11541174
return ret;
11551175
}
11561176

@@ -1170,6 +1190,8 @@ static int mxs_dcp_remove(struct platform_device *pdev)
11701190
kthread_stop(sdcp->thread[DCP_CHAN_HASH_SHA]);
11711191
kthread_stop(sdcp->thread[DCP_CHAN_CRYPTO]);
11721192

1193+
clk_disable_unprepare(sdcp->dcp_clk);
1194+
11731195
platform_set_drvdata(pdev, NULL);
11741196

11751197
global_sdcp = NULL;

0 commit comments

Comments
 (0)