cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gpiolib-devres.c (14085B)


      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);