summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart/uart_dev_quicc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/uart/uart_dev_quicc.c')
-rw-r--r--sys/dev/uart/uart_dev_quicc.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/sys/dev/uart/uart_dev_quicc.c b/sys/dev/uart/uart_dev_quicc.c
index 337591e..bbbc3bd 100644
--- a/sys/dev/uart/uart_dev_quicc.c
+++ b/sys/dev/uart/uart_dev_quicc.c
@@ -245,6 +245,8 @@ static int quicc_bus_probe(struct uart_softc *);
static int quicc_bus_receive(struct uart_softc *);
static int quicc_bus_setsig(struct uart_softc *, int);
static int quicc_bus_transmit(struct uart_softc *);
+static void quicc_bus_grab(struct uart_softc *);
+static void quicc_bus_ungrab(struct uart_softc *);
static kobj_method_t quicc_methods[] = {
KOBJMETHOD(uart_attach, quicc_bus_attach),
@@ -258,6 +260,8 @@ static kobj_method_t quicc_methods[] = {
KOBJMETHOD(uart_receive, quicc_bus_receive),
KOBJMETHOD(uart_setsig, quicc_bus_setsig),
KOBJMETHOD(uart_transmit, quicc_bus_transmit),
+ KOBJMETHOD(uart_grab, quicc_bus_grab),
+ KOBJMETHOD(uart_ungrab, quicc_bus_ungrab),
{ 0, 0 }
};
@@ -485,3 +489,34 @@ quicc_bus_transmit(struct uart_softc *sc)
uart_unlock(sc->sc_hwmtx);
return (0);
}
+
+static void
+quicc_bus_grab(struct uart_softc *sc)
+{
+ struct uart_bas *bas;
+ uint16_t st, rb;
+
+ /* Disable interrupts on the receive buffer. */
+ bas = &sc->sc_bas;
+ uart_lock(sc->sc_hwmtx);
+ rb = quicc_read2(bas, QUICC_PRAM_SCC_RBASE(bas->chan - 1));
+ st = quicc_read2(bas, rb);
+ quicc_write2(bas, rb, st & ~0x9000);
+ uart_unlock(sc->sc_hwmtx);
+}
+
+static void
+quicc_bus_ungrab(struct uart_softc *sc)
+{
+ struct uart_bas *bas;
+ uint16_t st, rb;
+
+ /* Enable interrupts on the receive buffer. */
+ bas = &sc->sc_bas;
+ uart_lock(sc->sc_hwmtx);
+ rb = quicc_read2(bas, QUICC_PRAM_SCC_RBASE(bas->chan - 1));
+ st = quicc_read2(bas, rb);
+ quicc_write2(bas, rb, st | 0x9000);
+ uart_unlock(sc->sc_hwmtx);
+}
+
OpenPOWER on IntegriCloud