scsi: aacraid: Fix udev inquiry race condition
[pandora-kernel.git] / drivers / watchdog / pnx4008_wdt.c
index c7cf4cb..6149332 100644 (file)
@@ -254,7 +254,6 @@ static struct miscdevice pnx4008_wdt_miscdev = {
 static int __devinit pnx4008_wdt_probe(struct platform_device *pdev)
 {
        int ret = 0, size;
-       struct resource *res;
 
        if (heartbeat < 1 || heartbeat > MAX_HEARTBEAT)
                heartbeat = DEFAULT_HEARTBEAT;
@@ -262,42 +261,42 @@ static int __devinit pnx4008_wdt_probe(struct platform_device *pdev)
        printk(KERN_INFO MODULE_NAME
                "PNX4008 Watchdog Timer: heartbeat %d sec\n", heartbeat);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (res == NULL) {
+       wdt_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (wdt_mem == NULL) {
                printk(KERN_INFO MODULE_NAME
                        "failed to get memory region resouce\n");
                return -ENOENT;
        }
 
-       size = resource_size(res);
-       wdt_mem = request_mem_region(res->start, size, pdev->name);
+       size = resource_size(wdt_mem);
 
-       if (wdt_mem == NULL) {
+       if (!request_mem_region(wdt_mem->start, size, pdev->name)) {
                printk(KERN_INFO MODULE_NAME "failed to get memory region\n");
                return -ENOENT;
        }
-       wdt_base = (void __iomem *)IO_ADDRESS(res->start);
+       wdt_base = (void __iomem *)IO_ADDRESS(wdt_mem->start);
 
        wdt_clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(wdt_clk)) {
                ret = PTR_ERR(wdt_clk);
-               release_resource(wdt_mem);
-               kfree(wdt_mem);
+               release_mem_region(wdt_mem->start, size);
+               wdt_mem = NULL;
                goto out;
        }
 
        ret = clk_enable(wdt_clk);
        if (ret) {
-               release_resource(wdt_mem);
-               kfree(wdt_mem);
+               release_mem_region(wdt_mem->start, size);
+               wdt_mem = NULL;
+               clk_put(wdt_clk);
                goto out;
        }
 
        ret = misc_register(&pnx4008_wdt_miscdev);
        if (ret < 0) {
                printk(KERN_ERR MODULE_NAME "cannot register misc device\n");
-               release_resource(wdt_mem);
-               kfree(wdt_mem);
+               release_mem_region(wdt_mem->start, size);
+               wdt_mem = NULL;
                clk_disable(wdt_clk);
                clk_put(wdt_clk);
        } else {
@@ -320,8 +319,7 @@ static int __devexit pnx4008_wdt_remove(struct platform_device *pdev)
        clk_put(wdt_clk);
 
        if (wdt_mem) {
-               release_resource(wdt_mem);
-               kfree(wdt_mem);
+               release_mem_region(wdt_mem->start, resource_size(wdt_mem));
                wdt_mem = NULL;
        }
        return 0;