Commit f07ef395 authored by Jeff Garzik's avatar Jeff Garzik

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: default avatarJeff Garzik <jgarzik@redhat.com>
parent 080eb42f
...@@ -79,7 +79,6 @@ ...@@ -79,7 +79,6 @@
#define RS_EVENT_WRITE_WAKEUP 0 #define RS_EVENT_WRITE_WAKEUP 0
static struct riscom_board * IRQ_to_board[16];
static struct tty_driver *riscom_driver; static struct tty_driver *riscom_driver;
static struct riscom_board rc_board[RC_NBOARD] = { static struct riscom_board rc_board[RC_NBOARD] = {
...@@ -537,16 +536,14 @@ static inline void rc_check_modem(struct riscom_board const * bp) ...@@ -537,16 +536,14 @@ static inline void rc_check_modem(struct riscom_board const * bp)
} }
/* The main interrupt processing routine */ /* 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 status;
unsigned char ack; unsigned char ack;
struct riscom_board *bp; struct riscom_board *bp = dev_id;
unsigned long loop = 0; unsigned long loop = 0;
int handled = 0; int handled = 0;
bp = IRQ_to_board[irq];
if (!(bp->flags & RC_BOARD_ACTIVE)) if (!(bp->flags & RC_BOARD_ACTIVE))
return IRQ_NONE; return IRQ_NONE;
...@@ -603,7 +600,7 @@ static irqreturn_t rc_interrupt(int irq, void * dev_id) ...@@ -603,7 +600,7 @@ static irqreturn_t rc_interrupt(int irq, void * dev_id)
*/ */
/* Called with disabled interrupts */ /* 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; int error;
...@@ -611,7 +608,7 @@ static inline int rc_setup_board(struct riscom_board * bp) ...@@ -611,7 +608,7 @@ static inline int rc_setup_board(struct riscom_board * bp)
return 0; return 0;
error = request_irq(bp->irq, rc_interrupt, IRQF_DISABLED, error = request_irq(bp->irq, rc_interrupt, IRQF_DISABLED,
"RISCom/8", NULL); "RISCom/8", bp);
if (error) if (error)
return error; return error;
...@@ -619,14 +616,13 @@ static inline int rc_setup_board(struct riscom_board * bp) ...@@ -619,14 +616,13 @@ static inline int rc_setup_board(struct riscom_board * bp)
bp->DTR = ~0; bp->DTR = ~0;
rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */ rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */
IRQ_to_board[bp->irq] = bp;
bp->flags |= RC_BOARD_ACTIVE; bp->flags |= RC_BOARD_ACTIVE;
return 0; return 0;
} }
/* Called with disabled interrupts */ /* 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)) if (!(bp->flags & RC_BOARD_ACTIVE))
return; return;
...@@ -634,7 +630,6 @@ static inline void rc_shutdown_board(struct riscom_board *bp) ...@@ -634,7 +630,6 @@ static inline void rc_shutdown_board(struct riscom_board *bp)
bp->flags &= ~RC_BOARD_ACTIVE; bp->flags &= ~RC_BOARD_ACTIVE;
free_irq(bp->irq, NULL); free_irq(bp->irq, NULL);
IRQ_to_board[bp->irq] = NULL;
bp->DTR = ~0; bp->DTR = ~0;
rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */ rc_out(bp, RC_DTR, bp->DTR); /* Drop DTR on all ports */
...@@ -1594,7 +1589,6 @@ static inline int rc_init_drivers(void) ...@@ -1594,7 +1589,6 @@ static inline int rc_init_drivers(void)
if (!riscom_driver) if (!riscom_driver)
return -ENOMEM; return -ENOMEM;
memset(IRQ_to_board, 0, sizeof(IRQ_to_board));
riscom_driver->owner = THIS_MODULE; riscom_driver->owner = THIS_MODULE;
riscom_driver->name = "ttyL"; riscom_driver->name = "ttyL";
riscom_driver->major = RISCOM8_NORMAL_MAJOR; riscom_driver->major = RISCOM8_NORMAL_MAJOR;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment