diff options
author | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2014-02-17 19:37:52 +0200 |
---|---|---|
committer | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2014-03-04 15:22:08 +0100 |
commit | 3ee1668ab4fbf75b256ac8eef4273b1ea445c998 (patch) | |
tree | 59f35a43b85c5da6a0d9d38aba7f391971cbc980 /src/include | |
parent | c76b3d6cca4a6135e5a7d7f3c2d9aa5128ef23f0 (diff) | |
download | coreboot-3ee1668ab4fbf75b256ac8eef4273b1ea445c998.tar.xz |
uart8250: Fix and unify baudrate divisor calculation
Divisor is a function of requested baudrate, platform-specific
reference clock and amount of oversampling done on the UART reference.
Calculate this parameter with divisor rounded to nearest integer.
When building without option_table or when there is no entry for
baud_rate, CONFIG_TTYS0_BAUD is used for default baudrate.
For OxPCIe use of 4 MHz for reference was arbitrary giving correct
divisor for 115200 but somewhat inaccurate for lower baudrates.
Actual hardware is 62500000 with 16 times oversampling.
FIXME: Field for baudrate in lb_tables is still incorrect.
Change-Id: I68539738469af780fadd3392263dd9b3d5964d2d
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: http://review.coreboot.org/5229
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/uart.h | 17 | ||||
-rw-r--r-- | src/include/uart8250.h | 4 |
2 files changed, 17 insertions, 4 deletions
diff --git a/src/include/uart.h b/src/include/uart.h index b520e09bdb..997fe185ce 100644 --- a/src/include/uart.h +++ b/src/include/uart.h @@ -20,6 +20,23 @@ #ifndef UART_H #define UART_H +/* Return the clock frequency UART uses as reference clock for + * baudrate generator. */ +unsigned int uart_platform_refclk(void); + +/* Return the baudrate determined from option_table, or when that is + * not used, CONFIG_TTYS0_BAUD. + */ +unsigned int default_baudrate(void); + +/* Returns the divisor value for a given baudrate. + * The formula to satisfy is: + * refclk / divisor = baudrate * oversample + */ +unsigned int uart_baudrate_divisor(unsigned int baudrate, + unsigned int refclk, unsigned int oversample); + + unsigned char uart_rx_byte(void); void uart_tx_byte(unsigned char data); void uart_tx_flush(void); diff --git a/src/include/uart8250.h b/src/include/uart8250.h index a48c948138..112cd44945 100644 --- a/src/include/uart8250.h +++ b/src/include/uart8250.h @@ -105,10 +105,6 @@ #define UART_SCR 0x07 #define UART_SPR 0x07 -#if ((115200 % CONFIG_TTYS0_BAUD) != 0) -#error Bad ttyS0 baud rate -#endif - #if CONFIG_CONSOLE_SERIAL8250 unsigned char uart8250_rx_byte(unsigned base_port); int uart8250_can_rx_byte(unsigned base_port); |