static int bcm63xx_rng_data_read(struct hwrng *rng, u32 *data) { struct bcm63xx_rng_priv *priv = to_rng_priv(rng); *data = __raw_readl(priv->regs + RNG_DATA); return 4; }
static void bcm63xx_rng_cleanup(struct hwrng *rng) { struct bcm63xx_rng_priv *priv = to_rng_priv(rng); u32 val; val = bcm_readl(priv->regs + RNG_CTRL); val &= ~RNG_EN; bcm_writel(val, priv->regs + RNG_CTRL); }
/* * have data return 1, however return 0 if we have nothing */ static int timeriomem_rng_data_present(struct hwrng *rng, int wait) { struct timeriomem_rng_private_data *priv = to_rng_priv(rng); if (!wait || priv->present) return priv->present; wait_for_completion(&priv->completion); return 1; }
static void bcm63xx_rng_cleanup(struct hwrng *rng) { struct bcm63xx_rng_priv *priv = to_rng_priv(rng); u32 val; val = __raw_readl(priv->regs + RNG_CTRL); val &= ~RNG_EN; __raw_writel(val, priv->regs + RNG_CTRL); clk_disable_unprepare(priv->clk); }
static int bcm63xx_rng_init(struct hwrng *rng) { struct bcm63xx_rng_priv *priv = to_rng_priv(rng); u32 val; val = bcm_readl(priv->regs + RNG_CTRL); val |= RNG_EN; bcm_writel(val, priv->regs + RNG_CTRL); return 0; }
static int bcm63xx_rng_remove(struct platform_device *pdev) { struct hwrng *rng = platform_get_drvdata(pdev); struct bcm63xx_rng_priv *priv = to_rng_priv(rng); hwrng_unregister(rng); clk_disable(priv->clk); kfree(priv); kfree(rng); platform_set_drvdata(pdev, NULL); return 0; }
static int bcm63xx_rng_init(struct hwrng *rng) { struct bcm63xx_rng_priv *priv = to_rng_priv(rng); u32 val; int error; error = clk_prepare_enable(priv->clk); if (error) return error; val = __raw_readl(priv->regs + RNG_CTRL); val |= RNG_EN; __raw_writel(val, priv->regs + RNG_CTRL); return 0; }
static int timeriomem_rng_data_read(struct hwrng *rng, u32 *data) { struct timeriomem_rng_private_data *priv = to_rng_priv(rng); unsigned long cur; s32 delay; *data = readl(priv->io_base); cur = jiffies; delay = cur - priv->expires; delay = priv->period - (delay % priv->period); priv->expires = cur + delay; priv->present = 0; INIT_COMPLETION(priv->completion); mod_timer(&priv->timer, priv->expires); return 4; }
static int bcm63xx_rng_data_present(struct hwrng *rng, int wait) { struct bcm63xx_rng_priv *priv = to_rng_priv(rng); return __raw_readl(priv->regs + RNG_STAT) & RNG_AVAIL_MASK; }