Skip to content

Commit 4d9b519

Browse files
dtorherbertx
authored andcommitted
hwrng: add devm_* interfaces
This change adds devm_hwrng_register and devm_hwrng_unregister which use can simplify error unwinding and unbinding code paths in device drivers. Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 05713ba commit 4d9b519

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

drivers/char/hw_random/core.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,48 @@ void hwrng_unregister(struct hwrng *rng)
536536
}
537537
EXPORT_SYMBOL_GPL(hwrng_unregister);
538538

539+
static void devm_hwrng_release(struct device *dev, void *res)
540+
{
541+
hwrng_unregister(*(struct hwrng **)res);
542+
}
543+
544+
static int devm_hwrng_match(struct device *dev, void *res, void *data)
545+
{
546+
struct hwrng **r = res;
547+
548+
if (WARN_ON(!r || !*r))
549+
return 0;
550+
551+
return *r == data;
552+
}
553+
554+
int devm_hwrng_register(struct device *dev, struct hwrng *rng)
555+
{
556+
struct hwrng **ptr;
557+
int error;
558+
559+
ptr = devres_alloc(devm_hwrng_release, sizeof(*ptr), GFP_KERNEL);
560+
if (!ptr)
561+
return -ENOMEM;
562+
563+
error = hwrng_register(rng);
564+
if (error) {
565+
devres_free(ptr);
566+
return error;
567+
}
568+
569+
*ptr = rng;
570+
devres_add(dev, ptr);
571+
return 0;
572+
}
573+
EXPORT_SYMBOL_GPL(devm_hwrng_register);
574+
575+
void devm_hwrng_unregister(struct device *dev, struct hwrng *rng)
576+
{
577+
devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng);
578+
}
579+
EXPORT_SYMBOL_GPL(devm_hwrng_unregister);
580+
539581
static int __init hwrng_modinit(void)
540582
{
541583
return register_miscdev();

include/linux/hw_random.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,14 @@ struct hwrng {
5050
struct completion cleanup_done;
5151
};
5252

53+
struct device;
54+
5355
/** Register a new Hardware Random Number Generator driver. */
5456
extern int hwrng_register(struct hwrng *rng);
57+
extern int devm_hwrng_register(struct device *dev, struct hwrng *rng);
5558
/** Unregister a Hardware Random Number Generator driver. */
5659
extern void hwrng_unregister(struct hwrng *rng);
60+
extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng);
5761
/** Feed random bits into the pool. */
5862
extern void add_hwgenerator_randomness(const char *buffer, size_t count, size_t entropy);
5963

0 commit comments

Comments
 (0)