[PATCH 4/4] MIPS: alchemy: db1300: switch to static device properties

From: Dmitry Torokhov

Date: Tue Mar 10 2026 - 02:12:45 EST


Convert "5way switch" gpio-keys device and smsc911x ethernet controller
to use static device properties instead of bespoke platform data
structures for configuration.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
---
arch/mips/alchemy/common/gpiolib.c | 6 +
arch/mips/alchemy/devboards/db1300.c | 209 +++++++++++++++---------
arch/mips/include/asm/mach-au1x00/gpio-au1300.h | 3 +
3 files changed, 144 insertions(+), 74 deletions(-)

diff --git a/arch/mips/alchemy/common/gpiolib.c b/arch/mips/alchemy/common/gpiolib.c
index 2141eae5ce45..c926cc137561 100644
--- a/arch/mips/alchemy/common/gpiolib.c
+++ b/arch/mips/alchemy/common/gpiolib.c
@@ -104,9 +104,14 @@ const struct software_node alchemy_gpio2_node = {
.name = "alchemy-gpio2",
};

+const struct software_node alchemy_gpic_node = {
+ .name = "alchemy-gpic",
+};
+
static const struct software_node *alchemy_gpio_node_group[] = {
&alchemy_gpio1_node,
&alchemy_gpio2_node,
+ &alchemy_gpic_node,
NULL
};

@@ -189,6 +194,7 @@ static int __init alchemy_gpio_nodes_init(void)

alchemy_gpio_chip[0].fwnode = software_node_fwnode(&alchemy_gpio1_node);
alchemy_gpio_chip[1].fwnode = software_node_fwnode(&alchemy_gpio2_node);
+ au1300_gpiochip.fwnode = software_node_fwnode(&alchemy_gpic_node);

return 0;
}
diff --git a/arch/mips/alchemy/devboards/db1300.c b/arch/mips/alchemy/devboards/db1300.c
index d377e043b49f..1c8b01e5263a 100644
--- a/arch/mips/alchemy/devboards/db1300.c
+++ b/arch/mips/alchemy/devboards/db1300.c
@@ -7,10 +7,10 @@

#include <linux/clk.h>
#include <linux/dma-mapping.h>
-#include <linux/gpio.h>
-#include <linux/gpio_keys.h>
+#include <linux/gpio/machine.h>
+#include <linux/gpio/property.h>
#include <linux/init.h>
-#include <linux/input.h> /* KEY_* codes */
+#include <linux/input-event-codes.h>
#include <linux/i2c.h>
#include <linux/io.h>
#include <linux/leds.h>
@@ -20,6 +20,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/platnand.h>
#include <linux/platform_device.h>
+#include <linux/property.h>
#include <linux/smsc911x.h>
#include <linux/wm97xx.h>

@@ -236,23 +237,36 @@ static struct resource db1300_eth_res[] = {
},
};

-static struct smsc911x_platform_config db1300_eth_config = {
- .phy_interface = PHY_INTERFACE_MODE_MII,
- .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
- .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
- .flags = SMSC911X_USE_32BIT,
-};
+static u8 db1300_eth_macaddr[6];

-static struct platform_device db1300_eth_dev = {
- .name = "smsc911x",
- .id = -1,
- .num_resources = ARRAY_SIZE(db1300_eth_res),
- .resource = db1300_eth_res,
- .dev = {
- .platform_data = &db1300_eth_config,
+static const struct platform_device_info db1300_eth_info __initconst = {
+ .name = "smsc911x",
+ .id = PLATFORM_DEVID_NONE,
+ .res = db1300_eth_res,
+ .num_res = ARRAY_SIZE(db1300_eth_res),
+ .properties = (const struct property_entry[]){
+ PROPERTY_ENTRY_U32("reg-io-width", 4),
+ PROPERTY_ENTRY_U32("reg-shift", 0),
+ PROPERTY_ENTRY_BOOL("smsc,irq-push-pull"),
+ PROPERTY_ENTRY_STRING("phy-mode", "mii"),
+ PROPERTY_ENTRY_U8_ARRAY("local-mac-address", db1300_eth_macaddr),
+ { }
},
};

+static void __init db1300_eth_init(void)
+{
+ struct platform_device *pd;
+ int err;
+
+ prom_get_ethernet_addr(db1300_eth_macaddr);
+
+ pd = platform_device_register_full(&db1300_eth_info);
+ err = PTR_ERR_OR_ZERO(pd);
+ if (err)
+ pr_err("failed to create eth device: %d\n", err);
+}
+
/**********************************************************************/

static struct resource au1300_psc1_res[] = {
@@ -355,62 +369,110 @@ static struct platform_device db1300_i2c_dev = {
* according to the schematics swap up with down and left with right.
* I chose to use it to emulate the arrow keys of a keyboard.
*/
-static struct gpio_keys_button db1300_5waysw_arrowkeys[] = {
- {
- .code = KEY_DOWN,
- .gpio = AU1300_PIN_LCDPWM0,
- .type = EV_KEY,
- .debounce_interval = 1,
- .active_low = 1,
- .desc = "5waysw-down",
- },
- {
- .code = KEY_UP,
- .gpio = AU1300_PIN_PSC2SYNC1,
- .type = EV_KEY,
- .debounce_interval = 1,
- .active_low = 1,
- .desc = "5waysw-up",
- },
- {
- .code = KEY_RIGHT,
- .gpio = AU1300_PIN_WAKE3,
- .type = EV_KEY,
- .debounce_interval = 1,
- .active_low = 1,
- .desc = "5waysw-right",
- },
- {
- .code = KEY_LEFT,
- .gpio = AU1300_PIN_WAKE2,
- .type = EV_KEY,
- .debounce_interval = 1,
- .active_low = 1,
- .desc = "5waysw-left",
- },
- {
- .code = KEY_ENTER,
- .gpio = AU1300_PIN_WAKE1,
- .type = EV_KEY,
- .debounce_interval = 1,
- .active_low = 1,
- .desc = "5waysw-push",
- },
-};
+static const struct software_node db1300_5waysw_node = {
+ .name = "db1300-5wayswitch",
+ .properties = (const struct property_entry[]){
+ PROPERTY_ENTRY_BOOL("autorepeat"),
+ PROPERTY_ENTRY_STRING("label", "db1300-5wayswitch"),
+ { }
+ },
+};
+
+static const struct software_node db1300_5waysw_down_node = {
+ .name = "5waysw-down",
+ .parent = &db1300_5waysw_node,
+ .properties = (const struct property_entry[]){
+ PROPERTY_ENTRY_U32("linux,code", KEY_DOWN),
+ PROPERTY_ENTRY_GPIO("gpios", &alchemy_gpic_node,
+ AU1300_PIN_LCDPWM0, GPIO_ACTIVE_LOW),
+ PROPERTY_ENTRY_U32("debounce-interval", 1),
+ PROPERTY_ENTRY_STRING("label", "5waysw-down"),
+ { }
+ },
+};
+
+static const struct software_node db1300_5waysw_up_node = {
+ .name = "5waysw-up",
+ .parent = &db1300_5waysw_node,
+ .properties = (const struct property_entry[]){
+ PROPERTY_ENTRY_U32("linux,code", KEY_UP),
+ PROPERTY_ENTRY_GPIO("gpios", &alchemy_gpic_node,
+ AU1300_PIN_PSC2SYNC1, GPIO_ACTIVE_LOW),
+ PROPERTY_ENTRY_U32("debounce-interval", 1),
+ PROPERTY_ENTRY_STRING("label", "5waysw-up"),
+ { }
+ },
+};
+
+static const struct software_node db1300_5waysw_right_node = {
+ .name = "5waysw-right",
+ .parent = &db1300_5waysw_node,
+ .properties = (const struct property_entry[]){
+ PROPERTY_ENTRY_U32("linux,code", KEY_RIGHT),
+ PROPERTY_ENTRY_GPIO("gpios", &alchemy_gpic_node,
+ AU1300_PIN_WAKE3, GPIO_ACTIVE_LOW),
+ PROPERTY_ENTRY_U32("debounce-interval", 1),
+ PROPERTY_ENTRY_STRING("label", "5waysw-right"),
+ { }
+ },
+};
+
+static const struct software_node db1300_5waysw_left_node = {
+ .name = "5waysw-left",
+ .parent = &db1300_5waysw_node,
+ .properties = (const struct property_entry[]){
+ PROPERTY_ENTRY_U32("linux,code", KEY_LEFT),
+ PROPERTY_ENTRY_GPIO("gpios", &alchemy_gpic_node,
+ AU1300_PIN_WAKE2, GPIO_ACTIVE_LOW),
+ PROPERTY_ENTRY_U32("debounce-interval", 1),
+ PROPERTY_ENTRY_STRING("label", "5waysw-left"),
+ { }
+ },
+};
+
+static const struct software_node db1300_5waysw_push_node = {
+ .name = "5waysw-push",
+ .parent = &db1300_5waysw_node,
+ .properties = (const struct property_entry[]){
+ PROPERTY_ENTRY_U32("linux,code", KEY_ENTER),
+ PROPERTY_ENTRY_GPIO("gpios", &alchemy_gpic_node,
+ AU1300_PIN_WAKE1, GPIO_ACTIVE_LOW),
+ PROPERTY_ENTRY_U32("debounce-interval", 1),
+ PROPERTY_ENTRY_STRING("label", "5waysw-push"),
+ { }
+ },
+};
+
+static const struct software_node * const db1300_5waysw_swnodes[] __initconst = {
+ &db1300_5waysw_node,
+ &db1300_5waysw_down_node,
+ &db1300_5waysw_up_node,
+ &db1300_5waysw_right_node,
+ &db1300_5waysw_left_node,
+ &db1300_5waysw_push_node,
+ NULL
+};
+
+static void __init db1300_5waysw_init(void)
+{
+ struct platform_device *pd;
+ int err;

-static struct gpio_keys_platform_data db1300_5waysw_data = {
- .buttons = db1300_5waysw_arrowkeys,
- .nbuttons = ARRAY_SIZE(db1300_5waysw_arrowkeys),
- .rep = 1,
- .name = "db1300-5wayswitch",
-};
+ err = software_node_register_node_group(db1300_5waysw_swnodes);
+ if (err) {
+ pr_err("failed to register 5waysw software nodes: %d\n", err);
+ return;
+ }

-static struct platform_device db1300_5waysw_dev = {
- .name = "gpio-keys",
- .dev = {
- .platform_data = &db1300_5waysw_data,
- },
-};
+ pd = platform_device_register_full(&(struct platform_device_info){
+ .name = "gpio-keys",
+ .id = PLATFORM_DEVID_NONE,
+ .fwnode = software_node_fwnode(&db1300_5waysw_node),
+ });
+ err = PTR_ERR_OR_ZERO(pd);
+ if (err)
+ pr_err("failed to create 5waysw device: %d\n", err);
+}

/**********************************************************************/

@@ -764,9 +826,7 @@ static struct platform_driver db1300_wm97xx_driver = {
/**********************************************************************/

static struct platform_device *db1300_dev[] __initdata = {
- &db1300_eth_dev,
&db1300_i2c_dev,
- &db1300_5waysw_dev,
&db1300_nand_dev,
&db1300_ide_dev,
#ifdef CONFIG_MMC_AU1X
@@ -804,8 +864,6 @@ int __init db1300_dev_setup(void)
/*
* setup board
*/
- prom_get_ethernet_addr(&db1300_eth_config.mac[0]);
-
i2c_register_board_info(0, db1300_i2c_devs,
ARRAY_SIZE(db1300_i2c_devs));

@@ -848,6 +906,9 @@ int __init db1300_dev_setup(void)
swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT;
db1x_register_norflash(64 << 20, 2, swapped);

+ db1300_eth_init();
+ db1300_5waysw_init();
+
return platform_add_devices(db1300_dev, ARRAY_SIZE(db1300_dev));
}

diff --git a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
index 43d44f384f97..912534ecb1a4 100644
--- a/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
+++ b/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
@@ -14,6 +14,9 @@

struct gpio;
struct gpio_chip;
+struct software_node;
+
+extern const struct software_node alchemy_gpic_node;

/* with the current GPIC design, up to 128 GPIOs are possible.
* The only implementation so far is in the Au1300, which has 75 externally

--
2.53.0.473.g4a7958ca14-goog