1
2
3
4
5
6
7
8#include <common.h>
9#include <dm.h>
10#include <errno.h>
11#include <reset.h>
12#include <asm/state.h>
13#include <asm/test.h>
14
15DECLARE_GLOBAL_DATA_PTR;
16
17static int sandbox_warm_reset_request(struct udevice *dev, enum reset_t type)
18{
19 struct sandbox_state *state = state_get_current();
20
21 switch (type) {
22 case RESET_WARM:
23 state->last_reset = type;
24 break;
25 default:
26 return -ENOSYS;
27 }
28 if (!state->reset_allowed[type])
29 return -EACCES;
30
31 return -EINPROGRESS;
32}
33
34static int sandbox_reset_request(struct udevice *dev, enum reset_t type)
35{
36 struct sandbox_state *state = state_get_current();
37
38
39
40
41
42
43 if (state->fdt_fname && dev->of_offset == -1)
44 return -ENODEV;
45
46 switch (type) {
47 case RESET_COLD:
48 state->last_reset = type;
49 break;
50 case RESET_POWER:
51 state->last_reset = type;
52 if (!state->reset_allowed[type])
53 return -EACCES;
54 sandbox_exit();
55 break;
56 default:
57 return -ENOSYS;
58 }
59 if (!state->reset_allowed[type])
60 return -EACCES;
61
62 return -EINPROGRESS;
63}
64
65static struct reset_ops sandbox_reset_ops = {
66 .request = sandbox_reset_request,
67};
68
69static const struct udevice_id sandbox_reset_ids[] = {
70 { .compatible = "sandbox,reset" },
71 { }
72};
73
74U_BOOT_DRIVER(reset_sandbox) = {
75 .name = "reset_sandbox",
76 .id = UCLASS_RESET,
77 .of_match = sandbox_reset_ids,
78 .ops = &sandbox_reset_ops,
79};
80
81static struct reset_ops sandbox_warm_reset_ops = {
82 .request = sandbox_warm_reset_request,
83};
84
85static const struct udevice_id sandbox_warm_reset_ids[] = {
86 { .compatible = "sandbox,warm-reset" },
87 { }
88};
89
90U_BOOT_DRIVER(warm_reset_sandbox) = {
91 .name = "warm_reset_sandbox",
92 .id = UCLASS_RESET,
93 .of_match = sandbox_warm_reset_ids,
94 .ops = &sandbox_warm_reset_ops,
95};
96
97
98U_BOOT_DEVICE(reset_sandbox_non_fdt) = {
99 .name = "reset_sandbox",
100};
101