--- zzzz-none-000/linux-5.15.111/drivers/watchdog/watchdog_dev.c 2023-05-11 14:00:40.000000000 +0000 +++ puma7-atom-6670-761/linux-5.15.111/drivers/watchdog/watchdog_dev.c 2024-02-07 10:23:22.000000000 +0000 @@ -170,6 +170,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 @@ -241,7 +249,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; ktime_t started_at; @@ -272,6 +281,7 @@ return err; } +EXPORT_WATCHDOG_SHIM_SYMBOL(watchdog_start); /* * watchdog_stop: wrapper to stop the watchdog. @@ -285,7 +295,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; @@ -313,6 +324,7 @@ return err; } +EXPORT_WATCHDOG_SHIM_SYMBOL(watchdog_stop); /* * watchdog_get_status: wrapper to get the watchdog status @@ -370,6 +382,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 { @@ -970,8 +985,14 @@ .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, }; @@ -1017,6 +1038,12 @@ wd_data->timer.function = watchdog_timer_expired; watchdog_hrtimer_pretimeout_init(wdd); + if (wdd->id == 0 && IS_ENABLED(CONFIG_AVM_WATCHDOG)) { + pr_info("AVM driver enabled, not creating device file for %s\n", + wdd->info->identity); + goto skip_cdev; + } + if (wdd->id == 0) { old_wd_data = wd_data; watchdog_miscdev.parent = wdd->parent; @@ -1051,6 +1078,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 = ktime_sub(ktime_get(), 1); watchdog_set_open_deadline(wd_data); @@ -1085,12 +1113,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: if (watchdog_active(wdd) && test_bit(WDOG_STOP_ON_UNREGISTER, &wdd->status)) { watchdog_stop(wdd); @@ -1197,6 +1229,9 @@ } sched_set_fifo(watchdog_kworker->task); + if (IS_ENABLED(CONFIG_AVM_WATCHDOG)) + return 0; + err = class_register(&watchdog_class); if (err < 0) { pr_err("couldn't register class\n"); @@ -1226,8 +1261,10 @@ 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); + } kthread_destroy_worker(watchdog_kworker); }