From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D76212BDC0F; Thu, 30 Apr 2026 09:12:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777540333; cv=none; b=EjOVPy25nFoieJIuIBC6dV4YMxdemeRgD+ILUZtnctHk+3mYnFWdNRGsnfBJ3/v/fgp9utUBJjgAsDqvUXtuwQl4sDj1qMwdA9ez1m+jCHHetVNuhQAnyJSWhPjfHMlYbTuLjclmM3h3TZjTTaLQv2oWs69p8W4OYpxNLIZss6E= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777540333; c=relaxed/simple; bh=k+ehhy6UXY0hbs75jHbwfvPYhqslla8Px/d6pa3bdxE=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=JE+9shGNARaf8Y9zuqLJ1w1md5iJ+uzGsKl9rvpMbfdcRQ/7FVcpvITS5i8jjGtFBT+wsRHGI4GWE/DcxlUsRS6qw40G4SzwDnwCDLlJfIXsfX0zUjcnTUH8Ttg1AnvVWMagL6vVEPifg/DpTHG2dneBHqZQG6uDfzAtswv7cqw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gJDqP5Ez; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gJDqP5Ez" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 66B61C2BCB3; Thu, 30 Apr 2026 09:12:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777540333; bh=k+ehhy6UXY0hbs75jHbwfvPYhqslla8Px/d6pa3bdxE=; h=From:To:Cc:Subject:Date:From; b=gJDqP5Ezoc0GNmExXGQN5KiaOvcmKeUpwQA+MP5aEoMyUaYlbiFuevaEWAAY+Ymdj yDxweZ5UrZM9idNRoATJigU8PImOTf011wWwlD+lEA5rSg1hgYhFhrzyFQ6ML5KFpV HwyGgIWcgDMJCR9OX724tW/o2qgyzenXgT7pjb30EkmTRY7r3L/Ik3E0V6fUzfU2HZ tA4kAqLQwF8YhErcIwhp5Gp3KxSkGSd9XnWqyrDBDDqTHAxEsoiI08oVnDrHICHMUP GKAWMYICCu/FPBX+B6QhyLct+688mjmoE2PefkQggA6Fsz0u5DshfKeL2KAyqmW07g Byc6S9MjgJ2KA== From: Arnd Bergmann To: Lee Jones , Pavel Machek , Linus Walleij , Bartosz Golaszewski Cc: Dmitry Torokhov , Arnd Bergmann , Andy Shevchenko , linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Subject: [PATCH] [v2] leds: gpio: make legacy gpiolib interface optional Date: Thu, 30 Apr 2026 11:11:55 +0200 Message-Id: <20260430091202.2724109-1-arnd@kernel.org> X-Mailer: git-send-email 2.39.5 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Arnd Bergmann 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 --- v2: rework a little bit to keep the legacy code path more separate, extend changelog description Related to this, we may also want to remove support for passing a gpio descriptor in the ->gpiod flag. The only user doing this at the moment was introduced in commit 1892e87a3e91 ("powerpc/warp: switch to using gpiod API"). Linus Walleij previously gave a Reviewed-by tag, but I dropped it again during the rework. --- drivers/leds/leds-gpio.c | 48 +++++++++++++++++++++++++++++----------- include/linux/leds.h | 2 ++ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index 961acc18d0ac..788d9ef7720a 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -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 @@ -228,11 +227,27 @@ static struct gpio_desc *gpio_led_get_gpiod(struct device *dev, int idx, 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. - */ + 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 +267,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; +} +#endif static int gpio_led_probe(struct platform_device *pdev) { @@ -270,14 +292,14 @@ 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); + led_dat->gpiod = gpio_led_get_gpiod(dev, i, template); + if (!led_dat->gpiod) + led_dat->gpiod = 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; } diff --git a/include/linux/leds.h b/include/linux/leds.h index b16b803cc1ac..e646bffcd8e7 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -676,8 +676,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; -- 2.39.5