d25f9ab17d
There is no reason to keep deprecated legacy API implementations in the gpiolib-devres.c. Consolidate devm_gpio_*() with other legacy APIs. While at it, clean up header inclusion block in gpiolib-devres.c. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20240828151357.2677340-1-andriy.shevchenko@linux.intel.com Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
163 lines
3.6 KiB
C
163 lines
3.6 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/bitops.h>
|
|
#include <linux/device.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/export.h>
|
|
#include <linux/gfp.h>
|
|
|
|
#include <linux/gpio/consumer.h>
|
|
#include <linux/gpio/driver.h>
|
|
|
|
#include <linux/gpio.h>
|
|
|
|
#include "gpiolib.h"
|
|
|
|
/*
|
|
* **DEPRECATED** This function is deprecated and must not be used in new code.
|
|
*/
|
|
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
|
|
*
|
|
* **DEPRECATED** This function is deprecated and must not be used in new code.
|
|
*
|
|
* Returns:
|
|
* 0 on success, or negative errno on failure.
|
|
*/
|
|
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
|
|
{
|
|
struct gpio_desc *desc;
|
|
int err;
|
|
|
|
/* Compatibility: assume unavailable "valid" GPIOs will appear later */
|
|
desc = gpio_to_desc(gpio);
|
|
if (!desc)
|
|
return -EPROBE_DEFER;
|
|
|
|
err = gpiod_request(desc, label);
|
|
if (err)
|
|
return err;
|
|
|
|
if (flags & GPIOF_ACTIVE_LOW)
|
|
set_bit(FLAG_ACTIVE_LOW, &desc->flags);
|
|
|
|
if (flags & GPIOF_IN)
|
|
err = gpiod_direction_input(desc);
|
|
else
|
|
err = gpiod_direction_output_raw(desc, !!(flags & GPIOF_OUT_INIT_HIGH));
|
|
|
|
if (err)
|
|
goto free_gpio;
|
|
|
|
return 0;
|
|
|
|
free_gpio:
|
|
gpiod_free(desc);
|
|
return err;
|
|
}
|
|
EXPORT_SYMBOL_GPL(gpio_request_one);
|
|
|
|
/*
|
|
* **DEPRECATED** This function is deprecated and must not be used in new code.
|
|
*/
|
|
int gpio_request(unsigned gpio, const char *label)
|
|
{
|
|
struct gpio_desc *desc;
|
|
|
|
/* Compatibility: assume unavailable "valid" GPIOs will appear later */
|
|
desc = gpio_to_desc(gpio);
|
|
if (!desc)
|
|
return -EPROBE_DEFER;
|
|
|
|
return gpiod_request(desc, label);
|
|
}
|
|
EXPORT_SYMBOL_GPL(gpio_request);
|
|
|
|
static void devm_gpio_release(struct device *dev, void *res)
|
|
{
|
|
unsigned *gpio = res;
|
|
|
|
gpio_free(*gpio);
|
|
}
|
|
|
|
/**
|
|
* 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.
|
|
*
|
|
* **DEPRECATED** This function is deprecated and must not be used in new code.
|
|
*
|
|
* Returns:
|
|
* 0 on success, or negative errno on failure.
|
|
*/
|
|
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;
|
|
}
|
|
EXPORT_SYMBOL_GPL(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
|
|
*
|
|
* **DEPRECATED** This function is deprecated and must not be used in new code.
|
|
*
|
|
* Returns:
|
|
* 0 on success, or negative errno on failure.
|
|
*/
|
|
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;
|
|
}
|
|
EXPORT_SYMBOL_GPL(devm_gpio_request_one);
|