hwrng: timeriomem - Use devm_*() functions
authorJingoo Han <jg1.han@samsung.com>
Thu, 27 Feb 2014 05:07:52 +0000 (14:07 +0900)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 10 Mar 2014 12:13:38 +0000 (20:13 +0800)
Use devm_*() functions to make cleanup paths simpler.

Signed-off-by: Jingoo Han <jg1.han@samsung.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/char/hw_random/timeriomem-rng.c

index 73ce739f8e196c5ce154c6c186035d28124f4b1d..439ff8b28c439c6da97101b3d096cb9f9bd66691 100644 (file)
@@ -118,7 +118,8 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
        }
 
        /* Allocate memory for the device structure (and zero it) */
-       priv = kzalloc(sizeof(struct timeriomem_rng_private_data), GFP_KERNEL);
+       priv = devm_kzalloc(&pdev->dev,
+                       sizeof(struct timeriomem_rng_private_data), GFP_KERNEL);
        if (!priv) {
                dev_err(&pdev->dev, "failed to allocate device structure.\n");
                return -ENOMEM;
@@ -134,17 +135,16 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
                        period = i;
                else {
                        dev_err(&pdev->dev, "missing period\n");
-                       err = -EINVAL;
-                       goto out_free;
+                       return -EINVAL;
                }
-       } else
+       } else {
                period = pdata->period;
+       }
 
        priv->period = usecs_to_jiffies(period);
        if (priv->period < 1) {
                dev_err(&pdev->dev, "period is less than one jiffy\n");
-               err = -EINVAL;
-               goto out_free;
+               return -EINVAL;
        }
 
        priv->expires   = jiffies;
@@ -160,24 +160,16 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
        priv->timeriomem_rng_ops.data_read      = timeriomem_rng_data_read;
        priv->timeriomem_rng_ops.priv           = (unsigned long)priv;
 
-       if (!request_mem_region(res->start, resource_size(res),
-                               dev_name(&pdev->dev))) {
-               dev_err(&pdev->dev, "request_mem_region failed\n");
-               err = -EBUSY;
+       priv->io_base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(priv->io_base)) {
+               err = PTR_ERR(priv->io_base);
                goto out_timer;
        }
 
-       priv->io_base = ioremap(res->start, resource_size(res));
-       if (priv->io_base == NULL) {
-               dev_err(&pdev->dev, "ioremap failed\n");
-               err = -EIO;
-               goto out_release_io;
-       }
-
        err = hwrng_register(&priv->timeriomem_rng_ops);
        if (err) {
                dev_err(&pdev->dev, "problem registering\n");
-               goto out;
+               goto out_timer;
        }
 
        dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n",
@@ -185,30 +177,18 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
 
        return 0;
 
-out:
-       iounmap(priv->io_base);
-out_release_io:
-       release_mem_region(res->start, resource_size(res));
 out_timer:
        del_timer_sync(&priv->timer);
-out_free:
-       kfree(priv);
        return err;
 }
 
 static int timeriomem_rng_remove(struct platform_device *pdev)
 {
        struct timeriomem_rng_private_data *priv = platform_get_drvdata(pdev);
-       struct resource *res;
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        hwrng_unregister(&priv->timeriomem_rng_ops);
 
        del_timer_sync(&priv->timer);
-       iounmap(priv->io_base);
-       release_mem_region(res->start, resource_size(res));
-       kfree(priv);
 
        return 0;
 }