5d7c73e65b
This patch changes the PPC4xx POST UART driver to use the common NS16550 functions for receiving and sending. Additionally the local function for SoC divisor setup are removed. Instead the functions from arch/powerpc/cpu/ppc4xx/4xx_uart.c are used. This removes code duplication. Also the common CONFIG_SYS_NS16550_COMx defines are now used to describe the POST UART's. And a compile breakage is fixed, introduced by a git merge of the ppc4xx/next branch into master. Now "ppc4xx.h" is moved to "asm/ppc4xx.h". Fixed as well with this patch. Signed-off-by: Stefan Roese <sr@denx.de>
109 lines
2.6 KiB
C
109 lines
2.6 KiB
C
/*
|
|
* (C) Copyright 2007
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
*
|
|
* Author: Igor Lisitsin <igor@emcraft.com>
|
|
*
|
|
* Copyright 2010, Stefan Roese, DENX Software Engineering, sr@denx.de
|
|
*
|
|
* See file CREDITS for list of people who contributed to this
|
|
* project.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <asm/ppc4xx.h>
|
|
#include <ns16550.h>
|
|
#include <asm/io.h>
|
|
#include <serial.h>
|
|
|
|
/*
|
|
* UART test
|
|
*
|
|
* The controllers are configured to loopback mode and several
|
|
* characters are transmitted.
|
|
*/
|
|
|
|
#include <post.h>
|
|
|
|
#if CONFIG_POST & CONFIG_SYS_POST_UART
|
|
|
|
/*
|
|
* This table defines the UART's that should be tested and can
|
|
* be overridden in the board config file
|
|
*/
|
|
#ifndef CONFIG_SYS_POST_UART_TABLE
|
|
#define CONFIG_SYS_POST_UART_TABLE { CONFIG_SYS_NS16550_COM1, \
|
|
CONFIG_SYS_NS16550_COM2, CONFIG_SYS_NS16550_COM3, \
|
|
CONFIG_SYS_NS16550_COM4 }
|
|
#endif
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
static int test_ctlr (struct NS16550 *com_port, int index)
|
|
{
|
|
int res = -1;
|
|
char test_str[] = "*** UART Test String ***\r\n";
|
|
int i;
|
|
int divisor;
|
|
|
|
divisor = (get_serial_clock() + (gd->baudrate * (16 / 2))) /
|
|
(16 * gd->baudrate);
|
|
NS16550_init(com_port, divisor);
|
|
|
|
/*
|
|
* Set internal loopback mode in UART
|
|
*/
|
|
out_8(&com_port->mcr, in_8(&com_port->mcr) | UART_MCR_LOOP);
|
|
|
|
/* Reset FIFOs */
|
|
out_8(&com_port->fcr, UART_FCR_RXSR | UART_FCR_TXSR);
|
|
udelay(100);
|
|
|
|
/* Flush RX-FIFO */
|
|
while (NS16550_tstc(com_port))
|
|
NS16550_getc(com_port);
|
|
|
|
for (i = 0; i < sizeof (test_str) - 1; i++) {
|
|
NS16550_putc(com_port, test_str[i]);
|
|
if (NS16550_getc(com_port) != test_str[i])
|
|
goto done;
|
|
}
|
|
res = 0;
|
|
done:
|
|
if (res)
|
|
post_log ("uart%d test failed\n", index);
|
|
|
|
return res;
|
|
}
|
|
|
|
int uart_post_test (int flags)
|
|
{
|
|
int i, res = 0;
|
|
static unsigned long base[] = CONFIG_SYS_POST_UART_TABLE;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(base); i++) {
|
|
if (test_ctlr((struct NS16550 *)base[i], i))
|
|
res = -1;
|
|
}
|
|
serial_reinit_all ();
|
|
|
|
return res;
|
|
}
|
|
|
|
#endif /* CONFIG_POST & CONFIG_SYS_POST_UART */
|