1 /* 2 * (C) Copyright 2016 Google, Inc 3 * 4 * SPDX-License-Identifier: GPL-2.0 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <errno.h> 10 #include <sysreset.h> 11 #include <wdt.h> 12 #include <asm/io.h> 13 #include <asm/arch/wdt.h> 14 #include <linux/err.h> 15 16 static int ast_sysreset_request(struct udevice *dev, enum sysreset_t type) 17 { 18 struct udevice *wdt; 19 u32 reset_mode; 20 int ret = uclass_first_device(UCLASS_WDT, &wdt); 21 22 if (ret) 23 return ret; 24 25 switch (type) { 26 case SYSRESET_WARM: 27 reset_mode = WDT_CTRL_RESET_CPU; 28 break; 29 case SYSRESET_COLD: 30 reset_mode = WDT_CTRL_RESET_CHIP; 31 break; 32 default: 33 return -EPROTONOSUPPORT; 34 } 35 36 ret = wdt_expire_now(wdt, reset_mode); 37 if (ret) { 38 debug("Sysreset failed: %d", ret); 39 return ret; 40 } 41 42 return -EINPROGRESS; 43 } 44 45 static struct sysreset_ops ast_sysreset = { 46 .request = ast_sysreset_request, 47 }; 48 49 U_BOOT_DRIVER(sysreset_ast) = { 50 .name = "ast_sysreset", 51 .id = UCLASS_SYSRESET, 52 .ops = &ast_sysreset, 53 }; 54