xref: /openbmc/u-boot/include/sysreset.h (revision 3d5ced9e22d32112a20f9dc0f5fb1f22ef088079)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
211636258SStephen Warren /*
311636258SStephen Warren  * Copyright (c) 2015 Google, Inc
411636258SStephen Warren  * Written by Simon Glass <sjg@chromium.org>
511636258SStephen Warren  */
611636258SStephen Warren 
711636258SStephen Warren #ifndef __SYSRESET_H
811636258SStephen Warren #define __SYSRESET_H
911636258SStephen Warren 
1011636258SStephen Warren enum sysreset_t {
1111636258SStephen Warren 	SYSRESET_WARM,	/* Reset CPU, keep GPIOs active */
1211636258SStephen Warren 	SYSRESET_COLD,	/* Reset CPU and GPIOs */
1311636258SStephen Warren 	SYSRESET_POWER,	/* Reset PMIC (remove and restore power) */
14*751fed42SSimon Glass 	SYSRESET_POWER_OFF,	/* Turn off power */
1511636258SStephen Warren 
1611636258SStephen Warren 	SYSRESET_COUNT,
1711636258SStephen Warren };
1811636258SStephen Warren 
1911636258SStephen Warren struct sysreset_ops {
2011636258SStephen Warren 	/**
2111636258SStephen Warren 	 * request() - request a sysreset of the given type
2211636258SStephen Warren 	 *
2311636258SStephen Warren 	 * Note that this function may return before the reset takes effect.
2411636258SStephen Warren 	 *
2511636258SStephen Warren 	 * @type:	Reset type to request
2611636258SStephen Warren 	 * @return -EINPROGRESS if the reset has been started and
2711636258SStephen Warren 	 *		will complete soon, -EPROTONOSUPPORT if not supported
2811636258SStephen Warren 	 *		by this device, 0 if the reset has already happened
2911636258SStephen Warren 	 *		(in which case this method will not actually return)
3011636258SStephen Warren 	 */
3111636258SStephen Warren 	int (*request)(struct udevice *dev, enum sysreset_t type);
32245f5cdaSMario Six 	/**
33245f5cdaSMario Six 	 * get_status() - get printable reset status information
34245f5cdaSMario Six 	 *
35eb517315SSimon Glass 	 * @dev:	Device to check
36245f5cdaSMario Six 	 * @buf:	Buffer to receive the textual reset information
37245f5cdaSMario Six 	 * @size:	Size of the passed buffer
38245f5cdaSMario Six 	 * @return 0 if OK, -ve on error
39245f5cdaSMario Six 	 */
40245f5cdaSMario Six 	int (*get_status)(struct udevice *dev, char *buf, int size);
41*751fed42SSimon Glass 
42*751fed42SSimon Glass 	/**
43*751fed42SSimon Glass 	 * get_last() - get information on the last reset
44*751fed42SSimon Glass 	 *
45*751fed42SSimon Glass 	 * @dev:	Device to check
46*751fed42SSimon Glass 	 * @return last reset state (enum sysreset_t) or -ve error
47*751fed42SSimon Glass 	 */
48*751fed42SSimon Glass 	int (*get_last)(struct udevice *dev);
4911636258SStephen Warren };
5011636258SStephen Warren 
5111636258SStephen Warren #define sysreset_get_ops(dev)        ((struct sysreset_ops *)(dev)->driver->ops)
5211636258SStephen Warren 
5311636258SStephen Warren /**
5411636258SStephen Warren  * sysreset_request() - request a sysreset
5511636258SStephen Warren  *
5611636258SStephen Warren  * @type:	Reset type to request
5711636258SStephen Warren  * @return 0 if OK, -EPROTONOSUPPORT if not supported by this device
5811636258SStephen Warren  */
5911636258SStephen Warren int sysreset_request(struct udevice *dev, enum sysreset_t type);
6011636258SStephen Warren 
6111636258SStephen Warren /**
62eb517315SSimon Glass  * sysreset_get_status() - get printable reset status information
63245f5cdaSMario Six  *
64eb517315SSimon Glass  * @dev:	Device to check
65245f5cdaSMario Six  * @buf:	Buffer to receive the textual reset information
66245f5cdaSMario Six  * @size:	Size of the passed buffer
67245f5cdaSMario Six  * @return 0 if OK, -ve on error
68245f5cdaSMario Six  */
69245f5cdaSMario Six int sysreset_get_status(struct udevice *dev, char *buf, int size);
70245f5cdaSMario Six 
71245f5cdaSMario Six /**
72*751fed42SSimon Glass  * sysreset_get_last() - get information on the last reset
73*751fed42SSimon Glass  *
74*751fed42SSimon Glass  * @dev:	Device to check
75*751fed42SSimon Glass  * @return last reset state (enum sysreset_t) or -ve error
76*751fed42SSimon Glass  */
77*751fed42SSimon Glass int sysreset_get_last(struct udevice *dev);
78*751fed42SSimon Glass 
79*751fed42SSimon Glass /**
8011636258SStephen Warren  * sysreset_walk() - cause a system reset
8111636258SStephen Warren  *
8211636258SStephen Warren  * This works through the available sysreset devices until it finds one that can
8311636258SStephen Warren  * perform a reset. If the provided sysreset type is not available, the next one
8411636258SStephen Warren  * will be tried.
8511636258SStephen Warren  *
8611636258SStephen Warren  * If this function fails to reset, it will display a message and halt
8711636258SStephen Warren  *
8811636258SStephen Warren  * @type:	Reset type to request
8911636258SStephen Warren  * @return -EINPROGRESS if a reset is in progress, -ENOSYS if not available
9011636258SStephen Warren  */
9111636258SStephen Warren int sysreset_walk(enum sysreset_t type);
9211636258SStephen Warren 
9311636258SStephen Warren /**
94*751fed42SSimon Glass  * sysreset_get_last_walk() - get information on the last reset
95*751fed42SSimon Glass  *
96*751fed42SSimon Glass  * This works through the available sysreset devices until it finds one that can
97*751fed42SSimon Glass  * perform a reset. If the provided sysreset type is not available, the next one
98*751fed42SSimon Glass  * will be tried.
99*751fed42SSimon Glass  *
100*751fed42SSimon Glass  * If no device prives the information, this function returns -ENOENT
101*751fed42SSimon Glass  *
102*751fed42SSimon Glass  * @return last reset state (enum sysreset_t) or -ve error
103*751fed42SSimon Glass  */
104*751fed42SSimon Glass int sysreset_get_last_walk(void);
105*751fed42SSimon Glass 
106*751fed42SSimon Glass /**
10711636258SStephen Warren  * sysreset_walk_halt() - try to reset, otherwise halt
10811636258SStephen Warren  *
10911636258SStephen Warren  * This calls sysreset_walk(). If it returns, indicating that reset is not
11011636258SStephen Warren  * supported, it prints a message and halts.
11111636258SStephen Warren  */
11211636258SStephen Warren void sysreset_walk_halt(enum sysreset_t type);
11311636258SStephen Warren 
11411636258SStephen Warren /**
11511636258SStephen Warren  * reset_cpu() - calls sysreset_walk(SYSRESET_WARM)
11611636258SStephen Warren  */
11711636258SStephen Warren void reset_cpu(ulong addr);
11811636258SStephen Warren 
11911636258SStephen Warren #endif
120