* [PATCH V2 05/10] MIPS: lantiq: add watchdog support [not found] <1298996006-15960-1-git-send-email-blogic@openwrt.org> @ 2011-03-01 16:13 ` John Crispin 2011-03-02 11:22 ` Sergei Shtylyov 0 siblings, 1 reply; 10+ messages in thread From: John Crispin @ 2011-03-01 16:13 UTC (permalink / raw) To: Ralf Baechle Cc: John Crispin, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog This patch adds the driver for the watchdog found inside the Lantiq SoC family. Changes in V2 * add comments to explain register access * cleanup resource allocation * cleanup clock handling * whitespace fixes Signed-off-by: John Crispin <blogic@openwrt.org> Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com> Cc: Wim Van Sebroeck <wim@iguana.be> Cc: linux-mips@linux-mips.org Cc: linux-watchdog@vger.kernel.org --- drivers/watchdog/Kconfig | 6 + drivers/watchdog/Makefile | 1 + drivers/watchdog/lantiq_wdt.c | 233 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 240 insertions(+), 0 deletions(-) create mode 100644 drivers/watchdog/lantiq_wdt.c diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 2e2400e..c64f8c3 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -972,6 +972,12 @@ config BCM63XX_WDT To compile this driver as a loadable module, choose M here. The module will be called bcm63xx_wdt. +config LANTIQ_WDT + tristate "Lantiq SoC watchdog" + depends on LANTIQ + help + Hardware driver for the Lantiq SoC Watchdog Timer. + # PARISC Architecture # POWERPC Architecture diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index dd77665..68299db 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -121,6 +121,7 @@ obj-$(CONFIG_AR7_WDT) += ar7_wdt.o obj-$(CONFIG_TXX9_WDT) += txx9wdt.o obj-$(CONFIG_OCTEON_WDT) += octeon-wdt.o octeon-wdt-y := octeon-wdt-main.o octeon-wdt-nmi.o +obj-$(CONFIG_LANTIQ_WDT) += lantiq_wdt.o # PARISC Architecture diff --git a/drivers/watchdog/lantiq_wdt.c b/drivers/watchdog/lantiq_wdt.c new file mode 100644 index 0000000..8515c1f --- /dev/null +++ b/drivers/watchdog/lantiq_wdt.c @@ -0,0 +1,233 @@ +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + * Copyright (C) 2010 John Crispin <blogic@openwrt.org> + * Based on EP93xx wdt driver + */ + +#include <linux/module.h> +#include <linux/fs.h> +#include <linux/miscdevice.h> +#include <linux/watchdog.h> +#include <linux/platform_device.h> +#include <linux/uaccess.h> +#include <linux/clk.h> +#include <linux/io.h> + +#include <lantiq.h> + +/* Section 3.4 of the datasheet + The password sequence protects the WDT control register from unintended + write actions, which might cause malfunction of the WDT. + + essentially the following two magic passwords need to be written to allow + io access to the wdt core */ +#define LTQ_WDT_PW1 0x00BE0000 +#define LTQ_WDT_PW2 0x00DC0000 + +#define LTQ_WDT_CR 0x03F0 /* watchdog control register */ +#define LTQ_WDT_SR 0x03F8 /* watchdog status register */ + +#define LTQ_WDT_SR_EN (0x1 << 31) /* enable bit */ +#define LTQ_WDT_SR_PWD (0x3 << 26) /* turn on power */ +#define LTQ_WDT_SR_CLKDIV (0x3 << 24) /* turn on clock and set */ + /* divider to 0x40000 */ +#define LTQ_WDT_DIVIDER 0x40000 +#define LTQ_MAX_TIMEOUT ((1 << 16) - 1) /* the reload field is 16 bit */ + +#ifndef CONFIG_WATCHDOG_NOWAYOUT +static int ltq_wdt_ok_to_close; +#endif + +static int ltq_wdt_timeout = 30; +static __iomem void *ltq_wdt_membase; +static unsigned long ltq_io_region_clk_rate; + +static int +ltq_wdt_enable(unsigned int timeout) +{ + timeout = ((timeout * (ltq_io_region_clk_rate / LTQ_WDT_DIVIDER)) + + 0x1000); + if (timeout > LTQ_MAX_TIMEOUT) + timeout = LTQ_MAX_TIMEOUT; + + /* write the first paswword magic */ + ltq_w32(LTQ_WDT_PW1, ltq_wdt_membase + LTQ_WDT_CR); + /* write the second magic plus the configuration and new timeout */ + ltq_w32(LTQ_WDT_SR_EN | LTQ_WDT_SR_PWD | LTQ_WDT_SR_CLKDIV | + LTQ_WDT_PW2 | timeout, ltq_wdt_membase + LTQ_WDT_CR); + return 0; +} + +static void +ltq_wdt_disable(void) +{ +#ifndef CONFIG_WATCHDOG_NOWAYOUT + ltq_wdt_ok_to_close = 0; +#endif + /* write the first paswword magic */ + ltq_w32(LTQ_WDT_PW1, ltq_wdt_membase + LTQ_WDT_CR); + /* write the second paswword magic with no config + this turns the watchdog off */ + ltq_w32(LTQ_WDT_PW2, ltq_wdt_membase + LTQ_WDT_CR); +} + +static ssize_t +ltq_wdt_write(struct file *file, const char __user *data, + size_t len, loff_t *ppos) +{ + size_t i; + if (!len) + return 0; +#ifndef CONFIG_WATCHDOG_NOWAYOUT + for (i = 0; i != len; i++) { + char c; + if (get_user(c, data + i)) + return -EFAULT; + if (c == 'V') + ltq_wdt_ok_to_close = 1; + } +#endif + ltq_wdt_enable(ltq_wdt_timeout); + return len; +} + +static struct watchdog_info ident = { + .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, + .identity = "ltq_wdt", +}; + +static long +ltq_wdt_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + int ret = -ENOTTY; + switch (cmd) { + case WDIOC_GETSUPPORT: + ret = copy_to_user((struct watchdog_info __user *)arg, &ident, + sizeof(ident)) ? -EFAULT : 0; + break; + + case WDIOC_GETTIMEOUT: + ret = put_user(ltq_wdt_timeout, (int __user *)arg); + break; + + case WDIOC_SETTIMEOUT: + ret = get_user(ltq_wdt_timeout, (int __user *)arg); + if (!ret) + ltq_wdt_enable(ltq_wdt_timeout); + break; + + case WDIOC_KEEPALIVE: + ltq_wdt_enable(ltq_wdt_timeout); + ret = 0; + break; + } + return ret; +} + +static int +ltq_wdt_open(struct inode *inode, struct file *file) +{ + ltq_wdt_enable(ltq_wdt_timeout); + return nonseekable_open(inode, file); +} + +static int +ltq_wdt_release(struct inode *inode, struct file *file) +{ +#ifndef CONFIG_WATCHDOG_NOWAYOUT + if (ltq_wdt_ok_to_close) + ltq_wdt_disable(); + else +#endif + printk(KERN_ERR "ltq_wdt: watchdog closed without warning\n"); + return 0; +} + +static const struct file_operations ltq_wdt_fops = { + .owner = THIS_MODULE, + .write = ltq_wdt_write, + .unlocked_ioctl = ltq_wdt_ioctl, + .open = ltq_wdt_open, + .release = ltq_wdt_release, + .llseek = no_llseek, +}; + +static struct miscdevice ltq_wdt_miscdev = { + .minor = WATCHDOG_MINOR, + .name = "watchdog", + .fops = <q_wdt_fops, +}; + +static int +ltq_wdt_probe(struct platform_device *pdev) +{ + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + struct clk *clk; + int ret = 0; + if (!res) { + dev_err(&pdev->dev, "cannot obtain I/O memory region"); + return -ENOENT; + } + res = devm_request_mem_region(&pdev->dev, res->start, + resource_size(res), dev_name(&pdev->dev)); + if (!res) { + dev_err(&pdev->dev, "cannot request I/O memory region"); + return -EBUSY; + } + ltq_wdt_membase = devm_ioremap_nocache(&pdev->dev, res->start, + resource_size(res)); + if (!ltq_wdt_membase) { + dev_err(&pdev->dev, "cannot remap I/O memory region\n"); + return -ENOMEM; + } + /* we do not need to enable the clock as it is always running */ + clk = clk_get(&pdev->dev, "io"); + ltq_io_region_clk_rate = clk_get_rate(clk); + clk_put(clk); + ret = misc_register(<q_wdt_miscdev); + if (ret) + return 0; + + return ret; +} + +static int +ltq_wdt_remove(struct platform_device *dev) +{ + ltq_wdt_disable(); + misc_deregister(<q_wdt_miscdev); + return 0; +} + +static struct platform_driver ltq_wdt_driver = { + .probe = ltq_wdt_probe, + .remove = ltq_wdt_remove, + .driver = { + .name = "ltq_wdt", + .owner = THIS_MODULE, + }, +}; + +static int __init +init_ltq_wdt(void) +{ + return platform_driver_register(<q_wdt_driver); +} + +static void __exit +exit_ltq_wdt(void) +{ + platform_driver_unregister(<q_wdt_driver); +} + +module_init(init_ltq_wdt); +module_exit(exit_ltq_wdt); + +MODULE_AUTHOR("John Crispin <blogic@openwrt.org>"); +MODULE_DESCRIPTION("Lantiq Watchdog"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-01 16:13 ` [PATCH V2 05/10] MIPS: lantiq: add watchdog support John Crispin @ 2011-03-02 11:22 ` Sergei Shtylyov 2011-03-02 14:29 ` Ralf Baechle ` (2 more replies) 0 siblings, 3 replies; 10+ messages in thread From: Sergei Shtylyov @ 2011-03-02 11:22 UTC (permalink / raw) To: John Crispin Cc: Ralf Baechle, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog Hello. On 01-03-2011 19:13, John Crispin wrote: > This patch adds the driver for the watchdog found inside the Lantiq SoC family. > Changes in V2 > * add comments to explain register access > * cleanup resource allocation > * cleanup clock handling > * whitespace fixes The patch revision history is normally put under --- tearline. > Signed-off-by: John Crispin<blogic@openwrt.org> > Signed-off-by: Ralph Hempel<ralph.hempel@lantiq.com> > Cc: Wim Van Sebroeck<wim@iguana.be> > Cc: linux-mips@linux-mips.org > Cc: linux-watchdog@vger.kernel.org [...] > diff --git a/drivers/watchdog/lantiq_wdt.c b/drivers/watchdog/lantiq_wdt.c > new file mode 100644 > index 0000000..8515c1f > --- /dev/null > +++ b/drivers/watchdog/lantiq_wdt.c > @@ -0,0 +1,233 @@ > +/* > + * This program is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License version 2 as published > + * by the Free Software Foundation. > + * > + * Copyright (C) 2010 John Crispin<blogic@openwrt.org> > + * Based on EP93xx wdt driver > + */ > + > +#include<linux/module.h> > +#include<linux/fs.h> > +#include<linux/miscdevice.h> > +#include<linux/watchdog.h> > +#include<linux/platform_device.h> > +#include<linux/uaccess.h> > +#include<linux/clk.h> > +#include<linux/io.h> > + > +#include<lantiq.h> > + > +/* Section 3.4 of the datasheet > + The password sequence protects the WDT control register from unintended > + write actions, which might cause malfunction of the WDT. > + > + essentially the following two magic passwords need to be written to allow > + io access to the wdt core */ The preferred style for the multi-line comments is this: /* * bla * bla */ > +#define LTQ_WDT_CR 0x03F0 /* watchdog control register */ > +#define LTQ_WDT_SR 0x03F8 /* watchdog status register */ > + > +#define LTQ_WDT_SR_EN (0x1 << 31) /* enable bit */ > +#define LTQ_WDT_SR_PWD (0x3 << 26) /* turn on power */ > +#define LTQ_WDT_SR_CLKDIV (0x3 << 24) /* turn on clock and set */ > + /* divider to 0x40000 */ > +#define LTQ_WDT_DIVIDER 0x40000 > +#define LTQ_MAX_TIMEOUT ((1 << 16) - 1) /* the reload field is 16 bit */ Should align like the above... > + > +#ifndef CONFIG_WATCHDOG_NOWAYOUT > +static int ltq_wdt_ok_to_close; > +#endif > + > +static int ltq_wdt_timeout = 30; > +static __iomem void *ltq_wdt_membase; It's normally "void __iomem *". > +static unsigned long ltq_io_region_clk_rate; > + > +static int > +ltq_wdt_enable(unsigned int timeout) > +{ > + timeout = ((timeout * (ltq_io_region_clk_rate / LTQ_WDT_DIVIDER)) > + + 0x1000); > + if (timeout > LTQ_MAX_TIMEOUT) > + timeout = LTQ_MAX_TIMEOUT; > + > + /* write the first paswword magic */ s/paswword/password/. > + ltq_w32(LTQ_WDT_PW1, ltq_wdt_membase + LTQ_WDT_CR); > + /* write the second magic plus the configuration and new timeout */ > + ltq_w32(LTQ_WDT_SR_EN | LTQ_WDT_SR_PWD | LTQ_WDT_SR_CLKDIV | > + LTQ_WDT_PW2 | timeout, ltq_wdt_membase + LTQ_WDT_CR); > + return 0; This function should be *void* -- you alway return 0 and never check the result. > +} > + > +static void > +ltq_wdt_disable(void) > +{ > +#ifndef CONFIG_WATCHDOG_NOWAYOUT > + ltq_wdt_ok_to_close = 0; > +#endif > + /* write the first paswword magic */ > + ltq_w32(LTQ_WDT_PW1, ltq_wdt_membase + LTQ_WDT_CR); > + /* write the second paswword magic with no config > + this turns the watchdog off */ Multi-line comment style... > + ltq_w32(LTQ_WDT_PW2, ltq_wdt_membase + LTQ_WDT_CR); > +} > + > +static ssize_t > +ltq_wdt_write(struct file *file, const char __user *data, > + size_t len, loff_t *ppos) > +{ > + size_t i; Empty line between the variables and code won't hurt... > + if (!len) > + return 0; > +#ifndef CONFIG_WATCHDOG_NOWAYOUT > + for (i = 0; i != len; i++) { > + char c; Here too... > + if (get_user(c, data + i)) > + return -EFAULT; > + if (c == 'V') > + ltq_wdt_ok_to_close = 1; > + } > +#endif [...] > +static long > +ltq_wdt_ioctl(struct file *file, > + unsigned int cmd, unsigned long arg) > +{ > + int ret = -ENOTTY; Empty line between the variables and code won't hurt... > + switch (cmd) { > + case WDIOC_GETSUPPORT: > + ret = copy_to_user((struct watchdog_info __user *)arg, &ident, > + sizeof(ident)) ? -EFAULT : 0; Doesn't copy_to_user() return 0 or -EFAULT? > +static int > +ltq_wdt_release(struct inode *inode, struct file *file) > +{ > +#ifndef CONFIG_WATCHDOG_NOWAYOUT > + if (ltq_wdt_ok_to_close) > + ltq_wdt_disable(); > + else > +#endif > + printk(KERN_ERR "ltq_wdt: watchdog closed without warning\n"); Use pr_err() instead. > +static int > +ltq_wdt_probe(struct platform_device *pdev) > +{ > + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + struct clk *clk; > + int ret = 0; Empty line between the variables and code won't hurt... > + /* we do not need to enable the clock as it is always running */ > + clk = clk_get(&pdev->dev, "io"); clk_get() may fail... > + ret = misc_register(<q_wdt_miscdev); > + if (ret) > + return 0; Er, didn't you mean: if (!ret) return 0; > + return ret; 'ret' is always 0 here with your code. > +} > + > +static int > +ltq_wdt_remove(struct platform_device *dev) __exit? > +static int __init > +init_ltq_wdt(void) > +{ > + return platform_driver_register(<q_wdt_driver); Why not platfrom_driver_probe()? It's hardly a hotplug device... WBR, Sergei ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-02 11:22 ` Sergei Shtylyov @ 2011-03-02 14:29 ` Ralf Baechle 2011-03-02 15:05 ` John Crispin 2011-03-02 17:34 ` Sergei Shtylyov 2011-03-02 15:44 ` John Crispin 2011-03-03 10:15 ` Jamie Iles 2 siblings, 2 replies; 10+ messages in thread From: Ralf Baechle @ 2011-03-02 14:29 UTC (permalink / raw) To: Sergei Shtylyov Cc: John Crispin, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog On Wed, Mar 02, 2011 at 02:22:21PM +0300, Sergei Shtylyov wrote: > >+ switch (cmd) { > >+ case WDIOC_GETSUPPORT: > >+ ret = copy_to_user((struct watchdog_info __user *)arg, &ident, > >+ sizeof(ident)) ? -EFAULT : 0; > > Doesn't copy_to_user() return 0 or -EFAULT? No and that's a common cause of bugs. copy_{from,to}_user returns the number of characters that could be be copied so the conversion to an error code is needed here. The function takes a void argument and there is no benefit from casting to the full struct watchdog_info __user * pointer type other than maybe clarity to the human reader. While nitpicking - there should be one space between include and < in #include <blah.h>. Ralf ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-02 14:29 ` Ralf Baechle @ 2011-03-02 15:05 ` John Crispin 2011-03-02 16:27 ` Ralf Baechle 2011-03-02 17:34 ` Sergei Shtylyov 1 sibling, 1 reply; 10+ messages in thread From: John Crispin @ 2011-03-02 15:05 UTC (permalink / raw) To: Ralf Baechle Cc: Sergei Shtylyov, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog Hi Ralf, > While nitpicking - there should be one space between include and < in > #include <blah.h>. > > where did you see that ? thanks, John ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-02 15:05 ` John Crispin @ 2011-03-02 16:27 ` Ralf Baechle 2011-03-02 17:36 ` Sergei Shtylyov 0 siblings, 1 reply; 10+ messages in thread From: Ralf Baechle @ 2011-03-02 16:27 UTC (permalink / raw) To: John Crispin Cc: Sergei Shtylyov, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog On Wed, Mar 02, 2011 at 04:05:13PM +0100, John Crispin wrote: > Hi Ralf, > > While nitpicking - there should be one space between include and < in > > #include <blah.h>. > > > > > where did you see that ? > +#include<linux/module.h> > +#include<linux/fs.h> > +#include<linux/miscdevice.h> > +#include<linux/watchdog.h> > +#include<linux/platform_device.h> > +#include<linux/uaccess.h> > +#include<linux/clk.h> > +#include<linux/io.h> > + > +#include<lantiq.h> But that only seems to have happened to the code quoted in Sergei's mail. Ralf ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-02 16:27 ` Ralf Baechle @ 2011-03-02 17:36 ` Sergei Shtylyov 0 siblings, 0 replies; 10+ messages in thread From: Sergei Shtylyov @ 2011-03-02 17:36 UTC (permalink / raw) To: Ralf Baechle Cc: John Crispin, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog Hello. Ralf Baechle wrote: >> Hi Ralf, >>> While nitpicking - there should be one space between include and < in >>> #include <blah.h>. >> where did you see that ? >> +#include<linux/module.h> >> +#include<linux/fs.h> >> +#include<linux/miscdevice.h> >> +#include<linux/watchdog.h> >> +#include<linux/platform_device.h> >> +#include<linux/uaccess.h> >> +#include<linux/clk.h> >> +#include<linux/io.h> >> + >> +#include<lantiq.h> > But that only seems to have happened to the code quoted in Sergei's mail. Stupid Thunderbird is to be blamed here. :-) > Ralf WBR, Sergei ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-02 14:29 ` Ralf Baechle 2011-03-02 15:05 ` John Crispin @ 2011-03-02 17:34 ` Sergei Shtylyov 1 sibling, 0 replies; 10+ messages in thread From: Sergei Shtylyov @ 2011-03-02 17:34 UTC (permalink / raw) To: Ralf Baechle Cc: John Crispin, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog Hello. Ralf Baechle wrote: >>> + switch (cmd) { >>> + case WDIOC_GETSUPPORT: >>> + ret = copy_to_user((struct watchdog_info __user *)arg, &ident, >>> + sizeof(ident)) ? -EFAULT : 0; >> Doesn't copy_to_user() return 0 or -EFAULT? > No and that's a common cause of bugs. copy_{from,to}_user returns the > number of characters that could be be copied so the conversion to an > error code is needed here. But then the code above would be wrong. Actually, it returns the number of bytes that could NOT be copied as I now see. > The function takes a void argument and there is no benefit from casting > to the full struct watchdog_info __user * pointer type other than maybe > clarity to the human reader. Indeed. > Ralf WBR, Sergei ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-02 11:22 ` Sergei Shtylyov 2011-03-02 14:29 ` Ralf Baechle @ 2011-03-02 15:44 ` John Crispin 2011-03-03 10:15 ` Jamie Iles 2 siblings, 0 replies; 10+ messages in thread From: John Crispin @ 2011-03-02 15:44 UTC (permalink / raw) To: Sergei Shtylyov Cc: Ralf Baechle, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog Hi Sergei, thanks for the comments, one question below >> + /* we do not need to enable the clock as it is always running */ >> + clk = clk_get(&pdev->dev, "io"); > > clk_get() may fail... > lantiq socs have 2 static clock that are always running. so i think it is safe to assume that this wont fail unless someone renames the clocks. alternatively i could add a if (!clk) BUG(); but i am not sure if it is required. thanks, John ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-02 11:22 ` Sergei Shtylyov 2011-03-02 14:29 ` Ralf Baechle 2011-03-02 15:44 ` John Crispin @ 2011-03-03 10:15 ` Jamie Iles 2011-03-03 11:21 ` Sergei Shtylyov 2 siblings, 1 reply; 10+ messages in thread From: Jamie Iles @ 2011-03-03 10:15 UTC (permalink / raw) To: Sergei Shtylyov Cc: John Crispin, Ralf Baechle, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog On Wed, Mar 02, 2011 at 02:22:21PM +0300, Sergei Shtylyov wrote: > >+static int > >+ltq_wdt_remove(struct platform_device *dev) > > __exit? No, I think this should be __devexit and the probe function should be __devinit. When assigning the exit function to the platform_driver it should be surrounded with __devexit_p(). Jamie ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH V2 05/10] MIPS: lantiq: add watchdog support 2011-03-03 10:15 ` Jamie Iles @ 2011-03-03 11:21 ` Sergei Shtylyov 0 siblings, 0 replies; 10+ messages in thread From: Sergei Shtylyov @ 2011-03-03 11:21 UTC (permalink / raw) To: Jamie Iles Cc: John Crispin, Ralf Baechle, Ralph Hempel, Wim Van Sebroeck, linux-mips, linux-watchdog Hello. On 03-03-2011 13:15, Jamie Iles wrote: >>> +static int >>> +ltq_wdt_remove(struct platform_device *dev) >> __exit? > No, I think this should be __devexit and the probe function should be > __devinit. When assigning the exit function to the platform_driver it > should be surrounded with __devexit_p(). Why? Is WDT really a hotplug device? > Jamie WBR, Sergei ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-03-03 11:22 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1298996006-15960-1-git-send-email-blogic@openwrt.org>
2011-03-01 16:13 ` [PATCH V2 05/10] MIPS: lantiq: add watchdog support John Crispin
2011-03-02 11:22 ` Sergei Shtylyov
2011-03-02 14:29 ` Ralf Baechle
2011-03-02 15:05 ` John Crispin
2011-03-02 16:27 ` Ralf Baechle
2011-03-02 17:36 ` Sergei Shtylyov
2011-03-02 17:34 ` Sergei Shtylyov
2011-03-02 15:44 ` John Crispin
2011-03-03 10:15 ` Jamie Iles
2011-03-03 11:21 ` Sergei Shtylyov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox