at v3.5 119 lines 3.0 kB view raw
1/* 2 * drivers/gpio/devres.c - managed gpio resources 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 6 * as published by the Free Software Foundation. 7 * 8 * You should have received a copy of the GNU General Public License 9 * along with this program; if not, write to the Free Software 10 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 11 * 12 * This file is based on kernel/irq/devres.c 13 * 14 * Copyright (c) 2011 John Crispin <blogic@openwrt.org> 15 */ 16 17#include <linux/module.h> 18#include <linux/gpio.h> 19#include <linux/device.h> 20#include <linux/gfp.h> 21 22static void devm_gpio_release(struct device *dev, void *res) 23{ 24 unsigned *gpio = res; 25 26 gpio_free(*gpio); 27} 28 29static int devm_gpio_match(struct device *dev, void *res, void *data) 30{ 31 unsigned *this = res, *gpio = data; 32 33 return *this == *gpio; 34} 35 36/** 37 * devm_gpio_request - request a gpio for a managed device 38 * @dev: device to request the gpio for 39 * @gpio: gpio to allocate 40 * @label: the name of the requested gpio 41 * 42 * Except for the extra @dev argument, this function takes the 43 * same arguments and performs the same function as 44 * gpio_request(). GPIOs requested with this function will be 45 * automatically freed on driver detach. 46 * 47 * If an GPIO allocated with this function needs to be freed 48 * separately, devm_gpio_free() must be used. 49 */ 50 51int devm_gpio_request(struct device *dev, unsigned gpio, const char *label) 52{ 53 unsigned *dr; 54 int rc; 55 56 dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); 57 if (!dr) 58 return -ENOMEM; 59 60 rc = gpio_request(gpio, label); 61 if (rc) { 62 devres_free(dr); 63 return rc; 64 } 65 66 *dr = gpio; 67 devres_add(dev, dr); 68 69 return 0; 70} 71EXPORT_SYMBOL(devm_gpio_request); 72 73/** 74 * devm_gpio_request_one - request a single GPIO with initial setup 75 * @dev: device to request for 76 * @gpio: the GPIO number 77 * @flags: GPIO configuration as specified by GPIOF_* 78 * @label: a literal description string of this GPIO 79 */ 80int devm_gpio_request_one(struct device *dev, unsigned gpio, 81 unsigned long flags, const char *label) 82{ 83 unsigned *dr; 84 int rc; 85 86 dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); 87 if (!dr) 88 return -ENOMEM; 89 90 rc = gpio_request_one(gpio, flags, label); 91 if (rc) { 92 devres_free(dr); 93 return rc; 94 } 95 96 *dr = gpio; 97 devres_add(dev, dr); 98 99 return 0; 100} 101EXPORT_SYMBOL(devm_gpio_request_one); 102 103/** 104 * devm_gpio_free - free an interrupt 105 * @dev: device to free gpio for 106 * @gpio: gpio to free 107 * 108 * Except for the extra @dev argument, this function takes the 109 * same arguments and performs the same function as gpio_free(). 110 * This function instead of gpio_free() should be used to manually 111 * free GPIOs allocated with devm_gpio_request(). 112 */ 113void devm_gpio_free(struct device *dev, unsigned int gpio) 114{ 115 116 WARN_ON(devres_release(dev, devm_gpio_release, devm_gpio_match, 117 &gpio)); 118} 119EXPORT_SYMBOL(devm_gpio_free);