forked from mirrors/linux
		
	 dae5f0afcf
			
		
	
	
		dae5f0afcf
		
	
	
	
	
		
			
			Use the SPDX headers and cut down on boilerplate to indicate the license in the core gpiolib implementation. Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| #include <linux/gpio/consumer.h>
 | |
| #include <linux/gpio/driver.h>
 | |
| 
 | |
| #include <linux/gpio.h>
 | |
| 
 | |
| #include "gpiolib.h"
 | |
| 
 | |
| void gpio_free(unsigned gpio)
 | |
| {
 | |
| 	gpiod_free(gpio_to_desc(gpio));
 | |
| }
 | |
| EXPORT_SYMBOL_GPL(gpio_free);
 | |
| 
 | |
| /**
 | |
|  * gpio_request_one - request a single GPIO with initial configuration
 | |
|  * @gpio:	the GPIO number
 | |
|  * @flags:	GPIO configuration as specified by GPIOF_*
 | |
|  * @label:	a literal description string of this GPIO
 | |
|  */
 | |
| int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
 | |
| {
 | |
| 	struct gpio_desc *desc;
 | |
| 	int err;
 | |
| 
 | |
| 	desc = gpio_to_desc(gpio);
 | |
| 
 | |
| 	/* Compatibility: assume unavailable "valid" GPIOs will appear later */
 | |
| 	if (!desc && gpio_is_valid(gpio))
 | |
| 		return -EPROBE_DEFER;
 | |
| 
 | |
| 	err = gpiod_request(desc, label);
 | |
| 	if (err)
 | |
| 		return err;
 | |
| 
 | |
| 	if (flags & GPIOF_OPEN_DRAIN)
 | |
| 		set_bit(FLAG_OPEN_DRAIN, &desc->flags);
 | |
| 
 | |
| 	if (flags & GPIOF_OPEN_SOURCE)
 | |
| 		set_bit(FLAG_OPEN_SOURCE, &desc->flags);
 | |
| 
 | |
| 	if (flags & GPIOF_ACTIVE_LOW)
 | |
| 		set_bit(FLAG_ACTIVE_LOW, &desc->flags);
 | |
| 
 | |
| 	if (flags & GPIOF_DIR_IN)
 | |
| 		err = gpiod_direction_input(desc);
 | |
| 	else
 | |
| 		err = gpiod_direction_output_raw(desc,
 | |
| 				(flags & GPIOF_INIT_HIGH) ? 1 : 0);
 | |
| 
 | |
| 	if (err)
 | |
| 		goto free_gpio;
 | |
| 
 | |
| 	if (flags & GPIOF_EXPORT) {
 | |
| 		err = gpiod_export(desc, flags & GPIOF_EXPORT_CHANGEABLE);
 | |
| 		if (err)
 | |
| 			goto free_gpio;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| 
 | |
|  free_gpio:
 | |
| 	gpiod_free(desc);
 | |
| 	return err;
 | |
| }
 | |
| EXPORT_SYMBOL_GPL(gpio_request_one);
 | |
| 
 | |
| int gpio_request(unsigned gpio, const char *label)
 | |
| {
 | |
| 	struct gpio_desc *desc = gpio_to_desc(gpio);
 | |
| 
 | |
| 	/* Compatibility: assume unavailable "valid" GPIOs will appear later */
 | |
| 	if (!desc && gpio_is_valid(gpio))
 | |
| 		return -EPROBE_DEFER;
 | |
| 
 | |
| 	return gpiod_request(desc, label);
 | |
| }
 | |
| EXPORT_SYMBOL_GPL(gpio_request);
 | |
| 
 | |
| /**
 | |
|  * gpio_request_array - request multiple GPIOs in a single call
 | |
|  * @array:	array of the 'struct gpio'
 | |
|  * @num:	how many GPIOs in the array
 | |
|  */
 | |
| int gpio_request_array(const struct gpio *array, size_t num)
 | |
| {
 | |
| 	int i, err;
 | |
| 
 | |
| 	for (i = 0; i < num; i++, array++) {
 | |
| 		err = gpio_request_one(array->gpio, array->flags, array->label);
 | |
| 		if (err)
 | |
| 			goto err_free;
 | |
| 	}
 | |
| 	return 0;
 | |
| 
 | |
| err_free:
 | |
| 	while (i--)
 | |
| 		gpio_free((--array)->gpio);
 | |
| 	return err;
 | |
| }
 | |
| EXPORT_SYMBOL_GPL(gpio_request_array);
 | |
| 
 | |
| /**
 | |
|  * gpio_free_array - release multiple GPIOs in a single call
 | |
|  * @array:	array of the 'struct gpio'
 | |
|  * @num:	how many GPIOs in the array
 | |
|  */
 | |
| void gpio_free_array(const struct gpio *array, size_t num)
 | |
| {
 | |
| 	while (num--)
 | |
| 		gpio_free((array++)->gpio);
 | |
| }
 | |
| EXPORT_SYMBOL_GPL(gpio_free_array);
 |