aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/serio
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/serio
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/serio')
-rw-r--r--drivers/input/serio/ambakmi.c4
-rw-r--r--drivers/input/serio/ct82c710.c4
-rw-r--r--drivers/input/serio/gscps2.c6
-rw-r--r--drivers/input/serio/hp_sdc.c4
-rw-r--r--drivers/input/serio/i8042.c12
-rw-r--r--drivers/input/serio/maceps2.c5
-rw-r--r--drivers/input/serio/parkbd.c4
-rw-r--r--drivers/input/serio/pcips2.c4
-rw-r--r--drivers/input/serio/q40kbd.c4
-rw-r--r--drivers/input/serio/rpckbd.c6
-rw-r--r--drivers/input/serio/sa1111ps2.c6
-rw-r--r--drivers/input/serio/serio.c4
-rw-r--r--drivers/input/serio/serio_raw.c2
-rw-r--r--drivers/input/serio/serport.c5
14 files changed, 33 insertions, 37 deletions
diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c
index 3df5eedf8f31..5a7b49c35539 100644
--- a/drivers/input/serio/ambakmi.c
+++ b/drivers/input/serio/ambakmi.c
@@ -37,14 +37,14 @@ struct amba_kmi_port {
37 unsigned int open; 37 unsigned int open;
38}; 38};
39 39
40static irqreturn_t amba_kmi_int(int irq, void *dev_id, struct pt_regs *regs) 40static irqreturn_t amba_kmi_int(int irq, void *dev_id)
41{ 41{
42 struct amba_kmi_port *kmi = dev_id; 42 struct amba_kmi_port *kmi = dev_id;
43 unsigned int status = readb(KMIIR); 43 unsigned int status = readb(KMIIR);
44 int handled = IRQ_NONE; 44 int handled = IRQ_NONE;
45 45
46 while (status & KMIIR_RXINTR) { 46 while (status & KMIIR_RXINTR) {
47 serio_interrupt(kmi->io, readb(KMIDATA), 0, regs); 47 serio_interrupt(kmi->io, readb(KMIDATA), 0);
48 status = readb(KMIIR); 48 status = readb(KMIIR);
49 handled = IRQ_HANDLED; 49 handled = IRQ_HANDLED;
50 } 50 }
diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c
index bc6e87add093..0d35018c23a9 100644
--- a/drivers/input/serio/ct82c710.c
+++ b/drivers/input/serio/ct82c710.c
@@ -71,9 +71,9 @@ static struct resource ct82c710_iores;
71 * is waiting in the 82C710. 71 * is waiting in the 82C710.
72 */ 72 */
73 73
74static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs) 74static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id)
75{ 75{
76 return serio_interrupt(ct82c710_port, inb(CT82C710_DATA), 0, regs); 76 return serio_interrupt(ct82c710_port, inb(CT82C710_DATA), 0);
77} 77}
78 78
79/* 79/*
diff --git a/drivers/input/serio/gscps2.c b/drivers/input/serio/gscps2.c
index cde036a92168..081fdc3c7737 100644
--- a/drivers/input/serio/gscps2.c
+++ b/drivers/input/serio/gscps2.c
@@ -82,7 +82,7 @@ MODULE_DEVICE_TABLE(parisc, gscps2_device_tbl);
82#define GSC_ID_MOUSE 1 82#define GSC_ID_MOUSE 1
83 83
84 84
85static irqreturn_t gscps2_interrupt(int irq, void *dev, struct pt_regs *regs); 85static irqreturn_t gscps2_interrupt(int irq, void *dev);
86 86
87#define BUFFER_SIZE 0x0f 87#define BUFFER_SIZE 0x0f
88 88
@@ -226,7 +226,7 @@ static LIST_HEAD(ps2port_list);
226 * later. 226 * later.
227 */ 227 */
228 228
229static irqreturn_t gscps2_interrupt(int irq, void *dev, struct pt_regs *regs) 229static irqreturn_t gscps2_interrupt(int irq, void *dev)
230{ 230{
231 struct gscps2port *ps2port; 231 struct gscps2port *ps2port;
232 232
@@ -267,7 +267,7 @@ static irqreturn_t gscps2_interrupt(int irq, void *dev, struct pt_regs *regs)
267 rxflags = ((status & GSC_STAT_TERR) ? SERIO_TIMEOUT : 0 ) | 267 rxflags = ((status & GSC_STAT_TERR) ? SERIO_TIMEOUT : 0 ) |
268 ((status & GSC_STAT_PERR) ? SERIO_PARITY : 0 ); 268 ((status & GSC_STAT_PERR) ? SERIO_PARITY : 0 );
269 269
270 serio_interrupt(ps2port->port, data, rxflags, regs); 270 serio_interrupt(ps2port->port, data, rxflags);
271 271
272 } /* while() */ 272 } /* while() */
273 273
diff --git a/drivers/input/serio/hp_sdc.c b/drivers/input/serio/hp_sdc.c
index a10348bb25e9..ba7b920347e3 100644
--- a/drivers/input/serio/hp_sdc.c
+++ b/drivers/input/serio/hp_sdc.c
@@ -202,7 +202,7 @@ static void hp_sdc_take (int irq, void *dev_id, uint8_t status, uint8_t data) {
202 } 202 }
203} 203}
204 204
205static irqreturn_t hp_sdc_isr(int irq, void *dev_id, struct pt_regs * regs) { 205static irqreturn_t hp_sdc_isr(int irq, void *dev_id) {
206 uint8_t status, data; 206 uint8_t status, data;
207 207
208 status = hp_sdc_status_in8(); 208 status = hp_sdc_status_in8();
@@ -253,7 +253,7 @@ static irqreturn_t hp_sdc_isr(int irq, void *dev_id, struct pt_regs * regs) {
253} 253}
254 254
255 255
256static irqreturn_t hp_sdc_nmisr(int irq, void *dev_id, struct pt_regs * regs) { 256static irqreturn_t hp_sdc_nmisr(int irq, void *dev_id) {
257 int status; 257 int status;
258 258
259 status = hp_sdc_status_in8(); 259 status = hp_sdc_status_in8();
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
index 1bb0c76a9259..09b06e605b50 100644
--- a/drivers/input/serio/i8042.c
+++ b/drivers/input/serio/i8042.c
@@ -108,7 +108,7 @@ static unsigned char i8042_kbd_irq_registered;
108static unsigned char i8042_aux_irq_registered; 108static unsigned char i8042_aux_irq_registered;
109static struct platform_device *i8042_platform_device; 109static struct platform_device *i8042_platform_device;
110 110
111static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs); 111static irqreturn_t i8042_interrupt(int irq, void *dev_id);
112 112
113/* 113/*
114 * The i8042_wait_read() and i8042_wait_write functions wait for the i8042 to 114 * The i8042_wait_read() and i8042_wait_write functions wait for the i8042 to
@@ -271,7 +271,7 @@ static int i8042_aux_write(struct serio *serio, unsigned char c)
271 * characters later. 271 * characters later.
272 */ 272 */
273 273
274 i8042_interrupt(0, NULL, NULL); 274 i8042_interrupt(0, NULL);
275 return retval; 275 return retval;
276} 276}
277 277
@@ -309,7 +309,7 @@ static void i8042_stop(struct serio *serio)
309 * to the upper layers. 309 * to the upper layers.
310 */ 310 */
311 311
312static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs) 312static irqreturn_t i8042_interrupt(int irq, void *dev_id)
313{ 313{
314 struct i8042_port *port; 314 struct i8042_port *port;
315 unsigned long flags; 315 unsigned long flags;
@@ -379,7 +379,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs)
379 dfl & SERIO_TIMEOUT ? ", timeout" : ""); 379 dfl & SERIO_TIMEOUT ? ", timeout" : "");
380 380
381 if (likely(port->exists)) 381 if (likely(port->exists))
382 serio_interrupt(port->serio, data, dfl, regs); 382 serio_interrupt(port->serio, data, dfl);
383 383
384 ret = 1; 384 ret = 1;
385 out: 385 out:
@@ -519,7 +519,7 @@ static int __devinit i8042_check_mux(void)
519static struct completion i8042_aux_irq_delivered __devinitdata; 519static struct completion i8042_aux_irq_delivered __devinitdata;
520static int i8042_irq_being_tested __devinitdata; 520static int i8042_irq_being_tested __devinitdata;
521 521
522static irqreturn_t __devinit i8042_aux_test_irq(int irq, void *dev_id, struct pt_regs *regs) 522static irqreturn_t __devinit i8042_aux_test_irq(int irq, void *dev_id)
523{ 523{
524 unsigned long flags; 524 unsigned long flags;
525 unsigned char str, data; 525 unsigned char str, data;
@@ -905,7 +905,7 @@ static int i8042_resume(struct platform_device *dev)
905 if (i8042_ports[I8042_KBD_PORT_NO].serio) 905 if (i8042_ports[I8042_KBD_PORT_NO].serio)
906 i8042_enable_kbd_port(); 906 i8042_enable_kbd_port();
907 907
908 i8042_interrupt(0, NULL, NULL); 908 i8042_interrupt(0, NULL);
909 909
910 return 0; 910 return 0;
911} 911}
diff --git a/drivers/input/serio/maceps2.c b/drivers/input/serio/maceps2.c
index f08a5d0cd5fa..558200e96d0f 100644
--- a/drivers/input/serio/maceps2.c
+++ b/drivers/input/serio/maceps2.c
@@ -72,8 +72,7 @@ static int maceps2_write(struct serio *dev, unsigned char val)
72 return -1; 72 return -1;
73} 73}
74 74
75static irqreturn_t maceps2_interrupt(int irq, void *dev_id, 75static irqreturn_t maceps2_interrupt(int irq, void *dev_id)
76 struct pt_regs *regs)
77{ 76{
78 struct serio *dev = dev_id; 77 struct serio *dev = dev_id;
79 struct mace_ps2port *port = ((struct maceps2_data *)dev->port_data)->port; 78 struct mace_ps2port *port = ((struct maceps2_data *)dev->port_data)->port;
@@ -81,7 +80,7 @@ static irqreturn_t maceps2_interrupt(int irq, void *dev_id,
81 80
82 if (port->status & PS2_STATUS_RX_FULL) { 81 if (port->status & PS2_STATUS_RX_FULL) {
83 byte = port->rx; 82 byte = port->rx;
84 serio_interrupt(dev, byte & 0xff, 0, regs); 83 serio_interrupt(dev, byte & 0xff, 0);
85 } 84 }
86 85
87 return IRQ_HANDLED; 86 return IRQ_HANDLED;
diff --git a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c
index a5c1fb3a4a51..688610e86a3e 100644
--- a/drivers/input/serio/parkbd.c
+++ b/drivers/input/serio/parkbd.c
@@ -102,7 +102,7 @@ static int parkbd_write(struct serio *port, unsigned char c)
102 return 0; 102 return 0;
103} 103}
104 104
105static void parkbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) 105static void parkbd_interrupt(int irq, void *dev_id)
106{ 106{
107 107
108 if (parkbd_writing) { 108 if (parkbd_writing) {
@@ -134,7 +134,7 @@ static void parkbd_interrupt(int irq, void *dev_id, struct pt_regs *regs)
134 parkbd_buffer |= (parkbd_readlines() >> 1) << parkbd_counter++; 134 parkbd_buffer |= (parkbd_readlines() >> 1) << parkbd_counter++;
135 135
136 if (parkbd_counter == parkbd_mode + 10) 136 if (parkbd_counter == parkbd_mode + 10)
137 serio_interrupt(parkbd_port, (parkbd_buffer >> (2 - parkbd_mode)) & 0xff, 0, regs); 137 serio_interrupt(parkbd_port, (parkbd_buffer >> (2 - parkbd_mode)) & 0xff, 0);
138 } 138 }
139 139
140 parkbd_last = jiffies; 140 parkbd_last = jiffies;
diff --git a/drivers/input/serio/pcips2.c b/drivers/input/serio/pcips2.c
index fb727c665253..ea5e3c6ddb62 100644
--- a/drivers/input/serio/pcips2.c
+++ b/drivers/input/serio/pcips2.c
@@ -58,7 +58,7 @@ static int pcips2_write(struct serio *io, unsigned char val)
58 return 0; 58 return 0;
59} 59}
60 60
61static irqreturn_t pcips2_interrupt(int irq, void *devid, struct pt_regs *regs) 61static irqreturn_t pcips2_interrupt(int irq, void *devid)
62{ 62{
63 struct pcips2_data *ps2if = devid; 63 struct pcips2_data *ps2if = devid;
64 unsigned char status, scancode; 64 unsigned char status, scancode;
@@ -80,7 +80,7 @@ static irqreturn_t pcips2_interrupt(int irq, void *devid, struct pt_regs *regs)
80 if (hweight8(scancode) & 1) 80 if (hweight8(scancode) & 1)
81 flag ^= SERIO_PARITY; 81 flag ^= SERIO_PARITY;
82 82
83 serio_interrupt(ps2if->io, scancode, flag, regs); 83 serio_interrupt(ps2if->io, scancode, flag);
84 } while (1); 84 } while (1);
85 return IRQ_RETVAL(handled); 85 return IRQ_RETVAL(handled);
86} 86}
diff --git a/drivers/input/serio/q40kbd.c b/drivers/input/serio/q40kbd.c
index d3827c5fe119..cb89aff2e160 100644
--- a/drivers/input/serio/q40kbd.c
+++ b/drivers/input/serio/q40kbd.c
@@ -53,14 +53,14 @@ DEFINE_SPINLOCK(q40kbd_lock);
53static struct serio *q40kbd_port; 53static struct serio *q40kbd_port;
54static struct platform_device *q40kbd_device; 54static struct platform_device *q40kbd_device;
55 55
56static irqreturn_t q40kbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) 56static irqreturn_t q40kbd_interrupt(int irq, void *dev_id)
57{ 57{
58 unsigned long flags; 58 unsigned long flags;
59 59
60 spin_lock_irqsave(&q40kbd_lock, flags); 60 spin_lock_irqsave(&q40kbd_lock, flags);
61 61
62 if (Q40_IRQ_KEYB_MASK & master_inb(INTERRUPT_REG)) 62 if (Q40_IRQ_KEYB_MASK & master_inb(INTERRUPT_REG))
63 serio_interrupt(q40kbd_port, master_inb(KEYCODE_REG), 0, regs); 63 serio_interrupt(q40kbd_port, master_inb(KEYCODE_REG), 0);
64 64
65 master_outb(-1, KEYBOARD_UNLOCK_REG); 65 master_outb(-1, KEYBOARD_UNLOCK_REG);
66 66
diff --git a/drivers/input/serio/rpckbd.c b/drivers/input/serio/rpckbd.c
index 513d37fc1acf..49f84315cb32 100644
--- a/drivers/input/serio/rpckbd.c
+++ b/drivers/input/serio/rpckbd.c
@@ -56,7 +56,7 @@ static int rpckbd_write(struct serio *port, unsigned char val)
56 return 0; 56 return 0;
57} 57}
58 58
59static irqreturn_t rpckbd_rx(int irq, void *dev_id, struct pt_regs *regs) 59static irqreturn_t rpckbd_rx(int irq, void *dev_id)
60{ 60{
61 struct serio *port = dev_id; 61 struct serio *port = dev_id;
62 unsigned int byte; 62 unsigned int byte;
@@ -65,13 +65,13 @@ static irqreturn_t rpckbd_rx(int irq, void *dev_id, struct pt_regs *regs)
65 while (iomd_readb(IOMD_KCTRL) & (1 << 5)) { 65 while (iomd_readb(IOMD_KCTRL) & (1 << 5)) {
66 byte = iomd_readb(IOMD_KARTRX); 66 byte = iomd_readb(IOMD_KARTRX);
67 67
68 serio_interrupt(port, byte, 0, regs); 68 serio_interrupt(port, byte, 0);
69 handled = IRQ_HANDLED; 69 handled = IRQ_HANDLED;
70 } 70 }
71 return handled; 71 return handled;
72} 72}
73 73
74static irqreturn_t rpckbd_tx(int irq, void *dev_id, struct pt_regs *regs) 74static irqreturn_t rpckbd_tx(int irq, void *dev_id)
75{ 75{
76 return IRQ_HANDLED; 76 return IRQ_HANDLED;
77} 77}
diff --git a/drivers/input/serio/sa1111ps2.c b/drivers/input/serio/sa1111ps2.c
index ebd9976fc811..559508795af1 100644
--- a/drivers/input/serio/sa1111ps2.c
+++ b/drivers/input/serio/sa1111ps2.c
@@ -40,7 +40,7 @@ struct ps2if {
40 * at the most one, but we loop for safety. If there was a 40 * at the most one, but we loop for safety. If there was a
41 * framing error, we have to manually clear the status. 41 * framing error, we have to manually clear the status.
42 */ 42 */
43static irqreturn_t ps2_rxint(int irq, void *dev_id, struct pt_regs *regs) 43static irqreturn_t ps2_rxint(int irq, void *dev_id)
44{ 44{
45 struct ps2if *ps2if = dev_id; 45 struct ps2if *ps2if = dev_id;
46 unsigned int scancode, flag, status; 46 unsigned int scancode, flag, status;
@@ -58,7 +58,7 @@ static irqreturn_t ps2_rxint(int irq, void *dev_id, struct pt_regs *regs)
58 if (hweight8(scancode) & 1) 58 if (hweight8(scancode) & 1)
59 flag ^= SERIO_PARITY; 59 flag ^= SERIO_PARITY;
60 60
61 serio_interrupt(ps2if->io, scancode, flag, regs); 61 serio_interrupt(ps2if->io, scancode, flag);
62 62
63 status = sa1111_readl(ps2if->base + SA1111_PS2STAT); 63 status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
64 } 64 }
@@ -69,7 +69,7 @@ static irqreturn_t ps2_rxint(int irq, void *dev_id, struct pt_regs *regs)
69/* 69/*
70 * Completion of ps2 write 70 * Completion of ps2 write
71 */ 71 */
72static irqreturn_t ps2_txint(int irq, void *dev_id, struct pt_regs *regs) 72static irqreturn_t ps2_txint(int irq, void *dev_id)
73{ 73{
74 struct ps2if *ps2if = dev_id; 74 struct ps2if *ps2if = dev_id;
75 unsigned int status; 75 unsigned int status;
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
index 3e76ad71c9a0..960fae3c3cea 100644
--- a/drivers/input/serio/serio.c
+++ b/drivers/input/serio/serio.c
@@ -911,7 +911,7 @@ void serio_close(struct serio *serio)
911} 911}
912 912
913irqreturn_t serio_interrupt(struct serio *serio, 913irqreturn_t serio_interrupt(struct serio *serio,
914 unsigned char data, unsigned int dfl, struct pt_regs *regs) 914 unsigned char data, unsigned int dfl)
915{ 915{
916 unsigned long flags; 916 unsigned long flags;
917 irqreturn_t ret = IRQ_NONE; 917 irqreturn_t ret = IRQ_NONE;
@@ -919,7 +919,7 @@ irqreturn_t serio_interrupt(struct serio *serio,
919 spin_lock_irqsave(&serio->lock, flags); 919 spin_lock_irqsave(&serio->lock, flags);
920 920
921 if (likely(serio->drv)) { 921 if (likely(serio->drv)) {
922 ret = serio->drv->interrupt(serio, data, dfl, regs); 922 ret = serio->drv->interrupt(serio, data, dfl);
923 } else if (!dfl && serio->registered) { 923 } else if (!dfl && serio->registered) {
924 serio_rescan(serio); 924 serio_rescan(serio);
925 ret = IRQ_HANDLED; 925 ret = IRQ_HANDLED;
diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c
index 71a8eea816cb..ba2a2035d648 100644
--- a/drivers/input/serio/serio_raw.c
+++ b/drivers/input/serio/serio_raw.c
@@ -250,7 +250,7 @@ static struct file_operations serio_raw_fops = {
250 *********************************************************************/ 250 *********************************************************************/
251 251
252static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data, 252static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data,
253 unsigned int dfl, struct pt_regs *regs) 253 unsigned int dfl)
254{ 254{
255 struct serio_raw *serio_raw = serio_get_drvdata(serio); 255 struct serio_raw *serio_raw = serio_get_drvdata(serio);
256 struct serio_raw_list *list; 256 struct serio_raw_list *list;
diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c
index 54a680cc704d..e1a3a79ab3f9 100644
--- a/drivers/input/serio/serport.c
+++ b/drivers/input/serio/serport.c
@@ -117,9 +117,6 @@ static void serport_ldisc_close(struct tty_struct *tty)
117 * serport_ldisc_receive() is called by the low level tty driver when characters 117 * serport_ldisc_receive() is called by the low level tty driver when characters
118 * are ready for us. We forward the characters, one by one to the 'interrupt' 118 * are ready for us. We forward the characters, one by one to the 'interrupt'
119 * routine. 119 * routine.
120 *
121 * FIXME: We should get pt_regs from the tty layer and forward them to
122 * serio_interrupt here.
123 */ 120 */
124 121
125static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) 122static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
@@ -134,7 +131,7 @@ static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *c
134 goto out; 131 goto out;
135 132
136 for (i = 0; i < count; i++) 133 for (i = 0; i < count; i++)
137 serio_interrupt(serport->serio, cp[i], 0, NULL); 134 serio_interrupt(serport->serio, cp[i], 0);
138 135
139out: 136out:
140 spin_unlock_irqrestore(&serport->lock, flags); 137 spin_unlock_irqrestore(&serport->lock, flags);