summaryrefslogtreecommitdiff
path: root/arch/arm/plat-mxc/include/mach/mxc_uart.h
blob: e96686d19b96f12cd281377b0ff938fca14642f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
/*
 * Copyright 2004-2012 Freescale Semiconductor, Inc.
 */

/*
 * The code contained herein is licensed under the GNU General Public
 * License. You may obtain a copy of the GNU General Public License
 * Version 2 or later at the following locations:
 *
 * http://www.opensource.org/licenses/gpl-license.html
 * http://www.gnu.org/copyleft/gpl.html
 */

/*!
 * @defgroup UART Universal Asynchronous Receiver Transmitter (UART) Driver
 */

/*!
 * @file arch-mxc/mxc_uart.h
 *
 * @brief This file contains the UART configuration structure definition.
 *
 *
 * @ingroup UART
 */

#ifndef __ASM_ARCH_MXC_UART_H__
#define __ASM_ARCH_MXC_UART_H__

#ifdef __KERNEL__

#include <linux/serial_core.h>

/*
 * The modes of the UART ports
 */
#define MODE_DTE                0
#define MODE_DCE                1
/*
 * Is the UART configured to be a IR port
 */
#define IRDA                    0
#define NO_IRDA                 1

/*!
 * This structure is used to store the the physical and virtual
 * addresses of the UART DMA receive buffer.
 */
typedef struct {
	/*!
	 * DMA Receive buffer virtual address
	 */
	char *rx_buf;
	/*!
	 * DMA Receive buffer physical address
	 */
	dma_addr_t rx_handle;
} mxc_uart_rxdmamap;

/*!
 * This structure is a way for the low level driver to define their own
 * \b uart_port structure. This structure includes the core \b uart_port
 * structure that is provided by Linux as an element and has other
 * elements that are specifically required by this low-level driver.
 */
typedef struct {
	/*!
	 * The port structure holds all the information about the UART
	 * port like base address, and so on.
	 */
	struct uart_port port;
	/*!
	 * Flag to determine if the interrupts are muxed.
	 */
	int ints_muxed;
	/*!
	 * Array that holds the receive and master interrupt numbers
	 * when the interrupts are not muxed.
	 */
	int irqs[2];
	/*!
	 * Flag to determine the DTE/DCE mode.
	 */
	int mode;
	/*!
	 * Flag to hold the IR mode of the port.
	 */
	int ir_mode;
	/*!
	 * Flag to enable/disable the UART port.
	 */
	int enabled;
	/*!
	 * Flag to indicate if we wish to use hardware-driven hardware
	 * flow control.
	 */
	int hardware_flow;
	/*!
	 * Holds the threshold value at which the CTS line is deasserted in
	 * case we use hardware-driven hardware flow control.
	 */
	unsigned int cts_threshold;
	/*!
	 * Flag to enable/disable DMA data transfer.
	 */
	int dma_enabled;
	/*!
	 * Holds the DMA receive buffer size.
	 */
	int dma_rxbuf_size;
	/*!
	 * DMA Receive buffers information
	 */
	mxc_uart_rxdmamap *rx_dmamap;
	/*!
	 * DMA RX buffer id
	 */
	int dma_rxbuf_id;
	/*!
	 * DMA Transmit buffer virtual address
	 */
	char *tx_buf;
	/*!
	 * DMA Transmit buffer physical address
	 */
	dma_addr_t tx_handle;
	/*!
	 * Holds the RxFIFO threshold value.
	 */
	unsigned int rx_threshold;
	/*!
	 * Holds the TxFIFO threshold value.
	 */
	unsigned int tx_threshold;
	/*!
	 * Information whether this is a shared UART
	 */
	unsigned int shared;
	/*!
	 * Clock id for UART clock
	 */
	struct clk *clk;
	/*!
	 * Information whether RXDMUXSEL must be set or not for IR port
	 */
	int rxd_mux;
	int ir_tx_inv;
	int ir_rx_inv;
} uart_mxc_port;

/* Address offsets of the UART registers */
#ifdef CONFIG_ARCH_MVF
/* All uart module registers for MVF is 8-bit width */
#define MXC_UARTBDH		0x00 /* Baud rate reg: high */
#define MXC_UARTBDL		0x01 /* Baud rate reg: low */
#define MXC_UARTCR1		0x02 /* Control reg 1 */
#define MXC_UARTCR2		0x03 /* Control reg 2 */
#define MXC_UARTSR1		0x04 /* Status reg 1 */
#define MXC_UARTSR2		0x05 /* Status reg 2 */
#define MXC_UARTCR3		0x06 /* Control reg 3 */
#define MXC_UARTDR		0x07 /* Data reg */
#define MXC_UARTMAR1		0x08 /* Match address reg 1 */
#define MXC_UARTMAR2		0x09 /* Match address reg 2 */
#define MXC_UARTCR4		0x0A /* Control reg 4 */
#define MXC_UARTCR5		0x0B /* Control reg 5 */
#define MXC_UARTEDR		0x0C /* Extended data reg */
#define MXC_UARTMODEM		0x0D /* Modem reg */
#define MXC_UARTIR		0x0E /* Infrared reg */
#define MXC_UARTPFIFO		0x10 /* FIFO parameter reg */
#define MXC_UARTCFIFO		0x11 /* FIFO control reg */
#define MXC_UARTSFIFO		0x12 /* FIFO status reg */
#define MXC_UARTTWFIFO		0x13 /* FIFO transmit watermark reg */
#define MXC_UARTTCFIFO		0x14 /* FIFO transmit count reg */
#define MXC_UARTRWFIFO		0x15 /* FIFO receive watermark reg */
#define MXC_UARTRCFIFO		0x16 /* FIFO receive count reg */
#define MXC_UARTC7816		0x18 /* 7816 control reg */
#define MXC_UARTIE7816		0x19 /* 7816 interrupt enable reg */
#define MXC_UARTIS7816		0x1A /* 7816 interrupt status reg */
#define MXC_UARTWP7816T0	0x1B /* 7816 wait parameter reg */
#define MXC_UARTWP7816T1	0x1B /* 7816 wait parameter reg */
#define MXC_UARTWN7816		0x1C /* 7816 wait N reg */
#define MXC_UARTWF7816		0x1D /* 7816 wait FD reg */
#define MXC_UARTET7816		0x1E /* 7816 error threshold reg */
#define MXC_UARTTL7816		0x1F /* 7816 transmit length reg */
#define MXC_UARTCR6		0x21 /* CEA709.1-B contrl reg */
#define MXC_UARTPCTH		0x22 /* CEA709.1-B packet cycle counter high */
#define MXC_UARTPCTL		0x23 /* CEA709.1-B packet cycle counter low */
#define MXC_UARTB1T		0x24 /* CEA709.1-B beta 1 time */
#define MXC_UARTSDTH		0x25 /* CEA709.1-B secondary delay timer high */
#define MXC_UARTSDTL		0x26 /* CEA709.1-B secondary delay timer low */
#define MXC_UARTPRE		0x27 /* CEA709.1-B preamble */
#define MXC_UARTTPL		0x28 /* CEA709.1-B transmit packet length */
#define MXC_UARTIE		0x29 /* CEA709.1-B transmit interrupt enable */
#define MXC_UARTSR3		0x2B /* CEA709.1-B status reg */
#define MXC_UARTSR4		0x2C /* CEA709.1-B status reg */
#define MXC_UARTRPL		0x2D /* CEA709.1-B received packet length */
#define MXC_UARTRPREL		0x2E /* CEA709.1-B received preamble length */
#define MXC_UARTCPW		0x2F /* CEA709.1-B collision pulse width */
#define MXC_UARTRIDT		0x30 /* CEA709.1-B receive indeterminate time */
#define MXC_UARTTIDT		0x31 /* CEA709.1-B transmit indeterminate time*/

/* Bit definations of BDH */
#define MXC_UARTBDH_LBKDIE	0x80 /* LIN break detect interrupt enable */
#define MXC_UARTBDH_RXEDGIE	0x40 /* RxD input Active edge interrupt enable*/
#define MXC_UARTBDH_SBR_MASK	0x1f /* Uart baud rate high 5-bits */
/* Bit definations of CR1 */
#define MXC_UARTCR1_LOOPS	0x80 /* Loop mode select */
#define MXC_UARTCR1_RSRC	0x20 /* Receiver source select */
#define MXC_UARTCR1_M		0x10 /* 9-bit 8-bit mode select */
#define MXC_UARTCR1_WAKE	0x08 /* Receiver wakeup method */
#define MXC_UARTCR1_ILT		0x04 /* Idle line type */
#define MXC_UARTCR1_PE		0x02 /* Parity enable */
#define MXC_UARTCR1_PT		0x01 /* Parity type */
/* Bit definations of CR2 */
#define MXC_UARTCR2_TIE		0x80 /* Tx interrupt or DMA request enable */
#define MXC_UARTCR2_TCIE	0x40 /* Transmission complete int enable */
#define MXC_UARTCR2_RIE		0x20 /* Rx full int or DMA request enable */
#define MXC_UARTCR2_ILIE	0x10 /* Idle line interrupt enable */
#define MXC_UARTCR2_TE		0x08 /* Transmitter enable */
#define MXC_UARTCR2_RE		0x04 /* Receiver enable */
#define MXC_UARTCR2_RWU		0x02 /* Receiver wakeup control */
#define MXC_UARTCR2_SBK		0x01 /* Send break */
/* Bit definations of SR1 */
#define MXC_UARTSR1_TDRE	0x80 /* Tx data reg empty */
#define MXC_UARTSR1_TC		0x40 /* Transmit complete */
#define MXC_UARTSR1_RDRF	0x20 /* Rx data reg full */
#define MXC_UARTSR1_IDLE	0x10 /* Idle line flag */
#define MXC_UARTSR1_OR		0x08 /* Receiver overrun */
#define MXC_UARTSR1_NF		0x04 /* Noise flag */
#define MXC_UARTSR1_FE		0x02 /* Frame error */
#define MXC_UARTSR1_PE		0x01 /* Parity error */
/* Bit definations of SR2 */
#define MXC_UARTSR2_LBKDIF	0x80 /* LIN brk detect interrupt flag */
#define MXC_UARTSR2_RXEDGIF	0x40 /* RxD pin active edge interrupt flag */
#define MXC_UARTSR2_MSBF	0x20 /* MSB first */
#define MXC_UARTSR2_RXINV	0x10 /* Receive data inverted */
#define MXC_UARTSR2_RWUID	0x08 /* Receive wakeup idle detect */
#define MXC_UARTSR2_BRK13	0x04 /* Break transmit character length */
#define MXC_UARTSR2_LBKDE	0x02 /* LIN break detection enable */
#define MXC_UARTSR2_RAF		0x01 /* Receiver active flag */
/* Bit definations of CR3 */
#define MXC_UARTCR3_R8		0x80 /* Received bit8, for 9-bit data format */
#define MXC_UARTCR3_T8		0x40 /* transmit bit8, for 9-bit data format */
#define MXC_UARTCR3_TXDIR	0x20 /* Tx pin direction in single-wire mode */
#define MXC_UARTCR3_TXINV	0x10 /* Transmit data inversion */
#define MXC_UARTCR3_ORIE	0x08 /* Overrun error interrupt enable */
#define MXC_UARTCR3_NEIE	0x04 /* Noise error interrupt enable */
#define MXC_UARTCR3_FEIE	0x02 /* Framing error interrupt enable */
#define MXC_UARTCR3_PEIE	0x01 /* Parity errror interrupt enable */
/* Bit definations of CR4 */
#define MXC_UARTCR4_MAEN1	0x80 /* Match address mode enable 1 */
#define MXC_UARTCR4_MAEN2	0x40 /* Match address mode enable 2 */
#define MXC_UARTCR4_M10		0x20 /* 10-bit mode select */
#define MXC_UARTCR4_BRFA_MASK	0x1F /* Baud rate fine adjust */
#define MXC_UARTCR4_BRFA_OFF	0
/* Bit definations of CR5 */
#define MXC_UARTCR5_TDMAS	0x80 /* Transmitter DMA select */
#define MXC_UARTCR5_RDMAS	0x20 /* Receiver DMA select */
/* Bit definations of Modem */
#define MXC_UARTMODEM_RXRTSE	0x08 /* Enable receiver request-to-send */
#define MXC_UARTMODEM_TXRTSPOL	0x04 /* Select transmitter RTS polarity */
#define MXC_UARTMODEM_TXRTSE	0x02 /* Enable transmitter request-to-send */
#define MXC_UARTMODEM_TXCTSE	0x01 /* Enable transmitter CTS clear-to-send */
/* Bit definations of EDR */
#define MXC_UARTEDR_NOISY	0x80 /* Current dataword received with noise */
#define MXC_UARTEDR_PARITYE	0x40 /* Dataword received with parity error */
/* Bit definations of Infrared reg(IR) */
#define MXC_UARTIR_IREN		0x04 /* Infrared enable */
#define MXC_UARTIR_TNP_MASK	0x03 /* Transmitter narrow pluse */
#define MXC_UARTIR_TNP_OFF	0
/* Bit definations of FIFO parameter reg */
#define MXC_UARTPFIFO_TXFE	0x80 /* Transmit fifo enable */
#define MXC_UARTPFIFO_TXFIFOSIZE_MASK	0x7
#define MXC_UARTPFIFO_TXFIFOSIZE_OFF	4
#define MXC_UARTPFIFO_RXFE	0x08 /* Receiver fifo enable */
#define MXC_UARTPFIFO_RXFIFOSIZE_MASK	0x7
#define MXC_UARTPFIFO_RXFIFOSIZE_OFF	0
/* Bit definations of FIFO control reg */
#define MXC_UARTCFIFO_TXFLUSH	0x80 /* Transmit FIFO/buffer flush */
#define MXC_UARTCFIFO_RXFLUSH	0x40 /* Receive FIFO/buffer flush */
#define MXC_UARTCFIFO_RXOFE	0x04 /* Receive fifo overflow INT enable */
#define MXC_UARTCFIFO_TXOFE	0x02 /* Transmit fifo overflow INT enable */
#define MXC_UARTCFIFO_RXUFE	0x01 /* Receive fifo underflow INT enable */
/* Bit definations of FIFO status reg */
#define MXC_UARTSFIFO_TXEMPT	0x80 /* Transmit fifo/buffer empty */
#define MXC_UARTSFIFO_RXEMPT	0x40 /* Receive fifo/buffer empty */
#define MXC_UARTSFIFO_RXOF	0x04 /* Rx buffer overflow flag */
#define MXC_UARTSFIFO_TXOF	0x02 /* Tx buffer overflow flag */
#define MXC_UARTSFIFO_RXUF	0x01 /* Rx buffer underflow flag */

#else
#define MXC_UARTURXD            0x000	/* Receive reg */
#define MXC_UARTUTXD            0x040	/* Transmitter reg */
#define	MXC_UARTUCR1            0x080	/* Control reg 1 */
#define MXC_UARTUCR2            0x084	/* Control reg 2 */
#define MXC_UARTUCR3            0x088	/* Control reg 3 */
#define MXC_UARTUCR4            0x08C	/* Control reg 4 */
#define MXC_UARTUFCR            0x090	/* FIFO control reg */
#define MXC_UARTUSR1            0x094	/* Status reg 1 */
#define MXC_UARTUSR2            0x098	/* Status reg 2 */
#define MXC_UARTUESC            0x09C	/* Escape character reg */
#define MXC_UARTUTIM            0x0A0	/* Escape timer reg */
#define MXC_UARTUBIR            0x0A4	/* BRM incremental reg */
#define MXC_UARTUBMR            0x0A8	/* BRM modulator reg */
#define MXC_UARTUBRC            0x0AC	/* Baud rate count reg */
#define MXC_UARTONEMS           0x0B0	/* One millisecond reg */
#define MXC_UARTUTS             0x0B4	/* Test reg */
#define MXC_UARTUMCR            0x0B8	/* RS485 Mode control */
#endif

/* Bit definations of UCR1 */
#define MXC_UARTUCR1_ADEN       0x8000
#define MXC_UARTUCR1_ADBR       0x4000
#define MXC_UARTUCR1_TRDYEN     0x2000
#define MXC_UARTUCR1_IDEN       0x1000
#define MXC_UARTUCR1_RRDYEN     0x0200
#define MXC_UARTUCR1_RXDMAEN    0x0100
#define MXC_UARTUCR1_IREN       0x0080
#define MXC_UARTUCR1_TXMPTYEN   0x0040
#define MXC_UARTUCR1_RTSDEN     0x0020
#define MXC_UARTUCR1_SNDBRK     0x0010
#define MXC_UARTUCR1_TXDMAEN    0x0008
#define MXC_UARTUCR1_ATDMAEN    0x0004
#define MXC_UARTUCR1_DOZE       0x0002
#define MXC_UARTUCR1_UARTEN     0x0001

/* Bit definations of UCR2 */
#define MXC_UARTUCR2_ESCI       0x8000
#define MXC_UARTUCR2_IRTS       0x4000
#define MXC_UARTUCR2_CTSC       0x2000
#define MXC_UARTUCR2_CTS        0x1000
#define MXC_UARTUCR2_PREN       0x0100
#define MXC_UARTUCR2_PROE       0x0080
#define MXC_UARTUCR2_STPB       0x0040
#define MXC_UARTUCR2_WS         0x0020
#define MXC_UARTUCR2_RTSEN      0x0010
#define MXC_UARTUCR2_ATEN       0x0008
#define MXC_UARTUCR2_TXEN       0x0004
#define MXC_UARTUCR2_RXEN       0x0002
#define MXC_UARTUCR2_SRST       0x0001

/* Bit definations of UCR3 */
#define MXC_UARTUCR3_DTREN      0x2000
#define MXC_UARTUCR3_PARERREN   0x1000
#define MXC_UARTUCR3_FRAERREN   0x0800
#define MXC_UARTUCR3_DSR        0x0400
#define MXC_UARTUCR3_DCD        0x0200
#define MXC_UARTUCR3_RI         0x0100
#define MXC_UARTUCR3_RXDSEN     0x0040
#define MXC_UARTUCR3_AWAKEN     0x0010
#define MXC_UARTUCR3_DTRDEN     0x0008
#define MXC_UARTUCR3_RXDMUXSEL  0x0004
#define MXC_UARTUCR3_INVT       0x0002

/* Bit definations of UCR4 */
#define MXC_UARTUCR4_CTSTL_OFFSET       10
#define MXC_UARTUCR4_CTSTL_MASK         (0x3F << 10)
#define MXC_UARTUCR4_INVR               0x0200
#define MXC_UARTUCR4_ENIRI              0x0100
#define MXC_UARTUCR4_REF16              0x0040
#define MXC_UARTUCR4_IRSC               0x0020
#define MXC_UARTUCR4_TCEN               0x0008
#define MXC_UARTUCR4_OREN               0x0002
#define MXC_UARTUCR4_DREN               0x0001

/* Bit definations of UFCR */
#define MXC_UARTUFCR_RFDIV              0x0200	/* Ref freq div is set to 2 */
#define MXC_UARTUFCR_RFDIV_OFFSET       7
#define MXC_UARTUFCR_RFDIV_MASK         (0x7 << 7)
#define MXC_UARTUFCR_TXTL_OFFSET        10
#define MXC_UARTUFCR_DCEDTE             0x0040

/* Bit definations of URXD */
#define MXC_UARTURXD_ERR        0x4000
#define MXC_UARTURXD_OVRRUN     0x2000
#define MXC_UARTURXD_FRMERR     0x1000
#define MXC_UARTURXD_BRK        0x0800
#define MXC_UARTURXD_PRERR      0x0400

/* Bit definations of USR1 */
#define MXC_UARTUSR1_PARITYERR  0x8000
#define MXC_UARTUSR1_RTSS       0x4000
#define MXC_UARTUSR1_TRDY       0x2000
#define MXC_UARTUSR1_RTSD       0x1000
#define MXC_UARTUSR1_FRAMERR    0x0400
#define MXC_UARTUSR1_RRDY       0x0200
#define MXC_UARTUSR1_AGTIM      0x0100
#define MXC_UARTUSR1_DTRD       0x0080
#define MXC_UARTUSR1_AWAKE      0x0010

/* Bit definations of USR2 */
#define MXC_UARTUSR2_TXFE       0x4000
#define MXC_UARTUSR2_IDLE       0x1000
#define MXC_UARTUSR2_RIDELT     0x0400
#define MXC_UARTUSR2_RIIN       0x0200
#define MXC_UARTUSR2_DCDDELT    0x0040
#define MXC_UARTUSR2_DCDIN      0x0020
#define MXC_UARTUSR2_TXDC       0x0008
#define MXC_UARTUSR2_ORE        0x0002
#define MXC_UARTUSR2_RDR        0x0001
#define MXC_UARTUSR2_BRCD       0x0004

/* Bit definations of UTS */
#define MXC_UARTUTS_LOOP        0x1000

#endif				/* __KERNEL__ */

#endif				/* __ASM_ARCH_MXC_UART_H__ */