aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/io_16654.h
blob: a53abc9530ff51e4d56826b3b90080986038d1a6 (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
/************************************************************************
 *
 *	16654.H		Definitions for 16C654 UART used on EdgePorts
 *
 *	Copyright (C) 1998 Inside Out Networks, Inc.
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 *
 ************************************************************************/

#if !defined(_16654_H)
#define	_16654_H

/************************************************************************
 *
 *			D e f i n e s   /   T y p e d e f s
 *
 ************************************************************************/

	//
	// UART register numbers
	// Numbers 0-7 are passed to the Edgeport directly. Numbers 8 and
	// above are used internally to indicate that we must enable access
	// to them via LCR bit 0x80 or LCR = 0xBF.
	// The register number sent to the Edgeport is then (x & 0x7).
	//
	// Driver must not access registers that affect operation of the
	// the EdgePort firmware -- that includes THR, RHR, IER, FCR.


#define THR			0	// ! Transmit Holding Register (Write)
#define RDR			0	// ! Receive Holding Register (Read)
#define IER			1	// ! Interrupt Enable Register
#define FCR			2	// ! Fifo Control Register (Write)
#define ISR			2	// Interrupt Status Register (Read)
#define LCR			3	// Line Control Register
#define MCR			4	// Modem Control Register
#define LSR			5	// Line Status Register
#define MSR			6	// Modem Status Register
#define SPR			7	// ScratchPad Register
#define DLL			8	// Bank2[ 0 ] Divisor Latch LSB
#define DLM			9	// Bank2[ 1 ] Divisor Latch MSB
#define EFR			10	// Bank2[ 2 ] Extended Function Register
//efine unused			11	// Bank2[ 3 ]
#define XON1			12	// Bank2[ 4 ] Xon-1
#define XON2			13	// Bank2[ 5 ] Xon-2
#define XOFF1			14	// Bank2[ 6 ] Xoff-1
#define XOFF2			15	// Bank2[ 7 ] Xoff-2

#define	NUM_16654_REGS		16

#define IS_REG_2ND_BANK(x)	((x) >= 8)

	//
	// Bit definitions for each register
	//

#define IER_RX			0x01	// Enable receive interrupt
#define IER_TX			0x02	// Enable transmit interrupt
#define IER_RXS			0x04	// Enable receive status interrupt
#define IER_MDM			0x08	// Enable modem status interrupt
#define IER_SLEEP		0x10	// Enable sleep mode
#define IER_XOFF		0x20	// Enable s/w flow control (XOFF) interrupt
#define IER_RTS			0x40	// Enable RTS interrupt
#define IER_CTS			0x80	// Enable CTS interrupt
#define IER_ENABLE_ALL		0xFF	// Enable all ints


#define FCR_FIFO_EN		0x01	// Enable FIFOs
#define FCR_RXCLR		0x02	// Reset Rx FIFO
#define FCR_TXCLR		0x04	// Reset Tx FIFO
#define FCR_DMA_BLK		0x08	// Enable DMA block mode
#define FCR_TX_LEVEL_MASK	0x30	// Mask for Tx FIFO Level
#define FCR_TX_LEVEL_8		0x00	// Tx FIFO Level =  8 bytes
#define FCR_TX_LEVEL_16		0x10	// Tx FIFO Level = 16 bytes
#define FCR_TX_LEVEL_32		0x20	// Tx FIFO Level = 32 bytes
#define FCR_TX_LEVEL_56		0x30	// Tx FIFO Level = 56 bytes
#define FCR_RX_LEVEL_MASK	0xC0	// Mask for Rx FIFO Level
#define FCR_RX_LEVEL_8		0x00	// Rx FIFO Level =  8 bytes
#define FCR_RX_LEVEL_16		0x40	// Rx FIFO Level = 16 bytes
#define FCR_RX_LEVEL_56		0x80	// Rx FIFO Level = 56 bytes
#define FCR_RX_LEVEL_60		0xC0	// Rx FIFO Level = 60 bytes


#define ISR_INT_MDM_STATUS	0x00	// Modem status int pending
#define ISR_INT_NONE		0x01	// No interrupt pending
#define ISR_INT_TXRDY		0x02	// Tx ready int pending
#define ISR_INT_RXRDY		0x04	// Rx ready int pending
#define ISR_INT_LINE_STATUS	0x06	// Line status int pending
#define ISR_INT_RX_TIMEOUT	0x0C	// Rx timeout int pending
#define ISR_INT_RX_XOFF		0x10	// Rx Xoff int pending
#define ISR_INT_RTS_CTS		0x20	// RTS/CTS change int pending
#define ISR_FIFO_ENABLED	0xC0	// Bits set if FIFOs enabled
#define ISR_INT_BITS_MASK	0x3E	// Mask to isolate valid int causes


#define LCR_BITS_5		0x00	// 5 bits/char
#define LCR_BITS_6		0x01	// 6 bits/char
#define LCR_BITS_7		0x02	// 7 bits/char
#define LCR_BITS_8		0x03	// 8 bits/char
#define LCR_BITS_MASK		0x03	// Mask for bits/char field

#define LCR_STOP_1		0x00	// 1 stop bit
#define LCR_STOP_1_5		0x04	// 1.5 stop bits (if 5   bits/char)
#define LCR_STOP_2		0x04	// 2 stop bits   (if 6-8 bits/char)
#define LCR_STOP_MASK		0x04	// Mask for stop bits field

#define LCR_PAR_NONE		0x00	// No parity
#define LCR_PAR_ODD		0x08	// Odd parity
#define LCR_PAR_EVEN		0x18	// Even parity
#define LCR_PAR_MARK		0x28	// Force parity bit to 1
#define LCR_PAR_SPACE		0x38	// Force parity bit to 0
#define LCR_PAR_MASK		0x38	// Mask for parity field

#define LCR_SET_BREAK		0x40	// Set Break condition
#define LCR_DL_ENABLE		0x80	// Enable access to divisor latch

#define LCR_ACCESS_EFR		0xBF	// Load this value to access DLL,DLM,
					// and also the '654-only registers
					// EFR, XON1, XON2, XOFF1, XOFF2


#define MCR_DTR			0x01	// Assert DTR
#define MCR_RTS			0x02	// Assert RTS
#define MCR_OUT1		0x04	// Loopback only: Sets state of RI
#define MCR_MASTER_IE		0x08	// Enable interrupt outputs
#define MCR_LOOPBACK		0x10	// Set internal (digital) loopback mode
#define MCR_XON_ANY		0x20	// Enable any char to exit XOFF mode
#define MCR_IR_ENABLE		0x40	// Enable IrDA functions
#define MCR_BRG_DIV_4		0x80	// Divide baud rate clk by /4 instead of /1


#define LSR_RX_AVAIL		0x01	// Rx data available
#define LSR_OVER_ERR		0x02	// Rx overrun
#define LSR_PAR_ERR		0x04	// Rx parity error
#define LSR_FRM_ERR		0x08	// Rx framing error
#define LSR_BREAK		0x10	// Rx break condition detected
#define LSR_TX_EMPTY		0x20	// Tx Fifo empty
#define LSR_TX_ALL_EMPTY	0x40	// Tx Fifo and shift register empty
#define LSR_FIFO_ERR		0x80	// Rx Fifo contains at least 1 erred char


#define EDGEPORT_MSR_DELTA_CTS	0x01	// CTS changed from last read
#define EDGEPORT_MSR_DELTA_DSR	0x02	// DSR changed from last read
#define EDGEPORT_MSR_DELTA_RI	0x04	// RI  changed from 0 -> 1
#define EDGEPORT_MSR_DELTA_CD	0x08	// CD  changed from last read
#define EDGEPORT_MSR_CTS	0x10	// Current state of CTS
#define EDGEPORT_MSR_DSR	0x20	// Current state of DSR
#define EDGEPORT_MSR_RI		0x40	// Current state of RI
#define EDGEPORT_MSR_CD		0x80	// Current state of CD



					//	Tx		Rx
					//-------------------------------
#define EFR_SWFC_NONE		0x00	//	None		None
#define EFR_SWFC_RX1		0x02 	//	None		XOFF1
#define EFR_SWFC_RX2		0x01 	//	None		XOFF2
#define EFR_SWFC_RX12		0x03 	//	None		XOFF1 & XOFF2
#define EFR_SWFC_TX1		0x08 	//	XOFF1		None
#define EFR_SWFC_TX1_RX1	0x0a 	//	XOFF1		XOFF1
#define EFR_SWFC_TX1_RX2	0x09 	//	XOFF1		XOFF2
#define EFR_SWFC_TX1_RX12	0x0b 	//	XOFF1		XOFF1 & XOFF2
#define EFR_SWFC_TX2		0x04 	//	XOFF2		None
#define EFR_SWFC_TX2_RX1	0x06 	//	XOFF2		XOFF1
#define EFR_SWFC_TX2_RX2	0x05 	//	XOFF2		XOFF2
#define EFR_SWFC_TX2_RX12	0x07 	//	XOFF2		XOFF1 & XOFF2
#define EFR_SWFC_TX12		0x0c 	//	XOFF1 & XOFF2	None
#define EFR_SWFC_TX12_RX1	0x0e 	//	XOFF1 & XOFF2	XOFF1
#define EFR_SWFC_TX12_RX2	0x0d 	//	XOFF1 & XOFF2	XOFF2
#define EFR_SWFC_TX12_RX12	0x0f 	//	XOFF1 & XOFF2	XOFF1 & XOFF2

#define EFR_TX_FC_MASK		0x0c	// Mask to isolate Rx flow control
#define EFR_TX_FC_NONE		0x00	// No Tx Xon/Xoff flow control
#define EFR_TX_FC_X1		0x08	// Transmit Xon1/Xoff1
#define EFR_TX_FC_X2		0x04	// Transmit Xon2/Xoff2
#define EFR_TX_FC_X1_2		0x0c	// Transmit Xon1&2/Xoff1&2

#define EFR_RX_FC_MASK		0x03	// Mask to isolate Rx flow control
#define EFR_RX_FC_NONE		0x00	// No Rx Xon/Xoff flow control
#define EFR_RX_FC_X1		0x02	// Receiver compares Xon1/Xoff1
#define EFR_RX_FC_X2		0x01	// Receiver compares Xon2/Xoff2
#define EFR_RX_FC_X1_2		0x03	// Receiver compares Xon1&2/Xoff1&2


#define EFR_SWFC_MASK		0x0F	// Mask for software flow control field
#define EFR_ENABLE_16654	0x10	// Enable 16C654 features
#define EFR_SPEC_DETECT		0x20	// Enable special character detect interrupt
#define EFR_AUTO_RTS		0x40	// Use RTS for Rx flow control
#define EFR_AUTO_CTS		0x80	// Use CTS for Tx flow control

#endif	// if !defined(_16654_H)