1*11636258SStephen Warren /* 2*11636258SStephen Warren * Copyright (c) 2015 Google, Inc 3*11636258SStephen Warren * Written by Simon Glass <sjg@chromium.org> 4*11636258SStephen Warren * 5*11636258SStephen Warren * SPDX-License-Identifier: GPL-2.0+ 6*11636258SStephen Warren */ 7*11636258SStephen Warren 8*11636258SStephen Warren #ifndef __SYSRESET_H 9*11636258SStephen Warren #define __SYSRESET_H 10*11636258SStephen Warren 11*11636258SStephen Warren enum sysreset_t { 12*11636258SStephen Warren SYSRESET_WARM, /* Reset CPU, keep GPIOs active */ 13*11636258SStephen Warren SYSRESET_COLD, /* Reset CPU and GPIOs */ 14*11636258SStephen Warren SYSRESET_POWER, /* Reset PMIC (remove and restore power) */ 15*11636258SStephen Warren 16*11636258SStephen Warren SYSRESET_COUNT, 17*11636258SStephen Warren }; 18*11636258SStephen Warren 19*11636258SStephen Warren struct sysreset_ops { 20*11636258SStephen Warren /** 21*11636258SStephen Warren * request() - request a sysreset of the given type 22*11636258SStephen Warren * 23*11636258SStephen Warren * Note that this function may return before the reset takes effect. 24*11636258SStephen Warren * 25*11636258SStephen Warren * @type: Reset type to request 26*11636258SStephen Warren * @return -EINPROGRESS if the reset has been started and 27*11636258SStephen Warren * will complete soon, -EPROTONOSUPPORT if not supported 28*11636258SStephen Warren * by this device, 0 if the reset has already happened 29*11636258SStephen Warren * (in which case this method will not actually return) 30*11636258SStephen Warren */ 31*11636258SStephen Warren int (*request)(struct udevice *dev, enum sysreset_t type); 32*11636258SStephen Warren }; 33*11636258SStephen Warren 34*11636258SStephen Warren #define sysreset_get_ops(dev) ((struct sysreset_ops *)(dev)->driver->ops) 35*11636258SStephen Warren 36*11636258SStephen Warren /** 37*11636258SStephen Warren * sysreset_request() - request a sysreset 38*11636258SStephen Warren * 39*11636258SStephen Warren * @type: Reset type to request 40*11636258SStephen Warren * @return 0 if OK, -EPROTONOSUPPORT if not supported by this device 41*11636258SStephen Warren */ 42*11636258SStephen Warren int sysreset_request(struct udevice *dev, enum sysreset_t type); 43*11636258SStephen Warren 44*11636258SStephen Warren /** 45*11636258SStephen Warren * sysreset_walk() - cause a system reset 46*11636258SStephen Warren * 47*11636258SStephen Warren * This works through the available sysreset devices until it finds one that can 48*11636258SStephen Warren * perform a reset. If the provided sysreset type is not available, the next one 49*11636258SStephen Warren * will be tried. 50*11636258SStephen Warren * 51*11636258SStephen Warren * If this function fails to reset, it will display a message and halt 52*11636258SStephen Warren * 53*11636258SStephen Warren * @type: Reset type to request 54*11636258SStephen Warren * @return -EINPROGRESS if a reset is in progress, -ENOSYS if not available 55*11636258SStephen Warren */ 56*11636258SStephen Warren int sysreset_walk(enum sysreset_t type); 57*11636258SStephen Warren 58*11636258SStephen Warren /** 59*11636258SStephen Warren * sysreset_walk_halt() - try to reset, otherwise halt 60*11636258SStephen Warren * 61*11636258SStephen Warren * This calls sysreset_walk(). If it returns, indicating that reset is not 62*11636258SStephen Warren * supported, it prints a message and halts. 63*11636258SStephen Warren */ 64*11636258SStephen Warren void sysreset_walk_halt(enum sysreset_t type); 65*11636258SStephen Warren 66*11636258SStephen Warren /** 67*11636258SStephen Warren * reset_cpu() - calls sysreset_walk(SYSRESET_WARM) 68*11636258SStephen Warren */ 69*11636258SStephen Warren void reset_cpu(ulong addr); 70*11636258SStephen Warren 71*11636258SStephen Warren #endif 72