public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework
@ 2013-01-05  2:38 Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 1/9] watchdog: add the function watchdog_is_open Wenyou Yang
                   ` (8 more replies)
  0 siblings, 9 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

Hi, All

The purpose of the patch series is to convert to use the watchdog framework,
It is tested on at91sam9g25ek.

It is based on v3.8-rc2 + Fabio Porcedda's add timeout-sec property binding

ChangeLog 
v3:
	1./ The helper function 'watchdog_is_open' is moved to
	    include/linux/watchdog.h, as it can be useful for other watchdog
	    drivers as well.

	2./ Remove '__init' annotation from the function 'at91wdt_probe',
	    since the driver becomes hot-plug aware now.
	
	3./ Rebase on v3.8-rc2

v2:
	1./ Remove the patches to add devive tree support which Fabio Porcedda
	   has done and submitted.

	2./ Replace __raw_readl, __raw_writel with readl_relaxed, writel_relaxed.

	3./ Rebase on v3.7-rc8.

Best Regards
Wenyou Yang

Wenyou Yang (9):
  watchdog: add the function watchdog_is_open
  watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata
    struct
  watchdog/at91sam9_wdt: Convert to use the watchdog framework
  watchdog/at91sam9_wdt: Adjust the options of watchdog_info
  watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver
    Kernel API
  watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd
  watchdog/at91sam9_wdt: Use module_platform_driver()
  ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC
  ARM: dts: add the watchdog nodes for at91sam9g25ek boards

 arch/arm/boot/dts/at91sam9n12.dtsi  |    6 +
 arch/arm/boot/dts/at91sam9x5.dtsi   |    6 +
 arch/arm/boot/dts/at91sam9x5ek.dtsi |    4 +
 drivers/watchdog/at91sam9_wdt.c     |  287 ++++++++++++++---------------------
 include/linux/watchdog.h            |    8 +
 5 files changed, 137 insertions(+), 174 deletions(-)

-- 
1.7.9.5

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

* [v3 PATCH 1/9] watchdog: add the function watchdog_is_open
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 2/9] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct Wenyou Yang
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

Add the function watchdog_is_open to check whether or not
the /dev/watchdog? is opened

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---
 include/linux/watchdog.h |    8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h
index e40cc2b..7ea4465 100644
--- a/include/linux/watchdog.h
+++ b/include/linux/watchdog.h
@@ -111,6 +111,14 @@ static inline bool watchdog_active(struct watchdog_device *wdd)
 	return test_bit(WDOG_ACTIVE, &wdd->status);
 }
 
+/* Use the following function to check whether or not
+ * the /dev/watchdog? is opened
+ */
+static inline bool watchdog_is_open(struct watchdog_device *wddev)
+{
+	return test_bit(WDOG_DEV_OPEN, &wddev->status);
+}
+
 /* Use the following function to set the nowayout feature */
 static inline void watchdog_set_nowayout(struct watchdog_device *wdd, bool nowayout)
 {
-- 
1.7.9.5

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

* [v3 PATCH 2/9] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 1/9] watchdog: add the function watchdog_is_open Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 3/9] watchdog/at91sam9_wdt: Convert to use the watchdog framework Wenyou Yang
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-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 at iguana.be
Cc: linux-watchdog at vger.kernel.org
Cc: linux-kernel at 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] 14+ messages in thread

* [v3 PATCH 3/9] watchdog/at91sam9_wdt: Convert to use the watchdog framework
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 1/9] watchdog: add the function watchdog_is_open Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 2/9] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 4/9] watchdog/at91sam9_wdt: Adjust the options of watchdog_info Wenyou Yang
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

According to Documentation/watchdog/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 at iguana.be
Cc: linux-watchdog at vger.kernel.org
Cc: linux-kernel at vger.kernel.org
---
 drivers/watchdog/at91sam9_wdt.c |  198 ++++++++++++++-------------------------
 1 file changed, 70 insertions(+), 128 deletions(-)

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index f10a897..febd028 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 */
@@ -99,7 +97,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 +105,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 +142,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 +155,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 +220,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 +257,9 @@ static int __init at91wdt_probe(struct platform_device *pdev)
 
 static int __exit at91wdt_remove(struct platform_device *pdev)
 {
-	int res;
-
-	res = misc_deregister(&at91wdt_miscdev);
-	if (!res)
-		at91wdt_miscdev.parent = NULL;
+	watchdog_unregister_device(&at91wdt_wdd);
 
-	return res;
+	return 0;
 }
 
 #if defined(CONFIG_OF)
@@ -353,4 +296,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] 14+ messages in thread

* [v3 PATCH 4/9] watchdog/at91sam9_wdt: Adjust the options of watchdog_info
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
                   ` (2 preceding siblings ...)
  2013-01-05  2:38 ` [v3 PATCH 3/9] watchdog/at91sam9_wdt: Convert to use the watchdog framework Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 5/9] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API Wenyou Yang
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-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 at iguana.be
Cc: linux-watchdog at vger.kernel.org
Cc: linux-kernel at 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 febd028..a3d1a09 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -151,8 +151,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] 14+ messages in thread

* [v3 PATCH 5/9] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
                   ` (3 preceding siblings ...)
  2013-01-05  2:38 ` [v3 PATCH 4/9] watchdog/at91sam9_wdt: Adjust the options of watchdog_info Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 6/9] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd Wenyou Yang
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim at iguana.be
Cc: linux-watchdog at vger.kernel.org
Cc: linux-kernel at 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 a3d1a09..53ede84 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -235,6 +235,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] 14+ messages in thread

* [v3 PATCH 6/9] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
                   ` (4 preceding siblings ...)
  2013-01-05  2:38 ` [v3 PATCH 5/9] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

For this variable will be used in the timer handler.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: wim at iguana.be
Cc: linux-watchdog at vger.kernel.org
Cc: linux-kernel at 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 53ede84..94be9d6 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -196,7 +196,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] 14+ messages in thread

* [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use module_platform_driver()
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
                   ` (5 preceding siblings ...)
  2013-01-05  2:38 ` [v3 PATCH 6/9] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-08 10:17   ` Fabio Porcedda
  2013-01-05  2:38 ` [v3 PATCH 8/9] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for at91sam9g25ek boards Wenyou Yang
  8 siblings, 1 reply; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

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

Remove '__init' annotation from the function 'at91wdt_probe'
since the driver becomes hot-plug aware now.

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

diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
index 94be9d6..7c13dda 100644
--- a/drivers/watchdog/at91sam9_wdt.c
+++ b/drivers/watchdog/at91sam9_wdt.c
@@ -204,7 +204,7 @@ static struct watchdog_device at91wdt_wdd = {
 	.ops = &at91wdt_ops,
 };
 
-static int __init at91wdt_probe(struct platform_device *pdev)
+static int at91wdt_probe(struct platform_device *pdev)
 {
 	struct at91wdt_drvdata *driver_data;
 	struct resource	*r;
@@ -273,6 +273,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",
@@ -281,18 +282,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] 14+ messages in thread

* [v3 PATCH 8/9] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
                   ` (6 preceding siblings ...)
  2013-01-05  2:38 ` [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-05  2:38 ` [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for at91sam9g25ek boards Wenyou Yang
  8 siblings, 0 replies; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Cc: linux at arm.linux.org.uk
Cc: linux-kernel at 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 e9efb34..f60bbbc 100644
--- a/arch/arm/boot/dts/at91sam9n12.dtsi
+++ b/arch/arm/boot/dts/at91sam9n12.dtsi
@@ -355,6 +355,12 @@
 				#size-cells = <0>;
 				status = "disabled";
 			};
+
+			watchdog at fffffe40 {
+				compatible = "atmel,at91sam9260-wdt";
+				reg = <0xfffffe40 0x10>;
+				status = "disabled";
+			};
 		};
 
 		nand0: nand at 40000000 {
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
index 40ac3a4..cb3ffb2 100644
--- a/arch/arm/boot/dts/at91sam9x5.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5.dtsi
@@ -473,6 +473,12 @@
 					trigger-value = <0x6>;
 				};
 			};
+
+			watchdog at fffffe40 {
+				compatible = "atmel,at91sam9260-wdt";
+				reg = <0xfffffe40 0x10>;
+				status = "disabled";
+			};
 		};
 
 		nand0: nand at 40000000 {
-- 
1.7.9.5

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

* [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for at91sam9g25ek boards
  2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
                   ` (7 preceding siblings ...)
  2013-01-05  2:38 ` [v3 PATCH 8/9] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC Wenyou Yang
@ 2013-01-05  2:38 ` Wenyou Yang
  2013-01-08 20:01   ` Jean-Christophe PLAGNIOL-VILLARD
  8 siblings, 1 reply; 14+ messages in thread
From: Wenyou Yang @ 2013-01-05  2:38 UTC (permalink / raw)
  To: linux-arm-kernel

Tested on the at91sam9g25ek boards

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

diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi
index 8a7cf1d..afddf75 100644
--- a/arch/arm/boot/dts/at91sam9x5ek.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi
@@ -69,6 +69,10 @@
 				status = "okay";
 			};
 
+			watchdog at fffffe40 {
+				status = "okay";
+			};
+
 			pinctrl at fffff400 {
 				mmc0 {
 					pinctrl_board_mmc0: mmc0-board {
-- 
1.7.9.5

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

* [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use module_platform_driver()
  2013-01-05  2:38 ` [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
@ 2013-01-08 10:17   ` Fabio Porcedda
  2013-01-16  5:22     ` Yang, Wenyou
  0 siblings, 1 reply; 14+ messages in thread
From: Fabio Porcedda @ 2013-01-08 10:17 UTC (permalink / raw)
  To: linux-arm-kernel

On Sat, Jan 5, 2013 at 3:38 AM, Wenyou Yang <wenyou.yang@atmel.com> wrote:
> Using module_platform_driver() replaces module_init() and module_exit()
> and makes the code simpler.
>
> Remove '__init' annotation from the function 'at91wdt_probe'
> since the driver becomes hot-plug aware now.
>
> Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> Cc: wim at iguana.be
> Cc: linux-watchdog at vger.kernel.org
> Cc: linux-kernel at vger.kernel.org
> ---
>  drivers/watchdog/at91sam9_wdt.c |   16 +++-------------
>  1 file changed, 3 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c
> index 94be9d6..7c13dda 100644
> --- a/drivers/watchdog/at91sam9_wdt.c
> +++ b/drivers/watchdog/at91sam9_wdt.c
> @@ -204,7 +204,7 @@ static struct watchdog_device at91wdt_wdd = {
>         .ops = &at91wdt_ops,
>  };
>
> -static int __init at91wdt_probe(struct platform_device *pdev)
> +static int at91wdt_probe(struct platform_device *pdev)
>  {
>         struct at91wdt_drvdata *driver_data;
>         struct resource *r;
> @@ -273,6 +273,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",
> @@ -281,18 +282,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
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

The module_platform_driver isn't a substitute of platform_driver_probe,
because module_platform_driver  use platform_driver_register/unregister.
Using that macro we lose the advantage of platform_driver_probe,
as stated in:

https://lkml.org/lkml/2012/1/10/335
On Tue, Jan 10, 2012 at 21:47, Geert Uytterhoeven <geert@linux-m68k.org> wrote:
> [...]
>Still, setting up platform_driver.probe and removing __init from all probe
>functions is not the right thing to do, as this make (non-__init) kernel code
>size bigger, while none of these devices are hotpluggable and thus cannot
>appear after bootup. That's why we have platform_driver_probe() in the
>first place. So I think all of this should be reverted for non-hotpluggable
>drivers.
> [...]

Best regards

--
Fabio Porcedda

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

* [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for at91sam9g25ek boards
  2013-01-05  2:38 ` [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for at91sam9g25ek boards Wenyou Yang
@ 2013-01-08 20:01   ` Jean-Christophe PLAGNIOL-VILLARD
  2013-01-09  1:04     ` Yang, Wenyou
  0 siblings, 1 reply; 14+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2013-01-08 20:01 UTC (permalink / raw)
  To: linux-arm-kernel

On 10:38 Sat 05 Jan     , Wenyou Yang wrote:
> Tested on the at91sam9g25ek boards
> 
> Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> Cc: linux at arm.linux.org.uk
> Cc: linux-kernel at vger.kernel.org
> ---
>  arch/arm/boot/dts/at91sam9x5ek.dtsi |    4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi
> index 8a7cf1d..afddf75 100644
> --- a/arch/arm/boot/dts/at91sam9x5ek.dtsi
> +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi
> @@ -69,6 +69,10 @@
>  				status = "okay";
>  			};
>  
> +			watchdog at fffffe40 {
> +				status = "okay";
> +			};
> +

use less today as the watchdog is shutdown at bootstrap level

and on at91 once shutdown we can not enable it again

Best Regards,
J.
>  			pinctrl at fffff400 {
>  				mmc0 {
>  					pinctrl_board_mmc0: mmc0-board {
> -- 
> 1.7.9.5
> 

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

* [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for at91sam9g25ek boards
  2013-01-08 20:01   ` Jean-Christophe PLAGNIOL-VILLARD
@ 2013-01-09  1:04     ` Yang, Wenyou
  0 siblings, 0 replies; 14+ messages in thread
From: Yang, Wenyou @ 2013-01-09  1:04 UTC (permalink / raw)
  To: linux-arm-kernel



> -----Original Message-----
> From: Jean-Christophe PLAGNIOL-VILLARD [mailto:plagnioj at jcrosoft.com]
> Sent: 2013?1?9? 4:02
> To: Yang, Wenyou
> Cc: linux-arm-kernel at lists.infradead.org; Ferre, Nicolas; Lin, JM;
> linux at arm.linux.org.uk; linux-kernel at vger.kernel.org
> Subject: Re: [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for
> at91sam9g25ek boards
> 
> On 10:38 Sat 05 Jan     , Wenyou Yang wrote:
> > Tested on the at91sam9g25ek boards
> >
> > Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> > Cc: linux at arm.linux.org.uk
> > Cc: linux-kernel at vger.kernel.org
> > ---
> >  arch/arm/boot/dts/at91sam9x5ek.dtsi |    4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi
> b/arch/arm/boot/dts/at91sam9x5ek.dtsi
> > index 8a7cf1d..afddf75 100644
> > --- a/arch/arm/boot/dts/at91sam9x5ek.dtsi
> > +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi
> > @@ -69,6 +69,10 @@
> >  				status = "okay";
> >  			};
> >
> > +			watchdog at fffffe40 {
> > +				status = "okay";
> > +			};
> > +
> 
> use less today as the watchdog is shutdown at bootstrap level
> 
> and on at91 once shutdown we can not enable it again

Yes, you are right.
But, If you want to use the watchdog, you should not disable the watchdog.
Also in the new version at91bootstrap, it provide this config option.

If the watchdog is disabled in the bootstrap, "the watchdog has been disabled" will display in the dmesg.

> 
> Best Regards,
> J.
> >  			pinctrl at fffff400 {
> >  				mmc0 {
> >  					pinctrl_board_mmc0: mmc0-board {
> > --
> > 1.7.9.5
> >

Best Regards,
Wenyou Yang

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

* [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use module_platform_driver()
  2013-01-08 10:17   ` Fabio Porcedda
@ 2013-01-16  5:22     ` Yang, Wenyou
  0 siblings, 0 replies; 14+ messages in thread
From: Yang, Wenyou @ 2013-01-16  5:22 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Fabio Porcedda,

> -----Original Message-----
> From: Fabio Porcedda [mailto:fabio.porcedda at gmail.com]
> Sent: 2013?1?8? 18:18
> To: Yang, Wenyou
> Cc: linux-arm-kernel at lists.infradead.org; Ferre, Nicolas; Jean-Christophe
> PLAGNIOL-VILLARD; Lin, JM; Wim Van Sebroeck;
> linux-watchdog at vger.kernel.org; linux-kernel at vger.kernel.org; Geert
> Uytterhoeven
> Subject: Re: [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use
> module_platform_driver()
> 
> On Sat, Jan 5, 2013 at 3:38 AM, Wenyou Yang <wenyou.yang@atmel.com>
> wrote:
> > Using module_platform_driver() replaces module_init() and module_exit()
> > and makes the code simpler.
> >
> > Remove '__init' annotation from the function 'at91wdt_probe'
> > since the driver becomes hot-plug aware now.
> >
> > Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> > Cc: wim at iguana.be
> > Cc: linux-watchdog at vger.kernel.org
> > Cc: linux-kernel at vger.kernel.org
> > ---
> >  drivers/watchdog/at91sam9_wdt.c |   16 +++-------------
> >  1 file changed, 3 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/watchdog/at91sam9_wdt.c
> b/drivers/watchdog/at91sam9_wdt.c
> > index 94be9d6..7c13dda 100644
> > --- a/drivers/watchdog/at91sam9_wdt.c
> > +++ b/drivers/watchdog/at91sam9_wdt.c
> > @@ -204,7 +204,7 @@ static struct watchdog_device at91wdt_wdd = {
> >         .ops = &at91wdt_ops,
> >  };
> >
> > -static int __init at91wdt_probe(struct platform_device *pdev)
> > +static int at91wdt_probe(struct platform_device *pdev)
> >  {
> >         struct at91wdt_drvdata *driver_data;
> >         struct resource *r;
> > @@ -273,6 +273,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",
> > @@ -281,18 +282,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
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
> > the body of a message to majordomo at vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> The module_platform_driver isn't a substitute of platform_driver_probe,
> because module_platform_driver  use platform_driver_register/unregister.
> Using that macro we lose the advantage of platform_driver_probe,
> as stated in:
> 
> https://lkml.org/lkml/2012/1/10/335
I just referred to the commit 6b761b2902c56b468370e0ee1691c37e0dae042a.
Didn't think more about it.
I will remove this patch in the next version.

> On Tue, Jan 10, 2012 at 21:47, Geert Uytterhoeven <geert@linux-m68k.org>
> wrote:
> > [...]
> >Still, setting up platform_driver.probe and removing __init from all probe
> >functions is not the right thing to do, as this make (non-__init) kernel code
> >size bigger, while none of these devices are hotpluggable and thus cannot
> >appear after bootup. That's why we have platform_driver_probe() in the
> >first place. So I think all of this should be reverted for non-hotpluggable
> >drivers.
> > [...]

You said is reasonable, watchdog is not hotpluggable.
> 
> Best regards
> 
> --
> Fabio Porcedda

Best Regards,
Wenyou Yang

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

end of thread, other threads:[~2013-01-16  5:22 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-05  2:38 [v3 PATCH 0/9] watchdog/at91sam9_wdt: Convert to use the new framework Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 1/9] watchdog: add the function watchdog_is_open Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 2/9] watchdog/at91sam9_wdt: Remove at91wdt_private and add at91wdt_drvdata struct Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 3/9] watchdog/at91sam9_wdt: Convert to use the watchdog framework Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 4/9] watchdog/at91sam9_wdt: Adjust the options of watchdog_info Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 5/9] watchdog/at91sam9_wdt: Add nowayout helpers to Watchdog Timer Driver Kernel API Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 6/9] watchdog/at91sam9_wdt: Remove the __initdata of at91wdt_wdd Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 7/9] watchdog/at91sam9_wdt: Use module_platform_driver() Wenyou Yang
2013-01-08 10:17   ` Fabio Porcedda
2013-01-16  5:22     ` Yang, Wenyou
2013-01-05  2:38 ` [v3 PATCH 8/9] ARM: dts: add the watchdog nodes for at91sam9x5 and at91sam9n12 SoC Wenyou Yang
2013-01-05  2:38 ` [v3 PATCH 9/9] ARM: dts: add the watchdog nodes for at91sam9g25ek boards Wenyou Yang
2013-01-08 20:01   ` Jean-Christophe PLAGNIOL-VILLARD
2013-01-09  1:04     ` Yang, Wenyou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox