mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-15 19:55:32 +00:00
hwrng: st - keep clock enabled while hwrng is registered
[ Upstream commit501e197a02
] The st-rng driver uses devres to register itself with the hwrng core, the driver will be unregistered from hwrng when its device goes out of scope. This happens after the driver's remove function is called. However, st-rng's clock is disabled in the remove function. There's a short timeframe where st-rng is still registered with the hwrng core although its clock is disabled. I suppose the clock must be active to access the hardware and serve requests from the hwrng core. Switch to devm_clk_get_enabled and let devres disable the clock and unregister the hwrng. This avoids the race condition. Fixes:3e75241be8
("hwrng: drivers - Use device-managed registration API") Signed-off-by: Martin Kaiser <martin@kaiser.cx> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
28ff9acf1a
commit
43f6f42e82
1 changed files with 1 additions and 20 deletions
|
@ -42,7 +42,6 @@
|
|||
|
||||
struct st_rng_data {
|
||||
void __iomem *base;
|
||||
struct clk *clk;
|
||||
struct hwrng ops;
|
||||
};
|
||||
|
||||
|
@ -85,26 +84,18 @@ static int st_rng_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk = devm_clk_get(&pdev->dev, NULL);
|
||||
clk = devm_clk_get_enabled(&pdev->dev, NULL);
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ddata->ops.priv = (unsigned long)ddata;
|
||||
ddata->ops.read = st_rng_read;
|
||||
ddata->ops.name = pdev->name;
|
||||
ddata->base = base;
|
||||
ddata->clk = clk;
|
||||
|
||||
dev_set_drvdata(&pdev->dev, ddata);
|
||||
|
||||
ret = devm_hwrng_register(&pdev->dev, &ddata->ops);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to register HW RNG\n");
|
||||
clk_disable_unprepare(clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -113,15 +104,6 @@ static int st_rng_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int st_rng_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct st_rng_data *ddata = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
clk_disable_unprepare(ddata->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id st_rng_match[] __maybe_unused = {
|
||||
{ .compatible = "st,rng" },
|
||||
{},
|
||||
|
@ -134,7 +116,6 @@ static struct platform_driver st_rng_driver = {
|
|||
.of_match_table = of_match_ptr(st_rng_match),
|
||||
},
|
||||
.probe = st_rng_probe,
|
||||
.remove = st_rng_remove
|
||||
};
|
||||
|
||||
module_platform_driver(st_rng_driver);
|
||||
|
|
Loading…
Add table
Reference in a new issue