* [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker Hello, The following patches based on the 3.5-rc6 from Wim, which are based on: 1 ) bootstatus fix for omap3, 2 ) omap-wdt framework update cater for the current framework as Shubhrajyoti comments mentioned. Regards, Zumeng Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) Zumeng Chen (3): Watchdog: Omap: Changes for the new watchdog framework Watchdog: Omap: select watchdog core for framework change Watchdog: Omap: get the bootstatus for OMAP2Plus arch/arm/mach-omap2/prcm.c | 5 +- drivers/watchdog/Kconfig | 1 + drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- drivers/watchdog/omap_wdt.h | 5 + 4 files changed, 133 insertions(+), 216 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: linux-arm-kernel Hello, The following patches based on the 3.5-rc6 from Wim, which are based on: 1 ) bootstatus fix for omap3, 2 ) omap-wdt framework update cater for the current framework as Shubhrajyoti comments mentioned. Regards, Zumeng Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) Zumeng Chen (3): Watchdog: Omap: Changes for the new watchdog framework Watchdog: Omap: select watchdog core for framework change Watchdog: Omap: get the bootstatus for OMAP2Plus arch/arm/mach-omap2/prcm.c | 5 +- drivers/watchdog/Kconfig | 1 + drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- drivers/watchdog/omap_wdt.h | 5 + 4 files changed, 133 insertions(+), 216 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker Hello, The following patches based on the 3.5-rc6 from Wim, which are based on: 1 ) bootstatus fix for omap3, 2 ) omap-wdt framework update cater for the current framework as Shubhrajyoti comments mentioned. Regards, Zumeng Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) Zumeng Chen (3): Watchdog: Omap: Changes for the new watchdog framework Watchdog: Omap: select watchdog core for framework change Watchdog: Omap: get the bootstatus for OMAP2Plus arch/arm/mach-omap2/prcm.c | 5 +- drivers/watchdog/Kconfig | 1 + drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- drivers/watchdog/omap_wdt.h | 5 + 4 files changed, 133 insertions(+), 216 deletions(-) ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 1/3] Watchdog: Omap: Changes for the new watchdog framework 2012-07-09 4:39 ` Zumeng Chen (?) @ 2012-07-09 4:39 ` Zumeng Chen -1 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker This patch implements the current watchdog framework for OMAP WDTimer, which factored out the common components, so the driver can just focus on the hardware related parts. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- drivers/watchdog/omap_wdt.h | 5 + 2 files changed, 128 insertions(+), 215 deletions(-) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 8285d65..df9ed78 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -24,6 +24,9 @@ * * Copyright (c) 2005 David Brownell * Use the driver model and standard identifiers; handle bigger timeouts. + * + * Copyright (c) 2012 WindRiver + * Changes cater for the current watchdog framework. */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -33,7 +36,6 @@ #include <linux/kernel.h> #include <linux/fs.h> #include <linux/mm.h> -#include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/reboot.h> #include <linux/init.h> @@ -50,8 +52,6 @@ #include "omap_wdt.h" -static struct platform_device *omap_wdt_dev; - static unsigned timer_margin; module_param(timer_margin, uint, 0); MODULE_PARM_DESC(timer_margin, "initial watchdog timeout (in seconds)"); @@ -59,32 +59,14 @@ MODULE_PARM_DESC(timer_margin, "initial watchdog timeout (in seconds)"); static unsigned int wdt_trgr_pattern = 0x1234; static DEFINE_SPINLOCK(wdt_lock); -struct omap_wdt_dev { +struct omap_wdt_drvdata { + struct watchdog_device wdt; void __iomem *base; /* physical */ struct device *dev; - int omap_wdt_users; struct resource *mem; - struct miscdevice omap_wdt_miscdev; }; -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(); - /* reloaded WCRR from WLDR */ -} - -static void omap_wdt_enable(struct omap_wdt_dev *wdev) +static void omap_wdt_enable(struct omap_wdt_drvdata *wdev) { void __iomem *base = wdev->base; @@ -98,7 +80,7 @@ static void omap_wdt_enable(struct omap_wdt_dev *wdev) cpu_relax(); } -static void omap_wdt_disable(struct omap_wdt_dev *wdev) +static void omap_wdt_disable(struct omap_wdt_drvdata *wdev) { void __iomem *base = wdev->base; @@ -121,12 +103,19 @@ static void omap_wdt_adjust_timeout(unsigned new_timeout) timer_margin = new_timeout; } -static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) +static int omap_wdt_set_timeout(struct watchdog_device *wdt_dev, + unsigned int new_timeout) { - u32 pre_margin = GET_WLDR_VAL(timer_margin); - void __iomem *base = wdev->base; + u32 pre_margin; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; + + pm_runtime_get_sync(omap_wdev->dev); + omap_wdt_disable(omap_wdev); - pm_runtime_get_sync(wdev->dev); + /* adjust timeout based on the new timeout */ + omap_wdt_adjust_timeout(new_timeout); + pre_margin = GET_WLDR_VAL(timer_margin); /* just count up at 32 KHz */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) @@ -136,147 +125,87 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) cpu_relax(); - pm_runtime_put_sync(wdev->dev); + pm_runtime_put_sync(omap_wdev->dev); + return 0; } -/* - * Allow only one task to hold it open - */ -static int omap_wdt_open(struct inode *inode, struct file *file) +static int omap_wdt_ping(struct watchdog_device *wdt_dev) { - 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; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; - pm_runtime_get_sync(wdev->dev); - - /* initialize prescaler */ - while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) - cpu_relax(); + pm_runtime_get_sync(omap_wdev->dev); + spin_lock(&wdt_lock); - __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); - while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + /* wait for posted write to complete */ + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) cpu_relax(); - file->private_data = (void *) wdev; + wdt_trgr_pattern = ~wdt_trgr_pattern; + __raw_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR)); - omap_wdt_set_timeout(wdev); - omap_wdt_ping(wdev); /* trigger loading of new timeout value */ - omap_wdt_enable(wdev); + /* wait for posted write to complete */ + /* reloaded WCRR from WLDR */ + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) + cpu_relax(); - pm_runtime_put_sync(wdev->dev); + spin_unlock(&wdt_lock); + pm_runtime_put_sync(omap_wdev->dev); - return nonseekable_open(inode, file); + return 0; } -static int omap_wdt_release(struct inode *inode, struct file *file) +static int omap_wdt_start(struct watchdog_device *wdt_dev) { - struct omap_wdt_dev *wdev = file->private_data; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; - /* - * Shut off the timer unless NOWAYOUT is defined. - */ -#ifndef CONFIG_WATCHDOG_NOWAYOUT - pm_runtime_get_sync(wdev->dev); + pm_runtime_get_sync(omap_wdev->dev); + /* initialize prescaler */ + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + cpu_relax(); - omap_wdt_disable(wdev); + __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + cpu_relax(); - pm_runtime_put_sync(wdev->dev); -#else - pr_crit("Unexpected close, not stopping!\n"); -#endif - wdev->omap_wdt_users = 0; + omap_wdt_set_timeout(&omap_wdev->wdt, timer_margin); + omap_wdt_enable(omap_wdev); + pm_runtime_put_sync(omap_wdev->dev); return 0; } -static ssize_t omap_wdt_write(struct file *file, const char __user *data, - size_t len, loff_t *ppos) +static int omap_wdt_stop(struct watchdog_device *wdt_dev) { - struct omap_wdt_dev *wdev = file->private_data; - - /* Refresh LOAD_TIME. */ - if (len) { - pm_runtime_get_sync(wdev->dev); - spin_lock(&wdt_lock); - omap_wdt_ping(wdev); - spin_unlock(&wdt_lock); - pm_runtime_put_sync(wdev->dev); - } - return len; -} + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); -static long omap_wdt_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct omap_wdt_dev *wdev; - int new_margin; - static const struct watchdog_info ident = { - .identity = "OMAP Watchdog", - .options = WDIOF_SETTIMEOUT, - .firmware_version = 0, - }; - - wdev = file->private_data; - - switch (cmd) { - case WDIOC_GETSUPPORT: - return copy_to_user((struct watchdog_info __user *)arg, &ident, - sizeof(ident)); - case WDIOC_GETSTATUS: - return put_user(0, (int __user *)arg); - case WDIOC_GETBOOTSTATUS: - if (cpu_is_omap16xx()) - return put_user(__raw_readw(ARM_SYSST), - (int __user *)arg); - if (cpu_is_omap24xx()) - return put_user(omap_prcm_get_reset_sources(), - (int __user *)arg); - return put_user(0, (int __user *)arg); - case WDIOC_KEEPALIVE: - pm_runtime_get_sync(wdev->dev); - spin_lock(&wdt_lock); - omap_wdt_ping(wdev); - spin_unlock(&wdt_lock); - pm_runtime_put_sync(wdev->dev); - return 0; - case WDIOC_SETTIMEOUT: - if (get_user(new_margin, (int __user *)arg)) - return -EFAULT; - omap_wdt_adjust_timeout(new_margin); - - pm_runtime_get_sync(wdev->dev); - 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); - pm_runtime_put_sync(wdev->dev); - /* Fall */ - case WDIOC_GETTIMEOUT: - return put_user(timer_margin, (int __user *)arg); - default: - return -ENOTTY; - } + pm_runtime_get_sync(omap_wdev->dev); + omap_wdt_disable(omap_wdev); + pm_runtime_put_sync(omap_wdev->dev); + + return 0; } -static const struct file_operations omap_wdt_fops = { +static const struct watchdog_ops omap_wdt_ops = { .owner = THIS_MODULE, - .write = omap_wdt_write, - .unlocked_ioctl = omap_wdt_ioctl, - .open = omap_wdt_open, - .release = omap_wdt_release, - .llseek = no_llseek, + .start = omap_wdt_start, + .stop = omap_wdt_stop, + .ping = omap_wdt_ping, + .set_timeout = omap_wdt_set_timeout, +}; + +static const struct watchdog_info omap_wdt_info = { + .options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | + WDIOF_CARDRESET, + .identity = "Omap Watchdog", }; static int __devinit omap_wdt_probe(struct platform_device *pdev) { + struct omap_wdt_drvdata *omap_drvdata; + struct watchdog_device *omap_wdev; struct resource *res, *mem; - struct omap_wdt_dev *wdev; int ret; /* reserve static register mappings */ @@ -286,68 +215,65 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) goto err_get_resource; } - if (omap_wdt_dev) { - ret = -EBUSY; - goto err_busy; - } - mem = request_mem_region(res->start, resource_size(res), pdev->name); if (!mem) { ret = -EBUSY; goto err_busy; } - wdev = kzalloc(sizeof(struct omap_wdt_dev), GFP_KERNEL); - if (!wdev) { + omap_drvdata = devm_kzalloc(&pdev->dev, sizeof(struct omap_wdt_drvdata), + GFP_KERNEL); + if (!omap_drvdata) { + dev_err(&pdev->dev, "Unable to alloacate watchdog device\n"); ret = -ENOMEM; goto err_kzalloc; } - wdev->omap_wdt_users = 0; - wdev->mem = mem; - wdev->dev = &pdev->dev; + omap_drvdata->dev = &pdev->dev; + omap_wdev = &omap_drvdata->wdt; + omap_wdev->info = &omap_wdt_info; + omap_wdev->ops = &omap_wdt_ops; + omap_wdev->timeout = TIMER_MARGIN_DEFAULT; + omap_wdev->min_timeout = 1; + omap_wdev->max_timeout = TIMER_MARGIN_MAX; +#ifdef CONFIG_WATCHDOG_NOWAYOUT + watchdog_set_nowayout(omap_wdev, true); +#endif + watchdog_set_drvdata(omap_wdev, omap_drvdata); - wdev->base = ioremap(res->start, resource_size(res)); - if (!wdev->base) { + omap_drvdata->base = ioremap(res->start, resource_size(res)); + if (!omap_drvdata->base) { ret = -ENOMEM; goto err_ioremap; } - platform_set_drvdata(pdev, wdev); - - pm_runtime_enable(wdev->dev); - pm_runtime_get_sync(wdev->dev); - - omap_wdt_disable(wdev); - omap_wdt_adjust_timeout(timer_margin); - - wdev->omap_wdt_miscdev.parent = &pdev->dev; - wdev->omap_wdt_miscdev.minor = WATCHDOG_MINOR; - wdev->omap_wdt_miscdev.name = "watchdog"; - wdev->omap_wdt_miscdev.fops = &omap_wdt_fops; - - ret = misc_register(&(wdev->omap_wdt_miscdev)); - if (ret) - goto err_misc; - - pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n", - __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, - timer_margin); - - pm_runtime_put_sync(wdev->dev); - - omap_wdt_dev = pdev; + ret = watchdog_register_device(&omap_drvdata->wdt); + if (ret < 0) + goto err_register_wd; + + pm_runtime_enable(&pdev->dev); + pm_runtime_get_sync(&pdev->dev); + omap_wdt_disable(omap_drvdata); + pm_runtime_put_sync(&pdev->dev); + platform_set_drvdata(pdev, omap_drvdata); + + /* For omap16xx we just keep it original as-is */ + if (cpu_is_omap16xx()) + omap_wdev->bootstatus = __raw_readw(ARM_SYSST); + else + omap_wdev->bootstatus = (omap_prcm_get_reset_sources() & 0x10) + >> OMAP3_PRM_RSTST_WD_BIT; + pr_info("OMAP WDTimer Rev 0x%02x: Initial timeout %dsec status= 0x%x\n", + __raw_readl(omap_drvdata->base + OMAP_WATCHDOG_REV) + & 0xFF, timer_margin, omap_wdev->bootstatus); return 0; -err_misc: - pm_runtime_disable(wdev->dev); - platform_set_drvdata(pdev, NULL); - iounmap(wdev->base); +err_register_wd: + iounmap(omap_drvdata->base); err_ioremap: - wdev->base = NULL; - kfree(wdev); + kfree(omap_drvdata); err_kzalloc: release_mem_region(res->start, resource_size(res)); @@ -358,34 +284,19 @@ err_get_resource: return ret; } -static void omap_wdt_shutdown(struct platform_device *pdev) -{ - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); - - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_disable(wdev); - pm_runtime_put_sync(wdev->dev); - } -} - static int __devexit omap_wdt_remove(struct platform_device *pdev) { - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - pm_runtime_disable(wdev->dev); - if (!res) - return -ENOENT; + pm_runtime_disable(&pdev->dev); - misc_deregister(&(wdev->omap_wdt_miscdev)); release_mem_region(res->start, resource_size(res)); platform_set_drvdata(pdev, NULL); - iounmap(wdev->base); + iounmap(omap_wdev->base); - kfree(wdev); - omap_wdt_dev = NULL; + kfree(omap_wdev); return 0; } @@ -400,12 +311,12 @@ static int __devexit 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 = platform_get_drvdata(pdev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_disable(wdev); - pm_runtime_put_sync(wdev->dev); + if (test_bit(WDOG_DEV_OPEN, &omap_wdev->wdt.status)) { + pm_runtime_get_sync(&pdev->dev); + omap_wdt_disable(omap_wdev); + pm_runtime_put_sync(&pdev->dev); } return 0; @@ -413,13 +324,12 @@ static int omap_wdt_suspend(struct platform_device *pdev, pm_message_t state) static int omap_wdt_resume(struct platform_device *pdev) { - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); - - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_enable(wdev); - omap_wdt_ping(wdev); - pm_runtime_put_sync(wdev->dev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); + if (test_bit(WDOG_DEV_OPEN, &omap_wdev->wdt.status)) { + pm_runtime_get_sync(&pdev->dev); + omap_wdt_enable(omap_wdev); + omap_wdt_ping(&omap_wdev->wdt); + pm_runtime_put_sync(&pdev->dev); } return 0; @@ -433,7 +343,6 @@ static int omap_wdt_resume(struct platform_device *pdev) static struct platform_driver omap_wdt_driver = { .probe = omap_wdt_probe, .remove = __devexit_p(omap_wdt_remove), - .shutdown = omap_wdt_shutdown, .suspend = omap_wdt_suspend, .resume = omap_wdt_resume, .driver = { @@ -446,5 +355,4 @@ module_platform_driver(omap_wdt_driver); MODULE_AUTHOR("George G. Davis"); MODULE_LICENSE("GPL"); -MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); MODULE_ALIAS("platform:omap_wdt"); diff --git a/drivers/watchdog/omap_wdt.h b/drivers/watchdog/omap_wdt.h index 09b774c..cf5f037 100644 --- a/drivers/watchdog/omap_wdt.h +++ b/drivers/watchdog/omap_wdt.h @@ -51,4 +51,9 @@ #define PTV 0 /* prescale */ #define GET_WLDR_VAL(secs) (0xffffffff - ((secs) * (32768/(1<<PTV))) + 1) +/* MPU_WD_RST bit in PRM_RSTST show Omap WDTimer reset event. + * 0x0 = 0x0 : No watchdog reset. + * 0x1 = 0x1 : watchdog reset has occurred. */ +#define OMAP3_PRM_RSTST_WD_BIT 4 + #endif /* _OMAP_WATCHDOG_H */ -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 1/3] Watchdog: Omap: Changes for the new watchdog framework @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: linux-arm-kernel This patch implements the current watchdog framework for OMAP WDTimer, which factored out the common components, so the driver can just focus on the hardware related parts. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- drivers/watchdog/omap_wdt.h | 5 + 2 files changed, 128 insertions(+), 215 deletions(-) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 8285d65..df9ed78 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -24,6 +24,9 @@ * * Copyright (c) 2005 David Brownell * Use the driver model and standard identifiers; handle bigger timeouts. + * + * Copyright (c) 2012 WindRiver + * Changes cater for the current watchdog framework. */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -33,7 +36,6 @@ #include <linux/kernel.h> #include <linux/fs.h> #include <linux/mm.h> -#include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/reboot.h> #include <linux/init.h> @@ -50,8 +52,6 @@ #include "omap_wdt.h" -static struct platform_device *omap_wdt_dev; - static unsigned timer_margin; module_param(timer_margin, uint, 0); MODULE_PARM_DESC(timer_margin, "initial watchdog timeout (in seconds)"); @@ -59,32 +59,14 @@ MODULE_PARM_DESC(timer_margin, "initial watchdog timeout (in seconds)"); static unsigned int wdt_trgr_pattern = 0x1234; static DEFINE_SPINLOCK(wdt_lock); -struct omap_wdt_dev { +struct omap_wdt_drvdata { + struct watchdog_device wdt; void __iomem *base; /* physical */ struct device *dev; - int omap_wdt_users; struct resource *mem; - struct miscdevice omap_wdt_miscdev; }; -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(); - /* reloaded WCRR from WLDR */ -} - -static void omap_wdt_enable(struct omap_wdt_dev *wdev) +static void omap_wdt_enable(struct omap_wdt_drvdata *wdev) { void __iomem *base = wdev->base; @@ -98,7 +80,7 @@ static void omap_wdt_enable(struct omap_wdt_dev *wdev) cpu_relax(); } -static void omap_wdt_disable(struct omap_wdt_dev *wdev) +static void omap_wdt_disable(struct omap_wdt_drvdata *wdev) { void __iomem *base = wdev->base; @@ -121,12 +103,19 @@ static void omap_wdt_adjust_timeout(unsigned new_timeout) timer_margin = new_timeout; } -static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) +static int omap_wdt_set_timeout(struct watchdog_device *wdt_dev, + unsigned int new_timeout) { - u32 pre_margin = GET_WLDR_VAL(timer_margin); - void __iomem *base = wdev->base; + u32 pre_margin; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; + + pm_runtime_get_sync(omap_wdev->dev); + omap_wdt_disable(omap_wdev); - pm_runtime_get_sync(wdev->dev); + /* adjust timeout based on the new timeout */ + omap_wdt_adjust_timeout(new_timeout); + pre_margin = GET_WLDR_VAL(timer_margin); /* just count up at 32 KHz */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) @@ -136,147 +125,87 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) cpu_relax(); - pm_runtime_put_sync(wdev->dev); + pm_runtime_put_sync(omap_wdev->dev); + return 0; } -/* - * Allow only one task to hold it open - */ -static int omap_wdt_open(struct inode *inode, struct file *file) +static int omap_wdt_ping(struct watchdog_device *wdt_dev) { - 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; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; - pm_runtime_get_sync(wdev->dev); - - /* initialize prescaler */ - while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) - cpu_relax(); + pm_runtime_get_sync(omap_wdev->dev); + spin_lock(&wdt_lock); - __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); - while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + /* wait for posted write to complete */ + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) cpu_relax(); - file->private_data = (void *) wdev; + wdt_trgr_pattern = ~wdt_trgr_pattern; + __raw_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR)); - omap_wdt_set_timeout(wdev); - omap_wdt_ping(wdev); /* trigger loading of new timeout value */ - omap_wdt_enable(wdev); + /* wait for posted write to complete */ + /* reloaded WCRR from WLDR */ + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) + cpu_relax(); - pm_runtime_put_sync(wdev->dev); + spin_unlock(&wdt_lock); + pm_runtime_put_sync(omap_wdev->dev); - return nonseekable_open(inode, file); + return 0; } -static int omap_wdt_release(struct inode *inode, struct file *file) +static int omap_wdt_start(struct watchdog_device *wdt_dev) { - struct omap_wdt_dev *wdev = file->private_data; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; - /* - * Shut off the timer unless NOWAYOUT is defined. - */ -#ifndef CONFIG_WATCHDOG_NOWAYOUT - pm_runtime_get_sync(wdev->dev); + pm_runtime_get_sync(omap_wdev->dev); + /* initialize prescaler */ + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + cpu_relax(); - omap_wdt_disable(wdev); + __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + cpu_relax(); - pm_runtime_put_sync(wdev->dev); -#else - pr_crit("Unexpected close, not stopping!\n"); -#endif - wdev->omap_wdt_users = 0; + omap_wdt_set_timeout(&omap_wdev->wdt, timer_margin); + omap_wdt_enable(omap_wdev); + pm_runtime_put_sync(omap_wdev->dev); return 0; } -static ssize_t omap_wdt_write(struct file *file, const char __user *data, - size_t len, loff_t *ppos) +static int omap_wdt_stop(struct watchdog_device *wdt_dev) { - struct omap_wdt_dev *wdev = file->private_data; - - /* Refresh LOAD_TIME. */ - if (len) { - pm_runtime_get_sync(wdev->dev); - spin_lock(&wdt_lock); - omap_wdt_ping(wdev); - spin_unlock(&wdt_lock); - pm_runtime_put_sync(wdev->dev); - } - return len; -} + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); -static long omap_wdt_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct omap_wdt_dev *wdev; - int new_margin; - static const struct watchdog_info ident = { - .identity = "OMAP Watchdog", - .options = WDIOF_SETTIMEOUT, - .firmware_version = 0, - }; - - wdev = file->private_data; - - switch (cmd) { - case WDIOC_GETSUPPORT: - return copy_to_user((struct watchdog_info __user *)arg, &ident, - sizeof(ident)); - case WDIOC_GETSTATUS: - return put_user(0, (int __user *)arg); - case WDIOC_GETBOOTSTATUS: - if (cpu_is_omap16xx()) - return put_user(__raw_readw(ARM_SYSST), - (int __user *)arg); - if (cpu_is_omap24xx()) - return put_user(omap_prcm_get_reset_sources(), - (int __user *)arg); - return put_user(0, (int __user *)arg); - case WDIOC_KEEPALIVE: - pm_runtime_get_sync(wdev->dev); - spin_lock(&wdt_lock); - omap_wdt_ping(wdev); - spin_unlock(&wdt_lock); - pm_runtime_put_sync(wdev->dev); - return 0; - case WDIOC_SETTIMEOUT: - if (get_user(new_margin, (int __user *)arg)) - return -EFAULT; - omap_wdt_adjust_timeout(new_margin); - - pm_runtime_get_sync(wdev->dev); - 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); - pm_runtime_put_sync(wdev->dev); - /* Fall */ - case WDIOC_GETTIMEOUT: - return put_user(timer_margin, (int __user *)arg); - default: - return -ENOTTY; - } + pm_runtime_get_sync(omap_wdev->dev); + omap_wdt_disable(omap_wdev); + pm_runtime_put_sync(omap_wdev->dev); + + return 0; } -static const struct file_operations omap_wdt_fops = { +static const struct watchdog_ops omap_wdt_ops = { .owner = THIS_MODULE, - .write = omap_wdt_write, - .unlocked_ioctl = omap_wdt_ioctl, - .open = omap_wdt_open, - .release = omap_wdt_release, - .llseek = no_llseek, + .start = omap_wdt_start, + .stop = omap_wdt_stop, + .ping = omap_wdt_ping, + .set_timeout = omap_wdt_set_timeout, +}; + +static const struct watchdog_info omap_wdt_info = { + .options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | + WDIOF_CARDRESET, + .identity = "Omap Watchdog", }; static int __devinit omap_wdt_probe(struct platform_device *pdev) { + struct omap_wdt_drvdata *omap_drvdata; + struct watchdog_device *omap_wdev; struct resource *res, *mem; - struct omap_wdt_dev *wdev; int ret; /* reserve static register mappings */ @@ -286,68 +215,65 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) goto err_get_resource; } - if (omap_wdt_dev) { - ret = -EBUSY; - goto err_busy; - } - mem = request_mem_region(res->start, resource_size(res), pdev->name); if (!mem) { ret = -EBUSY; goto err_busy; } - wdev = kzalloc(sizeof(struct omap_wdt_dev), GFP_KERNEL); - if (!wdev) { + omap_drvdata = devm_kzalloc(&pdev->dev, sizeof(struct omap_wdt_drvdata), + GFP_KERNEL); + if (!omap_drvdata) { + dev_err(&pdev->dev, "Unable to alloacate watchdog device\n"); ret = -ENOMEM; goto err_kzalloc; } - wdev->omap_wdt_users = 0; - wdev->mem = mem; - wdev->dev = &pdev->dev; + omap_drvdata->dev = &pdev->dev; + omap_wdev = &omap_drvdata->wdt; + omap_wdev->info = &omap_wdt_info; + omap_wdev->ops = &omap_wdt_ops; + omap_wdev->timeout = TIMER_MARGIN_DEFAULT; + omap_wdev->min_timeout = 1; + omap_wdev->max_timeout = TIMER_MARGIN_MAX; +#ifdef CONFIG_WATCHDOG_NOWAYOUT + watchdog_set_nowayout(omap_wdev, true); +#endif + watchdog_set_drvdata(omap_wdev, omap_drvdata); - wdev->base = ioremap(res->start, resource_size(res)); - if (!wdev->base) { + omap_drvdata->base = ioremap(res->start, resource_size(res)); + if (!omap_drvdata->base) { ret = -ENOMEM; goto err_ioremap; } - platform_set_drvdata(pdev, wdev); - - pm_runtime_enable(wdev->dev); - pm_runtime_get_sync(wdev->dev); - - omap_wdt_disable(wdev); - omap_wdt_adjust_timeout(timer_margin); - - wdev->omap_wdt_miscdev.parent = &pdev->dev; - wdev->omap_wdt_miscdev.minor = WATCHDOG_MINOR; - wdev->omap_wdt_miscdev.name = "watchdog"; - wdev->omap_wdt_miscdev.fops = &omap_wdt_fops; - - ret = misc_register(&(wdev->omap_wdt_miscdev)); - if (ret) - goto err_misc; - - pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n", - __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, - timer_margin); - - pm_runtime_put_sync(wdev->dev); - - omap_wdt_dev = pdev; + ret = watchdog_register_device(&omap_drvdata->wdt); + if (ret < 0) + goto err_register_wd; + + pm_runtime_enable(&pdev->dev); + pm_runtime_get_sync(&pdev->dev); + omap_wdt_disable(omap_drvdata); + pm_runtime_put_sync(&pdev->dev); + platform_set_drvdata(pdev, omap_drvdata); + + /* For omap16xx we just keep it original as-is */ + if (cpu_is_omap16xx()) + omap_wdev->bootstatus = __raw_readw(ARM_SYSST); + else + omap_wdev->bootstatus = (omap_prcm_get_reset_sources() & 0x10) + >> OMAP3_PRM_RSTST_WD_BIT; + pr_info("OMAP WDTimer Rev 0x%02x: Initial timeout %dsec status= 0x%x\n", + __raw_readl(omap_drvdata->base + OMAP_WATCHDOG_REV) + & 0xFF, timer_margin, omap_wdev->bootstatus); return 0; -err_misc: - pm_runtime_disable(wdev->dev); - platform_set_drvdata(pdev, NULL); - iounmap(wdev->base); +err_register_wd: + iounmap(omap_drvdata->base); err_ioremap: - wdev->base = NULL; - kfree(wdev); + kfree(omap_drvdata); err_kzalloc: release_mem_region(res->start, resource_size(res)); @@ -358,34 +284,19 @@ err_get_resource: return ret; } -static void omap_wdt_shutdown(struct platform_device *pdev) -{ - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); - - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_disable(wdev); - pm_runtime_put_sync(wdev->dev); - } -} - static int __devexit omap_wdt_remove(struct platform_device *pdev) { - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - pm_runtime_disable(wdev->dev); - if (!res) - return -ENOENT; + pm_runtime_disable(&pdev->dev); - misc_deregister(&(wdev->omap_wdt_miscdev)); release_mem_region(res->start, resource_size(res)); platform_set_drvdata(pdev, NULL); - iounmap(wdev->base); + iounmap(omap_wdev->base); - kfree(wdev); - omap_wdt_dev = NULL; + kfree(omap_wdev); return 0; } @@ -400,12 +311,12 @@ static int __devexit 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 = platform_get_drvdata(pdev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_disable(wdev); - pm_runtime_put_sync(wdev->dev); + if (test_bit(WDOG_DEV_OPEN, &omap_wdev->wdt.status)) { + pm_runtime_get_sync(&pdev->dev); + omap_wdt_disable(omap_wdev); + pm_runtime_put_sync(&pdev->dev); } return 0; @@ -413,13 +324,12 @@ static int omap_wdt_suspend(struct platform_device *pdev, pm_message_t state) static int omap_wdt_resume(struct platform_device *pdev) { - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); - - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_enable(wdev); - omap_wdt_ping(wdev); - pm_runtime_put_sync(wdev->dev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); + if (test_bit(WDOG_DEV_OPEN, &omap_wdev->wdt.status)) { + pm_runtime_get_sync(&pdev->dev); + omap_wdt_enable(omap_wdev); + omap_wdt_ping(&omap_wdev->wdt); + pm_runtime_put_sync(&pdev->dev); } return 0; @@ -433,7 +343,6 @@ static int omap_wdt_resume(struct platform_device *pdev) static struct platform_driver omap_wdt_driver = { .probe = omap_wdt_probe, .remove = __devexit_p(omap_wdt_remove), - .shutdown = omap_wdt_shutdown, .suspend = omap_wdt_suspend, .resume = omap_wdt_resume, .driver = { @@ -446,5 +355,4 @@ module_platform_driver(omap_wdt_driver); MODULE_AUTHOR("George G. Davis"); MODULE_LICENSE("GPL"); -MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); MODULE_ALIAS("platform:omap_wdt"); diff --git a/drivers/watchdog/omap_wdt.h b/drivers/watchdog/omap_wdt.h index 09b774c..cf5f037 100644 --- a/drivers/watchdog/omap_wdt.h +++ b/drivers/watchdog/omap_wdt.h @@ -51,4 +51,9 @@ #define PTV 0 /* prescale */ #define GET_WLDR_VAL(secs) (0xffffffff - ((secs) * (32768/(1<<PTV))) + 1) +/* MPU_WD_RST bit in PRM_RSTST show Omap WDTimer reset event. + * 0x0 = 0x0 : No watchdog reset. + * 0x1 = 0x1 : watchdog reset has occurred. */ +#define OMAP3_PRM_RSTST_WD_BIT 4 + #endif /* _OMAP_WATCHDOG_H */ -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 1/3] Watchdog: Omap: Changes for the new watchdog framework @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker This patch implements the current watchdog framework for OMAP WDTimer, which factored out the common components, so the driver can just focus on the hardware related parts. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- drivers/watchdog/omap_wdt.h | 5 + 2 files changed, 128 insertions(+), 215 deletions(-) diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 8285d65..df9ed78 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -24,6 +24,9 @@ * * Copyright (c) 2005 David Brownell * Use the driver model and standard identifiers; handle bigger timeouts. + * + * Copyright (c) 2012 WindRiver + * Changes cater for the current watchdog framework. */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -33,7 +36,6 @@ #include <linux/kernel.h> #include <linux/fs.h> #include <linux/mm.h> -#include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/reboot.h> #include <linux/init.h> @@ -50,8 +52,6 @@ #include "omap_wdt.h" -static struct platform_device *omap_wdt_dev; - static unsigned timer_margin; module_param(timer_margin, uint, 0); MODULE_PARM_DESC(timer_margin, "initial watchdog timeout (in seconds)"); @@ -59,32 +59,14 @@ MODULE_PARM_DESC(timer_margin, "initial watchdog timeout (in seconds)"); static unsigned int wdt_trgr_pattern = 0x1234; static DEFINE_SPINLOCK(wdt_lock); -struct omap_wdt_dev { +struct omap_wdt_drvdata { + struct watchdog_device wdt; void __iomem *base; /* physical */ struct device *dev; - int omap_wdt_users; struct resource *mem; - struct miscdevice omap_wdt_miscdev; }; -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(); - /* reloaded WCRR from WLDR */ -} - -static void omap_wdt_enable(struct omap_wdt_dev *wdev) +static void omap_wdt_enable(struct omap_wdt_drvdata *wdev) { void __iomem *base = wdev->base; @@ -98,7 +80,7 @@ static void omap_wdt_enable(struct omap_wdt_dev *wdev) cpu_relax(); } -static void omap_wdt_disable(struct omap_wdt_dev *wdev) +static void omap_wdt_disable(struct omap_wdt_drvdata *wdev) { void __iomem *base = wdev->base; @@ -121,12 +103,19 @@ static void omap_wdt_adjust_timeout(unsigned new_timeout) timer_margin = new_timeout; } -static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) +static int omap_wdt_set_timeout(struct watchdog_device *wdt_dev, + unsigned int new_timeout) { - u32 pre_margin = GET_WLDR_VAL(timer_margin); - void __iomem *base = wdev->base; + u32 pre_margin; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; + + pm_runtime_get_sync(omap_wdev->dev); + omap_wdt_disable(omap_wdev); - pm_runtime_get_sync(wdev->dev); + /* adjust timeout based on the new timeout */ + omap_wdt_adjust_timeout(new_timeout); + pre_margin = GET_WLDR_VAL(timer_margin); /* just count up at 32 KHz */ while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) @@ -136,147 +125,87 @@ static void omap_wdt_set_timeout(struct omap_wdt_dev *wdev) while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x04) cpu_relax(); - pm_runtime_put_sync(wdev->dev); + pm_runtime_put_sync(omap_wdev->dev); + return 0; } -/* - * Allow only one task to hold it open - */ -static int omap_wdt_open(struct inode *inode, struct file *file) +static int omap_wdt_ping(struct watchdog_device *wdt_dev) { - 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; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; - pm_runtime_get_sync(wdev->dev); - - /* initialize prescaler */ - while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) - cpu_relax(); + pm_runtime_get_sync(omap_wdev->dev); + spin_lock(&wdt_lock); - __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); - while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + /* wait for posted write to complete */ + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) cpu_relax(); - file->private_data = (void *) wdev; + wdt_trgr_pattern = ~wdt_trgr_pattern; + __raw_writel(wdt_trgr_pattern, (base + OMAP_WATCHDOG_TGR)); - omap_wdt_set_timeout(wdev); - omap_wdt_ping(wdev); /* trigger loading of new timeout value */ - omap_wdt_enable(wdev); + /* wait for posted write to complete */ + /* reloaded WCRR from WLDR */ + while ((__raw_readl(base + OMAP_WATCHDOG_WPS)) & 0x08) + cpu_relax(); - pm_runtime_put_sync(wdev->dev); + spin_unlock(&wdt_lock); + pm_runtime_put_sync(omap_wdev->dev); - return nonseekable_open(inode, file); + return 0; } -static int omap_wdt_release(struct inode *inode, struct file *file) +static int omap_wdt_start(struct watchdog_device *wdt_dev) { - struct omap_wdt_dev *wdev = file->private_data; + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); + void __iomem *base = omap_wdev->base; - /* - * Shut off the timer unless NOWAYOUT is defined. - */ -#ifndef CONFIG_WATCHDOG_NOWAYOUT - pm_runtime_get_sync(wdev->dev); + pm_runtime_get_sync(omap_wdev->dev); + /* initialize prescaler */ + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + cpu_relax(); - omap_wdt_disable(wdev); + __raw_writel((1 << 5) | (PTV << 2), base + OMAP_WATCHDOG_CNTRL); + while (__raw_readl(base + OMAP_WATCHDOG_WPS) & 0x01) + cpu_relax(); - pm_runtime_put_sync(wdev->dev); -#else - pr_crit("Unexpected close, not stopping!\n"); -#endif - wdev->omap_wdt_users = 0; + omap_wdt_set_timeout(&omap_wdev->wdt, timer_margin); + omap_wdt_enable(omap_wdev); + pm_runtime_put_sync(omap_wdev->dev); return 0; } -static ssize_t omap_wdt_write(struct file *file, const char __user *data, - size_t len, loff_t *ppos) +static int omap_wdt_stop(struct watchdog_device *wdt_dev) { - struct omap_wdt_dev *wdev = file->private_data; - - /* Refresh LOAD_TIME. */ - if (len) { - pm_runtime_get_sync(wdev->dev); - spin_lock(&wdt_lock); - omap_wdt_ping(wdev); - spin_unlock(&wdt_lock); - pm_runtime_put_sync(wdev->dev); - } - return len; -} + struct omap_wdt_drvdata *omap_wdev = watchdog_get_drvdata(wdt_dev); -static long omap_wdt_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct omap_wdt_dev *wdev; - int new_margin; - static const struct watchdog_info ident = { - .identity = "OMAP Watchdog", - .options = WDIOF_SETTIMEOUT, - .firmware_version = 0, - }; - - wdev = file->private_data; - - switch (cmd) { - case WDIOC_GETSUPPORT: - return copy_to_user((struct watchdog_info __user *)arg, &ident, - sizeof(ident)); - case WDIOC_GETSTATUS: - return put_user(0, (int __user *)arg); - case WDIOC_GETBOOTSTATUS: - if (cpu_is_omap16xx()) - return put_user(__raw_readw(ARM_SYSST), - (int __user *)arg); - if (cpu_is_omap24xx()) - return put_user(omap_prcm_get_reset_sources(), - (int __user *)arg); - return put_user(0, (int __user *)arg); - case WDIOC_KEEPALIVE: - pm_runtime_get_sync(wdev->dev); - spin_lock(&wdt_lock); - omap_wdt_ping(wdev); - spin_unlock(&wdt_lock); - pm_runtime_put_sync(wdev->dev); - return 0; - case WDIOC_SETTIMEOUT: - if (get_user(new_margin, (int __user *)arg)) - return -EFAULT; - omap_wdt_adjust_timeout(new_margin); - - pm_runtime_get_sync(wdev->dev); - 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); - pm_runtime_put_sync(wdev->dev); - /* Fall */ - case WDIOC_GETTIMEOUT: - return put_user(timer_margin, (int __user *)arg); - default: - return -ENOTTY; - } + pm_runtime_get_sync(omap_wdev->dev); + omap_wdt_disable(omap_wdev); + pm_runtime_put_sync(omap_wdev->dev); + + return 0; } -static const struct file_operations omap_wdt_fops = { +static const struct watchdog_ops omap_wdt_ops = { .owner = THIS_MODULE, - .write = omap_wdt_write, - .unlocked_ioctl = omap_wdt_ioctl, - .open = omap_wdt_open, - .release = omap_wdt_release, - .llseek = no_llseek, + .start = omap_wdt_start, + .stop = omap_wdt_stop, + .ping = omap_wdt_ping, + .set_timeout = omap_wdt_set_timeout, +}; + +static const struct watchdog_info omap_wdt_info = { + .options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | + WDIOF_CARDRESET, + .identity = "Omap Watchdog", }; static int __devinit omap_wdt_probe(struct platform_device *pdev) { + struct omap_wdt_drvdata *omap_drvdata; + struct watchdog_device *omap_wdev; struct resource *res, *mem; - struct omap_wdt_dev *wdev; int ret; /* reserve static register mappings */ @@ -286,68 +215,65 @@ static int __devinit omap_wdt_probe(struct platform_device *pdev) goto err_get_resource; } - if (omap_wdt_dev) { - ret = -EBUSY; - goto err_busy; - } - mem = request_mem_region(res->start, resource_size(res), pdev->name); if (!mem) { ret = -EBUSY; goto err_busy; } - wdev = kzalloc(sizeof(struct omap_wdt_dev), GFP_KERNEL); - if (!wdev) { + omap_drvdata = devm_kzalloc(&pdev->dev, sizeof(struct omap_wdt_drvdata), + GFP_KERNEL); + if (!omap_drvdata) { + dev_err(&pdev->dev, "Unable to alloacate watchdog device\n"); ret = -ENOMEM; goto err_kzalloc; } - wdev->omap_wdt_users = 0; - wdev->mem = mem; - wdev->dev = &pdev->dev; + omap_drvdata->dev = &pdev->dev; + omap_wdev = &omap_drvdata->wdt; + omap_wdev->info = &omap_wdt_info; + omap_wdev->ops = &omap_wdt_ops; + omap_wdev->timeout = TIMER_MARGIN_DEFAULT; + omap_wdev->min_timeout = 1; + omap_wdev->max_timeout = TIMER_MARGIN_MAX; +#ifdef CONFIG_WATCHDOG_NOWAYOUT + watchdog_set_nowayout(omap_wdev, true); +#endif + watchdog_set_drvdata(omap_wdev, omap_drvdata); - wdev->base = ioremap(res->start, resource_size(res)); - if (!wdev->base) { + omap_drvdata->base = ioremap(res->start, resource_size(res)); + if (!omap_drvdata->base) { ret = -ENOMEM; goto err_ioremap; } - platform_set_drvdata(pdev, wdev); - - pm_runtime_enable(wdev->dev); - pm_runtime_get_sync(wdev->dev); - - omap_wdt_disable(wdev); - omap_wdt_adjust_timeout(timer_margin); - - wdev->omap_wdt_miscdev.parent = &pdev->dev; - wdev->omap_wdt_miscdev.minor = WATCHDOG_MINOR; - wdev->omap_wdt_miscdev.name = "watchdog"; - wdev->omap_wdt_miscdev.fops = &omap_wdt_fops; - - ret = misc_register(&(wdev->omap_wdt_miscdev)); - if (ret) - goto err_misc; - - pr_info("OMAP Watchdog Timer Rev 0x%02x: initial timeout %d sec\n", - __raw_readl(wdev->base + OMAP_WATCHDOG_REV) & 0xFF, - timer_margin); - - pm_runtime_put_sync(wdev->dev); - - omap_wdt_dev = pdev; + ret = watchdog_register_device(&omap_drvdata->wdt); + if (ret < 0) + goto err_register_wd; + + pm_runtime_enable(&pdev->dev); + pm_runtime_get_sync(&pdev->dev); + omap_wdt_disable(omap_drvdata); + pm_runtime_put_sync(&pdev->dev); + platform_set_drvdata(pdev, omap_drvdata); + + /* For omap16xx we just keep it original as-is */ + if (cpu_is_omap16xx()) + omap_wdev->bootstatus = __raw_readw(ARM_SYSST); + else + omap_wdev->bootstatus = (omap_prcm_get_reset_sources() & 0x10) + >> OMAP3_PRM_RSTST_WD_BIT; + pr_info("OMAP WDTimer Rev 0x%02x: Initial timeout %dsec status= 0x%x\n", + __raw_readl(omap_drvdata->base + OMAP_WATCHDOG_REV) + & 0xFF, timer_margin, omap_wdev->bootstatus); return 0; -err_misc: - pm_runtime_disable(wdev->dev); - platform_set_drvdata(pdev, NULL); - iounmap(wdev->base); +err_register_wd: + iounmap(omap_drvdata->base); err_ioremap: - wdev->base = NULL; - kfree(wdev); + kfree(omap_drvdata); err_kzalloc: release_mem_region(res->start, resource_size(res)); @@ -358,34 +284,19 @@ err_get_resource: return ret; } -static void omap_wdt_shutdown(struct platform_device *pdev) -{ - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); - - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_disable(wdev); - pm_runtime_put_sync(wdev->dev); - } -} - static int __devexit omap_wdt_remove(struct platform_device *pdev) { - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - pm_runtime_disable(wdev->dev); - if (!res) - return -ENOENT; + pm_runtime_disable(&pdev->dev); - misc_deregister(&(wdev->omap_wdt_miscdev)); release_mem_region(res->start, resource_size(res)); platform_set_drvdata(pdev, NULL); - iounmap(wdev->base); + iounmap(omap_wdev->base); - kfree(wdev); - omap_wdt_dev = NULL; + kfree(omap_wdev); return 0; } @@ -400,12 +311,12 @@ static int __devexit 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 = platform_get_drvdata(pdev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_disable(wdev); - pm_runtime_put_sync(wdev->dev); + if (test_bit(WDOG_DEV_OPEN, &omap_wdev->wdt.status)) { + pm_runtime_get_sync(&pdev->dev); + omap_wdt_disable(omap_wdev); + pm_runtime_put_sync(&pdev->dev); } return 0; @@ -413,13 +324,12 @@ static int omap_wdt_suspend(struct platform_device *pdev, pm_message_t state) static int omap_wdt_resume(struct platform_device *pdev) { - struct omap_wdt_dev *wdev = platform_get_drvdata(pdev); - - if (wdev->omap_wdt_users) { - pm_runtime_get_sync(wdev->dev); - omap_wdt_enable(wdev); - omap_wdt_ping(wdev); - pm_runtime_put_sync(wdev->dev); + struct omap_wdt_drvdata *omap_wdev = platform_get_drvdata(pdev); + if (test_bit(WDOG_DEV_OPEN, &omap_wdev->wdt.status)) { + pm_runtime_get_sync(&pdev->dev); + omap_wdt_enable(omap_wdev); + omap_wdt_ping(&omap_wdev->wdt); + pm_runtime_put_sync(&pdev->dev); } return 0; @@ -433,7 +343,6 @@ static int omap_wdt_resume(struct platform_device *pdev) static struct platform_driver omap_wdt_driver = { .probe = omap_wdt_probe, .remove = __devexit_p(omap_wdt_remove), - .shutdown = omap_wdt_shutdown, .suspend = omap_wdt_suspend, .resume = omap_wdt_resume, .driver = { @@ -446,5 +355,4 @@ module_platform_driver(omap_wdt_driver); MODULE_AUTHOR("George G. Davis"); MODULE_LICENSE("GPL"); -MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); MODULE_ALIAS("platform:omap_wdt"); diff --git a/drivers/watchdog/omap_wdt.h b/drivers/watchdog/omap_wdt.h index 09b774c..cf5f037 100644 --- a/drivers/watchdog/omap_wdt.h +++ b/drivers/watchdog/omap_wdt.h @@ -51,4 +51,9 @@ #define PTV 0 /* prescale */ #define GET_WLDR_VAL(secs) (0xffffffff - ((secs) * (32768/(1<<PTV))) + 1) +/* MPU_WD_RST bit in PRM_RSTST show Omap WDTimer reset event. + * 0x0 = 0x0 : No watchdog reset. + * 0x1 = 0x1 : watchdog reset has occurred. */ +#define OMAP3_PRM_RSTST_WD_BIT 4 + #endif /* _OMAP_WATCHDOG_H */ -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 2/3] Watchdog: Omap: select watchdog core for framework change 2012-07-09 4:39 ` Zumeng Chen (?) @ 2012-07-09 4:39 ` Zumeng Chen -1 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker Since the currrent watchdog framework depends on the watchdog core so select it in Kconfig. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- drivers/watchdog/Kconfig | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index fe819b7..fb5b108 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -232,6 +232,7 @@ config EP93XX_WATCHDOG config OMAP_WATCHDOG tristate "OMAP Watchdog" depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS + select WATCHDOG_CORE help Support for TI OMAP1610/OMAP1710/OMAP2420/OMAP3430/OMAP4430 watchdog. Say 'Y' here to enable the OMAP1610/OMAP1710/OMAP2420/OMAP3430/OMAP4430 watchdog timer. -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 2/3] Watchdog: Omap: select watchdog core for framework change @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: linux-arm-kernel Since the currrent watchdog framework depends on the watchdog core so select it in Kconfig. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- drivers/watchdog/Kconfig | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index fe819b7..fb5b108 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -232,6 +232,7 @@ config EP93XX_WATCHDOG config OMAP_WATCHDOG tristate "OMAP Watchdog" depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS + select WATCHDOG_CORE help Support for TI OMAP1610/OMAP1710/OMAP2420/OMAP3430/OMAP4430 watchdog. Say 'Y' here to enable the OMAP1610/OMAP1710/OMAP2420/OMAP3430/OMAP4430 watchdog timer. -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 2/3] Watchdog: Omap: select watchdog core for framework change @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker Since the currrent watchdog framework depends on the watchdog core so select it in Kconfig. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- drivers/watchdog/Kconfig | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index fe819b7..fb5b108 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -232,6 +232,7 @@ config EP93XX_WATCHDOG config OMAP_WATCHDOG tristate "OMAP Watchdog" depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS + select WATCHDOG_CORE help Support for TI OMAP1610/OMAP1710/OMAP2420/OMAP3430/OMAP4430 watchdog. Say 'Y' here to enable the OMAP1610/OMAP1710/OMAP2420/OMAP3430/OMAP4430 watchdog timer. -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus 2012-07-09 4:39 ` Zumeng Chen (?) @ 2012-07-09 4:39 ` Zumeng Chen -1 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here put the right one to match to the actual physical addr 0x48307258, which defined in PRCM Registers section. And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- arch/arm/mach-omap2/prcm.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 480f40a..4dcc706 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; u32 omap_prcm_get_reset_sources(void) { /* XXX This presumably needs modification for 34XX */ - if (cpu_is_omap24xx() || cpu_is_omap34xx()) + if (cpu_is_omap24xx()) return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f; + if (cpu_is_omap34xx()) + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST) & + 0x7f; if (cpu_is_omap44xx()) return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f; -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: linux-arm-kernel The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here put the right one to match to the actual physical addr 0x48307258, which defined in PRCM Registers section. And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- arch/arm/mach-omap2/prcm.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 480f40a..4dcc706 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; u32 omap_prcm_get_reset_sources(void) { /* XXX This presumably needs modification for 34XX */ - if (cpu_is_omap24xx() || cpu_is_omap34xx()) + if (cpu_is_omap24xx()) return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f; + if (cpu_is_omap34xx()) + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST) & + 0x7f; if (cpu_is_omap44xx()) return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f; -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus @ 2012-07-09 4:39 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:39 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here put the right one to match to the actual physical addr 0x48307258, which defined in PRCM Registers section. And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> --- arch/arm/mach-omap2/prcm.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 480f40a..4dcc706 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; u32 omap_prcm_get_reset_sources(void) { /* XXX This presumably needs modification for 34XX */ - if (cpu_is_omap24xx() || cpu_is_omap34xx()) + if (cpu_is_omap24xx()) return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f; + if (cpu_is_omap34xx()) + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST) & + 0x7f; if (cpu_is_omap44xx()) return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f; -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus 2012-07-09 4:39 ` Zumeng Chen (?) @ 2012-07-09 16:40 ` Kevin Hilman -1 siblings, 0 replies; 27+ messages in thread From: Kevin Hilman @ 2012-07-09 16:40 UTC (permalink / raw) To: Zumeng Chen Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker Zumeng Chen <zumeng.chen@windriver.com> writes: > The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here > put the right one to match to the actual physical addr 0x48307258, which > defined in PRCM Registers section. > > And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal > from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board > wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. > > Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> > --- > arch/arm/mach-omap2/prcm.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c > index 480f40a..4dcc706 100644 > --- a/arch/arm/mach-omap2/prcm.c > +++ b/arch/arm/mach-omap2/prcm.c > @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; > u32 omap_prcm_get_reset_sources(void) > { > /* XXX This presumably needs modification for 34XX */ While you're fixing this for OMAP3, you can remove this comment as well. > - if (cpu_is_omap24xx() || cpu_is_omap34xx()) > + if (cpu_is_omap24xx()) > return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f; > + if (cpu_is_omap34xx()) > + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST) & > + 0x7f; > if (cpu_is_omap44xx()) > return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f; Kevin ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus @ 2012-07-09 16:40 ` Kevin Hilman 0 siblings, 0 replies; 27+ messages in thread From: Kevin Hilman @ 2012-07-09 16:40 UTC (permalink / raw) To: linux-arm-kernel Zumeng Chen <zumeng.chen@windriver.com> writes: > The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here > put the right one to match to the actual physical addr 0x48307258, which > defined in PRCM Registers section. > > And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal > from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board > wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. > > Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> > --- > arch/arm/mach-omap2/prcm.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c > index 480f40a..4dcc706 100644 > --- a/arch/arm/mach-omap2/prcm.c > +++ b/arch/arm/mach-omap2/prcm.c > @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; > u32 omap_prcm_get_reset_sources(void) > { > /* XXX This presumably needs modification for 34XX */ While you're fixing this for OMAP3, you can remove this comment as well. > - if (cpu_is_omap24xx() || cpu_is_omap34xx()) > + if (cpu_is_omap24xx()) > return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f; > + if (cpu_is_omap34xx()) > + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST) & > + 0x7f; > if (cpu_is_omap44xx()) > return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f; Kevin ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus @ 2012-07-09 16:40 ` Kevin Hilman 0 siblings, 0 replies; 27+ messages in thread From: Kevin Hilman @ 2012-07-09 16:40 UTC (permalink / raw) To: Zumeng Chen Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker Zumeng Chen <zumeng.chen@windriver.com> writes: > The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here > put the right one to match to the actual physical addr 0x48307258, which > defined in PRCM Registers section. > > And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal > from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board > wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. > > Signed-off-by: Zumeng Chen <zumeng.chen@windriver.com> > --- > arch/arm/mach-omap2/prcm.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c > index 480f40a..4dcc706 100644 > --- a/arch/arm/mach-omap2/prcm.c > +++ b/arch/arm/mach-omap2/prcm.c > @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; > u32 omap_prcm_get_reset_sources(void) > { > /* XXX This presumably needs modification for 34XX */ While you're fixing this for OMAP3, you can remove this comment as well. > - if (cpu_is_omap24xx() || cpu_is_omap34xx()) > + if (cpu_is_omap24xx()) > return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f; > + if (cpu_is_omap34xx()) > + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST) & > + 0x7f; > if (cpu_is_omap44xx()) > return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f; Kevin ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus 2012-07-09 16:40 ` Kevin Hilman (?) @ 2012-07-10 0:34 ` Zumeng Chen -1 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-10 0:34 UTC (permalink / raw) To: Kevin Hilman Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker 于 2012年07月10日 00:40, Kevin Hilman 写道: > Zumeng Chen<zumeng.chen@windriver.com> writes: > >> The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here >> put the right one to match to the actual physical addr 0x48307258, which >> defined in PRCM Registers section. >> >> And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal >> from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board >> wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. >> >> Signed-off-by: Zumeng Chen<zumeng.chen@windriver.com> >> --- >> arch/arm/mach-omap2/prcm.c | 5 ++++- >> 1 files changed, 4 insertions(+), 1 deletions(-) >> >> diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c >> index 480f40a..4dcc706 100644 >> --- a/arch/arm/mach-omap2/prcm.c >> +++ b/arch/arm/mach-omap2/prcm.c >> @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; >> u32 omap_prcm_get_reset_sources(void) >> { >> /* XXX This presumably needs modification for 34XX */ > While you're fixing this for OMAP3, you can remove this comment as well. No problem, I'll update it in V2. Thanks for your kind reminder :-) Regards, Zumeng > >> - if (cpu_is_omap24xx() || cpu_is_omap34xx()) >> + if (cpu_is_omap24xx()) >> return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST)& 0x7f; >> + if (cpu_is_omap34xx()) >> + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST)& >> + 0x7f; >> if (cpu_is_omap44xx()) >> return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST)& 0x7f; > Kevin -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus @ 2012-07-10 0:34 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-10 0:34 UTC (permalink / raw) To: linux-arm-kernel ? 2012?07?10? 00:40, Kevin Hilman ??: > Zumeng Chen<zumeng.chen@windriver.com> writes: > >> The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here >> put the right one to match to the actual physical addr 0x48307258, which >> defined in PRCM Registers section. >> >> And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal >> from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board >> wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. >> >> Signed-off-by: Zumeng Chen<zumeng.chen@windriver.com> >> --- >> arch/arm/mach-omap2/prcm.c | 5 ++++- >> 1 files changed, 4 insertions(+), 1 deletions(-) >> >> diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c >> index 480f40a..4dcc706 100644 >> --- a/arch/arm/mach-omap2/prcm.c >> +++ b/arch/arm/mach-omap2/prcm.c >> @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; >> u32 omap_prcm_get_reset_sources(void) >> { >> /* XXX This presumably needs modification for 34XX */ > While you're fixing this for OMAP3, you can remove this comment as well. No problem, I'll update it in V2. Thanks for your kind reminder :-) Regards, Zumeng > >> - if (cpu_is_omap24xx() || cpu_is_omap34xx()) >> + if (cpu_is_omap24xx()) >> return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST)& 0x7f; >> + if (cpu_is_omap34xx()) >> + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST)& >> + 0x7f; >> if (cpu_is_omap44xx()) >> return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST)& 0x7f; > Kevin ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus @ 2012-07-10 0:34 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-10 0:34 UTC (permalink / raw) To: Kevin Hilman Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker 于 2012年07月10日 00:40, Kevin Hilman 写道: > Zumeng Chen<zumeng.chen@windriver.com> writes: > >> The offset of WKUP_MOD is not right for the PRM_RSTST of OMAP3. So here >> put the right one to match to the actual physical addr 0x48307258, which >> defined in PRCM Registers section. >> >> And there is a MPU_WD_RST bit in PRM_RSTST(0x48307258) holding the signal >> from omap-wdt reboot, so that we can return WDIOF_CARDRESET if the board >> wakes up from omap-wdt reboot for WDIOC_GETBOOTSTATUS ioctl. >> >> Signed-off-by: Zumeng Chen<zumeng.chen@windriver.com> >> --- >> arch/arm/mach-omap2/prcm.c | 5 ++++- >> 1 files changed, 4 insertions(+), 1 deletions(-) >> >> diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c >> index 480f40a..4dcc706 100644 >> --- a/arch/arm/mach-omap2/prcm.c >> +++ b/arch/arm/mach-omap2/prcm.c >> @@ -49,8 +49,11 @@ void __iomem *prcm_mpu_base; >> u32 omap_prcm_get_reset_sources(void) >> { >> /* XXX This presumably needs modification for 34XX */ > While you're fixing this for OMAP3, you can remove this comment as well. No problem, I'll update it in V2. Thanks for your kind reminder :-) Regards, Zumeng > >> - if (cpu_is_omap24xx() || cpu_is_omap34xx()) >> + if (cpu_is_omap24xx()) >> return omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST)& 0x7f; >> + if (cpu_is_omap34xx()) >> + return omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP2_RM_RSTST)& >> + 0x7f; >> if (cpu_is_omap44xx()) >> return omap2_prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST)& 0x7f; > Kevin -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework 2012-07-09 4:39 ` Zumeng Chen (?) @ 2012-07-09 4:46 ` Zumeng Chen -1 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:46 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker The changes have been validated on omap3530evm Normal reboot root@ti-omap3:~# dmesg|grep WDT omap_wdt: OMAP WDTimer Rev 0x31: Initial timeout 0sec status= 0x0 root@ti-omap3:~# root@ti-omap3:~# echo 1 >/dev/watchdog Boot from WDT root@ti-omap3:~# dmesg|grep WDT omap_wdt: OMAP WDTimer Rev 0x31: Initial timeout 0sec status= 0x1 root@ti-omap3:~# Regards, zumeng 于 2012年07月09日 12:39, Zumeng Chen 写道: > Hello, > > The following patches based on the 3.5-rc6 from Wim, which > are based on: > > 1 ) bootstatus fix for omap3, > > 2 ) omap-wdt framework update cater for the current framework > as Shubhrajyoti comments mentioned. > > Regards, > Zumeng > > Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) > > Zumeng Chen (3): > Watchdog: Omap: Changes for the new watchdog framework > Watchdog: Omap: select watchdog core for framework change > Watchdog: Omap: get the bootstatus for OMAP2Plus > > arch/arm/mach-omap2/prcm.c | 5 +- > drivers/watchdog/Kconfig | 1 + > drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- > drivers/watchdog/omap_wdt.h | 5 + > 4 files changed, 133 insertions(+), 216 deletions(-) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 4:46 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:46 UTC (permalink / raw) To: linux-arm-kernel The changes have been validated on omap3530evm Normal reboot root at ti-omap3:~# dmesg|grep WDT omap_wdt: OMAP WDTimer Rev 0x31: Initial timeout 0sec status= 0x0 root at ti-omap3:~# root at ti-omap3:~# echo 1 >/dev/watchdog Boot from WDT root at ti-omap3:~# dmesg|grep WDT omap_wdt: OMAP WDTimer Rev 0x31: Initial timeout 0sec status= 0x1 root at ti-omap3:~# Regards, zumeng ? 2012?07?09? 12:39, Zumeng Chen ??: > Hello, > > The following patches based on the 3.5-rc6 from Wim, which > are based on: > > 1 ) bootstatus fix for omap3, > > 2 ) omap-wdt framework update cater for the current framework > as Shubhrajyoti comments mentioned. > > Regards, > Zumeng > > Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) > > Zumeng Chen (3): > Watchdog: Omap: Changes for the new watchdog framework > Watchdog: Omap: select watchdog core for framework change > Watchdog: Omap: get the bootstatus for OMAP2Plus > > arch/arm/mach-omap2/prcm.c | 5 +- > drivers/watchdog/Kconfig | 1 + > drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- > drivers/watchdog/omap_wdt.h | 5 + > 4 files changed, 133 insertions(+), 216 deletions(-) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 4:46 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 4:46 UTC (permalink / raw) To: shubhrajyoti, wim Cc: linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker The changes have been validated on omap3530evm Normal reboot root@ti-omap3:~# dmesg|grep WDT omap_wdt: OMAP WDTimer Rev 0x31: Initial timeout 0sec status= 0x0 root@ti-omap3:~# root@ti-omap3:~# echo 1 >/dev/watchdog Boot from WDT root@ti-omap3:~# dmesg|grep WDT omap_wdt: OMAP WDTimer Rev 0x31: Initial timeout 0sec status= 0x1 root@ti-omap3:~# Regards, zumeng 于 2012年07月09日 12:39, Zumeng Chen 写道: > Hello, > > The following patches based on the 3.5-rc6 from Wim, which > are based on: > > 1 ) bootstatus fix for omap3, > > 2 ) omap-wdt framework update cater for the current framework > as Shubhrajyoti comments mentioned. > > Regards, > Zumeng > > Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) > > Zumeng Chen (3): > Watchdog: Omap: Changes for the new watchdog framework > Watchdog: Omap: select watchdog core for framework change > Watchdog: Omap: get the bootstatus for OMAP2Plus > > arch/arm/mach-omap2/prcm.c | 5 +- > drivers/watchdog/Kconfig | 1 + > drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- > drivers/watchdog/omap_wdt.h | 5 + > 4 files changed, 133 insertions(+), 216 deletions(-) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework 2012-07-09 4:39 ` Zumeng Chen (?) @ 2012-07-09 6:02 ` Vaibhav Hiremath -1 siblings, 0 replies; 27+ messages in thread From: Vaibhav Hiremath @ 2012-07-09 6:02 UTC (permalink / raw) To: Zumeng Chen Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker On 7/9/2012 10:09 AM, Zumeng Chen wrote: > Hello, > > The following patches based on the 3.5-rc6 from Wim, which > are based on: > > 1 ) bootstatus fix for omap3, > > 2 ) omap-wdt framework update cater for the current framework > as Shubhrajyoti comments mentioned. > > Regards, > Zumeng > > Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) > > Zumeng Chen (3): > Watchdog: Omap: Changes for the new watchdog framework > Watchdog: Omap: select watchdog core for framework change > Watchdog: Omap: get the bootstatus for OMAP2Plus > It looks like you have manually created your cover letter, cover-letter says [0/2] but actually you have 3 patches in series. You should use following command to create cover letter, git format-patch --cover-letter <no of patches OR commits for patches> Thanks, Vaibhav > arch/arm/mach-omap2/prcm.c | 5 +- > drivers/watchdog/Kconfig | 1 + > drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- > drivers/watchdog/omap_wdt.h | 5 + > 4 files changed, 133 insertions(+), 216 deletions(-) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 6:02 ` Vaibhav Hiremath 0 siblings, 0 replies; 27+ messages in thread From: Vaibhav Hiremath @ 2012-07-09 6:02 UTC (permalink / raw) To: linux-arm-kernel On 7/9/2012 10:09 AM, Zumeng Chen wrote: > Hello, > > The following patches based on the 3.5-rc6 from Wim, which > are based on: > > 1 ) bootstatus fix for omap3, > > 2 ) omap-wdt framework update cater for the current framework > as Shubhrajyoti comments mentioned. > > Regards, > Zumeng > > Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) > > Zumeng Chen (3): > Watchdog: Omap: Changes for the new watchdog framework > Watchdog: Omap: select watchdog core for framework change > Watchdog: Omap: get the bootstatus for OMAP2Plus > It looks like you have manually created your cover letter, cover-letter says [0/2] but actually you have 3 patches in series. You should use following command to create cover letter, git format-patch --cover-letter <no of patches OR commits for patches> Thanks, Vaibhav > arch/arm/mach-omap2/prcm.c | 5 +- > drivers/watchdog/Kconfig | 1 + > drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- > drivers/watchdog/omap_wdt.h | 5 + > 4 files changed, 133 insertions(+), 216 deletions(-) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 6:02 ` Vaibhav Hiremath 0 siblings, 0 replies; 27+ messages in thread From: Vaibhav Hiremath @ 2012-07-09 6:02 UTC (permalink / raw) To: Zumeng Chen Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker On 7/9/2012 10:09 AM, Zumeng Chen wrote: > Hello, > > The following patches based on the 3.5-rc6 from Wim, which > are based on: > > 1 ) bootstatus fix for omap3, > > 2 ) omap-wdt framework update cater for the current framework > as Shubhrajyoti comments mentioned. > > Regards, > Zumeng > > Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) > > Zumeng Chen (3): > Watchdog: Omap: Changes for the new watchdog framework > Watchdog: Omap: select watchdog core for framework change > Watchdog: Omap: get the bootstatus for OMAP2Plus > It looks like you have manually created your cover letter, cover-letter says [0/2] but actually you have 3 patches in series. You should use following command to create cover letter, git format-patch --cover-letter <no of patches OR commits for patches> Thanks, Vaibhav > arch/arm/mach-omap2/prcm.c | 5 +- > drivers/watchdog/Kconfig | 1 + > drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- > drivers/watchdog/omap_wdt.h | 5 + > 4 files changed, 133 insertions(+), 216 deletions(-) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework 2012-07-09 6:02 ` Vaibhav Hiremath (?) @ 2012-07-09 6:00 ` Zumeng Chen -1 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 6:00 UTC (permalink / raw) To: Vaibhav Hiremath Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker 于 2012年07月09日 14:02, Vaibhav Hiremath 写道: > > On 7/9/2012 10:09 AM, Zumeng Chen wrote: >> Hello, >> >> The following patches based on the 3.5-rc6 from Wim, which >> are based on: >> >> 1 ) bootstatus fix for omap3, >> >> 2 ) omap-wdt framework update cater for the current framework >> as Shubhrajyoti comments mentioned. >> >> Regards, >> Zumeng >> >> Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) >> >> Zumeng Chen (3): >> Watchdog: Omap: Changes for the new watchdog framework >> Watchdog: Omap: select watchdog core for framework change >> Watchdog: Omap: get the bootstatus for OMAP2Plus >> > It looks like you have manually created your cover letter, cover-letter > says [0/2] but actually you have 3 patches in series. > > > You should use following command to create cover letter, > > git format-patch --cover-letter<no of patches OR commits for patches> OK, I'll re-send it again, so Please ignore this thread from now. Many thanks for your kind reminder Zumeng > > > Thanks, > Vaibhav > >> arch/arm/mach-omap2/prcm.c | 5 +- >> drivers/watchdog/Kconfig | 1 + >> drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- >> drivers/watchdog/omap_wdt.h | 5 + >> 4 files changed, 133 insertions(+), 216 deletions(-) >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 6:00 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 6:00 UTC (permalink / raw) To: linux-arm-kernel ? 2012?07?09? 14:02, Vaibhav Hiremath ??: > > On 7/9/2012 10:09 AM, Zumeng Chen wrote: >> Hello, >> >> The following patches based on the 3.5-rc6 from Wim, which >> are based on: >> >> 1 ) bootstatus fix for omap3, >> >> 2 ) omap-wdt framework update cater for the current framework >> as Shubhrajyoti comments mentioned. >> >> Regards, >> Zumeng >> >> Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) >> >> Zumeng Chen (3): >> Watchdog: Omap: Changes for the new watchdog framework >> Watchdog: Omap: select watchdog core for framework change >> Watchdog: Omap: get the bootstatus for OMAP2Plus >> > It looks like you have manually created your cover letter, cover-letter > says [0/2] but actually you have 3 patches in series. > > > You should use following command to create cover letter, > > git format-patch --cover-letter<no of patches OR commits for patches> OK, I'll re-send it again, so Please ignore this thread from now. Many thanks for your kind reminder Zumeng > > > Thanks, > Vaibhav > >> arch/arm/mach-omap2/prcm.c | 5 +- >> drivers/watchdog/Kconfig | 1 + >> drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- >> drivers/watchdog/omap_wdt.h | 5 + >> 4 files changed, 133 insertions(+), 216 deletions(-) >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >> the body of a message to majordomo at vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework @ 2012-07-09 6:00 ` Zumeng Chen 0 siblings, 0 replies; 27+ messages in thread From: Zumeng Chen @ 2012-07-09 6:00 UTC (permalink / raw) To: Vaibhav Hiremath Cc: shubhrajyoti, wim, linux-watchdog, linux-omap, linux-arm-kernel, tony, paul.gortmaker 于 2012年07月09日 14:02, Vaibhav Hiremath 写道: > > On 7/9/2012 10:09 AM, Zumeng Chen wrote: >> Hello, >> >> The following patches based on the 3.5-rc6 from Wim, which >> are based on: >> >> 1 ) bootstatus fix for omap3, >> >> 2 ) omap-wdt framework update cater for the current framework >> as Shubhrajyoti comments mentioned. >> >> Regards, >> Zumeng >> >> Linux 3.5-rc6 (2012-07-07 17:23:56 -0700) >> >> Zumeng Chen (3): >> Watchdog: Omap: Changes for the new watchdog framework >> Watchdog: Omap: select watchdog core for framework change >> Watchdog: Omap: get the bootstatus for OMAP2Plus >> > It looks like you have manually created your cover letter, cover-letter > says [0/2] but actually you have 3 patches in series. > > > You should use following command to create cover letter, > > git format-patch --cover-letter<no of patches OR commits for patches> OK, I'll re-send it again, so Please ignore this thread from now. Many thanks for your kind reminder Zumeng > > > Thanks, > Vaibhav > >> arch/arm/mach-omap2/prcm.c | 5 +- >> drivers/watchdog/Kconfig | 1 + >> drivers/watchdog/omap_wdt.c | 338 ++++++++++++++++--------------------------- >> drivers/watchdog/omap_wdt.h | 5 + >> 4 files changed, 133 insertions(+), 216 deletions(-) >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2012-07-10 0:35 UTC | newest] Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-07-09 4:39 [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 4:39 ` [PATCH 1/3] Watchdog: Omap: Changes for the new " Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 4:39 ` [PATCH 2/3] Watchdog: Omap: select watchdog core for framework change Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 4:39 ` [PATCH 3/3] Watchdog: Omap: get the bootstatus for OMAP2Plus Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 4:39 ` Zumeng Chen 2012-07-09 16:40 ` Kevin Hilman 2012-07-09 16:40 ` Kevin Hilman 2012-07-09 16:40 ` Kevin Hilman 2012-07-10 0:34 ` Zumeng Chen 2012-07-10 0:34 ` Zumeng Chen 2012-07-10 0:34 ` Zumeng Chen 2012-07-09 4:46 ` [PATCH v2 0/2] Watchdog: OMAP: bootstatus fix for omap3 and changes for the current watchdog framework Zumeng Chen 2012-07-09 4:46 ` Zumeng Chen 2012-07-09 4:46 ` Zumeng Chen 2012-07-09 6:02 ` Vaibhav Hiremath 2012-07-09 6:02 ` Vaibhav Hiremath 2012-07-09 6:02 ` Vaibhav Hiremath 2012-07-09 6:00 ` Zumeng Chen 2012-07-09 6:00 ` Zumeng Chen 2012-07-09 6:00 ` Zumeng Chen
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.