1*573a3811SMasahiro Yamada /*
2*573a3811SMasahiro Yamada  * Copyright (C) 2017 Masahiro Yamada <yamada.masahiro@socionext.com>
3*573a3811SMasahiro Yamada  *
4*573a3811SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
5*573a3811SMasahiro Yamada  */
6*573a3811SMasahiro Yamada 
7*573a3811SMasahiro Yamada #include <dm/device.h>
8*573a3811SMasahiro Yamada #include <sysreset.h>
9*573a3811SMasahiro Yamada #include <linux/errno.h>
10*573a3811SMasahiro Yamada #include <linux/psci.h>
11*573a3811SMasahiro Yamada 
12*573a3811SMasahiro Yamada static int psci_sysreset_request(struct udevice *dev, enum sysreset_t type)
13*573a3811SMasahiro Yamada {
14*573a3811SMasahiro Yamada 	unsigned long function_id;
15*573a3811SMasahiro Yamada 
16*573a3811SMasahiro Yamada 	switch (type) {
17*573a3811SMasahiro Yamada 	case SYSRESET_WARM:
18*573a3811SMasahiro Yamada 	case SYSRESET_COLD:
19*573a3811SMasahiro Yamada 		function_id = PSCI_0_2_FN_SYSTEM_RESET;
20*573a3811SMasahiro Yamada 		break;
21*573a3811SMasahiro Yamada 	case SYSRESET_POWER:
22*573a3811SMasahiro Yamada 		function_id = PSCI_0_2_FN_SYSTEM_OFF;
23*573a3811SMasahiro Yamada 		break;
24*573a3811SMasahiro Yamada 	default:
25*573a3811SMasahiro Yamada 		return -ENOSYS;
26*573a3811SMasahiro Yamada 	}
27*573a3811SMasahiro Yamada 
28*573a3811SMasahiro Yamada 	invoke_psci_fn(function_id, 0, 0, 0);
29*573a3811SMasahiro Yamada 
30*573a3811SMasahiro Yamada 	return -EINPROGRESS;
31*573a3811SMasahiro Yamada }
32*573a3811SMasahiro Yamada 
33*573a3811SMasahiro Yamada static struct sysreset_ops psci_sysreset_ops = {
34*573a3811SMasahiro Yamada 	.request = psci_sysreset_request,
35*573a3811SMasahiro Yamada };
36*573a3811SMasahiro Yamada 
37*573a3811SMasahiro Yamada U_BOOT_DRIVER(psci_sysreset) = {
38*573a3811SMasahiro Yamada 	.name = "psci-sysreset",
39*573a3811SMasahiro Yamada 	.id = UCLASS_SYSRESET,
40*573a3811SMasahiro Yamada 	.ops = &psci_sysreset_ops,
41*573a3811SMasahiro Yamada };
42