summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart/uart_dev_quicc.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2014-01-19 19:39:13 +0000
committerimp <imp@FreeBSD.org>2014-01-19 19:39:13 +0000
commit94a6f4f9ab32806b4ad781889a671328ab81e122 (patch)
tree90f500f8dae436ffff7d1b262113646a73f06e4a /sys/dev/uart/uart_dev_quicc.c
parentda5df765d5b2dcffd55c078fbb36f27310d0751e (diff)
downloadFreeBSD-src-94a6f4f9ab32806b4ad781889a671328ab81e122.zip
FreeBSD-src-94a6f4f9ab32806b4ad781889a671328ab81e122.tar.gz
Introduce grab and ungrab upcalls. When the kernel desires to grab the
console, it calls the grab functions. These functions should turn off the RX interrupts, and any others that interfere. This makes mountroot prompt work again. If there's more generalized need other than prompting, many of these routines should be expanded to do those new things. Should have been part of r260889, but waasn't due to command line typo. Reviewed by: bde (with reservations)
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