aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/riscom8.c
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2007-10-23 19:12:11 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-23 19:53:17 -0400
commitf07ef395ad4cd050e695edfec217ceb2158220a3 (patch)
treed0a228dca81cdeb774dfb0f80121199b5e2a088d /drivers/char/riscom8.c
parent080eb42f31a8a6dde1568f906692d9914cdfbfe8 (diff)
drivers/char/riscom8: clean up irq handling
Make irq handling more efficient, by passing board pointer via request_irq() to our irq handler's dev_id argument. This eliminates a table lookup upon each interrupt, and eliminates an associated global variable (the table). Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/char/riscom8.c')
-rw-r--r--drivers/char/riscom8.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/drivers/char/riscom8.c b/drivers/char/riscom8.c
index b37e626f4faa..102ece4c4e0e 100644
--- a/drivers/char/riscom8.c
+++ b/drivers/char/riscom8.c
@@ -79,7 +79,6 @@
79 79
80#define RS_EVENT_WRITE_WAKEUP 0 80#define RS_EVENT_WRITE_WAKEUP 0
81 81
82static struct riscom_board * IRQ_to_board[16];
83static struct tty_driver *riscom_driver; 82static struct tty_driver *riscom_driver;
84 83
85static struct riscom_board rc_board[RC_NBOARD] = { 84static struct riscom_board rc_board[RC_NBOARD] = {
@@ -537,16 +536,14 @@ static inline void rc_check_modem(struct riscom_board const * bp)
537} 536}
538 537
539/* The main interrupt processing routine */ 538/* The main interrupt processing routine */
540static irqreturn_t rc_interrupt(int irq, void * dev_id) 539static irqreturn_t rc_interrupt(int dummy, void * dev_id)
541{ 540{
542 unsigned char status; 541 unsigned char status;
543 unsigned char ack; 542 unsigned char ack;
544 struct riscom_board *bp; 543 struct riscom_board *bp = dev_id;
545 unsigned long loop = 0; 544 unsigned long loop = 0;
546 int handled = 0; 545 int handled = 0;
547 546
548 bp = IRQ_to_board[irq];
549
550 if (!(bp->flags & RC_BOARD_ACTIVE)) 547 if (!(bp->flags & RC_BOARD_ACTIVE))
551 return IRQ_NONE; 548 return IRQ_NONE;
552 549
@@ -603,7 +600,7 @@ static irqreturn_t rc_interrupt(int irq, void * dev_id)
603 */ 600 */
604 601
605/* Called with disabled interrupts */ 602/* Called with disabled interrupts */
606static inline int rc_setup_board(struct riscom_board * bp) 603static int rc_setup_board(struct riscom_board * bp)
607{ 604{
608 int error; 605 int error;
609 606
@@ -611,7 +608,7 @@ static inline int rc_setup_board(struct riscom_board * bp)
611 return 0; 608 return 0;
612 609
613 error = request_irq(bp->irq, rc_interrupt, IRQF_DISABLED, 610 error = request_irq(bp->irq, rc_interrupt, IRQF_DISABLED,
614 "RISCom/8", NULL); 611 "RISCom/8", bp);
615 if (error) 612 if (error)
616 return error; 613 return error;
617 614
@@ -619,14 +616,13 @@ static inline int rc_setup_board(struct riscom_board * bp)
619 bp->DTR = ~0; 616 bp->DTR = ~0;
620 rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */ 617 rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */
621 618
622 IRQ_to_board[bp->irq] = bp;
623 bp->flags |= RC_BOARD_ACTIVE; 619 bp->flags |= RC_BOARD_ACTIVE;
624 620
625 return 0; 621 return 0;
626} 622}
627 623
628/* Called with disabled interrupts */ 624/* Called with disabled interrupts */
629static inline void rc_shutdown_board(struct riscom_board *bp) 625static void rc_shutdown_board(struct riscom_board *bp)
630{ 626{
631 if (!(bp->flags & RC_BOARD_ACTIVE)) 627 if (!(bp->flags & RC_BOARD_ACTIVE))
632 return; 628 return;
@@ -634,7 +630,6 @@ static inline void rc_shutdown_board(struct riscom_board *bp)
634 bp->flags &= ~RC_BOARD_ACTIVE; 630 bp->flags &= ~RC_BOARD_ACTIVE;
635 631
636 free_irq(bp->irq, NULL); 632 free_irq(bp->irq, NULL);
637 IRQ_to_board[bp->irq] = NULL;
638 633
639 bp->DTR = ~0; 634 bp->DTR = ~0;
640 rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */ 635 rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */
@@ -1594,7 +1589,6 @@ static inline int rc_init_drivers(void)
1594 if (!riscom_driver) 1589 if (!riscom_driver)
1595 return -ENOMEM; 1590 return -ENOMEM;
1596 1591
1597 memset(IRQ_to_board, 0, sizeof(IRQ_to_board));
1598 riscom_driver->owner = THIS_MODULE; 1592 riscom_driver->owner = THIS_MODULE;
1599 riscom_driver->name = "ttyL"; 1593 riscom_driver->name = "ttyL";
1600 riscom_driver->major = RISCOM8_NORMAL_MAJOR; 1594 riscom_driver->major = RISCOM8_NORMAL_MAJOR;