xref: /rk3399_rockchip-uboot/drivers/sysreset/sysreset_psci.c (revision 83cfcb32f9771681fb123214d36eb7b79a825c82)
1573a3811SMasahiro Yamada /*
2573a3811SMasahiro Yamada  * Copyright (C) 2017 Masahiro Yamada <yamada.masahiro@socionext.com>
3573a3811SMasahiro Yamada  *
4573a3811SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
5573a3811SMasahiro Yamada  */
6573a3811SMasahiro Yamada 
74af0d7e8SSimon Glass #include <common.h>
89d922450SSimon Glass #include <dm.h>
9573a3811SMasahiro Yamada #include <sysreset.h>
10573a3811SMasahiro Yamada #include <linux/errno.h>
11573a3811SMasahiro Yamada #include <linux/psci.h>
12573a3811SMasahiro Yamada 
psci_sysreset_request(struct udevice * dev,enum sysreset_t type)13573a3811SMasahiro Yamada static int psci_sysreset_request(struct udevice *dev, enum sysreset_t type)
14573a3811SMasahiro Yamada {
15573a3811SMasahiro Yamada 	unsigned long function_id;
16573a3811SMasahiro Yamada 
17573a3811SMasahiro Yamada 	switch (type) {
18573a3811SMasahiro Yamada 	case SYSRESET_WARM:
19573a3811SMasahiro Yamada 	case SYSRESET_COLD:
20573a3811SMasahiro Yamada 		function_id = PSCI_0_2_FN_SYSTEM_RESET;
21573a3811SMasahiro Yamada 		break;
22573a3811SMasahiro Yamada 	case SYSRESET_POWER:
23573a3811SMasahiro Yamada 		function_id = PSCI_0_2_FN_SYSTEM_OFF;
24573a3811SMasahiro Yamada 		break;
25573a3811SMasahiro Yamada 	default:
26573a3811SMasahiro Yamada 		return -ENOSYS;
27573a3811SMasahiro Yamada 	}
28573a3811SMasahiro Yamada 
29573a3811SMasahiro Yamada 	invoke_psci_fn(function_id, 0, 0, 0);
30573a3811SMasahiro Yamada 
31573a3811SMasahiro Yamada 	return -EINPROGRESS;
32573a3811SMasahiro Yamada }
33573a3811SMasahiro Yamada 
34573a3811SMasahiro Yamada static struct sysreset_ops psci_sysreset_ops = {
35573a3811SMasahiro Yamada 	.request = psci_sysreset_request,
36573a3811SMasahiro Yamada };
37573a3811SMasahiro Yamada 
38*83cfcb32SJoseph Chen /* Add an 'a_' prefix so it comes the first sysreset path. */
39*83cfcb32SJoseph Chen U_BOOT_DRIVER(a_psci_sysreset) = {
40573a3811SMasahiro Yamada 	.name = "psci-sysreset",
41573a3811SMasahiro Yamada 	.id = UCLASS_SYSRESET,
42573a3811SMasahiro Yamada 	.ops = &psci_sysreset_ops,
43573a3811SMasahiro Yamada };
44