Lines Matching refs:wdt

161  * @wdt: mei watchdog device
166 static int mei_wdt_ping(struct mei_wdt *wdt)
177 req.timeout = wdt->timeout;
179 ret = mei_cldev_send(wdt->cldev, (u8 *)&req, req_len);
189 * @wdt: mei watchdog device
194 static int mei_wdt_stop(struct mei_wdt *wdt)
206 ret = mei_cldev_send(wdt->cldev, (u8 *)&req, req_len);
222 struct mei_wdt *wdt = watchdog_get_drvdata(wdd);
224 wdt->state = MEI_WDT_START;
225 wdd->timeout = wdt->timeout;
238 struct mei_wdt *wdt = watchdog_get_drvdata(wdd);
241 if (wdt->state != MEI_WDT_RUNNING)
244 wdt->state = MEI_WDT_STOPPING;
246 ret = mei_wdt_stop(wdt);
250 wdt->state = MEI_WDT_IDLE;
264 struct mei_wdt *wdt = watchdog_get_drvdata(wdd);
267 if (wdt->state != MEI_WDT_START && wdt->state != MEI_WDT_RUNNING)
270 if (wdt->resp_required)
271 init_completion(&wdt->response);
273 wdt->state = MEI_WDT_RUNNING;
274 ret = mei_wdt_ping(wdt);
278 if (wdt->resp_required)
279 ret = wait_for_completion_killable(&wdt->response);
296 struct mei_wdt *wdt = watchdog_get_drvdata(wdd);
299 wdt->timeout = timeout;
322 * __mei_wdt_is_registered - check if wdt is registered
324 * @wdt: mei watchdog device
326 * Return: true if the wdt is registered with the watchdog subsystem
327 * Locking: should be called under wdt->reg_lock
329 static inline bool __mei_wdt_is_registered(struct mei_wdt *wdt)
331 return !!watchdog_get_drvdata(&wdt->wdd);
337 * @wdt: mei watchdog device
339 static void mei_wdt_unregister(struct mei_wdt *wdt)
341 mutex_lock(&wdt->reg_lock);
343 if (__mei_wdt_is_registered(wdt)) {
344 watchdog_unregister_device(&wdt->wdd);
345 watchdog_set_drvdata(&wdt->wdd, NULL);
346 memset(&wdt->wdd, 0, sizeof(wdt->wdd));
349 mutex_unlock(&wdt->reg_lock);
355 * @wdt: mei watchdog device
359 static int mei_wdt_register(struct mei_wdt *wdt)
364 if (!wdt || !wdt->cldev)
367 dev = &wdt->cldev->dev;
369 mutex_lock(&wdt->reg_lock);
371 if (__mei_wdt_is_registered(wdt)) {
376 wdt->wdd.info = &wd_info;
377 wdt->wdd.ops = &wd_ops;
378 wdt->wdd.parent = dev;
379 wdt->wdd.timeout = MEI_WDT_DEFAULT_TIMEOUT;
380 wdt->wdd.min_timeout = MEI_WDT_MIN_TIMEOUT;
381 wdt->wdd.max_timeout = MEI_WDT_MAX_TIMEOUT;
383 watchdog_set_drvdata(&wdt->wdd, wdt);
384 watchdog_stop_on_reboot(&wdt->wdd);
385 watchdog_stop_on_unregister(&wdt->wdd);
387 ret = watchdog_register_device(&wdt->wdd);
389 watchdog_set_drvdata(&wdt->wdd, NULL);
391 wdt->state = MEI_WDT_IDLE;
394 mutex_unlock(&wdt->reg_lock);
400 struct mei_wdt *wdt = container_of(work, struct mei_wdt, unregister);
402 mei_wdt_unregister(wdt);
412 struct mei_wdt *wdt = mei_cldev_get_drvdata(cldev);
417 ret = mei_cldev_recv(wdt->cldev, (u8 *)&res, res_len);
441 mei_wdt_state_str(wdt->state),
442 wdt->state);
450 if (wdt->state == MEI_WDT_RUNNING) {
452 wdt->state = MEI_WDT_NOT_REQUIRED;
453 schedule_work(&wdt->unregister);
458 if (wdt->state == MEI_WDT_PROBE) {
460 wdt->state = MEI_WDT_NOT_REQUIRED;
463 mei_wdt_stop(wdt);
464 mei_wdt_register(wdt);
470 mei_wdt_state_str(wdt->state), wdt->state);
473 if (!completion_done(&wdt->response))
474 complete(&wdt->response);
484 struct mei_wdt *wdt = mei_cldev_get_drvdata(cldev);
486 if (wdt->state != MEI_WDT_NOT_REQUIRED)
489 mei_wdt_register(wdt);
497 struct mei_wdt *wdt = file->private_data;
502 mutex_lock(&wdt->reg_lock);
504 __mei_wdt_is_registered(wdt) ? "activated" : "deactivated");
505 mutex_unlock(&wdt->reg_lock);
519 struct mei_wdt *wdt = file->private_data;
524 mei_wdt_state_str(wdt->state));
535 static void dbgfs_unregister(struct mei_wdt *wdt)
537 debugfs_remove_recursive(wdt->dbgfs_dir);
538 wdt->dbgfs_dir = NULL;
541 static void dbgfs_register(struct mei_wdt *wdt)
546 wdt->dbgfs_dir = dir;
548 debugfs_create_file("state", S_IRUSR, dir, wdt, &dbgfs_fops_state);
550 debugfs_create_file("activation", S_IRUSR, dir, wdt,
556 static inline void dbgfs_unregister(struct mei_wdt *wdt) {}
557 static inline void dbgfs_register(struct mei_wdt *wdt) {}
563 struct mei_wdt *wdt;
566 wdt = kzalloc(sizeof(struct mei_wdt), GFP_KERNEL);
567 if (!wdt)
570 wdt->timeout = MEI_WDT_DEFAULT_TIMEOUT;
571 wdt->state = MEI_WDT_PROBE;
572 wdt->cldev = cldev;
573 wdt->resp_required = mei_cldev_ver(cldev) > 0x1;
574 mutex_init(&wdt->reg_lock);
575 init_completion(&wdt->response);
576 INIT_WORK(&wdt->unregister, mei_wdt_unregister_work);
578 mei_cldev_set_drvdata(cldev, wdt);
586 ret = mei_cldev_register_rx_cb(wdt->cldev, mei_wdt_rx);
592 ret = mei_cldev_register_notif_cb(wdt->cldev, mei_wdt_notif);
602 if (wdt->resp_required)
603 ret = mei_wdt_ping(wdt);
605 ret = mei_wdt_register(wdt);
610 dbgfs_register(wdt);
618 kfree(wdt);
625 struct mei_wdt *wdt = mei_cldev_get_drvdata(cldev);
628 if (!completion_done(&wdt->response))
629 complete(&wdt->response);
631 cancel_work_sync(&wdt->unregister);
633 mei_wdt_unregister(wdt);
637 dbgfs_unregister(wdt);
639 kfree(wdt);