1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2573a3811SMasahiro Yamada /*
3573a3811SMasahiro Yamada  * Copyright (C) 2017 Masahiro Yamada <yamada.masahiro@socionext.com>
4573a3811SMasahiro Yamada  */
5573a3811SMasahiro Yamada 
64af0d7e8SSimon Glass #include <common.h>
79d922450SSimon Glass #include <dm.h>
8573a3811SMasahiro Yamada #include <sysreset.h>
9573a3811SMasahiro Yamada #include <linux/errno.h>
10573a3811SMasahiro Yamada #include <linux/psci.h>
11573a3811SMasahiro Yamada 
psci_sysreset_request(struct udevice * dev,enum sysreset_t type)12573a3811SMasahiro Yamada static int psci_sysreset_request(struct udevice *dev, enum sysreset_t type)
13573a3811SMasahiro Yamada {
14573a3811SMasahiro Yamada 	unsigned long function_id;
15573a3811SMasahiro Yamada 
16573a3811SMasahiro Yamada 	switch (type) {
17573a3811SMasahiro Yamada 	case SYSRESET_WARM:
18573a3811SMasahiro Yamada 	case SYSRESET_COLD:
19573a3811SMasahiro Yamada 		function_id = PSCI_0_2_FN_SYSTEM_RESET;
20573a3811SMasahiro Yamada 		break;
21573a3811SMasahiro Yamada 	case SYSRESET_POWER:
22573a3811SMasahiro Yamada 		function_id = PSCI_0_2_FN_SYSTEM_OFF;
23573a3811SMasahiro Yamada 		break;
24573a3811SMasahiro Yamada 	default:
25573a3811SMasahiro Yamada 		return -ENOSYS;
26573a3811SMasahiro Yamada 	}
27573a3811SMasahiro Yamada 
28573a3811SMasahiro Yamada 	invoke_psci_fn(function_id, 0, 0, 0);
29573a3811SMasahiro Yamada 
30573a3811SMasahiro Yamada 	return -EINPROGRESS;
31573a3811SMasahiro Yamada }
32573a3811SMasahiro Yamada 
33573a3811SMasahiro Yamada static struct sysreset_ops psci_sysreset_ops = {
34573a3811SMasahiro Yamada 	.request = psci_sysreset_request,
35573a3811SMasahiro Yamada };
36573a3811SMasahiro Yamada 
37573a3811SMasahiro Yamada U_BOOT_DRIVER(psci_sysreset) = {
38573a3811SMasahiro Yamada 	.name = "psci-sysreset",
39573a3811SMasahiro Yamada 	.id = UCLASS_SYSRESET,
40573a3811SMasahiro Yamada 	.ops = &psci_sysreset_ops,
41573a3811SMasahiro Yamada };
42