Commit b23d2d92 authored by Romain Perier's avatar Romain Perier Committed by Herbert Xu

hwrng: omap - Remove global definition of hwrng

The omap-rng driver currently assumes that there will only ever be a
single instance of an RNG device. For this reason, there is a statically
allocated struct hwrng, with a fixed name. However, registering two
struct hwrng with the same isn't accepted by the RNG framework, so we
need to switch to a dynamically allocated struct hwrng, each using a
different name. Then, we define the name of this hwrng to "dev_name(dev)",
so the name of the data structure is unique per device.
Signed-off-by: default avatarRomain Perier <romain.perier@free-electrons.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 69eb4d01
...@@ -127,6 +127,7 @@ struct omap_rng_dev { ...@@ -127,6 +127,7 @@ struct omap_rng_dev {
void __iomem *base; void __iomem *base;
struct device *dev; struct device *dev;
const struct omap_rng_pdata *pdata; const struct omap_rng_pdata *pdata;
struct hwrng rng;
}; };
static inline u32 omap_rng_read(struct omap_rng_dev *priv, u16 reg) static inline u32 omap_rng_read(struct omap_rng_dev *priv, u16 reg)
...@@ -187,12 +188,6 @@ static void omap_rng_cleanup(struct hwrng *rng) ...@@ -187,12 +188,6 @@ static void omap_rng_cleanup(struct hwrng *rng)
priv->pdata->cleanup(priv); priv->pdata->cleanup(priv);
} }
static struct hwrng omap_rng_ops = {
.name = "omap",
.read = omap_rng_do_read,
.init = omap_rng_init,
.cleanup = omap_rng_cleanup,
};
static inline u32 omap2_rng_data_present(struct omap_rng_dev *priv) static inline u32 omap2_rng_data_present(struct omap_rng_dev *priv)
{ {
...@@ -365,7 +360,11 @@ static int omap_rng_probe(struct platform_device *pdev) ...@@ -365,7 +360,11 @@ static int omap_rng_probe(struct platform_device *pdev)
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
omap_rng_ops.priv = (unsigned long)priv; priv->rng.read = omap_rng_do_read;
priv->rng.init = omap_rng_init;
priv->rng.cleanup = omap_rng_cleanup;
priv->rng.priv = (unsigned long)priv;
platform_set_drvdata(pdev, priv); platform_set_drvdata(pdev, priv);
priv->dev = dev; priv->dev = dev;
...@@ -376,6 +375,12 @@ static int omap_rng_probe(struct platform_device *pdev) ...@@ -376,6 +375,12 @@ static int omap_rng_probe(struct platform_device *pdev)
goto err_ioremap; goto err_ioremap;
} }
priv->rng.name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL);
if (!priv->rng.name) {
ret = -ENOMEM;
goto err_ioremap;
}
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
ret = pm_runtime_get_sync(&pdev->dev); ret = pm_runtime_get_sync(&pdev->dev);
if (ret < 0) { if (ret < 0) {
...@@ -389,7 +394,7 @@ static int omap_rng_probe(struct platform_device *pdev) ...@@ -389,7 +394,7 @@ static int omap_rng_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_ioremap; goto err_ioremap;
ret = hwrng_register(&omap_rng_ops); ret = hwrng_register(&priv->rng);
if (ret) if (ret)
goto err_register; goto err_register;
...@@ -410,7 +415,7 @@ static int omap_rng_remove(struct platform_device *pdev) ...@@ -410,7 +415,7 @@ static int omap_rng_remove(struct platform_device *pdev)
{ {
struct omap_rng_dev *priv = platform_get_drvdata(pdev); struct omap_rng_dev *priv = platform_get_drvdata(pdev);
hwrng_unregister(&omap_rng_ops); hwrng_unregister(&priv->rng);
priv->pdata->cleanup(priv); priv->pdata->cleanup(priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment