1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (c) 2015 Google, Inc 4 * Written by Simon Glass <sjg@chromium.org> 5 */ 6 7 #include <common.h> 8 #include <dm.h> 9 #include <errno.h> 10 #include <sysreset.h> 11 #include <asm/state.h> 12 #include <asm/test.h> 13 14 static int sandbox_warm_sysreset_request(struct udevice *dev, 15 enum sysreset_t type) 16 { 17 struct sandbox_state *state = state_get_current(); 18 19 switch (type) { 20 case SYSRESET_WARM: 21 state->last_sysreset = type; 22 break; 23 default: 24 return -ENOSYS; 25 } 26 if (!state->sysreset_allowed[type]) 27 return -EACCES; 28 29 return -EINPROGRESS; 30 } 31 32 int sandbox_warm_sysreset_get_status(struct udevice *dev, char *buf, int size) 33 { 34 strlcpy(buf, "Reset Status: WARM", size); 35 36 return 0; 37 } 38 39 static int sandbox_sysreset_request(struct udevice *dev, enum sysreset_t type) 40 { 41 struct sandbox_state *state = state_get_current(); 42 43 /* 44 * If we have a device tree, the device we created from platform data 45 * (see the U_BOOT_DEVICE() declaration below) should not do anything. 46 * If we are that device, return an error. 47 */ 48 if (state->fdt_fname && !dev_of_valid(dev)) 49 return -ENODEV; 50 51 switch (type) { 52 case SYSRESET_COLD: 53 state->last_sysreset = type; 54 break; 55 case SYSRESET_POWER: 56 state->last_sysreset = type; 57 if (!state->sysreset_allowed[type]) 58 return -EACCES; 59 sandbox_exit(); 60 break; 61 default: 62 return -ENOSYS; 63 } 64 if (!state->sysreset_allowed[type]) 65 return -EACCES; 66 67 return -EINPROGRESS; 68 } 69 70 int sandbox_sysreset_get_status(struct udevice *dev, char *buf, int size) 71 { 72 strlcpy(buf, "Reset Status: COLD", size); 73 74 return 0; 75 } 76 77 static struct sysreset_ops sandbox_sysreset_ops = { 78 .request = sandbox_sysreset_request, 79 .get_status = sandbox_sysreset_get_status, 80 }; 81 82 static const struct udevice_id sandbox_sysreset_ids[] = { 83 { .compatible = "sandbox,reset" }, 84 { } 85 }; 86 87 U_BOOT_DRIVER(sysreset_sandbox) = { 88 .name = "sysreset_sandbox", 89 .id = UCLASS_SYSRESET, 90 .of_match = sandbox_sysreset_ids, 91 .ops = &sandbox_sysreset_ops, 92 }; 93 94 static struct sysreset_ops sandbox_warm_sysreset_ops = { 95 .request = sandbox_warm_sysreset_request, 96 .get_status = sandbox_warm_sysreset_get_status, 97 }; 98 99 static const struct udevice_id sandbox_warm_sysreset_ids[] = { 100 { .compatible = "sandbox,warm-reset" }, 101 { } 102 }; 103 104 U_BOOT_DRIVER(warm_sysreset_sandbox) = { 105 .name = "warm_sysreset_sandbox", 106 .id = UCLASS_SYSRESET, 107 .of_match = sandbox_warm_sysreset_ids, 108 .ops = &sandbox_warm_sysreset_ops, 109 }; 110 111 /* This is here in case we don't have a device tree */ 112 U_BOOT_DEVICE(sysreset_sandbox_non_fdt) = { 113 .name = "sysreset_sandbox", 114 }; 115