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

Dmitry Torokhov posted 4 patches 3 weeks, 5 days ago
[PATCH 4/4] MIPS: alchemy: db1300: switch to static device properties
Posted by Dmitry Torokhov 3 weeks, 5 days ago
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@gmail.com>
---
 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