summaryrefslogtreecommitdiffstats
path: root/sys/arm/at91/uart_dev_at91usart.c
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2006-03-22 21:16:09 +0000
committercognet <cognet@FreeBSD.org>2006-03-22 21:16:09 +0000
commit1e8aa65571c4982d6df79ad2a6675f1b302996b9 (patch)
tree633abae975a8e6ef1395a0878e0354c576a4c21c /sys/arm/at91/uart_dev_at91usart.c
parent835b687c819f406d1062d60af9763f349e0aa403 (diff)
downloadFreeBSD-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/at91/uart_dev_at91usart.c')
-rw-r--r--sys/arm/at91/uart_dev_at91usart.c14
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);
}
OpenPOWER on IntegriCloud