cregit-Linux how code gets into the kernel

Release 4.7 drivers/gpio/devres.c

Directory: drivers/gpio
/*
 * drivers/gpio/devres.c - managed gpio resources
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * This file is based on kernel/irq/devres.c
 *
 * Copyright (c) 2011 John Crispin <blogic@openwrt.org>
 */

#include <linux/module.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/device.h>
#include <linux/gfp.h>


static void devm_gpiod_release(struct device *dev, void *res) { struct gpio_desc **desc = res; gpiod_put(*desc); }

Contributors

PersonTokensPropCommitsCommitProp
alexandre courbotalexandre courbot29100.00%1100.00%
Total29100.00%1100.00%


static int devm_gpiod_match(struct device *dev, void *res, void *data) { struct gpio_desc **this = res, **gpio = data; return *this == *gpio; }

Contributors

PersonTokensPropCommitsCommitProp
alexandre courbotalexandre courbot40100.00%1100.00%
Total40100.00%1100.00%


static void devm_gpiod_release_array(struct device *dev, void *res) { struct gpio_descs **descs = res; gpiod_put_array(*descs); }

Contributors

PersonTokensPropCommitsCommitProp
rojhalat ibrahimrojhalat ibrahim29100.00%1100.00%
Total29100.00%1100.00%


static int devm_gpiod_match_array(struct device *dev, void *res, void *data) { struct gpio_descs **this = res, **gpios = data; return *this == *gpios; }

Contributors

PersonTokensPropCommitsCommitProp
rojhalat ibrahimrojhalat ibrahim40100.00%1100.00%
Total40100.00%1100.00%

/** * devm_gpiod_get - Resource-managed gpiod_get() * @dev: GPIO consumer * @con_id: function within the GPIO consumer * @flags: optional GPIO initialization flags * * Managed gpiod_get(). GPIO descriptors returned from this function are * automatically disposed on driver detach. See gpiod_get() for detailed * information about behavior and return values. */
struct gpio_desc *__must_check devm_gpiod_get(struct device *dev, const char *con_id, enum gpiod_flags flags) { return devm_gpiod_get_index(dev, con_id, 0, flags); }

Contributors

PersonTokensPropCommitsCommitProp
alexandre courbotalexandre courbot3397.06%266.67%
uwe kleine-koeniguwe kleine-koenig12.94%133.33%
Total34100.00%3100.00%

EXPORT_SYMBOL(devm_gpiod_get); /** * devm_gpiod_get_optional - Resource-managed gpiod_get_optional() * @dev: GPIO consumer * @con_id: function within the GPIO consumer * @flags: optional GPIO initialization flags * * Managed gpiod_get_optional(). GPIO descriptors returned from this function * are automatically disposed on driver detach. See gpiod_get_optional() for * detailed information about behavior and return values. */
struct gpio_desc *__must_check devm_gpiod_get_optional(struct device *dev, const char *con_id, enum gpiod_flags flags) { return devm_gpiod_get_index_optional(dev, con_id, 0, flags); }

Contributors

PersonTokensPropCommitsCommitProp
thierry redingthierry reding2779.41%133.33%
alexandre courbotalexandre courbot617.65%133.33%
uwe kleine-koeniguwe kleine-koenig12.94%133.33%
Total34100.00%3100.00%

EXPORT_SYMBOL(devm_gpiod_get_optional); /** * devm_gpiod_get_index - Resource-managed gpiod_get_index() * @dev: GPIO consumer * @con_id: function within the GPIO consumer * @idx: index of the GPIO to obtain in the consumer * @flags: optional GPIO initialization flags * * Managed gpiod_get_index(). GPIO descriptors returned from this function are * automatically disposed on driver detach. See gpiod_get_index() for detailed * information about behavior and return values. */
struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev, const char *con_id, unsigned int idx, enum gpiod_flags flags) { struct gpio_desc **dr; struct gpio_desc *desc; dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *), GFP_KERNEL); if (!dr) return ERR_PTR(-ENOMEM); desc = gpiod_get_index(dev, con_id, idx, flags); if (IS_ERR(desc)) { devres_free(dr); return desc; } *dr = desc; devres_add(dev, dr); return desc; }

Contributors

PersonTokensPropCommitsCommitProp
alexandre courbotalexandre courbot10898.18%360.00%
julia lawalljulia lawall10.91%120.00%
uwe kleine-koeniguwe kleine-koenig10.91%120.00%
Total110100.00%5100.00%

EXPORT_SYMBOL(devm_gpiod_get_index); /** * devm_get_gpiod_from_child - get a GPIO descriptor from a device's child node * @dev: GPIO consumer * @con_id: function within the GPIO consumer * @child: firmware node (child of @dev) * * GPIO descriptors returned from this function are automatically disposed on * driver detach. */
struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, const char *con_id, struct fwnode_handle *child) { static const char * const suffixes[] = { "gpios", "gpio" }; char prop_name[32]; /* 32 is max size of property name */ struct gpio_desc **dr; struct gpio_desc *desc; unsigned int i; dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *), GFP_KERNEL); if (!dr) return ERR_PTR(-ENOMEM); for (i = 0; i < ARRAY_SIZE(suffixes); i++) { if (con_id) snprintf(prop_name, sizeof(prop_name), "%s-%s", con_id, suffixes[i]); else snprintf(prop_name, sizeof(prop_name), "%s", suffixes[i]); desc = fwnode_get_named_gpiod(child, prop_name); if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT)) break; } if (IS_ERR(desc)) { devres_free(dr); return desc; } *dr = desc; devres_add(dev, dr); return desc; }

Contributors

PersonTokensPropCommitsCommitProp
oliver schinagloliver schinagl10651.71%125.00%
mika westerbergmika westerberg9646.83%125.00%
geert uytterhoevengeert uytterhoeven20.98%125.00%
linus walleijlinus walleij10.49%125.00%
Total205100.00%4100.00%

EXPORT_SYMBOL(devm_get_gpiod_from_child); /** * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional() * @dev: GPIO consumer * @con_id: function within the GPIO consumer * @index: index of the GPIO to obtain in the consumer * @flags: optional GPIO initialization flags * * Managed gpiod_get_index_optional(). GPIO descriptors returned from this * function are automatically disposed on driver detach. See * gpiod_get_index_optional() for detailed information about behavior and * return values. */
struct gpio_desc *__must_check devm_gpiod_get_index_optional(struct device *dev, const char *con_id, unsigned int index, enum gpiod_flags flags) { struct gpio_desc *desc; desc = devm_gpiod_get_index(dev, con_id, index, flags); if (IS_ERR(desc)) { if (PTR_ERR(desc) == -ENOENT) return NULL; } return desc; }

Contributors

PersonTokensPropCommitsCommitProp
thierry redingthierry reding6289.86%133.33%
alexandre courbotalexandre courbot68.70%133.33%
uwe kleine-koeniguwe kleine-koenig11.45%133.33%
Total69100.00%3100.00%

EXPORT_SYMBOL(devm_gpiod_get_index_optional); /** * devm_gpiod_get_array - Resource-managed gpiod_get_array() * @dev: GPIO consumer * @con_id: function within the GPIO consumer * @flags: optional GPIO initialization flags * * Managed gpiod_get_array(). GPIO descriptors returned from this function are * automatically disposed on driver detach. See gpiod_get_array() for detailed * information about behavior and return values. */
struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev, const char *con_id, enum gpiod_flags flags) { struct gpio_descs **dr; struct gpio_descs *descs; dr = devres_alloc(devm_gpiod_release_array, sizeof(struct gpio_descs *), GFP_KERNEL); if (!dr) return ERR_PTR(-ENOMEM); descs = gpiod_get_array(dev, con_id, flags); if (IS_ERR(descs)) { devres_free(dr); return descs; } *dr = descs; devres_add(dev, dr); return descs; }

Contributors

PersonTokensPropCommitsCommitProp
rojhalat ibrahimrojhalat ibrahim104100.00%1100.00%
Total104100.00%1100.00%

EXPORT_SYMBOL(devm_gpiod_get_array); /** * devm_gpiod_get_array_optional - Resource-managed gpiod_get_array_optional() * @dev: GPIO consumer * @con_id: function within the GPIO consumer * @flags: optional GPIO initialization flags * * Managed gpiod_get_array_optional(). GPIO descriptors returned from this * function are automatically disposed on driver detach. * See gpiod_get_array_optional() for detailed information about behavior and * return values. */
struct gpio_descs *__must_check devm_gpiod_get_array_optional(struct device *dev, const char *con_id, enum gpiod_flags flags) { struct gpio_descs *descs; descs = devm_gpiod_get_array(dev, con_id, flags); if (IS_ERR(descs) && (PTR_ERR(descs) == -ENOENT)) return NULL; return descs; }

Contributors

PersonTokensPropCommitsCommitProp
rojhalat ibrahimrojhalat ibrahim61100.00%1100.00%
Total61100.00%1100.00%

EXPORT_SYMBOL(devm_gpiod_get_array_optional); /** * devm_gpiod_put - Resource-managed gpiod_put() * @desc: GPIO descriptor to dispose of * * Dispose of a GPIO descriptor obtained with devm_gpiod_get() or * devm_gpiod_get_index(). Normally this function will not be called as the GPIO * will be disposed of by the resource management code. */
void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) { WARN_ON(devres_release(dev, devm_gpiod_release, devm_gpiod_match, &desc)); }

Contributors

PersonTokensPropCommitsCommitProp
alexandre courbotalexandre courbot30100.00%1100.00%
Total30100.00%1100.00%

EXPORT_SYMBOL(devm_gpiod_put); /** * devm_gpiod_put_array - Resource-managed gpiod_put_array() * @descs: GPIO descriptor array to dispose of * * Dispose of an array of GPIO descriptors obtained with devm_gpiod_get_array(). * Normally this function will not be called as the GPIOs will be disposed of * by the resource management code. */
void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs) { WARN_ON(devres_release(dev, devm_gpiod_release_array, devm_gpiod_match_array, &descs)); }

Contributors

PersonTokensPropCommitsCommitProp
rojhalat ibrahimrojhalat ibrahim30100.00%1100.00%
Total30100.00%1100.00%

EXPORT_SYMBOL(devm_gpiod_put_array);
static void devm_gpio_release(struct device *dev, void *res) { unsigned *gpio = res; gpio_free(*gpio); }

Contributors

PersonTokensPropCommitsCommitProp
john crispinjohn crispin27100.00%1100.00%
Total27100.00%1100.00%


static int devm_gpio_match(struct device *dev, void *res, void *data) { unsigned *this = res, *gpio = data; return *this == *gpio; }

Contributors

PersonTokensPropCommitsCommitProp
john crispinjohn crispin37100.00%1100.00%
Total37100.00%1100.00%

/** * devm_gpio_request - request a GPIO for a managed device * @dev: device to request the GPIO for * @gpio: GPIO to allocate * @label: the name of the requested GPIO * * Except for the extra @dev argument, this function takes the * same arguments and performs the same function as * gpio_request(). GPIOs requested with this function will be * automatically freed on driver detach. * * If an GPIO allocated with this function needs to be freed * separately, devm_gpio_free() must be used. */
int devm_gpio_request(struct device *dev, unsigned gpio, const char *label) { unsigned *dr; int rc; dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); if (!dr) return -ENOMEM; rc = gpio_request(gpio, label); if (rc) { devres_free(dr); return rc; } *dr = gpio; devres_add(dev, dr); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
john crispinjohn crispin86100.00%1100.00%
Total86100.00%1100.00%

EXPORT_SYMBOL(devm_gpio_request); /** * devm_gpio_request_one - request a single GPIO with initial setup * @dev: device to request for * @gpio: the GPIO number * @flags: GPIO configuration as specified by GPIOF_* * @label: a literal description string of this GPIO */
int devm_gpio_request_one(struct device *dev, unsigned gpio, unsigned long flags, const char *label) { unsigned *dr; int rc; dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); if (!dr) return -ENOMEM; rc = gpio_request_one(gpio, flags, label); if (rc) { devres_free(dr); return rc; } *dr = gpio; devres_add(dev, dr); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
mark brownmark brown92100.00%1100.00%
Total92100.00%1100.00%

EXPORT_SYMBOL(devm_gpio_request_one); /** * devm_gpio_free - free a GPIO * @dev: device to free GPIO for * @gpio: GPIO to free * * Except for the extra @dev argument, this function takes the * same arguments and performs the same function as gpio_free(). * This function instead of gpio_free() should be used to manually * free GPIOs allocated with devm_gpio_request(). */
void devm_gpio_free(struct device *dev, unsigned int gpio) { WARN_ON(devres_release(dev, devm_gpio_release, devm_gpio_match, &gpio)); }

Contributors

PersonTokensPropCommitsCommitProp
john crispinjohn crispin2896.55%150.00%
mark brownmark brown13.45%150.00%
Total29100.00%2100.00%

EXPORT_SYMBOL(devm_gpio_free);

Overall Contributors

PersonTokensPropCommitsCommitProp
rojhalat ibrahimrojhalat ibrahim28223.96%15.88%
alexandre courbotalexandre courbot27623.45%423.53%
john crispinjohn crispin20117.08%15.88%
oliver schinagloliver schinagl1079.09%15.88%
mika westerbergmika westerberg1018.58%15.88%
thierry redingthierry reding978.24%15.88%
mark brownmark brown947.99%211.76%
uwe kleine-koeniguwe kleine-koenig80.68%15.88%
stephen warrenstephen warren50.42%15.88%
geert uytterhoevengeert uytterhoeven20.17%15.88%
wolfram sangwolfram sang20.17%15.88%
julia lawalljulia lawall10.08%15.88%
linus walleijlinus walleij10.08%15.88%
Total1177100.00%17100.00%
Directory: drivers/gpio
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}