forked from mirrors/linux
		
	 b5199d4681
			
		
	
	
		b5199d4681
		
	
	
	
	
		
			
			Depending on the hardware, TX and RX FIFOs may be available. The RX FIFO can avoid receive overruns, especially when DMA transfers are not used to read data from the Receive Holding Register. For heavy system load, The CPU is likely not be able to fetch data fast enough from the RHR. In addition, the RX FIFO can supersede the DMA/PDC to control the RTS line when the Hardware Handshaking mode is enabled. Two thresholds are to be set for that purpose: - When the number of data in the RX FIFO crosses and becomes lower than or equal to the low threshold, the RTS line is set to low level: the remote peer is requested to send data. - When the number of data in the RX FIFO crosses and becomes greater than or equal to the high threshold, the RTS line is set to high level: the remote peer should stop sending new data. - low threshold <= high threshold Once these two thresholds are set properly, this new feature is enabled by setting the FIFO RTS Control bit of the FIFO Mode Register. FIFOs also introduce a new multiple data mode: the USART works either in multiple data mode or in single data (legacy) mode. If MODE9 bit is set into the Mode Register or if USMODE is set to either LIN_MASTER, LIN_SLAVE or LON_MODE, FIFOs operate in single data mode. Otherwise, they operate in multiple data mode. In this new multiple data mode, accesses to the Receive Holding Register or Transmit Holding Register slightly change. Since this driver implements neither the 9bit data feature (MODE9 bit set into the Mode Register) nor LIN modes, the USART works in multiple data mode whenever FIFOs are available and enabled. We also assume that data are 8bit wide. In single data mode, 32bit access CAN be used to read a single data from RHR or write a single data into THR. However in multiple data mode, a 32bit access to RHR now allows us to read four consecutive data from RX FIFO. Also a 32bit access to THR now allows to write four consecutive data into TX FIFO. So we MUST use 8bit access whenever only one data have to be read/written at a time. Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
		
			
				
	
	
		
			166 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * include/linux/atmel_serial.h
 | |
|  *
 | |
|  * Copyright (C) 2005 Ivan Kokshaysky
 | |
|  * Copyright (C) SAN People
 | |
|  *
 | |
|  * USART registers.
 | |
|  * Based on AT91RM9200 datasheet revision E.
 | |
|  *
 | |
|  * 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.
 | |
|  */
 | |
| 
 | |
| #ifndef ATMEL_SERIAL_H
 | |
| #define ATMEL_SERIAL_H
 | |
| 
 | |
| #define ATMEL_US_CR		0x00	/* Control Register */
 | |
| #define	ATMEL_US_RSTRX		BIT(2)	/* Reset Receiver */
 | |
| #define	ATMEL_US_RSTTX		BIT(3)	/* Reset Transmitter */
 | |
| #define	ATMEL_US_RXEN		BIT(4)	/* Receiver Enable */
 | |
| #define	ATMEL_US_RXDIS		BIT(5)	/* Receiver Disable */
 | |
| #define	ATMEL_US_TXEN		BIT(6)	/* Transmitter Enable */
 | |
| #define	ATMEL_US_TXDIS		BIT(7)	/* Transmitter Disable */
 | |
| #define	ATMEL_US_RSTSTA		BIT(8)	/* Reset Status Bits */
 | |
| #define	ATMEL_US_STTBRK		BIT(9)	/* Start Break */
 | |
| #define	ATMEL_US_STPBRK		BIT(10)	/* Stop Break */
 | |
| #define	ATMEL_US_STTTO		BIT(11)	/* Start Time-out */
 | |
| #define	ATMEL_US_SENDA		BIT(12)	/* Send Address */
 | |
| #define	ATMEL_US_RSTIT		BIT(13)	/* Reset Iterations */
 | |
| #define	ATMEL_US_RSTNACK	BIT(14)	/* Reset Non Acknowledge */
 | |
| #define	ATMEL_US_RETTO		BIT(15)	/* Rearm Time-out */
 | |
| #define	ATMEL_US_DTREN		BIT(16)	/* Data Terminal Ready Enable */
 | |
| #define	ATMEL_US_DTRDIS		BIT(17)	/* Data Terminal Ready Disable */
 | |
| #define	ATMEL_US_RTSEN		BIT(18)	/* Request To Send Enable */
 | |
| #define	ATMEL_US_RTSDIS		BIT(19)	/* Request To Send Disable */
 | |
| #define	ATMEL_US_TXFCLR		BIT(24)	/* Transmit FIFO Clear */
 | |
| #define	ATMEL_US_RXFCLR		BIT(25)	/* Receive FIFO Clear */
 | |
| #define	ATMEL_US_TXFLCLR	BIT(26)	/* Transmit FIFO Lock Clear */
 | |
| #define	ATMEL_US_FIFOEN		BIT(30)	/* FIFO enable */
 | |
| #define	ATMEL_US_FIFODIS	BIT(31)	/* FIFO disable */
 | |
| 
 | |
| #define ATMEL_US_MR		0x04	/* Mode Register */
 | |
| #define	ATMEL_US_USMODE		GENMASK(3, 0)	/* Mode of the USART */
 | |
| #define		ATMEL_US_USMODE_NORMAL		0
 | |
| #define		ATMEL_US_USMODE_RS485		1
 | |
| #define		ATMEL_US_USMODE_HWHS		2
 | |
| #define		ATMEL_US_USMODE_MODEM		3
 | |
| #define		ATMEL_US_USMODE_ISO7816_T0	4
 | |
| #define		ATMEL_US_USMODE_ISO7816_T1	6
 | |
| #define		ATMEL_US_USMODE_IRDA		8
 | |
| #define	ATMEL_US_USCLKS		GENMASK(5, 4)	/* Clock Selection */
 | |
| #define		ATMEL_US_USCLKS_MCK		(0 <<  4)
 | |
| #define		ATMEL_US_USCLKS_MCK_DIV8	(1 <<  4)
 | |
| #define		ATMEL_US_USCLKS_SCK		(3 <<  4)
 | |
| #define	ATMEL_US_CHRL		GENMASK(7, 6)	/* Character Length */
 | |
| #define		ATMEL_US_CHRL_5			(0 <<  6)
 | |
| #define		ATMEL_US_CHRL_6			(1 <<  6)
 | |
| #define		ATMEL_US_CHRL_7			(2 <<  6)
 | |
| #define		ATMEL_US_CHRL_8			(3 <<  6)
 | |
| #define	ATMEL_US_SYNC		BIT(8)		/* Synchronous Mode Select */
 | |
| #define	ATMEL_US_PAR		GENMASK(11, 9)	/* Parity Type */
 | |
| #define		ATMEL_US_PAR_EVEN		(0 <<  9)
 | |
| #define		ATMEL_US_PAR_ODD		(1 <<  9)
 | |
| #define		ATMEL_US_PAR_SPACE		(2 <<  9)
 | |
| #define		ATMEL_US_PAR_MARK		(3 <<  9)
 | |
| #define		ATMEL_US_PAR_NONE		(4 <<  9)
 | |
| #define		ATMEL_US_PAR_MULTI_DROP		(6 <<  9)
 | |
| #define	ATMEL_US_NBSTOP		GENMASK(13, 12)	/* Number of Stop Bits */
 | |
| #define		ATMEL_US_NBSTOP_1		(0 << 12)
 | |
| #define		ATMEL_US_NBSTOP_1_5		(1 << 12)
 | |
| #define		ATMEL_US_NBSTOP_2		(2 << 12)
 | |
| #define	ATMEL_US_CHMODE		GENMASK(15, 14)	/* Channel Mode */
 | |
| #define		ATMEL_US_CHMODE_NORMAL		(0 << 14)
 | |
| #define		ATMEL_US_CHMODE_ECHO		(1 << 14)
 | |
| #define		ATMEL_US_CHMODE_LOC_LOOP	(2 << 14)
 | |
| #define		ATMEL_US_CHMODE_REM_LOOP	(3 << 14)
 | |
| #define	ATMEL_US_MSBF		BIT(16)	/* Bit Order */
 | |
| #define	ATMEL_US_MODE9		BIT(17)	/* 9-bit Character Length */
 | |
| #define	ATMEL_US_CLKO		BIT(18)	/* Clock Output Select */
 | |
| #define	ATMEL_US_OVER		BIT(19)	/* Oversampling Mode */
 | |
| #define	ATMEL_US_INACK		BIT(20)	/* Inhibit Non Acknowledge */
 | |
| #define	ATMEL_US_DSNACK		BIT(21)	/* Disable Successive NACK */
 | |
| #define	ATMEL_US_MAX_ITER	GENMASK(26, 24)	/* Max Iterations */
 | |
| #define	ATMEL_US_FILTER		BIT(28)	/* Infrared Receive Line Filter */
 | |
| 
 | |
| #define ATMEL_US_IER		0x08	/* Interrupt Enable Register */
 | |
| #define	ATMEL_US_RXRDY		BIT(0)	/* Receiver Ready */
 | |
| #define	ATMEL_US_TXRDY		BIT(1)	/* Transmitter Ready */
 | |
| #define	ATMEL_US_RXBRK		BIT(2)	/* Break Received / End of Break */
 | |
| #define	ATMEL_US_ENDRX		BIT(3)	/* End of Receiver Transfer */
 | |
| #define	ATMEL_US_ENDTX		BIT(4)	/* End of Transmitter Transfer */
 | |
| #define	ATMEL_US_OVRE		BIT(5)	/* Overrun Error */
 | |
| #define	ATMEL_US_FRAME		BIT(6)	/* Framing Error */
 | |
| #define	ATMEL_US_PARE		BIT(7)	/* Parity Error */
 | |
| #define	ATMEL_US_TIMEOUT	BIT(8)	/* Receiver Time-out */
 | |
| #define	ATMEL_US_TXEMPTY	BIT(9)	/* Transmitter Empty */
 | |
| #define	ATMEL_US_ITERATION	BIT(10)	/* Max number of Repetitions Reached */
 | |
| #define	ATMEL_US_TXBUFE		BIT(11)	/* Transmission Buffer Empty */
 | |
| #define	ATMEL_US_RXBUFF		BIT(12)	/* Reception Buffer Full */
 | |
| #define	ATMEL_US_NACK		BIT(13)	/* Non Acknowledge */
 | |
| #define	ATMEL_US_RIIC		BIT(16)	/* Ring Indicator Input Change */
 | |
| #define	ATMEL_US_DSRIC		BIT(17)	/* Data Set Ready Input Change */
 | |
| #define	ATMEL_US_DCDIC		BIT(18)	/* Data Carrier Detect Input Change */
 | |
| #define	ATMEL_US_CTSIC		BIT(19)	/* Clear to Send Input Change */
 | |
| #define	ATMEL_US_RI		BIT(20)	/* RI */
 | |
| #define	ATMEL_US_DSR		BIT(21)	/* DSR */
 | |
| #define	ATMEL_US_DCD		BIT(22)	/* DCD */
 | |
| #define	ATMEL_US_CTS		BIT(23)	/* CTS */
 | |
| 
 | |
| #define ATMEL_US_IDR		0x0c	/* Interrupt Disable Register */
 | |
| #define ATMEL_US_IMR		0x10	/* Interrupt Mask Register */
 | |
| #define ATMEL_US_CSR		0x14	/* Channel Status Register */
 | |
| #define ATMEL_US_RHR		0x18	/* Receiver Holding Register */
 | |
| #define ATMEL_US_THR		0x1c	/* Transmitter Holding Register */
 | |
| #define	ATMEL_US_SYNH		BIT(15)	/* Transmit/Receive Sync */
 | |
| 
 | |
| #define ATMEL_US_BRGR		0x20	/* Baud Rate Generator Register */
 | |
| #define	ATMEL_US_CD		GENMASK(15, 0)	/* Clock Divider */
 | |
| 
 | |
| #define ATMEL_US_RTOR		0x24	/* Receiver Time-out Register */
 | |
| #define	ATMEL_US_TO		GENMASK(15, 0)	/* Time-out Value */
 | |
| 
 | |
| #define ATMEL_US_TTGR		0x28	/* Transmitter Timeguard Register */
 | |
| #define	ATMEL_US_TG		GENMASK(7, 0)	/* Timeguard Value */
 | |
| 
 | |
| #define ATMEL_US_FIDI		0x40	/* FI DI Ratio Register */
 | |
| #define ATMEL_US_NER		0x44	/* Number of Errors Register */
 | |
| #define ATMEL_US_IF		0x4c	/* IrDA Filter Register */
 | |
| 
 | |
| #define ATMEL_US_CMPR		0x90	/* Comparaison Register */
 | |
| #define ATMEL_US_FMR		0xa0	/* FIFO Mode Register */
 | |
| #define	ATMEL_US_TXRDYM(data)	(((data) & 0x3) << 0)	/* TX Ready Mode */
 | |
| #define	ATMEL_US_RXRDYM(data)	(((data) & 0x3) << 4)	/* RX Ready Mode */
 | |
| #define		ATMEL_US_ONE_DATA	0x0
 | |
| #define		ATMEL_US_TWO_DATA	0x1
 | |
| #define		ATMEL_US_FOUR_DATA	0x2
 | |
| #define	ATMEL_US_FRTSC		BIT(7)	/* FIFO RTS pin Control */
 | |
| #define	ATMEL_US_TXFTHRES(thr)	(((thr) & 0x3f) << 8)	/* TX FIFO Threshold */
 | |
| #define	ATMEL_US_RXFTHRES(thr)	(((thr) & 0x3f) << 16)	/* RX FIFO Threshold */
 | |
| #define	ATMEL_US_RXFTHRES2(thr)	(((thr) & 0x3f) << 24)	/* RX FIFO Threshold2 */
 | |
| 
 | |
| #define ATMEL_US_FLR		0xa4	/* FIFO Level Register */
 | |
| #define	ATMEL_US_TXFL(reg)	(((reg) >> 0) & 0x3f)	/* TX FIFO Level */
 | |
| #define	ATMEL_US_RXFL(reg)	(((reg) >> 16) & 0x3f)	/* RX FIFO Level */
 | |
| 
 | |
| #define ATMEL_US_FIER		0xa8	/* FIFO Interrupt Enable Register */
 | |
| #define ATMEL_US_FIDR		0xac	/* FIFO Interrupt Disable Register */
 | |
| #define ATMEL_US_FIMR		0xb0	/* FIFO Interrupt Mask Register */
 | |
| #define ATMEL_US_FESR		0xb4	/* FIFO Event Status Register */
 | |
| #define	ATMEL_US_TXFEF		BIT(0)	/* Transmit FIFO Empty Flag */
 | |
| #define	ATMEL_US_TXFFF		BIT(1)	/* Transmit FIFO Full Flag */
 | |
| #define	ATMEL_US_TXFTHF		BIT(2)	/* Transmit FIFO Threshold Flag */
 | |
| #define	ATMEL_US_RXFEF		BIT(3)	/* Receive FIFO Empty Flag */
 | |
| #define	ATMEL_US_RXFFF		BIT(4)	/* Receive FIFO Full Flag */
 | |
| #define	ATMEL_US_RXFTHF		BIT(5)	/* Receive FIFO Threshold Flag */
 | |
| #define	ATMEL_US_TXFPTEF	BIT(6)	/* Transmit FIFO Pointer Error Flag */
 | |
| #define	ATMEL_US_RXFPTEF	BIT(7)	/* Receive FIFO Pointer Error Flag */
 | |
| #define	ATMEL_US_TXFLOCK	BIT(8)	/* Transmit FIFO Lock (FESR only) */
 | |
| #define	ATMEL_US_RXFTHF2	BIT(9)	/* Receive FIFO Threshold Flag 2 */
 | |
| 
 | |
| #define ATMEL_US_NAME		0xf0	/* Ip Name */
 | |
| #define ATMEL_US_VERSION	0xfc	/* Ip Version */
 | |
| 
 | |
| #endif
 |