From: Felipe Balbi <felipe.balbi@xxxxxxxxx> Trivial cleanup patch. Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxx> --- drivers/watchdog/omap_wdt.c | 143 +++++++++++++++++++++++++------------------ 1 files changed, 84 insertions(+), 59 deletions(-) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index f21fd94..7700a0a 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -69,11 +69,14 @@ struct omap_wdt_dev { static void omap_wdt_ping(struct omap_wdt_dev *wdev) { void __iomem *base = wdev->base; + /* wait for posted write to complete */ while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) cpu_relax(); + wdt_trgr_pattern = ~wdt_trgr_pattern; __raw_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR)); + /* wait for posted write to complete */ while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) cpu_relax(); @@ -82,12 +85,13 @@ static void omap_wdt_ping(struct omap_wdt_dev *wdev) static void omap_wdt_enable(struct omap_wdt_dev *wdev) { - void __iomem *base; - base = wdev->base; + void __iomem *base = wdev->base; + /* Sequence to enable the watchdog */ __raw_writel(0xBBBB, base + OMAP_WATCHDOG_SPR); while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) cpu_relax(); + __raw_writel(0x4444, base + OMAP_WATCHDOG_SPR); while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) cpu_relax(); @@ -95,12 +99,13 @@ static void omap_wdt_enable(struct omap_wdt_dev *wdev) static void omap_wdt_disable(struct omap_wdt_dev *wdev) { - void __iomem *base; - base = wdev->base; + void __iomem *base = wdev->base; + /* sequence required to disable watchdog */ __raw_writel(0xAAAA, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10) cpu_relax(); + __raw_writel(0x5555, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10) cpu_relax(); @@ -118,12 +123,12 @@ static void omap_wdt_adjust_timeout(unsigned new_timeout) static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) { u32 pre_margin = GET_WLDR_VAL(timer_margin); - void __iomem *base; - base = wdev->base; + void __iomem *base = wdev->base; /* just count up at 32 KHz */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) cpu_relax(); + __raw_writel(pre_margin, base + OMAP_WATCHDOG_LDR); while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) cpu_relax(); @@ -132,13 +137,11 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) /* * Allow only one task to hold it open */ - static int omap_wdt_open(struct inode *inode, struct file *file) { - struct omap_wdt_dev *wdev; - void __iomem *base; - wdev = platform_get_drvdata(omap_wdt_dev); - base = wdev->base; + struct omap_wdt_dev *wdev = platform_get_drvdata(omap_wdt_dev); + void __iomem *base = wdev->base; + if (test_and_set_bit(1, (unsigned long *)&(wdev->omap_wdt_users))) return -EBUSY; @@ -153,6 +156,7 @@ static int omap_wdt_open(struct inode *inode, struct file *file) /* initialize prescaler */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) cpu_relax(); + __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) cpu_relax(); @@ -161,13 +165,14 @@ static int omap_wdt_open(struct inode *inode, struct file *file) omap_wdt_set_timeout(wdev); omap_wdt_enable(wdev); + return nonseekable_open(inode, file); } static int omap_wdt_release(struct inode *inode, struct file *file) { - struct omap_wdt_dev *wdev; - wdev = file->private_data; + struct omap_wdt_dev *wdev = file->private_data; + /* * Shut off the timer unless NOWAYOUT is defined. */ @@ -186,6 +191,7 @@ static int omap_wdt_release(struct inode *inode, struct file *file) printk(KERN_CRIT "omap_wdt: Unexpected close, not stopping!\n"); #endif wdev->omap_wdt_users = 0; + return 0; } @@ -193,11 +199,12 @@ static ssize_t omap_wdt_write(struct file *file, const char __user *data, size_t len, loff_t *ppos) { - struct omap_wdt_dev *wdev; - wdev = file->private_data; + struct omap_wdt_dev *wdev = file->private_data; + /* Refresh LOAD_TIME. */ if (len) omap_wdt_ping(wdev); + return len; } @@ -207,11 +214,13 @@ omap_wdt_ioctl(struct inode *inode, struct file *file, { struct omap_wdt_dev *wdev; int new_margin; + static struct watchdog_info ident = { .identity = "OMAP Watchdog", .options = WDIOF_SETTIMEOUT, .firmware_version = 0, }; + wdev = file->private_data; switch (cmd) { @@ -246,6 +255,7 @@ omap_wdt_ioctl(struct inode *inode, struct file *file, case WDIOC_GETTIMEOUT: return put_user(timer_margin, (int __user *)arg); } + return 0; } @@ -257,31 +267,37 @@ static const struct file_operations omap_wdt_fops = { .release = omap_wdt_release, }; - static int __init omap_wdt_probe(struct platform_device *pdev) { struct resource *res, *mem; - int ret; struct omap_wdt_dev *wdev; + int ret; /* reserve static register mappings */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -ENOENT; + if (!res) { + ret = -ENOENT; + goto err_get_resource; + } - if (omap_wdt_dev) - return -EBUSY; + if (omap_wdt_dev) { + ret - EBUSY; + goto err_busy; + } mem = request_mem_region(res->start, res->end - res->start + 1, pdev->name); - if (mem == NULL) - return -EBUSY; + if (!mem) { + ret = -EBUSY; + goto err_busy; + } wdev = kzalloc(sizeof(struct omap_wdt_dev), GFP_KERNEL); if (!wdev) { ret = -ENOMEM; - goto fail; + goto err_kzalloc; } + wdev->omap_wdt_users = 0; wdev->mem = mem; @@ -290,7 +306,7 @@ static int __init omap_wdt_probe(struct platform_device *pdev) if (IS_ERR(wdev->armwdt_ck)) { ret = PTR_ERR(wdev->armwdt_ck); wdev->armwdt_ck = NULL; - goto fail; + goto err_clk; } } @@ -299,13 +315,13 @@ static int __init omap_wdt_probe(struct platform_device *pdev) if (IS_ERR(wdev->mpu_wdt_ick)) { ret = PTR_ERR(wdev->mpu_wdt_ick); wdev->mpu_wdt_ick = NULL; - goto fail; + goto err_clk; } wdev->mpu_wdt_fck = clk_get(&pdev->dev, "mpu_wdt_fck"); if (IS_ERR(wdev->mpu_wdt_fck)) { ret = PTR_ERR(wdev->mpu_wdt_fck); wdev->mpu_wdt_fck = NULL; - goto fail; + goto err_clk; } } @@ -314,19 +330,19 @@ static int __init omap_wdt_probe(struct platform_device *pdev) if (IS_ERR(wdev->mpu_wdt_ick)) { ret = PTR_ERR(wdev->mpu_wdt_ick); wdev->mpu_wdt_ick = NULL; - goto fail; + goto err_clk; } wdev->mpu_wdt_fck = clk_get(&pdev->dev, "wdt2_fck"); if (IS_ERR(wdev->mpu_wdt_fck)) { ret = PTR_ERR(wdev->mpu_wdt_fck); wdev->mpu_wdt_fck = NULL; - goto fail; + goto err_clk; } } wdev->base = ioremap(res->start, res->end - res->start + 1); if (!wdev->base) { ret = -ENOMEM; - goto fail; + goto err_ioremap; } platform_set_drvdata(pdev, wdev); @@ -341,7 +357,7 @@ static int __init omap_wdt_probe(struct platform_device *pdev) ret = misc_register(&(wdev->omap_wdt_miscdev)); if (ret) - goto fail; + goto err_misc; pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n", __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, @@ -354,29 +370,34 @@ static int __init omap_wdt_probe(struct platform_device *pdev) return 0; -fail: - if (wdev) { - platform_set_drvdata(pdev, NULL); - if (wdev->armwdt_ck) - clk_put(wdev->armwdt_ck); - if (wdev->mpu_wdt_ick) - clk_put(wdev->mpu_wdt_ick); - if (wdev->mpu_wdt_fck) - clk_put(wdev->mpu_wdt_fck); - if (wdev->base) - iounmap(wdev->base); - kfree(wdev); - } - if (mem) { - release_resource(mem); - } +err_misc: + platform_set_drvdata(pdev, NULL); + iounmap(wdev->base); + +err_ioremap: + wdev->base = NULL; + +err_clk: + if (wdev->armwdt_ck) + clk_put(wdev->armwdt_ck); + if (wdev->mpu_wdt_ick) + clk_put(wdev->mpu_wdt_ick); + if (wdev->mpu_wdt_fck) + clk_put(wdev->mpu_wdt_fck); + kfree(wdev); + +err_kzalloc: + release_resource(mem); + +err_busy: +err_get_resource: + return ret; } static void omap_wdt_shutdown(struct platform_device *pdev) { - struct omap_wdt_dev *wdev; - wdev = platform_get_drvdata(pdev); + struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); if (wdev->omap_wdt_users) omap_wdt_disable(wdev); @@ -384,29 +405,33 @@ static void omap_wdt_shutdown(struct platform_device *pdev) static int omap_wdt_remove(struct platform_device *pdev) { - struct omap_wdt_dev *wdev; - wdev = platform_get_drvdata(pdev); + struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); misc_deregister(&(wdev->omap_wdt_miscdev)); release_resource(wdev->mem); platform_set_drvdata(pdev, NULL); + if (wdev->armwdt_ck) { clk_put(wdev->armwdt_ck); wdev->armwdt_ck = NULL; } + if (wdev->mpu_wdt_ick) { clk_put(wdev->mpu_wdt_ick); wdev->mpu_wdt_ick = NULL; } + if (wdev->mpu_wdt_fck) { clk_put(wdev->mpu_wdt_fck); wdev->mpu_wdt_fck = NULL; } + if (wdev->base) iounmap(wdev->base); kfree(wdev); omap_wdt_dev = NULL; + return 0; } @@ -420,34 +445,34 @@ static int omap_wdt_remove(struct platform_device *pdev) static int omap_wdt_suspend(struct platform_device *pdev, pm_message_t state) { - struct omap_wdt_dev *wdev; - wdev = platform_get_drvdata(pdev); + struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); + if (wdev->omap_wdt_users) omap_wdt_disable(wdev); + return 0; } static int omap_wdt_resume(struct platform_device *pdev) { - struct omap_wdt_dev *wdev; - wdev = platform_get_drvdata(pdev); + struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); + if (wdev->omap_wdt_users) { omap_wdt_enable(wdev); omap_wdt_ping(wdev); } + return 0; } - -#else -#define omap_wdt_suspend NULL -#define omap_wdt_resume NULL #endif static struct platform_driver omap_wdt_driver = { .probe = omap_wdt_probe, .remove = omap_wdt_remove, +#ifdef CONFIG_PM .shutdown = omap_wdt_shutdown, .suspend = omap_wdt_suspend, +#endif .resume = omap_wdt_resume, .driver = { .owner = THIS_MODULE, -- 1.6.0.1.196.g01914 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html