mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 05:24:12 +08:00
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>
This commit is contained in:
parent
05713ba905
commit
4d9b519c9b
@ -536,6 +536,48 @@ void hwrng_unregister(struct hwrng *rng)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hwrng_unregister);
|
||||
|
||||
static void devm_hwrng_release(struct device *dev, void *res)
|
||||
{
|
||||
hwrng_unregister(*(struct hwrng **)res);
|
||||
}
|
||||
|
||||
static int devm_hwrng_match(struct device *dev, void *res, void *data)
|
||||
{
|
||||
struct hwrng **r = res;
|
||||
|
||||
if (WARN_ON(!r || !*r))
|
||||
return 0;
|
||||
|
||||
return *r == data;
|
||||
}
|
||||
|
||||
int devm_hwrng_register(struct device *dev, struct hwrng *rng)
|
||||
{
|
||||
struct hwrng **ptr;
|
||||
int error;
|
||||
|
||||
ptr = devres_alloc(devm_hwrng_release, sizeof(*ptr), GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return -ENOMEM;
|
||||
|
||||
error = hwrng_register(rng);
|
||||
if (error) {
|
||||
devres_free(ptr);
|
||||
return error;
|
||||
}
|
||||
|
||||
*ptr = rng;
|
||||
devres_add(dev, ptr);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_hwrng_register);
|
||||
|
||||
void devm_hwrng_unregister(struct device *dev, struct hwrng *rng)
|
||||
{
|
||||
devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_hwrng_unregister);
|
||||
|
||||
static int __init hwrng_modinit(void)
|
||||
{
|
||||
return register_miscdev();
|
||||
|
@ -50,10 +50,14 @@ struct hwrng {
|
||||
struct completion cleanup_done;
|
||||
};
|
||||
|
||||
struct device;
|
||||
|
||||
/** Register a new Hardware Random Number Generator driver. */
|
||||
extern int hwrng_register(struct hwrng *rng);
|
||||
extern int devm_hwrng_register(struct device *dev, struct hwrng *rng);
|
||||
/** Unregister a Hardware Random Number Generator driver. */
|
||||
extern void hwrng_unregister(struct hwrng *rng);
|
||||
extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng);
|
||||
/** Feed random bits into the pool. */
|
||||
extern void add_hwgenerator_randomness(const char *buffer, size_t count, size_t entropy);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user