Skip to content

Commit

Permalink
gpiolib: legacy: Consolidate devm_gpio_*() with other legacy APIs
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Andy Shevchenko authored and Bartosz Golaszewski committed Sep 2, 2024
1 parent 94bd9ce commit d25f9ab
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 74 deletions.
82 changes: 8 additions & 74 deletions drivers/gpio/gpiolib-devres.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,19 @@
* Copyright (c) 2011 John Crispin <john@phrozen.org>
*/

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

#include <linux/gpio/consumer.h>

#include "gpiolib.h"

struct fwnode_handle;
struct lock_class_key;

static void devm_gpiod_release(struct device *dev, void *res)
{
struct gpio_desc **desc = res;
Expand Down Expand Up @@ -354,76 +358,6 @@ void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)
}
EXPORT_SYMBOL_GPL(devm_gpiod_put_array);

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.
*/
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
*/
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);

static void devm_gpio_chip_release(void *data)
{
struct gpio_chip *gc = data;
Expand Down
86 changes: 86 additions & 0 deletions drivers/gpio/gpiolib-legacy.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
// 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>

Expand Down Expand Up @@ -74,3 +80,83 @@ int gpio_request(unsigned gpio, const char *label)
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);

0 comments on commit d25f9ab

Please sign in to comment.