aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/uart/uart.h1
-rw-r--r--sys/dev/uart/uart_cpu_acpi.c8
-rw-r--r--sys/dev/uart/uart_subr.c2
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;