Lines Matching refs:rngc
74 static inline void imx_rngc_irq_mask_clear(struct imx_rngc *rngc) in imx_rngc_irq_mask_clear() argument
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()
93 static inline void imx_rngc_irq_unmask(struct imx_rngc *rngc) in imx_rngc_irq_unmask() argument
97 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_irq_unmask()
99 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_irq_unmask()
102 static int imx_rngc_self_test(struct imx_rngc *rngc) in imx_rngc_self_test() argument
107 imx_rngc_irq_unmask(rngc); in imx_rngc_self_test()
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, msecs_to_jiffies(RNGC_TIMEOUT)); in imx_rngc_self_test()
114 imx_rngc_irq_mask_clear(rngc); in imx_rngc_self_test()
118 return rngc->err_reg ? -EIO : 0; in imx_rngc_self_test()
123 struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng); in imx_rngc_read() local
128 status = readl(rngc->base + RNGC_STATUS); in imx_rngc_read()
136 *(u32 *)data = readl(rngc->base + RNGC_FIFO); in imx_rngc_read()
149 struct imx_rngc *rngc = (struct imx_rngc *)priv; in imx_rngc_irq() local
156 status = readl(rngc->base + RNGC_STATUS); in imx_rngc_irq()
157 rngc->err_reg = readl(rngc->base + RNGC_ERROR); in imx_rngc_irq()
159 imx_rngc_irq_mask_clear(rngc); in imx_rngc_irq()
162 complete(&rngc->rng_op_done); in imx_rngc_irq()
169 struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng); in imx_rngc_init() local
174 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_init()
175 writel(cmd | RNGC_CMD_CLR_ERR, rngc->base + RNGC_COMMAND); in imx_rngc_init()
177 imx_rngc_irq_unmask(rngc); in imx_rngc_init()
182 cmd = readl(rngc->base + RNGC_COMMAND); in imx_rngc_init()
183 writel(cmd | RNGC_CMD_SEED, rngc->base + RNGC_COMMAND); in imx_rngc_init()
185 ret = wait_for_completion_timeout(&rngc->rng_op_done, msecs_to_jiffies(RNGC_TIMEOUT)); in imx_rngc_init()
191 } while (rngc->err_reg == RNGC_ERROR_STATUS_STAT_ERR); in imx_rngc_init()
193 if (rngc->err_reg) { in imx_rngc_init()
202 ctrl = readl(rngc->base + RNGC_CONTROL); in imx_rngc_init()
204 writel(ctrl, rngc->base + RNGC_CONTROL); in imx_rngc_init()
214 imx_rngc_irq_mask_clear(rngc); in imx_rngc_init()
220 struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng); in imx_rngc_cleanup() local
222 imx_rngc_irq_mask_clear(rngc); in imx_rngc_cleanup()
227 struct imx_rngc *rngc; in imx_rngc_probe() local
233 rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL); in imx_rngc_probe()
234 if (!rngc) in imx_rngc_probe()
237 rngc->base = devm_platform_ioremap_resource(pdev, 0); in imx_rngc_probe()
238 if (IS_ERR(rngc->base)) in imx_rngc_probe()
239 return PTR_ERR(rngc->base); in imx_rngc_probe()
241 rngc->clk = devm_clk_get_enabled(&pdev->dev, NULL); in imx_rngc_probe()
242 if (IS_ERR(rngc->clk)) in imx_rngc_probe()
243 return dev_err_probe(&pdev->dev, PTR_ERR(rngc->clk), "Cannot get rng_clk\n"); in imx_rngc_probe()
249 ver_id = readl(rngc->base + RNGC_VER_ID); in imx_rngc_probe()
258 init_completion(&rngc->rng_op_done); in imx_rngc_probe()
260 rngc->rng.name = pdev->name; in imx_rngc_probe()
261 rngc->rng.init = imx_rngc_init; in imx_rngc_probe()
262 rngc->rng.read = imx_rngc_read; in imx_rngc_probe()
263 rngc->rng.cleanup = imx_rngc_cleanup; in imx_rngc_probe()
264 rngc->rng.quality = 19; in imx_rngc_probe()
266 rngc->dev = &pdev->dev; in imx_rngc_probe()
267 platform_set_drvdata(pdev, rngc); in imx_rngc_probe()
269 imx_rngc_irq_mask_clear(rngc); in imx_rngc_probe()
272 irq, imx_rngc_irq, 0, pdev->name, (void *)rngc); in imx_rngc_probe()
277 ret = imx_rngc_self_test(rngc); in imx_rngc_probe()
282 ret = devm_hwrng_register(&pdev->dev, &rngc->rng); in imx_rngc_probe()
295 struct imx_rngc *rngc = dev_get_drvdata(dev); in imx_rngc_suspend() local
297 clk_disable_unprepare(rngc->clk); in imx_rngc_suspend()
304 struct imx_rngc *rngc = dev_get_drvdata(dev); in imx_rngc_resume() local
306 clk_prepare_enable(rngc->clk); in imx_rngc_resume()