111636258SStephen Warren /* 211636258SStephen Warren * Copyright (c) 2015 Google, Inc 311636258SStephen Warren * Written by Simon Glass <sjg@chromium.org> 411636258SStephen Warren * 511636258SStephen Warren * SPDX-License-Identifier: GPL-2.0+ 611636258SStephen Warren */ 711636258SStephen Warren 811636258SStephen Warren #ifndef __SYSRESET_H 911636258SStephen Warren #define __SYSRESET_H 1011636258SStephen Warren 1111636258SStephen Warren enum sysreset_t { 1211636258SStephen Warren SYSRESET_WARM, /* Reset CPU, keep GPIOs active */ 1311636258SStephen Warren SYSRESET_COLD, /* Reset CPU and GPIOs */ 1411636258SStephen Warren SYSRESET_POWER, /* Reset PMIC (remove and restore 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); 32*bcb84b5dSJoseph Chen 33*bcb84b5dSJoseph Chen /** 34*bcb84b5dSJoseph Chen * request_by_mode() - request a sysreset of the given mode 35*bcb84b5dSJoseph Chen * 36*bcb84b5dSJoseph Chen * Note that this function may return before the reset takes effect. 37*bcb84b5dSJoseph Chen * 38*bcb84b5dSJoseph Chen * @mode: mode to request 39*bcb84b5dSJoseph Chen * @return -EINPROGRESS if the reset has been started and 40*bcb84b5dSJoseph Chen * will complete soon, -EPROTONOSUPPORT if not supported 41*bcb84b5dSJoseph Chen * by this device, 0 if the reset has already happened 42*bcb84b5dSJoseph Chen * (in which case this method will not actually return) 43*bcb84b5dSJoseph Chen */ 44*bcb84b5dSJoseph Chen int (*request_by_mode)(struct udevice *dev, const char *mode); 4511636258SStephen Warren }; 4611636258SStephen Warren 4711636258SStephen Warren #define sysreset_get_ops(dev) ((struct sysreset_ops *)(dev)->driver->ops) 4811636258SStephen Warren 4911636258SStephen Warren /** 5011636258SStephen Warren * sysreset_request() - request a sysreset 5111636258SStephen Warren * 5211636258SStephen Warren * @type: Reset type to request 5311636258SStephen Warren * @return 0 if OK, -EPROTONOSUPPORT if not supported by this device 5411636258SStephen Warren */ 5511636258SStephen Warren int sysreset_request(struct udevice *dev, enum sysreset_t type); 5611636258SStephen Warren 5711636258SStephen Warren /** 5811636258SStephen Warren * sysreset_walk() - cause a system reset 5911636258SStephen Warren * 6011636258SStephen Warren * This works through the available sysreset devices until it finds one that can 6111636258SStephen Warren * perform a reset. If the provided sysreset type is not available, the next one 6211636258SStephen Warren * will be tried. 6311636258SStephen Warren * 6411636258SStephen Warren * If this function fails to reset, it will display a message and halt 6511636258SStephen Warren * 6611636258SStephen Warren * @type: Reset type to request 6711636258SStephen Warren * @return -EINPROGRESS if a reset is in progress, -ENOSYS if not available 6811636258SStephen Warren */ 6911636258SStephen Warren int sysreset_walk(enum sysreset_t type); 7011636258SStephen Warren 7111636258SStephen Warren /** 7211636258SStephen Warren * sysreset_walk_halt() - try to reset, otherwise halt 7311636258SStephen Warren * 7411636258SStephen Warren * This calls sysreset_walk(). If it returns, indicating that reset is not 7511636258SStephen Warren * supported, it prints a message and halts. 7611636258SStephen Warren */ 7711636258SStephen Warren void sysreset_walk_halt(enum sysreset_t type); 7811636258SStephen Warren 7911636258SStephen Warren /** 8011636258SStephen Warren * reset_cpu() - calls sysreset_walk(SYSRESET_WARM) 8111636258SStephen Warren */ 8211636258SStephen Warren void reset_cpu(ulong addr); 8311636258SStephen Warren 84*bcb84b5dSJoseph Chen /** 85*bcb84b5dSJoseph Chen * reboot() - calls sysreset_walk(SYSRESET_WARM) 86*bcb84b5dSJoseph Chen * 87*bcb84b5dSJoseph Chen * Support the command like: reboot loader/bootloader/recovery, etc. 88*bcb84b5dSJoseph Chen */ 89*bcb84b5dSJoseph Chen void reboot(const char *mode); 90*bcb84b5dSJoseph Chen 9111636258SStephen Warren #endif 92