1*17a0c141SÁlvaro Fernández Rojas /* 2*17a0c141SÁlvaro Fernández Rojas * Copyright (C) 2017 Álvaro Fernández Rojas <noltari@gmail.com> 3*17a0c141SÁlvaro Fernández Rojas * 4*17a0c141SÁlvaro Fernández Rojas * SPDX-License-Identifier: GPL-2.0+ 5*17a0c141SÁlvaro Fernández Rojas */ 6*17a0c141SÁlvaro Fernández Rojas 7*17a0c141SÁlvaro Fernández Rojas #include <common.h> 8*17a0c141SÁlvaro Fernández Rojas #include <dm.h> 9*17a0c141SÁlvaro Fernández Rojas #include <errno.h> 10*17a0c141SÁlvaro Fernández Rojas #include <sysreset.h> 11*17a0c141SÁlvaro Fernández Rojas #include <wdt.h> 12*17a0c141SÁlvaro Fernández Rojas 13*17a0c141SÁlvaro Fernández Rojas struct wdt_reboot_priv { 14*17a0c141SÁlvaro Fernández Rojas struct udevice *wdt; 15*17a0c141SÁlvaro Fernández Rojas }; 16*17a0c141SÁlvaro Fernández Rojas 17*17a0c141SÁlvaro Fernández Rojas static int wdt_reboot_request(struct udevice *dev, enum sysreset_t type) 18*17a0c141SÁlvaro Fernández Rojas { 19*17a0c141SÁlvaro Fernández Rojas struct wdt_reboot_priv *priv = dev_get_priv(dev); 20*17a0c141SÁlvaro Fernández Rojas int ret; 21*17a0c141SÁlvaro Fernández Rojas 22*17a0c141SÁlvaro Fernández Rojas ret = wdt_expire_now(priv->wdt, 0); 23*17a0c141SÁlvaro Fernández Rojas if (ret) 24*17a0c141SÁlvaro Fernández Rojas return ret; 25*17a0c141SÁlvaro Fernández Rojas 26*17a0c141SÁlvaro Fernández Rojas return -EINPROGRESS; 27*17a0c141SÁlvaro Fernández Rojas } 28*17a0c141SÁlvaro Fernández Rojas 29*17a0c141SÁlvaro Fernández Rojas static struct sysreset_ops wdt_reboot_ops = { 30*17a0c141SÁlvaro Fernández Rojas .request = wdt_reboot_request, 31*17a0c141SÁlvaro Fernández Rojas }; 32*17a0c141SÁlvaro Fernández Rojas 33*17a0c141SÁlvaro Fernández Rojas int wdt_reboot_probe(struct udevice *dev) 34*17a0c141SÁlvaro Fernández Rojas { 35*17a0c141SÁlvaro Fernández Rojas struct wdt_reboot_priv *priv = dev_get_priv(dev); 36*17a0c141SÁlvaro Fernández Rojas int err; 37*17a0c141SÁlvaro Fernández Rojas 38*17a0c141SÁlvaro Fernández Rojas err = uclass_get_device_by_phandle(UCLASS_WDT, dev, 39*17a0c141SÁlvaro Fernández Rojas "wdt", &priv->wdt); 40*17a0c141SÁlvaro Fernández Rojas if (err) { 41*17a0c141SÁlvaro Fernández Rojas error("unable to find wdt device\n"); 42*17a0c141SÁlvaro Fernández Rojas return err; 43*17a0c141SÁlvaro Fernández Rojas } 44*17a0c141SÁlvaro Fernández Rojas 45*17a0c141SÁlvaro Fernández Rojas return 0; 46*17a0c141SÁlvaro Fernández Rojas } 47*17a0c141SÁlvaro Fernández Rojas 48*17a0c141SÁlvaro Fernández Rojas static const struct udevice_id wdt_reboot_ids[] = { 49*17a0c141SÁlvaro Fernández Rojas { .compatible = "wdt-reboot" }, 50*17a0c141SÁlvaro Fernández Rojas { /* sentinel */ } 51*17a0c141SÁlvaro Fernández Rojas }; 52*17a0c141SÁlvaro Fernández Rojas 53*17a0c141SÁlvaro Fernández Rojas U_BOOT_DRIVER(wdt_reboot) = { 54*17a0c141SÁlvaro Fernández Rojas .name = "wdt_reboot", 55*17a0c141SÁlvaro Fernández Rojas .id = UCLASS_SYSRESET, 56*17a0c141SÁlvaro Fernández Rojas .of_match = wdt_reboot_ids, 57*17a0c141SÁlvaro Fernández Rojas .ops = &wdt_reboot_ops, 58*17a0c141SÁlvaro Fernández Rojas .priv_auto_alloc_size = sizeof(struct wdt_reboot_priv), 59*17a0c141SÁlvaro Fernández Rojas .probe = wdt_reboot_probe, 60*17a0c141SÁlvaro Fernández Rojas }; 61