summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2019-09-15 00:02:58 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2019-10-04 18:06:12 +0300
commitb8d665aed401b51297d8f2e9fbf2774e94d278bf (patch)
treec7359dcc2bd831238a56149539ef4fd183f11fbe
parenta0f19a894c46e5ceb7334d4d66453e566152ed1e (diff)
downloadlinux-b8d665aed401b51297d8f2e9fbf2774e94d278bf.tar.xz
hwrng: omap3-rom - Update to use standard driver data
Let's update omap3-rom-rng to use standard driver data to make it easier to add runtime PM support in the following patch. Just use it for the rng ops and clock for now. Let's still keep also old rng_clk still around, we will remove delayed work and rng_clk with runtime PM in the next patch. Cc: Aaro Koskinen <aaro.koskinen@iki.fi> Cc: Adam Ford <aford173@gmail.com> Cc: Pali Rohár <pali.rohar@gmail.com> Cc: Sebastian Reichel <sre@kernel.org> Cc: Tero Kristo <t-kristo@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/char/hw_random/omap3-rom-rng.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c
index f5247e9ae6df..749f6ec2bde1 100644
--- a/drivers/char/hw_random/omap3-rom-rng.c
+++ b/drivers/char/hw_random/omap3-rom-rng.c
@@ -31,6 +31,12 @@
/* param1: ptr, param2: count, param3: flag */
static u32 (*omap3_rom_rng_call)(u32, u32, u32);
+struct omap_rom_rng {
+ struct clk *clk;
+ struct device *dev;
+ struct hwrng ops;
+};
+
static struct delayed_work idle_work;
static int rng_idle;
static struct clk *rng_clk;
@@ -86,48 +92,57 @@ static int omap3_rom_rng_read(struct hwrng *rng, void *data, size_t max, bool w)
return 4;
}
-static struct hwrng omap3_rom_rng_ops = {
- .name = "omap3-rom",
- .quality = 900,
-};
-
static int omap3_rom_rng_probe(struct platform_device *pdev)
{
+ struct omap_rom_rng *ddata;
int ret = 0;
- omap3_rom_rng_ops.read = of_device_get_match_data(&pdev->dev);
- if (!omap3_rom_rng_ops.read) {
+ ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
+ if (!ddata)
+ return -ENOMEM;
+
+ ddata->dev = &pdev->dev;
+ ddata->ops.priv = (unsigned long)ddata;
+ ddata->ops.name = "omap3-rom";
+ ddata->ops.read = of_device_get_match_data(&pdev->dev);
+ ddata->ops.quality = 900;
+ if (!ddata->ops.read) {
dev_err(&pdev->dev, "missing rom code handler\n");
return -ENODEV;
}
+ dev_set_drvdata(ddata->dev, ddata);
omap3_rom_rng_call = pdev->dev.platform_data;
if (!omap3_rom_rng_call) {
- pr_err("omap3_rom_rng_call is NULL\n");
+ dev_err(ddata->dev, "rom_rng_call is NULL\n");
return -EINVAL;
}
INIT_DELAYED_WORK(&idle_work, omap3_rom_rng_idle);
- rng_clk = devm_clk_get(&pdev->dev, "ick");
- if (IS_ERR(rng_clk)) {
- pr_err("unable to get RNG clock\n");
- return PTR_ERR(rng_clk);
+ ddata->clk = devm_clk_get(ddata->dev, "ick");
+ if (IS_ERR(ddata->clk)) {
+ dev_err(ddata->dev, "unable to get RNG clock\n");
+ return PTR_ERR(ddata->clk);
}
+ rng_clk = ddata->clk;
/* Leave the RNG in reset state. */
- ret = clk_prepare_enable(rng_clk);
+ ret = clk_prepare_enable(ddata->clk);
if (ret)
return ret;
omap3_rom_rng_idle(0);
- return hwrng_register(&omap3_rom_rng_ops);
+ return hwrng_register(&ddata->ops);
}
static int omap3_rom_rng_remove(struct platform_device *pdev)
{
+ struct omap_rom_rng *ddata;
+
+ ddata = dev_get_drvdata(&pdev->dev);
cancel_delayed_work_sync(&idle_work);
- hwrng_unregister(&omap3_rom_rng_ops);
+ hwrng_unregister(&ddata->ops);
if (!rng_idle)
clk_disable_unprepare(rng_clk);
return 0;