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