diff options
author | cognet <cognet@FreeBSD.org> | 2006-03-22 21:16:09 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2006-03-22 21:16:09 +0000 |
commit | 1e8aa65571c4982d6df79ad2a6675f1b302996b9 (patch) | |
tree | 633abae975a8e6ef1395a0878e0354c576a4c21c /sys/arm | |
parent | 835b687c819f406d1062d60af9763f349e0aa403 (diff) | |
download | FreeBSD-src-1e8aa65571c4982d6df79ad2a6675f1b302996b9.zip FreeBSD-src-1e8aa65571c4982d6df79ad2a6675f1b302996b9.tar.gz |
MFp4: Handle break interrupts (it seems to only work for USART, not DBGU).
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/at91/uart_dev_at91usart.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/sys/arm/at91/uart_dev_at91usart.c b/sys/arm/at91/uart_dev_at91usart.c index 3e48276..08143ce 100644 --- a/sys/arm/at91/uart_dev_at91usart.c +++ b/sys/arm/at91/uart_dev_at91usart.c @@ -177,12 +177,16 @@ static void at91_usart_init(struct uart_bas *bas, int baudrate, int databits, int stopbits, int parity) { + int cr; + at91_usart_param(bas, baudrate, databits, stopbits, parity); /* Turn on rx and tx */ - uart_setreg(bas, USART_CR, USART_CR_RSTRX | USART_CR_RSTTX); + cr = USART_CR_RSTSTA | USART_CR_RSTRX | USART_CR_RSTTX; + uart_setreg(bas, USART_CR, cr); uart_setreg(bas, USART_CR, USART_CR_RXEN | USART_CR_TXEN); - uart_setreg(bas, USART_IER, USART_CSR_TXRDY | USART_CSR_RXRDY); + uart_setreg(bas, USART_IER, USART_CSR_TXRDY | USART_CSR_RXRDY | + USART_CSR_RXBRK); } /* @@ -362,6 +366,12 @@ at91_usart_bus_ipend(struct uart_softc *sc) ipend |= SER_INT_TXIDLE; if (csr & USART_CSR_RXRDY) ipend |= SER_INT_RXREADY; + if (csr & USART_CSR_RXBRK) { + unsigned int cr = USART_CR_RSTSTA; + + ipend |= SER_INT_BREAK; + uart_setreg(&sc->sc_bas, USART_CR, cr); + } mtx_unlock_spin(&sc->sc_hwmtx); return (ipend); } |