Blame view

include/linux/serial_core.h 14.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  /*
   *  linux/drivers/char/serial_core.h
   *
   *  Copyright (C) 2000 Deep Blue Solutions Ltd.
   *
   * 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.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  #ifndef LINUX_SERIAL_CORE_H
  #define LINUX_SERIAL_CORE_H
ccce6debb   Alan Cox   serial: move the ...
22
  #include <linux/serial.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  /*
   * The type definitions.  These are from Ted Ts'o's serial.h
   */
  #define PORT_UNKNOWN	0
  #define PORT_8250	1
  #define PORT_16450	2
  #define PORT_16550	3
  #define PORT_16550A	4
  #define PORT_CIRRUS	5
  #define PORT_16650	6
  #define PORT_16650V2	7
  #define PORT_16750	8
  #define PORT_STARTECH	9
  #define PORT_16C950	10
  #define PORT_16654	11
  #define PORT_16850	12
  #define PORT_RSA	13
  #define PORT_NS16550A	14
  #define PORT_XSCALE	15
bd71c182d   Thomas Koeller   RM9000 serial driver
42
  #define PORT_RM9000	16	/* PMC-Sierra RM9xxx internal UART */
6b06f1915   David Daney   Serial: UART driv...
43
  #define PORT_OCTEON	17	/* Cavium OCTEON internal UART */
08e0992f6   Florian Fainelli   serial: add suppo...
44
  #define PORT_AR7	18	/* Texas Instruments AR7 internal UART */
71cad0554   Philippe Langlais   serial: fix port ...
45
  #define PORT_U6_16550A	19	/* ST-Ericsson U6xxx internal UART */
4539c24fe   Stephen Warren   tty/serial: Add e...
46
  #define PORT_TEGRA	20	/* NVIDIA Tegra internal UART */
06315348b   Søren Holm   serial: Support t...
47
48
  #define PORT_XR17D15X	21	/* Exar XR17D15x UART */
  #define PORT_MAX_8250	21	/* max port ID */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  
  /*
   * ARM specific type numbers.  These are not currently guaranteed
   * to be implemented, and will change in the future.  These are
   * separate so any additions to the old serial.c that occur before
   * we are merged can be easily merged here.
   */
  #define PORT_PXA	31
  #define PORT_AMBA	32
  #define PORT_CLPS711X	33
  #define PORT_SA1100	34
  #define PORT_UART00	35
  #define PORT_21285	37
  
  /* Sparc type numbers.  */
  #define PORT_SUNZILOG	38
  #define PORT_SUNSAB	39
8b4a40809   Maciej W. Rozycki   zs: move to the s...
66
67
68
  /* DEC */
  #define PORT_DZ		46
  #define PORT_ZS		47
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
  
  /* Parisc type numbers. */
  #define PORT_MUX	48
9ab4f88b7   Haavard Skinnemoen   [PATCH] serial: R...
72
73
  /* Atmel AT91 / AT32 SoC */
  #define PORT_ATMEL	49
1e6c9c287   Andrew Victor   [ARM] 3242/2: AT9...
74

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  /* Macintosh Zilog type numbers */
  #define PORT_MAC_ZILOG	50	/* m68k : not yet implemented */
  #define PORT_PMAC_ZILOG	51
  
  /* SH-SCI */
  #define PORT_SCI	52
  #define PORT_SCIF	53
  #define PORT_IRDA	54
  
  /* Samsung S3C2410 SoC and derivatives thereof */
  #define PORT_S3C2410    55
  
  /* SGI IP22 aka Indy / Challenge S / Indigo 2 */
  #define PORT_IP22ZILOG	56
  
  /* Sharp LH7a40x -- an ARM9 SoC series */
  #define PORT_LH7A40X	57
  
  /* PPC CPM type number */
  #define PORT_CPM        58
e44dcb6c3   Wolfram Sang   serial: mpc52xx: ...
95
  /* MPC52xx (and MPC512x) type numbers */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  #define PORT_MPC52xx	59
  
  /* IBM icom */
  #define PORT_ICOM	60
  
  /* Samsung S3C2440 SoC */
  #define PORT_S3C2440	61
  
  /* Motorola i.MX SoC */
  #define PORT_IMX	62
  
  /* Marvell MPSC */
  #define PORT_MPSC	63
  
  /* TXX9 type number */
e5c2d7491   Ralf Baechle   [PATCH] serial_co...
111
  #define PORT_TXX9	64
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
113
114
115
116
117
118
119
120
121
122
123
  
  /* NEC VR4100 series SIU/DSIU */
  #define PORT_VR41XX_SIU		65
  #define PORT_VR41XX_DSIU	66
  
  /* Samsung S3C2400 SoC */
  #define PORT_S3C2400	67
  
  /* M32R SIO */
  #define PORT_M32R_SIO	68
  
  /*Digi jsm */
913ade51e   Russell King   [SERIAL] Fix port...
124
  #define PORT_JSM        69
e6fa0ba30   Vitaly Wool   [PATCH] fix PNX85...
125
  #define PORT_PNX8XXX	70
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126

f5417612d   Sascha Hauer   [ARM] 3181/1: add...
127
128
  /* Hilscher netx */
  #define PORT_NETX	71
02fd473bd   David S. Miller   [SPARC64]: Add SU...
129
130
  /* SUN4V Hypervisor Console */
  #define PORT_SUNHV	72
73e55cb3b   Ben Dooks   [ARM] 3639/1: S3C...
131
  #define PORT_S3C2412	73
238b8721a   Peter Korsgaard   [PATCH] serial ua...
132
133
  /* Xilinx uartlite */
  #define PORT_UARTLITE	74
73e55cb3b   Ben Dooks   [ARM] 3639/1: S3C...
134

194de5612   Bryan Wu   blackfin: serial ...
135
136
  /* Blackfin bf5xx */
  #define PORT_BFIN	75
2c7ee6ab7   Andrew Victor   [ARM] 4332/2: KS8...
137
138
  /* Micrel KS8695 */
  #define PORT_KS8695	76
b45d52797   Maciej W. Rozycki   sb1250-duart.c: S...
139
140
  /* Broadcom SB1250, etc. SOC */
  #define PORT_SB1250_DUART	77
f0c15f48b   Greg Ungerer   add port definiti...
141
142
  /* Freescale ColdFire */
  #define PORT_MCF	78
2f3517418   Bryan Wu   Blackfin serial d...
143
144
  /* Blackfin SPORT */
  #define PORT_BFIN_SPORT		79
2c7ee6ab7   Andrew Victor   [ARM] 4332/2: KS8...
145

ef3d53475   David Howells   mn10300: allocate...
146
147
148
  /* MN10300 on-chip UART numbers */
  #define PORT_MN10300		80
  #define PORT_MN10300_CTS	81
2f3517418   Bryan Wu   Blackfin serial d...
149
  #define PORT_SC26XX	82
1a22f08db   Yoshihiro Shimoda   serial: sh-sci: f...
150
151
  /* SH-SCI */
  #define PORT_SCIFA	83
b690ace50   Ben Dooks   [ARM] S3C6400: se...
152
  #define PORT_S3C6400	84
5886188dc   Benjamin Krill   serial: Add drive...
153
154
  /* NWPSERIAL */
  #define PORT_NWPSERIAL	85
1dcb884ca   Christian Pellegrin   Add support for t...
155
156
  /* MAX3100 */
  #define PORT_MAX3100    86
34aec5918   Richard Röjfors   serial: Added Tim...
157
158
  /* Timberdale UART */
  #define PORT_TIMBUART	87
04896a77a   Robert Love   msm_serial: seria...
159
160
  /* Qualcomm MSM SoCs */
  #define PORT_MSM	88
9fcd66e57   Maxime Bizon   MIPS: BCM63xx: Ad...
161
162
  /* BCM63xx family SoCs */
  #define PORT_BCM63XX	89
d4ac42a58   Kristoffer Glembo   sparc: Support fo...
163
164
  /* Aeroflex Gaisler GRLIB APBUART */
  #define PORT_APBUART    90
5bcd60104   Tobias Klauser   serial: Add drive...
165
166
  /* Altera UARTs */
  #define PORT_ALTERA_JTAGUART	91
6b7d8f8b5   Tobias Klauser   serial: Add drive...
167
  #define PORT_ALTERA_UART	92
5bcd60104   Tobias Klauser   serial: Add drive...
168

75b93489b   Guennadi Liakhovetski   serial: add a new...
169
170
  /* SH-SCI */
  #define PORT_SCIFB	93
61fd15262   Alan Cox   serial: max3107: ...
171
172
  /* MAX3107 */
  #define PORT_MAX3107	94
d843fc6e9   Feng Tang   hsu: driver for M...
173
174
  /* High Speed UART for Medfield */
  #define PORT_MFD	95
61fd15262   Alan Cox   serial: max3107: ...
175

b612633b5   Govindraj.R   serial: Add OMAP ...
176
177
  /* TI OMAP-UART */
  #define PORT_OMAP	96
304e12665   Alexey Charkov   serial: Add suppo...
178
179
  /* VIA VT8500 SoC */
  #define PORT_VT8500	97
61ec90169   John Linn   tty/serial: add s...
180
181
  /* Xilinx PSS UART */
  #define PORT_XUARTPS	98
d57f341ba   Gabor Juhos   SERIAL: AR933X: A...
182
183
  /* Atheros AR933X SoC */
  #define PORT_AR933X	99
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
  #ifdef __KERNEL__
661f83a67   Russell King   [PATCH] Serial: M...
185
  #include <linux/compiler.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
188
189
190
  #include <linux/interrupt.h>
  #include <linux/circ_buf.h>
  #include <linux/spinlock.h>
  #include <linux/sched.h>
  #include <linux/tty.h>
e2862f6a8   Ingo Molnar   [SERIAL] convert ...
191
  #include <linux/mutex.h>
b11115c15   Maciej W. Rozycki   serial_core.h: in...
192
  #include <linux/sysrq.h>
6f4229b51   Alexander Gordeev   pps: unify timest...
193
  #include <linux/pps_kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
195
  
  struct uart_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
198
199
200
201
202
203
204
205
206
  struct serial_struct;
  struct device;
  
  /*
   * This structure describes all the operations that can be
   * done on the physical hardware.
   */
  struct uart_ops {
  	unsigned int	(*tx_empty)(struct uart_port *);
  	void		(*set_mctrl)(struct uart_port *, unsigned int mctrl);
  	unsigned int	(*get_mctrl)(struct uart_port *);
b129a8ccd   Russell King   [SERIAL] Clean up...
207
208
  	void		(*stop_tx)(struct uart_port *);
  	void		(*start_tx)(struct uart_port *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
210
211
212
213
214
  	void		(*send_xchar)(struct uart_port *, char ch);
  	void		(*stop_rx)(struct uart_port *);
  	void		(*enable_ms)(struct uart_port *);
  	void		(*break_ctl)(struct uart_port *, int ctl);
  	int		(*startup)(struct uart_port *);
  	void		(*shutdown)(struct uart_port *);
6bb0e3a59   Haavard Skinnemoen   Subject: [PATCH 1...
215
  	void		(*flush_buffer)(struct uart_port *);
606d099cd   Alan Cox   [PATCH] tty: swit...
216
217
  	void		(*set_termios)(struct uart_port *, struct ktermios *new,
  				       struct ktermios *old);
d87d9b7d1   Alan Cox   tty: serial - fix...
218
  	void		(*set_ldisc)(struct uart_port *, int new);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
  	void		(*pm)(struct uart_port *, unsigned int state,
  			      unsigned int oldstate);
  	int		(*set_wake)(struct uart_port *, unsigned int state);
  
  	/*
  	 * Return a string describing the type of the port
  	 */
  	const char *(*type)(struct uart_port *);
  
  	/*
  	 * Release IO and memory resources used by the port.
  	 * This includes iounmap if necessary.
  	 */
  	void		(*release_port)(struct uart_port *);
  
  	/*
  	 * Request IO and memory resources used by the port.
  	 * This includes iomapping the port if necessary.
  	 */
  	int		(*request_port)(struct uart_port *);
  	void		(*config_port)(struct uart_port *, int);
  	int		(*verify_port)(struct uart_port *, struct serial_struct *);
  	int		(*ioctl)(struct uart_port *, unsigned int, unsigned long);
f2d937f3b   Jason Wessel   consoles: polling...
242
243
244
245
  #ifdef CONFIG_CONSOLE_POLL
  	void	(*poll_put_char)(struct uart_port *, unsigned char);
  	int		(*poll_get_char)(struct uart_port *);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
  };
f5316b4ae   Jason Wessel   kgdb,8250,pl011: ...
247
  #define NO_POLL_CHAR		0x00ff0000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
  #define UART_CONFIG_TYPE	(1 << 0)
  #define UART_CONFIG_IRQ		(1 << 1)
  
  struct uart_icount {
  	__u32	cts;
  	__u32	dsr;
  	__u32	rng;
  	__u32	dcd;
  	__u32	rx;
  	__u32	tx;
  	__u32	frame;
  	__u32	overrun;
  	__u32	parity;
  	__u32	brk;
  	__u32	buf_overrun;
  };
0077d45e4   Russell King   [SERIAL] Make uar...
264
  typedef unsigned int __bitwise__ upf_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
266
  struct uart_port {
  	spinlock_t		lock;			/* port lock */
0c8946d97   David Miller   serial: Make uart...
267
  	unsigned long		iobase;			/* in/out[bwl] */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
  	unsigned char __iomem	*membase;		/* read/write[bwl] */
7d6a07d12   David Daney   8250: Serial driv...
269
270
  	unsigned int		(*serial_in)(struct uart_port *, int);
  	void			(*serial_out)(struct uart_port *, int, int);
235dae5d0   Philippe Langlais   U6715 16550A seri...
271
272
273
  	void			(*set_termios)(struct uart_port *,
  				               struct ktermios *new,
  				               struct ktermios *old);
a74036f51   Jamie Iles   tty: serial: allo...
274
  	int			(*handle_irq)(struct uart_port *);
c161afe97   Manuel Lauss   8250: allow platf...
275
276
  	void			(*pm)(struct uart_port *, unsigned int state,
  				      unsigned int old);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
  	unsigned int		irq;			/* irq number */
1c2f04937   Vikram Pandita   serial: 8250: add...
278
  	unsigned long		irqflags;		/* irq flags  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
  	unsigned int		uartclk;		/* base uart clock */
947deee89   Russell King   [SERIAL] Convert ...
280
  	unsigned int		fifosize;		/* tx fifo size */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
283
  	unsigned char		x_char;			/* xon/xoff char */
  	unsigned char		regshift;		/* reg offset shift */
  	unsigned char		iotype;			/* io access style */
947deee89   Russell King   [SERIAL] Convert ...
284
  	unsigned char		unused1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
286
287
288
289
  
  #define UPIO_PORT		(0)
  #define UPIO_HUB6		(1)
  #define UPIO_MEM		(2)
  #define UPIO_MEM32		(3)
21c614a78   Pantelis Antoniou   [SERIAL] Support ...
290
  #define UPIO_AU			(4)			/* Au1x00 type IO */
3be91ec73   Zang Roy-r61911   [SERIAL] 8250: ad...
291
  #define UPIO_TSI		(5)			/* Tsi108/109 type IO */
4834d0289   Jamie Iles   tty: serial8250: ...
292
  #define UPIO_RM9000		(6)			/* RM9000 type IO */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
  
  	unsigned int		read_status_mask;	/* driver specific */
  	unsigned int		ignore_status_mask;	/* driver specific */
ebd2c8f6d   Alan Cox   serial: kill off ...
296
  	struct uart_state	*state;			/* pointer to parent state */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
299
  	struct uart_icount	icount;			/* statistics */
  
  	struct console		*cons;			/* struct console, if any */
06e82df01   Alexander Beregalov   mux: fix build pr...
300
  #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
302
  	unsigned long		sysrq;			/* sysrq timeout */
  #endif
0077d45e4   Russell King   [SERIAL] Make uar...
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
  	upf_t			flags;
  
  #define UPF_FOURPORT		((__force upf_t) (1 << 1))
  #define UPF_SAK			((__force upf_t) (1 << 2))
  #define UPF_SPD_MASK		((__force upf_t) (0x1030))
  #define UPF_SPD_HI		((__force upf_t) (0x0010))
  #define UPF_SPD_VHI		((__force upf_t) (0x0020))
  #define UPF_SPD_CUST		((__force upf_t) (0x0030))
  #define UPF_SPD_SHI		((__force upf_t) (0x1000))
  #define UPF_SPD_WARP		((__force upf_t) (0x1010))
  #define UPF_SKIP_TEST		((__force upf_t) (1 << 6))
  #define UPF_AUTO_IRQ		((__force upf_t) (1 << 7))
  #define UPF_HARDPPS_CD		((__force upf_t) (1 << 11))
  #define UPF_LOW_LATENCY		((__force upf_t) (1 << 13))
  #define UPF_BUGGY_UART		((__force upf_t) (1 << 14))
b6adea334   Mauro Carvalho Chehab   8250: fix boot ha...
318
  #define UPF_NO_TXEN_TEST	((__force upf_t) (1 << 15))
0077d45e4   Russell King   [SERIAL] Make uar...
319
320
321
  #define UPF_MAGIC_MULTIPLIER	((__force upf_t) (1 << 16))
  #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))
  #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))
06315348b   Søren Holm   serial: Support t...
322
  #define UPF_EXAR_EFR		((__force upf_t) (1 << 25))
448ac154c   Dan Williams   serial/8250_pci: ...
323
  #define UPF_IIR_ONCE		((__force upf_t) (1 << 26))
8e23fcc89   David Daney   Serial: Allow por...
324
325
  /* The exact UART type is known and should not be probed.  */
  #define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))
0077d45e4   Russell King   [SERIAL] Make uar...
326
  #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28))
abb4a2390   David Gibson   serial: define FI...
327
  #define UPF_FIXED_PORT		((__force upf_t) (1 << 29))
68ac64cd3   Russell King   [SERIAL] Clean up...
328
  #define UPF_DEAD		((__force upf_t) (1 << 30))
0077d45e4   Russell King   [SERIAL] Make uar...
329
330
331
332
  #define UPF_IOREMAP		((__force upf_t) (1 << 31))
  
  #define UPF_CHANGE_MASK		((__force upf_t) (0x17fff))
  #define UPF_USR_MASK		((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
334
335
336
  
  	unsigned int		mctrl;			/* current modem ctrl settings */
  	unsigned int		timeout;		/* character-based timeout */
  	unsigned int		type;			/* port type */
ba899dbc0   Russell King   [SERIAL] Make por...
337
  	const struct uart_ops	*ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
339
  	unsigned int		custom_divisor;
  	unsigned int		line;			/* port index */
4f640efb3   Josh Boyer   Use resource_size...
340
  	resource_size_t		mapbase;		/* for ioremap */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
  	struct device		*dev;			/* parent device */
  	unsigned char		hub6;			/* this should be in the 8250 driver */
b3b708fa2   Guennadi Liakhovetski   wake up from a se...
343
  	unsigned char		suspended;
3f960dbb9   Govindraj.R   Serial: Avoid unb...
344
  	unsigned char		irq_wake;
b3b708fa2   Guennadi Liakhovetski   wake up from a se...
345
  	unsigned char		unused[2];
beab697ab   Marc St-Jean   serial driver PMC...
346
  	void			*private_data;		/* generic platform data pointer */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347
348
349
  };
  
  /*
ebd2c8f6d   Alan Cox   serial: kill off ...
350
   * This is the state information which is persistent across opens.
ebd2c8f6d   Alan Cox   serial: kill off ...
351
352
   */
  struct uart_state {
df4f4dd42   Alan Cox   serial: use tty_port
353
  	struct tty_port		port;
ebd2c8f6d   Alan Cox   serial: kill off ...
354

ebd2c8f6d   Alan Cox   serial: kill off ...
355
  	int			pm_state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356
  	struct circ_buf		xmit;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
357

ebd2c8f6d   Alan Cox   serial: kill off ...
358
  	struct uart_port	*uart_port;
f751928e0   Alan Cox   tty: We want the ...
359
360
361
  };
  
  #define UART_XMIT_SIZE	PAGE_SIZE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
364
365
366
367
368
369
370
371
  /* number of characters left in xmit buffer before we ask for more */
  #define WAKEUP_CHARS		256
  
  struct module;
  struct tty_driver;
  
  struct uart_driver {
  	struct module		*owner;
  	const char		*driver_name;
  	const char		*dev_name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
  	int			 major;
  	int			 minor;
  	int			 nr;
  	struct console		*cons;
  
  	/*
  	 * these are private; the low level driver should not
  	 * touch these; they should be initialised to NULL
  	 */
  	struct uart_state	*state;
  	struct tty_driver	*tty_driver;
  };
  
  void uart_write_wakeup(struct uart_port *port);
  
  /*
   * Baud rate helpers.
   */
  void uart_update_timeout(struct uart_port *port, unsigned int cflag,
  			 unsigned int baud);
606d099cd   Alan Cox   [PATCH] tty: swit...
392
393
  unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
  				struct ktermios *old, unsigned int min,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394
395
  				unsigned int max);
  unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud);
54381067e   Anton Vorontsov   serial: Factor ou...
396
397
398
399
400
401
402
  /* Base timer interval for polling */
  static inline int uart_poll_timeout(struct uart_port *port)
  {
  	int timeout = port->timeout;
  
  	return timeout > 6 ? (timeout / 2 - 2) : 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
404
405
406
407
408
409
410
411
412
  /*
   * Console helpers.
   */
  struct uart_port *uart_get_console(struct uart_port *ports, int nr,
  				   struct console *c);
  void uart_parse_options(char *options, int *baud, int *parity, int *bits,
  			int *flow);
  int uart_set_options(struct uart_port *port, struct console *co, int baud,
  		     int parity, int bits, int flow);
  struct tty_driver *uart_console_device(struct console *co, int *index);
d358788f3   Russell King   [SERIAL] kernel c...
413
414
415
  void uart_console_write(struct uart_port *port, const char *s,
  			unsigned int count,
  			void (*putchar)(struct uart_port *, int));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416
417
418
419
420
421
  
  /*
   * Port/driver registration/removal
   */
  int uart_register_driver(struct uart_driver *uart);
  void uart_unregister_driver(struct uart_driver *uart);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
  int uart_add_one_port(struct uart_driver *reg, struct uart_port *port);
  int uart_remove_one_port(struct uart_driver *reg, struct uart_port *port);
  int uart_match_port(struct uart_port *port1, struct uart_port *port2);
  
  /*
   * Power Management
   */
  int uart_suspend_port(struct uart_driver *reg, struct uart_port *port);
  int uart_resume_port(struct uart_driver *reg, struct uart_port *port);
  
  #define uart_circ_empty(circ)		((circ)->head == (circ)->tail)
  #define uart_circ_clear(circ)		((circ)->head = (circ)->tail = 0)
  
  #define uart_circ_chars_pending(circ)	\
  	(CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE))
  
  #define uart_circ_chars_free(circ)	\
  	(CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
f751928e0   Alan Cox   tty: We want the ...
440
441
  static inline int uart_tx_stopped(struct uart_port *port)
  {
ebd2c8f6d   Alan Cox   serial: kill off ...
442
  	struct tty_struct *tty = port->state->port.tty;
f751928e0   Alan Cox   tty: We want the ...
443
444
445
446
  	if(tty->stopped || tty->hw_stopped)
  		return 1;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
447
448
449
450
  
  /*
   * The following are helper functions for the low level drivers.
   */
027d7dacf   Jiri Slaby   TTY: serial, clea...
451
452
453
454
455
456
457
458
459
460
  
  extern void uart_handle_dcd_change(struct uart_port *uport,
  		unsigned int status);
  extern void uart_handle_cts_change(struct uart_port *uport,
  		unsigned int status);
  
  extern void uart_insert_char(struct uart_port *port, unsigned int status,
  		 unsigned int overrun, unsigned int ch, unsigned int flag);
  
  #ifdef SUPPORT_SYSRQ
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
  static inline int
7d12e780e   David Howells   IRQ: Maintain reg...
462
  uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
  {
  	if (port->sysrq) {
  		if (ch && time_before(jiffies, port->sysrq)) {
f335397d1   Dmitry Torokhov   Input: sysrq - dr...
466
  			handle_sysrq(ch);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
467
468
469
470
471
472
473
  			port->sysrq = 0;
  			return 1;
  		}
  		port->sysrq = 0;
  	}
  	return 0;
  }
027d7dacf   Jiri Slaby   TTY: serial, clea...
474
475
  #else
  #define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; })
4e1491847   Linus Torvalds   Fix up ARM serial...
476
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
478
479
480
481
482
  
  /*
   * We do the SysRQ and SAK checking like this...
   */
  static inline int uart_handle_break(struct uart_port *port)
  {
ebd2c8f6d   Alan Cox   serial: kill off ...
483
  	struct uart_state *state = port->state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484
485
486
487
488
489
490
491
492
  #ifdef SUPPORT_SYSRQ
  	if (port->cons && port->cons->index == port->line) {
  		if (!port->sysrq) {
  			port->sysrq = jiffies + HZ*5;
  			return 1;
  		}
  		port->sysrq = 0;
  	}
  #endif
27ae7a743   Russell King   [SERIAL] Fix UPF_...
493
  	if (port->flags & UPF_SAK)
ebd2c8f6d   Alan Cox   serial: kill off ...
494
  		do_SAK(state->port.tty);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
496
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
497
498
499
500
501
502
503
504
505
506
  /*
   *	UART_ENABLE_MS - determine if port should enable modem status irqs
   */
  #define UART_ENABLE_MS(port,cflag)	((port)->flags & UPF_HARDPPS_CD || \
  					 (cflag) & CRTSCTS || \
  					 !((cflag) & CLOCAL))
  
  #endif
  
  #endif /* LINUX_SERIAL_CORE_H */