Use devm_hwrng_register to simplify the implementation.
Manual unregistration and some remove functions can be
removed now.
Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
Acked-by: Ćukasz Stelmach <l.stelmach@samsung.com>
Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
        trng->rng.name = pdev->name;
        trng->rng.read = atmel_trng_read;
 
-       ret = hwrng_register(&trng->rng);
+       ret = devm_hwrng_register(&pdev->dev, &trng->rng);
        if (ret)
                goto err_register;
 
 {
        struct atmel_trng *trng = platform_get_drvdata(pdev);
 
-       hwrng_unregister(&trng->rng);
 
        atmel_trng_disable(trng);
        clk_disable_unprepare(trng->clk);
 
 
        pci_set_drvdata(pdev, rng);
 
-       ret = hwrng_register(&rng->ops);
+       ret = devm_hwrng_register(&pdev->dev, &rng->ops);
        if (ret) {
                dev_err(&pdev->dev, "Error registering device as HWRNG.\n");
                return ret;
        return 0;
 }
 
-/* Remove the VF */
-static void  cavium_rng_remove_vf(struct pci_dev *pdev)
-{
-       struct cavium_rng *rng;
-
-       rng = pci_get_drvdata(pdev);
-       hwrng_unregister(&rng->ops);
-}
 
 static const struct pci_device_id cavium_rng_vf_id_table[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, 0xa033), 0, 0, 0},
        .name           = "cavium_rng_vf",
        .id_table       = cavium_rng_vf_id_table,
        .probe          = cavium_rng_probe_vf,
-       .remove         = cavium_rng_remove_vf,
 };
 module_pci_driver(cavium_rng_vf_driver);
 
 
                goto err_clock;
        }
 
-       ret = hwrng_register(&trng->rng);
+       ret = devm_hwrng_register(&pdev->dev, &trng->rng);
        if (ret) {
                dev_err(&pdev->dev, "Could not register hwrng device.\n");
                goto err_register;
 {
        struct exynos_trng_dev *trng =  platform_get_drvdata(pdev);
 
-       hwrng_unregister(&trng->rng);
        clk_disable_unprepare(trng->clk);
 
        pm_runtime_put_sync(&pdev->dev);
 
        np->hwrng.data_read = n2rng_data_read;
        np->hwrng.priv = (unsigned long) np;
 
-       err = hwrng_register(&np->hwrng);
+       err = devm_hwrng_register(&pdev->dev, &np->hwrng);
        if (err)
                goto out_hvapi_unregister;
 
 
        cancel_delayed_work_sync(&np->work);
 
-       hwrng_unregister(&np->hwrng);
-
        sun4v_hvapi_unregister(HV_GRP_RNG);
 
        return 0;
 
        if (!base)
                goto out_release;
        nmk_rng.priv = (unsigned long)base;
-       ret = hwrng_register(&nmk_rng);
+       ret = devm_hwrng_register(&dev->dev, &nmk_rng);
        if (ret)
                goto out_release;
        return 0;
 
 static int nmk_rng_remove(struct amba_device *dev)
 {
-       hwrng_unregister(&nmk_rng);
        amba_release_regions(dev);
        clk_disable(rng_clk);
        return 0;
 
        if (ret)
                goto err_register;
 
-       ret = hwrng_register(&priv->rng);
+       ret = devm_hwrng_register(&pdev->dev, &priv->rng);
        if (ret)
                goto err_register;
 
 {
        struct omap_rng_dev *priv = platform_get_drvdata(pdev);
 
-       hwrng_unregister(&priv->rng);
 
        priv->pdata->cleanup(priv);
 
 
        .read = powernv_rng_read,
 };
 
-static int powernv_rng_remove(struct platform_device *pdev)
-{
-       hwrng_unregister(&powernv_hwrng);
-
-       return 0;
-}
-
 static int powernv_rng_probe(struct platform_device *pdev)
 {
        int rc;
 
-       rc = hwrng_register(&powernv_hwrng);
+       rc = devm_hwrng_register(&pdev->dev, &powernv_hwrng);
        if (rc) {
                /* We only register one device, ignore any others */
                if (rc == -EEXIST)
                .of_match_table = powernv_rng_match,
        },
        .probe  = powernv_rng_probe,
-       .remove = powernv_rng_remove,
 };
 module_platform_driver(powernv_rng_driver);
 
 
 
        dev_set_drvdata(&pdev->dev, ddata);
 
-       ret = hwrng_register(&ddata->ops);
+       ret = devm_hwrng_register(&pdev->dev, &ddata->ops);
        if (ret) {
                dev_err(&pdev->dev, "Failed to register HW RNG\n");
                clk_disable_unprepare(clk);
 {
        struct st_rng_data *ddata = dev_get_drvdata(&pdev->dev);
 
-       hwrng_unregister(&ddata->ops);
-
        clk_disable_unprepare(ddata->clk);
 
        return 0;
 
 
        xgene_rng_func.priv = (unsigned long) ctx;
 
-       rc = hwrng_register(&xgene_rng_func);
+       rc = devm_hwrng_register(&pdev->dev, &xgene_rng_func);
        if (rc) {
                dev_err(&pdev->dev, "RNG registering failed error %d\n", rc);
                if (!IS_ERR(ctx->clk))
                        rc);
                if (!IS_ERR(ctx->clk))
                        clk_disable_unprepare(ctx->clk);
-               hwrng_unregister(&xgene_rng_func);
                return rc;
        }
 
                dev_err(&pdev->dev, "RNG init wakeup failed error %d\n", rc);
        if (!IS_ERR(ctx->clk))
                clk_disable_unprepare(ctx->clk);
-       hwrng_unregister(&xgene_rng_func);
 
        return rc;
 }