linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [v2 PATCH 1/8] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
@ 2012-12-05  1:34 ` Wenyou Yang
  2012-12-05  1:34 ` [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog framework Wenyou Yang
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, wim,
	linux-watchdog, linux-kernel

Remove the global variable at91wdt_private, add the struct at91wdt_drvdata
as a substitute, and set it as the driver data of the at91wdt_wdd.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim@iguana.be
Cc: linux-watchdog@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/watchdog/at91sam9_wdt.c |   88 +++++++++++++++++++++------------------
 1 file changed, 47 insertions(+), 41 deletions(-)

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index d864dc4..f10a897 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -38,11 +38,6 @@
 
 #define DRV_NAME "AT91SAM9 Watchdog"
 
-#define wdt_read(field) \
-	__raw_readl(at91wdt_private.base + field)
-#define wdt_write(field, val) \
-	__raw_writel((val), at91wdt_private.base + field)
-
 /* AT91SAM9 watchdog runs a 12bit counter @ 256Hz,
  * use this to convert a watchdog
  * value from/to milliseconds.
@@ -72,23 +67,33 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
 
 static void at91_ping(unsigned long data);
 
-static struct {
-	void __iomem *base;
-	unsigned long next_heartbeat;	/* the next_heartbeat for the timer */
-	unsigned long open;
-	char expect_close;
-	struct timer_list timer;	/* The timer that pings the watchdog */
-} at91wdt_private;
+struct at91wdt_drvdata {
+	void __iomem	*phybase;
+	bool		is_enable;	/* indicate if the watchdog is eabled */
+	unsigned long	next_heartbeat;	/* the next_heartbeat for the timer */
+	struct timer_list	timer;	/* The timer that pings the watchdog */
+};
 
 /* ......................................................................... */
 
+static inline unsigned int wdt_read(struct at91wdt_drvdata *driver_data,
+					unsigned int field)
+{
+	return readl_relaxed(driver_data->phybase + field);
+}
+
+static inline void wdt_write(struct at91wdt_drvdata *driver_data,
+				unsigned int field, unsigned int val)
+{
+	writel_relaxed((val), driver_data->phybase + field);
+}
 
 /*
  * Reload the watchdog timer.  (ie, pat the watchdog)
  */
-static inline void at91_wdt_reset(void)
+static inline void at91_wdt_reset(struct at91wdt_drvdata *driver_data)
 {
-	wdt_write(AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
+	wdt_write(driver_data, AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
 }
 
 /*
@@ -96,10 +101,12 @@ static inline void at91_wdt_reset(void)
  */
 static void at91_ping(unsigned long data)
 {
-	if (time_before(jiffies, at91wdt_private.next_heartbeat) ||
-			(!nowayout && !at91wdt_private.open)) {
-		at91_wdt_reset();
-		mod_timer(&at91wdt_private.timer, jiffies + WDT_TIMEOUT);
+	struct watchdog_device *wddev = (struct watchdog_device *)data;
+	struct at91wdt_drvdata *driver_data = watchdog_get_drvdata(wddev);
+
+	if (time_before(jiffies, driver_data->next_heartbeat)) {
+		at91_wdt_reset(driver_data);
+		mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
 	} else
 		pr_crit("I will reset your machine !\n");
 }
@@ -109,11 +116,8 @@ static void at91_ping(unsigned long data)
  */
 static int at91_wdt_open(struct inode *inode, struct file *file)
 {
-	if (test_and_set_bit(0, &at91wdt_private.open))
-		return -EBUSY;
-
-	at91wdt_private.next_heartbeat = jiffies + heartbeat * HZ;
-	mod_timer(&at91wdt_private.timer, jiffies + WDT_TIMEOUT);
+	driver_data->next_heartbeat = jiffies + heartbeat * HZ;
+	mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
 
 	return nonseekable_open(inode, file);
 }
@@ -123,13 +127,8 @@ static int at91_wdt_open(struct inode *inode, struct file *file)
  */
 static int at91_wdt_close(struct inode *inode, struct file *file)
 {
-	clear_bit(0, &at91wdt_private.open);
+	del_timer(&driver_data->timer);
 
-	/* stop internal ping */
-	if (!at91wdt_private.expect_close)
-		del_timer(&at91wdt_private.timer);
-
-	at91wdt_private.expect_close = 0;
 	return 0;
 }
 
@@ -191,7 +190,7 @@ static long at91_wdt_ioctl(struct file *file,
 		return put_user(0, p);
 
 	case WDIOC_KEEPALIVE:
-		at91wdt_private.next_heartbeat = jiffies + heartbeat * HZ;
+		driver_data->next_heartbeat = jiffies + heartbeat * HZ;
 		return 0;
 
 	case WDIOC_SETTIMEOUT:
@@ -199,7 +198,7 @@ static long at91_wdt_ioctl(struct file *file,
 			return -EFAULT;
 
 		heartbeat = new_value;
-		at91wdt_private.next_heartbeat = jiffies + heartbeat * HZ;
+		driver_data->next_heartbeat = jiffies + heartbeat * HZ;
 
 		return put_user(new_value, p);  /* return current value */
 
@@ -222,20 +221,16 @@ static ssize_t at91_wdt_write(struct file *file, const char *data, size_t len,
 	if (!nowayout) {
 		size_t i;
 
-		at91wdt_private.expect_close = 0;
 
 		for (i = 0; i < len; i++) {
 			char c;
 			if (get_user(c, data + i))
 				return -EFAULT;
-			if (c == 'V') {
-				at91wdt_private.expect_close = 42;
-				break;
 			}
 		}
 	}
 
-	at91wdt_private.next_heartbeat = jiffies + heartbeat * HZ;
+	driver_data->next_heartbeat = jiffies + heartbeat * HZ;
 
 	return len;
 }
@@ -265,9 +260,19 @@ static struct watchdog_device at91wdt_wdd __initdata = {
 
 static int __init at91wdt_probe(struct platform_device *pdev)
 {
+	struct at91wdt_drvdata *driver_data;
 	struct resource	*r;
 	int res;
 
+	driver_data = devm_kzalloc(&pdev->dev,
+				sizeof(*driver_data), GFP_KERNEL);
+	if (!driver_data) {
+		dev_err(&pdev->dev, "Unable to alloacate watchdog device\n");
+		return -ENOMEM;
+	}
+
+	watchdog_set_drvdata(&at91wdt_wdd, driver_data);
+
 	if (at91wdt_miscdev.parent)
 		return -EBUSY;
 	at91wdt_miscdev.parent = &pdev->dev;
@@ -275,8 +280,8 @@ static int __init at91wdt_probe(struct platform_device *pdev)
 	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!r)
 		return -ENODEV;
-	at91wdt_private.base = ioremap(r->start, resource_size(r));
-	if (!at91wdt_private.base) {
+	driver_data->phybase = ioremap(r->start, resource_size(r));
+	if (!driver_data->phybase) {
 		dev_err(&pdev->dev, "failed to map registers, aborting.\n");
 		return -ENOMEM;
 	}
@@ -292,9 +297,10 @@ static int __init at91wdt_probe(struct platform_device *pdev)
 	if (res)
 		return res;
 
-	at91wdt_private.next_heartbeat = jiffies + at91wdt_wdd.timeout * HZ;
-	setup_timer(&at91wdt_private.timer, at91_ping, 0);
-	mod_timer(&at91wdt_private.timer, jiffies + WDT_TIMEOUT);
+	driver_data->next_heartbeat = jiffies + at91wdt_wdd.timeout * HZ;
+	setup_timer(&driver_data->timer, at91_ping,
+					(unsigned long)&at91wdt_wdd);
+	mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
 
 	pr_info("enabled (heartbeat=%d sec, nowayout=%d)\n",
 		at91wdt_wdd.timeout, nowayout);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog framework
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
  2012-12-05  1:34 ` [v2 PATCH 1/8] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct Wenyou Yang
@ 2012-12-05  1:34 ` Wenyou Yang
  2012-12-05 10:47   ` Florian Fainelli
  2012-12-05  1:34 ` [v2 PATCH 3/8] watchdog/at91sam9_wdt: Adjust the options of watchdog_info Wenyou Yang
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, wim,
	linux-watchdog, linux-kernel

According to the kernel document: convert_drivers_to_kernel_api.txt,
remove the file_operations struct, miscdevice, and obsolete includes

Since the at91sam watchdog inherent characteristics, add the watchdog
operations: at91wdt_start, at91wdt_stop and at91wdt_ping.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim@iguana.be
Cc: linux-watchdog@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/watchdog/at91sam9_wdt.c |  203 +++++++++++++++------------------------
 1 file changed, 75 insertions(+), 128 deletions(-)

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index f10a897..92467d4 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -13,16 +13,17 @@
  * The Watchdog Timer Mode Register can be only written to once. If the
  * timeout need to be set from Linux, be sure that the bootstrap or the
  * bootloader doesn't write to this register.
+ * The Watchdog Timer default is running with maximum counter value
+ * (WDV=0xfff) at reset, i.e., at power-up. It MUST be either disabled
+ * or be reprogrammed within the maxinum margin(16s).
  */
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/errno.h>
-#include <linux/fs.h>
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
-#include <linux/miscdevice.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/platform_device.h>
@@ -31,7 +32,6 @@
 #include <linux/jiffies.h>
 #include <linux/timer.h>
 #include <linux/bitops.h>
-#include <linux/uaccess.h>
 #include <linux/of.h>
 
 #include "at91sam9_wdt.h"
@@ -65,8 +65,6 @@ module_param(nowayout, bool, 0);
 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
 	"(default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
-static void at91_ping(unsigned long data);
-
 struct at91wdt_drvdata {
 	void __iomem	*phybase;
 	bool		is_enable;	/* indicate if the watchdog is eabled */
@@ -88,6 +86,11 @@ static inline void wdt_write(struct at91wdt_drvdata *driver_data,
 	writel_relaxed((val), driver_data->phybase + field);
 }
 
+static inline bool watchdog_is_open(struct watchdog_device *wddev)
+{
+	return test_bit(WDOG_DEV_OPEN, &wddev->status);
+}
+
 /*
  * Reload the watchdog timer.  (ie, pat the watchdog)
  */
@@ -99,7 +102,7 @@ static inline void at91_wdt_reset(struct at91wdt_drvdata *driver_data)
 /*
  * Timer tick
  */
-static void at91_ping(unsigned long data)
+static void at91wdt_timer_tick(unsigned long data)
 {
 	struct watchdog_device *wddev = (struct watchdog_device *)data;
 	struct at91wdt_drvdata *driver_data = watchdog_get_drvdata(wddev);
@@ -107,45 +110,30 @@ static void at91_ping(unsigned long data)
 	if (time_before(jiffies, driver_data->next_heartbeat)) {
 		at91_wdt_reset(driver_data);
 		mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
+
+		if (!watchdog_is_open(wddev))
+			driver_data->next_heartbeat = jiffies
+						+ wddev->timeout * HZ;
 	} else
 		pr_crit("I will reset your machine !\n");
 }
 
-/*
- * Watchdog device is opened, and watchdog starts running.
- */
-static int at91_wdt_open(struct inode *inode, struct file *file)
-{
-	driver_data->next_heartbeat = jiffies + heartbeat * HZ;
-	mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
-
-	return nonseekable_open(inode, file);
-}
-
-/*
- * Close the watchdog device.
- */
-static int at91_wdt_close(struct inode *inode, struct file *file)
-{
-	del_timer(&driver_data->timer);
-
-	return 0;
-}
-
-/*
- * Set the watchdog time interval in 1/256Hz (write-once)
- * Counter is 12 bit.
- */
-static int at91_wdt_settimeout(unsigned int timeout)
+static int at91wdt_enable(struct watchdog_device *wddev, unsigned int timeout)
 {
+	struct at91wdt_drvdata *driver_data = watchdog_get_drvdata(wddev);
 	unsigned int reg;
-	unsigned int mr;
 
-	/* Check if disabled */
-	mr = wdt_read(AT91_WDT_MR);
-	if (mr & AT91_WDT_WDDIS) {
-		pr_err("sorry, watchdog is disabled\n");
-		return -EIO;
+	/*
+	 * Check if the watchdog is disabled,
+	 * if disabled, the reason is the bootstrap or the bootloader has
+	 * written the Watchdog Timer Mode Register to disable the
+	 * watchdog timer
+	 */
+	reg = wdt_read(driver_data, AT91_WDT_MR);
+	if (reg & AT91_WDT_WDDIS) {
+		driver_data->is_enable = false;
+		pr_info("sorry, watchdog is disabled\n");
+		return -1;
 	}
 
 	/*
@@ -159,7 +147,9 @@ static int at91_wdt_settimeout(unsigned int timeout)
 		| AT91_WDT_WDDBGHLT	/* disabled in debug mode */
 		| AT91_WDT_WDD		/* restart at any time */
 		| (timeout & AT91_WDT_WDV);  /* timer value */
-	wdt_write(AT91_WDT_MR, reg);
+	wdt_write(driver_data, AT91_WDT_MR, reg);
+
+	driver_data->is_enable = true;
 
 	return 0;
 }
@@ -170,99 +160,61 @@ static const struct watchdog_info at91_wdt_info = {
 						WDIOF_MAGICCLOSE,
 };
 
-/*
- * Handle commands from user-space.
- */
-static long at91_wdt_ioctl(struct file *file,
-		unsigned int cmd, unsigned long arg)
+static int at91wdt_start(struct watchdog_device *wddev)
 {
-	void __user *argp = (void __user *)arg;
-	int __user *p = argp;
-	int new_value;
-
-	switch (cmd) {
-	case WDIOC_GETSUPPORT:
-		return copy_to_user(argp, &at91_wdt_info,
-				    sizeof(at91_wdt_info)) ? -EFAULT : 0;
-
-	case WDIOC_GETSTATUS:
-	case WDIOC_GETBOOTSTATUS:
-		return put_user(0, p);
+	struct at91wdt_drvdata *driver_data = watchdog_get_drvdata(wddev);
 
-	case WDIOC_KEEPALIVE:
-		driver_data->next_heartbeat = jiffies + heartbeat * HZ;
+	if (driver_data->is_enable) {
+		driver_data->next_heartbeat = jiffies + wddev->timeout * HZ;
+		mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
 		return 0;
-
-	case WDIOC_SETTIMEOUT:
-		if (get_user(new_value, p))
-			return -EFAULT;
-
-		heartbeat = new_value;
-		driver_data->next_heartbeat = jiffies + heartbeat * HZ;
-
-		return put_user(new_value, p);  /* return current value */
-
-	case WDIOC_GETTIMEOUT:
-		return put_user(heartbeat, p);
-	}
-	return -ENOTTY;
+	} else
+		return -EIO;
 }
 
-/*
- * Pat the watchdog whenever device is written to.
- */
-static ssize_t at91_wdt_write(struct file *file, const char *data, size_t len,
-								loff_t *ppos)
+static int at91wdt_stop(struct watchdog_device *wddev)
 {
-	if (!len)
-		return 0;
-
-	/* Scan for magic character */
-	if (!nowayout) {
-		size_t i;
-
+	struct at91wdt_drvdata *driver_data = watchdog_get_drvdata(wddev);
 
-		for (i = 0; i < len; i++) {
-			char c;
-			if (get_user(c, data + i))
-				return -EFAULT;
-			}
-		}
-	}
+	if (driver_data->is_enable)
+		return -EIO;
+	else
+		return 0;
+}
 
-	driver_data->next_heartbeat = jiffies + heartbeat * HZ;
+static int at91wdt_ping(struct watchdog_device *wddev)
+{
+	struct at91wdt_drvdata *driver_data = watchdog_get_drvdata(wddev);
 
-	return len;
+	if (driver_data->is_enable) {
+		driver_data->next_heartbeat = jiffies + wddev->timeout * HZ;
+		 mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
+		return 0;
+	} else
+		return -EIO;
 }
-
 /* ......................................................................... */
 
-static const struct file_operations at91wdt_fops = {
-	.owner			= THIS_MODULE,
-	.llseek			= no_llseek,
-	.unlocked_ioctl	= at91_wdt_ioctl,
-	.open			= at91_wdt_open,
-	.release		= at91_wdt_close,
-	.write			= at91_wdt_write,
-};
-
-static struct miscdevice at91wdt_miscdev = {
-	.minor		= WATCHDOG_MINOR,
-	.name		= "watchdog",
-	.fops		= &at91wdt_fops,
+static struct watchdog_ops at91wdt_ops = {
+	.owner = THIS_MODULE,
+	.start = at91wdt_start,
+	.stop = at91wdt_stop,
+	.ping = at91wdt_ping,
 };
 
 static struct watchdog_device at91wdt_wdd __initdata = {
 	.timeout = WDT_HEARTBEAT,
 	.min_timeout = MIN_HEARTBEAT,
 	.max_timeout = MAX_HEARTBEAT,
+	.info = &at91_wdt_info,
+	.ops = &at91wdt_ops,
 };
 
 static int __init at91wdt_probe(struct platform_device *pdev)
 {
 	struct at91wdt_drvdata *driver_data;
 	struct resource	*r;
-	int res;
+	int ret;
 
 	driver_data = devm_kzalloc(&pdev->dev,
 				sizeof(*driver_data), GFP_KERNEL);
@@ -273,32 +225,32 @@ static int __init at91wdt_probe(struct platform_device *pdev)
 
 	watchdog_set_drvdata(&at91wdt_wdd, driver_data);
 
-	if (at91wdt_miscdev.parent)
-		return -EBUSY;
-	at91wdt_miscdev.parent = &pdev->dev;
-
 	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!r)
 		return -ENODEV;
+
 	driver_data->phybase = ioremap(r->start, resource_size(r));
 	if (!driver_data->phybase) {
 		dev_err(&pdev->dev, "failed to map registers, aborting.\n");
 		return -ENOMEM;
 	}
 
-	watchdog_init_timeout(&at91wdt_wdd, heartbeat, pdev->dev.of_node);
+	ret = watchdog_register_device(&at91wdt_wdd);
+	if (ret) {
+		dev_err(&pdev->dev, "cannot register watchdog (%d)\n", ret);
+		return ret;
+	}
 
-	/* Set watchdog */
-	res = at91_wdt_settimeout(ms_to_ticks(WDT_HW_TIMEOUT * 1000));
-	if (res)
-		return res;
+	watchdog_init_timeout(&at91wdt_wdd, heartbeat, pdev->dev.of_node);
 
-	res = misc_register(&at91wdt_miscdev);
-	if (res)
-		return res;
+	ret = at91wdt_enable(&at91wdt_wdd, ms_to_ticks(WDT_HW_TIMEOUT * 1000));
+	if (ret) {
+		pr_info("the watchdog has been disabled\n");
+		return 0;
+	}
 
 	driver_data->next_heartbeat = jiffies + at91wdt_wdd.timeout * HZ;
-	setup_timer(&driver_data->timer, at91_ping,
+	setup_timer(&driver_data->timer, at91wdt_timer_tick,
 					(unsigned long)&at91wdt_wdd);
 	mod_timer(&driver_data->timer, jiffies + WDT_TIMEOUT);
 
@@ -310,13 +262,9 @@ static int __init at91wdt_probe(struct platform_device *pdev)
 
 static int __exit at91wdt_remove(struct platform_device *pdev)
 {
-	int res;
+	watchdog_unregister_device(&at91wdt_wdd);
 
-	res = misc_deregister(&at91wdt_miscdev);
-	if (!res)
-		at91wdt_miscdev.parent = NULL;
-
-	return res;
+	return 0;
 }
 
 #if defined(CONFIG_OF)
@@ -353,4 +301,3 @@ module_exit(at91sam_wdt_exit);
 MODULE_AUTHOR("Renaud CERRATO <r.cerrato@til-technologies.fr>");
 MODULE_DESCRIPTION("Watchdog driver for Atmel AT91SAM9x processors");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [v2 PATCH 3/8] watchdog/at91sam9_wdt: Adjust the options of watchdog_info
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
  2012-12-05  1:34 ` [v2 PATCH 1/8] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct Wenyou Yang
  2012-12-05  1:34 ` [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog framework Wenyou Yang
@ 2012-12-05  1:34 ` Wenyou Yang
  2012-12-05  1:34 ` [v2 PATCH 4/8] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API Wenyou Yang
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, wim,
	linux-watchdog, linux-kernel

Since the Watchdog Timer Mode Register can be only written only once,
so the watchdog_info shall not support WDIOF_SETTIMEOUT
and WDIOF_MAGICCLOSE options, remove them.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim@iguana.be
Cc: linux-watchdog@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/watchdog/at91sam9_wdt.c |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index 92467d4..4dc6d61 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -156,8 +156,7 @@ static int at91wdt_enable(struct watchdog_device *wddev, unsigned int timeout)
 
 static const struct watchdog_info at91_wdt_info = {
 	.identity	= DRV_NAME,
-	.options	= WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING |
-						WDIOF_MAGICCLOSE,
+	.options	= WDIOF_KEEPALIVEPING,
 };
 
 static int at91wdt_start(struct watchdog_device *wddev)
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [v2 PATCH 4/8] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
                   ` (2 preceding siblings ...)
  2012-12-05  1:34 ` [v2 PATCH 3/8] watchdog/at91sam9_wdt: Adjust the options of watchdog_info Wenyou Yang
@ 2012-12-05  1:34 ` Wenyou Yang
  2012-12-05  1:34 ` [v2 PATCH 5/8] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd Wenyou Yang
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, wim,
	linux-watchdog, linux-kernel

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim@iguana.be
Cc: linux-watchdog@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/watchdog/at91sam9_wdt.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index 4dc6d61..f1e21dd 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -240,6 +240,8 @@ static int __init at91wdt_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	watchdog_set_nowayout(&at91wdt_wdd, nowayout);
+
 	watchdog_init_timeout(&at91wdt_wdd, heartbeat, pdev->dev.of_node);
 
 	ret = at91wdt_enable(&at91wdt_wdd, ms_to_ticks(WDT_HW_TIMEOUT * 1000));
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [v2 PATCH 5/8] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
                   ` (3 preceding siblings ...)
  2012-12-05  1:34 ` [v2 PATCH 4/8] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API Wenyou Yang
@ 2012-12-05  1:34 ` Wenyou Yang
  2012-12-05  1:34 ` [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, wim,
	linux-watchdog, linux-kernel

For this variable will be used in the timer handler.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim@iguana.be
Cc: linux-watchdog@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/watchdog/at91sam9_wdt.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index f1e21dd..5afd3fb 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -201,7 +201,7 @@ static struct watchdog_ops at91wdt_ops = {
 	.ping = at91wdt_ping,
 };
 
-static struct watchdog_device at91wdt_wdd __initdata = {
+static struct watchdog_device at91wdt_wdd = {
 	.timeout = WDT_HEARTBEAT,
 	.min_timeout = MIN_HEARTBEAT,
 	.max_timeout = MAX_HEARTBEAT,
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use module_platform_driver()
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
                   ` (4 preceding siblings ...)
  2012-12-05  1:34 ` [v2 PATCH 5/8] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd Wenyou Yang
@ 2012-12-05  1:34 ` Wenyou Yang
  2012-12-06 18:16   ` Sergei Shtylyov
  2012-12-05  1:34 ` [v2 PATCH 7/8] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC Wenyou Yang
  2012-12-05  1:34 ` [v2 PATCH 8/8] ARM: dts: add the watchdog nodes for at91sam9g25ek boards Wenyou Yang
  7 siblings, 1 reply; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, wim,
	linux-watchdog, linux-kernel

Using module_platform_driver() replaces module_init() and module_exit()
and makes the code simpler.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim@iguana.be
Cc: linux-watchdog@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/watchdog/at91sam9_wdt.c |   14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index 5afd3fb..a7c0881 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -278,6 +278,7 @@ MODULE_DEVICE_TABLE(of, at91_wdt_dt_ids);
 #endif
 
 static struct platform_driver at91wdt_driver = {
+	.probe		= at91wdt_probe,
 	.remove		= __exit_p(at91wdt_remove),
 	.driver		= {
 		.name	= "at91_wdt",
@@ -286,18 +287,7 @@ static struct platform_driver at91wdt_driver = {
 	},
 };
 
-static int __init at91sam_wdt_init(void)
-{
-	return platform_driver_probe(&at91wdt_driver, at91wdt_probe);
-}
-
-static void __exit at91sam_wdt_exit(void)
-{
-	platform_driver_unregister(&at91wdt_driver);
-}
-
-module_init(at91sam_wdt_init);
-module_exit(at91sam_wdt_exit);
+module_platform_driver(at91wdt_driver);
 
 MODULE_AUTHOR("Renaud CERRATO <r.cerrato@til-technologies.fr>");
 MODULE_DESCRIPTION("Watchdog driver for Atmel AT91SAM9x processors");
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [v2 PATCH 7/8] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
                   ` (5 preceding siblings ...)
  2012-12-05  1:34 ` [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
@ 2012-12-05  1:34 ` Wenyou Yang
  2012-12-05  1:34 ` [v2 PATCH 8/8] ARM: dts: add the watchdog nodes for at91sam9g25ek boards Wenyou Yang
  7 siblings, 0 replies; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, linux, linux-kernel

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: linux@arm.linux.org.uk
Cc: linux-kernel@vger.kernel.org
---
 arch/arm/boot/dts/at91sam9n12.dtsi |    6 ++++++
 arch/arm/boot/dts/at91sam9x5.dtsi  |    6 ++++++
 2 files changed, 12 insertions(+)

diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi
index 82508d6..4c3b411 100644
--- a/arch/arm/boot/dts/at91sam9n12.dtsi
+++ b/arch/arm/boot/dts/at91sam9n12.dtsi
@@ -202,6 +202,12 @@
 				#size-cells = <0>;
 				status = "disabled";
 			};
+
+			watchdog@fffffe40 {
+				compatible = "atmel,at91sam9260-wdt";
+				reg = <0xfffffe40 0x10>;
+				status = "disabled";
+			};
 		};
 
 		nand0: nand@40000000 {
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
index 03fc136..e8e7afe 100644
--- a/arch/arm/boot/dts/at91sam9x5.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5.dtsi
@@ -263,6 +263,12 @@
 					trigger-value = <0x6>;
 				};
 			};
+
+			watchdog@fffffe40 {
+				compatible = "atmel,at91sam9260-wdt";
+				reg = <0xfffffe40 0x10>;
+				status = "disabled";
+			};
 		};
 
 		nand0: nand@40000000 {
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [v2 PATCH 8/8] ARM: dts: add the watchdog nodes for at91sam9g25ek boards
       [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
                   ` (6 preceding siblings ...)
  2012-12-05  1:34 ` [v2 PATCH 7/8] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC Wenyou Yang
@ 2012-12-05  1:34 ` Wenyou Yang
  7 siblings, 0 replies; 12+ messages in thread
From: Wenyou Yang @ 2012-12-05  1:34 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: nicolas.ferre, plagnioj, JM.Lin, wenyou.yang, linux, linux-kernel

Tested on the at91sam9g25ek boards

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: linux@arm.linux.org.uk
Cc: linux-kernel@vger.kernel.org
---
 arch/arm/boot/dts/at91sam9g25ek.dts |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts
index 877c08f..2f03edc 100644
--- a/arch/arm/boot/dts/at91sam9g25ek.dts
+++ b/arch/arm/boot/dts/at91sam9g25ek.dts
@@ -44,6 +44,10 @@
 			i2c2: i2c@f8018000 {
 				status = "okay";
 			};
+
+			watchdog@fffffe40 {
+				status = "okay";
+			};
 		};
 
 		usb0: ohci@00600000 {
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog framework
  2012-12-05  1:34 ` [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog framework Wenyou Yang
@ 2012-12-05 10:47   ` Florian Fainelli
  2012-12-06  0:54     ` Yang, Wenyou
  0 siblings, 1 reply; 12+ messages in thread
From: Florian Fainelli @ 2012-12-05 10:47 UTC (permalink / raw)
  To: Wenyou Yang
  Cc: linux-arm-kernel, nicolas.ferre, plagnioj, JM.Lin, wim,
	linux-watchdog, linux-kernel

Hello Wenyou,

On Wednesday 05 December 2012 09:34:21 Wenyou Yang wrote:
> According to the kernel document: convert_drivers_to_kernel_api.txt,
> remove the file_operations struct, miscdevice, and obsolete includes
> 
> Since the at91sam watchdog inherent characteristics, add the watchdog
> operations: at91wdt_start, at91wdt_stop and at91wdt_ping.
> 

[snip]

>  
> +static inline bool watchdog_is_open(struct watchdog_device *wddev)
> +{
> +	return test_bit(WDOG_DEV_OPEN, &wddev->status);
> +}

This helper should be moved to include/linux/watchdog.h as it can be useful
for other watchdog drivers as well. 
--
Florian

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog framework
  2012-12-05 10:47   ` Florian Fainelli
@ 2012-12-06  0:54     ` Yang, Wenyou
  0 siblings, 0 replies; 12+ messages in thread
From: Yang, Wenyou @ 2012-12-06  0:54 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: linux-arm-kernel, Ferre, Nicolas, plagnioj, Lin, JM, wim,
	linux-watchdog, linux-kernel

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 1333 bytes --]

Hi Florian,

> -----Original Message-----
> From: Florian Fainelli [mailto:f.fainelli@gmail.com] On Behalf Of Florian Fainelli
> Sent: 2012年12月5日 18:48
> To: Yang, Wenyou
> Cc: linux-arm-kernel@lists.infradead.org; Ferre, Nicolas; plagnioj@jcrosoft.com; Lin,
> JM; wim@iguana.be; linux-watchdog@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: Re: [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog
> framework
> 
> Hello Wenyou,
> 
> On Wednesday 05 December 2012 09:34:21 Wenyou Yang wrote:
> > According to the kernel document: convert_drivers_to_kernel_api.txt,
> > remove the file_operations struct, miscdevice, and obsolete includes
> >
> > Since the at91sam watchdog inherent characteristics, add the watchdog
> > operations: at91wdt_start, at91wdt_stop and at91wdt_ping.
> >
> 
> [snip]
> 
> >
> > +static inline bool watchdog_is_open(struct watchdog_device *wddev)
> > +{
> > +	return test_bit(WDOG_DEV_OPEN, &wddev->status);
> > +}
> 
> This helper should be moved to include/linux/watchdog.h as it can be useful
> for other watchdog drivers as well.

Thanks, I will move it in next version.

> --
> Florian

Best Regards
Wenyou Yang
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use module_platform_driver()
  2012-12-05  1:34 ` [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
@ 2012-12-06 18:16   ` Sergei Shtylyov
  2012-12-07  7:12     ` Yang, Wenyou
  0 siblings, 1 reply; 12+ messages in thread
From: Sergei Shtylyov @ 2012-12-06 18:16 UTC (permalink / raw)
  To: Wenyou Yang
  Cc: linux-arm-kernel, linux-watchdog, JM.Lin, nicolas.ferre,
	linux-kernel, wim, plagnioj

Hello.

On 12/05/2012 04:34 AM, Wenyou Yang wrote:

> Using module_platform_driver() replaces module_init() and module_exit()
> and makes the code simpler.

> Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> Cc: wim@iguana.be
> Cc: linux-watchdog@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> ---
>  drivers/watchdog/at91sam9_wdt.c |   14 ++------------
>  1 file changed, 2 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
> index 5afd3fb..a7c0881 100644
> --- a/drivers/watchdog/at91sam9_wdt.c
> +++ b/drivers/watchdog/at91sam9_wdt.c
> @@ -278,6 +278,7 @@ MODULE_DEVICE_TABLE(of, at91_wdt_dt_ids);
>  #endif
>  
>  static struct platform_driver at91wdt_driver = {
> +	.probe		= at91wdt_probe,

   You also need to remove '__init' annotation from that function since the
driver becomes hot-plug aware now.

WBR, Sergei


^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use module_platform_driver()
  2012-12-06 18:16   ` Sergei Shtylyov
@ 2012-12-07  7:12     ` Yang, Wenyou
  0 siblings, 0 replies; 12+ messages in thread
From: Yang, Wenyou @ 2012-12-07  7:12 UTC (permalink / raw)
  To: Sergei Shtylyov
  Cc: linux-arm-kernel, linux-watchdog, Lin, JM, Ferre, Nicolas,
	linux-kernel, wim, plagnioj

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="gb2312", Size: 1550 bytes --]

Hi,

> -----Original Message-----
> From: Sergei Shtylyov [mailto:sshtylyov@mvista.com]
> Sent: 2012Äê12ÔÂ7ÈÕ 2:16
> To: Yang, Wenyou
> Cc: linux-arm-kernel@lists.infradead.org; linux-watchdog@vger.kernel.org; Lin, JM;
> Ferre, Nicolas; linux-kernel@vger.kernel.org; wim@iguana.be;
> plagnioj@jcrosoft.com
> Subject: Re: [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use
> module_platform_driver()
> 
> Hello.
> 
> On 12/05/2012 04:34 AM, Wenyou Yang wrote:
> 
> > Using module_platform_driver() replaces module_init() and module_exit()
> > and makes the code simpler.
> 
> > Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> > Cc: wim@iguana.be
> > Cc: linux-watchdog@vger.kernel.org
> > Cc: linux-kernel@vger.kernel.org
> > ---
> >  drivers/watchdog/at91sam9_wdt.c |   14 ++------------
> >  1 file changed, 2 insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
> > index 5afd3fb..a7c0881 100644
> > --- a/drivers/watchdog/at91sam9_wdt.c
> > +++ b/drivers/watchdog/at91sam9_wdt.c
> > @@ -278,6 +278,7 @@ MODULE_DEVICE_TABLE(of, at91_wdt_dt_ids);
> >  #endif
> >
> >  static struct platform_driver at91wdt_driver = {
> > +	.probe		= at91wdt_probe,
> 
>    You also need to remove '__init' annotation from that function since the
> driver becomes hot-plug aware now.
Thanks, I got it.
> 
> WBR, Sergei

Best Regards,
Wenyou Yang
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2012-12-07  7:15 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1354671267-19277-1-git-send-email-wenyou.yang@atmel.com>
2012-12-05  1:34 ` [v2 PATCH 1/8] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct Wenyou Yang
2012-12-05  1:34 ` [v2 PATCH 2/8] watchdog/at91sam9_wdt: Convert to use the watchdog framework Wenyou Yang
2012-12-05 10:47   ` Florian Fainelli
2012-12-06  0:54     ` Yang, Wenyou
2012-12-05  1:34 ` [v2 PATCH 3/8] watchdog/at91sam9_wdt: Adjust the options of watchdog_info Wenyou Yang
2012-12-05  1:34 ` [v2 PATCH 4/8] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API Wenyou Yang
2012-12-05  1:34 ` [v2 PATCH 5/8] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd Wenyou Yang
2012-12-05  1:34 ` [v2 PATCH 6/8] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
2012-12-06 18:16   ` Sergei Shtylyov
2012-12-07  7:12     ` Yang, Wenyou
2012-12-05  1:34 ` [v2 PATCH 7/8] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC Wenyou Yang
2012-12-05  1:34 ` [v2 PATCH 8/8] ARM: dts: add the watchdog nodes for at91sam9g25ek boards Wenyou Yang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).