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