linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part
@ 2020-07-03 11:48 Johnson CH Chen (陳昭勳)
  2020-07-04 18:41 ` kernel test robot
  2020-07-05 15:24 ` Guenter Roeck
  0 siblings, 2 replies; 6+ messages in thread
From: Johnson CH Chen (陳昭勳) @ 2020-07-03 11:48 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-rtc, linux-watchdog, Wim Van Sebroeck, Alessandro Zummo,
	Alexandre Belloni, linux

Let ds1374 watchdog use watchdog core functions. It also includes
improving watchdog timer setting and nowayout, and just uses ioctl()
of watchdog core.

Signed-off-by: Johnson Chen <johnsonch.chen@moxa.com>
Reported-by: kernel test robot <lkp@intel.com>

v1->v2:
- Use ds1374_wdt_settimeout() before registering the watchdog
- Remove watchdog_unregister_device() because devm_watchdog_register_device() is used
- Remove ds1374_wdt_ping()
- TIMER_MARGIN_MAX to 4095 for 24-bit value
- Keep wdt_margin
- Fix coding styles
---
 drivers/rtc/Kconfig      |   1 +
 drivers/rtc/rtc-ds1374.c | 236 +++++++++------------------------------
 2 files changed, 52 insertions(+), 185 deletions(-)

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index b54d87d45c89..5e2444af5657 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -282,6 +282,7 @@ config RTC_DRV_DS1374
 config RTC_DRV_DS1374_WDT
 	bool "Dallas/Maxim DS1374 watchdog timer"
 	depends on RTC_DRV_DS1374
+	select WATCHDOG_CORE
 	help
 	  If you say Y here you will get support for the
 	  watchdog timer in the Dallas Semiconductor DS1374
diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c
index 9c51a12cf70f..57a4e503b34a 100644
--- a/drivers/rtc/rtc-ds1374.c
+++ b/drivers/rtc/rtc-ds1374.c
@@ -46,6 +46,7 @@
 #define DS1374_REG_WDALM2	0x06
 #define DS1374_REG_CR		0x07 /* Control */
 #define DS1374_REG_CR_AIE	0x01 /* Alarm Int. Enable */
+#define DS1374_REG_CR_WDSTR	0x08 /* 1=INT, 0=RST */
 #define DS1374_REG_CR_WDALM	0x20 /* 1=Watchdog, 0=Alarm */
 #define DS1374_REG_CR_WACE	0x40 /* WD/Alarm counter enable */
 #define DS1374_REG_SR		0x08 /* Status */
@@ -71,7 +72,9 @@ struct ds1374 {
 	struct i2c_client *client;
 	struct rtc_device *rtc;
 	struct work_struct work;
-
+#ifdef CONFIG_RTC_DRV_DS1374_WDT
+	struct watchdog_device wdt;
+#endif
 	/* The mutex protects alarm operations, and prevents a race
 	 * between the enable_irq() in the workqueue and the free_irq()
 	 * in the remove function.
@@ -371,72 +374,76 @@ static const struct rtc_class_ops ds1374_rtc_ops = {
  */
 static struct i2c_client *save_client;
 /* Default margin */
-#define WD_TIMO 131762
+#define TIMER_MARGIN_DEFAULT	32
+#define TIMER_MARGIN_MIN	1
+#define TIMER_MARGIN_MAX	4095 /* 24-bit value */
 
 #define DRV_NAME "DS1374 Watchdog"
 
-static int wdt_margin = WD_TIMO;
-static unsigned long wdt_is_open;
+static int wdt_margin = TIMER_MARGIN_DEFAULT;
 module_param(wdt_margin, int, 0);
 MODULE_PARM_DESC(wdt_margin, "Watchdog timeout in seconds (default 32s)");
 
+static bool nowayout = WATCHDOG_NOWAYOUT;
+module_param(nowayout, bool, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default ="
+		__MODULE_STRING(WATCHDOG_NOWAYOUT)")");
+
+
 static const struct watchdog_info ds1374_wdt_info = {
 	.identity       = "DS1374 WTD",
 	.options        = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING |
 						WDIOF_MAGICCLOSE,
 };
 
-static int ds1374_wdt_settimeout(unsigned int timeout)
+static int ds1374_wdt_settimeout(struct watchdog_device *wdt, unsigned int timeout)
 {
-	int ret = -ENOIOCTLCMD;
-	int cr;
+	int ret, cr;
 
-	ret = cr = i2c_smbus_read_byte_data(save_client, DS1374_REG_CR);
-	if (ret < 0)
-		goto out;
+	wdt->timeout = timeout;
+
+	cr = i2c_smbus_read_byte_data(save_client, DS1374_REG_CR);
+	if (cr < 0)
+		return cr;
 
 	/* Disable any existing watchdog/alarm before setting the new one */
 	cr &= ~DS1374_REG_CR_WACE;
 
 	ret = i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
 	if (ret < 0)
-		goto out;
+		return ret;
 
 	/* Set new watchdog time */
+	timeout = timeout * 4096;
 	ret = ds1374_write_rtc(save_client, timeout, DS1374_REG_WDALM0, 3);
 	if (ret) {
 		pr_info("couldn't set new watchdog time\n");
-		goto out;
+		return ret;
 	}
 
 	/* Enable watchdog timer */
 	cr |= DS1374_REG_CR_WACE | DS1374_REG_CR_WDALM;
+	cr &= ~DS1374_REG_CR_WDSTR;/* for RST PIN */
 	cr &= ~DS1374_REG_CR_AIE;
 
 	ret = i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
 	if (ret < 0)
-		goto out;
+		return ret;
 
 	return 0;
-out:
-	return ret;
 }
 
-
 /*
  * Reload the watchdog timer.  (ie, pat the watchdog)
  */
-static void ds1374_wdt_ping(void)
+static int ds1374_wdt_start(struct watchdog_device *wdt)
 {
 	u32 val;
-	int ret = 0;
 
-	ret = ds1374_read_rtc(save_client, &val, DS1374_REG_WDALM0, 3);
-	if (ret)
-		pr_info("WD TICK FAIL!!!!!!!!!! %i\n", ret);
+	return ds1374_read_rtc(save_client, &val, DS1374_REG_WDALM0, 3);
 }
 
-static void ds1374_wdt_disable(void)
+static int ds1374_wdt_stop(struct watchdog_device *wdt)
 {
 	int cr;
 
@@ -444,162 +451,16 @@ static void ds1374_wdt_disable(void)
 	/* Disable watchdog timer */
 	cr &= ~DS1374_REG_CR_WACE;
 
-	i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
-}
-
-/*
- * Watchdog device is opened, and watchdog starts running.
- */
-static int ds1374_wdt_open(struct inode *inode, struct file *file)
-{
-	struct ds1374 *ds1374 = i2c_get_clientdata(save_client);
-
-	if (MINOR(inode->i_rdev) == WATCHDOG_MINOR) {
-		mutex_lock(&ds1374->mutex);
-		if (test_and_set_bit(0, &wdt_is_open)) {
-			mutex_unlock(&ds1374->mutex);
-			return -EBUSY;
-		}
-		/*
-		 *      Activate
-		 */
-		wdt_is_open = 1;
-		mutex_unlock(&ds1374->mutex);
-		return stream_open(inode, file);
-	}
-	return -ENODEV;
-}
-
-/*
- * Close the watchdog device.
- */
-static int ds1374_wdt_release(struct inode *inode, struct file *file)
-{
-	if (MINOR(inode->i_rdev) == WATCHDOG_MINOR)
-		clear_bit(0, &wdt_is_open);
-
-	return 0;
+	return i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
 }
 
-/*
- * Pat the watchdog whenever device is written to.
- */
-static ssize_t ds1374_wdt_write(struct file *file, const char __user *data,
-				size_t len, loff_t *ppos)
-{
-	if (len) {
-		ds1374_wdt_ping();
-		return 1;
-	}
-	return 0;
-}
-
-static ssize_t ds1374_wdt_read(struct file *file, char __user *data,
-				size_t len, loff_t *ppos)
-{
-	return 0;
-}
-
-/*
- * Handle commands from user-space.
- */
-static long ds1374_wdt_ioctl(struct file *file, unsigned int cmd,
-							unsigned long arg)
-{
-	int new_margin, options;
-
-	switch (cmd) {
-	case WDIOC_GETSUPPORT:
-		return copy_to_user((struct watchdog_info __user *)arg,
-		&ds1374_wdt_info, sizeof(ds1374_wdt_info)) ? -EFAULT : 0;
-
-	case WDIOC_GETSTATUS:
-	case WDIOC_GETBOOTSTATUS:
-		return put_user(0, (int __user *)arg);
-	case WDIOC_KEEPALIVE:
-		ds1374_wdt_ping();
-		return 0;
-	case WDIOC_SETTIMEOUT:
-		if (get_user(new_margin, (int __user *)arg))
-			return -EFAULT;
-
-		/* the hardware's tick rate is 4096 Hz, so
-		 * the counter value needs to be scaled accordingly
-		 */
-		new_margin <<= 12;
-		if (new_margin < 1 || new_margin > 16777216)
-			return -EINVAL;
-
-		wdt_margin = new_margin;
-		ds1374_wdt_settimeout(new_margin);
-		ds1374_wdt_ping();
-		/* fallthrough */
-	case WDIOC_GETTIMEOUT:
-		/* when returning ... inverse is true */
-		return put_user((wdt_margin >> 12), (int __user *)arg);
-	case WDIOC_SETOPTIONS:
-		if (copy_from_user(&options, (int __user *)arg, sizeof(int)))
-			return -EFAULT;
-
-		if (options & WDIOS_DISABLECARD) {
-			pr_info("disable watchdog\n");
-			ds1374_wdt_disable();
-			return 0;
-		}
-
-		if (options & WDIOS_ENABLECARD) {
-			pr_info("enable watchdog\n");
-			ds1374_wdt_settimeout(wdt_margin);
-			ds1374_wdt_ping();
-			return 0;
-		}
-		return -EINVAL;
-	}
-	return -ENOTTY;
-}
-
-static long ds1374_wdt_unlocked_ioctl(struct file *file, unsigned int cmd,
-			unsigned long arg)
-{
-	int ret;
-	struct ds1374 *ds1374 = i2c_get_clientdata(save_client);
-
-	mutex_lock(&ds1374->mutex);
-	ret = ds1374_wdt_ioctl(file, cmd, arg);
-	mutex_unlock(&ds1374->mutex);
-
-	return ret;
-}
-
-static int ds1374_wdt_notify_sys(struct notifier_block *this,
-			unsigned long code, void *unused)
-{
-	if (code == SYS_DOWN || code == SYS_HALT)
-		/* Disable Watchdog */
-		ds1374_wdt_disable();
-	return NOTIFY_DONE;
-}
-
-static const struct file_operations ds1374_wdt_fops = {
-	.owner			= THIS_MODULE,
-	.read			= ds1374_wdt_read,
-	.unlocked_ioctl		= ds1374_wdt_unlocked_ioctl,
-	.compat_ioctl		= compat_ptr_ioctl,
-	.write			= ds1374_wdt_write,
-	.open                   = ds1374_wdt_open,
-	.release                = ds1374_wdt_release,
-	.llseek			= no_llseek,
+static const struct watchdog_ops ds1374_wdt_ops = {
+	.owner          = THIS_MODULE,
+	.start          = ds1374_wdt_start,
+	.stop           = ds1374_wdt_stop,
+	.set_timeout    = ds1374_wdt_settimeout,
 };
 
-static struct miscdevice ds1374_miscdev = {
-	.minor          = WATCHDOG_MINOR,
-	.name           = "watchdog",
-	.fops           = &ds1374_wdt_fops,
-};
-
-static struct notifier_block ds1374_wdt_notifier = {
-	.notifier_call = ds1374_wdt_notify_sys,
-};
 
 #endif /*CONFIG_RTC_DRV_DS1374_WDT*/
 /*
@@ -653,15 +514,25 @@ static int ds1374_probe(struct i2c_client *client,
 
 #ifdef CONFIG_RTC_DRV_DS1374_WDT
 	save_client = client;
-	ret = misc_register(&ds1374_miscdev);
-	if (ret)
-		return ret;
-	ret = register_reboot_notifier(&ds1374_wdt_notifier);
+	ds1374->wdt.info = &ds1374_wdt_info;
+	ds1374->wdt.ops = &ds1374_wdt_ops;
+	ds1374->wdt.timeout = TIMER_MARGIN_DEFAULT;
+	ds1374->wdt.min_timeout = TIMER_MARGIN_MIN;
+	ds1374->wdt.max_timeout = TIMER_MARGIN_MAX;
+
+	watchdog_init_timeout(&ds1374->wdt, wdt_margin, &client->dev);
+	watchdog_set_nowayout(&ds1374->wdt, nowayout);
+	watchdog_stop_on_reboot(&ds1374->wdt);
+	watchdog_stop_on_unregister(&ds1374->wdt);
+	ds1374_wdt_settimeout(&ds1374->wdt, wdt_margin);
+
+	ret = devm_watchdog_register_device(&client->dev, &ds1374->wdt);
 	if (ret) {
-		misc_deregister(&ds1374_miscdev);
+		dev_err(&client->dev, "failed to register DS1374 watchdog device\n");
 		return ret;
 	}
-	ds1374_wdt_settimeout(131072);
+
+	dev_info(&client->dev, "DS1374 watchdog device enabled\n");
 #endif
 
 	return 0;
@@ -670,11 +541,6 @@ static int ds1374_probe(struct i2c_client *client,
 static int ds1374_remove(struct i2c_client *client)
 {
 	struct ds1374 *ds1374 = i2c_get_clientdata(client);
-#ifdef CONFIG_RTC_DRV_DS1374_WDT
-	misc_deregister(&ds1374_miscdev);
-	ds1374_miscdev.parent = NULL;
-	unregister_reboot_notifier(&ds1374_wdt_notifier);
-#endif
 
 	if (client->irq > 0) {
 		mutex_lock(&ds1374->mutex);
-- 
2.20.1

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

* Re: [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part
  2020-07-03 11:48 [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part Johnson CH Chen (陳昭勳)
@ 2020-07-04 18:41 ` kernel test robot
  2020-07-05 15:24 ` Guenter Roeck
  1 sibling, 0 replies; 6+ messages in thread
From: kernel test robot @ 2020-07-04 18:41 UTC (permalink / raw)
  To: Johnson CH Chen (陳昭勳), linux-kernel
  Cc: kbuild-all, linux-rtc, linux-watchdog, Wim Van Sebroeck,
	Alessandro Zummo, Alexandre Belloni, linux

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

Hi "Johnson,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on abelloni/rtc-next]
[also build test ERROR on linux/master linus/master v5.8-rc3 next-20200703]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Johnson-CH-Chen/rtc-rtc-ds1374-wdt-Use-watchdog-core-for-watchdog-part/20200703-195053
base:   https://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git rtc-next
config: openrisc-randconfig-c004-20200701 (attached as .config)
compiler: or1k-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   or1k-linux-ld: drivers/rtc/rtc-ds1307.o: in function `ds1307_probe':
   rtc-ds1307.c:(.text+0x2a88): undefined reference to `watchdog_init_timeout'
   rtc-ds1307.c:(.text+0x2a88): relocation truncated to fit: R_OR1K_INSN_REL_26 against undefined symbol `watchdog_init_timeout'
>> or1k-linux-ld: rtc-ds1307.c:(.text+0x2a98): undefined reference to `devm_watchdog_register_device'
   rtc-ds1307.c:(.text+0x2a98): relocation truncated to fit: R_OR1K_INSN_REL_26 against undefined symbol `devm_watchdog_register_device'
   or1k-linux-ld: drivers/rtc/rtc-ds1374.o: in function `ds1374_probe':
   rtc-ds1374.c:(.text+0xa5c): undefined reference to `watchdog_init_timeout'
   rtc-ds1374.c:(.text+0xa5c): relocation truncated to fit: R_OR1K_INSN_REL_26 against undefined symbol `watchdog_init_timeout'
>> or1k-linux-ld: rtc-ds1374.c:(.text+0xac8): undefined reference to `devm_watchdog_register_device'
   rtc-ds1374.c:(.text+0xac8): relocation truncated to fit: R_OR1K_INSN_REL_26 against undefined symbol `devm_watchdog_register_device'

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 41279 bytes --]

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

* Re: [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part
  2020-07-03 11:48 [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part Johnson CH Chen (陳昭勳)
  2020-07-04 18:41 ` kernel test robot
@ 2020-07-05 15:24 ` Guenter Roeck
  2020-07-06  5:18   ` Johnson CH Chen (陳昭勳)
  1 sibling, 1 reply; 6+ messages in thread
From: Guenter Roeck @ 2020-07-05 15:24 UTC (permalink / raw)
  To: Johnson CH Chen (陳昭勳)
  Cc: linux-kernel, linux-rtc, linux-watchdog, Wim Van Sebroeck,
	Alessandro Zummo, Alexandre Belloni

On Fri, Jul 03, 2020 at 11:48:09AM +0000, Johnson CH Chen (陳昭勳) wrote:
> Let ds1374 watchdog use watchdog core functions. It also includes
> improving watchdog timer setting and nowayout, and just uses ioctl()
> of watchdog core.
> 
> Signed-off-by: Johnson Chen <johnsonch.chen@moxa.com>
> Reported-by: kernel test robot <lkp@intel.com>
> 
> v1->v2:
> - Use ds1374_wdt_settimeout() before registering the watchdog
> - Remove watchdog_unregister_device() because devm_watchdog_register_device() is used
> - Remove ds1374_wdt_ping()
> - TIMER_MARGIN_MAX to 4095 for 24-bit value
> - Keep wdt_margin
> - Fix coding styles
> ---
>  drivers/rtc/Kconfig      |   1 +
>  drivers/rtc/rtc-ds1374.c | 236 +++++++++------------------------------
>  2 files changed, 52 insertions(+), 185 deletions(-)
> 
> diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
> index b54d87d45c89..5e2444af5657 100644
> --- a/drivers/rtc/Kconfig
> +++ b/drivers/rtc/Kconfig
> @@ -282,6 +282,7 @@ config RTC_DRV_DS1374
>  config RTC_DRV_DS1374_WDT
>  	bool "Dallas/Maxim DS1374 watchdog timer"
>  	depends on RTC_DRV_DS1374
> +	select WATCHDOG_CORE

This has to be

	select WATCHDOG_CORE if WATCHDOG

to fix the problem reported by 0-day.

>  	help
>  	  If you say Y here you will get support for the
>  	  watchdog timer in the Dallas Semiconductor DS1374
> diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c
> index 9c51a12cf70f..57a4e503b34a 100644
> --- a/drivers/rtc/rtc-ds1374.c
> +++ b/drivers/rtc/rtc-ds1374.c
> @@ -46,6 +46,7 @@
>  #define DS1374_REG_WDALM2	0x06
>  #define DS1374_REG_CR		0x07 /* Control */
>  #define DS1374_REG_CR_AIE	0x01 /* Alarm Int. Enable */
> +#define DS1374_REG_CR_WDSTR	0x08 /* 1=INT, 0=RST */
>  #define DS1374_REG_CR_WDALM	0x20 /* 1=Watchdog, 0=Alarm */
>  #define DS1374_REG_CR_WACE	0x40 /* WD/Alarm counter enable */
>  #define DS1374_REG_SR		0x08 /* Status */
> @@ -71,7 +72,9 @@ struct ds1374 {
>  	struct i2c_client *client;
>  	struct rtc_device *rtc;
>  	struct work_struct work;
> -
> +#ifdef CONFIG_RTC_DRV_DS1374_WDT
> +	struct watchdog_device wdt;
> +#endif
>  	/* The mutex protects alarm operations, and prevents a race
>  	 * between the enable_irq() in the workqueue and the free_irq()
>  	 * in the remove function.
> @@ -371,72 +374,76 @@ static const struct rtc_class_ops ds1374_rtc_ops = {
>   */
>  static struct i2c_client *save_client;

This is no longer necessary. struct watchdog_device is part of struct ds1374,
so it is possible to derive the pointer to struct ds1374 from it and get the
client pointer from there.

>  /* Default margin */
> -#define WD_TIMO 131762
> +#define TIMER_MARGIN_DEFAULT	32
> +#define TIMER_MARGIN_MIN	1
> +#define TIMER_MARGIN_MAX	4095 /* 24-bit value */
>  
>  #define DRV_NAME "DS1374 Watchdog"
>  
> -static int wdt_margin = WD_TIMO;
> -static unsigned long wdt_is_open;
> +static int wdt_margin = TIMER_MARGIN_DEFAULT;

Should be 0, not TIMER_MARGIN_DEFAULT.

>  module_param(wdt_margin, int, 0);
>  MODULE_PARM_DESC(wdt_margin, "Watchdog timeout in seconds (default 32s)");
>  
> +static bool nowayout = WATCHDOG_NOWAYOUT;
> +module_param(nowayout, bool, 0);
> +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default ="
> +		__MODULE_STRING(WATCHDOG_NOWAYOUT)")");
> +
> +
>  static const struct watchdog_info ds1374_wdt_info = {
>  	.identity       = "DS1374 WTD",
>  	.options        = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING |
>  						WDIOF_MAGICCLOSE,
>  };
>  
> -static int ds1374_wdt_settimeout(unsigned int timeout)
> +static int ds1374_wdt_settimeout(struct watchdog_device *wdt, unsigned int timeout)
>  {
> -	int ret = -ENOIOCTLCMD;
> -	int cr;
> +	int ret, cr;
>  
> -	ret = cr = i2c_smbus_read_byte_data(save_client, DS1374_REG_CR);
> -	if (ret < 0)
> -		goto out;
> +	wdt->timeout = timeout;
> +
> +	cr = i2c_smbus_read_byte_data(save_client, DS1374_REG_CR);
> +	if (cr < 0)
> +		return cr;
>  
>  	/* Disable any existing watchdog/alarm before setting the new one */
>  	cr &= ~DS1374_REG_CR_WACE;
>  
>  	ret = i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
>  	if (ret < 0)
> -		goto out;
> +		return ret;
>  
>  	/* Set new watchdog time */
> +	timeout = timeout * 4096;
>  	ret = ds1374_write_rtc(save_client, timeout, DS1374_REG_WDALM0, 3);
>  	if (ret) {
>  		pr_info("couldn't set new watchdog time\n");

dev_info() can now be used since we have a device. _info seems to be wrong,
though, since this is an error.

> -		goto out;
> +		return ret;
>  	}
>  
>  	/* Enable watchdog timer */
>  	cr |= DS1374_REG_CR_WACE | DS1374_REG_CR_WDALM;
> +	cr &= ~DS1374_REG_CR_WDSTR;/* for RST PIN */
>  	cr &= ~DS1374_REG_CR_AIE;
>  
>  	ret = i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
>  	if (ret < 0)
> -		goto out;
> +		return ret;
>  
>  	return 0;
> -out:
> -	return ret;
>  }
>  
> -
>  /*
>   * Reload the watchdog timer.  (ie, pat the watchdog)
>   */
> -static void ds1374_wdt_ping(void)
> +static int ds1374_wdt_start(struct watchdog_device *wdt)
>  {
>  	u32 val;
> -	int ret = 0;
>  
> -	ret = ds1374_read_rtc(save_client, &val, DS1374_REG_WDALM0, 3);
> -	if (ret)
> -		pr_info("WD TICK FAIL!!!!!!!!!! %i\n", ret);
> +	return ds1374_read_rtc(save_client, &val, DS1374_REG_WDALM0, 3);
>  }
>  
> -static void ds1374_wdt_disable(void)
> +static int ds1374_wdt_stop(struct watchdog_device *wdt)
>  {
>  	int cr;
>  
> @@ -444,162 +451,16 @@ static void ds1374_wdt_disable(void)
>  	/* Disable watchdog timer */
>  	cr &= ~DS1374_REG_CR_WACE;
>  
> -	i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
> -}
> -
> -/*
> - * Watchdog device is opened, and watchdog starts running.
> - */
> -static int ds1374_wdt_open(struct inode *inode, struct file *file)
> -{
> -	struct ds1374 *ds1374 = i2c_get_clientdata(save_client);
> -
> -	if (MINOR(inode->i_rdev) == WATCHDOG_MINOR) {
> -		mutex_lock(&ds1374->mutex);
> -		if (test_and_set_bit(0, &wdt_is_open)) {
> -			mutex_unlock(&ds1374->mutex);
> -			return -EBUSY;
> -		}
> -		/*
> -		 *      Activate
> -		 */
> -		wdt_is_open = 1;
> -		mutex_unlock(&ds1374->mutex);
> -		return stream_open(inode, file);
> -	}
> -	return -ENODEV;
> -}
> -
> -/*
> - * Close the watchdog device.
> - */
> -static int ds1374_wdt_release(struct inode *inode, struct file *file)
> -{
> -	if (MINOR(inode->i_rdev) == WATCHDOG_MINOR)
> -		clear_bit(0, &wdt_is_open);
> -
> -	return 0;
> +	return i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
>  }
>  
> -/*
> - * Pat the watchdog whenever device is written to.
> - */
> -static ssize_t ds1374_wdt_write(struct file *file, const char __user *data,
> -				size_t len, loff_t *ppos)
> -{
> -	if (len) {
> -		ds1374_wdt_ping();
> -		return 1;
> -	}
> -	return 0;
> -}
> -
> -static ssize_t ds1374_wdt_read(struct file *file, char __user *data,
> -				size_t len, loff_t *ppos)
> -{
> -	return 0;
> -}
> -
> -/*
> - * Handle commands from user-space.
> - */
> -static long ds1374_wdt_ioctl(struct file *file, unsigned int cmd,
> -							unsigned long arg)
> -{
> -	int new_margin, options;
> -
> -	switch (cmd) {
> -	case WDIOC_GETSUPPORT:
> -		return copy_to_user((struct watchdog_info __user *)arg,
> -		&ds1374_wdt_info, sizeof(ds1374_wdt_info)) ? -EFAULT : 0;
> -
> -	case WDIOC_GETSTATUS:
> -	case WDIOC_GETBOOTSTATUS:
> -		return put_user(0, (int __user *)arg);
> -	case WDIOC_KEEPALIVE:
> -		ds1374_wdt_ping();
> -		return 0;
> -	case WDIOC_SETTIMEOUT:
> -		if (get_user(new_margin, (int __user *)arg))
> -			return -EFAULT;
> -
> -		/* the hardware's tick rate is 4096 Hz, so
> -		 * the counter value needs to be scaled accordingly
> -		 */
> -		new_margin <<= 12;
> -		if (new_margin < 1 || new_margin > 16777216)
> -			return -EINVAL;
> -
> -		wdt_margin = new_margin;
> -		ds1374_wdt_settimeout(new_margin);
> -		ds1374_wdt_ping();
> -		/* fallthrough */
> -	case WDIOC_GETTIMEOUT:
> -		/* when returning ... inverse is true */
> -		return put_user((wdt_margin >> 12), (int __user *)arg);
> -	case WDIOC_SETOPTIONS:
> -		if (copy_from_user(&options, (int __user *)arg, sizeof(int)))
> -			return -EFAULT;
> -
> -		if (options & WDIOS_DISABLECARD) {
> -			pr_info("disable watchdog\n");
> -			ds1374_wdt_disable();
> -			return 0;
> -		}
> -
> -		if (options & WDIOS_ENABLECARD) {
> -			pr_info("enable watchdog\n");
> -			ds1374_wdt_settimeout(wdt_margin);
> -			ds1374_wdt_ping();
> -			return 0;
> -		}
> -		return -EINVAL;
> -	}
> -	return -ENOTTY;
> -}
> -
> -static long ds1374_wdt_unlocked_ioctl(struct file *file, unsigned int cmd,
> -			unsigned long arg)
> -{
> -	int ret;
> -	struct ds1374 *ds1374 = i2c_get_clientdata(save_client);
> -
> -	mutex_lock(&ds1374->mutex);
> -	ret = ds1374_wdt_ioctl(file, cmd, arg);
> -	mutex_unlock(&ds1374->mutex);
> -
> -	return ret;
> -}
> -
> -static int ds1374_wdt_notify_sys(struct notifier_block *this,
> -			unsigned long code, void *unused)
> -{
> -	if (code == SYS_DOWN || code == SYS_HALT)
> -		/* Disable Watchdog */
> -		ds1374_wdt_disable();
> -	return NOTIFY_DONE;
> -}
> -
> -static const struct file_operations ds1374_wdt_fops = {
> -	.owner			= THIS_MODULE,
> -	.read			= ds1374_wdt_read,
> -	.unlocked_ioctl		= ds1374_wdt_unlocked_ioctl,
> -	.compat_ioctl		= compat_ptr_ioctl,
> -	.write			= ds1374_wdt_write,
> -	.open                   = ds1374_wdt_open,
> -	.release                = ds1374_wdt_release,
> -	.llseek			= no_llseek,
> +static const struct watchdog_ops ds1374_wdt_ops = {
> +	.owner          = THIS_MODULE,
> +	.start          = ds1374_wdt_start,
> +	.stop           = ds1374_wdt_stop,
> +	.set_timeout    = ds1374_wdt_settimeout,
>  };
>  
> -static struct miscdevice ds1374_miscdev = {
> -	.minor          = WATCHDOG_MINOR,
> -	.name           = "watchdog",
> -	.fops           = &ds1374_wdt_fops,
> -};
> -
> -static struct notifier_block ds1374_wdt_notifier = {
> -	.notifier_call = ds1374_wdt_notify_sys,
> -};
>  
>  #endif /*CONFIG_RTC_DRV_DS1374_WDT*/
>  /*
> @@ -653,15 +514,25 @@ static int ds1374_probe(struct i2c_client *client,
>  
>  #ifdef CONFIG_RTC_DRV_DS1374_WDT
>  	save_client = client;
> -	ret = misc_register(&ds1374_miscdev);
> -	if (ret)
> -		return ret;
> -	ret = register_reboot_notifier(&ds1374_wdt_notifier);
> +	ds1374->wdt.info = &ds1374_wdt_info;
> +	ds1374->wdt.ops = &ds1374_wdt_ops;
> +	ds1374->wdt.timeout = TIMER_MARGIN_DEFAULT;
> +	ds1374->wdt.min_timeout = TIMER_MARGIN_MIN;
> +	ds1374->wdt.max_timeout = TIMER_MARGIN_MAX;
> +
> +	watchdog_init_timeout(&ds1374->wdt, wdt_margin, &client->dev);
> +	watchdog_set_nowayout(&ds1374->wdt, nowayout);
> +	watchdog_stop_on_reboot(&ds1374->wdt);
> +	watchdog_stop_on_unregister(&ds1374->wdt);
> +	ds1374_wdt_settimeout(&ds1374->wdt, wdt_margin);
> +
> +	ret = devm_watchdog_register_device(&client->dev, &ds1374->wdt);
>  	if (ret) {
> -		misc_deregister(&ds1374_miscdev);
> +		dev_err(&client->dev, "failed to register DS1374 watchdog device\n");
>  		return ret;
>  	}
> -	ds1374_wdt_settimeout(131072);
> +
> +	dev_info(&client->dev, "DS1374 watchdog device enabled\n");

Is that necessary ?

>  #endif
>  
>  	return 0;
> @@ -670,11 +541,6 @@ static int ds1374_probe(struct i2c_client *client,
>  static int ds1374_remove(struct i2c_client *client)
>  {
>  	struct ds1374 *ds1374 = i2c_get_clientdata(client);
> -#ifdef CONFIG_RTC_DRV_DS1374_WDT
> -	misc_deregister(&ds1374_miscdev);
> -	ds1374_miscdev.parent = NULL;
> -	unregister_reboot_notifier(&ds1374_wdt_notifier);
> -#endif
>  
>  	if (client->irq > 0) {
>  		mutex_lock(&ds1374->mutex);
> -- 
> 2.20.1

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

* RE: [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part
  2020-07-05 15:24 ` Guenter Roeck
@ 2020-07-06  5:18   ` Johnson CH Chen (陳昭勳)
  2020-07-06  6:34     ` Alexandre Belloni
  0 siblings, 1 reply; 6+ messages in thread
From: Johnson CH Chen (陳昭勳) @ 2020-07-06  5:18 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-rtc, linux-watchdog, Wim Van Sebroeck,
	Alessandro Zummo, Alexandre Belloni

Hi,

Thanks for your good suggestions!

> > diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index
> > b54d87d45c89..5e2444af5657 100644
> > --- a/drivers/rtc/Kconfig
> > +++ b/drivers/rtc/Kconfig
> > @@ -282,6 +282,7 @@ config RTC_DRV_DS1374  config
> RTC_DRV_DS1374_WDT
> >  	bool "Dallas/Maxim DS1374 watchdog timer"
> >  	depends on RTC_DRV_DS1374
> > +	select WATCHDOG_CORE
> 
> This has to be
> 
> 	select WATCHDOG_CORE if WATCHDOG
> 
> to fix the problem reported by 0-day.
> 
> >  	help
> >  	  If you say Y here you will get support for the
> >  	  watchdog timer in the Dallas Semiconductor DS1374 diff --git
> > a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c index
> > 9c51a12cf70f..57a4e503b34a 100644
> > --- a/drivers/rtc/rtc-ds1374.c
> > +++ b/drivers/rtc/rtc-ds1374.c
> > @@ -46,6 +46,7 @@
> >  #define DS1374_REG_WDALM2	0x06
> >  #define DS1374_REG_CR		0x07 /* Control */
> >  #define DS1374_REG_CR_AIE	0x01 /* Alarm Int. Enable */
> > +#define DS1374_REG_CR_WDSTR	0x08 /* 1=INT, 0=RST */
> >  #define DS1374_REG_CR_WDALM	0x20 /* 1=Watchdog, 0=Alarm */
> >  #define DS1374_REG_CR_WACE	0x40 /* WD/Alarm counter enable */
> >  #define DS1374_REG_SR		0x08 /* Status */
> > @@ -71,7 +72,9 @@ struct ds1374 {
> >  	struct i2c_client *client;
> >  	struct rtc_device *rtc;
> >  	struct work_struct work;
> > -
> > +#ifdef CONFIG_RTC_DRV_DS1374_WDT
> > +	struct watchdog_device wdt;
> > +#endif
> >  	/* The mutex protects alarm operations, and prevents a race
> >  	 * between the enable_irq() in the workqueue and the free_irq()
> >  	 * in the remove function.
> > @@ -371,72 +374,76 @@ static const struct rtc_class_ops ds1374_rtc_ops =
> {
> >   */
> >  static struct i2c_client *save_client;
> 
> This is no longer necessary. struct watchdog_device is part of struct ds1374, so
> it is possible to derive the pointer to struct ds1374 from it and get the client
> pointer from there.
> 
> >  /* Default margin */
> > -#define WD_TIMO 131762
> > +#define TIMER_MARGIN_DEFAULT	32
> > +#define TIMER_MARGIN_MIN	1
> > +#define TIMER_MARGIN_MAX	4095 /* 24-bit value */
> >
> >  #define DRV_NAME "DS1374 Watchdog"
> >
> > -static int wdt_margin = WD_TIMO;
> > -static unsigned long wdt_is_open;
> > +static int wdt_margin = TIMER_MARGIN_DEFAULT;
> 
> Should be 0, not TIMER_MARGIN_DEFAULT.
> 
> >  module_param(wdt_margin, int, 0);
> >  MODULE_PARM_DESC(wdt_margin, "Watchdog timeout in seconds
> (default
> > 32s)");
> >
> > +static bool nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout,
> > +bool, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped
> once
> > +started (default ="
> > +		__MODULE_STRING(WATCHDOG_NOWAYOUT)")");
> > +
> > +
> >  static const struct watchdog_info ds1374_wdt_info = {
> >  	.identity       = "DS1374 WTD",
> >  	.options        = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING |
> >  						WDIOF_MAGICCLOSE,
> >  };
> >
> > -static int ds1374_wdt_settimeout(unsigned int timeout)
> > +static int ds1374_wdt_settimeout(struct watchdog_device *wdt,
> > +unsigned int timeout)
> >  {
> > -	int ret = -ENOIOCTLCMD;
> > -	int cr;
> > +	int ret, cr;
> >
> > -	ret = cr = i2c_smbus_read_byte_data(save_client, DS1374_REG_CR);
> > -	if (ret < 0)
> > -		goto out;
> > +	wdt->timeout = timeout;
> > +
> > +	cr = i2c_smbus_read_byte_data(save_client, DS1374_REG_CR);
> > +	if (cr < 0)
> > +		return cr;
> >
> >  	/* Disable any existing watchdog/alarm before setting the new one */
> >  	cr &= ~DS1374_REG_CR_WACE;
> >
> >  	ret = i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
> >  	if (ret < 0)
> > -		goto out;
> > +		return ret;
> >
> >  	/* Set new watchdog time */
> > +	timeout = timeout * 4096;
> >  	ret = ds1374_write_rtc(save_client, timeout, DS1374_REG_WDALM0, 3);
> >  	if (ret) {
> >  		pr_info("couldn't set new watchdog time\n");
> 
> dev_info() can now be used since we have a device. _info seems to be wrong,
> though, since this is an error.
> 
> > -		goto out;
> > +		return ret;
> >  	}
> >
> >  	/* Enable watchdog timer */
> >  	cr |= DS1374_REG_CR_WACE | DS1374_REG_CR_WDALM;
> > +	cr &= ~DS1374_REG_CR_WDSTR;/* for RST PIN */
> >  	cr &= ~DS1374_REG_CR_AIE;
> >
> >  	ret = i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
> >  	if (ret < 0)
> > -		goto out;
> > +		return ret;
> >
> >  	return 0;
> > -out:
> > -	return ret;
> >  }
> >
> > -
> >  /*
> >   * Reload the watchdog timer.  (ie, pat the watchdog)
> >   */
> > -static void ds1374_wdt_ping(void)
> > +static int ds1374_wdt_start(struct watchdog_device *wdt)
> >  {
> >  	u32 val;
> > -	int ret = 0;
> >
> > -	ret = ds1374_read_rtc(save_client, &val, DS1374_REG_WDALM0, 3);
> > -	if (ret)
> > -		pr_info("WD TICK FAIL!!!!!!!!!! %i\n", ret);
> > +	return ds1374_read_rtc(save_client, &val, DS1374_REG_WDALM0, 3);
> >  }
> >
> > -static void ds1374_wdt_disable(void)
> > +static int ds1374_wdt_stop(struct watchdog_device *wdt)
> >  {
> >  	int cr;
> >
> > @@ -444,162 +451,16 @@ static void ds1374_wdt_disable(void)
> >  	/* Disable watchdog timer */
> >  	cr &= ~DS1374_REG_CR_WACE;
> >
> > -	i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
> > -}
> > -
> > -/*
> > - * Watchdog device is opened, and watchdog starts running.
> > - */
> > -static int ds1374_wdt_open(struct inode *inode, struct file *file) -{
> > -	struct ds1374 *ds1374 = i2c_get_clientdata(save_client);
> > -
> > -	if (MINOR(inode->i_rdev) == WATCHDOG_MINOR) {
> > -		mutex_lock(&ds1374->mutex);
> > -		if (test_and_set_bit(0, &wdt_is_open)) {
> > -			mutex_unlock(&ds1374->mutex);
> > -			return -EBUSY;
> > -		}
> > -		/*
> > -		 *      Activate
> > -		 */
> > -		wdt_is_open = 1;
> > -		mutex_unlock(&ds1374->mutex);
> > -		return stream_open(inode, file);
> > -	}
> > -	return -ENODEV;
> > -}
> > -
> > -/*
> > - * Close the watchdog device.
> > - */
> > -static int ds1374_wdt_release(struct inode *inode, struct file *file)
> > -{
> > -	if (MINOR(inode->i_rdev) == WATCHDOG_MINOR)
> > -		clear_bit(0, &wdt_is_open);
> > -
> > -	return 0;
> > +	return i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr);
> >  }
> >
> > -/*
> > - * Pat the watchdog whenever device is written to.
> > - */
> > -static ssize_t ds1374_wdt_write(struct file *file, const char __user *data,
> > -				size_t len, loff_t *ppos)
> > -{
> > -	if (len) {
> > -		ds1374_wdt_ping();
> > -		return 1;
> > -	}
> > -	return 0;
> > -}
> > -
> > -static ssize_t ds1374_wdt_read(struct file *file, char __user *data,
> > -				size_t len, loff_t *ppos)
> > -{
> > -	return 0;
> > -}
> > -
> > -/*
> > - * Handle commands from user-space.
> > - */
> > -static long ds1374_wdt_ioctl(struct file *file, unsigned int cmd,
> > -							unsigned long arg)
> > -{
> > -	int new_margin, options;
> > -
> > -	switch (cmd) {
> > -	case WDIOC_GETSUPPORT:
> > -		return copy_to_user((struct watchdog_info __user *)arg,
> > -		&ds1374_wdt_info, sizeof(ds1374_wdt_info)) ? -EFAULT : 0;
> > -
> > -	case WDIOC_GETSTATUS:
> > -	case WDIOC_GETBOOTSTATUS:
> > -		return put_user(0, (int __user *)arg);
> > -	case WDIOC_KEEPALIVE:
> > -		ds1374_wdt_ping();
> > -		return 0;
> > -	case WDIOC_SETTIMEOUT:
> > -		if (get_user(new_margin, (int __user *)arg))
> > -			return -EFAULT;
> > -
> > -		/* the hardware's tick rate is 4096 Hz, so
> > -		 * the counter value needs to be scaled accordingly
> > -		 */
> > -		new_margin <<= 12;
> > -		if (new_margin < 1 || new_margin > 16777216)
> > -			return -EINVAL;
> > -
> > -		wdt_margin = new_margin;
> > -		ds1374_wdt_settimeout(new_margin);
> > -		ds1374_wdt_ping();
> > -		/* fallthrough */
> > -	case WDIOC_GETTIMEOUT:
> > -		/* when returning ... inverse is true */
> > -		return put_user((wdt_margin >> 12), (int __user *)arg);
> > -	case WDIOC_SETOPTIONS:
> > -		if (copy_from_user(&options, (int __user *)arg, sizeof(int)))
> > -			return -EFAULT;
> > -
> > -		if (options & WDIOS_DISABLECARD) {
> > -			pr_info("disable watchdog\n");
> > -			ds1374_wdt_disable();
> > -			return 0;
> > -		}
> > -
> > -		if (options & WDIOS_ENABLECARD) {
> > -			pr_info("enable watchdog\n");
> > -			ds1374_wdt_settimeout(wdt_margin);
> > -			ds1374_wdt_ping();
> > -			return 0;
> > -		}
> > -		return -EINVAL;
> > -	}
> > -	return -ENOTTY;
> > -}
> > -
> > -static long ds1374_wdt_unlocked_ioctl(struct file *file, unsigned int cmd,
> > -			unsigned long arg)
> > -{
> > -	int ret;
> > -	struct ds1374 *ds1374 = i2c_get_clientdata(save_client);
> > -
> > -	mutex_lock(&ds1374->mutex);
> > -	ret = ds1374_wdt_ioctl(file, cmd, arg);
> > -	mutex_unlock(&ds1374->mutex);
> > -
> > -	return ret;
> > -}
> > -
> > -static int ds1374_wdt_notify_sys(struct notifier_block *this,
> > -			unsigned long code, void *unused)
> > -{
> > -	if (code == SYS_DOWN || code == SYS_HALT)
> > -		/* Disable Watchdog */
> > -		ds1374_wdt_disable();
> > -	return NOTIFY_DONE;
> > -}
> > -
> > -static const struct file_operations ds1374_wdt_fops = {
> > -	.owner			= THIS_MODULE,
> > -	.read			= ds1374_wdt_read,
> > -	.unlocked_ioctl		= ds1374_wdt_unlocked_ioctl,
> > -	.compat_ioctl		= compat_ptr_ioctl,
> > -	.write			= ds1374_wdt_write,
> > -	.open                   = ds1374_wdt_open,
> > -	.release                = ds1374_wdt_release,
> > -	.llseek			= no_llseek,
> > +static const struct watchdog_ops ds1374_wdt_ops = {
> > +	.owner          = THIS_MODULE,
> > +	.start          = ds1374_wdt_start,
> > +	.stop           = ds1374_wdt_stop,
> > +	.set_timeout    = ds1374_wdt_settimeout,
> >  };
> >
> > -static struct miscdevice ds1374_miscdev = {
> > -	.minor          = WATCHDOG_MINOR,
> > -	.name           = "watchdog",
> > -	.fops           = &ds1374_wdt_fops,
> > -};
> > -
> > -static struct notifier_block ds1374_wdt_notifier = {
> > -	.notifier_call = ds1374_wdt_notify_sys,
> > -};
> >
> >  #endif /*CONFIG_RTC_DRV_DS1374_WDT*/
> >  /*
> > @@ -653,15 +514,25 @@ static int ds1374_probe(struct i2c_client
> > *client,
> >
> >  #ifdef CONFIG_RTC_DRV_DS1374_WDT
> >  	save_client = client;
> > -	ret = misc_register(&ds1374_miscdev);
> > -	if (ret)
> > -		return ret;
> > -	ret = register_reboot_notifier(&ds1374_wdt_notifier);
> > +	ds1374->wdt.info = &ds1374_wdt_info;
> > +	ds1374->wdt.ops = &ds1374_wdt_ops;
> > +	ds1374->wdt.timeout = TIMER_MARGIN_DEFAULT;
> > +	ds1374->wdt.min_timeout = TIMER_MARGIN_MIN;
> > +	ds1374->wdt.max_timeout = TIMER_MARGIN_MAX;
> > +
> > +	watchdog_init_timeout(&ds1374->wdt, wdt_margin, &client->dev);
> > +	watchdog_set_nowayout(&ds1374->wdt, nowayout);
> > +	watchdog_stop_on_reboot(&ds1374->wdt);
> > +	watchdog_stop_on_unregister(&ds1374->wdt);
> > +	ds1374_wdt_settimeout(&ds1374->wdt, wdt_margin);
> > +
> > +	ret = devm_watchdog_register_device(&client->dev, &ds1374->wdt);
> >  	if (ret) {
> > -		misc_deregister(&ds1374_miscdev);
> > +		dev_err(&client->dev, "failed to register DS1374 watchdog
> > +device\n");
> >  		return ret;
> >  	}
> > -	ds1374_wdt_settimeout(131072);
> > +
> > +	dev_info(&client->dev, "DS1374 watchdog device enabled\n");
> 
> Is that necessary ?
> 

I think it's good to show watchdog initial timeout. I'll include above suggestions in v3, thanks!

Best regards,
Johnson
> >  #endif
> >
> >  	return 0;
> > @@ -670,11 +541,6 @@ static int ds1374_probe(struct i2c_client
> > *client,  static int ds1374_remove(struct i2c_client *client)  {
> >  	struct ds1374 *ds1374 = i2c_get_clientdata(client); -#ifdef
> > CONFIG_RTC_DRV_DS1374_WDT
> > -	misc_deregister(&ds1374_miscdev);
> > -	ds1374_miscdev.parent = NULL;
> > -	unregister_reboot_notifier(&ds1374_wdt_notifier);
> > -#endif
> >
> >  	if (client->irq > 0) {
> >  		mutex_lock(&ds1374->mutex);
> > --
> > 2.20.1

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

* Re: [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part
  2020-07-06  5:18   ` Johnson CH Chen (陳昭勳)
@ 2020-07-06  6:34     ` Alexandre Belloni
  2020-07-06  6:58       ` Johnson CH Chen (陳昭勳)
  0 siblings, 1 reply; 6+ messages in thread
From: Alexandre Belloni @ 2020-07-06  6:34 UTC (permalink / raw)
  To: Johnson CH Chen (陳昭勳)
  Cc: Guenter Roeck, linux-kernel, linux-rtc, linux-watchdog,
	Wim Van Sebroeck, Alessandro Zummo

On 06/07/2020 05:18:39+0000, Johnson CH Chen (陳昭勳) wrote:
> > >  #endif /*CONFIG_RTC_DRV_DS1374_WDT*/
> > >  /*
> > > @@ -653,15 +514,25 @@ static int ds1374_probe(struct i2c_client
> > > *client,
> > >
> > >  #ifdef CONFIG_RTC_DRV_DS1374_WDT
> > >  	save_client = client;
> > > -	ret = misc_register(&ds1374_miscdev);
> > > -	if (ret)
> > > -		return ret;
> > > -	ret = register_reboot_notifier(&ds1374_wdt_notifier);
> > > +	ds1374->wdt.info = &ds1374_wdt_info;
> > > +	ds1374->wdt.ops = &ds1374_wdt_ops;
> > > +	ds1374->wdt.timeout = TIMER_MARGIN_DEFAULT;
> > > +	ds1374->wdt.min_timeout = TIMER_MARGIN_MIN;
> > > +	ds1374->wdt.max_timeout = TIMER_MARGIN_MAX;
> > > +
> > > +	watchdog_init_timeout(&ds1374->wdt, wdt_margin, &client->dev);
> > > +	watchdog_set_nowayout(&ds1374->wdt, nowayout);
> > > +	watchdog_stop_on_reboot(&ds1374->wdt);
> > > +	watchdog_stop_on_unregister(&ds1374->wdt);
> > > +	ds1374_wdt_settimeout(&ds1374->wdt, wdt_margin);
> > > +
> > > +	ret = devm_watchdog_register_device(&client->dev, &ds1374->wdt);
> > >  	if (ret) {
> > > -		misc_deregister(&ds1374_miscdev);
> > > +		dev_err(&client->dev, "failed to register DS1374 watchdog
> > > +device\n");

There was no error message before, I don't think this one is necessary.

> > >  		return ret;
> > >  	}
> > > -	ds1374_wdt_settimeout(131072);
> > > +
> > > +	dev_info(&client->dev, "DS1374 watchdog device enabled\n");
> > 
> > Is that necessary ?
> > 
> 
> I think it's good to show watchdog initial timeout. I'll include above suggestions in v3, thanks!
> 

No, please avoid adding more strings in that driver.


-- 
Alexandre Belloni, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

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

* RE: [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part
  2020-07-06  6:34     ` Alexandre Belloni
@ 2020-07-06  6:58       ` Johnson CH Chen (陳昭勳)
  0 siblings, 0 replies; 6+ messages in thread
From: Johnson CH Chen (陳昭勳) @ 2020-07-06  6:58 UTC (permalink / raw)
  To: Alexandre Belloni
  Cc: Guenter Roeck, linux-kernel, linux-rtc, linux-watchdog,
	Wim Van Sebroeck, Alessandro Zummo

Hi,

> > > > +	ret = devm_watchdog_register_device(&client->dev, &ds1374->wdt);
> > > >  	if (ret) {
> > > > -		misc_deregister(&ds1374_miscdev);
> > > > +		dev_err(&client->dev, "failed to register DS1374 watchdog
> > > > +device\n");
> 
> There was no error message before, I don't think this one is necessary.
> 
> > > >  		return ret;
> > > >  	}
> > > > -	ds1374_wdt_settimeout(131072);
> > > > +
> > > > +	dev_info(&client->dev, "DS1374 watchdog device enabled\n");
> > >
> > > Is that necessary ?
> > >
> >
> > I think it's good to show watchdog initial timeout. I'll include above
> suggestions in v3, thanks!
> >
> 
> No, please avoid adding more strings in that driver.
> 

I get it, thanks for review!

Best regards,
Johnson
> 
> --
> Alexandre Belloni, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com

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

end of thread, other threads:[~2020-07-06  6:58 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-03 11:48 [PATCH v2] rtc: rtc-ds1374: wdt: Use watchdog core for watchdog part Johnson CH Chen (陳昭勳)
2020-07-04 18:41 ` kernel test robot
2020-07-05 15:24 ` Guenter Roeck
2020-07-06  5:18   ` Johnson CH Chen (陳昭勳)
2020-07-06  6:34     ` Alexandre Belloni
2020-07-06  6:58       ` Johnson CH Chen (陳昭勳)

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