rtc: rtc-spear: use devm_*() routines
authorViresh Kumar <viresh.kumar@linaro.org>
Tue, 18 Dec 2012 00:02:29 +0000 (16:02 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 18 Dec 2012 01:15:20 +0000 (17:15 -0800)
Free the rtc-spear driver from tension of freeing resources :) devm_*
derivatives of multiple routines are used while allocating resources,
which would be freed automatically by kernel.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Deepak Sikri <deepak.sikri@st.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/rtc/rtc-spear.c

index bb507d23f6cea09e3c2ab80fec144e1acbb1c4a9..311a5274b5289bb03f32504f28b03de30ef0f7c6 100644 (file)
@@ -363,35 +363,42 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "no resource defined\n");
                return -EBUSY;
        }
-       if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
-               dev_err(&pdev->dev, "rtc region already claimed\n");
-               return -EBUSY;
-       }
 
-       config = kzalloc(sizeof(*config), GFP_KERNEL);
+       config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL);
        if (!config) {
                dev_err(&pdev->dev, "out of memory\n");
-               status = -ENOMEM;
-               goto err_release_region;
+               return -ENOMEM;
        }
 
-       config->clk = clk_get(&pdev->dev, NULL);
-       if (IS_ERR(config->clk)) {
-               status = PTR_ERR(config->clk);
-               goto err_kfree;
+       /* alarm irqs */
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_err(&pdev->dev, "no update irq?\n");
+               return irq;
        }
 
-       status = clk_enable(config->clk);
-       if (status < 0)
-               goto err_clk_put;
+       status = devm_request_irq(&pdev->dev, irq, spear_rtc_irq, 0, pdev->name,
+                       config);
+       if (status) {
+               dev_err(&pdev->dev, "Alarm interrupt IRQ%d already claimed\n",
+                               irq);
+               return status;
+       }
 
-       config->ioaddr = ioremap(res->start, resource_size(res));
+       config->ioaddr = devm_request_and_ioremap(&pdev->dev, res);
        if (!config->ioaddr) {
-               dev_err(&pdev->dev, "ioremap fail\n");
-               status = -ENOMEM;
-               goto err_disable_clock;
+               dev_err(&pdev->dev, "request-ioremap fail\n");
+               return -ENOMEM;
        }
 
+       config->clk = devm_clk_get(&pdev->dev, NULL);
+       if (IS_ERR(config->clk))
+               return PTR_ERR(config->clk);
+
+       status = clk_enable(config->clk);
+       if (status < 0)
+               return status;
+
        spin_lock_init(&config->lock);
        platform_set_drvdata(pdev, config);
 
@@ -401,22 +408,7 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
                                PTR_ERR(config->rtc));
                status = PTR_ERR(config->rtc);
-               goto err_iounmap;
-       }
-
-       /* alarm irqs */
-       irq = platform_get_irq(pdev, 0);
-       if (irq < 0) {
-               dev_err(&pdev->dev, "no update irq?\n");
-               status = irq;
-               goto err_clear_platdata;
-       }
-
-       status = request_irq(irq, spear_rtc_irq, 0, pdev->name, config);
-       if (status) {
-               dev_err(&pdev->dev, "Alarm interrupt IRQ%d already \
-                               claimed\n", irq);
-               goto err_clear_platdata;
+               goto err_disable_clock;
        }
 
        if (!device_can_wakeup(&pdev->dev))
@@ -424,19 +416,9 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)
 
        return 0;
 
-err_clear_platdata:
-       platform_set_drvdata(pdev, NULL);
-       rtc_device_unregister(config->rtc);
-err_iounmap:
-       iounmap(config->ioaddr);
 err_disable_clock:
+       platform_set_drvdata(pdev, NULL);
        clk_disable(config->clk);
-err_clk_put:
-       clk_put(config->clk);
-err_kfree:
-       kfree(config);
-err_release_region:
-       release_mem_region(res->start, resource_size(res));
 
        return status;
 }
@@ -444,24 +426,11 @@ err_release_region:
 static int __devexit spear_rtc_remove(struct platform_device *pdev)
 {
        struct spear_rtc_config *config = platform_get_drvdata(pdev);
-       int irq;
-       struct resource *res;
 
-       /* leave rtc running, but disable irqs */
+       rtc_device_unregister(config->rtc);
        spear_rtc_disable_interrupt(config);
-       device_init_wakeup(&pdev->dev, 0);
-       irq = platform_get_irq(pdev, 0);
-       if (irq)
-               free_irq(irq, pdev);
        clk_disable(config->clk);
-       clk_put(config->clk);
-       iounmap(config->ioaddr);
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (res)
-               release_mem_region(res->start, resource_size(res));
-       platform_set_drvdata(pdev, NULL);
-       rtc_device_unregister(config->rtc);
-       kfree(config);
+       device_init_wakeup(&pdev->dev, 0);
 
        return 0;
 }