linux/drivers/gpio/gpiolib-devres.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * devres.c - managed gpio resources
   4 * This file is based on kernel/irq/devres.c
   5 *
   6 * Copyright (c) 2011 John Crispin <john@phrozen.org>
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/err.h>
  11#include <linux/gpio.h>
  12#include <linux/gpio/consumer.h>
  13#include <linux/device.h>
  14#include <linux/gfp.h>
  15
  16#include "gpiolib.h"
  17
  18static void devm_gpiod_release(struct device *dev, void *res)
  19{
  20        struct gpio_desc **desc = res;
  21
  22        gpiod_put(*desc);
  23}
  24
  25static int devm_gpiod_match(struct device *dev, void *res, void *data)
  26{
  27        struct gpio_desc **this = res, **gpio = data;
  28
  29        return *this == *gpio;
  30}
  31
  32static void devm_gpiod_release_array(struct device *dev, void *res)
  33{
  34        struct gpio_descs **descs = res;
  35
  36        gpiod_put_array(*descs);
  37}
  38
  39static int devm_gpiod_match_array(struct device *dev, void *res, void *data)
  40{
  41        struct gpio_descs **this = res, **gpios = data;
  42
  43        return *this == *gpios;
  44}
  45
  46/**
  47 * devm_gpiod_get - Resource-managed gpiod_get()
  48 * @dev:        GPIO consumer
  49 * @con_id:     function within the GPIO consumer
  50 * @flags:      optional GPIO initialization flags
  51 *
  52 * Managed gpiod_get(). GPIO descriptors returned from this function are
  53 * automatically disposed on driver detach. See gpiod_get() for detailed
  54 * information about behavior and return values.
  55 */
  56struct gpio_desc *__must_check devm_gpiod_get(struct device *dev,
  57                                              const char *con_id,
  58                                              enum gpiod_flags flags)
  59{
  60        return devm_gpiod_get_index(dev, con_id, 0, flags);
  61}
  62EXPORT_SYMBOL_GPL(devm_gpiod_get);
  63
  64/**
  65 * devm_gpiod_get_optional - Resource-managed gpiod_get_optional()
  66 * @dev: GPIO consumer
  67 * @con_id: function within the GPIO consumer
  68 * @flags: optional GPIO initialization flags
  69 *
  70 * Managed gpiod_get_optional(). GPIO descriptors returned from this function
  71 * are automatically disposed on driver detach. See gpiod_get_optional() for
  72 * detailed information about behavior and return values.
  73 */
  74struct gpio_desc *__must_check devm_gpiod_get_optional(struct device *dev,
  75                                                       const char *con_id,
  76                                                       enum gpiod_flags flags)
  77{
  78        return devm_gpiod_get_index_optional(dev, con_id, 0, flags);
  79}
  80EXPORT_SYMBOL_GPL(devm_gpiod_get_optional);
  81
  82/**
  83 * devm_gpiod_get_index - Resource-managed gpiod_get_index()
  84 * @dev:        GPIO consumer
  85 * @con_id:     function within the GPIO consumer
  86 * @idx:        index of the GPIO to obtain in the consumer
  87 * @flags:      optional GPIO initialization flags
  88 *
  89 * Managed gpiod_get_index(). GPIO descriptors returned from this function are
  90 * automatically disposed on driver detach. See gpiod_get_index() for detailed
  91 * information about behavior and return values.
  92 */
  93struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev,
  94                                                    const char *con_id,
  95                                                    unsigned int idx,
  96                                                    enum gpiod_flags flags)
  97{
  98        struct gpio_desc **dr;
  99        struct gpio_desc *desc;
 100
 101        desc = gpiod_get_index(dev, con_id, idx, flags);
 102        if (IS_ERR(desc))
 103                return desc;
 104
 105        /*
 106         * For non-exclusive GPIO descriptors, check if this descriptor is
 107         * already under resource management by this device.
 108         */
 109        if (flags & GPIOD_FLAGS_BIT_NONEXCLUSIVE) {
 110                struct devres *dres;
 111
 112                dres = devres_find(dev, devm_gpiod_release,
 113                                   devm_gpiod_match, &desc);
 114                if (dres)
 115                        return desc;
 116        }
 117
 118        dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *),
 119                          GFP_KERNEL);
 120        if (!dr) {
 121                gpiod_put(desc);
 122                return ERR_PTR(-ENOMEM);
 123        }
 124
 125        *dr = desc;
 126        devres_add(dev, dr);
 127
 128        return desc;
 129}
 130EXPORT_SYMBOL_GPL(devm_gpiod_get_index);
 131
 132/**
 133 * devm_gpiod_get_from_of_node() - obtain a GPIO from an OF node
 134 * @dev:        device for lifecycle management
 135 * @node:       handle of the OF node
 136 * @propname:   name of the DT property representing the GPIO
 137 * @index:      index of the GPIO to obtain for the consumer
 138 * @dflags:     GPIO initialization flags
 139 * @label:      label to attach to the requested GPIO
 140 *
 141 * Returns:
 142 * On successful request the GPIO pin is configured in accordance with
 143 * provided @dflags.
 144 *
 145 * In case of error an ERR_PTR() is returned.
 146 */
 147struct gpio_desc *devm_gpiod_get_from_of_node(struct device *dev,
 148                                              const struct device_node *node,
 149                                              const char *propname, int index,
 150                                              enum gpiod_flags dflags,
 151                                              const char *label)
 152{
 153        struct gpio_desc **dr;
 154        struct gpio_desc *desc;
 155
 156        desc = gpiod_get_from_of_node(node, propname, index, dflags, label);
 157        if (IS_ERR(desc))
 158                return desc;
 159
 160        /*
 161         * For non-exclusive GPIO descriptors, check if this descriptor is
 162         * already under resource management by this device.
 163         */
 164        if (dflags & GPIOD_FLAGS_BIT_NONEXCLUSIVE) {
 165                struct devres *dres;
 166
 167                dres = devres_find(dev, devm_gpiod_release,
 168                                   devm_gpiod_match, &desc);
 169                if (dres)
 170                        return desc;
 171        }
 172
 173        dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *),
 174                          GFP_KERNEL);
 175        if (!dr) {
 176                gpiod_put(desc);
 177                return ERR_PTR(-ENOMEM);
 178        }
 179
 180        *dr = desc;
 181        devres_add(dev, dr);
 182
 183        return desc;
 184}
 185EXPORT_SYMBOL_GPL(devm_gpiod_get_from_of_node);
 186
 187/**
 188 * devm_fwnode_gpiod_get_index - get a GPIO descriptor from a given node
 189 * @dev:        GPIO consumer
 190 * @fwnode:     firmware node containing GPIO reference
 191 * @con_id:     function within the GPIO consumer
 192 * @index:      index of the GPIO to obtain in the consumer
 193 * @flags:      GPIO initialization flags
 194 * @label:      label to attach to the requested GPIO
 195 *
 196 * GPIO descriptors returned from this function are automatically disposed on
 197 * driver detach.
 198 *
 199 * On successful request the GPIO pin is configured in accordance with
 200 * provided @flags.
 201 */
 202struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 203                                              struct fwnode_handle *fwnode,
 204                                              const char *con_id, int index,
 205                                              enum gpiod_flags flags,
 206                                              const char *label)
 207{
 208        struct gpio_desc **dr;
 209        struct gpio_desc *desc;
 210
 211        dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *),
 212                          GFP_KERNEL);
 213        if (!dr)
 214                return ERR_PTR(-ENOMEM);
 215
 216        desc = fwnode_gpiod_get_index(fwnode, con_id, index, flags, label);
 217        if (IS_ERR(desc)) {
 218                devres_free(dr);
 219                return desc;
 220        }
 221
 222        *dr = desc;
 223        devres_add(dev, dr);
 224
 225        return desc;
 226}
 227EXPORT_SYMBOL_GPL(devm_fwnode_gpiod_get_index);
 228
 229/**
 230 * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional()
 231 * @dev: GPIO consumer
 232 * @con_id: function within the GPIO consumer
 233 * @index: index of the GPIO to obtain in the consumer
 234 * @flags: optional GPIO initialization flags
 235 *
 236 * Managed gpiod_get_index_optional(). GPIO descriptors returned from this
 237 * function are automatically disposed on driver detach. See
 238 * gpiod_get_index_optional() for detailed information about behavior and
 239 * return values.
 240 */
 241struct gpio_desc *__must_check devm_gpiod_get_index_optional(struct device *dev,
 242                                                             const char *con_id,
 243                                                             unsigned int index,
 244                                                             enum gpiod_flags flags)
 245{
 246        struct gpio_desc *desc;
 247
 248        desc = devm_gpiod_get_index(dev, con_id, index, flags);
 249        if (gpiod_not_found(desc))
 250                return NULL;
 251
 252        return desc;
 253}
 254EXPORT_SYMBOL_GPL(devm_gpiod_get_index_optional);
 255
 256/**
 257 * devm_gpiod_get_array - Resource-managed gpiod_get_array()
 258 * @dev:        GPIO consumer
 259 * @con_id:     function within the GPIO consumer
 260 * @flags:      optional GPIO initialization flags
 261 *
 262 * Managed gpiod_get_array(). GPIO descriptors returned from this function are
 263 * automatically disposed on driver detach. See gpiod_get_array() for detailed
 264 * information about behavior and return values.
 265 */
 266struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev,
 267                                                     const char *con_id,
 268                                                     enum gpiod_flags flags)
 269{
 270        struct gpio_descs **dr;
 271        struct gpio_descs *descs;
 272
 273        dr = devres_alloc(devm_gpiod_release_array,
 274                          sizeof(struct gpio_descs *), GFP_KERNEL);
 275        if (!dr)
 276                return ERR_PTR(-ENOMEM);
 277
 278        descs = gpiod_get_array(dev, con_id, flags);
 279        if (IS_ERR(descs)) {
 280                devres_free(dr);
 281                return descs;
 282        }
 283
 284        *dr = descs;
 285        devres_add(dev, dr);
 286
 287        return descs;
 288}
 289EXPORT_SYMBOL_GPL(devm_gpiod_get_array);
 290
 291/**
 292 * devm_gpiod_get_array_optional - Resource-managed gpiod_get_array_optional()
 293 * @dev:        GPIO consumer
 294 * @con_id:     function within the GPIO consumer
 295 * @flags:      optional GPIO initialization flags
 296 *
 297 * Managed gpiod_get_array_optional(). GPIO descriptors returned from this
 298 * function are automatically disposed on driver detach.
 299 * See gpiod_get_array_optional() for detailed information about behavior and
 300 * return values.
 301 */
 302struct gpio_descs *__must_check
 303devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
 304                              enum gpiod_flags flags)
 305{
 306        struct gpio_descs *descs;
 307
 308        descs = devm_gpiod_get_array(dev, con_id, flags);
 309        if (gpiod_not_found(descs))
 310                return NULL;
 311
 312        return descs;
 313}
 314EXPORT_SYMBOL_GPL(devm_gpiod_get_array_optional);
 315
 316/**
 317 * devm_gpiod_put - Resource-managed gpiod_put()
 318 * @dev:        GPIO consumer
 319 * @desc:       GPIO descriptor to dispose of
 320 *
 321 * Dispose of a GPIO descriptor obtained with devm_gpiod_get() or
 322 * devm_gpiod_get_index(). Normally this function will not be called as the GPIO
 323 * will be disposed of by the resource management code.
 324 */
 325void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
 326{
 327        WARN_ON(devres_release(dev, devm_gpiod_release, devm_gpiod_match,
 328                &desc));
 329}
 330EXPORT_SYMBOL_GPL(devm_gpiod_put);
 331
 332/**
 333 * devm_gpiod_unhinge - Remove resource management from a gpio descriptor
 334 * @dev:        GPIO consumer
 335 * @desc:       GPIO descriptor to remove resource management from
 336 *
 337 * Remove resource management from a GPIO descriptor. This is needed when
 338 * you want to hand over lifecycle management of a descriptor to another
 339 * mechanism.
 340 */
 341
 342void devm_gpiod_unhinge(struct device *dev, struct gpio_desc *desc)
 343{
 344        int ret;
 345
 346        if (IS_ERR_OR_NULL(desc))
 347                return;
 348        ret = devres_destroy(dev, devm_gpiod_release,
 349                             devm_gpiod_match, &desc);
 350        /*
 351         * If the GPIO descriptor is requested as nonexclusive, we
 352         * may call this function several times on the same descriptor
 353         * so it is OK if devres_destroy() returns -ENOENT.
 354         */
 355        if (ret == -ENOENT)
 356                return;
 357        /* Anything else we should warn about */
 358        WARN_ON(ret);
 359}
 360EXPORT_SYMBOL_GPL(devm_gpiod_unhinge);
 361
 362/**
 363 * devm_gpiod_put_array - Resource-managed gpiod_put_array()
 364 * @dev:        GPIO consumer
 365 * @descs:      GPIO descriptor array to dispose of
 366 *
 367 * Dispose of an array of GPIO descriptors obtained with devm_gpiod_get_array().
 368 * Normally this function will not be called as the GPIOs will be disposed of
 369 * by the resource management code.
 370 */
 371void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)
 372{
 373        WARN_ON(devres_release(dev, devm_gpiod_release_array,
 374                               devm_gpiod_match_array, &descs));
 375}
 376EXPORT_SYMBOL_GPL(devm_gpiod_put_array);
 377
 378
 379
 380
 381static void devm_gpio_release(struct device *dev, void *res)
 382{
 383        unsigned *gpio = res;
 384
 385        gpio_free(*gpio);
 386}
 387
 388static int devm_gpio_match(struct device *dev, void *res, void *data)
 389{
 390        unsigned *this = res, *gpio = data;
 391
 392        return *this == *gpio;
 393}
 394
 395/**
 396 *      devm_gpio_request - request a GPIO for a managed device
 397 *      @dev: device to request the GPIO for
 398 *      @gpio: GPIO to allocate
 399 *      @label: the name of the requested GPIO
 400 *
 401 *      Except for the extra @dev argument, this function takes the
 402 *      same arguments and performs the same function as
 403 *      gpio_request().  GPIOs requested with this function will be
 404 *      automatically freed on driver detach.
 405 *
 406 *      If an GPIO allocated with this function needs to be freed
 407 *      separately, devm_gpio_free() must be used.
 408 */
 409
 410int devm_gpio_request(struct device *dev, unsigned gpio, const char *label)
 411{
 412        unsigned *dr;
 413        int rc;
 414
 415        dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL);
 416        if (!dr)
 417                return -ENOMEM;
 418
 419        rc = gpio_request(gpio, label);
 420        if (rc) {
 421                devres_free(dr);
 422                return rc;
 423        }
 424
 425        *dr = gpio;
 426        devres_add(dev, dr);
 427
 428        return 0;
 429}
 430EXPORT_SYMBOL_GPL(devm_gpio_request);
 431
 432/**
 433 *      devm_gpio_request_one - request a single GPIO with initial setup
 434 *      @dev:   device to request for
 435 *      @gpio:  the GPIO number
 436 *      @flags: GPIO configuration as specified by GPIOF_*
 437 *      @label: a literal description string of this GPIO
 438 */
 439int devm_gpio_request_one(struct device *dev, unsigned gpio,
 440                          unsigned long flags, const char *label)
 441{
 442        unsigned *dr;
 443        int rc;
 444
 445        dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL);
 446        if (!dr)
 447                return -ENOMEM;
 448
 449        rc = gpio_request_one(gpio, flags, label);
 450        if (rc) {
 451                devres_free(dr);
 452                return rc;
 453        }
 454
 455        *dr = gpio;
 456        devres_add(dev, dr);
 457
 458        return 0;
 459}
 460EXPORT_SYMBOL_GPL(devm_gpio_request_one);
 461
 462/**
 463 *      devm_gpio_free - free a GPIO
 464 *      @dev: device to free GPIO for
 465 *      @gpio: GPIO to free
 466 *
 467 *      Except for the extra @dev argument, this function takes the
 468 *      same arguments and performs the same function as gpio_free().
 469 *      This function instead of gpio_free() should be used to manually
 470 *      free GPIOs allocated with devm_gpio_request().
 471 */
 472void devm_gpio_free(struct device *dev, unsigned int gpio)
 473{
 474
 475        WARN_ON(devres_release(dev, devm_gpio_release, devm_gpio_match,
 476                &gpio));
 477}
 478EXPORT_SYMBOL_GPL(devm_gpio_free);
 479
 480static void devm_gpio_chip_release(void *data)
 481{
 482        struct gpio_chip *gc = data;
 483
 484        gpiochip_remove(gc);
 485}
 486
 487/**
 488 * devm_gpiochip_add_data_with_key() - Resource managed gpiochip_add_data_with_key()
 489 * @dev: pointer to the device that gpio_chip belongs to.
 490 * @gc: the GPIO chip to register
 491 * @data: driver-private data associated with this chip
 492 * @lock_key: lockdep class for IRQ lock
 493 * @request_key: lockdep class for IRQ request
 494 *
 495 * Context: potentially before irqs will work
 496 *
 497 * The gpio chip automatically be released when the device is unbound.
 498 *
 499 * Returns:
 500 * A negative errno if the chip can't be registered, such as because the
 501 * gc->base is invalid or already associated with a different chip.
 502 * Otherwise it returns zero as a success code.
 503 */
 504int devm_gpiochip_add_data_with_key(struct device *dev, struct gpio_chip *gc, void *data,
 505                                    struct lock_class_key *lock_key,
 506                                    struct lock_class_key *request_key)
 507{
 508        int ret;
 509
 510        ret = gpiochip_add_data_with_key(gc, data, lock_key, request_key);
 511        if (ret < 0)
 512                return ret;
 513
 514        return devm_add_action_or_reset(dev, devm_gpio_chip_release, gc);
 515}
 516EXPORT_SYMBOL_GPL(devm_gpiochip_add_data_with_key);
 517