]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/char/hw_random/core.c
Merge remote-tracking branch 'char-misc/char-misc-next'
[karo-tx-linux.git] / drivers / char / hw_random / core.c
index 0a8194525bafa73aa994ac404e44ad9d7d806b9d..da8faf78536a3ae01827a2ee9480c486a04297a5 100644 (file)
@@ -179,7 +179,8 @@ skip_init:
        add_early_randomness(rng);
 
        current_quality = rng->quality ? : default_quality;
-       current_quality &= 1023;
+       if (current_quality > 1024)
+               current_quality = 1024;
 
        if (current_quality == 0 && hwrng_fill)
                kthread_stop(hwrng_fill);
@@ -524,6 +525,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();