--- zzzz-none-000/linux-4.9.276/drivers/watchdog/watchdog_dev.c 2021-07-20 14:21:16.000000000 +0000 +++ falcon-5530-750/linux-4.9.276/drivers/watchdog/watchdog_dev.c 2023-04-05 08:19:02.000000000 +0000 @@ -166,6 +166,14 @@ return err; } +#if IS_ENABLED(CONFIG_AVM_WATCHDOG_SHIM_SUPPORT) +# define WATCHDOG_SHIM_API +# define EXPORT_WATCHDOG_SHIM_SYMBOL(symbol) EXPORT_SYMBOL(symbol) +#else +# define WATCHDOG_SHIM_API static +# define EXPORT_WATCHDOG_SHIM_SYMBOL(symbol) +#endif + /* * watchdog_ping: ping the watchdog. * @wdd: the watchdog device to ping @@ -217,7 +225,8 @@ * failure. */ -static int watchdog_start(struct watchdog_device *wdd) +WATCHDOG_SHIM_API +int watchdog_start(struct watchdog_device *wdd) { struct watchdog_core_data *wd_data = wdd->wd_data; unsigned long started_at; @@ -242,6 +251,7 @@ return err; } +EXPORT_WATCHDOG_SHIM_SYMBOL(watchdog_start); /* * watchdog_stop: wrapper to stop the watchdog. @@ -255,7 +265,8 @@ * If the 'nowayout' feature was set, the watchdog cannot be stopped. */ -static int watchdog_stop(struct watchdog_device *wdd) +WATCHDOG_SHIM_API +int watchdog_stop(struct watchdog_device *wdd) { int err = 0; @@ -282,6 +293,7 @@ return err; } +EXPORT_WATCHDOG_SHIM_SYMBOL(watchdog_stop); /* * watchdog_get_status: wrapper to get the watchdog status @@ -336,6 +348,9 @@ if (watchdog_timeout_invalid(wdd, timeout)) return -EINVAL; + WARN(wdd->ops->avm_hw_ping, + "watchdog: Setting timeout to %u seconds\n", timeout); + if (wdd->ops->set_timeout) { err = wdd->ops->set_timeout(wdd, timeout); } else { @@ -888,8 +903,15 @@ .fops = &watchdog_fops, }; +#if IS_ENABLED(CONFIG_AVM_WATCHDOG) +# define WATCHDOG_NAME "linux_watchdog" +#else +# define WATCHDOG_NAME "watchdog" +#endif + static struct class watchdog_class = { .name = "watchdog", + .name = WATCHDOG_NAME, .owner = THIS_MODULE, .dev_groups = wdt_groups, }; @@ -921,6 +943,12 @@ INIT_DELAYED_WORK(&wd_data->work, watchdog_ping_work); + if (IS_ENABLED(CONFIG_AVM_WATCHDOG)) { + pr_info("AVM driver enabled, not creating device file #%d for %s\n", + wdd->id, wdd->info->identity); + goto skip_cdev; + } + if (wdd->id == 0) { old_wd_data = wd_data; watchdog_miscdev.parent = wdd->parent; @@ -964,6 +992,7 @@ wd_data->cdev.owner = wdd->ops->owner; +skip_cdev: /* Record time of most recent heartbeat as 'just before now'. */ wd_data->last_hw_keepalive = jiffies - 1; @@ -992,12 +1021,16 @@ { struct watchdog_core_data *wd_data = wdd->wd_data; + if (IS_ENABLED(CONFIG_AVM_WATCHDOG)) + goto skip_cdev; + cdev_device_del(&wd_data->cdev, &wd_data->dev); if (wdd->id == 0) { misc_deregister(&watchdog_miscdev); old_wd_data = NULL; } +skip_cdev: mutex_lock(&wd_data->lock); wd_data->wdd = NULL; wdd->wd_data = NULL; @@ -1064,6 +1097,9 @@ return -ENOMEM; } + if (IS_ENABLED(CONFIG_AVM_WATCHDOG)) + return 0; + err = class_register(&watchdog_class); if (err < 0) { pr_err("couldn't register class\n"); @@ -1093,7 +1129,9 @@ void __exit watchdog_dev_exit(void) { - unregister_chrdev_region(watchdog_devt, MAX_DOGS); - class_unregister(&watchdog_class); + if (!IS_ENABLED(CONFIG_AVM_WATCHDOG)) { + unregister_chrdev_region(watchdog_devt, MAX_DOGS); + class_unregister(&watchdog_class); + } destroy_workqueue(watchdog_wq); }