Commit 69eb4d01 authored by Romain Perier's avatar Romain Perier Committed by Herbert Xu

hwrng: omap - Switch to non-obsolete read API implementation

The ".data_present" and ".data_read" operations are marked as OBSOLETE
in the hwrng API. We have to use the ".read" operation instead. It makes
the driver simpler and moves the busy loop, that waits until enough data
is generated, to the read function. We simplify this step by only
checking the status of the engine, if there is data, we copy the data to
the output buffer and the amout of copied data is returned to the caller,
otherwise zero is returned. The hwrng core will re-call the read operation
as many times as required until enough data has been copied.
Signed-off-by: default avatarRomain Perier <romain.perier@free-electrons.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 52060836
...@@ -140,41 +140,35 @@ static inline void omap_rng_write(struct omap_rng_dev *priv, u16 reg, ...@@ -140,41 +140,35 @@ static inline void omap_rng_write(struct omap_rng_dev *priv, u16 reg,
__raw_writel(val, priv->base + priv->pdata->regs[reg]); __raw_writel(val, priv->base + priv->pdata->regs[reg]);
} }
static int omap_rng_data_present(struct hwrng *rng, int wait)
static int omap_rng_do_read(struct hwrng *rng, void *data, size_t max,
bool wait)
{ {
struct omap_rng_dev *priv; struct omap_rng_dev *priv;
int data, i; int i, present;
priv = (struct omap_rng_dev *)rng->priv; priv = (struct omap_rng_dev *)rng->priv;
if (max < priv->pdata->data_size)
return 0;
for (i = 0; i < 20; i++) { for (i = 0; i < 20; i++) {
data = priv->pdata->data_present(priv); present = priv->pdata->data_present(priv);
if (data || !wait) if (present || !wait)
break; break;
/* RNG produces data fast enough (2+ MBit/sec, even
* during "rngtest" loads, that these delays don't
* seem to trigger. We *could* use the RNG IRQ, but
* that'd be higher overhead ... so why bother?
*/
udelay(10); udelay(10);
} }
return data; if (!present)
} return 0;
static int omap_rng_data_read(struct hwrng *rng, u32 *data)
{
struct omap_rng_dev *priv;
u32 data_size, i;
priv = (struct omap_rng_dev *)rng->priv;
data_size = priv->pdata->data_size;
for (i = 0; i < data_size / sizeof(u32); i++) memcpy_fromio(data, priv->base + priv->pdata->regs[RNG_OUTPUT_L_REG],
data[i] = omap_rng_read(priv, RNG_OUTPUT_L_REG + i); priv->pdata->data_size);
if (priv->pdata->regs[RNG_INTACK_REG]) if (priv->pdata->regs[RNG_INTACK_REG])
omap_rng_write(priv, RNG_INTACK_REG, RNG_REG_INTACK_RDY_MASK); omap_rng_write(priv, RNG_INTACK_REG, RNG_REG_INTACK_RDY_MASK);
return data_size;
return priv->pdata->data_size;
} }
static int omap_rng_init(struct hwrng *rng) static int omap_rng_init(struct hwrng *rng)
...@@ -195,8 +189,7 @@ static void omap_rng_cleanup(struct hwrng *rng) ...@@ -195,8 +189,7 @@ static void omap_rng_cleanup(struct hwrng *rng)
static struct hwrng omap_rng_ops = { static struct hwrng omap_rng_ops = {
.name = "omap", .name = "omap",
.data_present = omap_rng_data_present, .read = omap_rng_do_read,
.data_read = omap_rng_data_read,
.init = omap_rng_init, .init = omap_rng_init,
.cleanup = omap_rng_cleanup, .cleanup = omap_rng_cleanup,
}; };
......
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