xref: /OK3568_Linux_fs/kernel/drivers/tty/serial/sh-sci.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #include <linux/bitops.h>
3*4882a593Smuzhiyun #include <linux/serial_core.h>
4*4882a593Smuzhiyun #include <linux/io.h>
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #define SCI_MAJOR		204
7*4882a593Smuzhiyun #define SCI_MINOR_START		8
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /*
11*4882a593Smuzhiyun  * SCI register subset common for all port types.
12*4882a593Smuzhiyun  * Not all registers will exist on all parts.
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun enum {
15*4882a593Smuzhiyun 	SCSMR,				/* Serial Mode Register */
16*4882a593Smuzhiyun 	SCBRR,				/* Bit Rate Register */
17*4882a593Smuzhiyun 	SCSCR,				/* Serial Control Register */
18*4882a593Smuzhiyun 	SCxSR,				/* Serial Status Register */
19*4882a593Smuzhiyun 	SCFCR,				/* FIFO Control Register */
20*4882a593Smuzhiyun 	SCFDR,				/* FIFO Data Count Register */
21*4882a593Smuzhiyun 	SCxTDR,				/* Transmit (FIFO) Data Register */
22*4882a593Smuzhiyun 	SCxRDR,				/* Receive (FIFO) Data Register */
23*4882a593Smuzhiyun 	SCLSR,				/* Line Status Register */
24*4882a593Smuzhiyun 	SCTFDR,				/* Transmit FIFO Data Count Register */
25*4882a593Smuzhiyun 	SCRFDR,				/* Receive FIFO Data Count Register */
26*4882a593Smuzhiyun 	SCSPTR,				/* Serial Port Register */
27*4882a593Smuzhiyun 	HSSRR,				/* Sampling Rate Register */
28*4882a593Smuzhiyun 	SCPCR,				/* Serial Port Control Register */
29*4882a593Smuzhiyun 	SCPDR,				/* Serial Port Data Register */
30*4882a593Smuzhiyun 	SCDL,				/* BRG Frequency Division Register */
31*4882a593Smuzhiyun 	SCCKS,				/* BRG Clock Select Register */
32*4882a593Smuzhiyun 	HSRTRGR,			/* Rx FIFO Data Count Trigger Register */
33*4882a593Smuzhiyun 	HSTTRGR,			/* Tx FIFO Data Count Trigger Register */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	SCIx_NR_REGS,
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* SCSMR (Serial Mode Register) */
40*4882a593Smuzhiyun #define SCSMR_C_A	BIT(7)	/* Communication Mode */
41*4882a593Smuzhiyun #define SCSMR_CSYNC	BIT(7)	/*   - Clocked synchronous mode */
42*4882a593Smuzhiyun #define SCSMR_ASYNC	0	/*   - Asynchronous mode */
43*4882a593Smuzhiyun #define SCSMR_CHR	BIT(6)	/* 7-bit Character Length */
44*4882a593Smuzhiyun #define SCSMR_PE	BIT(5)	/* Parity Enable */
45*4882a593Smuzhiyun #define SCSMR_ODD	BIT(4)	/* Odd Parity */
46*4882a593Smuzhiyun #define SCSMR_STOP	BIT(3)	/* Stop Bit Length */
47*4882a593Smuzhiyun #define SCSMR_CKS	0x0003	/* Clock Select */
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* Serial Mode Register, SCIFA/SCIFB only bits */
50*4882a593Smuzhiyun #define SCSMR_CKEDG	BIT(12)	/* Transmit/Receive Clock Edge Select */
51*4882a593Smuzhiyun #define SCSMR_SRC_MASK	0x0700	/* Sampling Control */
52*4882a593Smuzhiyun #define SCSMR_SRC_16	0x0000	/* Sampling rate 1/16 */
53*4882a593Smuzhiyun #define SCSMR_SRC_5	0x0100	/* Sampling rate 1/5 */
54*4882a593Smuzhiyun #define SCSMR_SRC_7	0x0200	/* Sampling rate 1/7 */
55*4882a593Smuzhiyun #define SCSMR_SRC_11	0x0300	/* Sampling rate 1/11 */
56*4882a593Smuzhiyun #define SCSMR_SRC_13	0x0400	/* Sampling rate 1/13 */
57*4882a593Smuzhiyun #define SCSMR_SRC_17	0x0500	/* Sampling rate 1/17 */
58*4882a593Smuzhiyun #define SCSMR_SRC_19	0x0600	/* Sampling rate 1/19 */
59*4882a593Smuzhiyun #define SCSMR_SRC_27	0x0700	/* Sampling rate 1/27 */
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* Serial Control Register, SCIFA/SCIFB only bits */
62*4882a593Smuzhiyun #define SCSCR_TDRQE	BIT(15)	/* Tx Data Transfer Request Enable */
63*4882a593Smuzhiyun #define SCSCR_RDRQE	BIT(14)	/* Rx Data Transfer Request Enable */
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* Serial Control Register, HSCIF-only bits */
66*4882a593Smuzhiyun #define HSSCR_TOT_SHIFT	14
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* SCxSR (Serial Status Register) on SCI */
69*4882a593Smuzhiyun #define SCI_TDRE	BIT(7)	/* Transmit Data Register Empty */
70*4882a593Smuzhiyun #define SCI_RDRF	BIT(6)	/* Receive Data Register Full */
71*4882a593Smuzhiyun #define SCI_ORER	BIT(5)	/* Overrun Error */
72*4882a593Smuzhiyun #define SCI_FER		BIT(4)	/* Framing Error */
73*4882a593Smuzhiyun #define SCI_PER		BIT(3)	/* Parity Error */
74*4882a593Smuzhiyun #define SCI_TEND	BIT(2)	/* Transmit End */
75*4882a593Smuzhiyun #define SCI_RESERVED	0x03	/* All reserved bits */
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define SCI_DEFAULT_ERROR_MASK (SCI_PER | SCI_FER)
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define SCI_RDxF_CLEAR	(u32)(~(SCI_RESERVED | SCI_RDRF))
80*4882a593Smuzhiyun #define SCI_ERROR_CLEAR	(u32)(~(SCI_RESERVED | SCI_PER | SCI_FER | SCI_ORER))
81*4882a593Smuzhiyun #define SCI_TDxE_CLEAR	(u32)(~(SCI_RESERVED | SCI_TEND | SCI_TDRE))
82*4882a593Smuzhiyun #define SCI_BREAK_CLEAR	(u32)(~(SCI_RESERVED | SCI_PER | SCI_FER | SCI_ORER))
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* SCxSR (Serial Status Register) on SCIF, SCIFA, SCIFB, HSCIF */
85*4882a593Smuzhiyun #define SCIF_ER		BIT(7)	/* Receive Error */
86*4882a593Smuzhiyun #define SCIF_TEND	BIT(6)	/* Transmission End */
87*4882a593Smuzhiyun #define SCIF_TDFE	BIT(5)	/* Transmit FIFO Data Empty */
88*4882a593Smuzhiyun #define SCIF_BRK	BIT(4)	/* Break Detect */
89*4882a593Smuzhiyun #define SCIF_FER	BIT(3)	/* Framing Error */
90*4882a593Smuzhiyun #define SCIF_PER	BIT(2)	/* Parity Error */
91*4882a593Smuzhiyun #define SCIF_RDF	BIT(1)	/* Receive FIFO Data Full */
92*4882a593Smuzhiyun #define SCIF_DR		BIT(0)	/* Receive Data Ready */
93*4882a593Smuzhiyun /* SCIF only (optional) */
94*4882a593Smuzhiyun #define SCIF_PERC	0xf000	/* Number of Parity Errors */
95*4882a593Smuzhiyun #define SCIF_FERC	0x0f00	/* Number of Framing Errors */
96*4882a593Smuzhiyun /*SCIFA/SCIFB and SCIF on SH7705/SH7720/SH7721 only */
97*4882a593Smuzhiyun #define SCIFA_ORER	BIT(9)	/* Overrun Error */
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define SCIF_DEFAULT_ERROR_MASK (SCIF_PER | SCIF_FER | SCIF_BRK | SCIF_ER)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define SCIF_RDxF_CLEAR		(u32)(~(SCIF_DR | SCIF_RDF))
102*4882a593Smuzhiyun #define SCIF_ERROR_CLEAR	(u32)(~(SCIF_PER | SCIF_FER | SCIF_ER))
103*4882a593Smuzhiyun #define SCIF_TDxE_CLEAR		(u32)(~(SCIF_TDFE))
104*4882a593Smuzhiyun #define SCIF_BREAK_CLEAR	(u32)(~(SCIF_PER | SCIF_FER | SCIF_BRK))
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /* SCFCR (FIFO Control Register) */
107*4882a593Smuzhiyun #define SCFCR_RTRG1	BIT(7)	/* Receive FIFO Data Count Trigger */
108*4882a593Smuzhiyun #define SCFCR_RTRG0	BIT(6)
109*4882a593Smuzhiyun #define SCFCR_TTRG1	BIT(5)	/* Transmit FIFO Data Count Trigger */
110*4882a593Smuzhiyun #define SCFCR_TTRG0	BIT(4)
111*4882a593Smuzhiyun #define SCFCR_MCE	BIT(3)	/* Modem Control Enable */
112*4882a593Smuzhiyun #define SCFCR_TFRST	BIT(2)	/* Transmit FIFO Data Register Reset */
113*4882a593Smuzhiyun #define SCFCR_RFRST	BIT(1)	/* Receive FIFO Data Register Reset */
114*4882a593Smuzhiyun #define SCFCR_LOOP	BIT(0)	/* Loopback Test */
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* SCLSR (Line Status Register) on (H)SCIF */
117*4882a593Smuzhiyun #define SCLSR_TO	BIT(2)	/* Timeout */
118*4882a593Smuzhiyun #define SCLSR_ORER	BIT(0)	/* Overrun Error */
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* SCSPTR (Serial Port Register), optional */
121*4882a593Smuzhiyun #define SCSPTR_RTSIO	BIT(7)	/* Serial Port RTS# Pin Input/Output */
122*4882a593Smuzhiyun #define SCSPTR_RTSDT	BIT(6)	/* Serial Port RTS# Pin Data */
123*4882a593Smuzhiyun #define SCSPTR_CTSIO	BIT(5)	/* Serial Port CTS# Pin Input/Output */
124*4882a593Smuzhiyun #define SCSPTR_CTSDT	BIT(4)	/* Serial Port CTS# Pin Data */
125*4882a593Smuzhiyun #define SCSPTR_SCKIO	BIT(3)	/* Serial Port Clock Pin Input/Output */
126*4882a593Smuzhiyun #define SCSPTR_SCKDT	BIT(2)	/* Serial Port Clock Pin Data */
127*4882a593Smuzhiyun #define SCSPTR_SPB2IO	BIT(1)	/* Serial Port Break Input/Output */
128*4882a593Smuzhiyun #define SCSPTR_SPB2DT	BIT(0)	/* Serial Port Break Data */
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* HSSRR HSCIF */
131*4882a593Smuzhiyun #define HSCIF_SRE	BIT(15)	/* Sampling Rate Register Enable */
132*4882a593Smuzhiyun #define HSCIF_SRDE	BIT(14) /* Sampling Point Register Enable */
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define HSCIF_SRHP_SHIFT	8
135*4882a593Smuzhiyun #define HSCIF_SRHP_MASK		0x0f00
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* SCPCR (Serial Port Control Register), SCIFA/SCIFB only */
138*4882a593Smuzhiyun #define SCPCR_RTSC	BIT(4)	/* Serial Port RTS# Pin / Output Pin */
139*4882a593Smuzhiyun #define SCPCR_CTSC	BIT(3)	/* Serial Port CTS# Pin / Input Pin */
140*4882a593Smuzhiyun #define SCPCR_SCKC	BIT(2)	/* Serial Port SCK Pin / Output Pin */
141*4882a593Smuzhiyun #define SCPCR_RXDC	BIT(1)	/* Serial Port RXD Pin / Input Pin */
142*4882a593Smuzhiyun #define SCPCR_TXDC	BIT(0)	/* Serial Port TXD Pin / Output Pin */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /* SCPDR (Serial Port Data Register), SCIFA/SCIFB only */
145*4882a593Smuzhiyun #define SCPDR_RTSD	BIT(4)	/* Serial Port RTS# Output Pin Data */
146*4882a593Smuzhiyun #define SCPDR_CTSD	BIT(3)	/* Serial Port CTS# Input Pin Data */
147*4882a593Smuzhiyun #define SCPDR_SCKD	BIT(2)	/* Serial Port SCK Output Pin Data */
148*4882a593Smuzhiyun #define SCPDR_RXDD	BIT(1)	/* Serial Port RXD Input Pin Data */
149*4882a593Smuzhiyun #define SCPDR_TXDD	BIT(0)	/* Serial Port TXD Output Pin Data */
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun /*
152*4882a593Smuzhiyun  * BRG Clock Select Register (Some SCIF and HSCIF)
153*4882a593Smuzhiyun  * The Baud Rate Generator for external clock can provide a clock source for
154*4882a593Smuzhiyun  * the sampling clock. It outputs either its frequency divided clock, or the
155*4882a593Smuzhiyun  * (undivided) (H)SCK external clock.
156*4882a593Smuzhiyun  */
157*4882a593Smuzhiyun #define SCCKS_CKS	BIT(15)	/* Select (H)SCK (1) or divided SC_CLK (0) */
158*4882a593Smuzhiyun #define SCCKS_XIN	BIT(14)	/* SC_CLK uses bus clock (1) or SCIF_CLK (0) */
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #define SCxSR_TEND(port)	(((port)->type == PORT_SCI) ? SCI_TEND   : SCIF_TEND)
161*4882a593Smuzhiyun #define SCxSR_RDxF(port)	(((port)->type == PORT_SCI) ? SCI_RDRF   : SCIF_DR | SCIF_RDF)
162*4882a593Smuzhiyun #define SCxSR_TDxE(port)	(((port)->type == PORT_SCI) ? SCI_TDRE   : SCIF_TDFE)
163*4882a593Smuzhiyun #define SCxSR_FER(port)		(((port)->type == PORT_SCI) ? SCI_FER    : SCIF_FER)
164*4882a593Smuzhiyun #define SCxSR_PER(port)		(((port)->type == PORT_SCI) ? SCI_PER    : SCIF_PER)
165*4882a593Smuzhiyun #define SCxSR_BRK(port)		(((port)->type == PORT_SCI) ? 0x00       : SCIF_BRK)
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #define SCxSR_ERRORS(port)	(to_sci_port(port)->params->error_mask)
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun #define SCxSR_RDxF_CLEAR(port) \
170*4882a593Smuzhiyun 	(((port)->type == PORT_SCI) ? SCI_RDxF_CLEAR : SCIF_RDxF_CLEAR)
171*4882a593Smuzhiyun #define SCxSR_ERROR_CLEAR(port) \
172*4882a593Smuzhiyun 	(to_sci_port(port)->params->error_clear)
173*4882a593Smuzhiyun #define SCxSR_TDxE_CLEAR(port) \
174*4882a593Smuzhiyun 	(((port)->type == PORT_SCI) ? SCI_TDxE_CLEAR : SCIF_TDxE_CLEAR)
175*4882a593Smuzhiyun #define SCxSR_BREAK_CLEAR(port) \
176*4882a593Smuzhiyun 	(((port)->type == PORT_SCI) ? SCI_BREAK_CLEAR : SCIF_BREAK_CLEAR)
177