|
@@ -366,13 +366,15 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
|
|
|
wdt_mem = request_mem_region(res->start, size, pdev->name);
|
|
|
if (wdt_mem == NULL) {
|
|
|
printk(KERN_INFO PFX "failed to get memory region\n");
|
|
|
- return -ENOENT;
|
|
|
+ ret = -ENOENT;
|
|
|
+ goto err_req;
|
|
|
}
|
|
|
|
|
|
wdt_base = ioremap(res->start, size);
|
|
|
if (wdt_base == 0) {
|
|
|
printk(KERN_INFO PFX "failed to ioremap() region\n");
|
|
|
- return -EINVAL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto err_req;
|
|
|
}
|
|
|
|
|
|
DBG("probe: mapped wdt_base=%p\n", wdt_base);
|
|
@@ -380,22 +382,21 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
|
|
|
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
|
|
if (res == NULL) {
|
|
|
printk(KERN_INFO PFX "failed to get irq resource\n");
|
|
|
- iounmap(wdt_base);
|
|
|
- return -ENOENT;
|
|
|
+ ret = -ENOENT;
|
|
|
+ goto err_map;
|
|
|
}
|
|
|
|
|
|
ret = request_irq(res->start, s3c2410wdt_irq, 0, pdev->name, pdev);
|
|
|
if (ret != 0) {
|
|
|
printk(KERN_INFO PFX "failed to install irq (%d)\n", ret);
|
|
|
- iounmap(wdt_base);
|
|
|
- return ret;
|
|
|
+ goto err_map;
|
|
|
}
|
|
|
|
|
|
wdt_clock = clk_get(&pdev->dev, "watchdog");
|
|
|
if (wdt_clock == NULL) {
|
|
|
printk(KERN_INFO PFX "failed to find watchdog clock source\n");
|
|
|
- iounmap(wdt_base);
|
|
|
- return -ENOENT;
|
|
|
+ ret = -ENOENT;
|
|
|
+ goto err_irq;
|
|
|
}
|
|
|
|
|
|
clk_enable(wdt_clock);
|
|
@@ -418,8 +419,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
|
|
|
if (ret) {
|
|
|
printk (KERN_ERR PFX "cannot register miscdev on minor=%d (%d)\n",
|
|
|
WATCHDOG_MINOR, ret);
|
|
|
- iounmap(wdt_base);
|
|
|
- return ret;
|
|
|
+ goto err_clk;
|
|
|
}
|
|
|
|
|
|
if (tmr_atboot && started == 0) {
|
|
@@ -434,26 +434,36 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+ err_clk:
|
|
|
+ clk_disable(wdt_clock);
|
|
|
+ clk_put(wdt_clock);
|
|
|
+
|
|
|
+ err_irq:
|
|
|
+ free_irq(wdt_irq->start, pdev);
|
|
|
+
|
|
|
+ err_map:
|
|
|
+ iounmap(wdt_base);
|
|
|
+
|
|
|
+ err_req:
|
|
|
+ release_resource(wdt_mem);
|
|
|
+ kfree(wdt_mem);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int s3c2410wdt_remove(struct platform_device *dev)
|
|
|
{
|
|
|
- if (wdt_mem != NULL) {
|
|
|
- release_resource(wdt_mem);
|
|
|
- kfree(wdt_mem);
|
|
|
- wdt_mem = NULL;
|
|
|
- }
|
|
|
+ release_resource(wdt_mem);
|
|
|
+ kfree(wdt_mem);
|
|
|
+ wdt_mem = NULL;
|
|
|
|
|
|
- if (wdt_irq != NULL) {
|
|
|
- free_irq(wdt_irq->start, dev);
|
|
|
- wdt_irq = NULL;
|
|
|
- }
|
|
|
+ free_irq(wdt_irq->start, dev);
|
|
|
+ wdt_irq = NULL;
|
|
|
|
|
|
- if (wdt_clock != NULL) {
|
|
|
- clk_disable(wdt_clock);
|
|
|
- clk_put(wdt_clock);
|
|
|
- wdt_clock = NULL;
|
|
|
- }
|
|
|
+ clk_disable(wdt_clock);
|
|
|
+ clk_put(wdt_clock);
|
|
|
+ wdt_clock = NULL;
|
|
|
|
|
|
iounmap(wdt_base);
|
|
|
misc_deregister(&s3c2410wdt_miscdev);
|