* [PATCH 0/3] watchdog fixes @ 2008-09-23 11:33 Felipe Balbi 2008-09-23 11:33 ` [PATCH 1/3] watchdog: sync mainline changes Felipe Balbi 2008-09-23 12:59 ` [PATCH 0/3] watchdog fixes Tony Lindgren 0 siblings, 2 replies; 5+ messages in thread From: Felipe Balbi @ 2008-09-23 11:33 UTC (permalink / raw) To: Tony Lindgren; +Cc: linux-omap, Wim Van Sebroeck, Felipe Balbi Hi Tony, following we have omap versions of the watchdog patches. As you can see in [1], they're already applied to Wim's tree and in fact, you only need the first patch from this series; the others can be fetched from Wim. Felipe Balbi (3): watchdog: sync mainline changes watchdog: another ioremap() fix watchdog: cleanup a bit omap_wdt.c drivers/watchdog/omap_wdt.c | 223 +++++++++++++++++++++++++------------------ 1 files changed, 132 insertions(+), 91 deletions(-) ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/3] watchdog: sync mainline changes 2008-09-23 11:33 [PATCH 0/3] watchdog fixes Felipe Balbi @ 2008-09-23 11:33 ` Felipe Balbi 2008-09-23 11:33 ` [PATCH 2/3] watchdog: another ioremap() fix Felipe Balbi 2008-09-23 12:59 ` [PATCH 0/3] watchdog fixes Tony Lindgren 1 sibling, 1 reply; 5+ messages in thread From: Felipe Balbi @ 2008-09-23 11:33 UTC (permalink / raw) To: Tony Lindgren; +Cc: linux-omap, Wim Van Sebroeck, Felipe Balbi Some changes to omap_wdt.c were lost due to, probably, mis-merges and developers working separately on linux-omap and mainline. Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/watchdog/omap_wdt.c | 43 +++++++++++++++++++++++++++---------------- 1 files changed, 27 insertions(+), 16 deletions(-) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index b111dec..12b0771 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -40,11 +40,10 @@ #include <linux/moduleparam.h> #include <linux/clk.h> -#include <asm/io.h> -#include <asm/uaccess.h> +#include <linux/bitops.h> +#include <linux/io.h> +#include <linux/uaccess.h> #include <mach/hardware.h> -#include <asm/bitops.h> - #include <mach/prcm.h> #include "omap_wdt.h" @@ -56,6 +55,8 @@ module_param(timer_margin, uint, 0); MODULE_PARM_DESC(timer_margin, "initial watchdog timeout (in seconds)"); static unsigned int wdt_trgr_pattern = 0x1234; +static spinlock_t wdt_lock; + struct omap_wdt_dev { void __iomem *base; /* physical */ struct device *dev; @@ -190,25 +191,26 @@ static int omap_wdt_release(struct inode *inode, struct file *file) return 0; } -static ssize_t -omap_wdt_write(struct file *file, const char __user *data, +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; /* Refresh LOAD_TIME. */ - if (len) + if (len) { + spin_lock(&wdt_lock); omap_wdt_ping(wdev); + spin_unlock(&wdt_lock); + } return len; } -static int -omap_wdt_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) +static long omap_wdt_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) { struct omap_wdt_dev *wdev; int new_margin; - static struct watchdog_info ident = { + static const struct watchdog_info ident = { .identity = "OMAP Watchdog", .options = WDIOF_SETTIMEOUT, .firmware_version = 0, @@ -216,8 +218,6 @@ omap_wdt_ioctl(struct inode *inode, struct file *file, wdev = file->private_data; switch (cmd) { - default: - return -ENOTTY; case WDIOC_GETSUPPORT: return copy_to_user((struct watchdog_info __user *)arg, &ident, sizeof(ident)); @@ -231,21 +231,27 @@ omap_wdt_ioctl(struct inode *inode, struct file *file, return put_user(omap_prcm_get_reset_sources(), (int __user *)arg); case WDIOC_KEEPALIVE: + spin_lock(&wdt_lock); omap_wdt_ping(wdev); + spin_unlock(&wdt_lock); return 0; case WDIOC_SETTIMEOUT: if (get_user(new_margin, (int __user *)arg)) return -EFAULT; omap_wdt_adjust_timeout(new_margin); + spin_lock(&wdt_lock); omap_wdt_disable(wdev); omap_wdt_set_timeout(wdev); omap_wdt_enable(wdev); omap_wdt_ping(wdev); + spin_unlock(&wdt_lock); /* Fall */ case WDIOC_GETTIMEOUT: return put_user(timer_margin, (int __user *)arg); + default: + return -ENOTTY; } return 0; } @@ -253,7 +259,7 @@ omap_wdt_ioctl(struct inode *inode, struct file *file, static const struct file_operations omap_wdt_fops = { .owner = THIS_MODULE, .write = omap_wdt_write, - .ioctl = omap_wdt_ioctl, + .unlocked_ioctl = omap_wdt_ioctl, .open = omap_wdt_open, .release = omap_wdt_release, }; @@ -362,7 +368,7 @@ fail: kfree(wdev); } if (mem) { - release_resource(mem); + release_mem_region(res->start, res->end - res->start + 1); } return ret; } @@ -380,9 +386,13 @@ static int omap_wdt_remove(struct platform_device *pdev) { struct omap_wdt_dev *wdev; wdev = platform_get_drvdata(pdev); + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + if (!res) + return -ENOENT; misc_deregister(&(wdev->omap_wdt_miscdev)); - release_resource(wdev->mem); + release_mem_region(res->start, res->end - res->start + 1); platform_set_drvdata(pdev, NULL); if (wdev->armwdt_ck) { clk_put(wdev->armwdt_ck); @@ -448,6 +458,7 @@ static struct platform_driver omap_wdt_driver = { static int __init omap_wdt_init(void) { + spin_lock_init(&wdt_lock); return platform_driver_register(&omap_wdt_driver); } -- 1.6.0.1.308.gede4c ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/3] watchdog: another ioremap() fix 2008-09-23 11:33 ` [PATCH 1/3] watchdog: sync mainline changes Felipe Balbi @ 2008-09-23 11:33 ` Felipe Balbi 2008-09-23 11:33 ` [PATCH 3/3] watchdog: cleanup a bit omap_wdt.c Felipe Balbi 0 siblings, 1 reply; 5+ messages in thread From: Felipe Balbi @ 2008-09-23 11:33 UTC (permalink / raw) To: Tony Lindgren; +Cc: linux-omap, Wim Van Sebroeck, Felipe Balbi, George G. Davis convert to use ioremap() and __raw_{read/write} friends. Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> Signed-off-by: George G. Davis <gdavis@mvista.com> Signed-off-by: Wim Van Sebroeck <wim@iguana.be> --- drivers/watchdog/omap_wdt.c | 50 +++++++++++++++++++++++++------------------ 1 files changed, 29 insertions(+), 21 deletions(-) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 12b0771..cfb101e 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -72,12 +72,12 @@ static void omap_wdt_ping(struct omap_wdt_dev *wdev) { void __iomem *base = wdev->base; /* wait for posted write to complete */ - while ((omap_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) cpu_relax(); wdt_trgr_pattern = ~wdt_trgr_pattern; - omap_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR)); + __raw_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR)); /* wait for posted write to complete */ - while ((omap_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) cpu_relax(); /* reloaded WCRR from WLDR */ } @@ -87,11 +87,11 @@ static void omap_wdt_enable(struct omap_wdt_dev *wdev) void __iomem *base; base = wdev->base; /* Sequence to enable the watchdog */ - omap_writel(0xBBBB, base + OMAP_WATCHDOG_SPR); - while ((omap_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) + __raw_writel(0xBBBB, base + OMAP_WATCHDOG_SPR); + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) cpu_relax(); - omap_writel(0x4444, base + OMAP_WATCHDOG_SPR); - while ((omap_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) + __raw_writel(0x4444, base + OMAP_WATCHDOG_SPR); + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x10) cpu_relax(); } @@ -100,11 +100,11 @@ static void omap_wdt_disable(struct omap_wdt_dev *wdev) void __iomem *base; base = wdev->base; /* sequence required to disable watchdog */ - omap_writel(0xAAAA, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ - while (omap_readl(base + OMAP_WATCHDOG_WPS) & 0x10) + __raw_writel(0xAAAA, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10) cpu_relax(); - omap_writel(0x5555, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ - while (omap_readl(base + OMAP_WATCHDOG_WPS) & 0x10) + __raw_writel(0x5555, base + OMAP_WATCHDOG_SPR); /* TIMER_MODE */ + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x10) cpu_relax(); } @@ -124,10 +124,10 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) base = wdev->base; /* just count up at 32 KHz */ - while (omap_readl(base + OMAP_WATCHDOG_WPS) & 0x04) + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) cpu_relax(); - omap_writel(pre_margin, base + OMAP_WATCHDOG_LDR); - while (omap_readl(base + OMAP_WATCHDOG_WPS) & 0x04) + __raw_writel(pre_margin, base + OMAP_WATCHDOG_LDR); + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) cpu_relax(); } @@ -153,10 +153,10 @@ static int omap_wdt_open(struct inode *inode, struct file *file) } /* initialize prescaler */ - while (omap_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) cpu_relax(); - omap_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); - while (omap_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) cpu_relax(); file->private_data = (void *) wdev; @@ -225,7 +225,7 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd, return put_user(0, (int __user *)arg); case WDIOC_GETBOOTSTATUS: if (cpu_is_omap16xx()) - return put_user(omap_readw(ARM_SYSST), + return put_user(__raw_readw(ARM_SYSST), (int __user *)arg); if (cpu_is_omap24xx()) return put_user(omap_prcm_get_reset_sources(), @@ -330,7 +330,12 @@ static int __init omap_wdt_probe(struct platform_device *pdev) goto fail; } } - wdev->base = (void __iomem *) (mem->start); + wdev->base = ioremap(res->start, res->end - res->start + 1); + if (!wdev->base) { + ret = -ENOMEM; + goto fail; + } + platform_set_drvdata(pdev, wdev); omap_wdt_disable(wdev); @@ -346,11 +351,11 @@ static int __init omap_wdt_probe(struct platform_device *pdev) goto fail; pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n", - omap_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, + __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, timer_margin); /* autogate OCP interface clock */ - omap_writel(0x01, wdev->base + OMAP_WATCHDOG_SYS_CONFIG); + __raw_writel(0x01, wdev->base + OMAP_WATCHDOG_SYS_CONFIG); omap_wdt_dev = pdev; @@ -365,6 +370,7 @@ fail: clk_put(wdev->mpu_wdt_ick); if (wdev->mpu_wdt_fck) clk_put(wdev->mpu_wdt_fck); + iounmap(wdev->base); kfree(wdev); } if (mem) { @@ -406,6 +412,8 @@ static int omap_wdt_remove(struct platform_device *pdev) clk_put(wdev->mpu_wdt_fck); wdev->mpu_wdt_fck = NULL; } + iounmap(wdev->base); + kfree(wdev); omap_wdt_dev = NULL; return 0; -- 1.6.0.1.308.gede4c ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/3] watchdog: cleanup a bit omap_wdt.c 2008-09-23 11:33 ` [PATCH 2/3] watchdog: another ioremap() fix Felipe Balbi @ 2008-09-23 11:33 ` Felipe Balbi 0 siblings, 0 replies; 5+ messages in thread From: Felipe Balbi @ 2008-09-23 11:33 UTC (permalink / raw) To: Tony Lindgren; +Cc: linux-omap, Wim Van Sebroeck, Felipe Balbi Trivial cleanup patch. Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> --- drivers/watchdog/omap_wdt.c | 136 +++++++++++++++++++++++++------------------ 1 files changed, 79 insertions(+), 57 deletions(-) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index cfb101e..8c02fb0 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -1,5 +1,5 @@ /* - * linux/drivers/watchdog/omap_wdt.c + * omap_wdt.c * * Watchdog driver for the TI OMAP 16xx & 24xx/34xx 32KHz (non-secure) watchdog * @@ -39,7 +39,6 @@ #include <linux/platform_device.h> #include <linux/moduleparam.h> #include <linux/clk.h> - #include <linux/bitops.h> #include <linux/io.h> #include <linux/uaccess.h> @@ -71,11 +70,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(); @@ -84,12 +86,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(); @@ -97,12 +100,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(); @@ -120,12 +124,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(); @@ -134,13 +138,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; @@ -155,6 +157,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(); @@ -163,13 +166,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. */ @@ -188,14 +192,15 @@ 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; } 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) { spin_lock(&wdt_lock); @@ -215,6 +220,7 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd, .options = WDIOF_SETTIMEOUT, .firmware_version = 0, }; + wdev = file->private_data; switch (cmd) { @@ -253,7 +259,6 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd, default: return -ENOTTY; } - return 0; } static const struct file_operations omap_wdt_fops = { @@ -264,31 +269,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; @@ -297,7 +308,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; } } @@ -306,13 +317,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; } } @@ -321,19 +332,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); @@ -348,7 +359,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, @@ -361,28 +372,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); - iounmap(wdev->base); - kfree(wdev); - } - if (mem) { - release_mem_region(res->start, res->end - res->start + 1); - } +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_mem_region(res->start, res->end - res->start + 1); + +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); @@ -390,8 +407,7 @@ 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); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) @@ -400,14 +416,17 @@ static int omap_wdt_remove(struct platform_device *pdev) misc_deregister(&(wdev->omap_wdt_miscdev)); release_mem_region(res->start, res->end - res->start + 1); 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; @@ -416,6 +435,7 @@ static int omap_wdt_remove(struct platform_device *pdev) kfree(wdev); omap_wdt_dev = NULL; + return 0; } @@ -429,21 +449,23 @@ 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; } -- 1.6.0.1.308.gede4c ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 0/3] watchdog fixes 2008-09-23 11:33 [PATCH 0/3] watchdog fixes Felipe Balbi 2008-09-23 11:33 ` [PATCH 1/3] watchdog: sync mainline changes Felipe Balbi @ 2008-09-23 12:59 ` Tony Lindgren 1 sibling, 0 replies; 5+ messages in thread From: Tony Lindgren @ 2008-09-23 12:59 UTC (permalink / raw) To: Felipe Balbi; +Cc: linux-omap, Wim Van Sebroeck * Felipe Balbi <felipe.balbi@nokia.com> [080923 14:34]: > Hi Tony, > > following we have omap versions of the watchdog patches. > > As you can see in [1], they're already applied to Wim's > tree and in fact, you only need the first patch from this > series; the others can be fetched from Wim. > > Felipe Balbi (3): > watchdog: sync mainline changes > watchdog: another ioremap() fix > watchdog: cleanup a bit omap_wdt.c > > drivers/watchdog/omap_wdt.c | 223 +++++++++++++++++++++++++------------------ > 1 files changed, 132 insertions(+), 91 deletions(-) Thanks, pushed them to l-o tree while waiting for them to fall down from them mainline kernel. Good job Felipe, that's one less driver to merge! Tony ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-09-23 12:59 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-09-23 11:33 [PATCH 0/3] watchdog fixes Felipe Balbi 2008-09-23 11:33 ` [PATCH 1/3] watchdog: sync mainline changes Felipe Balbi 2008-09-23 11:33 ` [PATCH 2/3] watchdog: another ioremap() fix Felipe Balbi 2008-09-23 11:33 ` [PATCH 3/3] watchdog: cleanup a bit omap_wdt.c Felipe Balbi 2008-09-23 12:59 ` [PATCH 0/3] watchdog fixes Tony Lindgren
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox