Lines Matching +full:imx25 +full:- +full:rngb

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2008-2012 Freescale Semiconductor, Inc.
79 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_irq_mask_clear()
81 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_irq_mask_clear()
88 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_irq_mask_clear()
90 writel(cmd, rngc->base + RNGC_COMMAND); in imx_rngc_irq_mask_clear()
97 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_irq_unmask()
99 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_irq_unmask()
110 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_self_test()
111 writel(cmd | RNGC_CMD_SELF_TEST, rngc->base + RNGC_COMMAND); in imx_rngc_self_test()
113 ret = wait_for_completion_timeout(&rngc->rng_op_done, RNGC_TIMEOUT); in imx_rngc_self_test()
116 return -ETIMEDOUT; in imx_rngc_self_test()
118 return rngc->err_reg ? -EIO : 0; in imx_rngc_self_test()
129 status = readl(rngc->base + RNGC_STATUS); in imx_rngc_read()
135 /* how many random numbers are in FIFO? [0-16] */ in imx_rngc_read()
141 *(u32 *)data = readl(rngc->base + RNGC_FIFO); in imx_rngc_read()
145 max -= sizeof(u32); in imx_rngc_read()
149 return retval ? retval : -EIO; in imx_rngc_read()
161 status = readl(rngc->base + RNGC_STATUS); in imx_rngc_irq()
162 rngc->err_reg = readl(rngc->base + RNGC_ERROR); in imx_rngc_irq()
167 complete(&rngc->rng_op_done); in imx_rngc_irq()
179 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_init()
180 writel(cmd | RNGC_CMD_CLR_ERR, rngc->base + RNGC_COMMAND); in imx_rngc_init()
187 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_init()
188 writel(cmd | RNGC_CMD_SEED, rngc->base + RNGC_COMMAND); in imx_rngc_init()
190 ret = wait_for_completion_timeout(&rngc->rng_op_done, in imx_rngc_init()
194 ret = -ETIMEDOUT; in imx_rngc_init()
198 } while (rngc->err_reg == RNGC_ERROR_STATUS_STAT_ERR); in imx_rngc_init()
200 if (rngc->err_reg) { in imx_rngc_init()
201 ret = -EIO; in imx_rngc_init()
207 * after serving 2^20 random 160-bit words in imx_rngc_init()
209 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_init()
211 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_init()
240 rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL); in imx_rngc_probe()
242 return -ENOMEM; in imx_rngc_probe()
244 rngc->base = devm_platform_ioremap_resource(pdev, 0); in imx_rngc_probe()
245 if (IS_ERR(rngc->base)) in imx_rngc_probe()
246 return PTR_ERR(rngc->base); in imx_rngc_probe()
248 rngc->clk = devm_clk_get(&pdev->dev, NULL); in imx_rngc_probe()
249 if (IS_ERR(rngc->clk)) { in imx_rngc_probe()
250 dev_err(&pdev->dev, "Can not get rng_clk\n"); in imx_rngc_probe()
251 return PTR_ERR(rngc->clk); in imx_rngc_probe()
256 dev_err(&pdev->dev, "Couldn't get irq %d\n", irq); in imx_rngc_probe()
260 ret = clk_prepare_enable(rngc->clk); in imx_rngc_probe()
264 ver_id = readl(rngc->base + RNGC_VER_ID); in imx_rngc_probe()
267 * This driver supports only RNGC and RNGB. (There's a different in imx_rngc_probe()
271 ret = -ENODEV; in imx_rngc_probe()
275 ret = devm_request_irq(&pdev->dev, in imx_rngc_probe()
276 irq, imx_rngc_irq, 0, pdev->name, (void *)rngc); in imx_rngc_probe()
278 dev_err(rngc->dev, "Can't get interrupt working.\n"); in imx_rngc_probe()
282 init_completion(&rngc->rng_op_done); in imx_rngc_probe()
284 rngc->rng.name = pdev->name; in imx_rngc_probe()
285 rngc->rng.init = imx_rngc_init; in imx_rngc_probe()
286 rngc->rng.read = imx_rngc_read; in imx_rngc_probe()
287 rngc->rng.cleanup = imx_rngc_cleanup; in imx_rngc_probe()
288 rngc->rng.quality = 19; in imx_rngc_probe()
290 rngc->dev = &pdev->dev; in imx_rngc_probe()
298 dev_err(rngc->dev, "self test failed\n"); in imx_rngc_probe()
303 ret = hwrng_register(&rngc->rng); in imx_rngc_probe()
305 dev_err(&pdev->dev, "hwrng registration failed\n"); in imx_rngc_probe()
309 dev_info(&pdev->dev, in imx_rngc_probe()
316 clk_disable_unprepare(rngc->clk); in imx_rngc_probe()
325 hwrng_unregister(&rngc->rng); in imx_rngc_remove()
327 clk_disable_unprepare(rngc->clk); in imx_rngc_remove()
336 clk_disable_unprepare(rngc->clk); in imx_rngc_suspend()
345 clk_prepare_enable(rngc->clk); in imx_rngc_resume()
353 { .compatible = "fsl,imx25-rngb", .data = NULL, },