sigio_broken(random_fd);
        hwrng.name = RNG_MODULE_NAME;
        hwrng.read = rng_dev_read;
-       hwrng.quality = 1024;
 
        err = hwrng_register(&hwrng);
        if (err) {
 
                return -ENOMEM;
 
        rng->ops.read    = cavium_rng_read;
-       rng->ops.quality = 1000;
 
        pci_set_drvdata(pdev, rng);
 
 
                return -ENOMEM;
 
        rng->ops.read    = cn10k_rng_read;
-       rng->ops.quality = 1000;
        rng->ops.priv = (unsigned long)rng;
 
        reset_rng_health_state(rng);
 
 static int data_avail;
 static u8 *rng_buffer, *rng_fillbuf;
 static unsigned short current_quality;
-static unsigned short default_quality; /* = 0; default to "off" */
+static unsigned short default_quality = 1024; /* default to maximum */
 
 module_param(current_quality, ushort, 0644);
 MODULE_PARM_DESC(current_quality,
                 "current hwrng entropy estimation per 1024 bits of input -- obsolete, use rng_quality instead");
 module_param(default_quality, ushort, 0644);
 MODULE_PARM_DESC(default_quality,
-                "default entropy content of hwrng per 1024 bits of input");
+                "default maximum entropy content of hwrng per 1024 bits of input");
 
 static void drop_current_rng(void);
 static int hwrng_init(struct hwrng *rng);
        reinit_completion(&rng->cleanup_done);
 
 skip_init:
-       if (!rng->quality)
-               rng->quality = default_quality;
-       if (rng->quality > 1024)
-               rng->quality = 1024;
+       rng->quality = min_t(u16, min_t(u16, default_quality, 1024), rng->quality ?: 1024);
        current_quality = rng->quality; /* obsolete */
 
        return 0;
 
 
        rng_priv->rng.read = mpfs_rng_read;
        rng_priv->rng.name = pdev->name;
-       rng_priv->rng.quality = 1024;
 
        platform_set_drvdata(pdev, rng_priv);
 
 
        priv->rng.name = pdev->name;
        priv->rng.read = npcm_rng_read;
        priv->rng.priv = (unsigned long)&pdev->dev;
-       priv->rng.quality = 1000;
        priv->clkp = (u32)(uintptr_t)of_device_get_match_data(&pdev->dev);
 
        writel(NPCM_RNG_M1ROSEL, priv->base + NPCM_RNGMODE_REG);
 
        .name           = "s390-trng",
        .data_read      = trng_hwrng_data_read,
        .read           = trng_hwrng_read,
-       .quality        = 1024,
 };
 
 
 
                if (!of_property_read_u32(pdev->dev.of_node,
                                                "quality", &i))
                        priv->rng_ops.quality = i;
-               else
-                       priv->rng_ops.quality = 0;
        } else {
                period = pdata->period;
                priv->rng_ops.quality = pdata->quality;
 
                .cleanup = virtio_cleanup,
                .priv = (unsigned long)vi,
                .name = vi->name,
-               .quality = 1000,
        };
        vdev->priv = vi;
 
 
        }
        ce->trng.name = "sun8i Crypto Engine TRNG";
        ce->trng.read = sun8i_ce_trng_read;
-       ce->trng.quality = 1000;
 
        ret = hwrng_register(&ce->trng);
        if (ret)
 
 
        i2c_priv->hwrng.name = dev_name(&client->dev);
        i2c_priv->hwrng.read = atmel_sha204a_rng_read;
-       i2c_priv->hwrng.quality = 1024;
 
        ret = devm_hwrng_register(&client->dev, &i2c_priv->hwrng);
        if (ret)
 
        ctx->rng.cleanup = caam_cleanup;
        ctx->rng.read    = caam_read;
        ctx->rng.priv    = (unsigned long)ctx;
-       ctx->rng.quality = 1024;
 
        dev_info(ctrldev, "registering rng-caam\n");
 
 
        rwtm->hwrng.name = DRIVER_NAME "_hwrng";
        rwtm->hwrng.read = mox_hwrng_read;
        rwtm->hwrng.priv = (unsigned long) rwtm;
-       rwtm->hwrng.quality = 1024;
 
        ret = devm_hwrng_register(dev, &rwtm->hwrng);
        if (ret < 0) {
 
 EXPORT_TRACEPOINT_SYMBOL(s390_zcrypt_req);
 EXPORT_TRACEPOINT_SYMBOL(s390_zcrypt_rep);
 
-static int zcrypt_hwrng_seed = 1;
-module_param_named(hwrng_seed, zcrypt_hwrng_seed, int, 0440);
-MODULE_PARM_DESC(hwrng_seed, "Turn on/off hwrng auto seed, default is 1 (on).");
-
 DEFINE_SPINLOCK(zcrypt_list_lock);
 LIST_HEAD(zcrypt_card_list);
 
                        goto out;
                }
                zcrypt_rng_buffer_index = 0;
-               if (!zcrypt_hwrng_seed)
-                       zcrypt_rng_dev.quality = 0;
                rc = hwrng_register(&zcrypt_rng_dev);
                if (rc)
                        goto out_free;
 
 
        dev->hwrng.name = dev->name ? dev->name : chaoskey_driver.name;
        dev->hwrng.read = chaoskey_rng_read;
-       dev->hwrng.quality = 1024;
 
        dev->hwrng_registered = (hwrng_register(&dev->hwrng) == 0);
        if (!dev->hwrng_registered)
 
  * @priv:              Private data, for use by the RNG driver.
  * @quality:           Estimation of true entropy in RNG's bitstream
  *                     (in bits of entropy per 1024 bits of input;
- *                     valid values: 1 to 1024, or 0 for unknown).
+ *                     valid values: 1 to 1024, or 0 for maximum).
  */
 struct hwrng {
        const char *name;