1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2016, NVIDIA CORPORATION.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <dm.h>
9*4882a593Smuzhiyun #include <reset-uclass.h>
10*4882a593Smuzhiyun #include <asm/io.h>
11*4882a593Smuzhiyun #include <asm/reset.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define SANDBOX_RESET_SIGNALS 101
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun struct sandbox_reset_signal {
16*4882a593Smuzhiyun bool asserted;
17*4882a593Smuzhiyun };
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun struct sandbox_reset {
20*4882a593Smuzhiyun struct sandbox_reset_signal signals[SANDBOX_RESET_SIGNALS];
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun
sandbox_reset_request(struct reset_ctl * reset_ctl)23*4882a593Smuzhiyun static int sandbox_reset_request(struct reset_ctl *reset_ctl)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun if (reset_ctl->id >= SANDBOX_RESET_SIGNALS)
28*4882a593Smuzhiyun return -EINVAL;
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun return 0;
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun
sandbox_reset_free(struct reset_ctl * reset_ctl)33*4882a593Smuzhiyun static int sandbox_reset_free(struct reset_ctl *reset_ctl)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun return 0;
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
sandbox_reset_assert(struct reset_ctl * reset_ctl)40*4882a593Smuzhiyun static int sandbox_reset_assert(struct reset_ctl *reset_ctl)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev);
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun sbr->signals[reset_ctl->id].asserted = true;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun return 0;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun
sandbox_reset_deassert(struct reset_ctl * reset_ctl)51*4882a593Smuzhiyun static int sandbox_reset_deassert(struct reset_ctl *reset_ctl)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev);
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun sbr->signals[reset_ctl->id].asserted = false;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun return 0;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
sandbox_reset_bind(struct udevice * dev)62*4882a593Smuzhiyun static int sandbox_reset_bind(struct udevice *dev)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun debug("%s(dev=%p)\n", __func__, dev);
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun return 0;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun
sandbox_reset_probe(struct udevice * dev)69*4882a593Smuzhiyun static int sandbox_reset_probe(struct udevice *dev)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun debug("%s(dev=%p)\n", __func__, dev);
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun return 0;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun static const struct udevice_id sandbox_reset_ids[] = {
77*4882a593Smuzhiyun { .compatible = "sandbox,reset-ctl" },
78*4882a593Smuzhiyun { }
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun struct reset_ops sandbox_reset_reset_ops = {
82*4882a593Smuzhiyun .request = sandbox_reset_request,
83*4882a593Smuzhiyun .free = sandbox_reset_free,
84*4882a593Smuzhiyun .rst_assert = sandbox_reset_assert,
85*4882a593Smuzhiyun .rst_deassert = sandbox_reset_deassert,
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun U_BOOT_DRIVER(sandbox_reset) = {
89*4882a593Smuzhiyun .name = "sandbox_reset",
90*4882a593Smuzhiyun .id = UCLASS_RESET,
91*4882a593Smuzhiyun .of_match = sandbox_reset_ids,
92*4882a593Smuzhiyun .bind = sandbox_reset_bind,
93*4882a593Smuzhiyun .probe = sandbox_reset_probe,
94*4882a593Smuzhiyun .priv_auto_alloc_size = sizeof(struct sandbox_reset),
95*4882a593Smuzhiyun .ops = &sandbox_reset_reset_ops,
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun
sandbox_reset_query(struct udevice * dev,unsigned long id)98*4882a593Smuzhiyun int sandbox_reset_query(struct udevice *dev, unsigned long id)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun struct sandbox_reset *sbr = dev_get_priv(dev);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun debug("%s(dev=%p, id=%ld)\n", __func__, dev, id);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun if (id >= SANDBOX_RESET_SIGNALS)
105*4882a593Smuzhiyun return -EINVAL;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun return sbr->signals[id].asserted;
108*4882a593Smuzhiyun }
109