]> git.ipfire.org Git - thirdparty/u-boot.git/blame - drivers/serial/serial_xuartlite.c
Add GPL-2.0+ SPDX-License-Identifier to source files
[thirdparty/u-boot.git] / drivers / serial / serial_xuartlite.c
CommitLineData
507bbe3e 1/*
49a23e4a 2 * (C) Copyright 2008-2011 Michal Simek <monstr@monstr.eu>
53ea981c 3 * Clean driver and add xilinx constant from header file
507bbe3e 4 *
53ea981c 5 * (C) Copyright 2004 Atmark Techno, Inc.
507bbe3e
WD
6 * Yasushi SHOJI <yashi@atmark-techno.com>
7 *
1a459660 8 * SPDX-License-Identifier: GPL-2.0+
507bbe3e
WD
9 */
10
11#include <config.h>
49a23e4a 12#include <common.h>
53ea981c 13#include <asm/io.h>
49a23e4a
MS
14#include <linux/compiler.h>
15#include <serial.h>
507bbe3e 16
53ea981c
MS
17#define SR_TX_FIFO_FULL 0x08 /* transmit FIFO full */
18#define SR_RX_FIFO_VALID_DATA 0x01 /* data in receive FIFO */
19#define SR_RX_FIFO_FULL 0x02 /* receive FIFO full */
507bbe3e 20
49a23e4a
MS
21struct uartlite {
22 unsigned int rx_fifo;
23 unsigned int tx_fifo;
24 unsigned int status;
25};
26
8cb9b237 27static struct uartlite *userial_ports[4] = {
49a23e4a
MS
28#ifdef XILINX_UARTLITE_BASEADDR
29 [0] = (struct uartlite *)XILINX_UARTLITE_BASEADDR,
30#endif
31#ifdef XILINX_UARTLITE_BASEADDR1
32 [1] = (struct uartlite *)XILINX_UARTLITE_BASEADDR1,
33#endif
34#ifdef XILINX_UARTLITE_BASEADDR2
35 [2] = (struct uartlite *)XILINX_UARTLITE_BASEADDR2,
36#endif
37#ifdef XILINX_UARTLITE_BASEADDR3
38 [3] = (struct uartlite *)XILINX_UARTLITE_BASEADDR3
39#endif
40};
41
42void uartlite_serial_putc(const char c, const int port)
43{
44 struct uartlite *regs = userial_ports[port];
45
46 if (c == '\n')
47 uartlite_serial_putc('\r', port);
48
49 while (in_be32(&regs->status) & SR_TX_FIFO_FULL)
50 ;
51 out_be32(&regs->tx_fifo, c & 0xff);
52}
53
54void uartlite_serial_puts(const char *s, const int port)
55{
56 while (*s)
57 uartlite_serial_putc(*s++, port);
58}
59
60int uartlite_serial_getc(const int port)
61{
62 struct uartlite *regs = userial_ports[port];
63
64 while (!(in_be32(&regs->status) & SR_RX_FIFO_VALID_DATA))
65 ;
66 return in_be32(&regs->rx_fifo) & 0xff;
67}
68
69int uartlite_serial_tstc(const int port)
70{
71 struct uartlite *regs = userial_ports[port];
507bbe3e 72
49a23e4a
MS
73 return in_be32(&regs->status) & SR_RX_FIFO_VALID_DATA;
74}
75
25239e12
MS
76static int uartlite_serial_init(const int port)
77{
78 if (userial_ports[port])
79 return 0;
80 return -1;
81}
82
49a23e4a
MS
83/* Multi serial device functions */
84#define DECLARE_ESERIAL_FUNCTIONS(port) \
85 int userial##port##_init(void) \
25239e12 86 { return uartlite_serial_init(port); } \
49a23e4a
MS
87 void userial##port##_setbrg(void) {} \
88 int userial##port##_getc(void) \
89 { return uartlite_serial_getc(port); } \
90 int userial##port##_tstc(void) \
91 { return uartlite_serial_tstc(port); } \
92 void userial##port##_putc(const char c) \
93 { uartlite_serial_putc(c, port); } \
94 void userial##port##_puts(const char *s) \
95 { uartlite_serial_puts(s, port); }
96
97/* Serial device descriptor */
90bad891
MV
98#define INIT_ESERIAL_STRUCTURE(port, __name) { \
99 .name = __name, \
100 .start = userial##port##_init, \
101 .stop = NULL, \
102 .setbrg = userial##port##_setbrg, \
103 .getc = userial##port##_getc, \
104 .tstc = userial##port##_tstc, \
105 .putc = userial##port##_putc, \
106 .puts = userial##port##_puts, \
107}
49a23e4a
MS
108
109DECLARE_ESERIAL_FUNCTIONS(0);
110struct serial_device uartlite_serial0_device =
111 INIT_ESERIAL_STRUCTURE(0, "ttyUL0");
112DECLARE_ESERIAL_FUNCTIONS(1);
113struct serial_device uartlite_serial1_device =
114 INIT_ESERIAL_STRUCTURE(1, "ttyUL1");
115DECLARE_ESERIAL_FUNCTIONS(2);
116struct serial_device uartlite_serial2_device =
117 INIT_ESERIAL_STRUCTURE(2, "ttyUL2");
118DECLARE_ESERIAL_FUNCTIONS(3);
119struct serial_device uartlite_serial3_device =
120 INIT_ESERIAL_STRUCTURE(3, "ttyUL3");
121
122__weak struct serial_device *default_serial_console(void)
123{
25239e12
MS
124 if (userial_ports[0])
125 return &uartlite_serial0_device;
126 if (userial_ports[1])
127 return &uartlite_serial1_device;
128 if (userial_ports[2])
129 return &uartlite_serial2_device;
130 if (userial_ports[3])
131 return &uartlite_serial3_device;
132
133 return NULL;
507bbe3e 134}
87d69229
MV
135
136void uartlite_serial_initialize(void)
137{
138#ifdef XILINX_UARTLITE_BASEADDR
139 serial_register(&uartlite_serial0_device);
140#endif /* XILINX_UARTLITE_BASEADDR */
141#ifdef XILINX_UARTLITE_BASEADDR1
142 serial_register(&uartlite_serial1_device);
143#endif /* XILINX_UARTLITE_BASEADDR1 */
144#ifdef XILINX_UARTLITE_BASEADDR2
145 serial_register(&uartlite_serial2_device);
146#endif /* XILINX_UARTLITE_BASEADDR2 */
147#ifdef XILINX_UARTLITE_BASEADDR3
148 serial_register(&uartlite_serial3_device);
149#endif /* XILINX_UARTLITE_BASEADDR3 */
150}