]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ARM: spitz: Use software nodes to describe LED GPIOs
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 28 Jun 2024 18:08:49 +0000 (11:08 -0700)
committerArnd Bergmann <arnd@arndb.de>
Tue, 9 Jul 2024 13:21:16 +0000 (15:21 +0200)
Convert Spitz to use software nodes for specifying GPIOs for the LEDs.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20240628180852.1738922-10-dmitry.torokhov@gmail.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/arm/mach-pxa/spitz.c

index 4720a40587f1474eb45179c84de96564efb3039d..b19d4ed351926baedd27d8fa7301855099bd3037 100644 (file)
@@ -467,35 +467,64 @@ static inline void spitz_keys_init(void) {}
  * LEDs
  ******************************************************************************/
 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
-static struct gpio_led spitz_gpio_leds[] = {
-       {
-               .name                   = "spitz:amber:charge",
-               .default_trigger        = "sharpsl-charge",
-               .gpio                   = SPITZ_GPIO_LED_ORANGE,
-       },
-       {
-               .name                   = "spitz:green:hddactivity",
-               .default_trigger        = "disk-activity",
-               .gpio                   = SPITZ_GPIO_LED_GREEN,
-       },
+static const struct software_node spitz_gpio_leds_node = {
+       .name = "spitz-leds",
 };
 
-static struct gpio_led_platform_data spitz_gpio_leds_info = {
-       .leds           = spitz_gpio_leds,
-       .num_leds       = ARRAY_SIZE(spitz_gpio_leds),
+static const struct property_entry spitz_orange_led_props[] = {
+       PROPERTY_ENTRY_STRING("linux,default-trigger", "sharpsl-charge"),
+       PROPERTY_ENTRY_GPIO("gpios",
+                           &spitz_scoop_1_gpiochip_node, 6, GPIO_ACTIVE_HIGH),
+       { }
 };
 
-static struct platform_device spitz_led_device = {
-       .name           = "leds-gpio",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &spitz_gpio_leds_info,
-       },
+static const struct software_node spitz_orange_led_node = {
+       .name = "spitz:amber:charge",
+       .parent = &spitz_gpio_leds_node,
+       .properties = spitz_orange_led_props,
+};
+
+static const struct property_entry spitz_green_led_props[] = {
+       PROPERTY_ENTRY_STRING("linux,default-trigger", "disk-activity"),
+       PROPERTY_ENTRY_GPIO("gpios",
+                           &spitz_scoop_1_gpiochip_node, 0, GPIO_ACTIVE_HIGH),
+       { }
+};
+
+static const struct software_node spitz_green_led_node = {
+       .name = "spitz:green:hddactivity",
+       .parent = &spitz_gpio_leds_node,
+       .properties = spitz_green_led_props,
+};
+
+static const struct software_node *spitz_gpio_leds_swnodes[] = {
+       &spitz_gpio_leds_node,
+       &spitz_orange_led_node,
+       &spitz_green_led_node,
+       NULL
 };
 
 static void __init spitz_leds_init(void)
 {
-       platform_device_register(&spitz_led_device);
+       struct platform_device_info led_info = {
+               .name   = "leds-gpio",
+               .id     = PLATFORM_DEVID_NONE,
+       };
+       struct platform_device *led_dev;
+       int err;
+
+       err = software_node_register_node_group(spitz_gpio_leds_swnodes);
+       if (err) {
+               pr_err("failed to register LED software nodes: %d\n", err);
+               return;
+       }
+
+       led_info.fwnode = software_node_fwnode(&spitz_gpio_leds_node);
+
+       led_dev = platform_device_register_full(&led_info);
+       err = PTR_ERR_OR_ZERO(led_dev);
+       if (err)
+               pr_err("failed to create LED device: %d\n", err);
 }
 #else
 static inline void spitz_leds_init(void) {}