1#include <linux/serial_core.h>
2#include <asm/io.h>
3#include <asm/gpio.h>
4
5#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
6#include <asm/regs306x.h>
7#endif
8#if defined(CONFIG_H8S2678)
9#include <asm/regs267x.h>
10#endif
11
12#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
13 defined(CONFIG_CPU_SUBTYPE_SH7707) || \
14 defined(CONFIG_CPU_SUBTYPE_SH7708) || \
15 defined(CONFIG_CPU_SUBTYPE_SH7709)
16# define SCPCR 0xA4000116
17# define SCPDR 0xA4000136
18# define SCSCR_INIT(port) 0x30
19#elif defined(CONFIG_CPU_SUBTYPE_SH7705)
20# define SCIF0 0xA4400000
21# define SCIF2 0xA4410000
22# define SCSMR_Ir 0xA44A0000
23# define IRDA_SCIF SCIF0
24# define SCPCR 0xA4000116
25# define SCPDR 0xA4000136
26
27
28
29
30
31# define SCSCR_INIT(port) (port->mapbase == SCIF2) ? 0xF3 : 0xF0
32#elif defined(CONFIG_CPU_SUBTYPE_SH7720) || \
33 defined(CONFIG_CPU_SUBTYPE_SH7721)
34# define SCSCR_INIT(port) 0x0030
35#define SCIF_ORER 0x0200
36#elif defined(CONFIG_SH_RTS7751R2D)
37# define SCSPTR1 0xFFE0001C
38# define SCSPTR2 0xFFE80020
39# define SCIF_ORER 0x0001
40# define SCSCR_INIT(port) 0x3a
41#elif defined(CONFIG_CPU_SUBTYPE_SH7750) || \
42 defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
43 defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
44 defined(CONFIG_CPU_SUBTYPE_SH7091) || \
45 defined(CONFIG_CPU_SUBTYPE_SH7751) || \
46 defined(CONFIG_CPU_SUBTYPE_SH7751R)
47# define SCSPTR1 0xffe0001c
48# define SCSPTR2 0xFFE80020
49# define SCIF_ORER 0x0001
50# define SCSCR_INIT(port) (((port)->type == PORT_SCI) ? \
51 0x30 : \
52 0x38 )
53#elif defined(CONFIG_CPU_SUBTYPE_SH7760)
54# define SCSPTR0 0xfe600024
55# define SCSPTR1 0xfe610024
56# define SCSPTR2 0xfe620024
57# define SCIF_ORER 0x0001
58# define SCSCR_INIT(port) 0x38
59#elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
60# define SCSPTR0 0xA4400000
61# define SCIF_ORER 0x0001
62# define PACR 0xa4050100
63# define PBCR 0xa4050102
64# define SCSCR_INIT(port) 0x3B
65#elif defined(CONFIG_CPU_SUBTYPE_SH7343)
66# define SCSPTR0 0xffe00010
67# define SCSPTR1 0xffe10010
68# define SCSPTR2 0xffe20010
69# define SCSPTR3 0xffe30010
70# define SCSCR_INIT(port) 0x32
71#elif defined(CONFIG_CPU_SUBTYPE_SH7722)
72# define PADR 0xA4050120
73# define PSDR 0xA405013e
74# define PWDR 0xA4050166
75# define PSCR 0xA405011E
76# define SCIF_ORER 0x0001
77# define SCSCR_INIT(port) 0x0038
78#elif defined(CONFIG_CPU_SUBTYPE_SH7366)
79# define SCPDR0 0xA405013E
80# define SCSPTR0 SCPDR0
81# define SCIF_ORER 0x0001
82# define SCSCR_INIT(port) 0x0038
83#elif defined(CONFIG_CPU_SUBTYPE_SH7723)
84# define SCSPTR0 0xa4050160
85# define SCSPTR1 0xa405013e
86# define SCSPTR2 0xa4050160
87# define SCSPTR3 0xa405013e
88# define SCSPTR4 0xa4050128
89# define SCSPTR5 0xa4050128
90# define SCIF_ORER 0x0001
91# define SCSCR_INIT(port) 0x0038
92#elif defined(CONFIG_CPU_SUBTYPE_SH4_202)
93# define SCSPTR2 0xffe80020
94# define SCIF_ORER 0x0001
95# define SCSCR_INIT(port) 0x38
96#elif defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103)
97# define SCIF_BASE_ADDR 0x01030000
98# define SCIF_ADDR_SH5 PHYS_PERIPHERAL_BLOCK+SCIF_BASE_ADDR
99# define SCIF_PTR2_OFFS 0x0000020
100# define SCIF_LSR2_OFFS 0x0000024
101# define SCSPTR2 ((port->mapbase)+SCIF_PTR2_OFFS)
102# define SCLSR2 ((port->mapbase)+SCIF_LSR2_OFFS)
103# define SCSCR_INIT(port) 0x38
104#elif defined(CONFIG_H83007) || defined(CONFIG_H83068)
105# define SCSCR_INIT(port) 0x30
106# define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port)
107#elif defined(CONFIG_H8S2678)
108# define SCSCR_INIT(port) 0x30
109# define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port)
110#elif defined(CONFIG_CPU_SUBTYPE_SH7763)
111# define SCSPTR0 0xffe00024
112# define SCSPTR1 0xffe08024
113# define SCSPTR2 0xffe10020
114# define SCIF_ORER 0x0001
115# define SCSCR_INIT(port) 0x38
116#elif defined(CONFIG_CPU_SUBTYPE_SH7770)
117# define SCSPTR0 0xff923020
118# define SCSPTR1 0xff924020
119# define SCSPTR2 0xff925020
120# define SCIF_ORER 0x0001
121# define SCSCR_INIT(port) 0x3c
122#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
123# define SCSPTR0 0xffe00024
124# define SCSPTR1 0xffe10024
125# define SCIF_ORER 0x0001
126# define SCSCR_INIT(port) 0x3a
127#elif defined(CONFIG_CPU_SUBTYPE_SH7785)
128# define SCSPTR0 0xffea0024
129# define SCSPTR1 0xffeb0024
130# define SCSPTR2 0xffec0024
131# define SCSPTR3 0xffed0024
132# define SCSPTR4 0xffee0024
133# define SCSPTR5 0xffef0024
134# define SCIF_OPER 0x0001
135# define SCSCR_INIT(port) 0x3a
136#elif defined(CONFIG_CPU_SUBTYPE_SH7203) || \
137 defined(CONFIG_CPU_SUBTYPE_SH7206) || \
138 defined(CONFIG_CPU_SUBTYPE_SH7263)
139# define SCSPTR0 0xfffe8020
140# define SCSPTR1 0xfffe8820
141# define SCSPTR2 0xfffe9020
142# define SCSPTR3 0xfffe9820
143# define SCSCR_INIT(port) 0x38
144#elif defined(CONFIG_CPU_SUBTYPE_SH7619)
145# define SCSPTR0 0xf8400020
146# define SCSPTR1 0xf8410020
147# define SCSPTR2 0xf8420020
148# define SCIF_ORER 0x0001
149# define SCSCR_INIT(port) 0x38
150#elif defined(CONFIG_CPU_SUBTYPE_SHX3)
151# define SCSPTR0 0xffc30020
152# define SCSPTR1 0xffc40020
153# define SCSPTR2 0xffc50020
154# define SCSPTR3 0xffc60020
155# define SCIF_ORER 0x0001
156# define SCSCR_INIT(port) 0x38
157#else
158# error CPU subtype not defined
159#endif
160
161
162#define SCI_CTRL_FLAGS_TIE 0x80
163#define SCI_CTRL_FLAGS_RIE 0x40
164#define SCI_CTRL_FLAGS_TE 0x20
165#define SCI_CTRL_FLAGS_RE 0x10
166#if defined(CONFIG_CPU_SUBTYPE_SH7750) || \
167 defined(CONFIG_CPU_SUBTYPE_SH7091) || \
168 defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
169 defined(CONFIG_CPU_SUBTYPE_SH7722) || \
170 defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
171 defined(CONFIG_CPU_SUBTYPE_SH7751) || \
172 defined(CONFIG_CPU_SUBTYPE_SH7751R) || \
173 defined(CONFIG_CPU_SUBTYPE_SH7763) || \
174 defined(CONFIG_CPU_SUBTYPE_SH7780) || \
175 defined(CONFIG_CPU_SUBTYPE_SH7785) || \
176 defined(CONFIG_CPU_SUBTYPE_SHX3)
177#define SCI_CTRL_FLAGS_REIE 0x08
178#else
179#define SCI_CTRL_FLAGS_REIE 0
180#endif
181
182
183
184
185
186
187#define SCI_TDRE 0x80
188#define SCI_RDRF 0x40
189#define SCI_ORER 0x20
190#define SCI_FER 0x10
191#define SCI_PER 0x08
192#define SCI_TEND 0x04
193
194
195
196#define SCI_ERRORS ( SCI_PER | SCI_FER | SCI_ORER)
197
198
199#define SCIF_ER 0x0080
200#define SCIF_TEND 0x0040
201#define SCIF_TDFE 0x0020
202#define SCIF_BRK 0x0010
203#define SCIF_FER 0x0008
204#define SCIF_PER 0x0004
205#define SCIF_RDF 0x0002
206#define SCIF_DR 0x0001
207
208#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
209 defined(CONFIG_CPU_SUBTYPE_SH7720) || \
210 defined(CONFIG_CPU_SUBTYPE_SH7721)
211# define SCIF_ORER 0x0200
212# define SCIF_ERRORS ( SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK | SCIF_ORER)
213# define SCIF_RFDC_MASK 0x007f
214# define SCIF_TXROOM_MAX 64
215#elif defined(CONFIG_CPU_SUBTYPE_SH7763)
216# define SCIF_ERRORS ( SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK )
217# define SCIF_RFDC_MASK 0x007f
218# define SCIF_TXROOM_MAX 64
219
220# define SCIF2_RFDC_MASK 0x001f
221# define SCIF2_TXROOM_MAX 16
222#else
223# define SCIF_ERRORS ( SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK)
224# define SCIF_RFDC_MASK 0x001f
225# define SCIF_TXROOM_MAX 16
226#endif
227
228#define SCxSR_TEND(port) (((port)->type == PORT_SCI) ? SCI_TEND : SCIF_TEND)
229#define SCxSR_ERRORS(port) (((port)->type == PORT_SCI) ? SCI_ERRORS : SCIF_ERRORS)
230#define SCxSR_RDxF(port) (((port)->type == PORT_SCI) ? SCI_RDRF : SCIF_RDF)
231#define SCxSR_TDxE(port) (((port)->type == PORT_SCI) ? SCI_TDRE : SCIF_TDFE)
232#define SCxSR_FER(port) (((port)->type == PORT_SCI) ? SCI_FER : SCIF_FER)
233#define SCxSR_PER(port) (((port)->type == PORT_SCI) ? SCI_PER : SCIF_PER)
234#define SCxSR_BRK(port) (((port)->type == PORT_SCI) ? 0x00 : SCIF_BRK)
235
236#if defined(CONFIG_CPU_SUBTYPE_SH7705)
237# define SCxSR_ORER(port) (((port)->type == PORT_SCI) ? SCI_ORER : SCIF_ORER)
238#else
239# define SCxSR_ORER(port) (((port)->type == PORT_SCI) ? SCI_ORER : 0x0000)
240#endif
241
242#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
243 defined(CONFIG_CPU_SUBTYPE_SH7720) || \
244 defined(CONFIG_CPU_SUBTYPE_SH7721)
245# define SCxSR_RDxF_CLEAR(port) (sci_in(port, SCxSR) & 0xfffc)
246# define SCxSR_ERROR_CLEAR(port) (sci_in(port, SCxSR) & 0xfd73)
247# define SCxSR_TDxE_CLEAR(port) (sci_in(port, SCxSR) & 0xffdf)
248# define SCxSR_BREAK_CLEAR(port) (sci_in(port, SCxSR) & 0xffe3)
249#else
250# define SCxSR_RDxF_CLEAR(port) (((port)->type == PORT_SCI) ? 0xbc : 0x00fc)
251# define SCxSR_ERROR_CLEAR(port) (((port)->type == PORT_SCI) ? 0xc4 : 0x0073)
252# define SCxSR_TDxE_CLEAR(port) (((port)->type == PORT_SCI) ? 0x78 : 0x00df)
253# define SCxSR_BREAK_CLEAR(port) (((port)->type == PORT_SCI) ? 0xc4 : 0x00e3)
254#endif
255
256
257#define SCFCR_RFRST 0x0002
258#define SCFCR_TFRST 0x0004
259#define SCFCR_TCRST 0x4000
260#define SCFCR_MCE 0x0008
261
262#define SCI_MAJOR 204
263#define SCI_MINOR_START 8
264
265
266#define SCI_RX_THROTTLE 0x0000001
267
268#define SCI_MAGIC 0xbabeface
269
270
271
272
273
274#define SCI_EVENT_WRITE_WAKEUP 0
275
276#define SCI_IN(size, offset) \
277 if ((size) == 8) { \
278 return ioread8(port->membase + (offset)); \
279 } else { \
280 return ioread16(port->membase + (offset)); \
281 }
282#define SCI_OUT(size, offset, value) \
283 if ((size) == 8) { \
284 iowrite8(value, port->membase + (offset)); \
285 } else if ((size) == 16) { \
286 iowrite16(value, port->membase + (offset)); \
287 }
288
289#define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\
290 static inline unsigned int sci_##name##_in(struct uart_port *port) \
291 { \
292 if (port->type == PORT_SCIF) { \
293 SCI_IN(scif_size, scif_offset) \
294 } else { \
295 SCI_IN(sci_size, sci_offset); \
296 } \
297 } \
298 static inline void sci_##name##_out(struct uart_port *port, unsigned int value) \
299 { \
300 if (port->type == PORT_SCIF) { \
301 SCI_OUT(scif_size, scif_offset, value) \
302 } else { \
303 SCI_OUT(sci_size, sci_offset, value); \
304 } \
305 }
306
307#define CPU_SCIF_FNS(name, scif_offset, scif_size) \
308 static inline unsigned int sci_##name##_in(struct uart_port *port) \
309 { \
310 SCI_IN(scif_size, scif_offset); \
311 } \
312 static inline void sci_##name##_out(struct uart_port *port, unsigned int value) \
313 { \
314 SCI_OUT(scif_size, scif_offset, value); \
315 }
316
317#define CPU_SCI_FNS(name, sci_offset, sci_size) \
318 static inline unsigned int sci_##name##_in(struct uart_port* port) \
319 { \
320 SCI_IN(sci_size, sci_offset); \
321 } \
322 static inline void sci_##name##_out(struct uart_port* port, unsigned int value) \
323 { \
324 SCI_OUT(sci_size, sci_offset, value); \
325 }
326
327#ifdef CONFIG_CPU_SH3
328#if defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
329#define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \
330 sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \
331 h8_sci_offset, h8_sci_size) \
332 CPU_SCIx_FNS(name, sh4_sci_offset, sh4_sci_size, sh4_scif_offset, sh4_scif_size)
333#define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) \
334 CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
335#elif defined(CONFIG_CPU_SUBTYPE_SH7705) || \
336 defined(CONFIG_CPU_SUBTYPE_SH7720) || \
337 defined(CONFIG_CPU_SUBTYPE_SH7721)
338#define SCIF_FNS(name, scif_offset, scif_size) \
339 CPU_SCIF_FNS(name, scif_offset, scif_size)
340#else
341#define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \
342 sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \
343 h8_sci_offset, h8_sci_size) \
344 CPU_SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh3_scif_offset, sh3_scif_size)
345#define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) \
346 CPU_SCIF_FNS(name, sh3_scif_offset, sh3_scif_size)
347#endif
348#elif defined(__H8300H__) || defined(__H8300S__)
349#define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \
350 sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \
351 h8_sci_offset, h8_sci_size) \
352 CPU_SCI_FNS(name, h8_sci_offset, h8_sci_size)
353#define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size)
354#elif defined(CONFIG_CPU_SUBTYPE_SH7723)
355 #define SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size, sh4_scif_offset, sh4_scif_size) \
356 CPU_SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size, sh4_scif_offset, sh4_scif_size)
357 #define SCIF_FNS(name, sh4_scif_offset, sh4_scif_size) \
358 CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
359#else
360#define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \
361 sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \
362 h8_sci_offset, h8_sci_size) \
363 CPU_SCIx_FNS(name, sh4_sci_offset, sh4_sci_size, sh4_scif_offset, sh4_scif_size)
364#define SCIF_FNS(name, sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size) \
365 CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
366#endif
367
368#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
369 defined(CONFIG_CPU_SUBTYPE_SH7720) || \
370 defined(CONFIG_CPU_SUBTYPE_SH7721)
371
372SCIF_FNS(SCSMR, 0x00, 16)
373SCIF_FNS(SCBRR, 0x04, 8)
374SCIF_FNS(SCSCR, 0x08, 16)
375SCIF_FNS(SCTDSR, 0x0c, 8)
376SCIF_FNS(SCFER, 0x10, 16)
377SCIF_FNS(SCxSR, 0x14, 16)
378SCIF_FNS(SCFCR, 0x18, 16)
379SCIF_FNS(SCFDR, 0x1c, 16)
380SCIF_FNS(SCxTDR, 0x20, 8)
381SCIF_FNS(SCxRDR, 0x24, 8)
382SCIF_FNS(SCLSR, 0x24, 16)
383#elif defined(CONFIG_CPU_SUBTYPE_SH7723)
384SCIx_FNS(SCSMR, 0x00, 16, 0x00, 16)
385SCIx_FNS(SCBRR, 0x04, 8, 0x04, 8)
386SCIx_FNS(SCSCR, 0x08, 16, 0x08, 16)
387SCIx_FNS(SCxTDR, 0x20, 8, 0x0c, 8)
388SCIx_FNS(SCxSR, 0x14, 16, 0x10, 16)
389SCIx_FNS(SCxRDR, 0x24, 8, 0x14, 8)
390SCIF_FNS(SCTDSR, 0x0c, 8)
391SCIF_FNS(SCFER, 0x10, 16)
392SCIF_FNS(SCFCR, 0x18, 16)
393SCIF_FNS(SCFDR, 0x1c, 16)
394SCIF_FNS(SCLSR, 0x24, 16)
395#else
396
397
398SCIx_FNS(SCSMR, 0x00, 8, 0x00, 8, 0x00, 8, 0x00, 16, 0x00, 8)
399SCIx_FNS(SCBRR, 0x02, 8, 0x04, 8, 0x02, 8, 0x04, 8, 0x01, 8)
400SCIx_FNS(SCSCR, 0x04, 8, 0x08, 8, 0x04, 8, 0x08, 16, 0x02, 8)
401SCIx_FNS(SCxTDR, 0x06, 8, 0x0c, 8, 0x06, 8, 0x0C, 8, 0x03, 8)
402SCIx_FNS(SCxSR, 0x08, 8, 0x10, 8, 0x08, 16, 0x10, 16, 0x04, 8)
403SCIx_FNS(SCxRDR, 0x0a, 8, 0x14, 8, 0x0A, 8, 0x14, 8, 0x05, 8)
404SCIF_FNS(SCFCR, 0x0c, 8, 0x18, 16)
405#if defined(CONFIG_CPU_SUBTYPE_SH7760) || \
406 defined(CONFIG_CPU_SUBTYPE_SH7780) || \
407 defined(CONFIG_CPU_SUBTYPE_SH7785)
408SCIF_FNS(SCFDR, 0x0e, 16, 0x1C, 16)
409SCIF_FNS(SCTFDR, 0x0e, 16, 0x1C, 16)
410SCIF_FNS(SCRFDR, 0x0e, 16, 0x20, 16)
411SCIF_FNS(SCSPTR, 0, 0, 0x24, 16)
412SCIF_FNS(SCLSR, 0, 0, 0x28, 16)
413#elif defined(CONFIG_CPU_SUBTYPE_SH7763)
414SCIF_FNS(SCFDR, 0, 0, 0x1C, 16)
415SCIF_FNS(SCSPTR2, 0, 0, 0x20, 16)
416SCIF_FNS(SCLSR2, 0, 0, 0x24, 16)
417SCIF_FNS(SCTFDR, 0x0e, 16, 0x1C, 16)
418SCIF_FNS(SCRFDR, 0x0e, 16, 0x20, 16)
419SCIF_FNS(SCSPTR, 0, 0, 0x24, 16)
420SCIF_FNS(SCLSR, 0, 0, 0x28, 16)
421#else
422SCIF_FNS(SCFDR, 0x0e, 16, 0x1C, 16)
423#if defined(CONFIG_CPU_SUBTYPE_SH7722)
424SCIF_FNS(SCSPTR, 0, 0, 0, 0)
425#else
426SCIF_FNS(SCSPTR, 0, 0, 0x20, 16)
427#endif
428SCIF_FNS(SCLSR, 0, 0, 0x24, 16)
429#endif
430#endif
431#define sci_in(port, reg) sci_##reg##_in(port)
432#define sci_out(port, reg, value) sci_##reg##_out(port, value)
433
434
435#if defined(__H8300H__) || defined(__H8300S__)
436static const struct __attribute__((packed)) {
437 int port;
438 unsigned short rx,tx;
439} h8300_sci_pins[] = {
440#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
441 {
442 .port = H8300_GPIO_P9,
443 .rx = H8300_GPIO_B2,
444 .tx = H8300_GPIO_B0,
445 },
446 {
447 .port = H8300_GPIO_P9,
448 .rx = H8300_GPIO_B3,
449 .tx = H8300_GPIO_B1,
450 },
451 {
452 .port = H8300_GPIO_PB,
453 .rx = H8300_GPIO_B7,
454 .tx = H8300_GPIO_B6,
455 }
456#elif defined(CONFIG_H8S2678)
457 {
458 .port = H8300_GPIO_P3,
459 .rx = H8300_GPIO_B2,
460 .tx = H8300_GPIO_B0,
461 },
462 {
463 .port = H8300_GPIO_P3,
464 .rx = H8300_GPIO_B3,
465 .tx = H8300_GPIO_B1,
466 },
467 {
468 .port = H8300_GPIO_P5,
469 .rx = H8300_GPIO_B1,
470 .tx = H8300_GPIO_B0,
471 }
472#endif
473};
474#endif
475
476#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
477 defined(CONFIG_CPU_SUBTYPE_SH7707) || \
478 defined(CONFIG_CPU_SUBTYPE_SH7708) || \
479 defined(CONFIG_CPU_SUBTYPE_SH7709)
480static inline int sci_rxd_in(struct uart_port *port)
481{
482 if (port->mapbase == 0xfffffe80)
483 return ctrl_inb(SCPDR)&0x01 ? 1 : 0;
484 if (port->mapbase == 0xa4000150)
485 return ctrl_inb(SCPDR)&0x10 ? 1 : 0;
486 if (port->mapbase == 0xa4000140)
487 return ctrl_inb(SCPDR)&0x04 ? 1 : 0;
488 return 1;
489}
490#elif defined(CONFIG_CPU_SUBTYPE_SH7705)
491static inline int sci_rxd_in(struct uart_port *port)
492{
493 if (port->mapbase == SCIF0)
494 return ctrl_inb(SCPDR)&0x04 ? 1 : 0;
495 if (port->mapbase == SCIF2)
496 return ctrl_inb(SCPDR)&0x10 ? 1 : 0;
497 return 1;
498}
499#elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
500static inline int sci_rxd_in(struct uart_port *port)
501{
502 return sci_in(port,SCxSR)&0x0010 ? 1 : 0;
503}
504static inline void set_sh771x_scif_pfc(struct uart_port *port)
505{
506 if (port->mapbase == 0xA4400000){
507 ctrl_outw(ctrl_inw(PACR)&0xffc0,PACR);
508 ctrl_outw(ctrl_inw(PBCR)&0x0fff,PBCR);
509 return;
510 }
511 if (port->mapbase == 0xA4410000){
512 ctrl_outw(ctrl_inw(PBCR)&0xf003,PBCR);
513 return;
514 }
515}
516#elif defined(CONFIG_CPU_SUBTYPE_SH7720) || \
517 defined(CONFIG_CPU_SUBTYPE_SH7721)
518static inline int sci_rxd_in(struct uart_port *port)
519{
520 if (port->mapbase == 0xa4430000)
521 return sci_in(port, SCxSR) & 0x0003 ? 1 : 0;
522 else if (port->mapbase == 0xa4438000)
523 return sci_in(port, SCxSR) & 0x0003 ? 1 : 0;
524 return 1;
525}
526#elif defined(CONFIG_CPU_SUBTYPE_SH7750) || \
527 defined(CONFIG_CPU_SUBTYPE_SH7751) || \
528 defined(CONFIG_CPU_SUBTYPE_SH7751R) || \
529 defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
530 defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
531 defined(CONFIG_CPU_SUBTYPE_SH7091)
532static inline int sci_rxd_in(struct uart_port *port)
533{
534 if (port->mapbase == 0xffe00000)
535 return ctrl_inb(SCSPTR1)&0x01 ? 1 : 0;
536 if (port->mapbase == 0xffe80000)
537 return ctrl_inw(SCSPTR2)&0x0001 ? 1 : 0;
538 return 1;
539}
540#elif defined(CONFIG_CPU_SUBTYPE_SH4_202)
541static inline int sci_rxd_in(struct uart_port *port)
542{
543 if (port->mapbase == 0xffe80000)
544 return ctrl_inw(SCSPTR2)&0x0001 ? 1 : 0;
545 return 1;
546}
547#elif defined(CONFIG_CPU_SUBTYPE_SH7760)
548static inline int sci_rxd_in(struct uart_port *port)
549{
550 if (port->mapbase == 0xfe600000)
551 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
552 if (port->mapbase == 0xfe610000)
553 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
554 if (port->mapbase == 0xfe620000)
555 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
556 return 1;
557}
558#elif defined(CONFIG_CPU_SUBTYPE_SH7343)
559static inline int sci_rxd_in(struct uart_port *port)
560{
561 if (port->mapbase == 0xffe00000)
562 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
563 if (port->mapbase == 0xffe10000)
564 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
565 if (port->mapbase == 0xffe20000)
566 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
567 if (port->mapbase == 0xffe30000)
568 return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0;
569 return 1;
570}
571#elif defined(CONFIG_CPU_SUBTYPE_SH7366)
572static inline int sci_rxd_in(struct uart_port *port)
573{
574 if (port->mapbase == 0xffe00000)
575 return ctrl_inb(SCPDR0) & 0x0001 ? 1 : 0;
576 return 1;
577}
578#elif defined(CONFIG_CPU_SUBTYPE_SH7722)
579static inline int sci_rxd_in(struct uart_port *port)
580{
581 if (port->mapbase == 0xffe00000)
582 return ctrl_inb(PSDR) & 0x02 ? 1 : 0;
583 if (port->mapbase == 0xffe10000)
584 return ctrl_inb(PADR) & 0x40 ? 1 : 0;
585 if (port->mapbase == 0xffe20000)
586 return ctrl_inb(PWDR) & 0x04 ? 1 : 0;
587
588 return 1;
589}
590#elif defined(CONFIG_CPU_SUBTYPE_SH7723)
591static inline int sci_rxd_in(struct uart_port *port)
592{
593 if (port->mapbase == 0xffe00000)
594 return ctrl_inb(SCSPTR0) & 0x0008 ? 1 : 0;
595 if (port->mapbase == 0xffe10000)
596 return ctrl_inb(SCSPTR1) & 0x0020 ? 1 : 0;
597 if (port->mapbase == 0xffe20000)
598 return ctrl_inb(SCSPTR2) & 0x0001 ? 1 : 0;
599 if (port->mapbase == 0xa4e30000)
600 return ctrl_inb(SCSPTR3) & 0x0001 ? 1 : 0;
601 if (port->mapbase == 0xa4e40000)
602 return ctrl_inb(SCSPTR4) & 0x0001 ? 1 : 0;
603 if (port->mapbase == 0xa4e50000)
604 return ctrl_inb(SCSPTR5) & 0x0008 ? 1 : 0;
605 return 1;
606}
607#elif defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103)
608static inline int sci_rxd_in(struct uart_port *port)
609{
610 return sci_in(port, SCSPTR2)&0x0001 ? 1 : 0;
611}
612#elif defined(__H8300H__) || defined(__H8300S__)
613static inline int sci_rxd_in(struct uart_port *port)
614{
615 int ch = (port->mapbase - SMR0) >> 3;
616 return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0;
617}
618#elif defined(CONFIG_CPU_SUBTYPE_SH7763)
619static inline int sci_rxd_in(struct uart_port *port)
620{
621 if (port->mapbase == 0xffe00000)
622 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
623 if (port->mapbase == 0xffe08000)
624 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
625 if (port->mapbase == 0xffe10000)
626 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
627
628 return 1;
629}
630#elif defined(CONFIG_CPU_SUBTYPE_SH7770)
631static inline int sci_rxd_in(struct uart_port *port)
632{
633 if (port->mapbase == 0xff923000)
634 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
635 if (port->mapbase == 0xff924000)
636 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
637 if (port->mapbase == 0xff925000)
638 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
639 return 1;
640}
641#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
642static inline int sci_rxd_in(struct uart_port *port)
643{
644 if (port->mapbase == 0xffe00000)
645 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
646 if (port->mapbase == 0xffe10000)
647 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
648 return 1;
649}
650#elif defined(CONFIG_CPU_SUBTYPE_SH7785)
651static inline int sci_rxd_in(struct uart_port *port)
652{
653 if (port->mapbase == 0xffea0000)
654 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
655 if (port->mapbase == 0xffeb0000)
656 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
657 if (port->mapbase == 0xffec0000)
658 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
659 if (port->mapbase == 0xffed0000)
660 return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0;
661 if (port->mapbase == 0xffee0000)
662 return ctrl_inw(SCSPTR4) & 0x0001 ? 1 : 0;
663 if (port->mapbase == 0xffef0000)
664 return ctrl_inw(SCSPTR5) & 0x0001 ? 1 : 0;
665 return 1;
666}
667#elif defined(CONFIG_CPU_SUBTYPE_SH7203) || \
668 defined(CONFIG_CPU_SUBTYPE_SH7206) || \
669 defined(CONFIG_CPU_SUBTYPE_SH7263)
670static inline int sci_rxd_in(struct uart_port *port)
671{
672 if (port->mapbase == 0xfffe8000)
673 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
674 if (port->mapbase == 0xfffe8800)
675 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
676 if (port->mapbase == 0xfffe9000)
677 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
678 if (port->mapbase == 0xfffe9800)
679 return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0;
680 return 1;
681}
682#elif defined(CONFIG_CPU_SUBTYPE_SH7619)
683static inline int sci_rxd_in(struct uart_port *port)
684{
685 if (port->mapbase == 0xf8400000)
686 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
687 if (port->mapbase == 0xf8410000)
688 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
689 if (port->mapbase == 0xf8420000)
690 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
691 return 1;
692}
693#elif defined(CONFIG_CPU_SUBTYPE_SHX3)
694static inline int sci_rxd_in(struct uart_port *port)
695{
696 if (port->mapbase == 0xffc30000)
697 return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0;
698 if (port->mapbase == 0xffc40000)
699 return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0;
700 if (port->mapbase == 0xffc50000)
701 return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0;
702 if (port->mapbase == 0xffc60000)
703 return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0;
704 return 1;
705}
706#endif
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740#if defined(CONFIG_CPU_SUBTYPE_SH7780) || \
741 defined(CONFIG_CPU_SUBTYPE_SH7785)
742#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(16*bps)-1)
743#elif defined(CONFIG_CPU_SUBTYPE_SH7705) || \
744 defined(CONFIG_CPU_SUBTYPE_SH7720) || \
745 defined(CONFIG_CPU_SUBTYPE_SH7721)
746#define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1)
747#elif defined(CONFIG_CPU_SUBTYPE_SH7723)
748static inline int scbrr_calc(struct uart_port *port, int bps, int clk)
749{
750 if (port->type == PORT_SCIF)
751 return (clk+16*bps)/(32*bps)-1;
752 else
753 return ((clk*2)+16*bps)/(16*bps)-1;
754}
755#define SCBRR_VALUE(bps, clk) scbrr_calc(port, bps, clk)
756#elif defined(__H8300H__) || defined(__H8300S__)
757#define SCBRR_VALUE(bps, clk) (((clk*1000/32)/bps)-1)
758#else
759#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
760#endif
761