Merge tag 'ti-v2021.07-rc1' of https://source.denx.de/u-boot/custodians/u-boot-ti
[platform/kernel/u-boot.git] / include / sysreset.h
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(void);
120
121 #endif