All of lore.kernel.org
 help / color / mirror / Atom feed
* [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: 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 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: 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 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: 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 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: 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

* 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

* 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

* [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  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

* 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

* [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  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

* 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

* [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 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

* 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

* [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
  (?)
@ 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

* 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

* [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

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.