xref: /OK3568_Linux_fs/u-boot/drivers/crypto/rockchip/crypto_v1.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <common.h>
7*4882a593Smuzhiyun #include <clk.h>
8*4882a593Smuzhiyun #include <crypto.h>
9*4882a593Smuzhiyun #include <dm.h>
10*4882a593Smuzhiyun #include <reset.h>
11*4882a593Smuzhiyun #include <rockchip/crypto_hash_cache.h>
12*4882a593Smuzhiyun #include <rockchip/crypto_v1.h>
13*4882a593Smuzhiyun #include <asm/io.h>
14*4882a593Smuzhiyun #include <asm/arch/hardware.h>
15*4882a593Smuzhiyun #include <asm/arch/clock.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define CRYPTO_V1_DEFAULT_RATE		100000000
18*4882a593Smuzhiyun /* crypto timeout 500ms, must support more than 32M data per times*/
19*4882a593Smuzhiyun #define HASH_UPDATE_LIMIT	(32 * 1024 * 1024)
20*4882a593Smuzhiyun #define RK_CRYPTO_TIME_OUT	500000
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define LLI_ADDR_ALIGN_SIZE	8
23*4882a593Smuzhiyun #define DATA_ADDR_ALIGN_SIZE	8
24*4882a593Smuzhiyun #define DATA_LEN_ALIGN_SIZE	64
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun struct rockchip_crypto_priv {
27*4882a593Smuzhiyun 	struct crypto_hash_cache	*hash_cache;
28*4882a593Smuzhiyun 	struct rk_crypto_reg		*reg;
29*4882a593Smuzhiyun 	struct clk			clk;
30*4882a593Smuzhiyun 	struct reset_ctl_bulk		rsts;
31*4882a593Smuzhiyun 	sha_context			*ctx;
32*4882a593Smuzhiyun 	u32				frequency;
33*4882a593Smuzhiyun 	char				*clocks;
34*4882a593Smuzhiyun 	u32				nclocks;
35*4882a593Smuzhiyun 	u32				length;
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
rockchip_crypto_capability(struct udevice * dev)38*4882a593Smuzhiyun static u32 rockchip_crypto_capability(struct udevice *dev)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	return CRYPTO_MD5 |
41*4882a593Smuzhiyun 	       CRYPTO_SHA1 |
42*4882a593Smuzhiyun 	       CRYPTO_SHA256 |
43*4882a593Smuzhiyun 	       CRYPTO_RSA512 |
44*4882a593Smuzhiyun 	       CRYPTO_RSA1024 |
45*4882a593Smuzhiyun 	       CRYPTO_RSA2048;
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
rk_hash_direct_calc(void * hw_data,const u8 * data,u32 data_len,u8 * started_flag,u8 is_last)48*4882a593Smuzhiyun static int rk_hash_direct_calc(void *hw_data, const u8 *data,
49*4882a593Smuzhiyun 			       u32 data_len, u8 *started_flag, u8 is_last)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun 	struct rockchip_crypto_priv *priv = hw_data;
52*4882a593Smuzhiyun 	struct rk_crypto_reg *reg = priv->reg;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	if (!data_len)
55*4882a593Smuzhiyun 		return -EINVAL;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	/* Must flush dcache before crypto DMA fetch data region */
58*4882a593Smuzhiyun 	crypto_flush_cacheline((ulong)data, data_len);
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	/* Hash Done Interrupt */
61*4882a593Smuzhiyun 	writel(HASH_DONE_INT, &reg->crypto_intsts);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	/* Set data base and length */
64*4882a593Smuzhiyun 	writel((u32)(ulong)data, &reg->crypto_hrdmas);
65*4882a593Smuzhiyun 	writel((data_len + 3) >> 2, &reg->crypto_hrdmal);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	/* Write 1 to start. When finishes, the core will clear it */
68*4882a593Smuzhiyun 	rk_setreg(&reg->crypto_ctrl, HASH_START);
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	/* Wait last complete */
71*4882a593Smuzhiyun 	do {} while (readl(&reg->crypto_ctrl) & HASH_START);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	priv->length += data_len;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	return 0;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
rockchip_crypto_sha_init(struct udevice * dev,sha_context * ctx)78*4882a593Smuzhiyun static int rockchip_crypto_sha_init(struct udevice *dev, sha_context *ctx)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
81*4882a593Smuzhiyun 	struct rk_crypto_reg *reg = priv->reg;
82*4882a593Smuzhiyun 	u32 val;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	if (!ctx)
85*4882a593Smuzhiyun 		return -EINVAL;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	if (!ctx->length) {
88*4882a593Smuzhiyun 		printf("Crypto-v1: require data total length for sha init\n");
89*4882a593Smuzhiyun 		return -EINVAL;
90*4882a593Smuzhiyun 	}
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	priv->hash_cache = crypto_hash_cache_alloc(rk_hash_direct_calc,
93*4882a593Smuzhiyun 						   priv, ctx->length,
94*4882a593Smuzhiyun 						   DATA_ADDR_ALIGN_SIZE,
95*4882a593Smuzhiyun 						   DATA_LEN_ALIGN_SIZE);
96*4882a593Smuzhiyun 	if (!priv->hash_cache)
97*4882a593Smuzhiyun 		return -EFAULT;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	priv->ctx = ctx;
100*4882a593Smuzhiyun 	priv->length = 0;
101*4882a593Smuzhiyun 	writel(ctx->length, &reg->crypto_hash_msg_len);
102*4882a593Smuzhiyun 	if (ctx->algo == CRYPTO_SHA256) {
103*4882a593Smuzhiyun 		/* Set SHA256 mode and out byte swap */
104*4882a593Smuzhiyun 		writel(HASH_SWAP_DO | ENGINE_SELECTION_SHA256,
105*4882a593Smuzhiyun 		       &reg->crypto_hash_ctrl);
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 		val = readl(&reg->crypto_conf);
108*4882a593Smuzhiyun 		val &= ~BYTESWAP_HRFIFO;
109*4882a593Smuzhiyun 		writel(val, &reg->crypto_conf);
110*4882a593Smuzhiyun 	} else if (ctx->algo == CRYPTO_SHA1) {
111*4882a593Smuzhiyun 		/* Set SHA160 input byte swap */
112*4882a593Smuzhiyun 		val = readl(&reg->crypto_conf);
113*4882a593Smuzhiyun 		val |= BYTESWAP_HRFIFO;
114*4882a593Smuzhiyun 		writel(val, &reg->crypto_conf);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 		/* Set SHA160 mode and out byte swap */
117*4882a593Smuzhiyun 		writel(HASH_SWAP_DO, &reg->crypto_hash_ctrl);
118*4882a593Smuzhiyun 	} else if (ctx->algo == CRYPTO_MD5) {
119*4882a593Smuzhiyun 		/* Set MD5 input byte swap */
120*4882a593Smuzhiyun 		val = readl(&reg->crypto_conf);
121*4882a593Smuzhiyun 		val |= BYTESWAP_HRFIFO;
122*4882a593Smuzhiyun 		writel(val, &reg->crypto_conf);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 		/* Set MD5 mode and out byte swap */
125*4882a593Smuzhiyun 		writel(HASH_SWAP_DO | ENGINE_SELECTION_MD5,
126*4882a593Smuzhiyun 		       &reg->crypto_hash_ctrl);
127*4882a593Smuzhiyun 	} else {
128*4882a593Smuzhiyun 		return -EINVAL;
129*4882a593Smuzhiyun 	}
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	rk_setreg(&reg->crypto_ctrl, HASH_FLUSH);
132*4882a593Smuzhiyun 	do {} while (readl(&reg->crypto_ctrl) & HASH_FLUSH);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	/* SHA256 needs input byte swap */
135*4882a593Smuzhiyun 	if (ctx->algo == CRYPTO_SHA256) {
136*4882a593Smuzhiyun 		val = readl(&reg->crypto_conf);
137*4882a593Smuzhiyun 		val |= BYTESWAP_HRFIFO;
138*4882a593Smuzhiyun 		writel(val, &reg->crypto_conf);
139*4882a593Smuzhiyun 	}
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	return 0;
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun 
rockchip_crypto_sha_update(struct udevice * dev,u32 * input,u32 len)144*4882a593Smuzhiyun static int rockchip_crypto_sha_update(struct udevice *dev,
145*4882a593Smuzhiyun 				      u32 *input, u32 len)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
148*4882a593Smuzhiyun 	int ret = -EINVAL, i;
149*4882a593Smuzhiyun 	u8 *p;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	if (!input || !len)
152*4882a593Smuzhiyun 		goto exit;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	p = (u8 *)input;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	for (i = 0; i < len / HASH_UPDATE_LIMIT; i++, p += HASH_UPDATE_LIMIT) {
157*4882a593Smuzhiyun 		ret = crypto_hash_update_with_cache(priv->hash_cache, p,
158*4882a593Smuzhiyun 						    HASH_UPDATE_LIMIT);
159*4882a593Smuzhiyun 		if (ret)
160*4882a593Smuzhiyun 			goto exit;
161*4882a593Smuzhiyun 	}
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	if (len % HASH_UPDATE_LIMIT)
164*4882a593Smuzhiyun 		ret = crypto_hash_update_with_cache(priv->hash_cache, p,
165*4882a593Smuzhiyun 						    len % HASH_UPDATE_LIMIT);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun exit:
168*4882a593Smuzhiyun 	if (ret) {
169*4882a593Smuzhiyun 		crypto_hash_cache_free(priv->hash_cache);
170*4882a593Smuzhiyun 		priv->hash_cache = NULL;
171*4882a593Smuzhiyun 	}
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	return ret;
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun 
rockchip_crypto_sha_final(struct udevice * dev,sha_context * ctx,u8 * output)176*4882a593Smuzhiyun static int rockchip_crypto_sha_final(struct udevice *dev,
177*4882a593Smuzhiyun 				     sha_context *ctx, u8 *output)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
180*4882a593Smuzhiyun 	struct rk_crypto_reg *reg = priv->reg;
181*4882a593Smuzhiyun 	u32 *buf = (u32 *)output;
182*4882a593Smuzhiyun 	int ret = 0;
183*4882a593Smuzhiyun 	u32 nbits;
184*4882a593Smuzhiyun 	int i;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	if (priv->length != ctx->length) {
187*4882a593Smuzhiyun 		printf("total length(0x%08x) != init length(0x%08x)!\n",
188*4882a593Smuzhiyun 		       priv->length, ctx->length);
189*4882a593Smuzhiyun 		ret = -EIO;
190*4882a593Smuzhiyun 		goto exit;
191*4882a593Smuzhiyun 	}
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	/* Wait last complete */
194*4882a593Smuzhiyun 	do {} while (readl(&reg->crypto_ctrl) & HASH_START);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	/* It is high when finish, and it will not be low until it restart */
197*4882a593Smuzhiyun 	do {} while (!readl(&reg->crypto_hash_sts));
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	/* Read hash data, per-data 32-bit */
200*4882a593Smuzhiyun 	nbits = crypto_algo_nbits(ctx->algo);
201*4882a593Smuzhiyun 	for (i = 0; i < BITS2WORD(nbits); i++)
202*4882a593Smuzhiyun 		buf[i] = readl(&reg->crypto_hash_dout[i]);
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun exit:
205*4882a593Smuzhiyun 	crypto_hash_cache_free(priv->hash_cache);
206*4882a593Smuzhiyun 	priv->hash_cache = NULL;
207*4882a593Smuzhiyun 	return ret;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun #if CONFIG_IS_ENABLED(ROCKCHIP_RSA)
rockchip_crypto_rsa_verify(struct udevice * dev,rsa_key * ctx,u8 * sign,u8 * output)211*4882a593Smuzhiyun static int rockchip_crypto_rsa_verify(struct udevice *dev, rsa_key *ctx,
212*4882a593Smuzhiyun 				      u8 *sign, u8 *output)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
215*4882a593Smuzhiyun 	struct rk_crypto_reg *reg = priv->reg;
216*4882a593Smuzhiyun 	u32 nbits, *buf = (u32 *)output;
217*4882a593Smuzhiyun 	int i, value;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	if (!ctx)
220*4882a593Smuzhiyun 		return -EINVAL;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	if (ctx->algo == CRYPTO_RSA512)
223*4882a593Smuzhiyun 		value = PKA_BLOCK_SIZE_512;
224*4882a593Smuzhiyun 	else if (ctx->algo == CRYPTO_RSA1024)
225*4882a593Smuzhiyun 		value = PKA_BLOCK_SIZE_1024;
226*4882a593Smuzhiyun 	else if (ctx->algo == CRYPTO_RSA2048)
227*4882a593Smuzhiyun 		value = PKA_BLOCK_SIZE_2048;
228*4882a593Smuzhiyun 	else
229*4882a593Smuzhiyun 		return -EINVAL;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	if (priv->rsts.resets && priv->rsts.count) {
232*4882a593Smuzhiyun 		reset_assert_bulk(&priv->rsts);
233*4882a593Smuzhiyun 		udelay(10);
234*4882a593Smuzhiyun 		reset_deassert_bulk(&priv->rsts);
235*4882a593Smuzhiyun 	}
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	/* Specify the nbits of N in PKA calculation */
238*4882a593Smuzhiyun 	writel(value, &reg->crypto_pka_ctrl);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	/* Flush SHA and RSA */
241*4882a593Smuzhiyun 	rk_setreg(&reg->crypto_ctrl, PKA_HASH_CTRL);
242*4882a593Smuzhiyun 	writel(0xffffffff, &reg->crypto_intsts);
243*4882a593Smuzhiyun 	do {} while (readl(&reg->crypto_ctrl) & PKA_CTRL);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 	/* Clean PKA done interrupt */
246*4882a593Smuzhiyun 	writel(PKA_DONE_INT, &reg->crypto_intsts);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	/* Set m/n/e/c */
249*4882a593Smuzhiyun 	nbits = crypto_algo_nbits(ctx->algo);
250*4882a593Smuzhiyun 	memcpy((void *)&reg->crypto_pka_m, (void *)sign,   BITS2BYTE(nbits));
251*4882a593Smuzhiyun 	memcpy((void *)&reg->crypto_pka_n, (void *)ctx->n, BITS2BYTE(nbits));
252*4882a593Smuzhiyun 	memcpy((void *)&reg->crypto_pka_e, (void *)ctx->e, BITS2BYTE(nbits));
253*4882a593Smuzhiyun 	memcpy((void *)&reg->crypto_pka_c, (void *)ctx->c, BITS2BYTE(nbits));
254*4882a593Smuzhiyun 	do {} while (readl(&reg->crypto_ctrl) & PKA_START);
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	/* Start PKA */
257*4882a593Smuzhiyun 	rk_setreg(&reg->crypto_ctrl, PKA_START);
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	/* Wait PKA done */
260*4882a593Smuzhiyun 	do {} while (readl(&reg->crypto_ctrl) & PKA_START);
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	/* Read hash data, per-data 32-bit */
263*4882a593Smuzhiyun 	for (i = 0; i < BITS2WORD(nbits); i++)
264*4882a593Smuzhiyun 		buf[i] = readl(&reg->crypto_pka_m[i]);
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	return 0;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun #else
rockchip_crypto_rsa_verify(struct udevice * dev,rsa_key * ctx,u8 * sign,u8 * output)269*4882a593Smuzhiyun static int rockchip_crypto_rsa_verify(struct udevice *dev, rsa_key *ctx,
270*4882a593Smuzhiyun 				      u8 *sign, u8 *output)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun 	return -ENOSYS;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun #endif
275*4882a593Smuzhiyun static const struct dm_crypto_ops rockchip_crypto_ops = {
276*4882a593Smuzhiyun 	.capability = rockchip_crypto_capability,
277*4882a593Smuzhiyun 	.sha_init   = rockchip_crypto_sha_init,
278*4882a593Smuzhiyun 	.sha_update = rockchip_crypto_sha_update,
279*4882a593Smuzhiyun 	.sha_final  = rockchip_crypto_sha_final,
280*4882a593Smuzhiyun 	.rsa_verify = rockchip_crypto_rsa_verify,
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /*
284*4882a593Smuzhiyun  * Only use "clocks" to parse crypto clock id and use rockchip_get_clk().
285*4882a593Smuzhiyun  * Because we always add crypto node in U-Boot dts, when kernel dtb enabled :
286*4882a593Smuzhiyun  *
287*4882a593Smuzhiyun  *   1. There is cru phandle mismatch between U-Boot and kernel dtb;
288*4882a593Smuzhiyun  *   2. CONFIG_OF_SPL_REMOVE_PROPS removes clock property;
289*4882a593Smuzhiyun  */
rockchip_crypto_ofdata_to_platdata(struct udevice * dev)290*4882a593Smuzhiyun static int rockchip_crypto_ofdata_to_platdata(struct udevice *dev)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
293*4882a593Smuzhiyun 	int len;
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	if (!dev_read_prop(dev, "clocks", &len)) {
296*4882a593Smuzhiyun 		printf("Crypto-v1: can't find \"clocks\" property\n");
297*4882a593Smuzhiyun 		return -EINVAL;
298*4882a593Smuzhiyun 	}
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	priv->clocks = malloc(len);
301*4882a593Smuzhiyun 	if (!priv->clocks)
302*4882a593Smuzhiyun 		return -ENOMEM;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	priv->nclocks = len / sizeof(u32);
305*4882a593Smuzhiyun 	if (dev_read_u32_array(dev, "clocks", (u32 *)priv->clocks,
306*4882a593Smuzhiyun 			       priv->nclocks)) {
307*4882a593Smuzhiyun 		printf("Crypto-v1: can't read \"clocks\" property\n");
308*4882a593Smuzhiyun 		return -EINVAL;
309*4882a593Smuzhiyun 	}
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	priv->reg = dev_read_addr_ptr(dev);
312*4882a593Smuzhiyun 	priv->frequency = dev_read_u32_default(dev, "clock-frequency",
313*4882a593Smuzhiyun 					       CRYPTO_V1_DEFAULT_RATE);
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	memset(&priv->rsts, 0x00, sizeof(priv->rsts));
316*4882a593Smuzhiyun 	reset_get_bulk(dev, &priv->rsts);
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	return 0;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
rockchip_crypto_probe(struct udevice * dev)321*4882a593Smuzhiyun static int rockchip_crypto_probe(struct udevice *dev)
322*4882a593Smuzhiyun {
323*4882a593Smuzhiyun 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
324*4882a593Smuzhiyun 	u32 *clocks;
325*4882a593Smuzhiyun 	int i, ret;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	ret = rockchip_get_clk(&priv->clk.dev);
328*4882a593Smuzhiyun 	if (ret) {
329*4882a593Smuzhiyun 		printf("Crypto-v1: failed to get clk device, ret=%d\n", ret);
330*4882a593Smuzhiyun 		return ret;
331*4882a593Smuzhiyun 	}
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	clocks = (u32 *)priv->clocks;
334*4882a593Smuzhiyun 	for (i = 1; i < priv->nclocks; i += 2) {
335*4882a593Smuzhiyun 		priv->clk.id = clocks[i];
336*4882a593Smuzhiyun 		ret = clk_set_rate(&priv->clk, priv->frequency);
337*4882a593Smuzhiyun 		if (ret < 0) {
338*4882a593Smuzhiyun 			printf("Crypto-v1: failed to set clk(%ld): ret=%d\n",
339*4882a593Smuzhiyun 			       priv->clk.id, ret);
340*4882a593Smuzhiyun 			return ret;
341*4882a593Smuzhiyun 		}
342*4882a593Smuzhiyun 	}
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 	return 0;
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun static const struct udevice_id rockchip_crypto_ids[] = {
348*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3399-crypto" },
349*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3368-crypto" },
350*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3328-crypto" },
351*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3288-crypto" },
352*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk322x-crypto" },
353*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk312x-crypto" },
354*4882a593Smuzhiyun 	{ }
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun U_BOOT_DRIVER(rockchip_crypto_v1) = {
358*4882a593Smuzhiyun 	.name		= "rockchip_crypto_v1",
359*4882a593Smuzhiyun 	.id		= UCLASS_CRYPTO,
360*4882a593Smuzhiyun 	.of_match	= rockchip_crypto_ids,
361*4882a593Smuzhiyun 	.ops		= &rockchip_crypto_ops,
362*4882a593Smuzhiyun 	.probe		= rockchip_crypto_probe,
363*4882a593Smuzhiyun 	.ofdata_to_platdata = rockchip_crypto_ofdata_to_platdata,
364*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct rockchip_crypto_priv),
365*4882a593Smuzhiyun };
366