1
0
Fork 0

serial: dcc: Move driver to DM

Enabling this driver requires some DT changes.
Adding DCC to root or main bus:
dcc: dcc {
	compatible = "arm,dcc";
	u-boot,dm-pre-reloc;
};

Extend alias list to link DCC:
	serial0 = &uart0;
	serial1 = &uart1;
	serial2 = &dcc;

Change stdout-path to point to dcc port.
	stdout-path = "serial2:115200n8";

Also add support for debug uart to help with early debug.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
utp
Michal Simek 2016-02-23 10:02:28 +01:00 committed by Tom Rini
parent 05195b2cbe
commit 966bfa7347
2 changed files with 51 additions and 27 deletions

View File

@ -119,6 +119,17 @@ config DEBUG_UART_UARTLITE
You will need to provide parameters to make this work. The driver will
be available until the real driver-model serial is running.
config DEBUG_UART_ARM_DCC
bool "ARM DCC"
help
Select this to enable a debug UART using the ARM JTAG DCC port.
The DCC port can be used for very early debugging and doesn't require
any additional setting like address/baudrate/clock. On systems without
any serial interface this is the easiest way how to get console.
Every ARM core has own DCC port which is the part of debug interface.
This port is available at least on ARMv6, ARMv7, ARMv8 and XScale
architectures.
config DEBUG_UART_ZYNQ
bool "Xilinx Zynq"
help

View File

@ -1,6 +1,7 @@
/*
* Copyright (C) 2004-2007 ARM Limited.
* Copyright (C) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
* Copyright (C) 2015 - 2016 Xilinx, Inc, Michal Simek
*
* SPDX-License-Identifier: GPL-2.0
*
@ -16,6 +17,7 @@
*/
#include <common.h>
#include <dm.h>
#include <serial.h>
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V7)
@ -94,12 +96,7 @@
#define TIMEOUT_COUNT 0x4000000
static int arm_dcc_init(void)
{
return 0;
}
static int arm_dcc_getc(void)
static int arm_dcc_getc(struct udevice *dev)
{
int ch;
register unsigned int reg;
@ -112,7 +109,7 @@ static int arm_dcc_getc(void)
return ch;
}
static void arm_dcc_putc(char ch)
static int arm_dcc_putc(struct udevice *dev, char ch)
{
register unsigned int reg;
unsigned int timeout_count = TIMEOUT_COUNT;
@ -123,41 +120,57 @@ static void arm_dcc_putc(char ch)
break;
}
if (timeout_count == 0)
return;
return -EAGAIN;
else
write_dcc(ch);
return 0;
}
static int arm_dcc_tstc(void)
static int arm_dcc_pending(struct udevice *dev, bool input)
{
register unsigned int reg;
can_read_dcc(reg);
if (input) {
can_read_dcc(reg);
} else {
can_write_dcc(reg);
}
return reg;
}
static void arm_dcc_setbrg(void)
{
}
static struct serial_device arm_dcc_drv = {
.name = "arm_dcc",
.start = arm_dcc_init,
.stop = NULL,
.setbrg = arm_dcc_setbrg,
.putc = arm_dcc_putc,
.puts = default_serial_puts,
.getc = arm_dcc_getc,
.tstc = arm_dcc_tstc,
static const struct dm_serial_ops arm_dcc_ops = {
.putc = arm_dcc_putc,
.pending = arm_dcc_pending,
.getc = arm_dcc_getc,
};
void arm_dcc_initialize(void)
static const struct udevice_id arm_dcc_ids[] = {
{ .compatible = "arm,dcc", },
{ }
};
U_BOOT_DRIVER(serial_dcc) = {
.name = "arm_dcc",
.id = UCLASS_SERIAL,
.of_match = arm_dcc_ids,
.ops = &arm_dcc_ops,
.flags = DM_FLAG_PRE_RELOC,
};
#ifdef CONFIG_DEBUG_UART_ARM_DCC
#include <debug_uart.h>
static inline void _debug_uart_init(void)
{
serial_register(&arm_dcc_drv);
}
__weak struct serial_device *default_serial_console(void)
static inline void _debug_uart_putc(int ch)
{
return &arm_dcc_drv;
arm_dcc_putc(NULL, ch);
}
DEBUG_UART_FUNCS
#endif