1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0
24697abeaSmaxims@google.com /*
34697abeaSmaxims@google.com  * (C) Copyright 2016 Google, Inc
44697abeaSmaxims@google.com  */
54697abeaSmaxims@google.com 
64697abeaSmaxims@google.com #include <common.h>
74697abeaSmaxims@google.com #include <dm.h>
84697abeaSmaxims@google.com #include <errno.h>
94697abeaSmaxims@google.com #include <sysreset.h>
1099f8ad73Smaxims@google.com #include <wdt.h>
114697abeaSmaxims@google.com #include <asm/io.h>
124697abeaSmaxims@google.com #include <asm/arch/wdt.h>
134697abeaSmaxims@google.com #include <linux/err.h>
144697abeaSmaxims@google.com 
154697abeaSmaxims@google.com static int ast_sysreset_request(struct udevice *dev, enum sysreset_t type)
164697abeaSmaxims@google.com {
1799f8ad73Smaxims@google.com 	struct udevice *wdt;
1899f8ad73Smaxims@google.com 	u32 reset_mode;
1999f8ad73Smaxims@google.com 	int ret = uclass_first_device(UCLASS_WDT, &wdt);
204697abeaSmaxims@google.com 
2199f8ad73Smaxims@google.com 	if (ret)
2299f8ad73Smaxims@google.com 		return ret;
234697abeaSmaxims@google.com 
244697abeaSmaxims@google.com 	switch (type) {
254697abeaSmaxims@google.com 	case SYSRESET_WARM:
264697abeaSmaxims@google.com 		reset_mode = WDT_CTRL_RESET_CPU;
274697abeaSmaxims@google.com 		break;
284697abeaSmaxims@google.com 	case SYSRESET_COLD:
294697abeaSmaxims@google.com 		reset_mode = WDT_CTRL_RESET_CHIP;
304697abeaSmaxims@google.com 		break;
314697abeaSmaxims@google.com 	default:
324697abeaSmaxims@google.com 		return -EPROTONOSUPPORT;
334697abeaSmaxims@google.com 	}
344697abeaSmaxims@google.com 
3599f8ad73Smaxims@google.com 	ret = wdt_expire_now(wdt, reset_mode);
3699f8ad73Smaxims@google.com 	if (ret) {
3799f8ad73Smaxims@google.com 		debug("Sysreset failed: %d", ret);
3899f8ad73Smaxims@google.com 		return ret;
3999f8ad73Smaxims@google.com 	}
404697abeaSmaxims@google.com 
414697abeaSmaxims@google.com 	return -EINPROGRESS;
424697abeaSmaxims@google.com }
434697abeaSmaxims@google.com 
444697abeaSmaxims@google.com static struct sysreset_ops ast_sysreset = {
454697abeaSmaxims@google.com 	.request	= ast_sysreset_request,
464697abeaSmaxims@google.com };
474697abeaSmaxims@google.com 
484697abeaSmaxims@google.com U_BOOT_DRIVER(sysreset_ast) = {
494697abeaSmaxims@google.com 	.name	= "ast_sysreset",
504697abeaSmaxims@google.com 	.id	= UCLASS_SYSRESET,
514697abeaSmaxims@google.com 	.ops	= &ast_sysreset,
524697abeaSmaxims@google.com };
53