blob: 92fad96871bde6cbe106cf5998053b881e289a59 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0
maxims@google.comf57bd002017-01-18 13:44:55 -08002/*
3 * (C) Copyright 2016 Google, Inc
maxims@google.comf57bd002017-01-18 13:44:55 -08004 */
5
6#include <common.h>
7#include <dm.h>
8#include <errno.h>
Simon Glass0f2af882020-05-10 11:40:05 -06009#include <log.h>
maxims@google.comf57bd002017-01-18 13:44:55 -080010#include <sysreset.h>
maxims@google.com0fdb11a2017-04-17 12:00:26 -070011#include <wdt.h>
maxims@google.comf57bd002017-01-18 13:44:55 -080012#include <asm/io.h>
13#include <asm/arch/wdt.h>
14#include <linux/err.h>
Chia-Wei, Wang8f7f4902020-12-14 13:54:28 +080015#include <hang.h>
maxims@google.comf57bd002017-01-18 13:44:55 -080016
maxims@google.comf57bd002017-01-18 13:44:55 -080017static int ast_sysreset_request(struct udevice *dev, enum sysreset_t type)
18{
maxims@google.com0fdb11a2017-04-17 12:00:26 -070019 struct udevice *wdt;
20 u32 reset_mode;
Michal Suchanekac12a2f2022-10-12 21:57:59 +020021 int ret = uclass_first_device_err(UCLASS_WDT, &wdt);
maxims@google.comf57bd002017-01-18 13:44:55 -080022
maxims@google.com0fdb11a2017-04-17 12:00:26 -070023 if (ret)
24 return ret;
maxims@google.comf57bd002017-01-18 13:44:55 -080025
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
Chia-Wei, Wang8f7f4902020-12-14 13:54:28 +080037#if !defined(CONFIG_SPL_BUILD)
maxims@google.com0fdb11a2017-04-17 12:00:26 -070038 ret = wdt_expire_now(wdt, reset_mode);
39 if (ret) {
40 debug("Sysreset failed: %d", ret);
41 return ret;
42 }
Chia-Wei, Wang8f7f4902020-12-14 13:54:28 +080043#else
44 hang();
45#endif
maxims@google.comf57bd002017-01-18 13:44:55 -080046
47 return -EINPROGRESS;
48}
49
50static struct sysreset_ops ast_sysreset = {
51 .request = ast_sysreset_request,
52};
53
54U_BOOT_DRIVER(sysreset_ast) = {
55 .name = "ast_sysreset",
56 .id = UCLASS_SYSRESET,
57 .ops = &ast_sysreset,
58};