diff --git a/sys/dev/uart/uart_bus.h b/sys/dev/uart/uart_bus.h index 322e9a8..f40ad9a 100644 --- a/sys/dev/uart/uart_bus.h +++ b/sys/dev/uart/uart_bus.h @@ -70,6 +70,7 @@ struct uart_class { struct uart_ops *uc_ops; /* Low-level console operations. */ u_int uc_range; /* Bus space address range. */ u_int uc_rclk; /* Default rclk for this device. */ + u_int uc_regshft; /* Default regshift for this device. */ }; struct uart_softc { diff --git a/sys/dev/uart/uart_bus_fdt.c b/sys/dev/uart/uart_bus_fdt.c index 3c68d95..b19d2dd 100644 --- a/sys/dev/uart/uart_bus_fdt.c +++ b/sys/dev/uart/uart_bus_fdt.c @@ -92,7 +92,7 @@ uart_fdt_get_shift(phandle_t node, pcell_t *cell) pcell_t shift; if ((OF_getprop(node, "reg-shift", &shift, sizeof(shift))) <= 0) - shift = 0; + return (-1); *cell = fdt32_to_cpu(shift); return (0); } @@ -132,7 +132,8 @@ uart_fdt_probe(device_t dev) if ((err = uart_fdt_get_clock(node, &clock)) != 0) return (err); - uart_fdt_get_shift(node, &shift); + if (uart_fdt_get_shift(node, &shift) < 0) + shift = sc->sc_class->uc_regshft; return (uart_bus_probe(dev, (int)shift, (int)clock, 0, 0)); } diff --git a/sys/dev/uart/uart_cpu_fdt.c b/sys/dev/uart/uart_cpu_fdt.c index 8dfdb3c..541d219 100644 --- a/sys/dev/uart/uart_cpu_fdt.c +++ b/sys/dev/uart/uart_cpu_fdt.c @@ -84,10 +84,12 @@ uart_fdt_get_shift(phandle_t node, pcell_t *cell) { pcell_t shift; - if ((OF_getprop(node, "reg-shift", &shift, sizeof(shift))) <= 0) - shift = 0; - *cell = fdt32_to_cpu(shift); - return (0); + if ((OF_getprop(node, "reg-shift", &shift, sizeof(shift))) > 0) { + *cell = fdt32_to_cpu(shift); + return (0); + } + + return (-1); } int @@ -193,7 +195,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) /* * Retrieve serial attributes. */ - uart_fdt_get_shift(node, &shift); + if (OF_getprop(node, "current-speed", &br, sizeof(br)) <= 0) br = 0; else @@ -217,6 +219,9 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) rclk = 0; } + if (uart_fdt_get_shift(node, &shift) < 0) + shift = class->uc_regshft; + /* * Finalize configuration. */