diff -urN 2.6.18/arch/ppc/boot/simple/Makefile patched/arch/ppc/boot/simple/Makefile --- 2.6.18/arch/ppc/boot/simple/Makefile 2006-10-04 14:31:15.000000000 -0700 +++ patched/arch/ppc/boot/simple/Makefile 2006-10-07 10:34:32.000000000 -0700 @@ -205,6 +205,7 @@ endif boot-$(CONFIG_SERIAL_MPC52xx_CONSOLE) += mpc52xx_tty.o boot-$(CONFIG_SERIAL_MPSC_CONSOLE) += mv64x60_tty.o +boot-$(CONFIG_SERIAL_XUL_CONSOLE) += xuartlite_tty.o LIBS := $(common)/lib.a $(bootlib)/lib.a ifeq ($(CONFIG_PPC_PREP),y) diff -urN 2.6.18/arch/ppc/boot/simple/misc.c patched/arch/ppc/boot/simple/misc.c --- 2.6.18/arch/ppc/boot/simple/misc.c 2006-10-04 14:31:15.000000000 -0700 +++ patched/arch/ppc/boot/simple/misc.c 2006-10-07 10:27:34.000000000 -0700 @@ -48,7 +48,8 @@ #if (defined(CONFIG_SERIAL_8250_CONSOLE) \ || defined(CONFIG_VGA_CONSOLE) \ || defined(CONFIG_SERIAL_MPC52xx_CONSOLE) \ - || defined(CONFIG_SERIAL_MPSC_CONSOLE)) \ + || defined(CONFIG_SERIAL_MPSC_CONSOLE) \ + || defined(CONFIG_SERIAL_XUL_CONSOLE)) \ && !defined(CONFIG_GEMINI) #define INTERACTIVE_CONSOLE 1 #endif diff -urN 2.6.18/arch/ppc/boot/simple/xuartlite_tty.c patched/arch/ppc/boot/simple/xuartlite_tty.c --- 2.6.18/arch/ppc/boot/simple/xuartlite_tty.c 1969-12-31 16:00:00.000000000 -0800 +++ patched/arch/ppc/boot/simple/xuartlite_tty.c 2006-10-07 10:29:30.000000000 -0700 @@ -0,0 +1,74 @@ +/* + * Xilinx UART Lite support. + * Right now it only works over UART0 and none other. + * + * Copyright (C) 2006 David Bolcsfoldi + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#include +#include + +#define XUL_STATUS_REG_OFFSET 8 /* status register, read only */ +#define XUL_SR_TX_FIFO_FULL 0x08 /* transmit FIFO full */ +#define XUL_SR_RX_FIFO_VALID_DATA 0x01 /* data in receive FIFO */ +#define XUL_RX_FIFO_OFFSET 0 /* receive FIFO, read only */ +#define XUL_TX_FIFO_OFFSET 4 /* transmit FIFO, write only */ + +static inline int is_xmit_full(unsigned int address) +{ + return ((in_be32((volatile unsigned *) (address + XUL_STATUS_REG_OFFSET)) & XUL_SR_TX_FIFO_FULL) == XUL_SR_TX_FIFO_FULL); +} + +static inline int is_recv_empty(unsigned int address) +{ + return ((in_be32((volatile unsigned *) (address + XUL_STATUS_REG_OFFSET)) & XUL_SR_RX_FIFO_VALID_DATA) != XUL_SR_RX_FIFO_VALID_DATA); +} + +unsigned long serial_init(int chan, void *ignored) +{ + switch (chan) { + #ifdef XPAR_XUL_UART_0_BASEADDR + case 0: + return XPAR_XUL_UART_0_BASEADDR; + #endif + #ifdef XPAR_XUL_UART_1_BASEADDR + case 1: + return XPAR_XUL_UART_1_BASEADDR; + #endif + #ifdef XPAR_XUL_UART_2_BASEADDR + case 2: + return XPAR_XUL_UART_2_BASEADDR; + #endif + #ifdef XPAR_XUL_UART_3_BASEADDR + case 3: + return XPAR_XUL_UART_3_BASEADDR; + #endif + default: + goto out; + } + +out: + return -1; +} + +void serial_putc(unsigned long com_port, unsigned char c) +{ + while(is_xmit_full(XPAR_XUL_UART_0_BASEADDR)); + out_be32((volatile unsigned *) (XPAR_XUL_UART_0_BASEADDR + XUL_TX_FIFO_OFFSET), c); +} + +unsigned char serial_getc(unsigned long com_port) +{ + while(is_recv_empty(XPAR_XUL_UART_0_BASEADDR)); + return in_be32((volatile unsigned *) (XPAR_XUL_UART_0_BASEADDR + XUL_RX_FIFO_OFFSET)); +} + +int serial_tstc(unsigned long com_port) +{ + return !(is_recv_empty(XPAR_XUL_UART_0_BASEADDR)); +} +