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>
This commit is contained in:
@@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user