[PATCH v3 09/10] ARM: s3c: crag6410: convert basic-mmio-gpio and LEDs to software properties
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2026-07-12 02:13:37
Also in:
linux-arm-kernel, linux-devicetree, linux-samsung-soc, lkml
Subsystem:
arm port, arm/samsung s3c, s5p and exynos arm architectures, the rest, wolfson microelectronics drivers · Maintainers:
Russell King, Krzysztof Kozlowski, Peter Griffin, Linus Torvalds
Convert the basic-mmio-gpio device and the GPIO-controlled LEDs on the Cragganmore 6410 board to use software nodes/properties. This allows removing the crag_leds_table GPIO lookup table. Assisted-by: Antigravity:gemini-3.5-flash Acked-by: Bartosz Golaszewski <redacted> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> --- arch/arm/mach-s3c/mach-crag6410.c | 117 +++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 53 deletions(-)
diff --git a/arch/arm/mach-s3c/mach-crag6410.c b/arch/arm/mach-s3c/mach-crag6410.c
index 1abf08fdb543..1ba3d47d85b7 100644
--- a/arch/arm/mach-s3c/mach-crag6410.c
+++ b/arch/arm/mach-s3c/mach-crag6410.c@@ -319,12 +319,17 @@ static const struct property_entry crag6410_mmgpio_props[] = { { } }; +static const struct software_node crag6410_mmgpio_node = { + .name = "basic-mmio-gpio", + .properties = crag6410_mmgpio_props, +}; + static struct platform_device_info crag6410_mmgpio_devinfo = { .name = "basic-mmio-gpio", .id = -1, .res = crag6410_mmgpio_resource, .num_res = ARRAY_SIZE(crag6410_mmgpio_resource), - .properties = crag6410_mmgpio_props, + .swnode = &crag6410_mmgpio_node, }; static struct platform_device speyside_device = {
@@ -835,61 +840,68 @@ static struct s3c_sdhci_platdata crag6410_hsmmc0_pdata = { .host_caps = MMC_CAP_POWER_OFF_CARD, }; -static const struct gpio_led gpio_leds[] = { - { - .name = "d13:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, - { - .name = "d14:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, - { - .name = "d15:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, - { - .name = "d16:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, - { - .name = "d17:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, - { - .name = "d18:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, - { - .name = "d19:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, - { - .name = "d20:green:", - .default_state = LEDS_GPIO_DEFSTATE_ON, - }, +static const struct software_node crag6410_leds_node = { + .name = "leds-gpio", }; -static struct gpiod_lookup_table crag_leds_table = { - .dev_id = "leds-gpio", - .table = { - GPIO_LOOKUP_IDX("basic-mmio-gpio", 0, "cs", 0, GPIO_ACTIVE_LOW), - GPIO_LOOKUP_IDX("basic-mmio-gpio", 1, "cs", 1, GPIO_ACTIVE_LOW), - GPIO_LOOKUP_IDX("basic-mmio-gpio", 2, "cs", 2, GPIO_ACTIVE_LOW), - GPIO_LOOKUP_IDX("basic-mmio-gpio", 3, "cs", 3, GPIO_ACTIVE_LOW), - GPIO_LOOKUP_IDX("basic-mmio-gpio", 4, "cs", 4, GPIO_ACTIVE_LOW), - GPIO_LOOKUP_IDX("basic-mmio-gpio", 5, "cs", 5, GPIO_ACTIVE_LOW), - GPIO_LOOKUP_IDX("basic-mmio-gpio", 6, "cs", 6, GPIO_ACTIVE_LOW), - GPIO_LOOKUP_IDX("basic-mmio-gpio", 7, "cs", 7, GPIO_ACTIVE_LOW), - { }, - }, -}; +#define CRAG6410_LED_NODE(_idx, _name) \ +static const struct property_entry crag6410_led##_idx##_props[] = { \ + PROPERTY_ENTRY_STRING("label", _name), \ + PROPERTY_ENTRY_GPIO("gpios", &crag6410_mmgpio_node, \ + _idx, GPIO_ACTIVE_LOW), \ + PROPERTY_ENTRY_STRING("default-state", "on"), \ + { } \ +}; \ +static const struct software_node crag6410_led##_idx##_node = { \ + .parent = &crag6410_leds_node, \ + .properties = crag6410_led##_idx##_props, \ +} -static const struct gpio_led_platform_data gpio_leds_pdata = { - .leds = gpio_leds, - .num_leds = ARRAY_SIZE(gpio_leds), +CRAG6410_LED_NODE(0, "d13:green:"); +CRAG6410_LED_NODE(1, "d14:green:"); +CRAG6410_LED_NODE(2, "d15:green:"); +CRAG6410_LED_NODE(3, "d16:green:"); +CRAG6410_LED_NODE(4, "d17:green:"); +CRAG6410_LED_NODE(5, "d18:green:"); +CRAG6410_LED_NODE(6, "d19:green:"); +CRAG6410_LED_NODE(7, "d20:green:"); + +static const struct software_node *crag6410_leds_swnodes[] = { + &crag6410_leds_node, + &crag6410_led0_node, + &crag6410_led1_node, + &crag6410_led2_node, + &crag6410_led3_node, + &crag6410_led4_node, + &crag6410_led5_node, + &crag6410_led6_node, + &crag6410_led7_node, + NULL }; +static void __init crag6410_setup_leds(void) +{ + struct platform_device_info leds_info = { + .name = "leds-gpio", + .id = PLATFORM_DEVID_NONE, + }; + struct platform_device *pd; + int err; + + err = software_node_register_node_group(crag6410_leds_swnodes); + if (err) { + pr_err("failed to register leds software nodes: %d\n", err); + return; + } + + leds_info.fwnode = software_node_fwnode(&crag6410_leds_node); + + pd = platform_device_register_full(&leds_info); + err = PTR_ERR_OR_ZERO(pd); + if (err) + pr_err("failed to create leds-gpio device: %d\n", err); +} + static struct dwc2_hsotg_plat crag6410_hsotg_pdata; static struct gpiod_lookup_table crag_spi0_gpiod_table = {
@@ -939,12 +951,11 @@ static void __init crag6410_machine_init(void) platform_add_devices(crag6410_devs0, ARRAY_SIZE(crag6410_devs0)); platform_device_register_full(&crag6410_mmgpio_devinfo); - gpiod_add_lookup_table(&crag_leds_table); crag6410_setup_keypad(); crag6410_setup_gpio_keys(); platform_add_devices(crag6410_devs1, ARRAY_SIZE(crag6410_devs1)); - gpio_led_register_device(-1, &gpio_leds_pdata); + crag6410_setup_leds(); regulator_has_full_constraints();
--
2.55.0.795.g602f6c329a-goog