linux/include/linux/reset.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_RESET_H_
   3#define _LINUX_RESET_H_
   4
   5#include <linux/device.h>
   6
   7struct reset_control;
   8
   9#ifdef CONFIG_RESET_CONTROLLER
  10
  11int reset_control_reset(struct reset_control *rstc);
  12int reset_control_assert(struct reset_control *rstc);
  13int reset_control_deassert(struct reset_control *rstc);
  14int reset_control_status(struct reset_control *rstc);
  15
  16struct reset_control *__of_reset_control_get(struct device_node *node,
  17                                     const char *id, int index, bool shared,
  18                                     bool optional);
  19struct reset_control *__reset_control_get(struct device *dev, const char *id,
  20                                          int index, bool shared,
  21                                          bool optional);
  22void reset_control_put(struct reset_control *rstc);
  23struct reset_control *__devm_reset_control_get(struct device *dev,
  24                                     const char *id, int index, bool shared,
  25                                     bool optional);
  26
  27int __must_check device_reset(struct device *dev);
  28
  29struct reset_control *devm_reset_control_array_get(struct device *dev,
  30                                                   bool shared, bool optional);
  31struct reset_control *of_reset_control_array_get(struct device_node *np,
  32                                                 bool shared, bool optional);
  33
  34static inline int device_reset_optional(struct device *dev)
  35{
  36        return device_reset(dev);
  37}
  38
  39#else
  40
  41static inline int reset_control_reset(struct reset_control *rstc)
  42{
  43        return 0;
  44}
  45
  46static inline int reset_control_assert(struct reset_control *rstc)
  47{
  48        return 0;
  49}
  50
  51static inline int reset_control_deassert(struct reset_control *rstc)
  52{
  53        return 0;
  54}
  55
  56static inline int reset_control_status(struct reset_control *rstc)
  57{
  58        return 0;
  59}
  60
  61static inline void reset_control_put(struct reset_control *rstc)
  62{
  63}
  64
  65static inline int __must_check device_reset(struct device *dev)
  66{
  67        WARN_ON(1);
  68        return -ENOTSUPP;
  69}
  70
  71static inline int device_reset_optional(struct device *dev)
  72{
  73        return -ENOTSUPP;
  74}
  75
  76static inline struct reset_control *__of_reset_control_get(
  77                                        struct device_node *node,
  78                                        const char *id, int index, bool shared,
  79                                        bool optional)
  80{
  81        return optional ? NULL : ERR_PTR(-ENOTSUPP);
  82}
  83
  84static inline struct reset_control *__reset_control_get(
  85                                        struct device *dev, const char *id,
  86                                        int index, bool shared, bool optional)
  87{
  88        return optional ? NULL : ERR_PTR(-ENOTSUPP);
  89}
  90
  91static inline struct reset_control *__devm_reset_control_get(
  92                                        struct device *dev, const char *id,
  93                                        int index, bool shared, bool optional)
  94{
  95        return optional ? NULL : ERR_PTR(-ENOTSUPP);
  96}
  97
  98static inline struct reset_control *
  99devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
 100{
 101        return optional ? NULL : ERR_PTR(-ENOTSUPP);
 102}
 103
 104static inline struct reset_control *
 105of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
 106{
 107        return optional ? NULL : ERR_PTR(-ENOTSUPP);
 108}
 109
 110#endif /* CONFIG_RESET_CONTROLLER */
 111
 112/**
 113 * reset_control_get_exclusive - Lookup and obtain an exclusive reference
 114 *                               to a reset controller.
 115 * @dev: device to be reset by the controller
 116 * @id: reset line name
 117 *
 118 * Returns a struct reset_control or IS_ERR() condition containing errno.
 119 * If this function is called more then once for the same reset_control it will
 120 * return -EBUSY.
 121 *
 122 * See reset_control_get_shared for details on shared references to
 123 * reset-controls.
 124 *
 125 * Use of id names is optional.
 126 */
 127static inline struct reset_control *
 128__must_check reset_control_get_exclusive(struct device *dev, const char *id)
 129{
 130#ifndef CONFIG_RESET_CONTROLLER
 131        WARN_ON(1);
 132#endif
 133        return __reset_control_get(dev, id, 0, false, false);
 134}
 135
 136/**
 137 * reset_control_get_shared - Lookup and obtain a shared reference to a
 138 *                            reset controller.
 139 * @dev: device to be reset by the controller
 140 * @id: reset line name
 141 *
 142 * Returns a struct reset_control or IS_ERR() condition containing errno.
 143 * This function is intended for use with reset-controls which are shared
 144 * between hardware-blocks.
 145 *
 146 * When a reset-control is shared, the behavior of reset_control_assert /
 147 * deassert is changed, the reset-core will keep track of a deassert_count
 148 * and only (re-)assert the reset after reset_control_assert has been called
 149 * as many times as reset_control_deassert was called. Also see the remark
 150 * about shared reset-controls in the reset_control_assert docs.
 151 *
 152 * Calling reset_control_assert without first calling reset_control_deassert
 153 * is not allowed on a shared reset control. Calling reset_control_reset is
 154 * also not allowed on a shared reset control.
 155 *
 156 * Use of id names is optional.
 157 */
 158static inline struct reset_control *reset_control_get_shared(
 159                                        struct device *dev, const char *id)
 160{
 161        return __reset_control_get(dev, id, 0, true, false);
 162}
 163
 164static inline struct reset_control *reset_control_get_optional_exclusive(
 165                                        struct device *dev, const char *id)
 166{
 167        return __reset_control_get(dev, id, 0, false, true);
 168}
 169
 170static inline struct reset_control *reset_control_get_optional_shared(
 171                                        struct device *dev, const char *id)
 172{
 173        return __reset_control_get(dev, id, 0, true, true);
 174}
 175
 176/**
 177 * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
 178 *                                  to a reset controller.
 179 * @node: device to be reset by the controller
 180 * @id: reset line name
 181 *
 182 * Returns a struct reset_control or IS_ERR() condition containing errno.
 183 *
 184 * Use of id names is optional.
 185 */
 186static inline struct reset_control *of_reset_control_get_exclusive(
 187                                struct device_node *node, const char *id)
 188{
 189        return __of_reset_control_get(node, id, 0, false, false);
 190}
 191
 192/**
 193 * of_reset_control_get_shared - Lookup and obtain an shared reference
 194 *                               to a reset controller.
 195 * @node: device to be reset by the controller
 196 * @id: reset line name
 197 *
 198 * When a reset-control is shared, the behavior of reset_control_assert /
 199 * deassert is changed, the reset-core will keep track of a deassert_count
 200 * and only (re-)assert the reset after reset_control_assert has been called
 201 * as many times as reset_control_deassert was called. Also see the remark
 202 * about shared reset-controls in the reset_control_assert docs.
 203 *
 204 * Calling reset_control_assert without first calling reset_control_deassert
 205 * is not allowed on a shared reset control. Calling reset_control_reset is
 206 * also not allowed on a shared reset control.
 207 * Returns a struct reset_control or IS_ERR() condition containing errno.
 208 *
 209 * Use of id names is optional.
 210 */
 211static inline struct reset_control *of_reset_control_get_shared(
 212                                struct device_node *node, const char *id)
 213{
 214        return __of_reset_control_get(node, id, 0, true, false);
 215}
 216
 217/**
 218 * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
 219 *                                           reference to a reset controller
 220 *                                           by index.
 221 * @node: device to be reset by the controller
 222 * @index: index of the reset controller
 223 *
 224 * This is to be used to perform a list of resets for a device or power domain
 225 * in whatever order. Returns a struct reset_control or IS_ERR() condition
 226 * containing errno.
 227 */
 228static inline struct reset_control *of_reset_control_get_exclusive_by_index(
 229                                        struct device_node *node, int index)
 230{
 231        return __of_reset_control_get(node, NULL, index, false, false);
 232}
 233
 234/**
 235 * of_reset_control_get_shared_by_index - Lookup and obtain an shared
 236 *                                        reference to a reset controller
 237 *                                        by index.
 238 * @node: device to be reset by the controller
 239 * @index: index of the reset controller
 240 *
 241 * When a reset-control is shared, the behavior of reset_control_assert /
 242 * deassert is changed, the reset-core will keep track of a deassert_count
 243 * and only (re-)assert the reset after reset_control_assert has been called
 244 * as many times as reset_control_deassert was called. Also see the remark
 245 * about shared reset-controls in the reset_control_assert docs.
 246 *
 247 * Calling reset_control_assert without first calling reset_control_deassert
 248 * is not allowed on a shared reset control. Calling reset_control_reset is
 249 * also not allowed on a shared reset control.
 250 * Returns a struct reset_control or IS_ERR() condition containing errno.
 251 *
 252 * This is to be used to perform a list of resets for a device or power domain
 253 * in whatever order. Returns a struct reset_control or IS_ERR() condition
 254 * containing errno.
 255 */
 256static inline struct reset_control *of_reset_control_get_shared_by_index(
 257                                        struct device_node *node, int index)
 258{
 259        return __of_reset_control_get(node, NULL, index, true, false);
 260}
 261
 262/**
 263 * devm_reset_control_get_exclusive - resource managed
 264 *                                    reset_control_get_exclusive()
 265 * @dev: device to be reset by the controller
 266 * @id: reset line name
 267 *
 268 * Managed reset_control_get_exclusive(). For reset controllers returned
 269 * from this function, reset_control_put() is called automatically on driver
 270 * detach.
 271 *
 272 * See reset_control_get_exclusive() for more information.
 273 */
 274static inline struct reset_control *
 275__must_check devm_reset_control_get_exclusive(struct device *dev,
 276                                              const char *id)
 277{
 278#ifndef CONFIG_RESET_CONTROLLER
 279        WARN_ON(1);
 280#endif
 281        return __devm_reset_control_get(dev, id, 0, false, false);
 282}
 283
 284/**
 285 * devm_reset_control_get_shared - resource managed reset_control_get_shared()
 286 * @dev: device to be reset by the controller
 287 * @id: reset line name
 288 *
 289 * Managed reset_control_get_shared(). For reset controllers returned from
 290 * this function, reset_control_put() is called automatically on driver detach.
 291 * See reset_control_get_shared() for more information.
 292 */
 293static inline struct reset_control *devm_reset_control_get_shared(
 294                                        struct device *dev, const char *id)
 295{
 296        return __devm_reset_control_get(dev, id, 0, true, false);
 297}
 298
 299static inline struct reset_control *devm_reset_control_get_optional_exclusive(
 300                                        struct device *dev, const char *id)
 301{
 302        return __devm_reset_control_get(dev, id, 0, false, true);
 303}
 304
 305static inline struct reset_control *devm_reset_control_get_optional_shared(
 306                                        struct device *dev, const char *id)
 307{
 308        return __devm_reset_control_get(dev, id, 0, true, true);
 309}
 310
 311/**
 312 * devm_reset_control_get_exclusive_by_index - resource managed
 313 *                                             reset_control_get_exclusive()
 314 * @dev: device to be reset by the controller
 315 * @index: index of the reset controller
 316 *
 317 * Managed reset_control_get_exclusive(). For reset controllers returned from
 318 * this function, reset_control_put() is called automatically on driver
 319 * detach.
 320 *
 321 * See reset_control_get_exclusive() for more information.
 322 */
 323static inline struct reset_control *
 324devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
 325{
 326        return __devm_reset_control_get(dev, NULL, index, false, false);
 327}
 328
 329/**
 330 * devm_reset_control_get_shared_by_index - resource managed
 331 * reset_control_get_shared
 332 * @dev: device to be reset by the controller
 333 * @index: index of the reset controller
 334 *
 335 * Managed reset_control_get_shared(). For reset controllers returned from
 336 * this function, reset_control_put() is called automatically on driver detach.
 337 * See reset_control_get_shared() for more information.
 338 */
 339static inline struct reset_control *
 340devm_reset_control_get_shared_by_index(struct device *dev, int index)
 341{
 342        return __devm_reset_control_get(dev, NULL, index, true, false);
 343}
 344
 345/*
 346 * TEMPORARY calls to use during transition:
 347 *
 348 *   of_reset_control_get() => of_reset_control_get_exclusive()
 349 *
 350 * These inline function calls will be removed once all consumers
 351 * have been moved over to the new explicit API.
 352 */
 353static inline struct reset_control *reset_control_get(
 354                                struct device *dev, const char *id)
 355{
 356        return reset_control_get_exclusive(dev, id);
 357}
 358
 359static inline struct reset_control *reset_control_get_optional(
 360                                        struct device *dev, const char *id)
 361{
 362        return reset_control_get_optional_exclusive(dev, id);
 363}
 364
 365static inline struct reset_control *of_reset_control_get(
 366                                struct device_node *node, const char *id)
 367{
 368        return of_reset_control_get_exclusive(node, id);
 369}
 370
 371static inline struct reset_control *of_reset_control_get_by_index(
 372                                struct device_node *node, int index)
 373{
 374        return of_reset_control_get_exclusive_by_index(node, index);
 375}
 376
 377static inline struct reset_control *devm_reset_control_get(
 378                                struct device *dev, const char *id)
 379{
 380        return devm_reset_control_get_exclusive(dev, id);
 381}
 382
 383static inline struct reset_control *devm_reset_control_get_optional(
 384                                struct device *dev, const char *id)
 385{
 386        return devm_reset_control_get_optional_exclusive(dev, id);
 387
 388}
 389
 390static inline struct reset_control *devm_reset_control_get_by_index(
 391                                struct device *dev, int index)
 392{
 393        return devm_reset_control_get_exclusive_by_index(dev, index);
 394}
 395
 396/*
 397 * APIs to manage a list of reset controllers
 398 */
 399static inline struct reset_control *
 400devm_reset_control_array_get_exclusive(struct device *dev)
 401{
 402        return devm_reset_control_array_get(dev, false, false);
 403}
 404
 405static inline struct reset_control *
 406devm_reset_control_array_get_shared(struct device *dev)
 407{
 408        return devm_reset_control_array_get(dev, true, false);
 409}
 410
 411static inline struct reset_control *
 412devm_reset_control_array_get_optional_exclusive(struct device *dev)
 413{
 414        return devm_reset_control_array_get(dev, false, true);
 415}
 416
 417static inline struct reset_control *
 418devm_reset_control_array_get_optional_shared(struct device *dev)
 419{
 420        return devm_reset_control_array_get(dev, true, true);
 421}
 422
 423static inline struct reset_control *
 424of_reset_control_array_get_exclusive(struct device_node *node)
 425{
 426        return of_reset_control_array_get(node, false, false);
 427}
 428
 429static inline struct reset_control *
 430of_reset_control_array_get_shared(struct device_node *node)
 431{
 432        return of_reset_control_array_get(node, true, false);
 433}
 434
 435static inline struct reset_control *
 436of_reset_control_array_get_optional_exclusive(struct device_node *node)
 437{
 438        return of_reset_control_array_get(node, false, true);
 439}
 440
 441static inline struct reset_control *
 442of_reset_control_array_get_optional_shared(struct device_node *node)
 443{
 444        return of_reset_control_array_get(node, true, true);
 445}
 446#endif
 447