Blame view

include/ns16550.h 7.7 KB
717b5aad2   wdenk   Initial revision
1
2
  /*
   * NS16550 Serial Port
a47a12bec   Stefan Roese   Move arch/ppc to ...
3
   * originally from linux source (arch/powerpc/boot/ns16550.h)
200779e3e   Detlev Zundel   Rename common ns1...
4
5
6
7
   *
   * Cleanup and unification
   * (C) 2009 by Detlev Zundel, DENX Software Engineering GmbH
   *
717b5aad2   wdenk   Initial revision
8
   * modified slightly to
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
9
   * have addresses as offsets from CONFIG_SYS_ISA_BASE
717b5aad2   wdenk   Initial revision
10
11
12
13
   * added a few more definitions
   * added prototypes for ns16550.c
   * reduced no of com ports to 2
   * modifications (c) Rob Taylor, Flying Pig Systems. 2000.
b87dfd285   Wolfgang Denk   Add support for T...
14
   *
f5e0d0397   Heiko Schocher   Add support for w...
15
16
   * added support for port on 64-bit bus
   * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems
717b5aad2   wdenk   Initial revision
17
   */
453c0d755   Detlev Zundel   include/ns16550.h...
18
19
20
21
  /*
   * Note that the following macro magic uses the fact that the compiler
   * will not allocate storage for arrays of size 0
   */
79df1208e   Dave Aldridge   ns16550: change t...
22
  #include <linux/types.h>
12e431b27   Simon Glass   dm: serial: Add d...
23
24
25
26
27
28
29
  #ifdef CONFIG_DM_SERIAL
  /*
   * For driver model we always use one byte per register, and sort out the
   * differences in the driver
   */
  #define CONFIG_SYS_NS16550_REG_SIZE (-1)
  #endif
453c0d755   Detlev Zundel   include/ns16550.h...
30
  #if !defined(CONFIG_SYS_NS16550_REG_SIZE) || (CONFIG_SYS_NS16550_REG_SIZE == 0)
717b5aad2   wdenk   Initial revision
31
  #error "Please define NS16550 registers size."
909140085   Simon Glass   dm: ns16550: Supp...
32
  #elif defined(CONFIG_SYS_NS16550_MEM32) && !defined(CONFIG_DM_SERIAL)
79df1208e   Dave Aldridge   ns16550: change t...
33
  #define UART_REG(x) u32 x
453c0d755   Detlev Zundel   include/ns16550.h...
34
35
36
37
38
39
40
41
  #elif (CONFIG_SYS_NS16550_REG_SIZE > 0)
  #define UART_REG(x)						   \
  	unsigned char prepad_##x[CONFIG_SYS_NS16550_REG_SIZE - 1]; \
  	unsigned char x;
  #elif (CONFIG_SYS_NS16550_REG_SIZE < 0)
  #define UART_REG(x)							\
  	unsigned char x;						\
  	unsigned char postpad_##x[-CONFIG_SYS_NS16550_REG_SIZE - 1];
717b5aad2   wdenk   Initial revision
42
  #endif
12e431b27   Simon Glass   dm: serial: Add d...
43
44
45
46
47
48
49
50
  /**
   * struct ns16550_platdata - information about a NS16550 port
   *
   * @base:		Base register address
   * @reg_shift:		Shift size of registers (0=byte, 1=16bit, 2=32bit...)
   * @clock:		UART base clock speed in Hz
   */
  struct ns16550_platdata {
167efe01b   Simon Glass   dm: ns16550: Use ...
51
  	unsigned long base;
12e431b27   Simon Glass   dm: serial: Add d...
52
53
  	int reg_shift;
  	int clock;
59b35ddd2   Michal Simek   dm: ns16550: Add ...
54
  	int reg_offset;
65f83802b   Marek Vasut   serial: 16550: Ad...
55
  	u32 fcr;
12e431b27   Simon Glass   dm: serial: Add d...
56
57
58
  };
  
  struct udevice;
453c0d755   Detlev Zundel   include/ns16550.h...
59
60
61
62
63
64
65
66
67
  struct NS16550 {
  	UART_REG(rbr);		/* 0 */
  	UART_REG(ier);		/* 1 */
  	UART_REG(fcr);		/* 2 */
  	UART_REG(lcr);		/* 3 */
  	UART_REG(mcr);		/* 4 */
  	UART_REG(lsr);		/* 5 */
  	UART_REG(msr);		/* 6 */
  	UART_REG(spr);		/* 7 */
99b603e71   Mikhail Kshevetskiy   serial/ns16550: n...
68
69
70
71
72
73
74
75
  #ifdef CONFIG_SOC_DA8XX
  	UART_REG(reg8);		/* 8 */
  	UART_REG(reg9);		/* 9 */
  	UART_REG(revid1);	/* A */
  	UART_REG(revid2);	/* B */
  	UART_REG(pwr_mgmt);	/* C */
  	UART_REG(mdr1);		/* D */
  #else
453c0d755   Detlev Zundel   include/ns16550.h...
76
77
78
79
80
81
82
83
84
85
  	UART_REG(mdr1);		/* 8 */
  	UART_REG(reg9);		/* 9 */
  	UART_REG(regA);		/* A */
  	UART_REG(regB);		/* B */
  	UART_REG(regC);		/* C */
  	UART_REG(regD);		/* D */
  	UART_REG(regE);		/* E */
  	UART_REG(uasr);		/* F */
  	UART_REG(scr);		/* 10*/
  	UART_REG(ssr);		/* 11*/
99b603e71   Mikhail Kshevetskiy   serial/ns16550: n...
86
  #endif
12e431b27   Simon Glass   dm: serial: Add d...
87
88
89
  #ifdef CONFIG_DM_SERIAL
  	struct ns16550_platdata *plat;
  #endif
453c0d755   Detlev Zundel   include/ns16550.h...
90
  };
717b5aad2   wdenk   Initial revision
91
92
93
94
  #define thr rbr
  #define iir fcr
  #define dll rbr
  #define dlm ier
f8df9d0d1   Simon Glass   NS16550: trivial ...
95
  typedef struct NS16550 *NS16550_t;
717b5aad2   wdenk   Initial revision
96

200779e3e   Detlev Zundel   Rename common ns1...
97
98
99
  /*
   * These are the definitions for the FIFO Control Register
   */
f8df9d0d1   Simon Glass   NS16550: trivial ...
100
  #define UART_FCR_FIFO_EN	0x01 /* Fifo enable */
200779e3e   Detlev Zundel   Rename common ns1...
101
102
103
104
105
106
107
108
109
110
111
  #define UART_FCR_CLEAR_RCVR	0x02 /* Clear the RCVR FIFO */
  #define UART_FCR_CLEAR_XMIT	0x04 /* Clear the XMIT FIFO */
  #define UART_FCR_DMA_SELECT	0x08 /* For DMA applications */
  #define UART_FCR_TRIGGER_MASK	0xC0 /* Mask for the FIFO trigger range */
  #define UART_FCR_TRIGGER_1	0x00 /* Mask for trigger set at 1 */
  #define UART_FCR_TRIGGER_4	0x40 /* Mask for trigger set at 4 */
  #define UART_FCR_TRIGGER_8	0x80 /* Mask for trigger set at 8 */
  #define UART_FCR_TRIGGER_14	0xC0 /* Mask for trigger set at 14 */
  
  #define UART_FCR_RXSR		0x02 /* Receiver soft reset */
  #define UART_FCR_TXSR		0x04 /* Transmitter soft reset */
0b060eefd   Marek Vasut   serial: 16550: Ad...
112
113
  /* Ingenic JZ47xx specific UART-enable bit. */
  #define UART_FCR_UME		0x10
17fa03267   Heiko Schocher   serial, ns16550: ...
114
115
116
117
  /* Clear & enable FIFOs */
  #define UART_FCR_DEFVAL (UART_FCR_FIFO_EN | \
  			UART_FCR_RXSR |	\
  			UART_FCR_TXSR)
200779e3e   Detlev Zundel   Rename common ns1...
118
119
120
121
122
123
124
125
  /*
   * These are the definitions for the Modem Control Register
   */
  #define UART_MCR_DTR	0x01		/* DTR   */
  #define UART_MCR_RTS	0x02		/* RTS   */
  #define UART_MCR_OUT1	0x04		/* Out 1 */
  #define UART_MCR_OUT2	0x08		/* Out 2 */
  #define UART_MCR_LOOP	0x10		/* Enable loopback test mode */
d57dee578   Karicheri, Muralidharan   serial: nsl16550:...
126
  #define UART_MCR_AFE	0x20		/* Enable auto-RTS/CTS */
200779e3e   Detlev Zundel   Rename common ns1...
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
  
  #define UART_MCR_DMA_EN	0x04
  #define UART_MCR_TX_DFR	0x08
  
  /*
   * These are the definitions for the Line Control Register
   *
   * Note: if the word length is 5 bits (UART_LCR_WLEN5), then setting
   * UART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
   */
  #define UART_LCR_WLS_MSK 0x03		/* character length select mask */
  #define UART_LCR_WLS_5	0x00		/* 5 bit character length */
  #define UART_LCR_WLS_6	0x01		/* 6 bit character length */
  #define UART_LCR_WLS_7	0x02		/* 7 bit character length */
  #define UART_LCR_WLS_8	0x03		/* 8 bit character length */
f8df9d0d1   Simon Glass   NS16550: trivial ...
142
  #define UART_LCR_STB	0x04		/* # stop Bits, off=1, on=1.5 or 2) */
200779e3e   Detlev Zundel   Rename common ns1...
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
  #define UART_LCR_PEN	0x08		/* Parity eneble */
  #define UART_LCR_EPS	0x10		/* Even Parity Select */
  #define UART_LCR_STKP	0x20		/* Stick Parity */
  #define UART_LCR_SBRK	0x40		/* Set Break */
  #define UART_LCR_BKSE	0x80		/* Bank select enable */
  #define UART_LCR_DLAB	0x80		/* Divisor latch access bit */
  
  /*
   * These are the definitions for the Line Status Register
   */
  #define UART_LSR_DR	0x01		/* Data ready */
  #define UART_LSR_OE	0x02		/* Overrun */
  #define UART_LSR_PE	0x04		/* Parity error */
  #define UART_LSR_FE	0x08		/* Framing error */
  #define UART_LSR_BI	0x10		/* Break */
  #define UART_LSR_THRE	0x20		/* Xmit holding register empty */
  #define UART_LSR_TEMT	0x40		/* Xmitter empty */
  #define UART_LSR_ERR	0x80		/* Error */
  
  #define UART_MSR_DCD	0x80		/* Data Carrier Detect */
  #define UART_MSR_RI	0x40		/* Ring Indicator */
  #define UART_MSR_DSR	0x20		/* Data Set Ready */
  #define UART_MSR_CTS	0x10		/* Clear to Send */
  #define UART_MSR_DDCD	0x08		/* Delta DCD */
  #define UART_MSR_TERI	0x04		/* Trailing edge ring indicator */
  #define UART_MSR_DDSR	0x02		/* Delta DSR */
  #define UART_MSR_DCTS	0x01		/* Delta CTS */
  
  /*
   * These are the definitions for the Interrupt Identification Register
   */
  #define UART_IIR_NO_INT	0x01	/* No interrupts pending */
  #define UART_IIR_ID	0x06	/* Mask for the interrupt ID */
  
  #define UART_IIR_MSI	0x00	/* Modem status interrupt */
  #define UART_IIR_THRI	0x02	/* Transmitter holding register empty */
  #define UART_IIR_RDI	0x04	/* Receiver data interrupt */
  #define UART_IIR_RLSI	0x06	/* Receiver line status interrupt */
  
  /*
   * These are the definitions for the Interrupt Enable Register
   */
  #define UART_IER_MSI	0x08	/* Enable Modem status interrupt */
  #define UART_IER_RLSI	0x04	/* Enable receiver line status interrupt */
  #define UART_IER_THRI	0x02	/* Enable Transmitter holding register int. */
  #define UART_IER_RDI	0x01	/* Enable receiver data interrupt */
717b5aad2   wdenk   Initial revision
189
  /* useful defaults for LCR */
200779e3e   Detlev Zundel   Rename common ns1...
190
  #define UART_LCR_8N1	0x03
717b5aad2   wdenk   Initial revision
191

f8df9d0d1   Simon Glass   NS16550: trivial ...
192
193
194
195
196
  void NS16550_init(NS16550_t com_port, int baud_divisor);
  void NS16550_putc(NS16550_t com_port, char c);
  char NS16550_getc(NS16550_t com_port);
  int NS16550_tstc(NS16550_t com_port);
  void NS16550_reinit(NS16550_t com_port, int baud_divisor);
fa54eb124   Simon Glass   dm: serial: Move ...
197
198
199
200
201
202
203
204
205
206
207
208
209
  
  /**
   * ns16550_calc_divisor() - calculate the divisor given clock and baud rate
   *
   * Given the UART input clock and required baudrate, calculate the divisor
   * that should be used.
   *
   * @port:	UART port
   * @clock:	UART input clock speed in Hz
   * @baudrate:	Required baud rate
   * @return baud rate divisor that should be used
   */
  int ns16550_calc_divisor(NS16550_t port, int clock, int baudrate);
12e431b27   Simon Glass   dm: serial: Add d...
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
  
  /**
   * ns16550_serial_ofdata_to_platdata() - convert DT to platform data
   *
   * Decode a device tree node for an ns16550 device. This includes the
   * register base address and register shift properties. The caller must set
   * up the clock frequency.
   *
   * @dev:	dev to decode platform data for
   * @return:	0 if OK, -EINVAL on error
   */
  int ns16550_serial_ofdata_to_platdata(struct udevice *dev);
  
  /**
   * ns16550_serial_probe() - probe a serial port
   *
   * This sets up the serial port ready for use, except for the baud rate
   * @return 0, or -ve on error
   */
  int ns16550_serial_probe(struct udevice *dev);
  
  /**
   * struct ns16550_serial_ops - ns16550 serial operations
   *
   * These should be used by the client driver for the driver's 'ops' member
   */
  extern const struct dm_serial_ops ns16550_serial_ops;