diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2008-08-26 10:48:11 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2008-08-26 11:40:51 +0200 |
commit | bc7915cafad31e8e86c864a08da99f2450df2208 (patch) | |
tree | d0a6e1952225c4778b29ffe868723009739f72e5 | |
parent | 4da77347251e1370de6a5875676c2bce5bb94cb0 (diff) | |
download | barebox-bc7915cafad31e8e86c864a08da99f2450df2208.tar.gz barebox-bc7915cafad31e8e86c864a08da99f2450df2208.tar.xz |
atmel serial: add initialization and baudrate functions
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/serial/atmel.c | 52 |
1 files changed, 36 insertions, 16 deletions
diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c index 8819b5feb2..bb99de3366 100644 --- a/drivers/serial/atmel.c +++ b/drivers/serial/atmel.c @@ -22,6 +22,7 @@ #include <init.h> #include <malloc.h> #include <asm/io.h> +#include <asm/arch/clk.h> /* USART3 register offsets */ #define USART3_CR 0x0000 @@ -308,19 +309,6 @@ << USART3_##name##_OFFSET)) \ | USART3_BF(name,value)) -/* - * Initialise the serial port with the given baudrate. The settings - * are always 8 data bits, no parity, 1 stop bit, no start bits. - * - */ -static int atmel_serial_init_port(struct console_device *cdev) -{ -// struct device_d *dev = cdev->dev; -// ulong base = dev->map_base; - - return 0; -} - static void atmel_serial_putc(struct console_device *cdev, char c) { struct device_d *dev = cdev->dev; @@ -347,8 +335,41 @@ static int atmel_serial_getc(struct console_device *cdev) static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate) { -// struct device_d *dev = cdev->dev; -// ulong base = dev->map_base; + struct device_d *dev = cdev->dev; + unsigned long divisor; + unsigned long usart_hz; + + /* + * Master Clock + * Baud Rate = -------------- + * 16 * CD + */ + usart_hz = get_usart_clk_rate(0); + divisor = (usart_hz / 16 + baudrate / 2) / baudrate; + writel(USART3_BF(CD, divisor), dev->map_base + USART3_BRGR); + + return 0; +} + +/* + * Initialise the serial port with the given baudrate. The settings + * are always 8 data bits, no parity, 1 stop bit, no start bits. + * + */ +static int atmel_serial_init_port(struct console_device *cdev) +{ + struct device_d *dev = cdev->dev; + + writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), dev->map_base + USART3_CR); + + atmel_serial_setbaudrate(cdev, 115200); + + writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), dev->map_base + USART3_CR); + writel((USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL) + | USART3_BF(USCLKS, USART3_USCLKS_MCK) + | USART3_BF(CHRL, USART3_CHRL_8) + | USART3_BF(PAR, USART3_PAR_NONE) + | USART3_BF(NBSTOP, USART3_NBSTOP_1)), dev->map_base + USART3_MR); return 0; } @@ -367,7 +388,6 @@ static int atmel_serial_probe(struct device_d *dev) cdev->setbrg = atmel_serial_setbaudrate; atmel_serial_init_port(cdev); - atmel_serial_setbaudrate(cdev, 115200); /* Enable UART */ |