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