2 * Xilinx UARTLITE bootloader driver
4 * Copyright (C) 2007 Secret Lab Technologies Ltd.
6 * This file is licensed under the terms of the GNU General Public License
7 * version 2. This program is licensed "as is" without any warranty of any
8 * kind, whether express or implied.
21 #define ULITE_STATUS 0x08
22 #define ULITE_CONTROL 0x0c
24 #define ULITE_STATUS_RXVALID 0x01
25 #define ULITE_STATUS_TXFULL 0x08
27 #define ULITE_CONTROL_RST_RX 0x02
29 static void * reg_base
;
31 static int uartlite_open(void)
33 /* Clear the RX FIFO */
34 out_be32(reg_base
+ ULITE_CONTROL
, ULITE_CONTROL_RST_RX
);
38 static void uartlite_putc(unsigned char c
)
40 u32 reg
= ULITE_STATUS_TXFULL
;
41 while (reg
& ULITE_STATUS_TXFULL
) /* spin on TXFULL bit */
42 reg
= in_be32(reg_base
+ ULITE_STATUS
);
43 out_be32(reg_base
+ ULITE_TX
, c
);
46 static unsigned char uartlite_getc(void)
49 while (!(reg
& ULITE_STATUS_RXVALID
)) /* spin waiting for RXVALID bit */
50 reg
= in_be32(reg_base
+ ULITE_STATUS
);
51 return in_be32(reg_base
+ ULITE_RX
);
54 static u8
uartlite_tstc(void)
56 u32 reg
= in_be32(reg_base
+ ULITE_STATUS
);
57 return reg
& ULITE_STATUS_RXVALID
;
60 int uartlite_console_init(void *devp
, struct serial_console_data
*scdp
)
63 unsigned long reg_phys
;
65 n
= getprop(devp
, "virtual-reg", ®_base
, sizeof(reg_base
));
66 if (n
!= sizeof(reg_base
)) {
67 if (!dt_xlate_reg(devp
, 0, ®_phys
, NULL
))
70 reg_base
= (void *)reg_phys
;
73 scdp
->open
= uartlite_open
;
74 scdp
->putc
= uartlite_putc
;
75 scdp
->getc
= uartlite_getc
;
76 scdp
->tstc
= uartlite_tstc
;