The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=4097cd06ca49a4a212c25177007509838c7d04a9

commit 4097cd06ca49a4a212c25177007509838c7d04a9
Author:     Warner Losh <i...@freebsd.org>
AuthorDate: 2024-10-14 21:57:44 +0000
Commit:     Warner Losh <i...@freebsd.org>
CommitDate: 2024-10-14 22:03:58 +0000

    uart/ns8250: Factor out reading the divisor
    
    We have two copies (soon to be three) of reading the divisor. Since it's
    a complicated tricky process, abstract it to its own routine.
    
    Sponsored by:           Netflix
    Reviewed by:            andrew, markj
    Differential Revision:  https://reviews.freebsd.org/D47074
---
 sys/dev/uart/uart_dev_ns8250.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c
index 9f88a43f462a..d43a48f319e4 100644
--- a/sys/dev/uart/uart_dev_ns8250.c
+++ b/sys/dev/uart/uart_dev_ns8250.c
@@ -126,11 +126,11 @@ ns8250_clrint(struct uart_bas *bas)
        }
 }
 
-static int
-ns8250_delay(struct uart_bas *bas)
+static uint32_t
+ns8250_get_divisor(struct uart_bas *bas)
 {
-       int divisor;
-       u_char lcr;
+       uint32_t divisor;
+       uint8_t lcr;
 
        lcr = uart_getreg(bas, REG_LCR);
        uart_setreg(bas, REG_LCR, lcr | LCR_DLAB);
@@ -140,6 +140,16 @@ ns8250_delay(struct uart_bas *bas)
        uart_setreg(bas, REG_LCR, lcr);
        uart_barrier(bas);
 
+       return (divisor);
+}
+
+static int
+ns8250_delay(struct uart_bas *bas)
+{
+       int divisor;
+
+       divisor = ns8250_get_divisor(bas);
+
        /* 1/10th the time to transmit 1 character (estimate). */
        if (divisor <= 134)
                return (16000000 * divisor / bas->rclk);
@@ -727,14 +737,7 @@ ns8250_bus_ioctl(struct uart_softc *sc, int request, 
intptr_t data)
                uart_barrier(bas);
                break;
        case UART_IOCTL_BAUD:
-               lcr = uart_getreg(bas, REG_LCR);
-               uart_setreg(bas, REG_LCR, lcr | LCR_DLAB);
-               uart_barrier(bas);
-               divisor = uart_getreg(bas, REG_DLL) |
-                   (uart_getreg(bas, REG_DLH) << 8);
-               uart_barrier(bas);
-               uart_setreg(bas, REG_LCR, lcr);
-               uart_barrier(bas);
+               divisor = ns8250_get_divisor(bas);
                baudrate = (divisor > 0) ? bas->rclk / divisor / 16 : 0;
                if (baudrate > 0)
                        *(int*)data = baudrate;

Reply via email to