diff options
author | Oleksij Rempel <o.rempel@pengutronix.de> | 2017-03-22 10:14:35 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2017-03-30 08:23:20 +0200 |
commit | 451733ac8a5020d92b4ce4b1566bcb08f8cacc71 (patch) | |
tree | e76ed963e6a1ed6b6636d73584fa6d2f64daf88b /drivers/crypto | |
parent | 07dc37dc9bbf0ddb2a4ef4e7baec07957492d42a (diff) | |
download | barebox-451733ac8a5020d92b4ce4b1566bcb08f8cacc71.tar.gz barebox-451733ac8a5020d92b4ce4b1566bcb08f8cacc71.tar.xz |
caamrng: port to hwrng framework
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/caam/Kconfig | 1 | ||||
-rw-r--r-- | drivers/crypto/caam/caamrng.c | 40 |
2 files changed, 13 insertions, 28 deletions
diff --git a/drivers/crypto/caam/Kconfig b/drivers/crypto/caam/Kconfig index cf05d1c077..2ab509d110 100644 --- a/drivers/crypto/caam/Kconfig +++ b/drivers/crypto/caam/Kconfig @@ -29,6 +29,7 @@ config CRYPTO_DEV_FSL_CAAM_RINGSIZE config CRYPTO_DEV_FSL_CAAM_RNG bool "Register caam RNG device" depends on CRYPTO_DEV_FSL_CAAM + depends on HWRNG default y help Selecting this will register the SEC4 hardware rng. diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c index 0fef171a2b..aabad04164 100644 --- a/drivers/crypto/caam/caamrng.c +++ b/drivers/crypto/caam/caamrng.c @@ -35,6 +35,7 @@ #include <driver.h> #include <init.h> #include <linux/spinlock.h> +#include <linux/hw_random.h> #include "regs.h" #include "intern.h" @@ -71,7 +72,7 @@ struct caam_rng_ctx { unsigned int cur_buf_idx; int current_buf; struct buf_data bufs[2]; - struct cdev cdev; + struct hwrng rng; }; static struct caam_rng_ctx *rng_ctx; @@ -116,8 +117,9 @@ static inline int submit_job(struct caam_rng_ctx *ctx, int to_current) return err; } -static int caam_read(struct caam_rng_ctx *ctx, void *data, size_t max, bool wait) +static int caam_read(struct hwrng *rng, void *data, size_t max, bool wait) { + struct caam_rng_ctx *ctx = container_of(rng, struct caam_rng_ctx, rng); struct buf_data *bd = &ctx->bufs[ctx->current_buf]; int next_buf_idx, copied_idx; int err; @@ -162,7 +164,7 @@ static int caam_read(struct caam_rng_ctx *ctx, void *data, size_t max, bool wait dev_dbg(ctx->jrdev, "switched to buffer %d\n", ctx->current_buf); /* since there already is some data read, don't wait */ - return copied_idx + caam_read(ctx, data + copied_idx, + return copied_idx + caam_read(rng, data + copied_idx, max - copied_idx, false); } @@ -248,29 +250,6 @@ static int caam_init_rng(struct caam_rng_ctx *ctx, struct device_d *jrdev) return 0; } -static ssize_t random_read(struct cdev *cdev, void *buf, size_t count, - loff_t offset, ulong flags) -{ - struct caam_rng_ctx *ctx = container_of(cdev, struct caam_rng_ctx, cdev); - - return caam_read(ctx, buf, count, true); -} - -static struct file_operations randomops = { - .read = random_read, - .lseek = dev_lseek_default, -}; - -static int caam_init_devrandom(struct caam_rng_ctx *ctx, struct device_d *dev) -{ - ctx->cdev.name = "hwrng"; - ctx->cdev.flags = DEVFS_IS_CHARACTER_DEV; - ctx->cdev.ops = &randomops; - ctx->cdev.dev = dev; - - return devfs_create(&ctx->cdev); -} - int caam_rng_probe(struct device_d *dev, struct device_d *jrdev) { int err; @@ -281,9 +260,14 @@ int caam_rng_probe(struct device_d *dev, struct device_d *jrdev) if (err) return err; - err = caam_init_devrandom(rng_ctx, dev); - if (err) + rng_ctx->rng.name = dev->name; + rng_ctx->rng.read = caam_read; + + err = hwrng_register(dev, &rng_ctx->rng); + if (err) { + dev_err(dev, "rng-caam registering failed (%d)\n", err); return err; + } dev_info(dev, "registering rng-caam\n"); |