summaryrefslogtreecommitdiff
path: root/arch/mips/rb532/devices.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/rb532/devices.c')
-rw-r--r--arch/mips/rb532/devices.c83
1 files changed, 61 insertions, 22 deletions
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c
index 4f027efbf27b..c3d8d96d0ef5 100644
--- a/arch/mips/rb532/devices.c
+++ b/arch/mips/rb532/devices.c
@@ -14,10 +14,11 @@
#include <linux/platform_device.h>
#include <linux/mtd/platnand.h>
#include <linux/mtd/mtd.h>
-#include <linux/gpio.h>
#include <linux/gpio/machine.h>
+#include <linux/gpio/property.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
+#include <linux/property.h>
#include <linux/serial_8250.h>
#include <asm/bootinfo.h>
@@ -38,6 +39,10 @@ extern unsigned int idt_cpu_freq;
static struct mpmc_device dev3;
+static const struct software_node rb532_gpio0_node = {
+ .name = "gpio0",
+};
+
void set_latch_u5(unsigned char or_mask, unsigned char nand_mask)
{
unsigned long flags;
@@ -129,12 +134,6 @@ static struct platform_device cf_slot0 = {
.num_resources = ARRAY_SIZE(cf_slot0_res),
};
-/* Resources and device for NAND */
-static int rb532_dev_ready(struct nand_chip *chip)
-{
- return gpio_get_value(GPIO_RDY);
-}
-
static void rb532_cmd_ctrl(struct nand_chip *chip, int cmd, unsigned int ctrl)
{
unsigned char orbits, nandbits;
@@ -160,16 +159,23 @@ static struct resource nand_slot0_res[] = {
};
static struct platform_nand_data rb532_nand_data = {
- .ctrl.dev_ready = rb532_dev_ready,
.ctrl.cmd_ctrl = rb532_cmd_ctrl,
};
-static struct platform_device nand_slot0 = {
- .name = "gen_nand",
- .id = -1,
- .resource = nand_slot0_res,
- .num_resources = ARRAY_SIZE(nand_slot0_res),
- .dev.platform_data = &rb532_nand_data,
+static const struct property_entry nand0_properties[] = {
+ PROPERTY_ENTRY_GPIO("ready-gpios", &rb532_gpio0_node,
+ GPIO_RDY, GPIO_ACTIVE_HIGH),
+ { }
+};
+
+static const struct platform_device_info nand0_info __initconst = {
+ .name = "gen_nand",
+ .id = PLATFORM_DEVID_NONE,
+ .res = nand_slot0_res,
+ .num_res = ARRAY_SIZE(nand_slot0_res),
+ .data = &rb532_nand_data,
+ .size_data = sizeof(struct platform_nand_data),
+ .properties = nand0_properties,
};
static struct mtd_partition rb532_partition_info[] = {
@@ -189,11 +195,6 @@ static struct platform_device rb532_led = {
.id = -1,
};
-static struct platform_device rb532_button = {
- .name = "rb532-button",
- .id = -1,
-};
-
static struct resource rb532_wdt_res[] = {
{
.name = "rb532_wdt_res",
@@ -233,14 +234,25 @@ static struct platform_device rb532_uart = {
static struct platform_device *rb532_devs[] = {
&korina_dev0,
- &nand_slot0,
&cf_slot0,
&rb532_led,
- &rb532_button,
&rb532_uart,
&rb532_wdt
};
+static const struct property_entry rb532_button_properties[] = {
+ PROPERTY_ENTRY_GPIO("button-gpios", &rb532_gpio0_node,
+ GPIO_BTN_S1, GPIO_ACTIVE_LOW),
+ { }
+};
+
+static const struct platform_device_info rb532_button_info __initconst = {
+ .name = "rb532-button",
+ .id = PLATFORM_DEVID_NONE,
+ .properties = rb532_button_properties,
+};
+
+
/* NAND definitions */
#define NAND_CHIP_DELAY 25
@@ -267,6 +279,9 @@ static void __init rb532_nand_setup(void)
static int __init plat_setup_devices(void)
{
+ struct platform_device *pd;
+ int ret;
+
/* Look for the CF card reader */
if (!readl(IDT434_REG_BASE + DEV1MASK))
rb532_devs[2] = NULL; /* disable cf_slot0 at index 2 */
@@ -295,7 +310,31 @@ static int __init plat_setup_devices(void)
rb532_uart_res[0].uartclk = idt_cpu_freq;
gpiod_add_lookup_table(&cf_slot0_gpio_table);
- return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs));
+ ret = platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs));
+ if (ret)
+ return ret;
+
+ /*
+ * Stack devices using full info and properties here, after we
+ * register the node for the GPIO chip.
+ */
+ software_node_register(&rb532_gpio0_node);
+
+ pd = platform_device_register_full(&nand0_info);
+ ret = PTR_ERR_OR_ZERO(pd);
+ if (ret) {
+ pr_err("failed to create NAND slot0 device: %d\n", ret);
+ return ret;
+ }
+
+ pd = platform_device_register_full(&rb532_button_info);
+ ret = PTR_ERR_OR_ZERO(pd);
+ if (ret) {
+ pr_err("failed to create RB532 button device: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
}
#ifdef CONFIG_NET