Lines Matching +full:cmd +full:- +full:max +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2008-2012 Freescale Semiconductor, Inc.
79 u32 ctrl, cmd; in imx_rngc_irq_mask_clear() local
82 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_irq_mask_clear()
84 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_irq_mask_clear()
91 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_irq_mask_clear()
92 cmd |= RNGC_CMD_CLR_INT | RNGC_CMD_CLR_ERR; in imx_rngc_irq_mask_clear()
93 writel(cmd, rngc->base + RNGC_COMMAND); in imx_rngc_irq_mask_clear()
100 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_irq_unmask()
102 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_irq_unmask()
107 u32 cmd; in imx_rngc_self_test() local
113 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_self_test()
114 writel(cmd | RNGC_CMD_SELF_TEST, rngc->base + RNGC_COMMAND); in imx_rngc_self_test()
116 ret = wait_for_completion_timeout(&rngc->rng_op_done, in imx_rngc_self_test()
120 return -ETIMEDOUT; in imx_rngc_self_test()
122 return rngc->err_reg ? -EIO : 0; in imx_rngc_self_test()
125 static int imx_rngc_read(struct hwrng *rng, void *data, size_t max, bool wait) in imx_rngc_read() argument
131 err = pm_runtime_resume_and_get(rngc->dev); in imx_rngc_read()
135 while (max >= sizeof(u32)) { in imx_rngc_read()
136 status = readl(rngc->base + RNGC_STATUS); in imx_rngc_read()
144 *(u32 *)data = readl(rngc->base + RNGC_FIFO); in imx_rngc_read()
148 max -= sizeof(u32); in imx_rngc_read()
151 pm_runtime_mark_last_busy(rngc->dev); in imx_rngc_read()
152 pm_runtime_put(rngc->dev); in imx_rngc_read()
154 return retval ? retval : -EIO; in imx_rngc_read()
166 status = readl(rngc->base + RNGC_STATUS); in imx_rngc_irq()
167 rngc->err_reg = readl(rngc->base + RNGC_ERROR); in imx_rngc_irq()
172 complete(&rngc->rng_op_done); in imx_rngc_irq()
180 u32 cmd, ctrl; in imx_rngc_init() local
183 err = pm_runtime_resume_and_get(rngc->dev); in imx_rngc_init()
188 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_init()
189 writel(cmd | RNGC_CMD_CLR_ERR, rngc->base + RNGC_COMMAND); in imx_rngc_init()
196 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_init()
197 writel(cmd | RNGC_CMD_SEED, rngc->base + RNGC_COMMAND); in imx_rngc_init()
199 ret = wait_for_completion_timeout(&rngc->rng_op_done, in imx_rngc_init()
202 err = -ETIMEDOUT; in imx_rngc_init()
206 } while (rngc->err_reg == RNGC_ERROR_STATUS_STAT_ERR); in imx_rngc_init()
208 if (rngc->err_reg) { in imx_rngc_init()
209 err = -EIO; in imx_rngc_init()
215 * after serving 2^20 random 160-bit words in imx_rngc_init()
217 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_init()
219 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_init()
230 pm_runtime_put(rngc->dev); in imx_rngc_init()
239 err = pm_runtime_resume_and_get(rngc->dev); in imx_rngc_cleanup()
242 pm_runtime_put(rngc->dev); in imx_rngc_cleanup()
254 rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL); in imx_rngc_probe()
256 return -ENOMEM; in imx_rngc_probe()
258 rngc->base = devm_platform_ioremap_resource(pdev, 0); in imx_rngc_probe()
259 if (IS_ERR(rngc->base)) in imx_rngc_probe()
260 return PTR_ERR(rngc->base); in imx_rngc_probe()
262 rngc->clk = devm_clk_get(&pdev->dev, NULL); in imx_rngc_probe()
263 if (IS_ERR(rngc->clk)) in imx_rngc_probe()
264 return dev_err_probe(&pdev->dev, PTR_ERR(rngc->clk), "Cannot get rng_clk\n"); in imx_rngc_probe()
270 clk_prepare_enable(rngc->clk); in imx_rngc_probe()
272 ver_id = readl(rngc->base + RNGC_VER_ID); in imx_rngc_probe()
279 clk_disable_unprepare(rngc->clk); in imx_rngc_probe()
280 return -ENODEV; in imx_rngc_probe()
283 init_completion(&rngc->rng_op_done); in imx_rngc_probe()
285 rngc->rng.name = pdev->name; in imx_rngc_probe()
286 rngc->rng.init = imx_rngc_init; in imx_rngc_probe()
287 rngc->rng.read = imx_rngc_read; in imx_rngc_probe()
288 rngc->rng.cleanup = imx_rngc_cleanup; in imx_rngc_probe()
289 rngc->rng.quality = 19; in imx_rngc_probe()
291 rngc->dev = &pdev->dev; in imx_rngc_probe()
296 ret = devm_request_irq(&pdev->dev, in imx_rngc_probe()
297 irq, imx_rngc_irq, 0, pdev->name, (void *)rngc); in imx_rngc_probe()
299 clk_disable_unprepare(rngc->clk); in imx_rngc_probe()
300 return dev_err_probe(&pdev->dev, ret, "Can't get interrupt working.\n"); in imx_rngc_probe()
306 clk_disable_unprepare(rngc->clk); in imx_rngc_probe()
307 return dev_err_probe(&pdev->dev, ret, "self test failed\n"); in imx_rngc_probe()
311 pm_runtime_set_autosuspend_delay(&pdev->dev, RNGC_PM_TIMEOUT); in imx_rngc_probe()
312 pm_runtime_use_autosuspend(&pdev->dev); in imx_rngc_probe()
313 pm_runtime_set_active(&pdev->dev); in imx_rngc_probe()
314 devm_pm_runtime_enable(&pdev->dev); in imx_rngc_probe()
316 ret = devm_hwrng_register(&pdev->dev, &rngc->rng); in imx_rngc_probe()
318 return dev_err_probe(&pdev->dev, ret, "hwrng registration failed\n"); in imx_rngc_probe()
320 dev_info(&pdev->dev, in imx_rngc_probe()
331 clk_disable_unprepare(rngc->clk); in imx_rngc_suspend()
340 clk_prepare_enable(rngc->clk); in imx_rngc_resume()
351 { .compatible = "fsl,imx25-rngb" },
358 .name = KBUILD_MODNAME,