aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/adm5120/files/arch/mips/adm5120/common/platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/adm5120/files/arch/mips/adm5120/common/platform.c')
-rw-r--r--target/linux/adm5120/files/arch/mips/adm5120/common/platform.c52
1 files changed, 33 insertions, 19 deletions
diff --git a/target/linux/adm5120/files/arch/mips/adm5120/common/platform.c b/target/linux/adm5120/files/arch/mips/adm5120/common/platform.c
index de761095c6..809d77b8a3 100644
--- a/target/linux/adm5120/files/arch/mips/adm5120/common/platform.c
+++ b/target/linux/adm5120/files/arch/mips/adm5120/common/platform.c
@@ -18,6 +18,7 @@
#include <linux/gpio.h>
#include <linux/irq.h>
#include <linux/slab.h>
+#include <linux/export.h>
#include <asm/bootinfo.h>
@@ -244,31 +245,44 @@ void __init adm5120_add_device_uart(unsigned id)
/*
* GPIO buttons
*/
-#define ADM5120_BUTTON_INTERVAL 20
-struct gpio_buttons_platform_data adm5120_gpio_buttons_data = {
- .poll_interval = ADM5120_BUTTON_INTERVAL,
-};
-
-struct platform_device adm5120_gpio_buttons_device = {
- .name = "gpio-buttons",
- .id = -1,
- .dev.platform_data = &adm5120_gpio_buttons_data,
-};
-
-void __init adm5120_add_device_gpio_buttons(unsigned nbuttons,
- struct gpio_button *buttons)
+void __init adm5120_register_gpio_buttons(int id,
+ unsigned poll_interval,
+ unsigned nbuttons,
+ struct gpio_keys_button *buttons)
{
- struct gpio_button *p;
+ struct platform_device *pdev;
+ struct gpio_keys_platform_data pdata;
+ struct gpio_keys_button *p;
+ int err;
- p = kmalloc(nbuttons * sizeof(*p), GFP_KERNEL);
+ p = kmemdup(buttons, nbuttons * sizeof(*p), GFP_KERNEL);
if (!p)
return;
- memcpy(p, buttons, nbuttons * sizeof(*p));
- adm5120_gpio_buttons_data.nbuttons = nbuttons;
- adm5120_gpio_buttons_data.buttons = p;
+ pdev = platform_device_alloc("gpio-keys-polled", id);
+ if (!pdev)
+ goto err_free_buttons;
+
+ memset(&pdata, 0, sizeof(pdata));
+ pdata.poll_interval = poll_interval;
+ pdata.nbuttons = nbuttons;
+ pdata.buttons = p;
+
+ err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
+ if (err)
+ goto err_put_pdev;
+
+ err = platform_device_add(pdev);
+ if (err)
+ goto err_put_pdev;
+
+ return;
+
+err_put_pdev:
+ platform_device_put(pdev);
- platform_device_register(&adm5120_gpio_buttons_device);
+err_free_buttons:
+ kfree(p);
}
/*