Lines Matching +full:syscon +full:- +full:sa +full:- +full:cfg

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2016 Texas Instruments Incorporated - https://www.ti.com
20 #include <linux/mfd/syscon.h>
28 /* TRNG enable control in SA System module*/
116 struct device *dev = (struct device *)rng->priv; in ks_sa_rng_init()
118 unsigned long clk_rate = clk_get_rate(ks_sa_rng->clk); in ks_sa_rng_init()
121 regmap_write_bits(ks_sa_rng->regmap_cfg, SA_CMD_STATUS_OFS, in ks_sa_rng_init()
126 writel(0, &ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
128 writel(value, &ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
137 writel(value, &ks_sa_rng->reg_rng->config); in ks_sa_rng_init()
140 writel(0, &ks_sa_rng->reg_rng->intmask); in ks_sa_rng_init()
143 value = readl(&ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
145 writel(value, &ks_sa_rng->reg_rng->control); in ks_sa_rng_init()
147 ks_sa_rng->refill_delay_ns = refill_delay_ns(clk_rate); in ks_sa_rng_init()
148 ks_sa_rng->ready_ts = ktime_get_ns() + in ks_sa_rng_init()
156 struct device *dev = (struct device *)rng->priv; in ks_sa_rng_cleanup()
160 writel(0, &ks_sa_rng->reg_rng->control); in ks_sa_rng_cleanup()
161 regmap_write_bits(ks_sa_rng->regmap_cfg, SA_CMD_STATUS_OFS, in ks_sa_rng_cleanup()
167 struct device *dev = (struct device *)rng->priv; in ks_sa_rng_data_read()
171 data[0] = readl(&ks_sa_rng->reg_rng->output_l); in ks_sa_rng_data_read()
172 data[1] = readl(&ks_sa_rng->reg_rng->output_h); in ks_sa_rng_data_read()
174 writel(TRNG_INTACK_REG_READY, &ks_sa_rng->reg_rng->intack); in ks_sa_rng_data_read()
175 ks_sa_rng->ready_ts = ktime_get_ns() + ks_sa_rng->refill_delay_ns; in ks_sa_rng_data_read()
182 struct device *dev = (struct device *)rng->priv; in ks_sa_rng_data_present()
189 if (wait && now < ks_sa_rng->ready_ts) { in ks_sa_rng_data_present()
192 DIV_ROUND_UP((u32)(ks_sa_rng->ready_ts - now), 1000); in ks_sa_rng_data_present()
198 ready = readl(&ks_sa_rng->reg_rng->status); in ks_sa_rng_data_present()
213 struct device *dev = &pdev->dev; in ks_sa_rng_probe()
218 return -ENOMEM; in ks_sa_rng_probe()
220 ks_sa_rng->dev = dev; in ks_sa_rng_probe()
221 ks_sa_rng->rng = (struct hwrng) { in ks_sa_rng_probe()
228 ks_sa_rng->rng.priv = (unsigned long)dev; in ks_sa_rng_probe()
230 ks_sa_rng->reg_rng = devm_platform_ioremap_resource(pdev, 0); in ks_sa_rng_probe()
231 if (IS_ERR(ks_sa_rng->reg_rng)) in ks_sa_rng_probe()
232 return PTR_ERR(ks_sa_rng->reg_rng); in ks_sa_rng_probe()
234 ks_sa_rng->regmap_cfg = in ks_sa_rng_probe()
235 syscon_regmap_lookup_by_phandle(dev->of_node, in ks_sa_rng_probe()
236 "ti,syscon-sa-cfg"); in ks_sa_rng_probe()
238 if (IS_ERR(ks_sa_rng->regmap_cfg)) { in ks_sa_rng_probe()
240 return -EINVAL; in ks_sa_rng_probe()
246 dev_err(dev, "Failed to enable SA power-domain\n"); in ks_sa_rng_probe()
253 return devm_hwrng_register(&pdev->dev, &ks_sa_rng->rng); in ks_sa_rng_probe()
258 pm_runtime_put_sync(&pdev->dev); in ks_sa_rng_remove()
259 pm_runtime_disable(&pdev->dev); in ks_sa_rng_remove()
266 .compatible = "ti,keystone-rng",
274 .name = "ks-sa-rng",
283 MODULE_DESCRIPTION("Keystone NETCP SA H/W Random Number Generator driver");