18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
28c2ecf20Sopenharmony_ci/************************************************************************
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci *	16654.H		Definitions for 16C654 UART used on EdgePorts
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci *	Copyright (C) 1998 Inside Out Networks, Inc.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci ************************************************************************/
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#if !defined(_16654_H)
118c2ecf20Sopenharmony_ci#define	_16654_H
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/************************************************************************
148c2ecf20Sopenharmony_ci *
158c2ecf20Sopenharmony_ci *			D e f i n e s   /   T y p e d e f s
168c2ecf20Sopenharmony_ci *
178c2ecf20Sopenharmony_ci ************************************************************************/
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	//
208c2ecf20Sopenharmony_ci	// UART register numbers
218c2ecf20Sopenharmony_ci	// Numbers 0-7 are passed to the Edgeport directly. Numbers 8 and
228c2ecf20Sopenharmony_ci	// above are used internally to indicate that we must enable access
238c2ecf20Sopenharmony_ci	// to them via LCR bit 0x80 or LCR = 0xBF.
248c2ecf20Sopenharmony_ci	// The register number sent to the Edgeport is then (x & 0x7).
258c2ecf20Sopenharmony_ci	//
268c2ecf20Sopenharmony_ci	// Driver must not access registers that affect operation of the
278c2ecf20Sopenharmony_ci	// the EdgePort firmware -- that includes THR, RHR, IER, FCR.
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#define THR			0	// ! Transmit Holding Register (Write)
318c2ecf20Sopenharmony_ci#define RDR			0	// ! Receive Holding Register (Read)
328c2ecf20Sopenharmony_ci#define IER			1	// ! Interrupt Enable Register
338c2ecf20Sopenharmony_ci#define FCR			2	// ! Fifo Control Register (Write)
348c2ecf20Sopenharmony_ci#define ISR			2	// Interrupt Status Register (Read)
358c2ecf20Sopenharmony_ci#define LCR			3	// Line Control Register
368c2ecf20Sopenharmony_ci#define MCR			4	// Modem Control Register
378c2ecf20Sopenharmony_ci#define LSR			5	// Line Status Register
388c2ecf20Sopenharmony_ci#define MSR			6	// Modem Status Register
398c2ecf20Sopenharmony_ci#define SPR			7	// ScratchPad Register
408c2ecf20Sopenharmony_ci#define DLL			8	// Bank2[ 0 ] Divisor Latch LSB
418c2ecf20Sopenharmony_ci#define DLM			9	// Bank2[ 1 ] Divisor Latch MSB
428c2ecf20Sopenharmony_ci#define EFR			10	// Bank2[ 2 ] Extended Function Register
438c2ecf20Sopenharmony_ci//efine unused			11	// Bank2[ 3 ]
448c2ecf20Sopenharmony_ci#define XON1			12	// Bank2[ 4 ] Xon-1
458c2ecf20Sopenharmony_ci#define XON2			13	// Bank2[ 5 ] Xon-2
468c2ecf20Sopenharmony_ci#define XOFF1			14	// Bank2[ 6 ] Xoff-1
478c2ecf20Sopenharmony_ci#define XOFF2			15	// Bank2[ 7 ] Xoff-2
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#define	NUM_16654_REGS		16
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#define IS_REG_2ND_BANK(x)	((x) >= 8)
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	//
548c2ecf20Sopenharmony_ci	// Bit definitions for each register
558c2ecf20Sopenharmony_ci	//
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define IER_RX			0x01	// Enable receive interrupt
588c2ecf20Sopenharmony_ci#define IER_TX			0x02	// Enable transmit interrupt
598c2ecf20Sopenharmony_ci#define IER_RXS			0x04	// Enable receive status interrupt
608c2ecf20Sopenharmony_ci#define IER_MDM			0x08	// Enable modem status interrupt
618c2ecf20Sopenharmony_ci#define IER_SLEEP		0x10	// Enable sleep mode
628c2ecf20Sopenharmony_ci#define IER_XOFF		0x20	// Enable s/w flow control (XOFF) interrupt
638c2ecf20Sopenharmony_ci#define IER_RTS			0x40	// Enable RTS interrupt
648c2ecf20Sopenharmony_ci#define IER_CTS			0x80	// Enable CTS interrupt
658c2ecf20Sopenharmony_ci#define IER_ENABLE_ALL		0xFF	// Enable all ints
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#define FCR_FIFO_EN		0x01	// Enable FIFOs
698c2ecf20Sopenharmony_ci#define FCR_RXCLR		0x02	// Reset Rx FIFO
708c2ecf20Sopenharmony_ci#define FCR_TXCLR		0x04	// Reset Tx FIFO
718c2ecf20Sopenharmony_ci#define FCR_DMA_BLK		0x08	// Enable DMA block mode
728c2ecf20Sopenharmony_ci#define FCR_TX_LEVEL_MASK	0x30	// Mask for Tx FIFO Level
738c2ecf20Sopenharmony_ci#define FCR_TX_LEVEL_8		0x00	// Tx FIFO Level =  8 bytes
748c2ecf20Sopenharmony_ci#define FCR_TX_LEVEL_16		0x10	// Tx FIFO Level = 16 bytes
758c2ecf20Sopenharmony_ci#define FCR_TX_LEVEL_32		0x20	// Tx FIFO Level = 32 bytes
768c2ecf20Sopenharmony_ci#define FCR_TX_LEVEL_56		0x30	// Tx FIFO Level = 56 bytes
778c2ecf20Sopenharmony_ci#define FCR_RX_LEVEL_MASK	0xC0	// Mask for Rx FIFO Level
788c2ecf20Sopenharmony_ci#define FCR_RX_LEVEL_8		0x00	// Rx FIFO Level =  8 bytes
798c2ecf20Sopenharmony_ci#define FCR_RX_LEVEL_16		0x40	// Rx FIFO Level = 16 bytes
808c2ecf20Sopenharmony_ci#define FCR_RX_LEVEL_56		0x80	// Rx FIFO Level = 56 bytes
818c2ecf20Sopenharmony_ci#define FCR_RX_LEVEL_60		0xC0	// Rx FIFO Level = 60 bytes
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci#define ISR_INT_MDM_STATUS	0x00	// Modem status int pending
858c2ecf20Sopenharmony_ci#define ISR_INT_NONE		0x01	// No interrupt pending
868c2ecf20Sopenharmony_ci#define ISR_INT_TXRDY		0x02	// Tx ready int pending
878c2ecf20Sopenharmony_ci#define ISR_INT_RXRDY		0x04	// Rx ready int pending
888c2ecf20Sopenharmony_ci#define ISR_INT_LINE_STATUS	0x06	// Line status int pending
898c2ecf20Sopenharmony_ci#define ISR_INT_RX_TIMEOUT	0x0C	// Rx timeout int pending
908c2ecf20Sopenharmony_ci#define ISR_INT_RX_XOFF		0x10	// Rx Xoff int pending
918c2ecf20Sopenharmony_ci#define ISR_INT_RTS_CTS		0x20	// RTS/CTS change int pending
928c2ecf20Sopenharmony_ci#define ISR_FIFO_ENABLED	0xC0	// Bits set if FIFOs enabled
938c2ecf20Sopenharmony_ci#define ISR_INT_BITS_MASK	0x3E	// Mask to isolate valid int causes
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci#define LCR_BITS_5		0x00	// 5 bits/char
978c2ecf20Sopenharmony_ci#define LCR_BITS_6		0x01	// 6 bits/char
988c2ecf20Sopenharmony_ci#define LCR_BITS_7		0x02	// 7 bits/char
998c2ecf20Sopenharmony_ci#define LCR_BITS_8		0x03	// 8 bits/char
1008c2ecf20Sopenharmony_ci#define LCR_BITS_MASK		0x03	// Mask for bits/char field
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#define LCR_STOP_1		0x00	// 1 stop bit
1038c2ecf20Sopenharmony_ci#define LCR_STOP_1_5		0x04	// 1.5 stop bits (if 5   bits/char)
1048c2ecf20Sopenharmony_ci#define LCR_STOP_2		0x04	// 2 stop bits   (if 6-8 bits/char)
1058c2ecf20Sopenharmony_ci#define LCR_STOP_MASK		0x04	// Mask for stop bits field
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci#define LCR_PAR_NONE		0x00	// No parity
1088c2ecf20Sopenharmony_ci#define LCR_PAR_ODD		0x08	// Odd parity
1098c2ecf20Sopenharmony_ci#define LCR_PAR_EVEN		0x18	// Even parity
1108c2ecf20Sopenharmony_ci#define LCR_PAR_MARK		0x28	// Force parity bit to 1
1118c2ecf20Sopenharmony_ci#define LCR_PAR_SPACE		0x38	// Force parity bit to 0
1128c2ecf20Sopenharmony_ci#define LCR_PAR_MASK		0x38	// Mask for parity field
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci#define LCR_SET_BREAK		0x40	// Set Break condition
1158c2ecf20Sopenharmony_ci#define LCR_DL_ENABLE		0x80	// Enable access to divisor latch
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci#define LCR_ACCESS_EFR		0xBF	// Load this value to access DLL,DLM,
1188c2ecf20Sopenharmony_ci					// and also the '654-only registers
1198c2ecf20Sopenharmony_ci					// EFR, XON1, XON2, XOFF1, XOFF2
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci#define MCR_DTR			0x01	// Assert DTR
1238c2ecf20Sopenharmony_ci#define MCR_RTS			0x02	// Assert RTS
1248c2ecf20Sopenharmony_ci#define MCR_OUT1		0x04	// Loopback only: Sets state of RI
1258c2ecf20Sopenharmony_ci#define MCR_MASTER_IE		0x08	// Enable interrupt outputs
1268c2ecf20Sopenharmony_ci#define MCR_LOOPBACK		0x10	// Set internal (digital) loopback mode
1278c2ecf20Sopenharmony_ci#define MCR_XON_ANY		0x20	// Enable any char to exit XOFF mode
1288c2ecf20Sopenharmony_ci#define MCR_IR_ENABLE		0x40	// Enable IrDA functions
1298c2ecf20Sopenharmony_ci#define MCR_BRG_DIV_4		0x80	// Divide baud rate clk by /4 instead of /1
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci#define LSR_RX_AVAIL		0x01	// Rx data available
1338c2ecf20Sopenharmony_ci#define LSR_OVER_ERR		0x02	// Rx overrun
1348c2ecf20Sopenharmony_ci#define LSR_PAR_ERR		0x04	// Rx parity error
1358c2ecf20Sopenharmony_ci#define LSR_FRM_ERR		0x08	// Rx framing error
1368c2ecf20Sopenharmony_ci#define LSR_BREAK		0x10	// Rx break condition detected
1378c2ecf20Sopenharmony_ci#define LSR_TX_EMPTY		0x20	// Tx Fifo empty
1388c2ecf20Sopenharmony_ci#define LSR_TX_ALL_EMPTY	0x40	// Tx Fifo and shift register empty
1398c2ecf20Sopenharmony_ci#define LSR_FIFO_ERR		0x80	// Rx Fifo contains at least 1 erred char
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_DELTA_CTS	0x01	// CTS changed from last read
1438c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_DELTA_DSR	0x02	// DSR changed from last read
1448c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_DELTA_RI	0x04	// RI  changed from 0 -> 1
1458c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_DELTA_CD	0x08	// CD  changed from last read
1468c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_CTS	0x10	// Current state of CTS
1478c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_DSR	0x20	// Current state of DSR
1488c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_RI		0x40	// Current state of RI
1498c2ecf20Sopenharmony_ci#define EDGEPORT_MSR_CD		0x80	// Current state of CD
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci					//	Tx		Rx
1548c2ecf20Sopenharmony_ci					//-------------------------------
1558c2ecf20Sopenharmony_ci#define EFR_SWFC_NONE		0x00	//	None		None
1568c2ecf20Sopenharmony_ci#define EFR_SWFC_RX1		0x02 	//	None		XOFF1
1578c2ecf20Sopenharmony_ci#define EFR_SWFC_RX2		0x01 	//	None		XOFF2
1588c2ecf20Sopenharmony_ci#define EFR_SWFC_RX12		0x03 	//	None		XOFF1 & XOFF2
1598c2ecf20Sopenharmony_ci#define EFR_SWFC_TX1		0x08 	//	XOFF1		None
1608c2ecf20Sopenharmony_ci#define EFR_SWFC_TX1_RX1	0x0a 	//	XOFF1		XOFF1
1618c2ecf20Sopenharmony_ci#define EFR_SWFC_TX1_RX2	0x09 	//	XOFF1		XOFF2
1628c2ecf20Sopenharmony_ci#define EFR_SWFC_TX1_RX12	0x0b 	//	XOFF1		XOFF1 & XOFF2
1638c2ecf20Sopenharmony_ci#define EFR_SWFC_TX2		0x04 	//	XOFF2		None
1648c2ecf20Sopenharmony_ci#define EFR_SWFC_TX2_RX1	0x06 	//	XOFF2		XOFF1
1658c2ecf20Sopenharmony_ci#define EFR_SWFC_TX2_RX2	0x05 	//	XOFF2		XOFF2
1668c2ecf20Sopenharmony_ci#define EFR_SWFC_TX2_RX12	0x07 	//	XOFF2		XOFF1 & XOFF2
1678c2ecf20Sopenharmony_ci#define EFR_SWFC_TX12		0x0c 	//	XOFF1 & XOFF2	None
1688c2ecf20Sopenharmony_ci#define EFR_SWFC_TX12_RX1	0x0e 	//	XOFF1 & XOFF2	XOFF1
1698c2ecf20Sopenharmony_ci#define EFR_SWFC_TX12_RX2	0x0d 	//	XOFF1 & XOFF2	XOFF2
1708c2ecf20Sopenharmony_ci#define EFR_SWFC_TX12_RX12	0x0f 	//	XOFF1 & XOFF2	XOFF1 & XOFF2
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci#define EFR_TX_FC_MASK		0x0c	// Mask to isolate Rx flow control
1738c2ecf20Sopenharmony_ci#define EFR_TX_FC_NONE		0x00	// No Tx Xon/Xoff flow control
1748c2ecf20Sopenharmony_ci#define EFR_TX_FC_X1		0x08	// Transmit Xon1/Xoff1
1758c2ecf20Sopenharmony_ci#define EFR_TX_FC_X2		0x04	// Transmit Xon2/Xoff2
1768c2ecf20Sopenharmony_ci#define EFR_TX_FC_X1_2		0x0c	// Transmit Xon1&2/Xoff1&2
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci#define EFR_RX_FC_MASK		0x03	// Mask to isolate Rx flow control
1798c2ecf20Sopenharmony_ci#define EFR_RX_FC_NONE		0x00	// No Rx Xon/Xoff flow control
1808c2ecf20Sopenharmony_ci#define EFR_RX_FC_X1		0x02	// Receiver compares Xon1/Xoff1
1818c2ecf20Sopenharmony_ci#define EFR_RX_FC_X2		0x01	// Receiver compares Xon2/Xoff2
1828c2ecf20Sopenharmony_ci#define EFR_RX_FC_X1_2		0x03	// Receiver compares Xon1&2/Xoff1&2
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci#define EFR_SWFC_MASK		0x0F	// Mask for software flow control field
1868c2ecf20Sopenharmony_ci#define EFR_ENABLE_16654	0x10	// Enable 16C654 features
1878c2ecf20Sopenharmony_ci#define EFR_SPEC_DETECT		0x20	// Enable special character detect interrupt
1888c2ecf20Sopenharmony_ci#define EFR_AUTO_RTS		0x40	// Use RTS for Rx flow control
1898c2ecf20Sopenharmony_ci#define EFR_AUTO_CTS		0x80	// Use CTS for Tx flow control
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci#endif	// if !defined(_16654_H)
1928c2ecf20Sopenharmony_ci
193