Re: [PATCH 05/21] x86/platform: select legacy gpiolib interfaces where used
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2025-08-11 02:27:25
Also in:
linux-gpio, lkml, platform-driver-x86
Hi Hans, On Sun, Aug 10, 2025 at 05:12:46PM +0200, Hans de Goede wrote:
Hi Arnd, Andy, On 9-Aug-25 9:44 PM, Arnd Bergmann wrote:quoted
On Sat, Aug 9, 2025, at 12:00, Andy Shevchenko wrote:quoted
On Fri, Aug 08, 2025 at 05:17:49PM +0200, Arnd Bergmann wrote:quoted
From: Arnd Bergmann <arnd@arndb.de> A few old machines have not been converted away from the old-style gpiolib interfaces. Make these select the new CONFIG_GPIOLIB_LEGACY symbol so the code still works where it is needed but can be left out otherwise.quoted
--- a/drivers/platform/x86/x86-android-tablets/Kconfig +++ b/drivers/platform/x86/x86-android-tablets/Kconfig@@ -8,6 +8,7 @@ config X86_ANDROID_TABLETS depends on I2C && SPI && SERIAL_DEV_BUS depends on GPIOLIB && PMIC_OPREGION depends on ACPI && EFI && PCI + select GPIOLIB_LEGACY select NEW_LEDS select LEDS_CLASS select POWER_SUPPLYHmm... This is a surprising change. But I leave it to Hans.Yes I was surprised by this myself since I explicitly removed all legacy GPIO use from the x86-android-tablets code a while ago (or so I thought).quoted
I think the only function that still needs it is x86_android_tablet_probe() doing static struct gpio_keys_button *buttons; for (i = 0; i < dev_info->gpio_button_count; i++) { ret = x86_android_tablet_get_gpiod(dev_info->gpio_button[i].chip, dev_info->gpio_button[i].pin, dev_info->gpio_button[i].button.desc, false, GPIOD_IN, &gpiod); buttons[i] = dev_info->gpio_button[i].button; buttons[i].gpio = desc_to_gpio(gpiod); /* Release GPIO descriptor so that gpio-keys can request it */ devm_gpiod_put(&x86_android_tablet_device->dev, gpiod); } So the driver itself uses gpio descriptors, but it passes some of them into another driver by number. There is probably an easy workaround that I did not see.Ah I see, so this is basically in the same boat as drivers/input/misc/soc_button_array.c which also first gets a gpio_desc and then calls desc_to_gpio() to store the GPIO number in struct gpio_keys_button which is passed as platform_data to drivers/input/keyboard/gpio_keys.c The gpio_keys driver then converts things back into a gpio_desc in gpio_keys_setup_key() using devm_gpio_request_one() + gpio_to_desc() So it looks like we need to add a gpiod member to struct gpio_keys_button (include/linux/gpio_keys.h) and modify gpio_keys.c to prefer that over using button->gpio, something like the attached patch basically. I won't have time to work on this until September, so if someone wants to take the attached patch and run with it go for it. Note the x86-android-tablets / soc_button_array code will become responsible for requesting / releasing the gpiod when using the new gpio_keys_button.gpiod member. For the x86-android-tablets code this is easy, just drop these 2 lines: /* Release GPIO descriptor so that gpio-keys can request it */ devm_gpiod_put(&x86_android_tablet_device->dev, gpiod); And for soc_button_array.c it is _probably_ just a matter of switching to devm_gpiod_get_index() and drop the gpiod_put(). I have hardware to test both the x86-android-tablets code as well as the soc_button_array code. I might be able to do a quick test on August 22nd or 29th.
I just sent out a v2 of my series from '23 converting x86-android-tablets to use PROPERTY_ENTRY_GPIO(), including converting buttons and switches: https://lore.kernel.org/all/20250810-x86-andoroid-tablet-v2-0-9c7a1b3c32b2@gmail.com/ (local) I do not have hardware so it probably is busted but if you could make it work that would be great. Thanks. -- Dmitry