diff options
| author | Warner Losh <imp@FreeBSD.org> | 2024-10-14 21:57:25 +0000 |
|---|---|---|
| committer | Warner Losh <imp@FreeBSD.org> | 2024-10-14 22:03:58 +0000 |
| commit | b2fd259edd18af1fe35912bdb602bbe907dbbbcb (patch) | |
| tree | 74906ccea509647342638deb5a1bec6aa5398df0 /sys/dev | |
| parent | 2be22860375440641f6e57b03724fe38b87b0dd1 (diff) | |
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/uart/uart.h | 1 | ||||
| -rw-r--r-- | sys/dev/uart/uart_cpu_acpi.c | 8 | ||||
| -rw-r--r-- | sys/dev/uart/uart_subr.c | 2 |
3 files changed, 11 insertions, 0 deletions
diff --git a/sys/dev/uart/uart.h b/sys/dev/uart/uart.h index 4cdec00c9829..9b80f0148dc2 100644 --- a/sys/dev/uart/uart.h +++ b/sys/dev/uart/uart.h @@ -45,6 +45,7 @@ struct uart_bas { u_int regshft; u_int regiowidth; u_int busy_detect; + u_int rclk_guess;/* if rclk == 0, use baud + divisor to compute rclk */ }; #define uart_regofs(bas, reg) ((reg) << (bas)->regshft) diff --git a/sys/dev/uart/uart_cpu_acpi.c b/sys/dev/uart/uart_cpu_acpi.c index ae22a9822aa6..816738ec31d5 100644 --- a/sys/dev/uart/uart_cpu_acpi.c +++ b/sys/dev/uart/uart_cpu_acpi.c @@ -189,6 +189,14 @@ uart_cpu_acpi_spcr(int devtype, struct uart_devinfo *di) (int)spcr->BaudRate); goto out; } + /* + * If no rclk is set, then we will assume the BIOS has configured the + * hardware at the stated baudrate, so we can use it to guess the rclk + * relatively accurately, so make a note for later. + */ + if (di->bas.rclk == 0) + di->bas.rclk_guess = 1; + if (spcr->PciVendorId != PCIV_INVALID && spcr->PciDeviceId != PCIV_INVALID) { di->pci_info.vendor = spcr->PciVendorId; diff --git a/sys/dev/uart/uart_subr.c b/sys/dev/uart/uart_subr.c index 49a046f019bb..070ae80d9aff 100644 --- a/sys/dev/uart/uart_subr.c +++ b/sys/dev/uart/uart_subr.c @@ -279,6 +279,8 @@ uart_getenv(int devtype, struct uart_devinfo *di, struct uart_class *class) break; case UART_TAG_XO: di->bas.rclk = uart_parse_long(&spec); + if (di->bas.rclk == 0) + di->bas.rclk_guess = 1; break; default: goto inval; |
