Lines Matching defs:rngc
74 static inline void imx_rngc_irq_mask_clear(struct imx_rngc *rngc)
79 ctrl = readl(rngc->base + RNGC_CONTROL);
81 writel(ctrl, rngc->base + RNGC_CONTROL);
88 cmd = readl(rngc->base + RNGC_COMMAND);
90 writel(cmd, rngc->base + RNGC_COMMAND);
93 static inline void imx_rngc_irq_unmask(struct imx_rngc *rngc)
97 ctrl = readl(rngc->base + RNGC_CONTROL);
99 writel(ctrl, rngc->base + RNGC_CONTROL);
102 static int imx_rngc_self_test(struct imx_rngc *rngc)
107 imx_rngc_irq_unmask(rngc);
110 cmd = readl(rngc->base + RNGC_COMMAND);
111 writel(cmd | RNGC_CMD_SELF_TEST, rngc->base + RNGC_COMMAND);
113 ret = wait_for_completion_timeout(&rngc->rng_op_done, msecs_to_jiffies(RNGC_TIMEOUT));
114 imx_rngc_irq_mask_clear(rngc);
118 return rngc->err_reg ? -EIO : 0;
123 struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng);
129 status = readl(rngc->base + RNGC_STATUS);
141 *(u32 *)data = readl(rngc->base + RNGC_FIFO);
154 struct imx_rngc *rngc = (struct imx_rngc *)priv;
161 status = readl(rngc->base + RNGC_STATUS);
162 rngc->err_reg = readl(rngc->base + RNGC_ERROR);
164 imx_rngc_irq_mask_clear(rngc);
167 complete(&rngc->rng_op_done);
174 struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng);
179 cmd = readl(rngc->base + RNGC_COMMAND);
180 writel(cmd | RNGC_CMD_CLR_ERR, rngc->base + RNGC_COMMAND);
182 imx_rngc_irq_unmask(rngc);
187 cmd = readl(rngc->base + RNGC_COMMAND);
188 writel(cmd | RNGC_CMD_SEED, rngc->base + RNGC_COMMAND);
190 ret = wait_for_completion_timeout(&rngc->rng_op_done, msecs_to_jiffies(RNGC_TIMEOUT));
196 } while (rngc->err_reg == RNGC_ERROR_STATUS_STAT_ERR);
198 if (rngc->err_reg) {
204 * enable automatic seeding, the rngc creates a new seed automatically
207 ctrl = readl(rngc->base + RNGC_CONTROL);
209 writel(ctrl, rngc->base + RNGC_CONTROL);
219 imx_rngc_irq_mask_clear(rngc);
225 struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng);
227 imx_rngc_irq_mask_clear(rngc);
232 struct imx_rngc *rngc;
238 rngc = devm_kzalloc(&pdev->dev, sizeof(*rngc), GFP_KERNEL);
239 if (!rngc)
242 rngc->base = devm_platform_ioremap_resource(pdev, 0);
243 if (IS_ERR(rngc->base))
244 return PTR_ERR(rngc->base);
246 rngc->clk = devm_clk_get(&pdev->dev, NULL);
247 if (IS_ERR(rngc->clk)) {
249 return PTR_ERR(rngc->clk);
258 ret = clk_prepare_enable(rngc->clk);
262 ver_id = readl(rngc->base + RNGC_VER_ID);
273 init_completion(&rngc->rng_op_done);
275 rngc->rng.name = pdev->name;
276 rngc->rng.init = imx_rngc_init;
277 rngc->rng.read = imx_rngc_read;
278 rngc->rng.cleanup = imx_rngc_cleanup;
279 rngc->rng.quality = 19;
281 rngc->dev = &pdev->dev;
282 platform_set_drvdata(pdev, rngc);
284 imx_rngc_irq_mask_clear(rngc);
287 irq, imx_rngc_irq, 0, pdev->name, (void *)rngc);
289 dev_err(rngc->dev, "Can't get interrupt working.\n");
294 ret = imx_rngc_self_test(rngc);
296 dev_err(rngc->dev, "self test failed\n");
301 ret = hwrng_register(&rngc->rng);
314 clk_disable_unprepare(rngc->clk);
321 struct imx_rngc *rngc = platform_get_drvdata(pdev);
323 hwrng_unregister(&rngc->rng);
325 clk_disable_unprepare(rngc->clk);
332 struct imx_rngc *rngc = dev_get_drvdata(dev);
334 clk_disable_unprepare(rngc->clk);
341 struct imx_rngc *rngc = dev_get_drvdata(dev);
343 clk_prepare_enable(rngc->clk);