mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-12 23:31:29 -04:00
leds: gpio: Make legacy gpiolib interface optional
There are still a handful of ancient mips/armv5/sh boards that use the gpio_led:gpio member to pass an old-style gpio number, but all modern users have been converted to gpio descriptors. While the CONFIG_GPIOLIB_LEGACY option that guards devm_gpio_request_one() and related helpers is currently turned on in all kernel builds, the plan is to only enable it on the few platforms that actually pass gpio numbers in any platform_data. Split out the legacy portion of the platform_data handling into a custom helper function that is guarded with in #ifdef block, to allow the the leds-gpio driver to compile cleanly when CONFIG_GPIOLIB_LEGACY gets turned off. Once the last user is converted, this function can be removed. Link: https://lore.kernel.org/all/e9252384-a55c-4a91-9c61-06e05a0b2ce4@app.fastmail.com/ Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Linus Walleij <linusw@kernel.org> Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> # for input Link: https://patch.msgid.link/20260710211854.1371746-4-arnd@kernel.org Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
@@ -9,8 +9,8 @@
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/gpio/legacy.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
@@ -212,7 +212,6 @@ static struct gpio_desc *gpio_led_get_gpiod(struct device *dev, int idx,
|
||||
const struct gpio_led *template)
|
||||
{
|
||||
struct gpio_desc *gpiod;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* This means the LED does not come from the device tree
|
||||
@@ -223,16 +222,29 @@ static struct gpio_desc *gpio_led_get_gpiod(struct device *dev, int idx,
|
||||
gpiod = devm_gpiod_get_index_optional(dev, NULL, idx, GPIOD_OUT_LOW);
|
||||
if (IS_ERR(gpiod))
|
||||
return gpiod;
|
||||
if (gpiod) {
|
||||
gpiod_set_consumer_name(gpiod, template->name);
|
||||
return gpiod;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the legacy code path for platform code that
|
||||
* still uses GPIO numbers. Ultimately we would like to get
|
||||
* rid of this block completely.
|
||||
*/
|
||||
gpiod_set_consumer_name(gpiod, template->name);
|
||||
return gpiod;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GPIOLIB_LEGACY
|
||||
/*
|
||||
* This is the legacy code path for platform code that still uses
|
||||
* GPIO numbers, mainly MIPS and SuperH board files.
|
||||
* Ultimately we would like to get rid of this block completely.
|
||||
*
|
||||
* ppc44x-warp sets the template->gpiod directly instead of
|
||||
* adding a lookup table or device properties. This is not
|
||||
* much better.
|
||||
*/
|
||||
static struct gpio_desc *gpio_led_get_legacy_gpiod(struct device *dev, int idx,
|
||||
const struct gpio_led *template)
|
||||
{
|
||||
struct gpio_desc *gpiod;
|
||||
int ret;
|
||||
|
||||
if (template->gpiod)
|
||||
return template->gpiod;
|
||||
|
||||
/* skip leds that aren't available */
|
||||
if (!gpio_is_valid(template->gpio))
|
||||
@@ -252,6 +264,13 @@ static struct gpio_desc *gpio_led_get_gpiod(struct device *dev, int idx,
|
||||
|
||||
return gpiod;
|
||||
}
|
||||
#else
|
||||
static struct gpio_desc *gpio_led_get_legacy_gpiod(struct device *dev, int idx,
|
||||
const struct gpio_led *template)
|
||||
{
|
||||
return template->gpiod ?: ERR_PTR(-ENOENT);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int gpio_led_probe(struct platform_device *pdev)
|
||||
{
|
||||
@@ -270,14 +289,13 @@ static int gpio_led_probe(struct platform_device *pdev)
|
||||
const struct gpio_led *template = &pdata->leds[i];
|
||||
struct gpio_led_data *led_dat = &priv->leds[i];
|
||||
|
||||
if (template->gpiod)
|
||||
led_dat->gpiod = template->gpiod;
|
||||
else
|
||||
led_dat->gpiod = gpio_led_get_gpiod(dev, i, template);
|
||||
if (!led_dat->gpiod)
|
||||
led_dat->gpiod =
|
||||
gpio_led_get_gpiod(dev, i, template);
|
||||
gpio_led_get_legacy_gpiod(dev, i, template);
|
||||
if (IS_ERR(led_dat->gpiod)) {
|
||||
dev_info(dev, "Skipping unavailable LED gpio %d (%s)\n",
|
||||
template->gpio, template->name);
|
||||
dev_info(dev, "Skipping unavailable LED gpio %s\n",
|
||||
template->name);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -680,8 +680,10 @@ typedef int (*gpio_blink_set_t)(struct gpio_desc *desc, int state,
|
||||
struct gpio_led {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
#ifdef CONFIG_GPIOLIB_LEGACY
|
||||
unsigned gpio;
|
||||
unsigned active_low : 1;
|
||||
#endif
|
||||
unsigned retain_state_suspended : 1;
|
||||
unsigned panic_indicator : 1;
|
||||
unsigned default_state : 2;
|
||||
|
||||
Reference in New Issue
Block a user