From 969a7ec97bd4329ed80602f800b6044f5b20379f Mon Sep 17 00:00:00 2001 From: Andrew Victor Date: Thu, 3 May 2007 12:26:24 +0100 Subject: [PATCH] --- yaml --- r: 53991 b: refs/heads/master c: 03abeac0a222060ae8f02e8359c285df0971437e h: refs/heads/master i: 53989: ae12815dba8a821e55f26b51ad72702a4262cac6 53987: cc4ff93fe967931d43d540c111d75312aa7505c7 53983: e764f208b59331927c55d1c43c352421c6360f6d v: v3 --- [refs] | 2 +- trunk/drivers/serial/atmel_serial.c | 9 +++++++-- trunk/drivers/serial/atmel_serial.h | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 81d2f42e2f0d..6c1d017d1e89 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7c73628f24ea73479232d1b608359aa7d8d2c95d +refs/heads/master: 03abeac0a222060ae8f02e8359c285df0971437e diff --git a/trunk/drivers/serial/atmel_serial.c b/trunk/drivers/serial/atmel_serial.c index 935f48fa501d..3320bcd92c0a 100644 --- a/trunk/drivers/serial/atmel_serial.c +++ b/trunk/drivers/serial/atmel_serial.c @@ -484,11 +484,16 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios * termios, unsigned long flags; unsigned int mode, imr, quot, baud; + /* Get current mode register */ + mode = UART_GET_MR(port) & ~(ATMEL_US_USCLKS | ATMEL_US_CHRL | ATMEL_US_NBSTOP | ATMEL_US_PAR); + baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); quot = uart_get_divisor(port, baud); - /* Get current mode register */ - mode = UART_GET_MR(port) & ~(ATMEL_US_CHRL | ATMEL_US_NBSTOP | ATMEL_US_PAR); + if (quot > 65535) { /* BRGR is 16-bit, so switch to slower clock */ + quot /= 8; + mode |= ATMEL_US_USCLKS_MCK_DIV8; + } /* byte size */ switch (termios->c_cflag & CSIZE) { diff --git a/trunk/drivers/serial/atmel_serial.h b/trunk/drivers/serial/atmel_serial.h index 11b44360e108..e0141776517c 100644 --- a/trunk/drivers/serial/atmel_serial.h +++ b/trunk/drivers/serial/atmel_serial.h @@ -46,6 +46,9 @@ #define ATMEL_US_USMODE_ISO7816_T1 6 #define ATMEL_US_USMODE_IRDA 8 #define ATMEL_US_USCLKS (3 << 4) /* Clock Selection */ +#define ATMEL_US_USCLKS_MCK (0 << 4) +#define ATMEL_US_USCLKS_MCK_DIV8 (1 << 4) +#define ATMEL_US_USCLKS_SCK (3 << 4) #define ATMEL_US_CHRL (3 << 6) /* Character Length */ #define ATMEL_US_CHRL_5 (0 << 6) #define ATMEL_US_CHRL_6 (1 << 6)