diff -ru linux-2.6.17.orig/arch/arm/mach-pxa/pxa_keys.c linux-2.6.17/arch/arm/mach-pxa/pxa_keys.c
--- linux-2.6.17.orig/arch/arm/mach-pxa/pxa_keys.c	2006-08-05 16:42:02 +0400
+++ linux-2.6.17/arch/arm/mach-pxa/pxa_keys.c	2006-08-08 19:42:16 +0400
@@ -41,10 +41,10 @@
 		if (irq == IRQ_GPIO(gpio)) {
 			int state = ((GPLR(gpio) & GPIO_bit(gpio)) ? 1 : 0) 
 				^ ((k->buttons[i].flags & PXAKEY_ACTIVE_LOW) != 0);
-			input_report_key (&k->input, k->buttons[i].keycode, state);
+			input_report_key (k->input, k->buttons[i].keycode, state);
 			if ((k->buttons[i].flags & PXAKEY_PWR_KEY)
 				&& time_after(jiffies, k->suspend_jiffies + HZ)) {
-					input_event(&k->input, EV_PWR, k->buttons[i].keycode, state);
+					input_event(k->input, EV_PWR, k->buttons[i].keycode, state);
 				k->suspend_jiffies=jiffies;
 			}
 
@@ -80,14 +80,18 @@
 pxa_keys_probe (struct platform_device *pdev)
 {
 	struct pxa_keys_platform_data *k;
+	struct input_dev *input_dev;
 	int i;
 
 	k = pdev->dev.platform_data;
 	platform_set_drvdata(pdev, k);
+	input_dev = input_allocate_device();
+	if (!input_dev) {
+                return -ENOMEM;
+	}
+	k->input = input_dev;
 
-	init_input_dev (&k->input);
-
-	k->input.evbit[0] = BIT(EV_KEY) | BIT(EV_PWR) | BIT(EV_REP);
+	k->input->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR) | BIT(EV_REP);
 	for (i = 0; i < k->nbuttons; i++) {
 		int code = k->buttons[i].keycode;
 		int irq = IRQ_GPIO (k->buttons[i].gpio);
@@ -97,18 +101,18 @@
 		result = request_irq (irq, pxa_keys_isr, SA_SAMPLE_RANDOM,
 				      "pxa_keys", k);
 		if (result == 0)
-			set_bit (code, k->input.keybit);
+			set_bit (code, k->input->keybit);
 		else
 			printk("pxa_keys: unable to claim irq %d; error %d\n", irq, result);
 	}
 
-	k->input.name = pdev->name;
-	k->input.private = k;
+	k->input->name = pdev->name;
+	k->input->private = k;
 
 	k->suspend_jiffies=jiffies;
 	k->suspended=0;
 
-	input_register_device (&k->input);
+	input_register_device (k->input);
 
 	return 0;
 }
@@ -124,7 +128,7 @@
 		free_irq (irq, k);
 	}
 
-	input_unregister_device (&k->input);
+	input_unregister_device (k->input);
 
 	return 0;
 }
diff -ru linux-2.6.17.orig/include/asm-arm/arch-pxa/pxa_keys.h linux-2.6.17/include/asm-arm/arch-pxa/pxa_keys.h
--- linux-2.6.17.orig/include/asm-arm/arch-pxa/pxa_keys.h	2006-08-05 16:42:02 +0400
+++ linux-2.6.17/include/asm-arm/arch-pxa/pxa_keys.h	2006-08-08 18:23:42 +0400
@@ -11,7 +11,7 @@
 struct pxa_keys_platform_data {
 	struct pxa_keys_button *buttons;
 	int nbuttons;
-	struct input_dev input;
+	struct input_dev *input;
 	unsigned int suspended;
 	unsigned long suspend_jiffies;
 };

