[PATCH 2/2] sh: mach-x3proto: convert gpio-keys to software nodes

Dmitry Torokhov <[email protected]> Sat, 04 Jul 2026 22:04:38 -0700
Newsgroups org.kernel.vger.linux-sh,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Convert the legacy gpio-keys platform device on the SH-X3 Prototype
board to use software nodes/properties. This allows us to describe
the GPIO keys and their GPIO bindings using software nodes, so that
support for platform data can eventually be removed from the
gpio-keys driver.

Assisted-by: Antigravity:gemini-3.5-flash
Signed-off-by: Dmitry Torokhov <[email protected]>
---
 arch/sh/boards/mach-x3proto/setup.c | 165 +++++++++++++++++-------------------
 1 file changed, 78 insertions(+), 87 deletions(-)

diff --git a/arch/sh/boards/mach-x3proto/setup.c b/arch/sh/boards/mach-x3proto/setup.c
index ca2802d30565..0d9d5982cf0c 100644
--- a/arch/sh/boards/mach-x3proto/setup.c
+++ b/arch/sh/boards/mach-x3proto/setup.c
@@ -16,8 +16,8 @@
 #include <linux/input.h>
 #include <linux/usb/r8a66597.h>
 #include <linux/usb/m66592.h>
-#include <linux/gpio/driver.h>
-#include <linux/gpio_keys.h>
+#include <linux/gpio/machine.h>
+#include <linux/gpio/property.h>
 #include <mach/ilsel.h>
 #include <mach/hardware.h>
 #include <asm/smp-ops.h>
@@ -123,87 +123,74 @@ static struct platform_device m66592_usb_peripheral_device = {
 	.resource	= m66592_usb_peripheral_resources,
 };
 
-static struct gpio_keys_button baseboard_buttons[NR_BASEBOARD_GPIOS] = {
-	{
-		.desc		= "key44",
-		.code		= KEY_POWER,
-		.active_low	= 1,
-		.wakeup		= 1,
-	}, {
-		.desc		= "key43",
-		.code		= KEY_SUSPEND,
-		.active_low	= 1,
-		.wakeup		= 1,
-	}, {
-		.desc		= "key42",
-		.code		= KEY_KATAKANAHIRAGANA,
-		.active_low	= 1,
-	}, {
-		.desc		= "key41",
-		.code		= KEY_SWITCHVIDEOMODE,
-		.active_low	= 1,
-	}, {
-		.desc		= "key34",
-		.code		= KEY_F12,
-		.active_low	= 1,
-	}, {
-		.desc		= "key33",
-		.code		= KEY_F11,
-		.active_low	= 1,
-	}, {
-		.desc		= "key32",
-		.code		= KEY_F10,
-		.active_low	= 1,
-	}, {
-		.desc		= "key31",
-		.code		= KEY_F9,
-		.active_low	= 1,
-	}, {
-		.desc		= "key24",
-		.code		= KEY_F8,
-		.active_low	= 1,
-	}, {
-		.desc		= "key23",
-		.code		= KEY_F7,
-		.active_low	= 1,
-	}, {
-		.desc		= "key22",
-		.code		= KEY_F6,
-		.active_low	= 1,
-	}, {
-		.desc		= "key21",
-		.code		= KEY_F5,
-		.active_low	= 1,
-	}, {
-		.desc		= "key14",
-		.code		= KEY_F4,
-		.active_low	= 1,
-	}, {
-		.desc		= "key13",
-		.code		= KEY_F3,
-		.active_low	= 1,
-	}, {
-		.desc		= "key12",
-		.code		= KEY_F2,
-		.active_low	= 1,
-	}, {
-		.desc		= "key11",
-		.code		= KEY_F1,
-		.active_low	= 1,
-	},
+static const struct software_node x3proto_gpio_keys_node = {
+	.name = "x3proto-gpio-keys",
 };
 
-static struct gpio_keys_platform_data baseboard_buttons_data = {
-	.buttons	= baseboard_buttons,
-	.nbuttons	= ARRAY_SIZE(baseboard_buttons),
+#define __X3PROTO_KEY(_id, _code, _gpio, ...)				\
+static const struct property_entry x3proto_key##_id##_props[] = {	\
+	PROPERTY_ENTRY_STRING("label", "key" #_id),			\
+	PROPERTY_ENTRY_U32("linux,code", _code),			\
+	PROPERTY_ENTRY_GPIO("gpios", &x3proto_gpiochip_node,		\
+			    _gpio, GPIO_ACTIVE_LOW),			\
+	__VA_ARGS__							\
+	{ }								\
+};									\
+static const struct software_node x3proto_key##_id##_node = {		\
+	.parent = &x3proto_gpio_keys_node,				\
+	.properties = x3proto_key##_id##_props,				\
+}
+
+#define X3PROTO_KEY(_id, _code, _gpio)					\
+	__X3PROTO_KEY(_id, _code, _gpio)
+
+#define X3PROTO_KEY_WAKEUP(_id, _code, _gpio)				\
+	__X3PROTO_KEY(_id, _code, _gpio,				\
+		      PROPERTY_ENTRY_BOOL("wakeup-source"),		\
+	)
+
+X3PROTO_KEY_WAKEUP(44, KEY_POWER, 0);
+X3PROTO_KEY_WAKEUP(43, KEY_SUSPEND, 1);
+X3PROTO_KEY(42, KEY_KATAKANAHIRAGANA, 2);
+X3PROTO_KEY(41, KEY_SWITCHVIDEOMODE, 3);
+X3PROTO_KEY(34, KEY_F12, 4);
+X3PROTO_KEY(33, KEY_F11, 5);
+X3PROTO_KEY(32, KEY_F10, 6);
+X3PROTO_KEY(31, KEY_F9, 7);
+X3PROTO_KEY(24, KEY_F8, 8);
+X3PROTO_KEY(23, KEY_F7, 9);
+X3PROTO_KEY(22, KEY_F6, 10);
+X3PROTO_KEY(21, KEY_F5, 11);
+X3PROTO_KEY(14, KEY_F4, 12);
+X3PROTO_KEY(13, KEY_F3, 13);
+X3PROTO_KEY(12, KEY_F2, 14);
+X3PROTO_KEY(11, KEY_F1, 15);
+
+static const struct software_node *const x3proto_swnodes[] __initconst = {
+	&x3proto_gpio_keys_node,
+	&x3proto_key44_node,
+	&x3proto_key43_node,
+	&x3proto_key42_node,
+	&x3proto_key41_node,
+	&x3proto_key34_node,
+	&x3proto_key33_node,
+	&x3proto_key32_node,
+	&x3proto_key31_node,
+	&x3proto_key24_node,
+	&x3proto_key23_node,
+	&x3proto_key22_node,
+	&x3proto_key21_node,
+	&x3proto_key14_node,
+	&x3proto_key13_node,
+	&x3proto_key12_node,
+	&x3proto_key11_node,
+	NULL
 };
 
-static struct platform_device baseboard_buttons_device = {
+static const struct platform_device_info x3proto_gpio_keys_device_info __initconst = {
 	.name		= "gpio-keys",
-	.id		= -1,
-	.dev		= {
-		.platform_data	= &baseboard_buttons_data,
-	},
+	.id		= PLATFORM_DEVID_NONE,
+	.swnode		= &x3proto_gpio_keys_node,
 };
 
 static struct platform_device *x3proto_devices[] __initdata = {
@@ -211,7 +198,6 @@ static struct platform_device *x3proto_devices[] __initdata = {
 	&smc91x_device,
 	&r8a66597_usb_host_device,
 	&m66592_usb_peripheral_device,
-	&baseboard_buttons_device,
 };
 
 static void __init x3proto_init_irq(void)
@@ -224,7 +210,8 @@ static void __init x3proto_init_irq(void)
 
 static int __init x3proto_devices_setup(void)
 {
-	int ret, i;
+	struct platform_device *pd;
+	int ret;
 
 	/*
 	 * IRLs are only needed for ILSEL mappings, so flip over the INTC
@@ -239,11 +226,11 @@ static int __init x3proto_devices_setup(void)
 	if (unlikely(ret))
 		return ret;
 
-	/*
-	 * Propagate dynamic GPIOs for the baseboard button device.
-	 */
-	for (i = 0; i < ARRAY_SIZE(baseboard_buttons); i++)
-		baseboard_buttons[i].gpio = x3proto_gpio_chip.base + i;
+	ret = software_node_register_node_group(x3proto_swnodes);
+	if (ret) {
+		pr_err("Failed to register software nodes: %d\n", ret);
+		return ret;
+	}
 
 	r8a66597_usb_host_resources[1].start =
 		r8a66597_usb_host_resources[1].end = ilsel_enable(ILSEL_USBH_I);
@@ -254,8 +241,12 @@ static int __init x3proto_devices_setup(void)
 	smc91x_resources[1].start =
 		smc91x_resources[1].end = ilsel_enable(ILSEL_LAN);
 
-	return platform_add_devices(x3proto_devices,
-				    ARRAY_SIZE(x3proto_devices));
+	ret = platform_add_devices(x3proto_devices, ARRAY_SIZE(x3proto_devices));
+	if (ret)
+		return ret;
+
+	pd = platform_device_register_full(&x3proto_gpio_keys_device_info);
+	return PTR_ERR_OR_ZERO(pd);
 }
 device_initcall(x3proto_devices_setup);
 

-- 
2.55.0.rc0.799.gd6f94ed593-goog