Lines Matching +full:watchdog +full:- +full:timers

1 // SPDX-License-Identifier: GPL-2.0-or-later
15 #include <linux/watchdog.h>
17 #define DRV_NAME "pseries-wdt"
24 * Bits 48-55: "operation"
31 * Bits 56-63: "timeoutAction" (for "Start Watchdog" only)
65 * - For the "Query Watchdog Capabilities" operation, a 64-bit
80 MODULE_PARM_DESC(action, "Action taken when watchdog expires (default="
85 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
91 MODULE_PARM_DESC(timeout, "Initial watchdog timeout in seconds (default="
97 unsigned long num; /* Watchdog numbers are 1-based */
103 struct device *dev = wdd->parent; in pseries_wdt_start()
107 flags = pw->action | PSERIES_WDTF_OP_START; in pseries_wdt_start()
108 msecs = wdd->timeout * MSEC_PER_SEC; in pseries_wdt_start()
109 rc = plpar_hcall_norets(H_WATCHDOG, flags, pw->num, msecs); in pseries_wdt_start()
112 rc, pw->num); in pseries_wdt_start()
113 return -EIO; in pseries_wdt_start()
121 struct device *dev = wdd->parent; in pseries_wdt_stop()
124 rc = plpar_hcall_norets(H_WATCHDOG, PSERIES_WDTF_OP_STOP, pw->num); in pseries_wdt_stop()
127 rc, pw->num); in pseries_wdt_stop()
128 return -EIO; in pseries_wdt_stop()
155 return -ENODEV; in pseries_wdt_probe()
157 return -EIO; in pseries_wdt_probe()
160 pw = devm_kzalloc(&pdev->dev, sizeof(*pw), GFP_KERNEL); in pseries_wdt_probe()
162 return -ENOMEM; in pseries_wdt_probe()
166 * multiple timers we will need to devise a way to choose a in pseries_wdt_probe()
170 pw->num = 1; in pseries_wdt_probe()
171 if (PSERIES_WDTQ_MAX_NUMBER(cap) < pw->num) in pseries_wdt_probe()
172 return -ENODEV; in pseries_wdt_probe()
175 return -EINVAL; in pseries_wdt_probe()
176 pw->action = pseries_wdt_action[action]; in pseries_wdt_probe()
178 pw->wd.parent = &pdev->dev; in pseries_wdt_probe()
179 pw->wd.info = &pseries_wdt_info; in pseries_wdt_probe()
180 pw->wd.ops = &pseries_wdt_ops; in pseries_wdt_probe()
182 pw->wd.min_timeout = DIV_ROUND_UP(msecs, MSEC_PER_SEC); in pseries_wdt_probe()
183 pw->wd.max_timeout = UINT_MAX / 1000; /* from linux/watchdog.h */ in pseries_wdt_probe()
184 pw->wd.timeout = timeout; in pseries_wdt_probe()
185 if (watchdog_init_timeout(&pw->wd, 0, NULL)) in pseries_wdt_probe()
186 return -EINVAL; in pseries_wdt_probe()
187 watchdog_set_nowayout(&pw->wd, nowayout); in pseries_wdt_probe()
188 watchdog_stop_on_reboot(&pw->wd); in pseries_wdt_probe()
189 watchdog_stop_on_unregister(&pw->wd); in pseries_wdt_probe()
190 watchdog_set_drvdata(&pw->wd, pw); in pseries_wdt_probe()
192 err = devm_watchdog_register_device(&pdev->dev, &pw->wd); in pseries_wdt_probe()
196 platform_set_drvdata(pdev, &pw->wd); in pseries_wdt_probe()
220 { .name = "pseries-wdt" },
238 MODULE_DESCRIPTION("POWER Architecture Platform Watchdog Driver");