Linux-Watchdog Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface
@ 2019-07-30  2:15 Mark Balantzyan
  2019-07-30  2:15 ` [PATCH 2/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface, with removal of file access functions for correct functionality Mark Balantzyan
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Mark Balantzyan @ 2019-07-30  2:15 UTC (permalink / raw)
  To: linux; +Cc: wim, linux-kernel, linux-watchdog, andrianov, Mark Balantzyan

There is a potential for the variable swc_base_addr in the call chain of the
driver initialization function (init) to be used before initialization. This
brought up the need for, by rewriting the driver to use the common watchdog
interface, ensuring to have all resources in place. This patch addresses this
need by rewriting into common watchdog interface utilization for the driver.

Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>
---
 drivers/media/pci/tw686x/Kconfig |  1 +
 drivers/watchdog/pc87413_wdt.c   | 92 +++++++++++++++-----------------
 2 files changed, 45 insertions(+), 48 deletions(-)

diff --git a/drivers/media/pci/tw686x/Kconfig b/drivers/media/pci/tw686x/Kconfig
index da8bfee7..079d7464 100644
--- a/drivers/media/pci/tw686x/Kconfig
+++ b/drivers/media/pci/tw686x/Kconfig
@@ -5,6 +5,7 @@ config VIDEO_TW686X
 	select VIDEOBUF2_DMA_CONTIG
 	select VIDEOBUF2_DMA_SG
 	select SND_PCM
+	select WATCHDOG_CORE
 	help
 	  Support for Intersil/Techwell TW686x-based frame grabber cards.
 
diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
index 06a892e3..4c330ee5 100644
--- a/drivers/watchdog/pc87413_wdt.c
+++ b/drivers/watchdog/pc87413_wdt.c
@@ -22,12 +22,10 @@
 
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/miscdevice.h>
 #include <linux/watchdog.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/notifier.h>
-#include <linux/fs.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/spinlock.h>
@@ -65,7 +63,6 @@ static char expect_close;		/* is the close expected? */
 
 static DEFINE_SPINLOCK(io_lock);	/* to guard us from io races */
 
-static bool nowayout = WATCHDOG_NOWAYOUT;
 
 /* -- Low level function ----------------------------------------*/
 
@@ -216,9 +213,9 @@ static inline void pc87413_disable_sw_wd_trg(void)
 
 /* -- Higher level functions ------------------------------------*/
 
-/* Enable the watchdog */
+/* Enable/start the watchdog */
 
-static void pc87413_enable(void)
+static void pc87413_start(void)
 {
 	spin_lock(&io_lock);
 
@@ -231,9 +228,9 @@ static void pc87413_enable(void)
 	spin_unlock(&io_lock);
 }
 
-/* Disable the watchdog */
+/* Disable/stop the watchdog */
 
-static void pc87413_disable(void)
+static void pc87413_stop(void)
 {
 	spin_lock(&io_lock);
 
@@ -245,9 +242,9 @@ static void pc87413_disable(void)
 	spin_unlock(&io_lock);
 }
 
-/* Refresh the watchdog */
+/* Refresh/keepalive the watchdog */
 
-static void pc87413_refresh(void)
+static void pc87413_keepalive(struct watchdog_device *wdd)
 {
 	spin_lock(&io_lock);
 
@@ -260,6 +257,8 @@ static void pc87413_refresh(void)
 	pc87413_enable_sw_wd_trg();
 
 	spin_unlock(&io_lock);
+
+	return 0;
 }
 
 /* -- File operations -------------------------------------------*/
@@ -278,9 +277,6 @@ static int pc87413_open(struct inode *inode, struct file *file)
 	if (test_and_set_bit(0, &timer_enabled))
 		return -EBUSY;
 
-	if (nowayout)
-		__module_get(THIS_MODULE);
-
 	/* Reload and activate timer */
 	pc87413_refresh();
 
@@ -331,7 +327,6 @@ static int pc87413_status(void)
 
 /**
  *	pc87413_write:
- *	@file: file handle to the watchdog
  *	@data: data buffer to write
  *	@len: length in bytes
  *	@ppos: pointer to the position to write. No seeks allowed
@@ -345,26 +340,25 @@ static ssize_t pc87413_write(struct file *file, const char __user *data,
 {
 	/* See if we got the magic character 'V' and reload the timer */
 	if (len) {
-		if (!nowayout) {
-			size_t i;
-
-			/* reset expect flag */
-			expect_close = 0;
-
-			/* scan to see whether or not we got the
-			   magic character */
-			for (i = 0; i != len; i++) {
-				char c;
-				if (get_user(c, data + i))
-					return -EFAULT;
-				if (c == 'V')
-					expect_close = 42;
-			}
+		size_t i;
+
+		/* reset expect flag */
+		expect_close = 0;
+
+		/* scan to see whether or not we got the
+		   magic character */
+		for (i = 0; i != len; i++) {
+			char c;
+			if (get_user(c, data + i))
+				return -EFAULT;
+			if (c == 'V')
+				expect_close = 42;
 		}
+	}
 
 		/* someone wrote to us, we should reload the timer */
-		pc87413_refresh();
-	}
+	pc87413_refresh();
+	
 	return len;
 }
 
@@ -417,7 +411,7 @@ static long pc87413_ioctl(struct file *file, unsigned int cmd,
 			retval = 0;
 		}
 		if (options & WDIOS_ENABLECARD) {
-			pc87413_enable();
+			pc87413_start();
 			retval = 0;
 		}
 		return retval;
@@ -466,31 +460,32 @@ static int pc87413_notify_sys(struct notifier_block *this,
 {
 	if (code == SYS_DOWN || code == SYS_HALT)
 		/* Turn the card off */
-		pc87413_disable();
+		pc87413_stop();
 	return NOTIFY_DONE;
 }
 
 /* -- Module's structures ---------------------------------------*/
 
-static const struct file_operations pc87413_fops = {
-	.owner		= THIS_MODULE,
-	.llseek		= no_llseek,
-	.write		= pc87413_write,
-	.unlocked_ioctl	= pc87413_ioctl,
-	.open		= pc87413_open,
-	.release	= pc87413_release,
-};
 
-static struct notifier_block pc87413_notifier = {
+static struct notifier_block pc87413wdt_notifier = {
 	.notifier_call  = pc87413_notify_sys,
 };
 
-static struct miscdevice pc87413_miscdev = {
-	.minor          = WATCHDOG_MINOR,
-	.name           = "watchdog",
-	.fops           = &pc87413_fops,
+static struct watchdog_ops pc87413wdt_ops = {
+       .owner = THIS_MODULE,
+       .start = pc87413wdt_start,
+       .stop = pc87413wdt_stop,
+       .ping = pc87413wdt_keepalive,
+       .set_timeout = pc87413wdt_set_heartbeat,
+};
+
+static struct watchdog_device pc87413wdt_wdd = {
+       	.info = &pc87413wdt_ident,
+       	.ops = &pc87413wdt_ops,
+	.status = WATCHDOG_NOWAYOUT_INIT_STATUS
 };
 
+
 /* -- Module init functions -------------------------------------*/
 
 /**
@@ -515,7 +510,7 @@ static int __init pc87413_init(void)
 	if (ret != 0)
 		pr_err("cannot register reboot notifier (err=%d)\n", ret);
 
-	ret = misc_register(&pc87413_miscdev);
+	ret = watchdog_register_device(&pc87413wdt_wdd);
 	if (ret != 0) {
 		pr_err("cannot register miscdev on minor=%d (err=%d)\n",
 		       WATCHDOG_MINOR, ret);
@@ -533,13 +528,14 @@ static int __init pc87413_init(void)
 		goto misc_unreg;
 	}
 
-	pc87413_enable();
+	pc87413_start();
 
 	release_region(io, 2);
+	pc87413_keepalive(&pc87413wdt_wdd);
 	return 0;
 
 misc_unreg:
-	misc_deregister(&pc87413_miscdev);
+	watchdog_unregister_device(&pc87413wdt_wdd)
 reboot_unreg:
 	unregister_reboot_notifier(&pc87413_notifier);
 	release_region(io, 2);
-- 
2.17.1


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

* [PATCH 2/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface, with removal of file access functions for correct functionality
  2019-07-30  2:15 [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Mark Balantzyan
@ 2019-07-30  2:15 ` Mark Balantzyan
  2019-07-30  2:15 ` [PATCH 3/4] watchdog device drivers:pc87413_wdt: Tidying up conversion of pc87413_wdt driver to common watchdog interface, removal of some stray nowayout parameters Mark Balantzyan
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Mark Balantzyan @ 2019-07-30  2:15 UTC (permalink / raw)
  To: linux; +Cc: wim, linux-kernel, linux-watchdog, andrianov, Mark Balantzyan

There is a potential for the variable swc_base_addr in the call chain of the
driver initialization function (init) to be used before initialization. This
brought up the need for, by rewriting the driver to use the common watchdog
interface, ensuring to have all resources in place. This patch addresses this
need by rewriting into common watchdog interface utilization for the driver.

Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>

---
 drivers/watchdog/pc87413_wdt.c | 235 +++------------------------------
 1 file changed, 22 insertions(+), 213 deletions(-)

diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
index 4c330ee5..a9070a22 100644
--- a/drivers/watchdog/pc87413_wdt.c
+++ b/drivers/watchdog/pc87413_wdt.c
@@ -217,37 +217,28 @@ static inline void pc87413_disable_sw_wd_trg(void)
 
 static void pc87413_start(void)
 {
-	spin_lock(&io_lock);
-
 	pc87413_swc_bank3();
 	pc87413_programm_wdto(timeout);
 	pc87413_enable_wden();
 	pc87413_enable_sw_wd_tren();
 	pc87413_enable_sw_wd_trg();
 
-	spin_unlock(&io_lock);
 }
 
 /* Disable/stop the watchdog */
 
 static void pc87413_stop(void)
 {
-	spin_lock(&io_lock);
-
 	pc87413_swc_bank3();
 	pc87413_disable_sw_wd_tren();
 	pc87413_disable_sw_wd_trg();
 	pc87413_programm_wdto(0);
-
-	spin_unlock(&io_lock);
 }
 
 /* Refresh/keepalive the watchdog */
 
 static void pc87413_keepalive(struct watchdog_device *wdd)
 {
-	spin_lock(&io_lock);
-
 	pc87413_swc_bank3();
 	pc87413_disable_sw_wd_tren();
 	pc87413_disable_sw_wd_trg();
@@ -255,192 +246,11 @@ static void pc87413_keepalive(struct watchdog_device *wdd)
 	pc87413_enable_wden();
 	pc87413_enable_sw_wd_tren();
 	pc87413_enable_sw_wd_trg();
-
-	spin_unlock(&io_lock);
-
 	return 0;
 }
 
-/* -- File operations -------------------------------------------*/
-
-/**
- *	pc87413_open:
- *	@inode: inode of device
- *	@file: file handle to device
- *
- */
-
-static int pc87413_open(struct inode *inode, struct file *file)
-{
-	/* /dev/watchdog can only be opened once */
-
-	if (test_and_set_bit(0, &timer_enabled))
-		return -EBUSY;
 
-	/* Reload and activate timer */
-	pc87413_refresh();
-
-	pr_info("Watchdog enabled. Timeout set to %d minute(s).\n", timeout);
-
-	return nonseekable_open(inode, file);
-}
-
-/**
- *	pc87413_release:
- *	@inode: inode to board
- *	@file: file handle to board
- *
- *	The watchdog has a configurable API. There is a religious dispute
- *	between people who want their watchdog to be able to shut down and
- *	those who want to be sure if the watchdog manager dies the machine
- *	reboots. In the former case we disable the counters, in the latter
- *	case you have to open it again very soon.
- */
-
-static int pc87413_release(struct inode *inode, struct file *file)
-{
-	/* Shut off the timer. */
-
-	if (expect_close == 42) {
-		pc87413_disable();
-		pr_info("Watchdog disabled, sleeping again...\n");
-	} else {
-		pr_crit("Unexpected close, not stopping watchdog!\n");
-		pc87413_refresh();
-	}
-	clear_bit(0, &timer_enabled);
-	expect_close = 0;
-	return 0;
-}
-
-/**
- *	pc87413_status:
- *
- *      return, if the watchdog is enabled (timeout is set...)
- */
-
-
-static int pc87413_status(void)
-{
-	  return 0; /* currently not supported */
-}
-
-/**
- *	pc87413_write:
- *	@data: data buffer to write
- *	@len: length in bytes
- *	@ppos: pointer to the position to write. No seeks allowed
- *
- *	A write to a watchdog device is defined as a keepalive signal. Any
- *	write of data will do, as we we don't define content meaning.
- */
-
-static ssize_t pc87413_write(struct file *file, const char __user *data,
-			     size_t len, loff_t *ppos)
-{
-	/* See if we got the magic character 'V' and reload the timer */
-	if (len) {
-		size_t i;
-
-		/* reset expect flag */
-		expect_close = 0;
-
-		/* scan to see whether or not we got the
-		   magic character */
-		for (i = 0; i != len; i++) {
-			char c;
-			if (get_user(c, data + i))
-				return -EFAULT;
-			if (c == 'V')
-				expect_close = 42;
-		}
-	}
-
-		/* someone wrote to us, we should reload the timer */
-	pc87413_refresh();
-	
-	return len;
-}
-
-/**
- *	pc87413_ioctl:
- *	@file: file handle to the device
- *	@cmd: watchdog command
- *	@arg: argument pointer
- *
- *	The watchdog API defines a common set of functions for all watchdogs
- *	according to their available features. We only actually usefully support
- *	querying capabilities and current status.
- */
-
-static long pc87413_ioctl(struct file *file, unsigned int cmd,
-						unsigned long arg)
-{
-	int new_timeout;
-
-	union {
-		struct watchdog_info __user *ident;
-		int __user *i;
-	} uarg;
-
-	static const struct watchdog_info ident = {
-		.options          = WDIOF_KEEPALIVEPING |
-				    WDIOF_SETTIMEOUT |
-				    WDIOF_MAGICCLOSE,
-		.firmware_version = 1,
-		.identity         = "PC87413(HF/F) watchdog",
-	};
-
-	uarg.i = (int __user *)arg;
-
-	switch (cmd) {
-	case WDIOC_GETSUPPORT:
-		return copy_to_user(uarg.ident, &ident,
-					sizeof(ident)) ? -EFAULT : 0;
-	case WDIOC_GETSTATUS:
-		return put_user(pc87413_status(), uarg.i);
-	case WDIOC_GETBOOTSTATUS:
-		return put_user(0, uarg.i);
-	case WDIOC_SETOPTIONS:
-	{
-		int options, retval = -EINVAL;
-		if (get_user(options, uarg.i))
-			return -EFAULT;
-		if (options & WDIOS_DISABLECARD) {
-			pc87413_disable();
-			retval = 0;
-		}
-		if (options & WDIOS_ENABLECARD) {
-			pc87413_start();
-			retval = 0;
-		}
-		return retval;
-	}
-	case WDIOC_KEEPALIVE:
-		pc87413_refresh();
-#ifdef DEBUG
-		pr_info(DPFX "keepalive\n");
-#endif
-		return 0;
-	case WDIOC_SETTIMEOUT:
-		if (get_user(new_timeout, uarg.i))
-			return -EFAULT;
-		/* the API states this is given in secs */
-		new_timeout /= 60;
-		if (new_timeout < 0 || new_timeout > MAX_TIMEOUT)
-			return -EINVAL;
-		timeout = new_timeout;
-		pc87413_refresh();
-		/* fall through and return the new timeout... */
-	case WDIOC_GETTIMEOUT:
-		new_timeout = timeout * 60;
-		return put_user(new_timeout, uarg.i);
-	default:
-		return -ENOTTY;
-	}
-}
-
-/* -- Notifier funtions -----------------------------------------*/
+/* -- Notifier functions -----------------------------------------*/
 
 /**
  *	notify_sys:
@@ -454,22 +264,28 @@ static long pc87413_ioctl(struct file *file, unsigned int cmd,
  *	trust me - if it happens it does suck.
  */
 
-static int pc87413_notify_sys(struct notifier_block *this,
-			      unsigned long code,
-			      void *unused)
+
+/* -- Module's structures ---------------------------------------*/
+
+
+static int watchdog_restart_notifier(struct notifier_block *nb,
+				    unsigned long code, void *data)
 {
-	if (code == SYS_DOWN || code == SYS_HALT)
-		/* Turn the card off */
-		pc87413_stop();
+	struct watchdog_device *wdd = container_of(nb, struct watchdog_device,
+						   reboot_nb);
+
+	if (code == SYS_DOWN || code == SYS_HALT) {
+		int ret;
+
+		ret = wdd->ops->stop(wdd);
+		if (ret)
+			return NOTIFY_BAD;
+	}
+
 	return NOTIFY_DONE;
 }
 
-/* -- Module's structures ---------------------------------------*/
-
 
-static struct notifier_block pc87413wdt_notifier = {
-	.notifier_call  = pc87413_notify_sys,
-};
 
 static struct watchdog_ops pc87413wdt_ops = {
        .owner = THIS_MODULE,
@@ -482,7 +298,9 @@ static struct watchdog_ops pc87413wdt_ops = {
 static struct watchdog_device pc87413wdt_wdd = {
        	.info = &pc87413wdt_ident,
        	.ops = &pc87413wdt_ops,
-	.status = WATCHDOG_NOWAYOUT_INIT_STATUS
+	.status = WATCHDOG_NOWAYOUT_INIT_STATUS,
+	.exit = pc87413_exit,
+	.restart = watchdog_restart_notifier,
 };
 
 
@@ -493,7 +311,6 @@ static struct watchdog_device pc87413wdt_wdd = {
  *
  *	Set up the WDT watchdog board. All we have to do is grab the
  *	resources we require and bitch if anyone beat us to them.
- *	The open() function will actually kick the board off.
  */
 
 static int __init pc87413_init(void)
@@ -528,8 +345,6 @@ static int __init pc87413_init(void)
 		goto misc_unreg;
 	}
 
-	pc87413_start();
-
 	release_region(io, 2);
 	pc87413_keepalive(&pc87413wdt_wdd);
 	return 0;
@@ -554,13 +369,7 @@ reboot_unreg:
 
 static void __exit pc87413_exit(void)
 {
-	/* Stop the timer before we leave */
-	if (!nowayout) {
-		pc87413_disable();
-		pr_info("Watchdog disabled\n");
-	}
-
-	misc_deregister(&pc87413_miscdev);
+	watchdog_unregister_device(&pc87413wdt_wdd);
 	unregister_reboot_notifier(&pc87413_notifier);
 	release_region(swc_base_addr, 0x20);
 
-- 
2.17.1


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

* [PATCH 3/4] watchdog device drivers:pc87413_wdt: Tidying up conversion of pc87413_wdt driver to common watchdog interface, removal of some stray nowayout parameters
  2019-07-30  2:15 [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Mark Balantzyan
  2019-07-30  2:15 ` [PATCH 2/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface, with removal of file access functions for correct functionality Mark Balantzyan
@ 2019-07-30  2:15 ` Mark Balantzyan
  2019-07-30  2:35   ` Guenter Roeck
  2019-07-30  2:15 ` [PATCH 4/4] watchdog device drivers:pc87413_wdt: Continuing revision of conversion of pc87413_wdt to use common watchdog interface, removed undeclared identifiers Mark Balantzyan
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: Mark Balantzyan @ 2019-07-30  2:15 UTC (permalink / raw)
  To: linux; +Cc: wim, linux-kernel, linux-watchdog, andrianov, Mark Balantzyan

There is a potential for the variable swc_base_addr in the call chain of the
driver initialization function (init) to be used before initialization. This
brought up the need for, by rewriting the driver to use the common watchdog
interface, ensuring to have all resources in place. This patch addresses this
need by rewriting into common watchdog interface utilization for the driver.

Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>

---
 drivers/watchdog/pc87413_wdt.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
index a9070a22..bc6c4e19 100644
--- a/drivers/watchdog/pc87413_wdt.c
+++ b/drivers/watchdog/pc87413_wdt.c
@@ -392,9 +392,3 @@ module_param(timeout, int, 0);
 MODULE_PARM_DESC(timeout,
 		"Watchdog timeout in minutes (default="
 				__MODULE_STRING(DEFAULT_TIMEOUT) ").");
-
-module_param(nowayout, bool, 0);
-MODULE_PARM_DESC(nowayout,
-		"Watchdog cannot be stopped once started (default="
-				__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
-
-- 
2.17.1


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

* [PATCH 4/4] watchdog device drivers:pc87413_wdt: Continuing revision of conversion of pc87413_wdt to use common watchdog interface, removed undeclared identifiers
  2019-07-30  2:15 [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Mark Balantzyan
  2019-07-30  2:15 ` [PATCH 2/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface, with removal of file access functions for correct functionality Mark Balantzyan
  2019-07-30  2:15 ` [PATCH 3/4] watchdog device drivers:pc87413_wdt: Tidying up conversion of pc87413_wdt driver to common watchdog interface, removal of some stray nowayout parameters Mark Balantzyan
@ 2019-07-30  2:15 ` Mark Balantzyan
  2019-07-30  2:28   ` Guenter Roeck
  2019-07-30  2:33 ` [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Guenter Roeck
  2019-07-30  2:38 ` Guenter Roeck
  4 siblings, 1 reply; 9+ messages in thread
From: Mark Balantzyan @ 2019-07-30  2:15 UTC (permalink / raw)
  To: linux; +Cc: wim, linux-kernel, linux-watchdog, andrianov, Mark Balantzyan

There is a potential for the variable swc_base_addr in the call chain of the
driver initialization function (init) to be used before initialization. This
brought up the need for, by rewriting the driver to use the common watchdog
interface, ensuring to have all resources in place. This patch addresses this
need by rewriting into common watchdog interface utilization for the driver.

Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>

---
 drivers/watchdog/pc87413_wdt.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
index bc6c4e19..6863145a 100644
--- a/drivers/watchdog/pc87413_wdt.c
+++ b/drivers/watchdog/pc87413_wdt.c
@@ -370,7 +370,6 @@ reboot_unreg:
 static void __exit pc87413_exit(void)
 {
 	watchdog_unregister_device(&pc87413wdt_wdd);
-	unregister_reboot_notifier(&pc87413_notifier);
 	release_region(swc_base_addr, 0x20);
 
 	pr_info("watchdog component driver removed\n");
-- 
2.17.1


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

* Re: [PATCH 4/4] watchdog device drivers:pc87413_wdt: Continuing revision of conversion of pc87413_wdt to use common watchdog interface, removed undeclared identifiers
  2019-07-30  2:15 ` [PATCH 4/4] watchdog device drivers:pc87413_wdt: Continuing revision of conversion of pc87413_wdt to use common watchdog interface, removed undeclared identifiers Mark Balantzyan
@ 2019-07-30  2:28   ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2019-07-30  2:28 UTC (permalink / raw)
  To: Mark Balantzyan; +Cc: wim, linux-kernel, linux-watchdog, andrianov

On 7/29/19 7:15 PM, Mark Balantzyan wrote:
> There is a potential for the variable swc_base_addr in the call chain of the
> driver initialization function (init) to be used before initialization. This
> brought up the need for, by rewriting the driver to use the common watchdog
> interface, ensuring to have all resources in place. This patch addresses this
> need by rewriting into common watchdog interface utilization for the driver.
> 
> Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>
> 
> ---
>   drivers/watchdog/pc87413_wdt.c | 1 -
>   1 file changed, 1 deletion(-)
> 
> diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
> index bc6c4e19..6863145a 100644
> --- a/drivers/watchdog/pc87413_wdt.c
> +++ b/drivers/watchdog/pc87413_wdt.c
> @@ -370,7 +370,6 @@ reboot_unreg:
>   static void __exit pc87413_exit(void)
>   {
>   	watchdog_unregister_device(&pc87413wdt_wdd);
> -	unregister_reboot_notifier(&pc87413_notifier);

This needs to be in patch 2.

>   	release_region(swc_base_addr, 0x20);
>   
>   	pr_info("watchdog component driver removed\n");
> 


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

* Re: [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface
  2019-07-30  2:15 [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Mark Balantzyan
                   ` (2 preceding siblings ...)
  2019-07-30  2:15 ` [PATCH 4/4] watchdog device drivers:pc87413_wdt: Continuing revision of conversion of pc87413_wdt to use common watchdog interface, removed undeclared identifiers Mark Balantzyan
@ 2019-07-30  2:33 ` Guenter Roeck
  2019-07-30  2:38 ` Guenter Roeck
  4 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2019-07-30  2:33 UTC (permalink / raw)
  To: Mark Balantzyan; +Cc: wim, linux-kernel, linux-watchdog, andrianov

On 7/29/19 7:15 PM, Mark Balantzyan wrote:
> There is a potential for the variable swc_base_addr in the call chain of the
> driver initialization function (init) to be used before initialization. This
> brought up the need for, by rewriting the driver to use the common watchdog
> interface, ensuring to have all resources in place. This patch addresses this
> need by rewriting into common watchdog interface utilization for the driver.
> 

First, those four patches should be just one. Splitting them into four just makes
review more difficult.

Second, the potential race is not the key change, even though it may have
triggered it. Just describe the change, ie the rework to the watchdog API.

Then add that this also resolves a race condition.

Also see inline.

Thanks,
Guenter


> Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>
> ---
>   drivers/media/pci/tw686x/Kconfig |  1 +
>   drivers/watchdog/pc87413_wdt.c   | 92 +++++++++++++++-----------------
>   2 files changed, 45 insertions(+), 48 deletions(-)
> 
> diff --git a/drivers/media/pci/tw686x/Kconfig b/drivers/media/pci/tw686x/Kconfig
> index da8bfee7..079d7464 100644
> --- a/drivers/media/pci/tw686x/Kconfig
> +++ b/drivers/media/pci/tw686x/Kconfig
> @@ -5,6 +5,7 @@ config VIDEO_TW686X
>   	select VIDEOBUF2_DMA_CONTIG
>   	select VIDEOBUF2_DMA_SG
>   	select SND_PCM
> +	select WATCHDOG_CORE
>   	help
>   	  Support for Intersil/Techwell TW686x-based frame grabber cards.
>   
> diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
> index 06a892e3..4c330ee5 100644
> --- a/drivers/watchdog/pc87413_wdt.c
> +++ b/drivers/watchdog/pc87413_wdt.c
> @@ -22,12 +22,10 @@
>   
>   #include <linux/module.h>
>   #include <linux/types.h>
> -#include <linux/miscdevice.h>
>   #include <linux/watchdog.h>
>   #include <linux/ioport.h>
>   #include <linux/delay.h>
>   #include <linux/notifier.h>
> -#include <linux/fs.h>
>   #include <linux/reboot.h>
>   #include <linux/init.h>
>   #include <linux/spinlock.h>
> @@ -65,7 +63,6 @@ static char expect_close;		/* is the close expected? */
>   
>   static DEFINE_SPINLOCK(io_lock);	/* to guard us from io races */
>   
> -static bool nowayout = WATCHDOG_NOWAYOUT;
>   
>   /* -- Low level function ----------------------------------------*/
>   
> @@ -216,9 +213,9 @@ static inline void pc87413_disable_sw_wd_trg(void)
>   
>   /* -- Higher level functions ------------------------------------*/
>   
> -/* Enable the watchdog */
> +/* Enable/start the watchdog */
>   
> -static void pc87413_enable(void)
> +static void pc87413_start(void)
>   {
>   	spin_lock(&io_lock);
>   
> @@ -231,9 +228,9 @@ static void pc87413_enable(void)
>   	spin_unlock(&io_lock);
>   }
>   
> -/* Disable the watchdog */
> +/* Disable/stop the watchdog */
>   
> -static void pc87413_disable(void)
> +static void pc87413_stop(void)
>   {
>   	spin_lock(&io_lock);
>   
> @@ -245,9 +242,9 @@ static void pc87413_disable(void)
>   	spin_unlock(&io_lock);
>   }
>   
> -/* Refresh the watchdog */
> +/* Refresh/keepalive the watchdog */
>   
> -static void pc87413_refresh(void)
> +static void pc87413_keepalive(struct watchdog_device *wdd)
>   {
>   	spin_lock(&io_lock);
>   
> @@ -260,6 +257,8 @@ static void pc87413_refresh(void)
>   	pc87413_enable_sw_wd_trg();
>   
>   	spin_unlock(&io_lock);
> +
> +	return 0;
>   }
>   
>   /* -- File operations -------------------------------------------*/
> @@ -278,9 +277,6 @@ static int pc87413_open(struct inode *inode, struct file *file)
>   	if (test_and_set_bit(0, &timer_enabled))
>   		return -EBUSY;
>   
> -	if (nowayout)
> -		__module_get(THIS_MODULE);
> -
>   	/* Reload and activate timer */
>   	pc87413_refresh();
>   
> @@ -331,7 +327,6 @@ static int pc87413_status(void)
>   
>   /**
>    *	pc87413_write:
> - *	@file: file handle to the watchdog
>    *	@data: data buffer to write
>    *	@len: length in bytes
>    *	@ppos: pointer to the position to write. No seeks allowed
> @@ -345,26 +340,25 @@ static ssize_t pc87413_write(struct file *file, const char __user *data,
>   {
>   	/* See if we got the magic character 'V' and reload the timer */
>   	if (len) {
> -		if (!nowayout) {
> -			size_t i;
> -
> -			/* reset expect flag */
> -			expect_close = 0;
> -
> -			/* scan to see whether or not we got the
> -			   magic character */
> -			for (i = 0; i != len; i++) {
> -				char c;
> -				if (get_user(c, data + i))
> -					return -EFAULT;
> -				if (c == 'V')
> -					expect_close = 42;
> -			}
> +		size_t i;
> +
> +		/* reset expect flag */
> +		expect_close = 0;
> +
> +		/* scan to see whether or not we got the
> +		   magic character */
> +		for (i = 0; i != len; i++) {
> +			char c;
> +			if (get_user(c, data + i))
> +				return -EFAULT;
> +			if (c == 'V')
> +				expect_close = 42;
>   		}
> +	}
>   
>   		/* someone wrote to us, we should reload the timer */
> -		pc87413_refresh();
> -	}
> +	pc87413_refresh();
> +	
>   	return len;
>   }
>   
> @@ -417,7 +411,7 @@ static long pc87413_ioctl(struct file *file, unsigned int cmd,
>   			retval = 0;
>   		}
>   		if (options & WDIOS_ENABLECARD) {
> -			pc87413_enable();
> +			pc87413_start();

This is where things get confusing. This function is removed in the next patch.
Plus, it should be removed here, as you remove pc87413_fops below.

Why bother changing it only to remove it later ?

>   			retval = 0;
>   		}
>   		return retval;
> @@ -466,31 +460,32 @@ static int pc87413_notify_sys(struct notifier_block *this,
>   {
>   	if (code == SYS_DOWN || code == SYS_HALT)
>   		/* Turn the card off */
> -		pc87413_disable();
> +		pc87413_stop();

This can be accomplished by calling watchdog_stop_on_reboot() in the probe
function.

>   	return NOTIFY_DONE;
>   }
>   
>   /* -- Module's structures ---------------------------------------*/
>   
> -static const struct file_operations pc87413_fops = {
> -	.owner		= THIS_MODULE,
> -	.llseek		= no_llseek,
> -	.write		= pc87413_write,
> -	.unlocked_ioctl	= pc87413_ioctl,
> -	.open		= pc87413_open,
> -	.release	= pc87413_release,
> -};
>   
> -static struct notifier_block pc87413_notifier = {
> +static struct notifier_block pc87413wdt_notifier = {
>   	.notifier_call  = pc87413_notify_sys,
>   };
>   
> -static struct miscdevice pc87413_miscdev = {
> -	.minor          = WATCHDOG_MINOR,
> -	.name           = "watchdog",
> -	.fops           = &pc87413_fops,
> +static struct watchdog_ops pc87413wdt_ops = {
> +       .owner = THIS_MODULE,
> +       .start = pc87413wdt_start,
> +       .stop = pc87413wdt_stop,
> +       .ping = pc87413wdt_keepalive,
> +       .set_timeout = pc87413wdt_set_heartbeat,
> +};
> +
> +static struct watchdog_device pc87413wdt_wdd = {
> +       	.info = &pc87413wdt_ident,
> +       	.ops = &pc87413wdt_ops,
> +	.status = WATCHDOG_NOWAYOUT_INIT_STATUS
>   };
>   
> +
>   /* -- Module init functions -------------------------------------*/
>   
>   /**
> @@ -515,7 +510,7 @@ static int __init pc87413_init(void)
>   	if (ret != 0)
>   		pr_err("cannot register reboot notifier (err=%d)\n", ret);
>   
> -	ret = misc_register(&pc87413_miscdev);
> +	ret = watchdog_register_device(&pc87413wdt_wdd);
>   	if (ret != 0) {
>   		pr_err("cannot register miscdev on minor=%d (err=%d)\n",
>   		       WATCHDOG_MINOR, ret);
> @@ -533,13 +528,14 @@ static int __init pc87413_init(void)
>   		goto misc_unreg;
>   	}
>   
> -	pc87413_enable();
> +	pc87413_start();

You should drop this; it doesn't make sense to start the watchdog here.

>   
>   	release_region(io, 2);
> +	pc87413_keepalive(&pc87413wdt_wdd);
>   	return 0;
>   
>   misc_unreg:
> -	misc_deregister(&pc87413_miscdev);
> +	watchdog_unregister_device(&pc87413wdt_wdd)
>   reboot_unreg:
>   	unregister_reboot_notifier(&pc87413_notifier);
>   	release_region(io, 2);
> 


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

* Re: [PATCH 3/4] watchdog device drivers:pc87413_wdt: Tidying up conversion of pc87413_wdt driver to common watchdog interface, removal of some stray nowayout parameters
  2019-07-30  2:15 ` [PATCH 3/4] watchdog device drivers:pc87413_wdt: Tidying up conversion of pc87413_wdt driver to common watchdog interface, removal of some stray nowayout parameters Mark Balantzyan
@ 2019-07-30  2:35   ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2019-07-30  2:35 UTC (permalink / raw)
  To: Mark Balantzyan; +Cc: wim, linux-kernel, linux-watchdog, andrianov

On 7/29/19 7:15 PM, Mark Balantzyan wrote:
> There is a potential for the variable swc_base_addr in the call chain of the
> driver initialization function (init) to be used before initialization. This
> brought up the need for, by rewriting the driver to use the common watchdog
> interface, ensuring to have all resources in place. This patch addresses this
> need by rewriting into common watchdog interface utilization for the driver.
> 
> Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>
> 
> ---
>   drivers/watchdog/pc87413_wdt.c | 6 ------
>   1 file changed, 6 deletions(-)
> 
> diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
> index a9070a22..bc6c4e19 100644
> --- a/drivers/watchdog/pc87413_wdt.c
> +++ b/drivers/watchdog/pc87413_wdt.c
> @@ -392,9 +392,3 @@ module_param(timeout, int, 0);
>   MODULE_PARM_DESC(timeout,
>   		"Watchdog timeout in minutes (default="
>   				__MODULE_STRING(DEFAULT_TIMEOUT) ").");
> -
> -module_param(nowayout, bool, 0);
> -MODULE_PARM_DESC(nowayout,watchdog_set_nowayout
> -		"Watchdog cannot be stopped once started (default="
> -				__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
> -
> 
Why would you no longer want this module parameter ?

You should keep it and call watchdog_set_nowayout(wdev, nowayout);
in the probe function.

Guenter


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

* Re: [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface
  2019-07-30  2:15 [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Mark Balantzyan
                   ` (3 preceding siblings ...)
  2019-07-30  2:33 ` [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Guenter Roeck
@ 2019-07-30  2:38 ` Guenter Roeck
  2019-07-30  2:47   ` Mark Balantzyan
  4 siblings, 1 reply; 9+ messages in thread
From: Guenter Roeck @ 2019-07-30  2:38 UTC (permalink / raw)
  To: Mark Balantzyan; +Cc: wim, linux-kernel, linux-watchdog, andrianov

On 7/29/19 7:15 PM, Mark Balantzyan wrote:
> There is a potential for the variable swc_base_addr in the call chain of the
> driver initialization function (init) to be used before initialization. This
> brought up the need for, by rewriting the driver to use the common watchdog
> interface, ensuring to have all resources in place. This patch addresses this
> need by rewriting into common watchdog interface utilization for the driver.
> 
> Signed-off-by: Mark Balantzyan <mbalant3@gmail.com>
> ---
>   drivers/media/pci/tw686x/Kconfig |  1 +
>   drivers/watchdog/pc87413_wdt.c   | 92 +++++++++++++++-----------------
>   2 files changed, 45 insertions(+), 48 deletions(-)
> 
> diff --git a/drivers/media/pci/tw686x/Kconfig b/drivers/media/pci/tw686x/Kconfig
> index da8bfee7..079d7464 100644
> --- a/drivers/media/pci/tw686x/Kconfig
> +++ b/drivers/media/pci/tw686x/Kconfig
> @@ -5,6 +5,7 @@ config VIDEO_TW686X
>   	select VIDEOBUF2_DMA_CONTIG
>   	select VIDEOBUF2_DMA_SG
>   	select SND_PCM
> +	select WATCHDOG_CORE
>   	help
>   	  Support for Intersil/Techwell TW686x-based frame grabber cards.
>   
> diff --git a/drivers/watchdog/pc87413_wdt.c b/drivers/watchdog/pc87413_wdt.c
> index 06a892e3..4c330ee5 100644
> --- a/drivers/watchdog/pc87413_wdt.c
> +++ b/drivers/watchdog/pc87413_wdt.c
> @@ -22,12 +22,10 @@
>   
>   #include <linux/module.h>
>   #include <linux/types.h>
> -#include <linux/miscdevice.h>
>   #include <linux/watchdog.h>
>   #include <linux/ioport.h>
>   #include <linux/delay.h>
>   #include <linux/notifier.h>
> -#include <linux/fs.h>
>   #include <linux/reboot.h>
>   #include <linux/init.h>
>   #include <linux/spinlock.h>
> @@ -65,7 +63,6 @@ static char expect_close;		/* is the close expected? */
>   
>   static DEFINE_SPINLOCK(io_lock);	/* to guard us from io races */
>   
> -static bool nowayout = WATCHDOG_NOWAYOUT;
>   
>   /* -- Low level function ----------------------------------------*/
>   
> @@ -216,9 +213,9 @@ static inline void pc87413_disable_sw_wd_trg(void)
>   
>   /* -- Higher level functions ------------------------------------*/
>   
> -/* Enable the watchdog */
> +/* Enable/start the watchdog */
>   
> -static void pc87413_enable(void)
> +static void pc87413_start(void)

I really don't think that this code compiles without warning.

Guenter

>   {
>   	spin_lock(&io_lock);
>   
> @@ -231,9 +228,9 @@ static void pc87413_enable(void)
>   	spin_unlock(&io_lock);
>   }
>   
> -/* Disable the watchdog */
> +/* Disable/stop the watchdog */
>   
> -static void pc87413_disable(void)
> +static void pc87413_stop(void)
>   {
>   	spin_lock(&io_lock);
>   
> @@ -245,9 +242,9 @@ static void pc87413_disable(void)
>   	spin_unlock(&io_lock);
>   }
>   
> -/* Refresh the watchdog */
> +/* Refresh/keepalive the watchdog */
>   
> -static void pc87413_refresh(void)
> +static void pc87413_keepalive(struct watchdog_device *wdd)
>   {
>   	spin_lock(&io_lock);
>   
> @@ -260,6 +257,8 @@ static void pc87413_refresh(void)
>   	pc87413_enable_sw_wd_trg();
>   
>   	spin_unlock(&io_lock);
> +
> +	return 0;
>   }
>   
>   /* -- File operations -------------------------------------------*/
> @@ -278,9 +277,6 @@ static int pc87413_open(struct inode *inode, struct file *file)
>   	if (test_and_set_bit(0, &timer_enabled))
>   		return -EBUSY;
>   
> -	if (nowayout)
> -		__module_get(THIS_MODULE);
> -
>   	/* Reload and activate timer */
>   	pc87413_refresh();
>   
> @@ -331,7 +327,6 @@ static int pc87413_status(void)
>   
>   /**
>    *	pc87413_write:
> - *	@file: file handle to the watchdog
>    *	@data: data buffer to write
>    *	@len: length in bytes
>    *	@ppos: pointer to the position to write. No seeks allowed
> @@ -345,26 +340,25 @@ static ssize_t pc87413_write(struct file *file, const char __user *data,
>   {
>   	/* See if we got the magic character 'V' and reload the timer */
>   	if (len) {
> -		if (!nowayout) {
> -			size_t i;
> -
> -			/* reset expect flag */
> -			expect_close = 0;
> -
> -			/* scan to see whether or not we got the
> -			   magic character */
> -			for (i = 0; i != len; i++) {
> -				char c;
> -				if (get_user(c, data + i))
> -					return -EFAULT;
> -				if (c == 'V')
> -					expect_close = 42;
> -			}
> +		size_t i;
> +
> +		/* reset expect flag */
> +		expect_close = 0;
> +
> +		/* scan to see whether or not we got the
> +		   magic character */
> +		for (i = 0; i != len; i++) {
> +			char c;
> +			if (get_user(c, data + i))
> +				return -EFAULT;
> +			if (c == 'V')
> +				expect_close = 42;
>   		}
> +	}
>   
>   		/* someone wrote to us, we should reload the timer */
> -		pc87413_refresh();
> -	}
> +	pc87413_refresh();
> +	
>   	return len;
>   }
>   
> @@ -417,7 +411,7 @@ static long pc87413_ioctl(struct file *file, unsigned int cmd,
>   			retval = 0;
>   		}
>   		if (options & WDIOS_ENABLECARD) {
> -			pc87413_enable();
> +			pc87413_start();
>   			retval = 0;
>   		}
>   		return retval;
> @@ -466,31 +460,32 @@ static int pc87413_notify_sys(struct notifier_block *this,
>   {
>   	if (code == SYS_DOWN || code == SYS_HALT)
>   		/* Turn the card off */
> -		pc87413_disable();
> +		pc87413_stop();
>   	return NOTIFY_DONE;
>   }
>   
>   /* -- Module's structures ---------------------------------------*/
>   
> -static const struct file_operations pc87413_fops = {
> -	.owner		= THIS_MODULE,
> -	.llseek		= no_llseek,
> -	.write		= pc87413_write,
> -	.unlocked_ioctl	= pc87413_ioctl,
> -	.open		= pc87413_open,
> -	.release	= pc87413_release,
> -};
>   
> -static struct notifier_block pc87413_notifier = {
> +static struct notifier_block pc87413wdt_notifier = {
>   	.notifier_call  = pc87413_notify_sys,
>   };
>   
> -static struct miscdevice pc87413_miscdev = {
> -	.minor          = WATCHDOG_MINOR,
> -	.name           = "watchdog",
> -	.fops           = &pc87413_fops,
> +static struct watchdog_ops pc87413wdt_ops = {
> +       .owner = THIS_MODULE,
> +       .start = pc87413wdt_start,
> +       .stop = pc87413wdt_stop,
> +       .ping = pc87413wdt_keepalive,
> +       .set_timeout = pc87413wdt_set_heartbeat,
> +};
> +
> +static struct watchdog_device pc87413wdt_wdd = {
> +       	.info = &pc87413wdt_ident,
> +       	.ops = &pc87413wdt_ops,
> +	.status = WATCHDOG_NOWAYOUT_INIT_STATUS
>   };
>   
> +
>   /* -- Module init functions -------------------------------------*/
>   
>   /**
> @@ -515,7 +510,7 @@ static int __init pc87413_init(void)
>   	if (ret != 0)
>   		pr_err("cannot register reboot notifier (err=%d)\n", ret);
>   
> -	ret = misc_register(&pc87413_miscdev);
> +	ret = watchdog_register_device(&pc87413wdt_wdd);
>   	if (ret != 0) {
>   		pr_err("cannot register miscdev on minor=%d (err=%d)\n",
>   		       WATCHDOG_MINOR, ret);
> @@ -533,13 +528,14 @@ static int __init pc87413_init(void)
>   		goto misc_unreg;
>   	}
>   
> -	pc87413_enable();
> +	pc87413_start();
>   
>   	release_region(io, 2);
> +	pc87413_keepalive(&pc87413wdt_wdd);
>   	return 0;
>   
>   misc_unreg:
> -	misc_deregister(&pc87413_miscdev);
> +	watchdog_unregister_device(&pc87413wdt_wdd)
>   reboot_unreg:
>   	unregister_reboot_notifier(&pc87413_notifier);
>   	release_region(io, 2);
> 


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

* Re: [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface
  2019-07-30  2:38 ` Guenter Roeck
@ 2019-07-30  2:47   ` Mark Balantzyan
  0 siblings, 0 replies; 9+ messages in thread
From: Mark Balantzyan @ 2019-07-30  2:47 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Mark Balantzyan, wim, linux-kernel, linux-watchdog, andrianov

[-- Attachment #1: Type: text/plain, Size: 222 bytes --]

Yes, each time I go through an edit I discover something I missed,
apologies. Will be working on it for a bit, currently getting compile time
errors. Just letting you know and it¢s good we¢re checking :-)

Thank you,
Mark

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

end of thread, back to index

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-30  2:15 [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Mark Balantzyan
2019-07-30  2:15 ` [PATCH 2/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface, with removal of file access functions for correct functionality Mark Balantzyan
2019-07-30  2:15 ` [PATCH 3/4] watchdog device drivers:pc87413_wdt: Tidying up conversion of pc87413_wdt driver to common watchdog interface, removal of some stray nowayout parameters Mark Balantzyan
2019-07-30  2:35   ` Guenter Roeck
2019-07-30  2:15 ` [PATCH 4/4] watchdog device drivers:pc87413_wdt: Continuing revision of conversion of pc87413_wdt to use common watchdog interface, removed undeclared identifiers Mark Balantzyan
2019-07-30  2:28   ` Guenter Roeck
2019-07-30  2:33 ` [PATCH 1/4] watchdog device drivers:pc87413_wdt:Rewriting of pc87413_wdt driver to utilize common watchdog interface Guenter Roeck
2019-07-30  2:38 ` Guenter Roeck
2019-07-30  2:47   ` Mark Balantzyan

Linux-Watchdog Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-watchdog/0 linux-watchdog/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-watchdog linux-watchdog/ https://lore.kernel.org/linux-watchdog \
		linux-watchdog@vger.kernel.org linux-watchdog@archiver.kernel.org
	public-inbox-index linux-watchdog


Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-watchdog


AGPL code for this site: git clone https://public-inbox.org/ public-inbox