summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2008-08-26 10:48:11 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2008-08-26 11:40:51 +0200
commitbc7915cafad31e8e86c864a08da99f2450df2208 (patch)
treed0a6e1952225c4778b29ffe868723009739f72e5
parent4da77347251e1370de6a5875676c2bce5bb94cb0 (diff)
downloadbarebox-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.c52
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 */