|
@@ -100,6 +100,8 @@
|
|
|
#define AUART_CTRL2_TXE (1 << 8)
|
|
|
#define AUART_CTRL2_UARTEN (1 << 0)
|
|
|
|
|
|
+#define AUART_LINECTRL_BAUD_DIV_MAX 0x003fffc0
|
|
|
+#define AUART_LINECTRL_BAUD_DIV_MIN 0x000000ec
|
|
|
#define AUART_LINECTRL_BAUD_DIVINT_SHIFT 16
|
|
|
#define AUART_LINECTRL_BAUD_DIVINT_MASK 0xffff0000
|
|
|
#define AUART_LINECTRL_BAUD_DIVINT(v) (((v) & 0xffff) << 16)
|
|
@@ -659,7 +661,7 @@ static void mxs_auart_settermios(struct uart_port *u,
|
|
|
{
|
|
|
struct mxs_auart_port *s = to_auart_port(u);
|
|
|
u32 bm, ctrl, ctrl2, div;
|
|
|
- unsigned int cflag, baud;
|
|
|
+ unsigned int cflag, baud, baud_min, baud_max;
|
|
|
|
|
|
cflag = termios->c_cflag;
|
|
|
|
|
@@ -752,7 +754,9 @@ static void mxs_auart_settermios(struct uart_port *u,
|
|
|
}
|
|
|
|
|
|
/* set baud rate */
|
|
|
- baud = uart_get_baud_rate(u, termios, old, 0, u->uartclk);
|
|
|
+ baud_min = DIV_ROUND_UP(u->uartclk * 32, AUART_LINECTRL_BAUD_DIV_MAX);
|
|
|
+ baud_max = u->uartclk * 32 / AUART_LINECTRL_BAUD_DIV_MIN;
|
|
|
+ baud = uart_get_baud_rate(u, termios, old, baud_min, baud_max);
|
|
|
div = u->uartclk * 32 / baud;
|
|
|
ctrl |= AUART_LINECTRL_BAUD_DIVFRAC(div & 0x3F);
|
|
|
ctrl |= AUART_LINECTRL_BAUD_DIVINT(div >> 6);
|