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 #ifndef __SYSRESET_H
8 #define __SYSRESET_H
9 
10 struct udevice;
11 
12 enum sysreset_t {
13 	SYSRESET_WARM,	/* Reset CPU, keep GPIOs active */
14 	SYSRESET_COLD,	/* Reset CPU and GPIOs */
15 	SYSRESET_POWER,	/* Reset PMIC (remove and restore power) */
16 	SYSRESET_POWER_OFF,	/* Turn off power */
17 
18 	SYSRESET_COUNT,
19 };
20 
21 struct sysreset_ops {
22 	/**
23 	 * request() - request a sysreset of the given type
24 	 *
25 	 * Note that this function may return before the reset takes effect.
26 	 *
27 	 * @type:	Reset type to request
28 	 * @return -EINPROGRESS if the reset has been started and
29 	 *		will complete soon, -EPROTONOSUPPORT if not supported
30 	 *		by this device, 0 if the reset has already happened
31 	 *		(in which case this method will not actually return)
32 	 */
33 	int (*request)(struct udevice *dev, enum sysreset_t type);
34 	/**
35 	 * get_status() - get printable reset status information
36 	 *
37 	 * @dev:	Device to check
38 	 * @buf:	Buffer to receive the textual reset information
39 	 * @size:	Size of the passed buffer
40 	 * @return 0 if OK, -ve on error
41 	 */
42 	int (*get_status)(struct udevice *dev, char *buf, int size);
43 
44 	/**
45 	 * get_last() - get information on the last reset
46 	 *
47 	 * @dev:	Device to check
48 	 * @return last reset state (enum sysreset_t) or -ve error
49 	 */
50 	int (*get_last)(struct udevice *dev);
51 };
52 
53 #define sysreset_get_ops(dev)        ((struct sysreset_ops *)(dev)->driver->ops)
54 
55 /**
56  * sysreset_request() - request a sysreset
57  *
58  * @type:	Reset type to request
59  * @return 0 if OK, -EPROTONOSUPPORT if not supported by this device
60  */
61 int sysreset_request(struct udevice *dev, enum sysreset_t type);
62 
63 /**
64  * sysreset_get_status() - get printable reset status information
65  *
66  * @dev:	Device to check
67  * @buf:	Buffer to receive the textual reset information
68  * @size:	Size of the passed buffer
69  * @return 0 if OK, -ve on error
70  */
71 int sysreset_get_status(struct udevice *dev, char *buf, int size);
72 
73 /**
74  * sysreset_get_last() - get information on the last reset
75  *
76  * @dev:	Device to check
77  * @return last reset state (enum sysreset_t) or -ve error
78  */
79 int sysreset_get_last(struct udevice *dev);
80 
81 /**
82  * sysreset_walk() - cause a system reset
83  *
84  * This works through the available sysreset devices until it finds one that can
85  * perform a reset. If the provided sysreset type is not available, the next one
86  * will be tried.
87  *
88  * If this function fails to reset, it will display a message and halt
89  *
90  * @type:	Reset type to request
91  * @return -EINPROGRESS if a reset is in progress, -ENOSYS if not available
92  */
93 int sysreset_walk(enum sysreset_t type);
94 
95 /**
96  * sysreset_get_last_walk() - get information on the last reset
97  *
98  * This works through the available sysreset devices until it finds one that can
99  * perform a reset. If the provided sysreset type is not available, the next one
100  * will be tried.
101  *
102  * If no device prives the information, this function returns -ENOENT
103  *
104  * @return last reset state (enum sysreset_t) or -ve error
105  */
106 int sysreset_get_last_walk(void);
107 
108 /**
109  * sysreset_walk_halt() - try to reset, otherwise halt
110  *
111  * This calls sysreset_walk(). If it returns, indicating that reset is not
112  * supported, it prints a message and halts.
113  */
114 void sysreset_walk_halt(enum sysreset_t type);
115 
116 /**
117  * reset_cpu() - calls sysreset_walk(SYSRESET_WARM)
118  */
119 void reset_cpu(ulong addr);
120 
121 #endif
122