static irqreturn_t sbd_interrupt(int irq, void *dev_id) { struct sbd_port *sport = dev_id; struct uart_port *uport = &sport->port; irqreturn_t status = IRQ_NONE; unsigned int intstat; int count; for (count = 16; count; count--) { intstat = read_sbdshr(sport, R_DUART_ISRREG((uport->line) % 2)); intstat &= read_sbdshr(sport, R_DUART_IMRREG((uport->line) % 2)); intstat &= M_DUART_ISR_ALL; if (!intstat) break; if (intstat & M_DUART_ISR_RX) sbd_receive_chars(sport); if (intstat & M_DUART_ISR_IN) sbd_status_handle(sport); if (intstat & M_DUART_ISR_TX) sbd_transmit_chars(sport); status = IRQ_HANDLED; } return status; }
void bcm1250DuartDevInit ( BCM1250_DUART_CHAN * pChan ) { int oldlevel; pChan->intEnable = FALSE; if((pChan->channel != BCM1250_DUART_CHANNEL_A ) && (pChan->channel != BCM1250_DUART_CHANNEL_B)) return; pChan->duartBase = (void *)PHYS_TO_K1(A_DUART); pChan->chanBase = pChan->duartBase + R_DUART_CHANREG(pChan->channel, 0); pChan->chanIMR = (unsigned long long *) (pChan->duartBase + R_DUART_IMRREG(pChan->channel)); pChan->chanISR = (unsigned long long *) (pChan->duartBase + R_DUART_ISRREG(pChan->channel)); pChan->intSource = (pChan->channel == BCM1250_DUART_CHANNEL_A) ? K_INT_UART_0 : K_INT_UART_1; /* clear delta interrupts */ bcm1250DuartAcrSet (pChan, 0); /* don't relay TX clock on output in */ bcm1250DuartTxCoutRelay (pChan, FALSE ); /* assert RTS (request to send ) */ bcm1250DuartRts (pChan, TRUE); /* init callbacks and set default options */ bcm1250DuartInitStruct (pChan); oldlevel = intLock (); /* Clear the interrupt mask register */ MIPS3_SD(pChan->chanIMR, 0); bcm1250DuartInitChannel (pChan); intUnlock (oldlevel); }