Lines Matching refs:rk_rng
118 struct rk_rng { struct
127 static void rk_rng_writel(struct rk_rng *rng, u32 val, u32 offset) in rk_rng_writel() argument
132 static u32 rk_rng_readl(struct rk_rng *rng, u32 offset) in rk_rng_readl()
140 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in rk_rng_init() local
142 dev_dbg(rk_rng->dev, "clk_bulk_prepare_enable.\n"); in rk_rng_init()
144 ret = clk_bulk_prepare_enable(rk_rng->clk_num, rk_rng->clk_bulks); in rk_rng_init()
146 dev_err(rk_rng->dev, "failed to enable clks %d\n", ret); in rk_rng_init()
155 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in rk_rng_cleanup() local
157 dev_dbg(rk_rng->dev, "clk_bulk_disable_unprepare.\n"); in rk_rng_cleanup()
158 clk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks); in rk_rng_cleanup()
165 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in rk_rng_read() local
167 if (!rk_rng->soc_data->rk_rng_read) in rk_rng_read()
170 ret = pm_runtime_get_sync(rk_rng->dev); in rk_rng_read()
172 pm_runtime_put_noidle(rk_rng->dev); in rk_rng_read()
178 read_len = rk_rng->soc_data->rk_rng_read(rng, buf + ret, in rk_rng_read()
187 pm_runtime_mark_last_busy(rk_rng->dev); in rk_rng_read()
188 pm_runtime_put_sync_autosuspend(rk_rng->dev); in rk_rng_read()
193 static void rk_rng_read_regs(struct rk_rng *rng, u32 offset, void *buf, in rk_rng_read_regs()
206 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in crypto_v1_read() local
210 rk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_TRNG_CTRL); in crypto_v1_read()
214 rk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_CTRL); in crypto_v1_read()
220 rk_rng, CRYPTO_V1_CTRL); in crypto_v1_read()
227 rk_rng_read_regs(rk_rng, CRYPTO_V1_TRNG_DOUT_0, buf, ret); in crypto_v1_read()
231 rk_rng_writel(rk_rng, HIWORD_UPDATE(0, CRYPTO_V1_RNG_START, 0), in crypto_v1_read()
241 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in crypto_v2_read() local
244 rk_rng_writel(rk_rng, 100, CRYPTO_V2_RNG_SAMPLE_CNT); in crypto_v2_read()
251 rk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0), in crypto_v2_read()
258 rk_rng, CRYPTO_V2_RNG_CTL); in crypto_v2_read()
264 rk_rng_read_regs(rk_rng, CRYPTO_V2_RNG_DOUT_0, buf, ret); in crypto_v2_read()
268 rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), CRYPTO_V2_RNG_CTL); in crypto_v2_read()
278 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in trng_v1_init() local
280 version = rk_rng_readl(rk_rng, TRNG_V1_VERSION); in trng_v1_init()
282 dev_err(rk_rng->dev, in trng_v1_init()
289 status = rk_rng_readl(rk_rng, TRNG_V1_STAT); in trng_v1_init()
306 rk_rng, TRNG_V1_STAT); in trng_v1_init()
310 reg_ctrl = rk_rng_readl(rk_rng, TRNG_V1_ISTAT); in trng_v1_init()
311 rk_rng_writel(rk_rng, reg_ctrl, TRNG_V1_ISTAT); in trng_v1_init()
314 rk_rng_writel(rk_rng, auto_reseed_cnt, TRNG_V1_AUTO_RQSTS); in trng_v1_init()
326 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in trng_v1_read() local
329 reg_ctrl = rk_rng_readl(rk_rng, TRNG_V1_ISTAT); in trng_v1_read()
330 rk_rng_writel(rk_rng, reg_ctrl, TRNG_V1_ISTAT); in trng_v1_read()
333 rk_rng_writel(rk_rng, TRNG_V1_MODE_256_BIT, TRNG_V1_MODE); in trng_v1_read()
334 rk_rng_writel(rk_rng, TRNG_V1_CTRL_RAND, TRNG_V1_CTRL); in trng_v1_read()
341 reg_ctrl = rk_rng_readl(rk_rng, TRNG_V1_ISTAT); in trng_v1_read()
348 rk_rng, TRNG_V1_ISTAT); in trng_v1_read()
355 rk_rng_read_regs(rk_rng, TRNG_V1_RAND0, buf, ret); in trng_v1_read()
358 rk_rng_writel(rk_rng, reg_ctrl, TRNG_V1_ISTAT); in trng_v1_read()
361 rk_rng_writel(rk_rng, TRNG_V1_CTRL_NOP, TRNG_V1_CTRL); in trng_v1_read()
368 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in rkrng_init() local
371 rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL); in rkrng_init()
373 reg = rk_rng_readl(rk_rng, RKRNG_STATE); in rkrng_init()
374 rk_rng_writel(rk_rng, reg, RKRNG_STATE); in rkrng_init()
381 struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng); in rkrng_read() local
387 rk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0), RKRNG_CTRL); in rkrng_read()
389 ret = readl_poll_timeout(rk_rng->mem + RKRNG_STATE, reg_ctrl, in rkrng_read()
397 rk_rng_writel(rk_rng, reg_ctrl, RKRNG_STATE); in rkrng_read()
401 rk_rng_read_regs(rk_rng, RKRNG_DRNG_DATA_0, buf, ret); in rkrng_read()
405 rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL); in rkrng_read()
461 struct rk_rng *rk_rng; in rk_rng_probe() local
467 rk_rng = devm_kzalloc(&pdev->dev, sizeof(struct rk_rng), GFP_KERNEL); in rk_rng_probe()
468 if (!rk_rng) in rk_rng_probe()
472 rk_rng->soc_data = (struct rk_rng_soc_data *)match->data; in rk_rng_probe()
474 rk_rng->dev = &pdev->dev; in rk_rng_probe()
475 rk_rng->rng.name = "rockchip"; in rk_rng_probe()
477 rk_rng->rng.init = rk_rng_init; in rk_rng_probe()
478 rk_rng->rng.cleanup = rk_rng_cleanup, in rk_rng_probe()
480 rk_rng->rng.read = rk_rng_read; in rk_rng_probe()
481 rk_rng->rng.quality = 999; in rk_rng_probe()
483 rk_rng->mem = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, &map_size); in rk_rng_probe()
484 if (IS_ERR(rk_rng->mem)) in rk_rng_probe()
485 return PTR_ERR(rk_rng->mem); in rk_rng_probe()
498 if (map_size > rk_rng->soc_data->default_offset) in rk_rng_probe()
499 rk_rng->mem += rk_rng->soc_data->default_offset; in rk_rng_probe()
501 rk_rng->clk_num = devm_clk_bulk_get_all(&pdev->dev, &rk_rng->clk_bulks); in rk_rng_probe()
502 if (rk_rng->clk_num < 0) { in rk_rng_probe()
507 platform_set_drvdata(pdev, rk_rng); in rk_rng_probe()
514 ret = devm_hwrng_register(&pdev->dev, &rk_rng->rng); in rk_rng_probe()
521 if (rk_rng->soc_data->rk_rng_init) { in rk_rng_probe()
522 pm_runtime_get_sync(rk_rng->dev); in rk_rng_probe()
524 ret = rk_rng->soc_data->rk_rng_init(&rk_rng->rng); in rk_rng_probe()
526 pm_runtime_mark_last_busy(rk_rng->dev); in rk_rng_probe()
527 pm_runtime_put_sync_autosuspend(rk_rng->dev); in rk_rng_probe()
536 struct rk_rng *rk_rng = dev_get_drvdata(dev); in rk_rng_runtime_suspend() local
538 rk_rng_cleanup(&rk_rng->rng); in rk_rng_runtime_suspend()
545 struct rk_rng *rk_rng = dev_get_drvdata(dev); in rk_rng_runtime_resume() local
547 return rk_rng_init(&rk_rng->rng); in rk_rng_runtime_resume()