summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/uart')
-rw-r--r--sys/dev/uart/uart_cpu_fdt.c13
-rw-r--r--sys/dev/uart/uart_dev_ns8250.c8
-rw-r--r--sys/dev/uart/uart_tty.c13
3 files changed, 20 insertions, 14 deletions
diff --git a/sys/dev/uart/uart_cpu_fdt.c b/sys/dev/uart/uart_cpu_fdt.c
index c70b4ca..1a4af9d 100644
--- a/sys/dev/uart/uart_cpu_fdt.c
+++ b/sys/dev/uart/uart_cpu_fdt.c
@@ -133,7 +133,6 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
struct uart_class *class;
phandle_t node, chosen;
pcell_t shift, br, rclk;
- u_long start, size, pbase, psize;
char *cp;
int err;
@@ -212,16 +211,6 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
di->databits = 8;
di->stopbits = 1;
di->parity = UART_PARITY_NONE;
- di->bas.bst = uart_bus_space_mem;
- err = fdt_regsize(node, &start, &size);
- if (err)
- return (ENXIO);
- err = fdt_get_range(OF_parent(node), 0, &pbase, &psize);
- if (err)
- pbase = 0;
-
- start += pbase;
-
- return (bus_space_map(di->bas.bst, start, size, 0, &di->bas.bsh));
+ return (OF_decode_addr(node, 0, &di->bas.bst, &di->bas.bsh));
}
diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c
index ee21f43..3bba676 100644
--- a/sys/dev/uart/uart_dev_ns8250.c
+++ b/sys/dev/uart/uart_dev_ns8250.c
@@ -397,6 +397,7 @@ struct uart_class uart_ns8250_class = {
#ifdef FDT
static struct ofw_compat_data compat_data[] = {
{"ns16550", (uintptr_t)&uart_ns8250_class},
+ {"snps,dw-apb-uart", (uintptr_t)&uart_ns8250_class},
{NULL, (uintptr_t)NULL},
};
UART_FDT_CLASS_AND_DEVICE(compat_data);
@@ -456,9 +457,12 @@ ns8250_bus_attach(struct uart_softc *sc)
* Check whether uart requires to read USR reg when IIR_BUSY and
* has broken txfifo.
*/
+ ns8250->busy_detect = ofw_bus_is_compatible(sc->sc_dev, "snps,dw-apb-uart");
node = ofw_bus_get_node(sc->sc_dev);
- if ((OF_getencprop(node, "busy-detect", &cell, sizeof(cell))) > 0)
- ns8250->busy_detect = cell ? 1 : 0;
+ /* XXX: This is kept for a short time for compatibility with older device trees */
+ if ((OF_getencprop(node, "busy-detect", &cell, sizeof(cell))) > 0
+ && cell != 0)
+ ns8250->busy_detect = 1;
if ((OF_getencprop(node, "broken-txfifo", &cell, sizeof(cell))) > 0)
broken_txfifo = cell ? 1 : 0;
#endif
diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c
index ada4927..6b526ae 100644
--- a/sys/dev/uart/uart_tty.c
+++ b/sys/dev/uart/uart_tty.c
@@ -355,6 +355,18 @@ uart_tty_free(void *arg)
*/
}
+static bool
+uart_tty_busy(struct tty *tp)
+{
+ struct uart_softc *sc;
+
+ sc = tty_softc(tp);
+ if (sc == NULL || sc->sc_leaving)
+ return (FALSE);
+
+ return (sc->sc_txbusy);
+}
+
static struct ttydevsw uart_tty_class = {
.tsw_flags = TF_INITLOCK|TF_CALLOUT,
.tsw_open = uart_tty_open,
@@ -365,6 +377,7 @@ static struct ttydevsw uart_tty_class = {
.tsw_param = uart_tty_param,
.tsw_modem = uart_tty_modem,
.tsw_free = uart_tty_free,
+ .tsw_busy = uart_tty_busy,
};
int
OpenPOWER on IntegriCloud