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 Yamadastatic 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