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