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