gpiolib: add support for software nodes
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 11 Nov 2022 22:19:08 +0000 (14:19 -0800)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 15 Nov 2022 10:21:43 +0000 (11:21 +0100)
commite7f9ff5dc90c3826231343439c35c6b7e9e57378
treee5458c883698285ef53c141e6544b22b51507782
parent8eb1f71e7acca4f92cf9cf83030cbb8ec2524025
gpiolib: add support for software nodes

Now that static device properties understand notion of child nodes and
references, let's teach gpiolib to handle them:

- GPIOs are represented as a references to software nodes representing
  gpiochip
- references must have 2 arguments - GPIO number within the chip and
  GPIO flags (GPIO_ACTIVE_LOW/GPIO_ACTIVE_HIGH, etc)
- a new PROPERTY_ENTRY_GPIO() macro is supplied to ensure the above
- name of the software node representing gpiochip must match label of
  the gpiochip, as we use it to locate gpiochip structure at runtime

The following illustrates use of software nodes to describe a "System"
button that is currently specified via use of gpio_keys_platform_data
in arch/mips/alchemy/board-mtx1.c. It follows bindings specified in
Documentation/devicetree/bindings/input/gpio-keys.yaml.

static const struct software_node mxt1_gpiochip2_node = {
.name = "alchemy-gpio2",
};

static const struct property_entry mtx1_gpio_button_props[] = {
PROPERTY_ENTRY_U32("linux,code", BTN_0),
PROPERTY_ENTRY_STRING("label", "System button"),
PROPERTY_ENTRY_GPIO("gpios", &mxt1_gpiochip2_node, 7, GPIO_ACTIVE_LOW),
{ }
};

Similarly, arch/arm/mach-tegra/board-paz00.c can be converted to:

static const struct software_node tegra_gpiochip_node = {
.name = "tegra-gpio",
};

static struct property_entry wifi_rfkill_prop[] __initdata = {
PROPERTY_ENTRY_STRING("name", "wifi_rfkill"),
PROPERTY_ENTRY_STRING("type", "wlan"),
PROPERTY_ENTRY_GPIO("reset-gpios",
    &tegra_gpiochip_node, 25, GPIO_ACTIVE_HIGH);
PROPERTY_ENTRY_GPIO("shutdown-gpios",
    &tegra_gpiochip_node, 85, GPIO_ACTIVE_HIGH);
{ },
};

static struct platform_device wifi_rfkill_device = {
.name = "rfkill_gpio",
.id = -1,
};

...

software_node_register(&tegra_gpiochip_node);
device_create_managed_software_node(&wifi_rfkill_device.dev,
    wifi_rfkill_prop, NULL);

Acked-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/Makefile
drivers/gpio/gpiolib-swnode.c [new file with mode: 0644]
drivers/gpio/gpiolib-swnode.h [new file with mode: 0644]
drivers/gpio/gpiolib.c
include/linux/gpio/property.h [new file with mode: 0644]