git: fa93443af9fb - main - uart: Prefer rclk passed in over rclk in the class

From: Warner Losh <imp_at_FreeBSD.org>
Date: Mon, 14 Oct 2024 22:17:30 UTC
The branch main has been updated by imp:

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

commit fa93443af9fb05989dc069ea37932be1b760e7f3
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2024-10-14 21:57:09 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2024-10-14 22:03:58 +0000

    uart: Prefer rclk passed in over rclk in the class
    
    If rclk is set in sysdev, then it was set during the boot process and is
    intended to override the defaults. By prefering the sysdev one over the
    class, xo=XXXX in hw.uart.console can give the user a usable console for
    non-traditional UARTs, especially on !x86 platforms. The default rclk
    generally only is good for I/O mapped UARTS or PCI ones that we can do a
    table lookup on. Other times, it can be hard to know what a good default
    is without more information.
    
    Sponsored by:           Netflix
    Reviewed by:            andrew
    Differential Revision:  https://reviews.freebsd.org/D47069
---
 sys/dev/uart/uart_core.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/sys/dev/uart/uart_core.c b/sys/dev/uart/uart_core.c
index c2bc818a6fc2..71f39e4c71e7 100644
--- a/sys/dev/uart/uart_core.c
+++ b/sys/dev/uart/uart_core.c
@@ -559,8 +559,14 @@ uart_bus_probe(device_t dev, int regshft, int regiowidth, int rclk, int rid, int
 		    uart_cpu_eqres(&sc->sc_bas, &sysdev->bas)) {
 			/* XXX check if ops matches class. */
 			sc->sc_sysdev = sysdev;
-			sysdev->bas.rclk = sc->sc_bas.rclk;
-		}
+			if (sysdev->bas.rclk != 0) {
+				/* Let the boot sequence control */
+				sc->sc_bas.rclk = sysdev->bas.rclk;
+			} else {
+				/* Boot didn't set it, use use class */
+				sysdev->bas.rclk = sc->sc_bas.rclk;
+			}
+                }
 	}
 
 	error = UART_PROBE(sc);