Lines Matching +full:rockchip +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0
3 * rockchip-rng.c True Random Number Generator driver for Rockchip RK3568 SoC
5 * Copyright (c) 2018, Fuzhou Rockchip Electronics Co., Ltd.
8 * Lin Jinhan <troy.lin@rock-chips.com>
31 * of ~900 (~87.5% of FIPS 140-2 successes).
35 /* TRNG registers from RK3568 TRM-Part2, section 5.4.1 */
62 writel((mask << 16) | val, rng->base + TRNG_RNG_CTL); in rk_rng_write_ctl()
71 ret = clk_bulk_prepare_enable(rk_rng->clk_num, rk_rng->clk_bulks); in rk_rng_init()
73 dev_err((struct device *) rk_rng->rng.priv, in rk_rng_init()
79 writel(RK_RNG_SAMPLE_CNT, rk_rng->base + TRNG_RNG_SAMPLE_CNT); in rk_rng_init()
98 clk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks); in rk_rng_cleanup()
108 ret = pm_runtime_resume_and_get((struct device *) rk_rng->rng.priv); in rk_rng_read()
115 ret = readl_poll_timeout(rk_rng->base + TRNG_RNG_CTL, reg, in rk_rng_read()
123 memcpy_fromio(buf, rk_rng->base + TRNG_RNG_DOUT, to_read); in rk_rng_read()
125 pm_runtime_mark_last_busy((struct device *) rk_rng->rng.priv); in rk_rng_read()
126 pm_runtime_put_sync_autosuspend((struct device *) rk_rng->rng.priv); in rk_rng_read()
133 struct device *dev = &pdev->dev; in rk_rng_probe()
140 return -ENOMEM; in rk_rng_probe()
142 rk_rng->base = devm_platform_ioremap_resource(pdev, 0); in rk_rng_probe()
143 if (IS_ERR(rk_rng->base)) in rk_rng_probe()
144 return PTR_ERR(rk_rng->base); in rk_rng_probe()
146 rk_rng->clk_num = devm_clk_bulk_get_all(dev, &rk_rng->clk_bulks); in rk_rng_probe()
147 if (rk_rng->clk_num < 0) in rk_rng_probe()
148 return dev_err_probe(dev, rk_rng->clk_num, in rk_rng_probe()
151 rst = devm_reset_control_array_get_exclusive(&pdev->dev); in rk_rng_probe()
161 rk_rng->rng.name = dev_driver_string(dev); in rk_rng_probe()
163 rk_rng->rng.init = rk_rng_init; in rk_rng_probe()
164 rk_rng->rng.cleanup = rk_rng_cleanup; in rk_rng_probe()
166 rk_rng->rng.read = rk_rng_read; in rk_rng_probe()
167 rk_rng->rng.priv = (unsigned long) dev; in rk_rng_probe()
168 rk_rng->rng.quality = 900; in rk_rng_probe()
174 return dev_err_probe(&pdev->dev, ret, "Runtime pm activation failed.\n"); in rk_rng_probe()
176 ret = devm_hwrng_register(dev, &rk_rng->rng); in rk_rng_probe()
178 return dev_err_probe(&pdev->dev, ret, "Failed to register Rockchip hwrng\n"); in rk_rng_probe()
183 static int __maybe_unused rk_rng_runtime_suspend(struct device *dev) in rk_rng_runtime_suspend()
187 rk_rng_cleanup(&rk_rng->rng); in rk_rng_runtime_suspend()
192 static int __maybe_unused rk_rng_runtime_resume(struct device *dev) in rk_rng_runtime_resume()
196 return rk_rng_init(&rk_rng->rng); in rk_rng_runtime_resume()
207 { .compatible = "rockchip,rk3568-rng", },
215 .name = "rockchip-rng",
224 MODULE_DESCRIPTION("Rockchip RK3568 True Random Number Generator driver");
225 MODULE_AUTHOR("Lin Jinhan <troy.lin@rock-chips.com>");