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