コード例 #1
0
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;
}
コード例 #2
0
ファイル: bcm1250DuartSio.c プロジェクト: ariavie/bcm
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);
    }