Lines Matching +full:keystone +full:- +full:rng
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Random Number Generator driver for the Keystone SOC
5 * Copyright (C) 2016 Texas Instruments Incorporated - https://www.ti.com
68 /* Maximum retries to get rng data */
84 struct hwrng rng; member
112 static int ks_sa_rng_init(struct hwrng *rng) in ks_sa_rng_init() argument
115 struct ks_sa_rng *ks_sa_rng = container_of(rng, struct ks_sa_rng, rng); in ks_sa_rng_init()
116 unsigned long clk_rate = clk_get_rate(ks_sa_rng->clk); in ks_sa_rng_init()
118 /* Enable RNG module */ in ks_sa_rng_init()
119 regmap_write_bits(ks_sa_rng->regmap_cfg, SA_CMD_STATUS_OFS, in ks_sa_rng_init()
123 /* Configure RNG module */ in ks_sa_rng_init()
124 writel(0, &ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
126 writel(value, &ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
135 writel(value, &ks_sa_rng->reg_rng->config); in ks_sa_rng_init()
138 writel(0, &ks_sa_rng->reg_rng->intmask); in ks_sa_rng_init()
140 /* Enable RNG */ in ks_sa_rng_init()
141 value = readl(&ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
143 writel(value, &ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
145 ks_sa_rng->refill_delay_ns = refill_delay_ns(clk_rate); in ks_sa_rng_init()
146 ks_sa_rng->ready_ts = ktime_get_ns() + in ks_sa_rng_init()
152 static void ks_sa_rng_cleanup(struct hwrng *rng) in ks_sa_rng_cleanup() argument
154 struct ks_sa_rng *ks_sa_rng = container_of(rng, struct ks_sa_rng, rng); in ks_sa_rng_cleanup()
156 /* Disable RNG */ in ks_sa_rng_cleanup()
157 writel(0, &ks_sa_rng->reg_rng->control); in ks_sa_rng_cleanup()
158 regmap_write_bits(ks_sa_rng->regmap_cfg, SA_CMD_STATUS_OFS, in ks_sa_rng_cleanup()
162 static int ks_sa_rng_data_read(struct hwrng *rng, u32 *data) in ks_sa_rng_data_read() argument
164 struct ks_sa_rng *ks_sa_rng = container_of(rng, struct ks_sa_rng, rng); in ks_sa_rng_data_read()
167 data[0] = readl(&ks_sa_rng->reg_rng->output_l); in ks_sa_rng_data_read()
168 data[1] = readl(&ks_sa_rng->reg_rng->output_h); in ks_sa_rng_data_read()
170 writel(TRNG_INTACK_REG_READY, &ks_sa_rng->reg_rng->intack); in ks_sa_rng_data_read()
171 ks_sa_rng->ready_ts = ktime_get_ns() + ks_sa_rng->refill_delay_ns; in ks_sa_rng_data_read()
176 static int ks_sa_rng_data_present(struct hwrng *rng, int wait) in ks_sa_rng_data_present() argument
178 struct ks_sa_rng *ks_sa_rng = container_of(rng, struct ks_sa_rng, rng); in ks_sa_rng_data_present()
184 if (wait && now < ks_sa_rng->ready_ts) { in ks_sa_rng_data_present()
187 DIV_ROUND_UP((u32)(ks_sa_rng->ready_ts - now), 1000); in ks_sa_rng_data_present()
193 ready = readl(&ks_sa_rng->reg_rng->status); in ks_sa_rng_data_present()
208 struct device *dev = &pdev->dev; in ks_sa_rng_probe()
213 return -ENOMEM; in ks_sa_rng_probe()
215 ks_sa_rng->rng = (struct hwrng) { in ks_sa_rng_probe()
223 ks_sa_rng->reg_rng = devm_platform_ioremap_resource(pdev, 0); in ks_sa_rng_probe()
224 if (IS_ERR(ks_sa_rng->reg_rng)) in ks_sa_rng_probe()
225 return PTR_ERR(ks_sa_rng->reg_rng); in ks_sa_rng_probe()
227 ks_sa_rng->regmap_cfg = in ks_sa_rng_probe()
228 syscon_regmap_lookup_by_phandle(dev->of_node, in ks_sa_rng_probe()
229 "ti,syscon-sa-cfg"); in ks_sa_rng_probe()
231 if (IS_ERR(ks_sa_rng->regmap_cfg)) in ks_sa_rng_probe()
232 return dev_err_probe(dev, -EINVAL, "syscon_node_to_regmap failed\n"); in ks_sa_rng_probe()
238 return dev_err_probe(dev, ret, "Failed to enable SA power-domain\n"); in ks_sa_rng_probe()
241 return devm_hwrng_register(&pdev->dev, &ks_sa_rng->rng); in ks_sa_rng_probe()
246 pm_runtime_put_sync(&pdev->dev); in ks_sa_rng_remove()
247 pm_runtime_disable(&pdev->dev); in ks_sa_rng_remove()
252 .compatible = "ti,keystone-rng",
260 .name = "ks-sa-rng",
269 MODULE_DESCRIPTION("Keystone NETCP SA H/W Random Number Generator driver");