xref: /rk3399_rockchip-uboot/drivers/serial/serial_sh.h (revision 3f6c8e36c58736d34a09287f013ee6c5f02ef7aa)
1*3f6c8e36SNobuhiro Iwamatsu /*
2*3f6c8e36SNobuhiro Iwamatsu  * Copy and modify from linux/drivers/serial/sh-sci.h
3*3f6c8e36SNobuhiro Iwamatsu  */
4*3f6c8e36SNobuhiro Iwamatsu 
5*3f6c8e36SNobuhiro Iwamatsu struct uart_port {
6*3f6c8e36SNobuhiro Iwamatsu 	unsigned long	iobase;		/* in/out[bwl] */
7*3f6c8e36SNobuhiro Iwamatsu 	unsigned char	*membase;	/* read/write[bwl] */
8*3f6c8e36SNobuhiro Iwamatsu 	unsigned long	mapbase;	/* for ioremap */
9*3f6c8e36SNobuhiro Iwamatsu 	unsigned int	type;		/* port type */
10*3f6c8e36SNobuhiro Iwamatsu };
11*3f6c8e36SNobuhiro Iwamatsu 
12*3f6c8e36SNobuhiro Iwamatsu #define PORT_SCI	52
13*3f6c8e36SNobuhiro Iwamatsu #define PORT_SCIF	53
14*3f6c8e36SNobuhiro Iwamatsu #define PORT_SCIFA	83
15*3f6c8e36SNobuhiro Iwamatsu #define PORT_SCIFB	93
16*3f6c8e36SNobuhiro Iwamatsu 
17*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_H83007) || defined(CONFIG_H83068)
18*3f6c8e36SNobuhiro Iwamatsu #include <asm/regs306x.h>
19*3f6c8e36SNobuhiro Iwamatsu #endif
20*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_H8S2678)
21*3f6c8e36SNobuhiro Iwamatsu #include <asm/regs267x.h>
22*3f6c8e36SNobuhiro Iwamatsu #endif
23*3f6c8e36SNobuhiro Iwamatsu 
24*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7706) || \
25*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7707) || \
26*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7708) || \
27*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7709)
28*3f6c8e36SNobuhiro Iwamatsu # define SCPCR  0xA4000116 /* 16 bit SCI and SCIF */
29*3f6c8e36SNobuhiro Iwamatsu # define SCPDR  0xA4000136 /* 8  bit SCI and SCIF */
30*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
31*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7705)
32*3f6c8e36SNobuhiro Iwamatsu # define SCIF0		0xA4400000
33*3f6c8e36SNobuhiro Iwamatsu # define SCIF2		0xA4410000
34*3f6c8e36SNobuhiro Iwamatsu # define SCSMR_Ir	0xA44A0000
35*3f6c8e36SNobuhiro Iwamatsu # define IRDA_SCIF	SCIF0
36*3f6c8e36SNobuhiro Iwamatsu # define SCPCR 0xA4000116
37*3f6c8e36SNobuhiro Iwamatsu # define SCPDR 0xA4000136
38*3f6c8e36SNobuhiro Iwamatsu 
39*3f6c8e36SNobuhiro Iwamatsu /* Set the clock source,
40*3f6c8e36SNobuhiro Iwamatsu  * SCIF2 (0xA4410000) -> External clock, SCK pin used as clock input
41*3f6c8e36SNobuhiro Iwamatsu  * SCIF0 (0xA4400000) -> Internal clock, SCK pin as serial clock output
42*3f6c8e36SNobuhiro Iwamatsu  */
43*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port) (port->mapbase == SCIF2) ? 0xF3 : 0xF0
44*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7720) || \
45*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7721) || \
46*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7367) || \
47*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7377) || \
48*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7372)
49*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)  0x0030 /* TIE=0,RIE=0,TE=1,RE=1 */
50*3f6c8e36SNobuhiro Iwamatsu # define PORT_PTCR	   0xA405011EUL
51*3f6c8e36SNobuhiro Iwamatsu # define PORT_PVCR	   0xA4050122UL
52*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER	   0x0200   /* overrun error bit */
53*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_SH_RTS7751R2D)
54*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xFFE0001C /* 8 bit SCIF */
55*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
56*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001   /* overrun error bit */
57*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
58*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7750)  || \
59*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7750R) || \
60*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7750S) || \
61*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7091)  || \
62*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7751)  || \
63*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7751R)
64*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xffe0001c /* 8  bit SCI */
65*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
66*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001   /* overrun error bit */
67*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port) (((port)->type == PORT_SCI) ? \
68*3f6c8e36SNobuhiro Iwamatsu 	0x30 /* TIE=0,RIE=0,TE=1,RE=1 */ : \
69*3f6c8e36SNobuhiro Iwamatsu 	0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */)
70*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7760)
71*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xfe600024 /* 16 bit SCIF */
72*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xfe610024 /* 16 bit SCIF */
73*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xfe620024 /* 16 bit SCIF */
74*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001  /* overrun error bit */
75*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)          0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
76*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7710) || defined(CONFIG_CPU_SH7712)
77*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xA4400000	  /* 16 bit SCIF */
78*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001   /* overrun error bit */
79*3f6c8e36SNobuhiro Iwamatsu # define PACR 0xa4050100
80*3f6c8e36SNobuhiro Iwamatsu # define PBCR 0xa4050102
81*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)          0x3B
82*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7343)
83*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xffe00010	/* 16 bit SCIF */
84*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xffe10010	/* 16 bit SCIF */
85*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xffe20010	/* 16 bit SCIF */
86*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR3 0xffe30010	/* 16 bit SCIF */
87*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port) 0x32	/* TIE=0,RIE=0,TE=1,RE=1,REIE=0,CKE=1 */
88*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7722)
89*3f6c8e36SNobuhiro Iwamatsu # define PADR			0xA4050120
90*3f6c8e36SNobuhiro Iwamatsu # define PSDR			0xA405013e
91*3f6c8e36SNobuhiro Iwamatsu # define PWDR			0xA4050166
92*3f6c8e36SNobuhiro Iwamatsu # define PSCR			0xA405011E
93*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER		0x0001	/* overrun error bit */
94*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x0038	/* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
95*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7366)
96*3f6c8e36SNobuhiro Iwamatsu # define SCPDR0			0xA405013E      /* 16 bit SCIF0 PSDR */
97*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0		SCPDR0
98*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER		0x0001  /* overrun error bit */
99*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x0038  /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
100*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7723)
101*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0                0xa4050160
102*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1                0xa405013e
103*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2                0xa4050160
104*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR3                0xa405013e
105*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR4                0xa4050128
106*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR5                0xa4050128
107*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER              0x0001  /* overrun error bit */
108*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)       0x0038  /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
109*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7724)
110*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER              0x0001  /* overrun error bit */
111*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port) ((port)->type == PORT_SCIFA ? \
112*3f6c8e36SNobuhiro Iwamatsu 	0x30 /* TIE=0,RIE=0,TE=1,RE=1 */ : \
113*3f6c8e36SNobuhiro Iwamatsu 	0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */)
114*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH4_202)
115*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xffe80020 /* 16 bit SCIF */
116*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001   /* overrun error bit */
117*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port) 0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
118*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH5_101) || defined(CONFIG_CPU_SH5_103)
119*3f6c8e36SNobuhiro Iwamatsu # define SCIF_BASE_ADDR    0x01030000
120*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ADDR_SH5     (PHYS_PERIPHERAL_BLOCK+SCIF_BASE_ADDR)
121*3f6c8e36SNobuhiro Iwamatsu # define SCIF_PTR2_OFFS    0x0000020
122*3f6c8e36SNobuhiro Iwamatsu # define SCIF_LSR2_OFFS    0x0000024
123*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR\
124*3f6c8e36SNobuhiro Iwamatsu 		((port->mapbase)+SCIF_PTR2_OFFS) /* 16 bit SCIF */
125*3f6c8e36SNobuhiro Iwamatsu # define SCLSR2\
126*3f6c8e36SNobuhiro Iwamatsu 		((port->mapbase)+SCIF_LSR2_OFFS) /* 16 bit SCIF */
127*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)  0x38		/* TIE=0,RIE=0, TE=1,RE=1,REIE=1 */
128*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_H83007) || defined(CONFIG_H83068)
129*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
130*3f6c8e36SNobuhiro Iwamatsu # define H8300_SCI_DR(ch) (*(volatile char *)(P1DR + h8300_sci_pins[ch].port))
131*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_H8S2678)
132*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
133*3f6c8e36SNobuhiro Iwamatsu # define H8300_SCI_DR(ch) (*(volatile char *)(P1DR + h8300_sci_pins[ch].port))
134*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7757)
135*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xfe4b0020
136*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xfe4b0020
137*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xfe4b0020
138*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001
139*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x38
140*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ONLY
141*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7763)
142*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xffe00024 /* 16 bit SCIF */
143*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xffe08024 /* 16 bit SCIF */
144*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xffe10020 /* 16 bit SCIF/IRDA */
145*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001  /* overrun error bit */
146*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x38	/* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
147*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7770)
148*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xff923020 /* 16 bit SCIF */
149*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xff924020 /* 16 bit SCIF */
150*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xff925020 /* 16 bit SCIF */
151*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001  /* overrun error bit */
152*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x3c /* TIE=0,RIE=0,TE=1,RE=1,REIE=1,cke=2 */
153*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7780)
154*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0	0xffe00024	/* 16 bit SCIF */
155*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1	0xffe10024	/* 16 bit SCIF */
156*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER	0x0001		/* Overrun error bit */
157*3f6c8e36SNobuhiro Iwamatsu 
158*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_SH_SH2007)
159*3f6c8e36SNobuhiro Iwamatsu /* TIE=0,RIE=0,TE=1,RE=1,REIE=1,CKE1=0 */
160*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x38
161*3f6c8e36SNobuhiro Iwamatsu #else
162*3f6c8e36SNobuhiro Iwamatsu /* TIE=0,RIE=0,TE=1,RE=1,REIE=1,CKE1=1 */
163*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x3a
164*3f6c8e36SNobuhiro Iwamatsu #endif
165*3f6c8e36SNobuhiro Iwamatsu 
166*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7785) || \
167*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7786)
168*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0	0xffea0024	/* 16 bit SCIF */
169*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1	0xffeb0024	/* 16 bit SCIF */
170*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2	0xffec0024	/* 16 bit SCIF */
171*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR3	0xffed0024	/* 16 bit SCIF */
172*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR4	0xffee0024	/* 16 bit SCIF */
173*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR5	0xffef0024	/* 16 bit SCIF */
174*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER	0x0001		/* Overrun error bit */
175*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x3a	/* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
176*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7201) || \
177*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7203) || \
178*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7206) || \
179*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7263)
180*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xfffe8020 /* 16 bit SCIF */
181*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xfffe8820 /* 16 bit SCIF */
182*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xfffe9020 /* 16 bit SCIF */
183*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR3 0xfffe9820 /* 16 bit SCIF */
184*3f6c8e36SNobuhiro Iwamatsu # if defined(CONFIG_CPU_SH7201)
185*3f6c8e36SNobuhiro Iwamatsu #  define SCSPTR4 0xfffeA020 /* 16 bit SCIF */
186*3f6c8e36SNobuhiro Iwamatsu #  define SCSPTR5 0xfffeA820 /* 16 bit SCIF */
187*3f6c8e36SNobuhiro Iwamatsu #  define SCSPTR6 0xfffeB020 /* 16 bit SCIF */
188*3f6c8e36SNobuhiro Iwamatsu #  define SCSPTR7 0xfffeB820 /* 16 bit SCIF */
189*3f6c8e36SNobuhiro Iwamatsu # endif
190*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
191*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7619)
192*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xf8400020 /* 16 bit SCIF */
193*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xf8410020 /* 16 bit SCIF */
194*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xf8420020 /* 16 bit SCIF */
195*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001  /* overrun error bit */
196*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
197*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SHX3)
198*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR0 0xffc30020		/* 16 bit SCIF */
199*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR1 0xffc40020		/* 16 bit SCIF */
200*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR2 0xffc50020		/* 16 bit SCIF */
201*3f6c8e36SNobuhiro Iwamatsu # define SCSPTR3 0xffc60020		/* 16 bit SCIF */
202*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER 0x0001		/* Overrun error bit */
203*3f6c8e36SNobuhiro Iwamatsu # define SCSCR_INIT(port)	0x38	/* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
204*3f6c8e36SNobuhiro Iwamatsu #else
205*3f6c8e36SNobuhiro Iwamatsu # error CPU subtype not defined
206*3f6c8e36SNobuhiro Iwamatsu #endif
207*3f6c8e36SNobuhiro Iwamatsu 
208*3f6c8e36SNobuhiro Iwamatsu /* SCSCR */
209*3f6c8e36SNobuhiro Iwamatsu #define SCI_CTRL_FLAGS_TIE  0x80 /* all */
210*3f6c8e36SNobuhiro Iwamatsu #define SCI_CTRL_FLAGS_RIE  0x40 /* all */
211*3f6c8e36SNobuhiro Iwamatsu #define SCI_CTRL_FLAGS_TE   0x20 /* all */
212*3f6c8e36SNobuhiro Iwamatsu #define SCI_CTRL_FLAGS_RE   0x10 /* all */
213*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7750)  || \
214*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7091)  || \
215*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7750R) || \
216*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7722)  || \
217*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7750S) || \
218*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7751)  || \
219*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7751R) || \
220*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7763)  || \
221*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7780)  || \
222*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7785)  || \
223*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7786)  || \
224*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SHX3)
225*3f6c8e36SNobuhiro Iwamatsu #define SCI_CTRL_FLAGS_REIE 0x08 /* 7750 SCIF */
226*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7724)
227*3f6c8e36SNobuhiro Iwamatsu #define SCI_CTRL_FLAGS_REIE ((port)->type == PORT_SCIFA ? 0 : 8)
228*3f6c8e36SNobuhiro Iwamatsu #else
229*3f6c8e36SNobuhiro Iwamatsu #define SCI_CTRL_FLAGS_REIE 0
230*3f6c8e36SNobuhiro Iwamatsu #endif
231*3f6c8e36SNobuhiro Iwamatsu /*		SCI_CTRL_FLAGS_MPIE 0x08  * 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
232*3f6c8e36SNobuhiro Iwamatsu /*		SCI_CTRL_FLAGS_TEIE 0x04  * 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
233*3f6c8e36SNobuhiro Iwamatsu /*		SCI_CTRL_FLAGS_CKE1 0x02  * all */
234*3f6c8e36SNobuhiro Iwamatsu /*		SCI_CTRL_FLAGS_CKE0 0x01  * 7707 SCI/SCIF, 7708 SCI, 7709 SCI/SCIF, 7750 SCI */
235*3f6c8e36SNobuhiro Iwamatsu 
236*3f6c8e36SNobuhiro Iwamatsu /* SCxSR SCI */
237*3f6c8e36SNobuhiro Iwamatsu #define SCI_TDRE  0x80 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
238*3f6c8e36SNobuhiro Iwamatsu #define SCI_RDRF  0x40 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
239*3f6c8e36SNobuhiro Iwamatsu #define SCI_ORER  0x20 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
240*3f6c8e36SNobuhiro Iwamatsu #define SCI_FER   0x10 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
241*3f6c8e36SNobuhiro Iwamatsu #define SCI_PER   0x08 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
242*3f6c8e36SNobuhiro Iwamatsu #define SCI_TEND  0x04 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
243*3f6c8e36SNobuhiro Iwamatsu /*      SCI_MPB   0x02  * 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
244*3f6c8e36SNobuhiro Iwamatsu /*      SCI_MPBT  0x01  * 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
245*3f6c8e36SNobuhiro Iwamatsu 
246*3f6c8e36SNobuhiro Iwamatsu #define SCI_ERRORS ( SCI_PER | SCI_FER | SCI_ORER)
247*3f6c8e36SNobuhiro Iwamatsu 
248*3f6c8e36SNobuhiro Iwamatsu /* SCxSR SCIF */
249*3f6c8e36SNobuhiro Iwamatsu #define SCIF_ER    0x0080 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
250*3f6c8e36SNobuhiro Iwamatsu #define SCIF_TEND  0x0040 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
251*3f6c8e36SNobuhiro Iwamatsu #define SCIF_TDFE  0x0020 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
252*3f6c8e36SNobuhiro Iwamatsu #define SCIF_BRK   0x0010 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
253*3f6c8e36SNobuhiro Iwamatsu #define SCIF_FER   0x0008 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
254*3f6c8e36SNobuhiro Iwamatsu #define SCIF_PER   0x0004 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
255*3f6c8e36SNobuhiro Iwamatsu #define SCIF_RDF   0x0002 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
256*3f6c8e36SNobuhiro Iwamatsu #define SCIF_DR    0x0001 /* 7705 SCIF, 7707 SCIF, 7709 SCIF, 7750 SCIF */
257*3f6c8e36SNobuhiro Iwamatsu 
258*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7705) || \
259*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7720) || \
260*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7721) || \
261*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7367) || \
262*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7377) || \
263*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7372)
264*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ORER    0x0200
265*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ERRORS (SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK | SCIF_ORER)
266*3f6c8e36SNobuhiro Iwamatsu # define SCIF_RFDC_MASK 0x007f
267*3f6c8e36SNobuhiro Iwamatsu # define SCIF_TXROOM_MAX 64
268*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7763)
269*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ERRORS (SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK)
270*3f6c8e36SNobuhiro Iwamatsu # define SCIF_RFDC_MASK 0x007f
271*3f6c8e36SNobuhiro Iwamatsu # define SCIF_TXROOM_MAX 64
272*3f6c8e36SNobuhiro Iwamatsu /* SH7763 SCIF2 support */
273*3f6c8e36SNobuhiro Iwamatsu # define SCIF2_RFDC_MASK 0x001f
274*3f6c8e36SNobuhiro Iwamatsu # define SCIF2_TXROOM_MAX 16
275*3f6c8e36SNobuhiro Iwamatsu #else
276*3f6c8e36SNobuhiro Iwamatsu # define SCIF_ERRORS (SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK)
277*3f6c8e36SNobuhiro Iwamatsu # define SCIF_RFDC_MASK 0x001f
278*3f6c8e36SNobuhiro Iwamatsu # define SCIF_TXROOM_MAX 16
279*3f6c8e36SNobuhiro Iwamatsu #endif
280*3f6c8e36SNobuhiro Iwamatsu 
281*3f6c8e36SNobuhiro Iwamatsu #ifndef SCIF_ORER
282*3f6c8e36SNobuhiro Iwamatsu #define SCIF_ORER	0x0000
283*3f6c8e36SNobuhiro Iwamatsu #endif
284*3f6c8e36SNobuhiro Iwamatsu 
285*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_TEND(port)\
286*3f6c8e36SNobuhiro Iwamatsu 		(((port)->type == PORT_SCI) ? SCI_TEND	: SCIF_TEND)
287*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_ERRORS(port)\
288*3f6c8e36SNobuhiro Iwamatsu 		(((port)->type == PORT_SCI) ? SCI_ERRORS : SCIF_ERRORS)
289*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_RDxF(port)\
290*3f6c8e36SNobuhiro Iwamatsu 		(((port)->type == PORT_SCI) ? SCI_RDRF	: SCIF_RDF)
291*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_TDxE(port)\
292*3f6c8e36SNobuhiro Iwamatsu 		(((port)->type == PORT_SCI) ? SCI_TDRE	: SCIF_TDFE)
293*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_FER(port)\
294*3f6c8e36SNobuhiro Iwamatsu 		(((port)->type == PORT_SCI) ? SCI_FER	: SCIF_FER)
295*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_PER(port)\
296*3f6c8e36SNobuhiro Iwamatsu 		(((port)->type == PORT_SCI) ? SCI_PER	: SCIF_PER)
297*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_BRK(port)\
298*3f6c8e36SNobuhiro Iwamatsu 		((port)->type == PORT_SCI) ? 0x00		: SCIF_BRK)
299*3f6c8e36SNobuhiro Iwamatsu #define SCxSR_ORER(port)\
300*3f6c8e36SNobuhiro Iwamatsu 		(((port)->type == PORT_SCI) ? SCI_ORER	: SCIF_ORER)
301*3f6c8e36SNobuhiro Iwamatsu 
302*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7705) || \
303*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7720) || \
304*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7721) || \
305*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7367) || \
306*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7377) || \
307*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7372)
308*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_RDxF_CLEAR(port)	 (sci_in(port, SCxSR) & 0xfffc)
309*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_ERROR_CLEAR(port) (sci_in(port, SCxSR) & 0xfd73)
310*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_TDxE_CLEAR(port)	 (sci_in(port, SCxSR) & 0xffdf)
311*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_BREAK_CLEAR(port) (sci_in(port, SCxSR) & 0xffe3)
312*3f6c8e36SNobuhiro Iwamatsu #else
313*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_RDxF_CLEAR(port)	 (((port)->type == PORT_SCI) ? 0xbc : 0x00fc)
314*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_ERROR_CLEAR(port) (((port)->type == PORT_SCI) ? 0xc4 : 0x0073)
315*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_TDxE_CLEAR(port)  (((port)->type == PORT_SCI) ? 0x78 : 0x00df)
316*3f6c8e36SNobuhiro Iwamatsu # define SCxSR_BREAK_CLEAR(port) (((port)->type == PORT_SCI) ? 0xc4 : 0x00e3)
317*3f6c8e36SNobuhiro Iwamatsu #endif
318*3f6c8e36SNobuhiro Iwamatsu 
319*3f6c8e36SNobuhiro Iwamatsu /* SCFCR */
320*3f6c8e36SNobuhiro Iwamatsu #define SCFCR_RFRST 0x0002
321*3f6c8e36SNobuhiro Iwamatsu #define SCFCR_TFRST 0x0004
322*3f6c8e36SNobuhiro Iwamatsu #define SCFCR_TCRST 0x4000
323*3f6c8e36SNobuhiro Iwamatsu #define SCFCR_MCE   0x0008
324*3f6c8e36SNobuhiro Iwamatsu 
325*3f6c8e36SNobuhiro Iwamatsu #define SCI_MAJOR		204
326*3f6c8e36SNobuhiro Iwamatsu #define SCI_MINOR_START		8
327*3f6c8e36SNobuhiro Iwamatsu 
328*3f6c8e36SNobuhiro Iwamatsu /* Generic serial flags */
329*3f6c8e36SNobuhiro Iwamatsu #define SCI_RX_THROTTLE		0x0000001
330*3f6c8e36SNobuhiro Iwamatsu 
331*3f6c8e36SNobuhiro Iwamatsu #define SCI_MAGIC 0xbabeface
332*3f6c8e36SNobuhiro Iwamatsu 
333*3f6c8e36SNobuhiro Iwamatsu /*
334*3f6c8e36SNobuhiro Iwamatsu  * Events are used to schedule things to happen at timer-interrupt
335*3f6c8e36SNobuhiro Iwamatsu  * time, instead of at rs interrupt time.
336*3f6c8e36SNobuhiro Iwamatsu  */
337*3f6c8e36SNobuhiro Iwamatsu #define SCI_EVENT_WRITE_WAKEUP	0
338*3f6c8e36SNobuhiro Iwamatsu 
339*3f6c8e36SNobuhiro Iwamatsu #define SCI_IN(size, offset)\
340*3f6c8e36SNobuhiro Iwamatsu 	if ((size) == 8) {\
341*3f6c8e36SNobuhiro Iwamatsu 		return readb(port->membase + (offset));\
342*3f6c8e36SNobuhiro Iwamatsu 	} else {\
343*3f6c8e36SNobuhiro Iwamatsu 		return readw(port->membase + (offset));\
344*3f6c8e36SNobuhiro Iwamatsu 	}
345*3f6c8e36SNobuhiro Iwamatsu #define SCI_OUT(size, offset, value)\
346*3f6c8e36SNobuhiro Iwamatsu 	if ((size) == 8) {\
347*3f6c8e36SNobuhiro Iwamatsu 		writeb(value, port->membase + (offset));\
348*3f6c8e36SNobuhiro Iwamatsu 	} else if ((size) == 16) {\
349*3f6c8e36SNobuhiro Iwamatsu 		writew(value, port->membase + (offset));\
350*3f6c8e36SNobuhiro Iwamatsu 	}
351*3f6c8e36SNobuhiro Iwamatsu 
352*3f6c8e36SNobuhiro Iwamatsu #define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\
353*3f6c8e36SNobuhiro Iwamatsu 	static inline unsigned int sci_##name##_in(struct uart_port *port) {\
354*3f6c8e36SNobuhiro Iwamatsu 		if (port->type == PORT_SCIF || port->type == PORT_SCIFB) {\
355*3f6c8e36SNobuhiro Iwamatsu 			SCI_IN(scif_size, scif_offset)\
356*3f6c8e36SNobuhiro Iwamatsu 		} else { /* PORT_SCI or PORT_SCIFA */\
357*3f6c8e36SNobuhiro Iwamatsu 			SCI_IN(sci_size, sci_offset);\
358*3f6c8e36SNobuhiro Iwamatsu 		}\
359*3f6c8e36SNobuhiro Iwamatsu 	}\
360*3f6c8e36SNobuhiro Iwamatsu static inline void sci_##name##_out(struct uart_port *port,\
361*3f6c8e36SNobuhiro Iwamatsu 				unsigned int value) {\
362*3f6c8e36SNobuhiro Iwamatsu 	if (port->type == PORT_SCIF || port->type == PORT_SCIFB) {\
363*3f6c8e36SNobuhiro Iwamatsu 		SCI_OUT(scif_size, scif_offset, value)\
364*3f6c8e36SNobuhiro Iwamatsu 	} else {	/* PORT_SCI or PORT_SCIFA */\
365*3f6c8e36SNobuhiro Iwamatsu 		SCI_OUT(sci_size, sci_offset, value);\
366*3f6c8e36SNobuhiro Iwamatsu 	}\
367*3f6c8e36SNobuhiro Iwamatsu }
368*3f6c8e36SNobuhiro Iwamatsu 
369*3f6c8e36SNobuhiro Iwamatsu #ifdef CONFIG_H8300
370*3f6c8e36SNobuhiro Iwamatsu /* h8300 don't have SCIF */
371*3f6c8e36SNobuhiro Iwamatsu #define CPU_SCIF_FNS(name)						\
372*3f6c8e36SNobuhiro Iwamatsu 	static inline unsigned int sci_##name##_in(struct uart_port *port) {\
373*3f6c8e36SNobuhiro Iwamatsu 		return 0;\
374*3f6c8e36SNobuhiro Iwamatsu 	}\
375*3f6c8e36SNobuhiro Iwamatsu 	static inline void sci_##name##_out(struct uart_port *port,\
376*3f6c8e36SNobuhiro Iwamatsu 					unsigned int value) {\
377*3f6c8e36SNobuhiro Iwamatsu 	}
378*3f6c8e36SNobuhiro Iwamatsu #else
379*3f6c8e36SNobuhiro Iwamatsu #define CPU_SCIF_FNS(name, scif_offset, scif_size)			\
380*3f6c8e36SNobuhiro Iwamatsu 	static inline unsigned int sci_##name##_in(struct uart_port *port) {\
381*3f6c8e36SNobuhiro Iwamatsu 		SCI_IN(scif_size, scif_offset);\
382*3f6c8e36SNobuhiro Iwamatsu 	}\
383*3f6c8e36SNobuhiro Iwamatsu 	static inline void sci_##name##_out(struct uart_port *port,\
384*3f6c8e36SNobuhiro Iwamatsu 					unsigned int value) {\
385*3f6c8e36SNobuhiro Iwamatsu 		SCI_OUT(scif_size, scif_offset, value);\
386*3f6c8e36SNobuhiro Iwamatsu 	}
387*3f6c8e36SNobuhiro Iwamatsu #endif
388*3f6c8e36SNobuhiro Iwamatsu 
389*3f6c8e36SNobuhiro Iwamatsu #define CPU_SCI_FNS(name, sci_offset, sci_size)\
390*3f6c8e36SNobuhiro Iwamatsu 	static inline unsigned int sci_##name##_in(struct uart_port *port) {\
391*3f6c8e36SNobuhiro Iwamatsu 		SCI_IN(sci_size, sci_offset);\
392*3f6c8e36SNobuhiro Iwamatsu 	}\
393*3f6c8e36SNobuhiro Iwamatsu 	static inline void sci_##name##_out(struct uart_port *port,\
394*3f6c8e36SNobuhiro Iwamatsu 					unsigned int value) {\
395*3f6c8e36SNobuhiro Iwamatsu 		SCI_OUT(sci_size, sci_offset, value);\
396*3f6c8e36SNobuhiro Iwamatsu 	}
397*3f6c8e36SNobuhiro Iwamatsu 
398*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_SH3) || \
399*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7367) || \
400*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7377) || \
401*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7372)
402*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7710) || defined(CONFIG_CPU_SH7712)
403*3f6c8e36SNobuhiro Iwamatsu #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size,\
404*3f6c8e36SNobuhiro Iwamatsu 				sh4_sci_offset, sh4_sci_size, \
405*3f6c8e36SNobuhiro Iwamatsu 				sh3_scif_offset, sh3_scif_size, \
406*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size, \
407*3f6c8e36SNobuhiro Iwamatsu 				h8_sci_offset, h8_sci_size) \
408*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIx_FNS(name, sh4_sci_offset, sh4_sci_size,\
409*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size)
410*3f6c8e36SNobuhiro Iwamatsu #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size,\
411*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size) \
412*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
413*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7705) || \
414*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7720) || \
415*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7721) || \
416*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7367) || \
417*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7377)
418*3f6c8e36SNobuhiro Iwamatsu #define SCIF_FNS(name, scif_offset, scif_size) \
419*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIF_FNS(name, scif_offset, scif_size)
420*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_ARCH_SH7372)
421*3f6c8e36SNobuhiro Iwamatsu #define SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size,\
422*3f6c8e36SNobuhiro Iwamatsu 				sh4_scifb_offset, sh4_scifb_size) \
423*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size,\
424*3f6c8e36SNobuhiro Iwamatsu 				sh4_scifb_offset, sh4_scifb_size)
425*3f6c8e36SNobuhiro Iwamatsu #define SCIF_FNS(name, scif_offset, scif_size) \
426*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIF_FNS(name, scif_offset, scif_size)
427*3f6c8e36SNobuhiro Iwamatsu #else
428*3f6c8e36SNobuhiro Iwamatsu #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size,\
429*3f6c8e36SNobuhiro Iwamatsu 				sh4_sci_offset, sh4_sci_size, \
430*3f6c8e36SNobuhiro Iwamatsu 				sh3_scif_offset, sh3_scif_size,\
431*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size, \
432*3f6c8e36SNobuhiro Iwamatsu 				h8_sci_offset, h8_sci_size) \
433*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIx_FNS(name, sh3_sci_offset, sh3_sci_size,\
434*3f6c8e36SNobuhiro Iwamatsu 				sh3_scif_offset, sh3_scif_size)
435*3f6c8e36SNobuhiro Iwamatsu #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size,\
436*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size) \
437*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIF_FNS(name, sh3_scif_offset, sh3_scif_size)
438*3f6c8e36SNobuhiro Iwamatsu #endif
439*3f6c8e36SNobuhiro Iwamatsu #elif defined(__H8300H__) || defined(__H8300S__)
440*3f6c8e36SNobuhiro Iwamatsu #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size,\
441*3f6c8e36SNobuhiro Iwamatsu 				sh4_sci_offset, sh4_sci_size, \
442*3f6c8e36SNobuhiro Iwamatsu 				sh3_scif_offset, sh3_scif_size,\
443*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size, \
444*3f6c8e36SNobuhiro Iwamatsu 				h8_sci_offset, h8_sci_size) \
445*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCI_FNS(name, h8_sci_offset, h8_sci_size)
446*3f6c8e36SNobuhiro Iwamatsu #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size,\
447*3f6c8e36SNobuhiro Iwamatsu 					sh4_scif_offset, sh4_scif_size) \
448*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIF_FNS(name)
449*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7723) || defined(CONFIG_CPU_SH7724)
450*3f6c8e36SNobuhiro Iwamatsu 		#define SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size,\
451*3f6c8e36SNobuhiro Iwamatsu 					sh4_scif_offset, sh4_scif_size) \
452*3f6c8e36SNobuhiro Iwamatsu 			CPU_SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size,\
453*3f6c8e36SNobuhiro Iwamatsu 					sh4_scif_offset, sh4_scif_size)
454*3f6c8e36SNobuhiro Iwamatsu 		#define SCIF_FNS(name, sh4_scif_offset, sh4_scif_size) \
455*3f6c8e36SNobuhiro Iwamatsu 			CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
456*3f6c8e36SNobuhiro Iwamatsu #else
457*3f6c8e36SNobuhiro Iwamatsu #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size,\
458*3f6c8e36SNobuhiro Iwamatsu 				sh4_sci_offset, sh4_sci_size, \
459*3f6c8e36SNobuhiro Iwamatsu 				sh3_scif_offset, sh3_scif_size,\
460*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size, \
461*3f6c8e36SNobuhiro Iwamatsu 				h8_sci_offset, h8_sci_size) \
462*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIx_FNS(name, sh4_sci_offset, sh4_sci_size,\
463*3f6c8e36SNobuhiro Iwamatsu 					sh4_scif_offset, sh4_scif_size)
464*3f6c8e36SNobuhiro Iwamatsu #define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, \
465*3f6c8e36SNobuhiro Iwamatsu 				sh4_scif_offset, sh4_scif_size) \
466*3f6c8e36SNobuhiro Iwamatsu 	CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
467*3f6c8e36SNobuhiro Iwamatsu #endif
468*3f6c8e36SNobuhiro Iwamatsu 
469*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7705) || \
470*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7720) || \
471*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7721) || \
472*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7367) || \
473*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7377)
474*3f6c8e36SNobuhiro Iwamatsu 
475*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSMR,  0x00, 16)
476*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCBRR,  0x04,  8)
477*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSCR,  0x08, 16)
478*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCTDSR, 0x0c,  8)
479*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFER,  0x10, 16)
480*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCxSR,  0x14, 16)
481*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFCR,  0x18, 16)
482*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFDR,  0x1c, 16)
483*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCxTDR, 0x20,  8)
484*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCxRDR, 0x24,  8)
485*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCLSR,  0x00,  0)
486*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_ARCH_SH7372)
487*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSMR,  0x00, 16)
488*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCBRR,  0x04,  8)
489*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSCR,  0x08, 16)
490*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCTDSR, 0x0c, 16)
491*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFER,  0x10, 16)
492*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCxSR,  0x14, 16)
493*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFCR,  0x18, 16)
494*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFDR,  0x1c, 16)
495*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCTFDR, 0x38, 16)
496*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCRFDR, 0x3c, 16)
497*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxTDR, 0x20,  8, 0x40,  8)
498*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxRDR, 0x24,  8, 0x60,  8)
499*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCLSR,  0x00,  0)
500*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7723) ||\
501*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7724)
502*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCSMR,  0x00, 16, 0x00, 16)
503*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCBRR,  0x04,  8, 0x04,  8)
504*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCSCR,  0x08, 16, 0x08, 16)
505*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxTDR, 0x20,  8, 0x0c,  8)
506*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxSR,  0x14, 16, 0x10, 16)
507*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxRDR, 0x24,  8, 0x14,  8)
508*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCSPTR, 0,     0,    0,  0)
509*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCTDSR, 0x0c,  8)
510*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFER,  0x10, 16)
511*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFCR,  0x18, 16)
512*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFDR,  0x1c, 16)
513*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCLSR,  0x24, 16)
514*3f6c8e36SNobuhiro Iwamatsu #else
515*3f6c8e36SNobuhiro Iwamatsu /*      reg      SCI/SH3   SCI/SH4  SCIF/SH3   SCIF/SH4  SCI/H8*/
516*3f6c8e36SNobuhiro Iwamatsu /*      name     off  sz   off  sz   off  sz   off  sz   off  sz*/
517*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCSMR,  0x00,  8, 0x00,  8, 0x00,  8, 0x00, 16, 0x00,  8)
518*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCBRR,  0x02,  8, 0x04,  8, 0x02,  8, 0x04,  8, 0x01,  8)
519*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCSCR,  0x04,  8, 0x08,  8, 0x04,  8, 0x08, 16, 0x02,  8)
520*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxTDR, 0x06,  8, 0x0c,  8, 0x06,  8, 0x0C,  8, 0x03,  8)
521*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxSR,  0x08,  8, 0x10,  8, 0x08, 16, 0x10, 16, 0x04,  8)
522*3f6c8e36SNobuhiro Iwamatsu SCIx_FNS(SCxRDR, 0x0a,  8, 0x14,  8, 0x0A,  8, 0x14,  8, 0x05,  8)
523*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFCR,                      0x0c,  8, 0x18, 16)
524*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7760) || \
525*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7780) || \
526*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7785) || \
527*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7786)
528*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFDR,			     0x0e, 16, 0x1C, 16)
529*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCTFDR,		     0x0e, 16, 0x1C, 16)
530*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCRFDR,		     0x0e, 16, 0x20, 16)
531*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSPTR,			0,  0, 0x24, 16)
532*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCLSR,				0,  0, 0x28, 16)
533*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7763)
534*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFDR,				0,  0, 0x1C, 16)
535*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSPTR2,			0,  0, 0x20, 16)
536*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCLSR2,			0,  0, 0x24, 16)
537*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCTFDR,		     0x0e, 16, 0x1C, 16)
538*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCRFDR,		     0x0e, 16, 0x20, 16)
539*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSPTR,			0,  0, 0x24, 16)
540*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCLSR,				0,  0, 0x28, 16)
541*3f6c8e36SNobuhiro Iwamatsu #else
542*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCFDR,                      0x0e, 16, 0x1C, 16)
543*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7722)
544*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSPTR,                        0,  0, 0, 0)
545*3f6c8e36SNobuhiro Iwamatsu #else
546*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCSPTR,                        0,  0, 0x20, 16)
547*3f6c8e36SNobuhiro Iwamatsu #endif
548*3f6c8e36SNobuhiro Iwamatsu SCIF_FNS(SCLSR,                         0,  0, 0x24, 16)
549*3f6c8e36SNobuhiro Iwamatsu #endif
550*3f6c8e36SNobuhiro Iwamatsu #endif
551*3f6c8e36SNobuhiro Iwamatsu #define sci_in(port, reg) sci_##reg##_in(port)
552*3f6c8e36SNobuhiro Iwamatsu #define sci_out(port, reg, value) sci_##reg##_out(port, value)
553*3f6c8e36SNobuhiro Iwamatsu 
554*3f6c8e36SNobuhiro Iwamatsu /* H8/300 series SCI pins assignment */
555*3f6c8e36SNobuhiro Iwamatsu #if defined(__H8300H__) || defined(__H8300S__)
556*3f6c8e36SNobuhiro Iwamatsu static const struct __attribute__((packed)) {
557*3f6c8e36SNobuhiro Iwamatsu 	int port;             /* GPIO port no */
558*3f6c8e36SNobuhiro Iwamatsu 	unsigned short rx, tx; /* GPIO bit no */
559*3f6c8e36SNobuhiro Iwamatsu } h8300_sci_pins[] = {
560*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_H83007) || defined(CONFIG_H83068)
561*3f6c8e36SNobuhiro Iwamatsu 	{    /* SCI0 */
562*3f6c8e36SNobuhiro Iwamatsu 		.port = H8300_GPIO_P9,
563*3f6c8e36SNobuhiro Iwamatsu 		.rx   = H8300_GPIO_B2,
564*3f6c8e36SNobuhiro Iwamatsu 		.tx   = H8300_GPIO_B0,
565*3f6c8e36SNobuhiro Iwamatsu 	},
566*3f6c8e36SNobuhiro Iwamatsu 	{    /* SCI1 */
567*3f6c8e36SNobuhiro Iwamatsu 		.port = H8300_GPIO_P9,
568*3f6c8e36SNobuhiro Iwamatsu 		.rx   = H8300_GPIO_B3,
569*3f6c8e36SNobuhiro Iwamatsu 		.tx   = H8300_GPIO_B1,
570*3f6c8e36SNobuhiro Iwamatsu 	},
571*3f6c8e36SNobuhiro Iwamatsu 	{    /* SCI2 */
572*3f6c8e36SNobuhiro Iwamatsu 		.port = H8300_GPIO_PB,
573*3f6c8e36SNobuhiro Iwamatsu 		.rx   = H8300_GPIO_B7,
574*3f6c8e36SNobuhiro Iwamatsu 		.tx   = H8300_GPIO_B6,
575*3f6c8e36SNobuhiro Iwamatsu 	}
576*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_H8S2678)
577*3f6c8e36SNobuhiro Iwamatsu 	{    /* SCI0 */
578*3f6c8e36SNobuhiro Iwamatsu 		.port = H8300_GPIO_P3,
579*3f6c8e36SNobuhiro Iwamatsu 		.rx   = H8300_GPIO_B2,
580*3f6c8e36SNobuhiro Iwamatsu 		.tx   = H8300_GPIO_B0,
581*3f6c8e36SNobuhiro Iwamatsu 	},
582*3f6c8e36SNobuhiro Iwamatsu 	{    /* SCI1 */
583*3f6c8e36SNobuhiro Iwamatsu 		.port = H8300_GPIO_P3,
584*3f6c8e36SNobuhiro Iwamatsu 		.rx   = H8300_GPIO_B3,
585*3f6c8e36SNobuhiro Iwamatsu 		.tx   = H8300_GPIO_B1,
586*3f6c8e36SNobuhiro Iwamatsu 	},
587*3f6c8e36SNobuhiro Iwamatsu 	{    /* SCI2 */
588*3f6c8e36SNobuhiro Iwamatsu 		.port = H8300_GPIO_P5,
589*3f6c8e36SNobuhiro Iwamatsu 		.rx   = H8300_GPIO_B1,
590*3f6c8e36SNobuhiro Iwamatsu 		.tx   = H8300_GPIO_B0,
591*3f6c8e36SNobuhiro Iwamatsu 	}
592*3f6c8e36SNobuhiro Iwamatsu #endif
593*3f6c8e36SNobuhiro Iwamatsu };
594*3f6c8e36SNobuhiro Iwamatsu #endif
595*3f6c8e36SNobuhiro Iwamatsu 
596*3f6c8e36SNobuhiro Iwamatsu #if defined(CONFIG_CPU_SH7706) || \
597*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7707) || \
598*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7708) || \
599*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7709)
600*3f6c8e36SNobuhiro Iwamatsu static inline int sci_rxd_in(struct uart_port *port)
601*3f6c8e36SNobuhiro Iwamatsu {
602*3f6c8e36SNobuhiro Iwamatsu 	if (port->mapbase == 0xfffffe80)
603*3f6c8e36SNobuhiro Iwamatsu 		return __raw_readb(SCPDR)&0x01 ? 1 : 0; /* SCI */
604*3f6c8e36SNobuhiro Iwamatsu 	return 1;
605*3f6c8e36SNobuhiro Iwamatsu }
606*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7750)  || \
607*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7751)  || \
608*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7751R) || \
609*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7750R) || \
610*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7750S) || \
611*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7091)
612*3f6c8e36SNobuhiro Iwamatsu static inline int sci_rxd_in(struct uart_port *port)
613*3f6c8e36SNobuhiro Iwamatsu {
614*3f6c8e36SNobuhiro Iwamatsu 	if (port->mapbase == 0xffe00000)
615*3f6c8e36SNobuhiro Iwamatsu 		return __raw_readb(SCSPTR1)&0x01 ? 1 : 0; /* SCI */
616*3f6c8e36SNobuhiro Iwamatsu 	return 1;
617*3f6c8e36SNobuhiro Iwamatsu }
618*3f6c8e36SNobuhiro Iwamatsu #elif defined(__H8300H__) || defined(__H8300S__)
619*3f6c8e36SNobuhiro Iwamatsu static inline int sci_rxd_in(struct uart_port *port)
620*3f6c8e36SNobuhiro Iwamatsu {
621*3f6c8e36SNobuhiro Iwamatsu 	int ch = (port->mapbase - SMR0) >> 3;
622*3f6c8e36SNobuhiro Iwamatsu 	return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0;
623*3f6c8e36SNobuhiro Iwamatsu }
624*3f6c8e36SNobuhiro Iwamatsu #else /* default case for non-SCI processors */
625*3f6c8e36SNobuhiro Iwamatsu static inline int sci_rxd_in(struct uart_port *port)
626*3f6c8e36SNobuhiro Iwamatsu {
627*3f6c8e36SNobuhiro Iwamatsu 	return 1;
628*3f6c8e36SNobuhiro Iwamatsu }
629*3f6c8e36SNobuhiro Iwamatsu #endif
630*3f6c8e36SNobuhiro Iwamatsu 
631*3f6c8e36SNobuhiro Iwamatsu /*
632*3f6c8e36SNobuhiro Iwamatsu  * Values for the BitRate Register (SCBRR)
633*3f6c8e36SNobuhiro Iwamatsu  *
634*3f6c8e36SNobuhiro Iwamatsu  * The values are actually divisors for a frequency which can
635*3f6c8e36SNobuhiro Iwamatsu  * be internal to the SH3 (14.7456MHz) or derived from an external
636*3f6c8e36SNobuhiro Iwamatsu  * clock source.  This driver assumes the internal clock is used;
637*3f6c8e36SNobuhiro Iwamatsu  * to support using an external clock source, config options or
638*3f6c8e36SNobuhiro Iwamatsu  * possibly command-line options would need to be added.
639*3f6c8e36SNobuhiro Iwamatsu  *
640*3f6c8e36SNobuhiro Iwamatsu  * Also, to support speeds below 2400 (why?) the lower 2 bits of
641*3f6c8e36SNobuhiro Iwamatsu  * the SCSMR register would also need to be set to non-zero values.
642*3f6c8e36SNobuhiro Iwamatsu  *
643*3f6c8e36SNobuhiro Iwamatsu  * -- Greg Banks 27Feb2000
644*3f6c8e36SNobuhiro Iwamatsu  *
645*3f6c8e36SNobuhiro Iwamatsu  * Answer: The SCBRR register is only eight bits, and the value in
646*3f6c8e36SNobuhiro Iwamatsu  * it gets larger with lower baud rates. At around 2400 (depending on
647*3f6c8e36SNobuhiro Iwamatsu  * the peripherial module clock) you run out of bits. However the
648*3f6c8e36SNobuhiro Iwamatsu  * lower two bits of SCSMR allow the module clock to be divided down,
649*3f6c8e36SNobuhiro Iwamatsu  * scaling the value which is needed in SCBRR.
650*3f6c8e36SNobuhiro Iwamatsu  *
651*3f6c8e36SNobuhiro Iwamatsu  * -- Stuart Menefy - 23 May 2000
652*3f6c8e36SNobuhiro Iwamatsu  *
653*3f6c8e36SNobuhiro Iwamatsu  * I meant, why would anyone bother with bitrates below 2400.
654*3f6c8e36SNobuhiro Iwamatsu  *
655*3f6c8e36SNobuhiro Iwamatsu  * -- Greg Banks - 7Jul2000
656*3f6c8e36SNobuhiro Iwamatsu  *
657*3f6c8e36SNobuhiro Iwamatsu  * You "speedist"!  How will I use my 110bps ASR-33 teletype with paper
658*3f6c8e36SNobuhiro Iwamatsu  * tape reader as a console!
659*3f6c8e36SNobuhiro Iwamatsu  *
660*3f6c8e36SNobuhiro Iwamatsu  * -- Mitch Davis - 15 Jul 2000
661*3f6c8e36SNobuhiro Iwamatsu  */
662*3f6c8e36SNobuhiro Iwamatsu 
663*3f6c8e36SNobuhiro Iwamatsu #if (defined(CONFIG_CPU_SH7780)  || \
664*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7785)  || \
665*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7786)) && \
666*3f6c8e36SNobuhiro Iwamatsu 	!defined(CONFIG_SH_SH2007)
667*3f6c8e36SNobuhiro Iwamatsu #define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(16*bps)-1)
668*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7705) || \
669*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7720) || \
670*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7721) || \
671*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7367) || \
672*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7377) || \
673*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_ARCH_SH7372)
674*3f6c8e36SNobuhiro Iwamatsu #define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1)
675*3f6c8e36SNobuhiro Iwamatsu #elif defined(CONFIG_CPU_SH7723) ||\
676*3f6c8e36SNobuhiro Iwamatsu 	defined(CONFIG_CPU_SH7724)
677*3f6c8e36SNobuhiro Iwamatsu static inline int scbrr_calc(struct uart_port *port, int bps, int clk)
678*3f6c8e36SNobuhiro Iwamatsu {
679*3f6c8e36SNobuhiro Iwamatsu 	if (port->type == PORT_SCIF)
680*3f6c8e36SNobuhiro Iwamatsu 		return (clk+16*bps)/(32*bps)-1;
681*3f6c8e36SNobuhiro Iwamatsu 	else
682*3f6c8e36SNobuhiro Iwamatsu 		return ((clk*2)+16*bps)/(16*bps)-1;
683*3f6c8e36SNobuhiro Iwamatsu }
684*3f6c8e36SNobuhiro Iwamatsu #define SCBRR_VALUE(bps, clk) scbrr_calc(port, bps, clk)
685*3f6c8e36SNobuhiro Iwamatsu #elif defined(__H8300H__) || defined(__H8300S__)
686*3f6c8e36SNobuhiro Iwamatsu #define SCBRR_VALUE(bps, clk) (((clk*1000/32)/bps)-1)
687*3f6c8e36SNobuhiro Iwamatsu #else /* Generic SH */
688*3f6c8e36SNobuhiro Iwamatsu #define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
689*3f6c8e36SNobuhiro Iwamatsu #endif
690