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-legacy.c (2493B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/gpio/consumer.h>
      3#include <linux/gpio/driver.h>
      4
      5#include <linux/gpio.h>
      6
      7#include "gpiolib.h"
      8
      9void gpio_free(unsigned gpio)
     10{
     11	gpiod_free(gpio_to_desc(gpio));
     12}
     13EXPORT_SYMBOL_GPL(gpio_free);
     14
     15/**
     16 * gpio_request_one - request a single GPIO with initial configuration
     17 * @gpio:	the GPIO number
     18 * @flags:	GPIO configuration as specified by GPIOF_*
     19 * @label:	a literal description string of this GPIO
     20 */
     21int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
     22{
     23	struct gpio_desc *desc;
     24	int err;
     25
     26	desc = gpio_to_desc(gpio);
     27
     28	/* Compatibility: assume unavailable "valid" GPIOs will appear later */
     29	if (!desc && gpio_is_valid(gpio))
     30		return -EPROBE_DEFER;
     31
     32	err = gpiod_request(desc, label);
     33	if (err)
     34		return err;
     35
     36	if (flags & GPIOF_OPEN_DRAIN)
     37		set_bit(FLAG_OPEN_DRAIN, &desc->flags);
     38
     39	if (flags & GPIOF_OPEN_SOURCE)
     40		set_bit(FLAG_OPEN_SOURCE, &desc->flags);
     41
     42	if (flags & GPIOF_ACTIVE_LOW)
     43		set_bit(FLAG_ACTIVE_LOW, &desc->flags);
     44
     45	if (flags & GPIOF_DIR_IN)
     46		err = gpiod_direction_input(desc);
     47	else
     48		err = gpiod_direction_output_raw(desc,
     49				(flags & GPIOF_INIT_HIGH) ? 1 : 0);
     50
     51	if (err)
     52		goto free_gpio;
     53
     54	if (flags & GPIOF_EXPORT) {
     55		err = gpiod_export(desc, flags & GPIOF_EXPORT_CHANGEABLE);
     56		if (err)
     57			goto free_gpio;
     58	}
     59
     60	return 0;
     61
     62 free_gpio:
     63	gpiod_free(desc);
     64	return err;
     65}
     66EXPORT_SYMBOL_GPL(gpio_request_one);
     67
     68int gpio_request(unsigned gpio, const char *label)
     69{
     70	struct gpio_desc *desc = gpio_to_desc(gpio);
     71
     72	/* Compatibility: assume unavailable "valid" GPIOs will appear later */
     73	if (!desc && gpio_is_valid(gpio))
     74		return -EPROBE_DEFER;
     75
     76	return gpiod_request(desc, label);
     77}
     78EXPORT_SYMBOL_GPL(gpio_request);
     79
     80/**
     81 * gpio_request_array - request multiple GPIOs in a single call
     82 * @array:	array of the 'struct gpio'
     83 * @num:	how many GPIOs in the array
     84 */
     85int gpio_request_array(const struct gpio *array, size_t num)
     86{
     87	int i, err;
     88
     89	for (i = 0; i < num; i++, array++) {
     90		err = gpio_request_one(array->gpio, array->flags, array->label);
     91		if (err)
     92			goto err_free;
     93	}
     94	return 0;
     95
     96err_free:
     97	while (i--)
     98		gpio_free((--array)->gpio);
     99	return err;
    100}
    101EXPORT_SYMBOL_GPL(gpio_request_array);
    102
    103/**
    104 * gpio_free_array - release multiple GPIOs in a single call
    105 * @array:	array of the 'struct gpio'
    106 * @num:	how many GPIOs in the array
    107 */
    108void gpio_free_array(const struct gpio *array, size_t num)
    109{
    110	while (num--)
    111		gpio_free((array++)->gpio);
    112}
    113EXPORT_SYMBOL_GPL(gpio_free_array);