Lines Matching +full:mt7623 +full:- +full:rng
1 // SPDX-License-Identifier: GPL-2.0-or-later
33 #define to_mtk_rng(p) container_of(p, struct mtk_rng, rng)
38 struct hwrng rng;
42 static int mtk_rng_init(struct hwrng *rng)
44 struct mtk_rng *priv = to_mtk_rng(rng);
48 err = clk_prepare_enable(priv->clk);
52 val = readl(priv->base + RNG_CTRL);
54 writel(val, priv->base + RNG_CTRL);
59 static void mtk_rng_cleanup(struct hwrng *rng)
61 struct mtk_rng *priv = to_mtk_rng(rng);
64 val = readl(priv->base + RNG_CTRL);
66 writel(val, priv->base + RNG_CTRL);
68 clk_disable_unprepare(priv->clk);
71 static bool mtk_rng_wait_ready(struct hwrng *rng, bool wait)
73 struct mtk_rng *priv = to_mtk_rng(rng);
76 ready = readl(priv->base + RNG_CTRL) & RNG_READY;
78 readl_poll_timeout_atomic(priv->base + RNG_CTRL, ready,
84 static int mtk_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
86 struct mtk_rng *priv = to_mtk_rng(rng);
89 pm_runtime_get_sync(priv->dev);
92 if (!mtk_rng_wait_ready(rng, wait))
95 *(u32 *)buf = readl(priv->base + RNG_DATA);
98 max -= sizeof(u32);
101 pm_runtime_put_sync_autosuspend(priv->dev);
103 return retval || !wait ? retval : -EIO;
111 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
113 return -ENOMEM;
115 priv->dev = &pdev->dev;
116 priv->rng.name = pdev->name;
118 priv->rng.init = mtk_rng_init;
119 priv->rng.cleanup = mtk_rng_cleanup;
121 priv->rng.read = mtk_rng_read;
122 priv->rng.quality = 900;
124 priv->clk = devm_clk_get(&pdev->dev, "rng");
125 if (IS_ERR(priv->clk)) {
126 ret = PTR_ERR(priv->clk);
127 dev_err(&pdev->dev, "no clock for device: %d\n", ret);
131 priv->base = devm_platform_ioremap_resource(pdev, 0);
132 if (IS_ERR(priv->base))
133 return PTR_ERR(priv->base);
135 ret = devm_hwrng_register(&pdev->dev, &priv->rng);
137 dev_err(&pdev->dev, "failed to register rng device: %d\n",
142 dev_set_drvdata(&pdev->dev, priv);
143 pm_runtime_set_autosuspend_delay(&pdev->dev, RNG_AUTOSUSPEND_TIMEOUT);
144 pm_runtime_use_autosuspend(&pdev->dev);
145 ret = devm_pm_runtime_enable(&pdev->dev);
149 dev_info(&pdev->dev, "registered RNG driver\n");
159 mtk_rng_cleanup(&priv->rng);
168 return mtk_rng_init(&priv->rng);
184 { .compatible = "mediatek,mt7986-rng" },
185 { .compatible = "mediatek,mt7623-rng" },