diff options
author | Jeff Garzik <jeff@garzik.org> | 2007-10-24 01:12:11 +0200 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-24 01:53:17 +0200 |
commit | f07ef395ad4cd050e695edfec217ceb2158220a3 (patch) | |
tree | d0a228dca81cdeb774dfb0f80121199b5e2a088d /drivers/char | |
parent | isdn/sc: irq handler clean (diff) | |
download | linux-f07ef395ad4cd050e695edfec217ceb2158220a3.tar.xz linux-f07ef395ad4cd050e695edfec217ceb2158220a3.zip |
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')
-rw-r--r-- | drivers/char/riscom8.c | 16 |
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 @@ #define RS_EVENT_WRITE_WAKEUP 0 -static struct riscom_board * IRQ_to_board[16]; static struct tty_driver *riscom_driver; static struct riscom_board rc_board[RC_NBOARD] = { @@ -537,16 +536,14 @@ static inline void rc_check_modem(struct riscom_board const * bp) } /* The main interrupt processing routine */ -static irqreturn_t rc_interrupt(int irq, void * dev_id) +static irqreturn_t rc_interrupt(int dummy, void * dev_id) { unsigned char status; unsigned char ack; - struct riscom_board *bp; + struct riscom_board *bp = dev_id; unsigned long loop = 0; int handled = 0; - bp = IRQ_to_board[irq]; - if (!(bp->flags & RC_BOARD_ACTIVE)) return IRQ_NONE; @@ -603,7 +600,7 @@ static irqreturn_t rc_interrupt(int irq, void * dev_id) */ /* Called with disabled interrupts */ -static inline int rc_setup_board(struct riscom_board * bp) +static int rc_setup_board(struct riscom_board * bp) { int error; @@ -611,7 +608,7 @@ static inline int rc_setup_board(struct riscom_board * bp) return 0; error = request_irq(bp->irq, rc_interrupt, IRQF_DISABLED, - "RISCom/8", NULL); + "RISCom/8", bp); if (error) return error; @@ -619,14 +616,13 @@ static inline int rc_setup_board(struct riscom_board * bp) bp->DTR = ~0; rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */ - IRQ_to_board[bp->irq] = bp; bp->flags |= RC_BOARD_ACTIVE; return 0; } /* Called with disabled interrupts */ -static inline void rc_shutdown_board(struct riscom_board *bp) +static void rc_shutdown_board(struct riscom_board *bp) { if (!(bp->flags & RC_BOARD_ACTIVE)) return; @@ -634,7 +630,6 @@ static inline void rc_shutdown_board(struct riscom_board *bp) bp->flags &= ~RC_BOARD_ACTIVE; free_irq(bp->irq, NULL); - IRQ_to_board[bp->irq] = NULL; bp->DTR = ~0; rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */ @@ -1594,7 +1589,6 @@ static inline int rc_init_drivers(void) if (!riscom_driver) return -ENOMEM; - memset(IRQ_to_board, 0, sizeof(IRQ_to_board)); riscom_driver->owner = THIS_MODULE; riscom_driver->name = "ttyL"; riscom_driver->major = RISCOM8_NORMAL_MAJOR; |