uboot/include/sysreset.h
<<
>>
Prefs
   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
  10struct udevice;
  11
  12/**
  13 * enum sysreset_t - system reset types
  14 */
  15enum sysreset_t {
  16        /** @SYSRESET_WARM: reset CPU, keep GPIOs active */
  17        SYSRESET_WARM,
  18        /** @SYSRESET_COLD: reset CPU and GPIOs */
  19        SYSRESET_COLD,
  20        /** @SYSRESET_POWER: reset PMIC (remove and restore power) */
  21        SYSRESET_POWER,
  22        /** @SYSRESET_POWER_OFF: turn off power */
  23        SYSRESET_POWER_OFF,
  24        /** @SYSRESET_COUNT: number of available reset types */
  25        SYSRESET_COUNT,
  26};
  27
  28/**
  29 * struct sysreset_ops - operations of system reset drivers
  30 */
  31struct sysreset_ops {
  32        /**
  33         * @request:    request a sysreset of the given type
  34         *
  35         * Note that this function may return before the reset takes effect.
  36         *
  37         * @dev:        Device to be used for system reset
  38         * @type:       Reset type to request
  39         * Return:
  40         * -EINPROGRESS if the reset has been started and
  41         * will complete soon, -EPROTONOSUPPORT if not supported
  42         * by this device, 0 if the reset has already happened
  43         * (in which case this method will not actually return)
  44         */
  45        int (*request)(struct udevice *dev, enum sysreset_t type);
  46        /**
  47         * @get_status: get printable reset status information
  48         *
  49         * @dev:        Device to check
  50         * @buf:        Buffer to receive the textual reset information
  51         * @size:       Size of the passed buffer
  52         * Return:      0 if OK, -ve on error
  53         */
  54        int (*get_status)(struct udevice *dev, char *buf, int size);
  55
  56        /**
  57         * @get_last:   get information on the last reset
  58         *
  59         * @dev:        Device to check
  60         * Return:      last reset state (enum :enum:`sysreset_t`) or -ve error
  61         */
  62        int (*get_last)(struct udevice *dev);
  63};
  64
  65#define sysreset_get_ops(dev)        ((struct sysreset_ops *)(dev)->driver->ops)
  66
  67/**
  68 * sysreset_request() - request a sysreset
  69 *
  70 * @dev:        Device to be used for system reset
  71 * @type:       Reset type to request
  72 * Return:      0 if OK, -EPROTONOSUPPORT if not supported by this device
  73 */
  74int sysreset_request(struct udevice *dev, enum sysreset_t type);
  75
  76/**
  77 * sysreset_get_status() - get printable reset status information
  78 *
  79 * @dev:        Device to check
  80 * @buf:        Buffer to receive the textual reset information
  81 * @size:       Size of the passed buffer
  82 * Return:       0 if OK, -ve on error
  83 */
  84int sysreset_get_status(struct udevice *dev, char *buf, int size);
  85
  86/**
  87 * sysreset_get_last() - get information on the last reset
  88 *
  89 * @dev:        Device to check
  90 * Return:      last reset state (enum sysreset_t) or -ve error
  91 */
  92int sysreset_get_last(struct udevice *dev);
  93
  94/**
  95 * sysreset_walk() - cause a system reset
  96 *
  97 * This works through the available sysreset devices until it finds one that can
  98 * perform a reset. If the provided sysreset type is not available, the next one
  99 * will be tried.
 100 *
 101 * If this function fails to reset, it will display a message and halt
 102 *
 103 * @type:       Reset type to request
 104 * Return:      -EINPROGRESS if a reset is in progress, -ENOSYS if not available
 105 */
 106int sysreset_walk(enum sysreset_t type);
 107
 108/**
 109 * sysreset_get_last_walk() - get information on the last reset
 110 *
 111 * This works through the available sysreset devices until it finds one that can
 112 * perform a reset. If the provided sysreset type is not available, the next one
 113 * will be tried.
 114 *
 115 * If no device prives the information, this function returns -ENOENT
 116 *
 117 * Return:      last reset state (enum sysreset_t) or -ve error
 118 */
 119int sysreset_get_last_walk(void);
 120
 121/**
 122 * sysreset_walk_halt() - try to reset, otherwise halt
 123 *
 124 * This calls sysreset_walk(). If it returns, indicating that reset is not
 125 * supported, it prints a message and halts.
 126 *
 127 * @type:       Reset type to request
 128 */
 129void sysreset_walk_halt(enum sysreset_t type);
 130
 131/**
 132 * reset_cpu() - calls sysreset_walk(SYSRESET_WARM)
 133 */
 134void reset_cpu(void);
 135
 136/**
 137 * sysreset_register_wdt() - register a watchdog for use with sysreset
 138 *
 139 * This registers the given watchdog timer to be used to reset the system.
 140 *
 141 * @dev:        WDT device
 142 * @return:     0 if OK, -errno if error
 143 */
 144int sysreset_register_wdt(struct udevice *dev);
 145
 146#endif
 147