Lines Matching defs:wdat

64 static int wdat_wdt_read(struct wdat_wdt *wdat,
83 dev_dbg(&wdat->pdev->dev, "Read %#x from 0x%08llx\n", *value,
89 static int wdat_wdt_write(struct wdat_wdt *wdat,
108 dev_dbg(&wdat->pdev->dev, "Wrote %#x to 0x%08llx\n", value,
114 static int wdat_wdt_run_action(struct wdat_wdt *wdat, unsigned int action,
119 if (action >= ARRAY_SIZE(wdat->instructions))
122 if (!wdat->instructions[action])
125 dev_dbg(&wdat->pdev->dev, "Running action %#x\n", action);
128 list_for_each_entry(instr, wdat->instructions[action], node) {
144 ret = wdat_wdt_read(wdat, instr, &x);
154 ret = wdat_wdt_read(wdat, instr, &x);
167 ret = wdat_wdt_read(wdat, instr, &y);
173 ret = wdat_wdt_write(wdat, instr, x);
183 ret = wdat_wdt_read(wdat, instr, &y);
189 ret = wdat_wdt_write(wdat, instr, x);
195 dev_err(&wdat->pdev->dev, "Unknown instruction: %u\n",
204 static int wdat_wdt_enable_reboot(struct wdat_wdt *wdat)
214 ret = wdat_wdt_run_action(wdat, ACPI_WDAT_SET_REBOOT, 0, NULL);
216 dev_err(&wdat->pdev->dev,
224 static void wdat_wdt_boot_status(struct wdat_wdt *wdat)
229 ret = wdat_wdt_run_action(wdat, ACPI_WDAT_GET_STATUS, 0, &boot_status);
231 dev_err(&wdat->pdev->dev, "Failed to read boot status\n");
236 wdat->wdd.bootstatus = WDIOF_CARDRESET;
239 ret = wdat_wdt_run_action(wdat, ACPI_WDAT_SET_STATUS, 0, NULL);
241 dev_err(&wdat->pdev->dev, "Failed to clear boot status\n");
244 static void wdat_wdt_set_running(struct wdat_wdt *wdat)
249 ret = wdat_wdt_run_action(wdat, ACPI_WDAT_GET_RUNNING_STATE, 0,
252 dev_err(&wdat->pdev->dev, "Failed to read running state\n");
255 set_bit(WDOG_HW_RUNNING, &wdat->wdd.status);
278 struct wdat_wdt *wdat = to_wdat_wdt(wdd);
282 periods = timeout * 1000 / wdat->period;
283 ret = wdat_wdt_run_action(wdat, ACPI_WDAT_SET_COUNTDOWN, periods, NULL);
291 struct wdat_wdt *wdat = to_wdat_wdt(wdd);
294 wdat_wdt_run_action(wdat, ACPI_WDAT_GET_CURRENT_COUNTDOWN, 0, &periods);
295 return periods * wdat->period / 1000;
318 struct wdat_wdt *wdat;
329 wdat = devm_kzalloc(dev, sizeof(*wdat), GFP_KERNEL);
330 if (!wdat)
344 wdat->period = tbl->timer_period;
345 wdat->wdd.min_hw_heartbeat_ms = wdat->period * tbl->min_count;
346 wdat->wdd.max_hw_heartbeat_ms = wdat->period * tbl->max_count;
347 wdat->stopped_in_sleep = tbl->flags & ACPI_WDAT_STOPPED;
348 wdat->wdd.info = &wdat_wdt_info;
349 wdat->wdd.ops = &wdat_wdt_ops;
350 wdat->pdev = pdev;
424 instructions = wdat->instructions[action];
433 wdat->instructions[action] = instructions;
439 wdat_wdt_boot_status(wdat);
440 wdat_wdt_set_running(wdat);
442 ret = wdat_wdt_enable_reboot(wdat);
446 platform_set_drvdata(pdev, wdat);
453 if (timeout * 1000 < wdat->wdd.min_hw_heartbeat_ms ||
454 timeout * 1000 > wdat->wdd.max_hw_heartbeat_ms) {
460 ret = wdat_wdt_set_timeout(&wdat->wdd, timeout);
464 watchdog_set_nowayout(&wdat->wdd, nowayout);
465 watchdog_stop_on_reboot(&wdat->wdd);
466 return devm_watchdog_register_device(dev, &wdat->wdd);
472 struct wdat_wdt *wdat = dev_get_drvdata(dev);
475 if (!watchdog_active(&wdat->wdd))
484 wdat->stopped = false;
486 !wdat->stopped_in_sleep) {
487 ret = wdat_wdt_stop(&wdat->wdd);
489 wdat->stopped = true;
491 ret = wdat_wdt_ping(&wdat->wdd);
499 struct wdat_wdt *wdat = dev_get_drvdata(dev);
502 if (!watchdog_active(&wdat->wdd))
505 if (!wdat->stopped) {
511 ret = wdat_wdt_stop(&wdat->wdd);
515 ret = wdat_wdt_set_timeout(&wdat->wdd, wdat->wdd.timeout);
519 ret = wdat_wdt_enable_reboot(wdat);
523 ret = wdat_wdt_ping(&wdat->wdd);
528 return wdat_wdt_start(&wdat->wdd);