+ .set = lq_ebu_set,
+ .base = 32,
+ .ngpio = 16,
-+ .can_sleep = 1,
++ .can_sleep = 0,
+ .owner = THIS_MODULE,
+};
+
+ .set = lq_stp_set,
+ .base = 48,
+ .ngpio = 24,
-+ .can_sleep = 1,
++ .can_sleep = 0,
+ .owner = THIS_MODULE,
+};
+
+}
--- /dev/null
+++ b/arch/mips/lantiq/xway/devices.c
-@@ -0,0 +1,278 @@
+@@ -0,0 +1,336 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+#include <linux/time.h>
+#include <linux/io.h>
+#include <linux/gpio.h>
++#include <linux/gpio_buttons.h>
+#include <linux/leds.h>
+
+#include <asm/bootinfo.h>
+ platform_device_register(&lq_gpio_leds);
+}
+
++/* gpio buttons */
++static struct gpio_buttons_platform_data lq_gpio_buttons_platform_data;
++
++static struct platform_device lq_gpio_buttons_platform_device =
++{
++ .name = "gpio-buttons",
++ .id = 0,
++ .dev = {
++ .platform_data = (void *) &lq_gpio_buttons_platform_data,
++ },
++};
++
++void __init
++lq_register_gpio_buttons(struct gpio_button *buttons, int cnt)
++{
++ lq_gpio_buttons_platform_data.buttons = buttons;
++ lq_gpio_buttons_platform_data.nbuttons = cnt;
++ platform_device_register(&lq_gpio_buttons_platform_device);
++}
++
+/* serial to parallel conversion */
+static struct resource lq_stp_resource =
+{
+ .flags = IORESOURCE_MEM,
+};
+
++static struct platform_device lq_ebu =
++{
++ .name = "lq_ebu",
++ .resource = &lq_ebu_resource,
++ .num_resources = 1,
++};
++
+void __init
+lq_register_gpio_ebu(unsigned int value)
+{
-+ platform_device_register_simple("lq_ebu", 0, &lq_ebu_resource, 1);
++ lq_ebu.dev.platform_data = (void*) value;
++ platform_device_register(&lq_ebu);
+}
+
+/* ethernet */
+ },
+};
+
++static unsigned int *cp1_base;
++unsigned int*
++lq_get_cp1_base(void)
++{
++ return cp1_base;
++}
++EXPORT_SYMBOL(lq_get_cp1_base);
++
+void __init
+lq_register_tapi(void)
+{
+#define CP1_SIZE (1 << 20)
+ dma_addr_t dma;
+ mps_device.dev.platform_data =
++ cp1_base =
+ (void*)CPHYSADDR(dma_alloc_coherent(NULL, CP1_SIZE, &dma, GFP_ATOMIC));
++ mps_device.dev.platform_data = cp1_base;
+ platform_device_register(&mps_device);
+ platform_device_register(&vmmc_device);
+}
+ break;
+ }
+}
++
++void __init
++lq_register_crypto(const char *name)
++{
++ platform_device_register_simple(name, 0, 0, 0);
++}
++
++/* madwifi */
++int lantiq_emulate_madwifi_eep = 0;
++EXPORT_SYMBOL(lantiq_emulate_madwifi_eep);
++
++void __init
++lq_register_madwifi_eep(void)
++{
++ lantiq_emulate_madwifi_eep = 1;
++}
++
++
++
--- /dev/null
+++ b/arch/mips/lantiq/xway/devices.h
-@@ -0,0 +1,25 @@
+@@ -0,0 +1,28 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+extern void __init lq_register_gpio_leds(struct gpio_led *leds, int cnt);
+extern void __init lq_register_pci(struct lq_pci_data *data);
+extern void __init lq_register_nor(struct physmap_flash_data *data);
++extern void __init lq_register_tapi(void);
++extern void __init lq_register_madwifi_eep(void);
+extern void __init lq_register_wdt(void);
+extern void __init lq_register_ethernet(struct lq_eth_data *eth);
+extern void __init lq_register_asc(int port);
++extern void __init lq_register_gpio_buttons(struct gpio_button *buttons, int cnt);
+
+#endif
--- /dev/null
+ struct timer_dev_timer timer[MAX_NUM_OF_32BIT_TIMER_BLOCKS * 2];
+};
+
-+static int gptu_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++static long gptu_ioctl(struct file *, unsigned int, unsigned long);
+static int gptu_open(struct inode *, struct file *);
+static int gptu_release(struct inode *, struct file *);
+
+static struct file_operations gptu_fops = {
+ .owner = THIS_MODULE,
-+ .ioctl = gptu_ioctl,
++ .unlocked_ioctl = gptu_ioctl,
+ .open = gptu_open,
+ .release = gptu_release
+};
+}
+EXPORT_SYMBOL(lq_set_counter);
+
-+static int gptu_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
++static long gptu_ioctl(struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ int ret;