aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2006-10-05 09:55:46 -0400
committerDavid Howells <dhowells@warthog.cambridge.redhat.com>2006-10-05 10:10:12 -0400
commit7d12e780e003f93433d49ce78cfedf4b4c52adc5 (patch)
tree6748550400445c11a306b132009f3001e3525df8 /drivers/input/keyboard
parentda482792a6d1a3fbaaa25fae867b343fb4db3246 (diff)
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
Maintain a per-CPU global "struct pt_regs *" variable which can be used instead of passing regs around manually through all ~1800 interrupt handlers in the Linux kernel. The regs pointer is used in few places, but it potentially costs both stack space and code to pass it around. On the FRV arch, removing the regs parameter from all the genirq function results in a 20% speed up of the IRQ exit path (ie: from leaving timer_interrupt() to leaving do_IRQ()). Where appropriate, an arch may override the generic storage facility and do something different with the variable. On FRV, for instance, the address is maintained in GR28 at all times inside the kernel as part of general exception handling. Having looked over the code, it appears that the parameter may be handed down through up to twenty or so layers of functions. Consider a USB character device attached to a USB hub, attached to a USB controller that posts its interrupts through a cascaded auxiliary interrupt controller. A character device driver may want to pass regs to the sysrq handler through the input layer which adds another few layers of parameter passing. I've build this code with allyesconfig for x86_64 and i386. I've runtested the main part of the code on FRV and i386, though I can't test most of the drivers. I've also done partial conversion for powerpc and MIPS - these at least compile with minimal configurations. This will affect all archs. Mostly the changes should be relatively easy. Take do_IRQ(), store the regs pointer at the beginning, saving the old one: struct pt_regs *old_regs = set_irq_regs(regs); And put the old one back at the end: set_irq_regs(old_regs); Don't pass regs through to generic_handle_irq() or __do_IRQ(). In timer_interrupt(), this sort of change will be necessary: - update_process_times(user_mode(regs)); - profile_tick(CPU_PROFILING, regs); + update_process_times(user_mode(get_irq_regs())); + profile_tick(CPU_PROFILING); I'd like to move update_process_times()'s use of get_irq_regs() into itself, except that i386, alone of the archs, uses something other than user_mode(). Some notes on the interrupt handling in the drivers: (*) input_dev() is now gone entirely. The regs pointer is no longer stored in the input_dev struct. (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does something different depending on whether it's been supplied with a regs pointer or not. (*) Various IRQ handler function pointers have been moved to type irq_handler_t. Signed-Off-By: David Howells <dhowells@redhat.com> (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
Diffstat (limited to 'drivers/input/keyboard')
-rw-r--r--drivers/input/keyboard/amikbd.c4
-rw-r--r--drivers/input/keyboard/atkbd.c4
-rw-r--r--drivers/input/keyboard/corgikbd.c9
-rw-r--r--drivers/input/keyboard/hil_kbd.c2
-rw-r--r--drivers/input/keyboard/hilkbd.c2
-rw-r--r--drivers/input/keyboard/lkkbd.c5
-rw-r--r--drivers/input/keyboard/locomokbd.c8
-rw-r--r--drivers/input/keyboard/newtonkbd.c3
-rw-r--r--drivers/input/keyboard/omap-keypad.c3
-rw-r--r--drivers/input/keyboard/spitzkbd.c10
-rw-r--r--drivers/input/keyboard/stowaway.c3
-rw-r--r--drivers/input/keyboard/sunkbd.c3
-rw-r--r--drivers/input/keyboard/xtkbd.c3
13 files changed, 20 insertions, 39 deletions
diff --git a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c
index f1f9db9d282c..8abdbd0ee8f9 100644
--- a/drivers/input/keyboard/amikbd.c
+++ b/drivers/input/keyboard/amikbd.c
@@ -158,7 +158,7 @@ static const char *amikbd_messages[8] = {
158 158
159static struct input_dev *amikbd_dev; 159static struct input_dev *amikbd_dev;
160 160
161static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp) 161static irqreturn_t amikbd_interrupt(int irq, void *dummy)
162{ 162{
163 unsigned char scancode, down; 163 unsigned char scancode, down;
164 164
@@ -171,8 +171,6 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp)
171 scancode >>= 1; 171 scancode >>= 1;
172 172
173 if (scancode < 0x78) { /* scancodes < 0x78 are keys */ 173 if (scancode < 0x78) { /* scancodes < 0x78 are keys */
174 input_regs(amikbd_dev, fp);
175
176 if (scancode == 98) { /* CapsLock is a toggle switch key on Amiga */ 174 if (scancode == 98) { /* CapsLock is a toggle switch key on Amiga */
177 input_report_key(amikbd_dev, scancode, 1); 175 input_report_key(amikbd_dev, scancode, 1);
178 input_report_key(amikbd_dev, scancode, 0); 176 input_report_key(amikbd_dev, scancode, 0);
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index 40244d4ce0f1..b6ef9eaad1dc 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -318,7 +318,7 @@ static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code
318 */ 318 */
319 319
320static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, 320static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
321 unsigned int flags, struct pt_regs *regs) 321 unsigned int flags)
322{ 322{
323 struct atkbd *atkbd = serio_get_drvdata(serio); 323 struct atkbd *atkbd = serio_get_drvdata(serio);
324 struct input_dev *dev = atkbd->dev; 324 struct input_dev *dev = atkbd->dev;
@@ -458,7 +458,6 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
458 atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2; 458 atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2;
459 } 459 }
460 460
461 input_regs(dev, regs);
462 input_event(dev, EV_KEY, keycode, value); 461 input_event(dev, EV_KEY, keycode, value);
463 input_sync(dev); 462 input_sync(dev);
464 463
@@ -469,7 +468,6 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
469 } 468 }
470 469
471 if (atkbd->scroll) { 470 if (atkbd->scroll) {
472 input_regs(dev, regs);
473 if (click != -1) 471 if (click != -1)
474 input_report_key(dev, BTN_MIDDLE, click); 472 input_report_key(dev, BTN_MIDDLE, click);
475 input_report_rel(dev, REL_WHEEL, scroll); 473 input_report_rel(dev, REL_WHEEL, scroll);
diff --git a/drivers/input/keyboard/corgikbd.c b/drivers/input/keyboard/corgikbd.c
index 1e03153b9bca..cb70970625b5 100644
--- a/drivers/input/keyboard/corgikbd.c
+++ b/drivers/input/keyboard/corgikbd.c
@@ -129,7 +129,7 @@ static inline void corgikbd_reset_col(int col)
129 */ 129 */
130 130
131/* Scan the hardware keyboard and push any changes up through the input layer */ 131/* Scan the hardware keyboard and push any changes up through the input layer */
132static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs *regs) 132static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data)
133{ 133{
134 unsigned int row, col, rowd; 134 unsigned int row, col, rowd;
135 unsigned long flags; 135 unsigned long flags;
@@ -140,9 +140,6 @@ static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs
140 140
141 spin_lock_irqsave(&corgikbd_data->lock, flags); 141 spin_lock_irqsave(&corgikbd_data->lock, flags);
142 142
143 if (regs)
144 input_regs(corgikbd_data->input, regs);
145
146 num_pressed = 0; 143 num_pressed = 0;
147 for (col = 0; col < KB_COLS; col++) { 144 for (col = 0; col < KB_COLS; col++) {
148 /* 145 /*
@@ -191,14 +188,14 @@ static void corgikbd_scankeyboard(struct corgikbd *corgikbd_data, struct pt_regs
191/* 188/*
192 * corgi keyboard interrupt handler. 189 * corgi keyboard interrupt handler.
193 */ 190 */
194static irqreturn_t corgikbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) 191static irqreturn_t corgikbd_interrupt(int irq, void *dev_id)
195{ 192{
196 struct corgikbd *corgikbd_data = dev_id; 193 struct corgikbd *corgikbd_data = dev_id;
197 194
198 if (!timer_pending(&corgikbd_data->timer)) { 195 if (!timer_pending(&corgikbd_data->timer)) {
199 /** wait chattering delay **/ 196 /** wait chattering delay **/
200 udelay(20); 197 udelay(20);
201 corgikbd_scankeyboard(corgikbd_data, regs); 198 corgikbd_scankeyboard(corgikbd_data);
202 } 199 }
203 200
204 return IRQ_HANDLED; 201 return IRQ_HANDLED;
diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c
index 2e4abdc26367..c9b0b8978cd8 100644
--- a/drivers/input/keyboard/hil_kbd.c
+++ b/drivers/input/keyboard/hil_kbd.c
@@ -198,7 +198,7 @@ static void hil_kbd_process_err(struct hil_kbd *kbd) {
198} 198}
199 199
200static irqreturn_t hil_kbd_interrupt(struct serio *serio, 200static irqreturn_t hil_kbd_interrupt(struct serio *serio,
201 unsigned char data, unsigned int flags, struct pt_regs *regs) 201 unsigned char data, unsigned int flags)
202{ 202{
203 struct hil_kbd *kbd; 203 struct hil_kbd *kbd;
204 hil_packet packet; 204 hil_packet packet;
diff --git a/drivers/input/keyboard/hilkbd.c b/drivers/input/keyboard/hilkbd.c
index d22c7c624296..54bc569db4b0 100644
--- a/drivers/input/keyboard/hilkbd.c
+++ b/drivers/input/keyboard/hilkbd.c
@@ -150,7 +150,7 @@ static inline void handle_data(unsigned char s, unsigned char c)
150/* 150/*
151 * Handle HIL interrupts. 151 * Handle HIL interrupts.
152 */ 152 */
153static irqreturn_t hil_interrupt(int irq, void *handle, struct pt_regs *regs) 153static irqreturn_t hil_interrupt(int irq, void *handle)
154{ 154{
155 unsigned char s, c; 155 unsigned char s, c;
156 156
diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c
index 5174224cadb4..708d5a1bc3d2 100644
--- a/drivers/input/keyboard/lkkbd.c
+++ b/drivers/input/keyboard/lkkbd.c
@@ -453,8 +453,7 @@ lkkbd_detection_done (struct lkkbd *lk)
453 * is received. 453 * is received.
454 */ 454 */
455static irqreturn_t 455static irqreturn_t
456lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags, 456lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags)
457 struct pt_regs *regs)
458{ 457{
459 struct lkkbd *lk = serio_get_drvdata (serio); 458 struct lkkbd *lk = serio_get_drvdata (serio);
460 int i; 459 int i;
@@ -473,7 +472,6 @@ lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags,
473 472
474 switch (data) { 473 switch (data) {
475 case LK_ALL_KEYS_UP: 474 case LK_ALL_KEYS_UP:
476 input_regs (lk->dev, regs);
477 for (i = 0; i < ARRAY_SIZE (lkkbd_keycode); i++) 475 for (i = 0; i < ARRAY_SIZE (lkkbd_keycode); i++)
478 if (lk->keycode[i] != KEY_RESERVED) 476 if (lk->keycode[i] != KEY_RESERVED)
479 input_report_key (lk->dev, lk->keycode[i], 0); 477 input_report_key (lk->dev, lk->keycode[i], 0);
@@ -501,7 +499,6 @@ lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags,
501 499
502 default: 500 default:
503 if (lk->keycode[data] != KEY_RESERVED) { 501 if (lk->keycode[data] != KEY_RESERVED) {
504 input_regs (lk->dev, regs);
505 if (!test_bit (lk->keycode[data], lk->dev->key)) 502 if (!test_bit (lk->keycode[data], lk->dev->key))
506 input_report_key (lk->dev, lk->keycode[data], 1); 503 input_report_key (lk->dev, lk->keycode[data], 1);
507 else 504 else
diff --git a/drivers/input/keyboard/locomokbd.c b/drivers/input/keyboard/locomokbd.c
index 83906f80ba21..fd33c9cc3272 100644
--- a/drivers/input/keyboard/locomokbd.c
+++ b/drivers/input/keyboard/locomokbd.c
@@ -126,7 +126,7 @@ static inline void locomokbd_reset_col(unsigned long membase, int col)
126 */ 126 */
127 127
128/* Scan the hardware keyboard and push any changes up through the input layer */ 128/* Scan the hardware keyboard and push any changes up through the input layer */
129static void locomokbd_scankeyboard(struct locomokbd *locomokbd, struct pt_regs *regs) 129static void locomokbd_scankeyboard(struct locomokbd *locomokbd)
130{ 130{
131 unsigned int row, col, rowd, scancode; 131 unsigned int row, col, rowd, scancode;
132 unsigned long flags; 132 unsigned long flags;
@@ -135,8 +135,6 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd, struct pt_regs *
135 135
136 spin_lock_irqsave(&locomokbd->lock, flags); 136 spin_lock_irqsave(&locomokbd->lock, flags);
137 137
138 input_regs(locomokbd->input, regs);
139
140 locomokbd_charge_all(membase); 138 locomokbd_charge_all(membase);
141 139
142 num_pressed = 0; 140 num_pressed = 0;
@@ -171,13 +169,13 @@ static void locomokbd_scankeyboard(struct locomokbd *locomokbd, struct pt_regs *
171/* 169/*
172 * LoCoMo keyboard interrupt handler. 170 * LoCoMo keyboard interrupt handler.
173 */ 171 */
174static irqreturn_t locomokbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) 172static irqreturn_t locomokbd_interrupt(int irq, void *dev_id)
175{ 173{
176 struct locomokbd *locomokbd = dev_id; 174 struct locomokbd *locomokbd = dev_id;
177 /** wait chattering delay **/ 175 /** wait chattering delay **/
178 udelay(100); 176 udelay(100);
179 177
180 locomokbd_scankeyboard(locomokbd, regs); 178 locomokbd_scankeyboard(locomokbd);
181 179
182 return IRQ_HANDLED; 180 return IRQ_HANDLED;
183} 181}
diff --git a/drivers/input/keyboard/newtonkbd.c b/drivers/input/keyboard/newtonkbd.c
index 40a3f551247e..9282e4e082bd 100644
--- a/drivers/input/keyboard/newtonkbd.c
+++ b/drivers/input/keyboard/newtonkbd.c
@@ -65,13 +65,12 @@ struct nkbd {
65}; 65};
66 66
67static irqreturn_t nkbd_interrupt(struct serio *serio, 67static irqreturn_t nkbd_interrupt(struct serio *serio,
68 unsigned char data, unsigned int flags, struct pt_regs *regs) 68 unsigned char data, unsigned int flags)
69{ 69{
70 struct nkbd *nkbd = serio_get_drvdata(serio); 70 struct nkbd *nkbd = serio_get_drvdata(serio);
71 71
72 /* invalid scan codes are probably the init sequence, so we ignore them */ 72 /* invalid scan codes are probably the init sequence, so we ignore them */
73 if (nkbd->keycode[data & NKBD_KEY]) { 73 if (nkbd->keycode[data & NKBD_KEY]) {
74 input_regs(nkbd->dev, regs);
75 input_report_key(nkbd->dev, nkbd->keycode[data & NKBD_KEY], data & NKBD_PRESS); 74 input_report_key(nkbd->dev, nkbd->keycode[data & NKBD_KEY], data & NKBD_PRESS);
76 input_sync(nkbd->dev); 75 input_sync(nkbd->dev);
77 } 76 }
diff --git a/drivers/input/keyboard/omap-keypad.c b/drivers/input/keyboard/omap-keypad.c
index d436287d1d2e..5680a6d95b2b 100644
--- a/drivers/input/keyboard/omap-keypad.c
+++ b/drivers/input/keyboard/omap-keypad.c
@@ -97,8 +97,7 @@ static u8 get_row_gpio_val(struct omap_kp *omap_kp)
97#define get_row_gpio_val(x) 0 97#define get_row_gpio_val(x) 0
98#endif 98#endif
99 99
100static irqreturn_t omap_kp_interrupt(int irq, void *dev_id, 100static irqreturn_t omap_kp_interrupt(int irq, void *dev_id)
101 struct pt_regs *regs)
102{ 101{
103 struct omap_kp *omap_kp = dev_id; 102 struct omap_kp *omap_kp = dev_id;
104 103
diff --git a/drivers/input/keyboard/spitzkbd.c b/drivers/input/keyboard/spitzkbd.c
index e385710233f4..8b18c009e3e0 100644
--- a/drivers/input/keyboard/spitzkbd.c
+++ b/drivers/input/keyboard/spitzkbd.c
@@ -176,7 +176,7 @@ static inline int spitzkbd_get_row_status(int col)
176 */ 176 */
177 177
178/* Scan the hardware keyboard and push any changes up through the input layer */ 178/* Scan the hardware keyboard and push any changes up through the input layer */
179static void spitzkbd_scankeyboard(struct spitzkbd *spitzkbd_data, struct pt_regs *regs) 179static void spitzkbd_scankeyboard(struct spitzkbd *spitzkbd_data)
180{ 180{
181 unsigned int row, col, rowd; 181 unsigned int row, col, rowd;
182 unsigned long flags; 182 unsigned long flags;
@@ -187,8 +187,6 @@ static void spitzkbd_scankeyboard(struct spitzkbd *spitzkbd_data, struct pt_regs
187 187
188 spin_lock_irqsave(&spitzkbd_data->lock, flags); 188 spin_lock_irqsave(&spitzkbd_data->lock, flags);
189 189
190 input_regs(spitzkbd_data->input, regs);
191
192 num_pressed = 0; 190 num_pressed = 0;
193 for (col = 0; col < KB_COLS; col++) { 191 for (col = 0; col < KB_COLS; col++) {
194 /* 192 /*
@@ -239,14 +237,14 @@ static void spitzkbd_scankeyboard(struct spitzkbd *spitzkbd_data, struct pt_regs
239/* 237/*
240 * spitz keyboard interrupt handler. 238 * spitz keyboard interrupt handler.
241 */ 239 */
242static irqreturn_t spitzkbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) 240static irqreturn_t spitzkbd_interrupt(int irq, void *dev_id)
243{ 241{
244 struct spitzkbd *spitzkbd_data = dev_id; 242 struct spitzkbd *spitzkbd_data = dev_id;
245 243
246 if (!timer_pending(&spitzkbd_data->timer)) { 244 if (!timer_pending(&spitzkbd_data->timer)) {
247 /** wait chattering delay **/ 245 /** wait chattering delay **/
248 udelay(20); 246 udelay(20);
249 spitzkbd_scankeyboard(spitzkbd_data, regs); 247 spitzkbd_scankeyboard(spitzkbd_data);
250 } 248 }
251 249
252 return IRQ_HANDLED; 250 return IRQ_HANDLED;
@@ -267,7 +265,7 @@ static void spitzkbd_timer_callback(unsigned long data)
267 * We debounce the switches and pass them to the input system. 265 * We debounce the switches and pass them to the input system.
268 */ 266 */
269 267
270static irqreturn_t spitzkbd_hinge_isr(int irq, void *dev_id, struct pt_regs *regs) 268static irqreturn_t spitzkbd_hinge_isr(int irq, void *dev_id)
271{ 269{
272 struct spitzkbd *spitzkbd_data = dev_id; 270 struct spitzkbd *spitzkbd_data = dev_id;
273 271
diff --git a/drivers/input/keyboard/stowaway.c b/drivers/input/keyboard/stowaway.c
index 04c54c57f25c..e60937d17b1c 100644
--- a/drivers/input/keyboard/stowaway.c
+++ b/drivers/input/keyboard/stowaway.c
@@ -71,13 +71,12 @@ struct skbd {
71}; 71};
72 72
73static irqreturn_t skbd_interrupt(struct serio *serio, unsigned char data, 73static irqreturn_t skbd_interrupt(struct serio *serio, unsigned char data,
74 unsigned int flags, struct pt_regs *regs) 74 unsigned int flags)
75{ 75{
76 struct skbd *skbd = serio_get_drvdata(serio); 76 struct skbd *skbd = serio_get_drvdata(serio);
77 struct input_dev *dev = skbd->dev; 77 struct input_dev *dev = skbd->dev;
78 78
79 if (skbd->keycode[data & SKBD_KEY_MASK]) { 79 if (skbd->keycode[data & SKBD_KEY_MASK]) {
80 input_regs(dev, regs);
81 input_report_key(dev, skbd->keycode[data & SKBD_KEY_MASK], 80 input_report_key(dev, skbd->keycode[data & SKBD_KEY_MASK],
82 !(data & SKBD_RELEASE)); 81 !(data & SKBD_RELEASE));
83 input_sync(dev); 82 input_sync(dev);
diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c
index 9dbd7b85686d..cac4781103c3 100644
--- a/drivers/input/keyboard/sunkbd.c
+++ b/drivers/input/keyboard/sunkbd.c
@@ -94,7 +94,7 @@ struct sunkbd {
94 */ 94 */
95 95
96static irqreturn_t sunkbd_interrupt(struct serio *serio, 96static irqreturn_t sunkbd_interrupt(struct serio *serio,
97 unsigned char data, unsigned int flags, struct pt_regs *regs) 97 unsigned char data, unsigned int flags)
98{ 98{
99 struct sunkbd* sunkbd = serio_get_drvdata(serio); 99 struct sunkbd* sunkbd = serio_get_drvdata(serio);
100 100
@@ -129,7 +129,6 @@ static irqreturn_t sunkbd_interrupt(struct serio *serio,
129 break; 129 break;
130 130
131 if (sunkbd->keycode[data & SUNKBD_KEY]) { 131 if (sunkbd->keycode[data & SUNKBD_KEY]) {
132 input_regs(sunkbd->dev, regs);
133 input_report_key(sunkbd->dev, sunkbd->keycode[data & SUNKBD_KEY], !(data & SUNKBD_RELEASE)); 132 input_report_key(sunkbd->dev, sunkbd->keycode[data & SUNKBD_KEY], !(data & SUNKBD_RELEASE));
134 input_sync(sunkbd->dev); 133 input_sync(sunkbd->dev);
135 } else { 134 } else {
diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c
index 0821d53cf0c1..8c11dc935454 100644
--- a/drivers/input/keyboard/xtkbd.c
+++ b/drivers/input/keyboard/xtkbd.c
@@ -64,7 +64,7 @@ struct xtkbd {
64}; 64};
65 65
66static irqreturn_t xtkbd_interrupt(struct serio *serio, 66static irqreturn_t xtkbd_interrupt(struct serio *serio,
67 unsigned char data, unsigned int flags, struct pt_regs *regs) 67 unsigned char data, unsigned int flags)
68{ 68{
69 struct xtkbd *xtkbd = serio_get_drvdata(serio); 69 struct xtkbd *xtkbd = serio_get_drvdata(serio);
70 70
@@ -75,7 +75,6 @@ static irqreturn_t xtkbd_interrupt(struct serio *serio,
75 default: 75 default:
76 76
77 if (xtkbd->keycode[data & XTKBD_KEY]) { 77 if (xtkbd->keycode[data & XTKBD_KEY]) {
78 input_regs(xtkbd->dev, regs);
79 input_report_key(xtkbd->dev, xtkbd->keycode[data & XTKBD_KEY], !(data & XTKBD_RELEASE)); 78 input_report_key(xtkbd->dev, xtkbd->keycode[data & XTKBD_KEY], !(data & XTKBD_RELEASE));
80 input_sync(xtkbd->dev); 79 input_sync(xtkbd->dev);
81 } else { 80 } else {