Lines Matching full:rng
4 // Based on msm-rng.c and downstream driver
6 #include <crypto/internal/rng.h>
43 struct qcom_rng *rng; member
53 static int qcom_rng_read(struct qcom_rng *rng, u8 *data, unsigned int max) in qcom_rng_read() argument
61 ret = readl_poll_timeout(rng->base + PRNG_STATUS, val, in qcom_rng_read()
67 val = readl_relaxed(rng->base + PRNG_DATA_OUT); in qcom_rng_read()
90 struct qcom_rng *rng = ctx->rng; in qcom_rng_generate() local
93 ret = clk_prepare_enable(rng->clk); in qcom_rng_generate()
97 mutex_lock(&rng->lock); in qcom_rng_generate()
99 ret = qcom_rng_read(rng, dstn, dlen); in qcom_rng_generate()
101 mutex_unlock(&rng->lock); in qcom_rng_generate()
102 clk_disable_unprepare(rng->clk); in qcom_rng_generate()
123 static int qcom_rng_enable(struct qcom_rng *rng) in qcom_rng_enable() argument
128 ret = clk_prepare_enable(rng->clk); in qcom_rng_enable()
133 val = readl_relaxed(rng->base + PRNG_CONFIG); in qcom_rng_enable()
137 val = readl_relaxed(rng->base + PRNG_LFSR_CFG); in qcom_rng_enable()
140 writel(val, rng->base + PRNG_LFSR_CFG); in qcom_rng_enable()
142 val = readl_relaxed(rng->base + PRNG_CONFIG); in qcom_rng_enable()
144 writel(val, rng->base + PRNG_CONFIG); in qcom_rng_enable()
147 clk_disable_unprepare(rng->clk); in qcom_rng_enable()
156 ctx->rng = qcom_rng_dev; in qcom_rng_init()
158 if (!ctx->rng->match_data->skip_init) in qcom_rng_init()
159 return qcom_rng_enable(ctx->rng); in qcom_rng_init()
170 .cra_driver_name = "qcom-rng",
181 struct qcom_rng *rng; in qcom_rng_probe() local
184 rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL); in qcom_rng_probe()
185 if (!rng) in qcom_rng_probe()
188 platform_set_drvdata(pdev, rng); in qcom_rng_probe()
189 mutex_init(&rng->lock); in qcom_rng_probe()
191 rng->base = devm_platform_ioremap_resource(pdev, 0); in qcom_rng_probe()
192 if (IS_ERR(rng->base)) in qcom_rng_probe()
193 return PTR_ERR(rng->base); in qcom_rng_probe()
195 rng->clk = devm_clk_get_optional(&pdev->dev, "core"); in qcom_rng_probe()
196 if (IS_ERR(rng->clk)) in qcom_rng_probe()
197 return PTR_ERR(rng->clk); in qcom_rng_probe()
199 rng->match_data = (struct qcom_rng_match_data *)device_get_match_data(&pdev->dev); in qcom_rng_probe()
201 qcom_rng_dev = rng; in qcom_rng_probe()
204 dev_err(&pdev->dev, "Register crypto rng failed: %d\n", ret); in qcom_rng_probe()
209 if (rng->match_data->hwrng_support) { in qcom_rng_probe()
210 rng->hwrng.name = "qcom_hwrng"; in qcom_rng_probe()
211 rng->hwrng.read = qcom_hwrng_read; in qcom_rng_probe()
212 rng->hwrng.quality = QCOM_TRNG_QUALITY; in qcom_rng_probe()
213 ret = devm_hwrng_register(&pdev->dev, &rng->hwrng); in qcom_rng_probe()