3 # Patch managed by http://www.holgerschurig.de/patcher.html
6 --- linux-2.4.27/drivers/misc/switches.h~simpad-switches-input
7 +++ linux-2.4.27/drivers/misc/switches.h
9 extern int switches_ucb1x00_init(void);
10 extern void switches_ucb1x00_exit(void);
12 +#ifdef CONFIG_SA1100_SIMPAD
13 +#define SIMPAD_KEY_SUSPEND 0x0002
14 +#define SIMPAD_KEY_WWW 0x0008
15 +#define SIMPAD_KEY_ENTER 0x0010
16 +#define SIMPAD_KEY_UP 0x0020
17 +#define SIMPAD_KEY_DOWN 0x0040
18 +#define SIMPAD_KEY_LEFT 0x0080
19 +#define SIMPAD_KEY_RIGHT 0x0100
22 #endif /* !defined(_SWITCHES_H) */
23 --- linux-2.4.27/drivers/misc/switches-core.c~simpad-switches-input
24 +++ linux-2.4.27/drivers/misc/switches-core.c
26 * 11 September 2001 - UCB1200 driver framework support added.
28 * 19 December 2001 - separated out SA-1100 and UCB1x00 code.
30 + * 3 July 2004 - Added generating of keyboard events.
31 + * Florian Boor <florian@handhelds.org>
34 #include <linux/config.h>
36 #include <linux/slab.h>
37 #include <linux/wait.h>
39 +#include <linux/input.h>
41 #include <asm/uaccess.h>
42 +#include <asm/hardware.h>
43 +#include <asm/keyboard.h>
48 DECLARE_WAIT_QUEUE_HEAD(switches_wait);
49 LIST_HEAD(switches_event_queue);
52 +static struct input_dev idev;
55 +dummy_k_translate(unsigned char scancode, unsigned char *keycode, char raw_mode)
57 + *keycode = scancode;
61 +extern int (*k_translate)(unsigned char, unsigned char *, char);
65 static ssize_t switches_read(struct file *file, char *buffer,
66 size_t count, loff_t *pos)
69 struct switches_action *action;
72 + /* create input events, the events to send depends on the platform */
73 +#ifdef CONFIG_SA1100_SIMPAD
74 + if (machine_is_simpad()) {
75 + if (SWITCHES_COUNT(mask) > 0)
77 + if (mask->events[0] & SIMPAD_KEY_SUSPEND)
78 + input_report_key(&idev, KEY_POWER, (mask->states[0] & SIMPAD_KEY_SUSPEND) ? 0 : 1);
79 + if (mask->events[0] & SIMPAD_KEY_ENTER)
80 + input_report_key(&idev, KEY_ENTER, (mask->states[0] & SIMPAD_KEY_ENTER) ? 1 : 0);
81 + if (mask->events[0] & SIMPAD_KEY_UP)
82 + input_report_key(&idev, KEY_UP, (mask->states[0] & SIMPAD_KEY_UP) ? 1 : 0);
83 + if (mask->events[0] & SIMPAD_KEY_DOWN)
84 + input_report_key(&idev, KEY_DOWN, (mask->states[0] & SIMPAD_KEY_DOWN) ? 1 : 0);
85 + if (mask->events[0] & SIMPAD_KEY_LEFT)
86 + input_report_key(&idev, KEY_LEFT, (mask->states[0] & SIMPAD_KEY_LEFT) ? 1 : 0);
87 + if (mask->events[0] & SIMPAD_KEY_RIGHT)
88 + input_report_key(&idev, KEY_RIGHT, (mask->states[0] & SIMPAD_KEY_RIGHT) ? 1 : 0);
89 + if (mask->events[0] & SIMPAD_KEY_WWW)
90 + input_report_key(&idev, KEY_F10, (mask->states[0] & SIMPAD_KEY_WWW) ? 1 : 0);
95 + /* take care of switches device */
96 if ((switches_users > 0) && (SWITCHES_COUNT(mask) > 0)) {
98 if ((action = (struct switches_action *)
104 + /* init input driver stuff */
105 + k_translate = dummy_k_translate;
106 + idev.evbit[0] = BIT(EV_KEY); /* handle key events */
108 + idev.keybit[LONG(KEY_POWER)] |= BIT(KEY_POWER);
109 + idev.keybit[LONG(KEY_UP)] |= BIT(KEY_UP);
110 + idev.keybit[LONG(KEY_DOWN)] |= BIT(KEY_DOWN);
111 + idev.keybit[LONG(KEY_LEFT)] |= BIT(KEY_LEFT);
112 + idev.keybit[LONG(KEY_RIGHT)] |= BIT(KEY_RIGHT);
113 + idev.keybit[LONG(KEY_ENTER)] |= BIT(KEY_ENTER);
114 + idev.keybit[LONG(KEY_F10)] |= BIT(KEY_F10);
116 + input_register_device(&idev);
118 printk("Console switches initialized\n");
122 switches_ucb1x00_exit();
126 + input_unregister_device(&idev);
129 if (misc_deregister(&switches_misc) < 0)
130 printk(KERN_ERR "%s: unable to deregister misc device\n",