Lines Matching full:trng
3 * TRNG driver for the StarFive JH7110 SoC
24 /* trng register offset */
123 static inline int starfive_trng_wait_idle(struct starfive_trng *trng)
127 return readl_relaxed_poll_timeout(trng->base + STARFIVE_STAT, stat,
133 static inline void starfive_trng_irq_mask_clear(struct starfive_trng *trng)
136 u32 data = readl(trng->base + STARFIVE_ISTAT);
138 writel(data, trng->base + STARFIVE_ISTAT);
141 static int starfive_trng_cmd(struct starfive_trng *trng, u32 cmd, bool wait)
151 reinit_completion(&trng->random_done);
152 spin_lock_irq(&trng->write_lock);
153 writel(cmd, trng->base + STARFIVE_CTRL);
154 spin_unlock_irq(&trng->write_lock);
155 if (!wait_for_completion_timeout(&trng->random_done, usecs_to_jiffies(wait_time)))
159 reinit_completion(&trng->reseed_done);
160 spin_lock_irq(&trng->write_lock);
161 writel(cmd, trng->base + STARFIVE_CTRL);
162 spin_unlock_irq(&trng->write_lock);
163 if (!wait_for_completion_timeout(&trng->reseed_done, usecs_to_jiffies(wait_time)))
175 struct starfive_trng *trng = to_trng(rng);
179 writel(autoage, trng->base + STARFIVE_AUTO_AGE);
180 writel(autoreq, trng->base + STARFIVE_AUTO_RQSTS);
183 starfive_trng_irq_mask_clear(trng);
186 writel(intr, trng->base + STARFIVE_IE);
188 mode = readl(trng->base + STARFIVE_MODE);
190 switch (trng->mode) {
202 writel(mode, trng->base + STARFIVE_MODE);
204 return starfive_trng_cmd(trng, STARFIVE_CTRL_EXEC_RANDRESEED, 1);
210 struct starfive_trng *trng = (struct starfive_trng *)priv;
212 status = readl(trng->base + STARFIVE_ISTAT);
214 writel(STARFIVE_ISTAT_RAND_RDY, trng->base + STARFIVE_ISTAT);
215 complete(&trng->random_done);
219 writel(STARFIVE_ISTAT_SEED_DONE, trng->base + STARFIVE_ISTAT);
220 complete(&trng->reseed_done);
224 writel(STARFIVE_ISTAT_LFSR_LOCKUP, trng->base + STARFIVE_ISTAT);
226 spin_lock(&trng->write_lock);
227 writel(STARFIVE_CTRL_EXEC_RANDRESEED, trng->base + STARFIVE_CTRL);
228 spin_unlock(&trng->write_lock);
236 struct starfive_trng *trng = to_trng(rng);
238 writel(0, trng->base + STARFIVE_CTRL);
240 reset_control_assert(trng->rst);
241 clk_disable_unprepare(trng->hclk);
242 clk_disable_unprepare(trng->ahb);
247 struct starfive_trng *trng = to_trng(rng);
250 pm_runtime_get_sync(trng->dev);
252 if (trng->mode == PRNG_256BIT)
258 ret = starfive_trng_wait_idle(trng);
263 ret = starfive_trng_cmd(trng, STARFIVE_CTRL_GENE_RANDNUM, wait);
267 memcpy_fromio(buf, trng->base + STARFIVE_RAND0, max);
269 pm_runtime_put_sync_autosuspend(trng->dev);
278 struct starfive_trng *trng;
280 trng = devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL);
281 if (!trng)
284 platform_set_drvdata(pdev, trng);
285 trng->dev = &pdev->dev;
287 trng->base = devm_platform_ioremap_resource(pdev, 0);
288 if (IS_ERR(trng->base))
289 return dev_err_probe(&pdev->dev, PTR_ERR(trng->base),
296 init_completion(&trng->random_done);
297 init_completion(&trng->reseed_done);
298 spin_lock_init(&trng->write_lock);
301 (void *)trng);
306 trng->hclk = devm_clk_get(&pdev->dev, "hclk");
307 if (IS_ERR(trng->hclk))
308 return dev_err_probe(&pdev->dev, PTR_ERR(trng->hclk),
311 trng->ahb = devm_clk_get(&pdev->dev, "ahb");
312 if (IS_ERR(trng->ahb))
313 return dev_err_probe(&pdev->dev, PTR_ERR(trng->ahb),
316 trng->rst = devm_reset_control_get_shared(&pdev->dev, NULL);
317 if (IS_ERR(trng->rst))
318 return dev_err_probe(&pdev->dev, PTR_ERR(trng->rst),
321 clk_prepare_enable(trng->hclk);
322 clk_prepare_enable(trng->ahb);
323 reset_control_deassert(trng->rst);
325 trng->rng.name = dev_driver_string(&pdev->dev);
326 trng->rng.init = starfive_trng_init;
327 trng->rng.cleanup = starfive_trng_cleanup;
328 trng->rng.read = starfive_trng_read;
330 trng->mode = PRNG_256BIT;
331 trng->mission = 1;
332 trng->reseed = RANDOM_RESEED;
338 ret = devm_hwrng_register(&pdev->dev, &trng->rng);
342 reset_control_assert(trng->rst);
343 clk_disable_unprepare(trng->ahb);
344 clk_disable_unprepare(trng->hclk);
354 struct starfive_trng *trng = dev_get_drvdata(dev);
356 clk_disable_unprepare(trng->hclk);
357 clk_disable_unprepare(trng->ahb);
364 struct starfive_trng *trng = dev_get_drvdata(dev);
366 clk_prepare_enable(trng->hclk);
367 clk_prepare_enable(trng->ahb);
380 { .compatible = "starfive,jh7110-trng" },
388 .name = "jh7110-trng",