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