Blame view

include/linux/serial_core.h 15.3 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
45
  #define PORT_AR7	18	/* Texas Instruments AR7 internal UART */
  #define PORT_MAX_8250	18	/* max port ID */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  
  /*
   * 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...
63
64
65
  /* DEC */
  #define PORT_DZ		46
  #define PORT_ZS		47
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
  
  /* Parisc type numbers. */
  #define PORT_MUX	48
9ab4f88b7   Haavard Skinnemoen   [PATCH] serial: R...
69
70
  /* Atmel AT91 / AT32 SoC */
  #define PORT_ATMEL	49
1e6c9c287   Andrew Victor   [ARM] 3242/2: AT9...
71

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  /* 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
  
  /* MPC52xx type numbers */
  #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...
109
  #define PORT_TXX9	64
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
114
115
116
117
118
119
120
121
  
  /* 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...
122
  #define PORT_JSM        69
e6fa0ba30   Vitaly Wool   [PATCH] fix PNX85...
123
  #define PORT_PNX8XXX	70
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
  #ifdef __KERNEL__
661f83a67   Russell King   [PATCH] Serial: M...
175
  #include <linux/compiler.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
177
178
179
180
  #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 ...
181
  #include <linux/mutex.h>
b11115c15   Maciej W. Rozycki   serial_core.h: in...
182
  #include <linux/sysrq.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
  
  struct uart_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
186
187
188
189
190
191
192
193
194
195
  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...
196
197
  	void		(*stop_tx)(struct uart_port *);
  	void		(*start_tx)(struct uart_port *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
201
202
203
  	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...
204
  	void		(*flush_buffer)(struct uart_port *);
606d099cd   Alan Cox   [PATCH] tty: swit...
205
206
  	void		(*set_termios)(struct uart_port *, struct ktermios *new,
  				       struct ktermios *old);
d87d9b7d1   Alan Cox   tty: serial - fix...
207
  	void		(*set_ldisc)(struct uart_port *, int new);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
  	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...
231
232
233
234
  #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
235
  };
f5316b4ae   Jason Wessel   kgdb,8250,pl011: ...
236
  #define NO_POLL_CHAR		0x00ff0000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
  #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...
253
  typedef unsigned int __bitwise__ upf_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
255
  struct uart_port {
  	spinlock_t		lock;			/* port lock */
0c8946d97   David Miller   serial: Make uart...
256
  	unsigned long		iobase;			/* in/out[bwl] */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
  	unsigned char __iomem	*membase;		/* read/write[bwl] */
7d6a07d12   David Daney   8250: Serial driv...
258
259
  	unsigned int		(*serial_in)(struct uart_port *, int);
  	void			(*serial_out)(struct uart_port *, int, int);
235dae5d0   Philippe Langlais   U6715 16550A seri...
260
261
262
  	void			(*set_termios)(struct uart_port *,
  				               struct ktermios *new,
  				               struct ktermios *old);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
  	unsigned int		irq;			/* irq number */
1c2f04937   Vikram Pandita   serial: 8250: add...
264
  	unsigned long		irqflags;		/* irq flags  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
  	unsigned int		uartclk;		/* base uart clock */
947deee89   Russell King   [SERIAL] Convert ...
266
  	unsigned int		fifosize;		/* tx fifo size */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
268
269
  	unsigned char		x_char;			/* xon/xoff char */
  	unsigned char		regshift;		/* reg offset shift */
  	unsigned char		iotype;			/* io access style */
947deee89   Russell King   [SERIAL] Convert ...
270
  	unsigned char		unused1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
272
273
274
275
  
  #define UPIO_PORT		(0)
  #define UPIO_HUB6		(1)
  #define UPIO_MEM		(2)
  #define UPIO_MEM32		(3)
21c614a78   Pantelis Antoniou   [SERIAL] Support ...
276
  #define UPIO_AU			(4)			/* Au1x00 type IO */
3be91ec73   Zang Roy-r61911   [SERIAL] 8250: ad...
277
  #define UPIO_TSI		(5)			/* Tsi108/109 type IO */
beab697ab   Marc St-Jean   serial driver PMC...
278
  #define UPIO_DWAPB		(6)			/* DesignWare APB UART */
bd71c182d   Thomas Koeller   RM9000 serial driver
279
  #define UPIO_RM9000		(7)			/* RM9000 type IO */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
282
  
  	unsigned int		read_status_mask;	/* driver specific */
  	unsigned int		ignore_status_mask;	/* driver specific */
ebd2c8f6d   Alan Cox   serial: kill off ...
283
  	struct uart_state	*state;			/* pointer to parent state */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
286
  	struct uart_icount	icount;			/* statistics */
  
  	struct console		*cons;			/* struct console, if any */
06e82df01   Alexander Beregalov   mux: fix build pr...
287
  #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
288
289
  	unsigned long		sysrq;			/* sysrq timeout */
  #endif
0077d45e4   Russell King   [SERIAL] Make uar...
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
  	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...
305
  #define UPF_NO_TXEN_TEST	((__force upf_t) (1 << 15))
0077d45e4   Russell King   [SERIAL] Make uar...
306
307
308
  #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))
8e23fcc89   David Daney   Serial: Allow por...
309
310
  /* 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...
311
  #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28))
abb4a2390   David Gibson   serial: define FI...
312
  #define UPF_FIXED_PORT		((__force upf_t) (1 << 29))
68ac64cd3   Russell King   [SERIAL] Clean up...
313
  #define UPF_DEAD		((__force upf_t) (1 << 30))
0077d45e4   Russell King   [SERIAL] Make uar...
314
315
316
317
  #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
318
319
320
321
  
  	unsigned int		mctrl;			/* current modem ctrl settings */
  	unsigned int		timeout;		/* character-based timeout */
  	unsigned int		type;			/* port type */
ba899dbc0   Russell King   [SERIAL] Make por...
322
  	const struct uart_ops	*ops;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
324
  	unsigned int		custom_divisor;
  	unsigned int		line;			/* port index */
4f640efb3   Josh Boyer   Use resource_size...
325
  	resource_size_t		mapbase;		/* for ioremap */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
  	struct device		*dev;			/* parent device */
  	unsigned char		hub6;			/* this should be in the 8250 driver */
b3b708fa2   Guennadi Liakhovetski   wake up from a se...
328
329
  	unsigned char		suspended;
  	unsigned char		unused[2];
beab697ab   Marc St-Jean   serial driver PMC...
330
  	void			*private_data;		/* generic platform data pointer */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
331
332
333
  };
  
  /*
ebd2c8f6d   Alan Cox   serial: kill off ...
334
   * This is the state information which is persistent across opens.
ebd2c8f6d   Alan Cox   serial: kill off ...
335
336
   */
  struct uart_state {
df4f4dd42   Alan Cox   serial: use tty_port
337
  	struct tty_port		port;
ebd2c8f6d   Alan Cox   serial: kill off ...
338

ebd2c8f6d   Alan Cox   serial: kill off ...
339
  	int			pm_state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
  	struct circ_buf		xmit;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
342
  	struct tasklet_struct	tlet;
ebd2c8f6d   Alan Cox   serial: kill off ...
343
  	struct uart_port	*uart_port;
f751928e0   Alan Cox   tty: We want the ...
344
345
346
  };
  
  #define UART_XMIT_SIZE	PAGE_SIZE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347
348
349
350
351
352
353
354
355
356
  /* 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
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
  	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...
377
378
  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
379
380
381
382
383
384
385
386
387
388
389
390
391
  				unsigned int max);
  unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud);
  
  /*
   * 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...
392
393
394
  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
395
396
397
398
399
400
  
  /*
   * 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
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
  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 ...
419
420
  static inline int uart_tx_stopped(struct uart_port *port)
  {
ebd2c8f6d   Alan Cox   serial: kill off ...
421
  	struct tty_struct *tty = port->state->port.tty;
f751928e0   Alan Cox   tty: We want the ...
422
423
424
425
  	if(tty->stopped || tty->hw_stopped)
  		return 1;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426
427
428
429
  
  /*
   * The following are helper functions for the low level drivers.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
430
  static inline int
7d12e780e   David Howells   IRQ: Maintain reg...
431
  uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432
  {
93c37f292   David S. Miller   [SERIAL]: Avoid '...
433
  #ifdef SUPPORT_SYSRQ
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
435
  	if (port->sysrq) {
  		if (ch && time_before(jiffies, port->sysrq)) {
ebd2c8f6d   Alan Cox   serial: kill off ...
436
  			handle_sysrq(ch, port->state->port.tty);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437
438
439
440
441
  			port->sysrq = 0;
  			return 1;
  		}
  		port->sysrq = 0;
  	}
93c37f292   David S. Miller   [SERIAL]: Avoid '...
442
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
  	return 0;
  }
4e1491847   Linus Torvalds   Fix up ARM serial...
445
  #ifndef SUPPORT_SYSRQ
7d12e780e   David Howells   IRQ: Maintain reg...
446
  #define uart_handle_sysrq_char(port,ch) uart_handle_sysrq_char(port, 0)
4e1491847   Linus Torvalds   Fix up ARM serial...
447
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
449
450
451
452
453
  
  /*
   * 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 ...
454
  	struct uart_state *state = port->state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
455
456
457
458
459
460
461
462
463
  #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_...
464
  	if (port->flags & UPF_SAK)
ebd2c8f6d   Alan Cox   serial: kill off ...
465
  		do_SAK(state->port.tty);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
467
468
469
470
  	return 0;
  }
  
  /**
   *	uart_handle_dcd_change - handle a change of carrier detect state
1b9894f34   Randy Dunlap   serial core: fix ...
471
   *	@uport: uart_port structure for the open port
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
472
473
474
   *	@status: new carrier detect status, nonzero if active
   */
  static inline void
ccce6debb   Alan Cox   serial: move the ...
475
  uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
476
  {
ccce6debb   Alan Cox   serial: move the ...
477
478
  	struct uart_state *state = uport->state;
  	struct tty_port *port = &state->port;
a0880df0c   Rodolfo Giometti   pps: serial clien...
479
480
  	struct tty_ldisc *ld = tty_ldisc_ref(port->tty);
  	struct timespec ts;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
481

a0880df0c   Rodolfo Giometti   pps: serial clien...
482
483
  	if (ld && ld->ops->dcd_change)
  		getnstimeofday(&ts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484

a0880df0c   Rodolfo Giometti   pps: serial clien...
485
  	uport->icount.dcd++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
  #ifdef CONFIG_HARD_PPS
ccce6debb   Alan Cox   serial: move the ...
487
  	if ((uport->flags & UPF_HARDPPS_CD) && status)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
488
489
  		hardpps();
  #endif
ccce6debb   Alan Cox   serial: move the ...
490
  	if (port->flags & ASYNC_CHECK_CD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491
  		if (status)
ccce6debb   Alan Cox   serial: move the ...
492
493
494
  			wake_up_interruptible(&port->open_wait);
  		else if (port->tty)
  			tty_hangup(port->tty);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
  	}
a0880df0c   Rodolfo Giometti   pps: serial clien...
496
497
498
499
500
  
  	if (ld && ld->ops->dcd_change)
  		ld->ops->dcd_change(port->tty, status, &ts);
  	if (ld)
  		tty_ldisc_deref(ld);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
501
502
503
504
  }
  
  /**
   *	uart_handle_cts_change - handle a change of clear-to-send state
1b9894f34   Randy Dunlap   serial core: fix ...
505
   *	@uport: uart_port structure for the open port
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
507
508
   *	@status: new clear to send status, nonzero if active
   */
  static inline void
ccce6debb   Alan Cox   serial: move the ...
509
  uart_handle_cts_change(struct uart_port *uport, unsigned int status)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510
  {
ccce6debb   Alan Cox   serial: move the ...
511
512
  	struct tty_port *port = &uport->state->port;
  	struct tty_struct *tty = port->tty;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513

ccce6debb   Alan Cox   serial: move the ...
514
  	uport->icount.cts++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515

ccce6debb   Alan Cox   serial: move the ...
516
  	if (port->flags & ASYNC_CTS_FLOW) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
517
518
519
  		if (tty->hw_stopped) {
  			if (status) {
  				tty->hw_stopped = 0;
ccce6debb   Alan Cox   serial: move the ...
520
521
  				uport->ops->start_tx(uport);
  				uart_write_wakeup(uport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
522
523
524
525
  			}
  		} else {
  			if (!status) {
  				tty->hw_stopped = 1;
ccce6debb   Alan Cox   serial: move the ...
526
  				uport->ops->stop_tx(uport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
527
528
529
530
  			}
  		}
  	}
  }
05ab30146   Russell King   [PATCH] Serial: A...
531
532
533
534
535
536
  #include <linux/tty_flip.h>
  
  static inline void
  uart_insert_char(struct uart_port *port, unsigned int status,
  		 unsigned int overrun, unsigned int ch, unsigned int flag)
  {
ebd2c8f6d   Alan Cox   serial: kill off ...
537
  	struct tty_struct *tty = port->state->port.tty;
05ab30146   Russell King   [PATCH] Serial: A...
538
539
540
541
542
543
544
545
546
547
548
  
  	if ((status & port->ignore_status_mask & ~overrun) == 0)
  		tty_insert_flip_char(tty, ch, flag);
  
  	/*
  	 * Overrun is special.  Since it's reported immediately,
  	 * it doesn't affect the current character.
  	 */
  	if (status & ~port->ignore_status_mask & overrun)
  		tty_insert_flip_char(tty, 0, TTY_OVERRUN);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
549
550
551
552
553
554
555
556
557
558
  /*
   *	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 */