aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia
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/pcmcia
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/pcmcia')
-rw-r--r--drivers/pcmcia/at91_cf.c2
-rw-r--r--drivers/pcmcia/hd64465_ss.c2
-rw-r--r--drivers/pcmcia/i82092.c2
-rw-r--r--drivers/pcmcia/i82092aa.h2
-rw-r--r--drivers/pcmcia/i82365.c9
-rw-r--r--drivers/pcmcia/m32r_cfc.c7
-rw-r--r--drivers/pcmcia/m32r_pcc.c4
-rw-r--r--drivers/pcmcia/m8xx_pcmcia.c4
-rw-r--r--drivers/pcmcia/omap_cf.c2
-rw-r--r--drivers/pcmcia/pcmcia_resource.c2
-rw-r--r--drivers/pcmcia/pd6729.c6
-rw-r--r--drivers/pcmcia/soc_common.c2
-rw-r--r--drivers/pcmcia/tcic.c10
-rw-r--r--drivers/pcmcia/vrc4171_card.c2
-rw-r--r--drivers/pcmcia/vrc4173_cardu.c2
-rw-r--r--drivers/pcmcia/yenta_socket.c6
16 files changed, 31 insertions, 33 deletions
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c
index 40569f40e90e..991e084db2d6 100644
--- a/drivers/pcmcia/at91_cf.c
+++ b/drivers/pcmcia/at91_cf.c
@@ -64,7 +64,7 @@ static int at91_cf_ss_init(struct pcmcia_socket *s)
64 return 0; 64 return 0;
65} 65}
66 66
67static irqreturn_t at91_cf_irq(int irq, void *_cf, struct pt_regs *r) 67static irqreturn_t at91_cf_irq(int irq, void *_cf)
68{ 68{
69 struct at91_cf_socket *cf = (struct at91_cf_socket *) _cf; 69 struct at91_cf_socket *cf = (struct at91_cf_socket *) _cf;
70 70
diff --git a/drivers/pcmcia/hd64465_ss.c b/drivers/pcmcia/hd64465_ss.c
index ad02629c8be2..db3c26b5de14 100644
--- a/drivers/pcmcia/hd64465_ss.c
+++ b/drivers/pcmcia/hd64465_ss.c
@@ -671,7 +671,7 @@ static int hs_irq_demux(int irq, void *dev)
671 * Interrupt handling routine. 671 * Interrupt handling routine.
672 */ 672 */
673 673
674static irqreturn_t hs_interrupt(int irq, void *dev, struct pt_regs *regs) 674static irqreturn_t hs_interrupt(int irq, void *dev)
675{ 675{
676 hs_socket_t *sp = (hs_socket_t *)dev; 676 hs_socket_t *sp = (hs_socket_t *)dev;
677 u_int events = 0; 677 u_int events = 0;
diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c
index 2163aa75a257..82715f448957 100644
--- a/drivers/pcmcia/i82092.c
+++ b/drivers/pcmcia/i82092.c
@@ -315,7 +315,7 @@ static int to_cycles(int ns)
315 315
316/* Interrupt handler functionality */ 316/* Interrupt handler functionality */
317 317
318static irqreturn_t i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs) 318static irqreturn_t i82092aa_interrupt(int irq, void *dev)
319{ 319{
320 int i; 320 int i;
321 int loopcount = 0; 321 int loopcount = 0;
diff --git a/drivers/pcmcia/i82092aa.h b/drivers/pcmcia/i82092aa.h
index 9c14599d0673..b0d453303c5d 100644
--- a/drivers/pcmcia/i82092aa.h
+++ b/drivers/pcmcia/i82092aa.h
@@ -23,7 +23,7 @@
23static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *id); 23static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *id);
24static void i82092aa_pci_remove(struct pci_dev *dev); 24static void i82092aa_pci_remove(struct pci_dev *dev);
25static int card_present(int socketno); 25static int card_present(int socketno);
26static irqreturn_t i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs); 26static irqreturn_t i82092aa_interrupt(int irq, void *dev);
27 27
28 28
29 29
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c
index 1cc2682394b1..ea74f98a7350 100644
--- a/drivers/pcmcia/i82365.c
+++ b/drivers/pcmcia/i82365.c
@@ -80,7 +80,7 @@ module_param(pc_debug, int, 0644);
80#define debug(lvl, fmt, arg...) do { } while (0) 80#define debug(lvl, fmt, arg...) do { } while (0)
81#endif 81#endif
82 82
83static irqreturn_t i365_count_irq(int, void *, struct pt_regs *); 83static irqreturn_t i365_count_irq(int, void *);
84static inline int _check_irq(int irq, int flags) 84static inline int _check_irq(int irq, int flags)
85{ 85{
86 if (request_irq(irq, i365_count_irq, flags, "x", i365_count_irq) != 0) 86 if (request_irq(irq, i365_count_irq, flags, "x", i365_count_irq) != 0)
@@ -498,7 +498,7 @@ static u_int __init set_bridge_opts(u_short s, u_short ns)
498static volatile u_int irq_hits; 498static volatile u_int irq_hits;
499static u_short irq_sock; 499static u_short irq_sock;
500 500
501static irqreturn_t i365_count_irq(int irq, void *dev, struct pt_regs *regs) 501static irqreturn_t i365_count_irq(int irq, void *dev)
502{ 502{
503 i365_get(irq_sock, I365_CSC); 503 i365_get(irq_sock, I365_CSC);
504 irq_hits++; 504 irq_hits++;
@@ -848,8 +848,7 @@ static void __init isa_probe(void)
848 848
849/*====================================================================*/ 849/*====================================================================*/
850 850
851static irqreturn_t pcic_interrupt(int irq, void *dev, 851static irqreturn_t pcic_interrupt(int irq, void *dev)
852 struct pt_regs *regs)
853{ 852{
854 int i, j, csc; 853 int i, j, csc;
855 u_int events, active; 854 u_int events, active;
@@ -898,7 +897,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev,
898 897
899static void pcic_interrupt_wrapper(u_long data) 898static void pcic_interrupt_wrapper(u_long data)
900{ 899{
901 pcic_interrupt(0, NULL, NULL); 900 pcic_interrupt(0, NULL);
902 poll_timer.expires = jiffies + poll_interval; 901 poll_timer.expires = jiffies + poll_interval;
903 add_timer(&poll_timer); 902 add_timer(&poll_timer);
904} 903}
diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c
index 9e768eaef17a..36fdaa58458c 100644
--- a/drivers/pcmcia/m32r_cfc.c
+++ b/drivers/pcmcia/m32r_cfc.c
@@ -254,7 +254,7 @@ static pcc_t pcc[] = {
254#endif /* CONFIG_PLAT_USRV */ 254#endif /* CONFIG_PLAT_USRV */
255}; 255};
256 256
257static irqreturn_t pcc_interrupt(int, void *, struct pt_regs *); 257static irqreturn_t pcc_interrupt(int, void *);
258 258
259/*====================================================================*/ 259/*====================================================================*/
260 260
@@ -372,14 +372,13 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr, kio_addr_t ioaddr
372 372
373/*====================================================================*/ 373/*====================================================================*/
374 374
375static irqreturn_t pcc_interrupt(int irq, void *dev, struct pt_regs *regs) 375static irqreturn_t pcc_interrupt(int irq, void *dev)
376{ 376{
377 int i; 377 int i;
378 u_int events = 0; 378 u_int events = 0;
379 int handled = 0; 379 int handled = 0;
380 380
381 debug(3, "m32r_cfc: pcc_interrupt: irq=%d, dev=%p, regs=%p\n", 381 debug(3, "m32r_cfc: pcc_interrupt: irq=%d, dev=%p\n", irq, dev);
382 irq, dev, regs);
383 for (i = 0; i < pcc_sockets; i++) { 382 for (i = 0; i < pcc_sockets; i++) {
384 if (socket[i].cs_irq1 != irq && socket[i].cs_irq2 != irq) 383 if (socket[i].cs_irq1 != irq && socket[i].cs_irq2 != irq)
385 continue; 384 continue;
diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c
index 61d50b5620dd..0964fd76bfe3 100644
--- a/drivers/pcmcia/m32r_pcc.c
+++ b/drivers/pcmcia/m32r_pcc.c
@@ -267,7 +267,7 @@ static pcc_t pcc[] = {
267 { "xnux2", 0 }, { "xnux2", 0 }, 267 { "xnux2", 0 }, { "xnux2", 0 },
268}; 268};
269 269
270static irqreturn_t pcc_interrupt(int, void *, struct pt_regs *); 270static irqreturn_t pcc_interrupt(int, void *);
271 271
272/*====================================================================*/ 272/*====================================================================*/
273 273
@@ -352,7 +352,7 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr, kio_addr_t ioaddr
352 352
353/*====================================================================*/ 353/*====================================================================*/
354 354
355static irqreturn_t pcc_interrupt(int irq, void *dev, struct pt_regs *regs) 355static irqreturn_t pcc_interrupt(int irq, void *dev)
356{ 356{
357 int i, j, irc; 357 int i, j, irc;
358 u_int events, active; 358 u_int events, active;
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c
index d0f68ab8f041..e070a2896769 100644
--- a/drivers/pcmcia/m8xx_pcmcia.c
+++ b/drivers/pcmcia/m8xx_pcmcia.c
@@ -266,7 +266,7 @@ static const u32 m8xx_size_to_gray[M8XX_SIZES_NO] =
266 266
267/* ------------------------------------------------------------------------- */ 267/* ------------------------------------------------------------------------- */
268 268
269static irqreturn_t m8xx_interrupt(int irq, void *dev, struct pt_regs *regs); 269static irqreturn_t m8xx_interrupt(int irq, void *dev);
270 270
271#define PCMCIA_BMT_LIMIT (15*4) /* Bus Monitor Timeout value */ 271#define PCMCIA_BMT_LIMIT (15*4) /* Bus Monitor Timeout value */
272 272
@@ -646,7 +646,7 @@ static struct platform_device m8xx_device = {
646static u32 pending_events[PCMCIA_SOCKETS_NO]; 646static u32 pending_events[PCMCIA_SOCKETS_NO];
647static DEFINE_SPINLOCK(pending_event_lock); 647static DEFINE_SPINLOCK(pending_event_lock);
648 648
649static irqreturn_t m8xx_interrupt(int irq, void *dev, struct pt_regs *regs) 649static irqreturn_t m8xx_interrupt(int irq, void *dev)
650{ 650{
651 struct socket_info *s; 651 struct socket_info *s;
652 struct event_table *e; 652 struct event_table *e;
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c
index 01be47e72730..c8e838c69766 100644
--- a/drivers/pcmcia/omap_cf.c
+++ b/drivers/pcmcia/omap_cf.c
@@ -102,7 +102,7 @@ static void omap_cf_timer(unsigned long _cf)
102 * claim the card's IRQ. It may also detect some card insertions, but 102 * claim the card's IRQ. It may also detect some card insertions, but
103 * not removals; it can't always eliminate timer irqs. 103 * not removals; it can't always eliminate timer irqs.
104 */ 104 */
105static irqreturn_t omap_cf_irq(int irq, void *_cf, struct pt_regs *r) 105static irqreturn_t omap_cf_irq(int irq, void *_cf)
106{ 106{
107 omap_cf_timer((unsigned long)_cf); 107 omap_cf_timer((unsigned long)_cf);
108 return IRQ_HANDLED; 108 return IRQ_HANDLED;
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
index c8323399e9e4..74cebd424032 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -784,7 +784,7 @@ EXPORT_SYMBOL(pcmcia_request_io);
784 */ 784 */
785 785
786#ifdef CONFIG_PCMCIA_PROBE 786#ifdef CONFIG_PCMCIA_PROBE
787static irqreturn_t test_action(int cpl, void *dev_id, struct pt_regs *regs) 787static irqreturn_t test_action(int cpl, void *dev_id)
788{ 788{
789 return IRQ_NONE; 789 return IRQ_NONE;
790} 790}
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c
index 22c5e7427ddd..c83a0a6b158f 100644
--- a/drivers/pcmcia/pd6729.c
+++ b/drivers/pcmcia/pd6729.c
@@ -182,7 +182,7 @@ static void indirect_write16(struct pd6729_socket *socket, unsigned short reg,
182 182
183/* Interrupt handler functionality */ 183/* Interrupt handler functionality */
184 184
185static irqreturn_t pd6729_interrupt(int irq, void *dev, struct pt_regs *regs) 185static irqreturn_t pd6729_interrupt(int irq, void *dev)
186{ 186{
187 struct pd6729_socket *socket = (struct pd6729_socket *)dev; 187 struct pd6729_socket *socket = (struct pd6729_socket *)dev;
188 int i; 188 int i;
@@ -249,7 +249,7 @@ static void pd6729_interrupt_wrapper(unsigned long data)
249{ 249{
250 struct pd6729_socket *socket = (struct pd6729_socket *) data; 250 struct pd6729_socket *socket = (struct pd6729_socket *) data;
251 251
252 pd6729_interrupt(0, (void *)socket, NULL); 252 pd6729_interrupt(0, (void *)socket);
253 mod_timer(&socket->poll_timer, jiffies + HZ); 253 mod_timer(&socket->poll_timer, jiffies + HZ);
254} 254}
255 255
@@ -575,7 +575,7 @@ static struct pccard_operations pd6729_operations = {
575 .set_mem_map = pd6729_set_mem_map, 575 .set_mem_map = pd6729_set_mem_map,
576}; 576};
577 577
578static irqreturn_t pd6729_test(int irq, void *dev, struct pt_regs *regs) 578static irqreturn_t pd6729_test(int irq, void *dev)
579{ 579{
580 dprintk("-> hit on irq %d\n", irq); 580 dprintk("-> hit on irq %d\n", irq);
581 return IRQ_HANDLED; 581 return IRQ_HANDLED;
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index ecaa132fa592..3627e52e0c27 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -256,7 +256,7 @@ static void soc_common_pcmcia_poll_event(unsigned long dummy)
256 * handling code performs scheduling operations which cannot be 256 * handling code performs scheduling operations which cannot be
257 * executed from within an interrupt context. 257 * executed from within an interrupt context.
258 */ 258 */
259static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev, struct pt_regs *regs) 259static irqreturn_t soc_common_pcmcia_interrupt(int irq, void *dev)
260{ 260{
261 struct soc_pcmcia_socket *skt = dev; 261 struct soc_pcmcia_socket *skt = dev;
262 262
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c
index 65a60671659f..2d2f415f80a8 100644
--- a/drivers/pcmcia/tcic.c
+++ b/drivers/pcmcia/tcic.c
@@ -116,7 +116,7 @@ module_param(cycle_time, int, 0444);
116 116
117/*====================================================================*/ 117/*====================================================================*/
118 118
119static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs); 119static irqreturn_t tcic_interrupt(int irq, void *dev);
120static void tcic_timer(u_long data); 120static void tcic_timer(u_long data);
121static struct pccard_operations tcic_operations; 121static struct pccard_operations tcic_operations;
122 122
@@ -218,7 +218,7 @@ static int to_cycles(int ns)
218 218
219static volatile u_int irq_hits; 219static volatile u_int irq_hits;
220 220
221static irqreturn_t __init tcic_irq_count(int irq, void *dev, struct pt_regs *regs) 221static irqreturn_t __init tcic_irq_count(int irq, void *dev)
222{ 222{
223 irq_hits++; 223 irq_hits++;
224 return IRQ_HANDLED; 224 return IRQ_HANDLED;
@@ -505,7 +505,7 @@ static int __init init_tcic(void)
505 } 505 }
506 506
507 /* jump start interrupt handler, if needed */ 507 /* jump start interrupt handler, if needed */
508 tcic_interrupt(0, NULL, NULL); 508 tcic_interrupt(0, NULL);
509 509
510 platform_device_register(&tcic_device); 510 platform_device_register(&tcic_device);
511 511
@@ -547,7 +547,7 @@ static void __exit exit_tcic(void)
547 547
548/*====================================================================*/ 548/*====================================================================*/
549 549
550static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs) 550static irqreturn_t tcic_interrupt(int irq, void *dev)
551{ 551{
552 int i, quick = 0; 552 int i, quick = 0;
553 u_char latch, sstat; 553 u_char latch, sstat;
@@ -606,7 +606,7 @@ static void tcic_timer(u_long data)
606{ 606{
607 debug(2, "tcic_timer()\n"); 607 debug(2, "tcic_timer()\n");
608 tcic_timer_pending = 0; 608 tcic_timer_pending = 0;
609 tcic_interrupt(0, NULL, NULL); 609 tcic_interrupt(0, NULL);
610} /* tcic_timer */ 610} /* tcic_timer */
611 611
612/*====================================================================*/ 612/*====================================================================*/
diff --git a/drivers/pcmcia/vrc4171_card.c b/drivers/pcmcia/vrc4171_card.c
index e076a13db555..e90d8e8c5fd6 100644
--- a/drivers/pcmcia/vrc4171_card.c
+++ b/drivers/pcmcia/vrc4171_card.c
@@ -514,7 +514,7 @@ static inline unsigned int get_events(int slot)
514 return events; 514 return events;
515} 515}
516 516
517static irqreturn_t pccard_interrupt(int irq, void *dev_id, struct pt_regs *regs) 517static irqreturn_t pccard_interrupt(int irq, void *dev_id)
518{ 518{
519 vrc4171_socket_t *socket; 519 vrc4171_socket_t *socket;
520 unsigned int events; 520 unsigned int events;
diff --git a/drivers/pcmcia/vrc4173_cardu.c b/drivers/pcmcia/vrc4173_cardu.c
index d19a9138135f..812f038e9bda 100644
--- a/drivers/pcmcia/vrc4173_cardu.c
+++ b/drivers/pcmcia/vrc4173_cardu.c
@@ -440,7 +440,7 @@ static uint16_t get_events(vrc4173_socket_t *socket)
440 return events; 440 return events;
441} 441}
442 442
443static void cardu_interrupt(int irq, void *dev_id, struct pt_regs *regs) 443static void cardu_interrupt(int irq, void *dev_id)
444{ 444{
445 vrc4173_socket_t *socket = (vrc4173_socket_t *)dev_id; 445 vrc4173_socket_t *socket = (vrc4173_socket_t *)dev_id;
446 uint16_t events; 446 uint16_t events;
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
index 1344746381e8..26229d9da762 100644
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -442,7 +442,7 @@ static int yenta_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *
442 442
443 443
444 444
445static irqreturn_t yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs) 445static irqreturn_t yenta_interrupt(int irq, void *dev_id)
446{ 446{
447 unsigned int events; 447 unsigned int events;
448 struct yenta_socket *socket = (struct yenta_socket *) dev_id; 448 struct yenta_socket *socket = (struct yenta_socket *) dev_id;
@@ -478,7 +478,7 @@ static void yenta_interrupt_wrapper(unsigned long data)
478{ 478{
479 struct yenta_socket *socket = (struct yenta_socket *) data; 479 struct yenta_socket *socket = (struct yenta_socket *) data;
480 480
481 yenta_interrupt(0, (void *)socket, NULL); 481 yenta_interrupt(0, (void *)socket);
482 socket->poll_timer.expires = jiffies + HZ; 482 socket->poll_timer.expires = jiffies + HZ;
483 add_timer(&socket->poll_timer); 483 add_timer(&socket->poll_timer);
484} 484}
@@ -896,7 +896,7 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas
896#ifdef CONFIG_YENTA_TI 896#ifdef CONFIG_YENTA_TI
897 897
898/* interrupt handler, only used during probing */ 898/* interrupt handler, only used during probing */
899static irqreturn_t yenta_probe_handler(int irq, void *dev_id, struct pt_regs *regs) 899static irqreturn_t yenta_probe_handler(int irq, void *dev_id)
900{ 900{
901 struct yenta_socket *socket = (struct yenta_socket *) dev_id; 901 struct yenta_socket *socket = (struct yenta_socket *) dev_id;
902 u8 csc; 902 u8 csc;