ARMV7: Fixed baudrate setting in pl01x driver

The pl01x serial driver was lacking the code to switch baudrates from the
command line.  Fixed by simply saving the new baudrate and calling
serial_init() again.  Also fixed CamelCase variables, I/O accessors and
comment style.

Signed-off-by: Matt Waddel <matt.waddel@linaro.org>
This commit is contained in:
Matt Waddel 2010-10-07 15:48:46 -06:00 committed by Wolfgang Denk
parent b80e41ac54
commit 249d5219c4
1 changed files with 38 additions and 55 deletions

View File

@ -29,25 +29,23 @@
#include <common.h> #include <common.h>
#include <watchdog.h> #include <watchdog.h>
#include <asm/io.h>
#include "serial_pl01x.h" #include "serial_pl01x.h"
#define IO_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (val))
#define IO_READ(addr) (*(volatile unsigned int *)(addr))
/* /*
* Integrator AP has two UARTs, we use the first one, at 38400-8-N-1 * Integrator AP has two UARTs, we use the first one, at 38400-8-N-1
* Integrator CP has two UARTs, use the first one, at 38400-8-N-1 * Integrator CP has two UARTs, use the first one, at 38400-8-N-1
* Versatile PB has four UARTs. * Versatile PB has four UARTs.
*/ */
#define CONSOLE_PORT CONFIG_CONS_INDEX #define CONSOLE_PORT CONFIG_CONS_INDEX
#define baudRate CONFIG_BAUDRATE
static volatile unsigned char *const port[] = CONFIG_PL01x_PORTS; static volatile unsigned char *const port[] = CONFIG_PL01x_PORTS;
#define NUM_PORTS (sizeof(port)/sizeof(port[0])) #define NUM_PORTS (sizeof(port)/sizeof(port[0]))
static void pl01x_putc (int portnum, char c); static void pl01x_putc (int portnum, char c);
static int pl01x_getc (int portnum); static int pl01x_getc (int portnum);
static int pl01x_tstc (int portnum); static int pl01x_tstc (int portnum);
unsigned int baudrate = CONFIG_BAUDRATE;
DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_PL010_SERIAL #ifdef CONFIG_PL010_SERIAL
@ -55,16 +53,11 @@ int serial_init (void)
{ {
unsigned int divisor; unsigned int divisor;
/* /* First, disable everything */
** First, disable everything. writel(0x0, port[CONSOLE_PORT] + UART_PL010_CR);
*/
IO_WRITE (port[CONSOLE_PORT] + UART_PL010_CR, 0x0);
/* /* Set baud rate */
** Set baud rate switch (baudrate) {
**
*/
switch (baudRate) {
case 9600: case 9600:
divisor = UART_PL010_BAUD_9600; divisor = UART_PL010_BAUD_9600;
break; break;
@ -89,20 +82,15 @@ int serial_init (void)
divisor = UART_PL010_BAUD_38400; divisor = UART_PL010_BAUD_38400;
} }
IO_WRITE (port[CONSOLE_PORT] + UART_PL010_LCRM, writel(((divisor & 0xf00) >> 8), port[CONSOLE_PORT] + UART_PL010_LCRM);
((divisor & 0xf00) >> 8)); writel((divisor & 0xff), port[CONSOLE_PORT] + UART_PL010_LCRL);
IO_WRITE (port[CONSOLE_PORT] + UART_PL010_LCRL, (divisor & 0xff));
/* /* Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled */
** Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled. writel((UART_PL010_LCRH_WLEN_8 | UART_PL010_LCRH_FEN),
*/ port[CONSOLE_PORT] + UART_PL010_LCRH);
IO_WRITE (port[CONSOLE_PORT] + UART_PL010_LCRH,
(UART_PL010_LCRH_WLEN_8 | UART_PL010_LCRH_FEN));
/* /* Finally, enable the UART */
** Finally, enable the UART writel((UART_PL010_CR_UARTEN), port[CONSOLE_PORT] + UART_PL010_CR);
*/
IO_WRITE (port[CONSOLE_PORT] + UART_PL010_CR, (UART_PL010_CR_UARTEN));
return 0; return 0;
} }
@ -118,38 +106,31 @@ int serial_init (void)
unsigned int remainder; unsigned int remainder;
unsigned int fraction; unsigned int fraction;
/* /* First, disable everything */
** First, disable everything. writel(0x0, port[CONSOLE_PORT] + UART_PL011_CR);
*/
IO_WRITE (port[CONSOLE_PORT] + UART_PL011_CR, 0x0);
/* /*
** Set baud rate * Set baud rate
** *
** IBRD = UART_CLK / (16 * BAUD_RATE) * IBRD = UART_CLK / (16 * BAUD_RATE)
** FBRD = ROUND((64 * MOD(UART_CLK,(16 * BAUD_RATE))) / (16 * BAUD_RATE)) * FBRD = RND((64 * MOD(UART_CLK,(16 * BAUD_RATE))) / (16 * BAUD_RATE))
*/ */
temp = 16 * baudRate; temp = 16 * baudrate;
divider = CONFIG_PL011_CLOCK / temp; divider = CONFIG_PL011_CLOCK / temp;
remainder = CONFIG_PL011_CLOCK % temp; remainder = CONFIG_PL011_CLOCK % temp;
temp = (8 * remainder) / baudRate; temp = (8 * remainder) / baudrate;
fraction = (temp >> 1) + (temp & 1); fraction = (temp >> 1) + (temp & 1);
IO_WRITE (port[CONSOLE_PORT] + UART_PL011_IBRD, divider); writel(divider, port[CONSOLE_PORT] + UART_PL011_IBRD);
IO_WRITE (port[CONSOLE_PORT] + UART_PL011_FBRD, fraction); writel(fraction, port[CONSOLE_PORT] + UART_PL011_FBRD);
/* /* Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled */
** Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled. writel((UART_PL011_LCRH_WLEN_8 | UART_PL011_LCRH_FEN),
*/ port[CONSOLE_PORT] + UART_PL011_LCRH);
IO_WRITE (port[CONSOLE_PORT] + UART_PL011_LCRH,
(UART_PL011_LCRH_WLEN_8 | UART_PL011_LCRH_FEN));
/* /* Finally, enable the UART */
** Finally, enable the UART writel((UART_PL011_CR_UARTEN | UART_PL011_CR_TXE | UART_PL011_CR_RXE),
*/ port[CONSOLE_PORT] + UART_PL011_CR);
IO_WRITE (port[CONSOLE_PORT] + UART_PL011_CR,
(UART_PL011_CR_UARTEN | UART_PL011_CR_TXE |
UART_PL011_CR_RXE));
return 0; return 0;
} }
@ -183,16 +164,18 @@ int serial_tstc (void)
void serial_setbrg (void) void serial_setbrg (void)
{ {
baudrate = gd->baudrate;
serial_init();
} }
static void pl01x_putc (int portnum, char c) static void pl01x_putc (int portnum, char c)
{ {
/* Wait until there is space in the FIFO */ /* Wait until there is space in the FIFO */
while (IO_READ (port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_TXFF) while (readl(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_TXFF)
WATCHDOG_RESET(); WATCHDOG_RESET();
/* Send the character */ /* Send the character */
IO_WRITE (port[portnum] + UART_PL01x_DR, c); writel(c, port[portnum] + UART_PL01x_DR);
} }
static int pl01x_getc (int portnum) static int pl01x_getc (int portnum)
@ -200,15 +183,15 @@ static int pl01x_getc (int portnum)
unsigned int data; unsigned int data;
/* Wait until there is data in the FIFO */ /* Wait until there is data in the FIFO */
while (IO_READ (port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE) while (readl(port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE)
WATCHDOG_RESET(); WATCHDOG_RESET();
data = IO_READ (port[portnum] + UART_PL01x_DR); data = readl(port[portnum] + UART_PL01x_DR);
/* Check for an error flag */ /* Check for an error flag */
if (data & 0xFFFFFF00) { if (data & 0xFFFFFF00) {
/* Clear the error */ /* Clear the error */
IO_WRITE (port[portnum] + UART_PL01x_ECR, 0xFFFFFFFF); writel(0xFFFFFFFF, port[portnum] + UART_PL01x_ECR);
return -1; return -1;
} }
@ -218,6 +201,6 @@ static int pl01x_getc (int portnum)
static int pl01x_tstc (int portnum) static int pl01x_tstc (int portnum)
{ {
WATCHDOG_RESET(); WATCHDOG_RESET();
return !(IO_READ (port[portnum] + UART_PL01x_FR) & return !(readl(port[portnum] + UART_PL01x_FR) &
UART_PL01x_FR_RXFE); UART_PL01x_FR_RXFE);
} }