Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
serial_core.h
Go to the documentation of this file.
1
/*
2
* linux/drivers/char/serial_core.h
3
*
4
* Copyright (C) 2000 Deep Blue Solutions Ltd.
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
*/
20
#ifndef LINUX_SERIAL_CORE_H
21
#define LINUX_SERIAL_CORE_H
22
23
24
#include <linux/compiler.h>
25
#include <
linux/interrupt.h
>
26
#include <
linux/circ_buf.h
>
27
#include <
linux/spinlock.h
>
28
#include <linux/sched.h>
29
#include <linux/tty.h>
30
#include <
linux/mutex.h
>
31
#include <
linux/sysrq.h
>
32
#include <
linux/pps_kernel.h
>
33
#include <
uapi/linux/serial_core.h
>
34
35
struct
uart_port
;
36
struct
serial_struct
;
37
struct
device
;
38
39
/*
40
* This structure describes all the operations that can be
41
* done on the physical hardware.
42
*/
43
struct
uart_ops
{
44
unsigned
int
(*
tx_empty
)(
struct
uart_port
*);
45
void
(*
set_mctrl
)(
struct
uart_port
*,
unsigned
int
mctrl
);
46
unsigned
int
(*
get_mctrl
)(
struct
uart_port
*);
47
void
(*
stop_tx
)(
struct
uart_port
*);
48
void
(*
start_tx
)(
struct
uart_port
*);
49
void
(*
send_xchar
)(
struct
uart_port
*,
char
ch);
50
void
(*
stop_rx
)(
struct
uart_port
*);
51
void
(*
enable_ms
)(
struct
uart_port
*);
52
void
(*
break_ctl
)(
struct
uart_port
*,
int
ctl
);
53
int
(*
startup
)(
struct
uart_port
*);
54
void
(*
shutdown
)(
struct
uart_port
*);
55
void
(*
flush_buffer
)(
struct
uart_port
*);
56
void
(*
set_termios
)(
struct
uart_port
*,
struct
ktermios
*
new
,
57
struct
ktermios
*old);
58
void
(*
set_ldisc
)(
struct
uart_port
*,
int
new
);
59
void
(*
pm
)(
struct
uart_port
*,
unsigned
int
state
,
60
unsigned
int
oldstate);
61
int
(*
set_wake
)(
struct
uart_port
*,
unsigned
int
state
);
62
63
/*
64
* Return a string describing the type of the port
65
*/
66
const
char
*(*type)(
struct
uart_port
*);
67
68
/*
69
* Release IO and memory resources used by the port.
70
* This includes iounmap if necessary.
71
*/
72
void
(*
release_port
)(
struct
uart_port
*);
73
74
/*
75
* Request IO and memory resources used by the port.
76
* This includes iomapping the port if necessary.
77
*/
78
int
(*
request_port
)(
struct
uart_port
*);
79
void
(*
config_port
)(
struct
uart_port
*,
int
);
80
int
(*
verify_port
)(
struct
uart_port
*,
struct
serial_struct
*);
81
int
(*
ioctl
)(
struct
uart_port
*,
unsigned
int
,
unsigned
long
);
82
#ifdef CONFIG_CONSOLE_POLL
83
int
(*poll_init)(
struct
uart_port
*);
84
void
(*poll_put_char)(
struct
uart_port
*,
unsigned
char
);
85
int
(*poll_get_char)(
struct
uart_port
*);
86
#endif
87
};
88
89
#define NO_POLL_CHAR 0x00ff0000
90
#define UART_CONFIG_TYPE (1 << 0)
91
#define UART_CONFIG_IRQ (1 << 1)
92
93
struct
uart_icount
{
94
__u32
cts
;
95
__u32
dsr
;
96
__u32
rng
;
97
__u32
dcd
;
98
__u32
rx
;
99
__u32
tx
;
100
__u32
frame
;
101
__u32
overrun
;
102
__u32
parity
;
103
__u32
brk
;
104
__u32
buf_overrun
;
105
};
106
107
typedef
unsigned
int
__bitwise__
upf_t
;
108
109
struct
uart_port
{
110
spinlock_t
lock
;
/* port lock */
111
unsigned
long
iobase
;
/* in/out[bwl] */
112
unsigned
char
__iomem
*
membase
;
/* read/write[bwl] */
113
unsigned
int
(*
serial_in
)(
struct
uart_port
*,
int
);
114
void
(*
serial_out
)(
struct
uart_port
*,
int
,
int
);
115
void
(*
set_termios
)(
struct
uart_port
*,
116
struct
ktermios
*
new
,
117
struct
ktermios
*old);
118
int
(*
handle_irq
)(
struct
uart_port
*);
119
void
(*
pm
)(
struct
uart_port
*,
unsigned
int
state
,
120
unsigned
int
old);
121
void
(*
handle_break
)(
struct
uart_port
*);
122
unsigned
int
irq
;
/* irq number */
123
unsigned
long
irqflags
;
/* irq flags */
124
unsigned
int
uartclk
;
/* base uart clock */
125
unsigned
int
fifosize
;
/* tx fifo size */
126
unsigned
char
x_char
;
/* xon/xoff char */
127
unsigned
char
regshift
;
/* reg offset shift */
128
unsigned
char
iotype
;
/* io access style */
129
unsigned
char
unused1
;
130
131
#define UPIO_PORT (0)
132
#define UPIO_HUB6 (1)
133
#define UPIO_MEM (2)
134
#define UPIO_MEM32 (3)
135
#define UPIO_AU (4)
/* Au1x00 type IO */
136
#define UPIO_TSI (5)
/* Tsi108/109 type IO */
137
#define UPIO_RM9000 (6)
/* RM9000 type IO */
138
139
unsigned
int
read_status_mask
;
/* driver specific */
140
unsigned
int
ignore_status_mask
;
/* driver specific */
141
struct
uart_state
*
state
;
/* pointer to parent state */
142
struct
uart_icount
icount
;
/* statistics */
143
144
struct
console
*
cons
;
/* struct console, if any */
145
#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
146
unsigned
long
sysrq;
/* sysrq timeout */
147
#endif
148
149
upf_t
flags
;
150
151
#define UPF_FOURPORT ((__force upf_t) (1 << 1))
152
#define UPF_SAK ((__force upf_t) (1 << 2))
153
#define UPF_SPD_MASK ((__force upf_t) (0x1030))
154
#define UPF_SPD_HI ((__force upf_t) (0x0010))
155
#define UPF_SPD_VHI ((__force upf_t) (0x0020))
156
#define UPF_SPD_CUST ((__force upf_t) (0x0030))
157
#define UPF_SPD_SHI ((__force upf_t) (0x1000))
158
#define UPF_SPD_WARP ((__force upf_t) (0x1010))
159
#define UPF_SKIP_TEST ((__force upf_t) (1 << 6))
160
#define UPF_AUTO_IRQ ((__force upf_t) (1 << 7))
161
#define UPF_HARDPPS_CD ((__force upf_t) (1 << 11))
162
#define UPF_LOW_LATENCY ((__force upf_t) (1 << 13))
163
#define UPF_BUGGY_UART ((__force upf_t) (1 << 14))
164
#define UPF_NO_TXEN_TEST ((__force upf_t) (1 << 15))
165
#define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16))
166
#define UPF_CONS_FLOW ((__force upf_t) (1 << 23))
167
#define UPF_SHARE_IRQ ((__force upf_t) (1 << 24))
168
#define UPF_EXAR_EFR ((__force upf_t) (1 << 25))
169
#define UPF_BUG_THRE ((__force upf_t) (1 << 26))
170
/* The exact UART type is known and should not be probed. */
171
#define UPF_FIXED_TYPE ((__force upf_t) (1 << 27))
172
#define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28))
173
#define UPF_FIXED_PORT ((__force upf_t) (1 << 29))
174
#define UPF_DEAD ((__force upf_t) (1 << 30))
175
#define UPF_IOREMAP ((__force upf_t) (1 << 31))
176
177
#define UPF_CHANGE_MASK ((__force upf_t) (0x17fff))
178
#define UPF_USR_MASK ((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
179
180
unsigned
int
mctrl
;
/* current modem ctrl settings */
181
unsigned
int
timeout
;
/* character-based timeout */
182
unsigned
int
type
;
/* port type */
183
const
struct
uart_ops
*
ops
;
184
unsigned
int
custom_divisor
;
185
unsigned
int
line
;
/* port index */
186
resource_size_t
mapbase
;
/* for ioremap */
187
struct
device
*
dev
;
/* parent device */
188
unsigned
char
hub6
;
/* this should be in the 8250 driver */
189
unsigned
char
suspended
;
190
unsigned
char
irq_wake
;
191
unsigned
char
unused
[2];
192
void
*
private_data
;
/* generic platform data pointer */
193
};
194
195
static
inline
int
serial_port_in(
struct
uart_port
*
up
,
int
offset
)
196
{
197
return
up->
serial_in
(up, offset);
198
}
199
200
static
inline
void
serial_port_out(
struct
uart_port
*
up
,
int
offset
,
int
value
)
201
{
202
up->
serial_out
(up, offset, value);
203
}
204
205
/*
206
* This is the state information which is persistent across opens.
207
*/
208
struct
uart_state
{
209
struct
tty_port
port
;
210
211
int
pm_state
;
212
struct
circ_buf
xmit
;
213
214
struct
uart_port
*
uart_port
;
215
};
216
217
#define UART_XMIT_SIZE PAGE_SIZE
218
219
220
/* number of characters left in xmit buffer before we ask for more */
221
#define WAKEUP_CHARS 256
222
223
struct
module
;
224
struct
tty_driver
;
225
226
struct
uart_driver
{
227
struct
module
*
owner
;
228
const
char
*
driver_name
;
229
const
char
*
dev_name
;
230
int
major
;
231
int
minor
;
232
int
nr
;
233
struct
console
*
cons
;
234
235
/*
236
* these are private; the low level driver should not
237
* touch these; they should be initialised to NULL
238
*/
239
struct
uart_state
*
state
;
240
struct
tty_driver
*
tty_driver
;
241
};
242
243
void
uart_write_wakeup
(
struct
uart_port
*
port
);
244
245
/*
246
* Baud rate helpers.
247
*/
248
void
uart_update_timeout
(
struct
uart_port
*
port
,
unsigned
int
cflag
,
249
unsigned
int
baud
);
250
unsigned
int
uart_get_baud_rate
(
struct
uart_port
*
port
,
struct
ktermios
*
termios
,
251
struct
ktermios
*old,
unsigned
int
min
,
252
unsigned
int
max
);
253
unsigned
int
uart_get_divisor
(
struct
uart_port
*
port
,
unsigned
int
baud
);
254
255
/* Base timer interval for polling */
256
static
inline
int
uart_poll_timeout(
struct
uart_port
*
port
)
257
{
258
int
timeout
= port->
timeout
;
259
260
return
timeout > 6 ? (timeout / 2 - 2) : 1;
261
}
262
263
/*
264
* Console helpers.
265
*/
266
struct
uart_port
*
uart_get_console
(
struct
uart_port
*ports,
int
nr
,
267
struct
console
*
c
);
268
void
uart_parse_options
(
char
*
options
,
int
*
baud
,
int
*parity,
int
*
bits
,
269
int
*flow);
270
int
uart_set_options
(
struct
uart_port
*
port
,
struct
console
*co,
int
baud
,
271
int
parity,
int
bits
,
int
flow);
272
struct
tty_driver
*
uart_console_device
(
struct
console
*co,
int
*
index
);
273
void
uart_console_write
(
struct
uart_port
*
port
,
const
char
*
s
,
274
unsigned
int
count
,
275
void
(*
putchar
)(
struct
uart_port
*,
int
));
276
277
/*
278
* Port/driver registration/removal
279
*/
280
int
uart_register_driver
(
struct
uart_driver
*
uart
);
281
void
uart_unregister_driver
(
struct
uart_driver
*
uart
);
282
int
uart_add_one_port
(
struct
uart_driver
*
reg
,
struct
uart_port
*port);
283
int
uart_remove_one_port
(
struct
uart_driver
*
reg
,
struct
uart_port
*port);
284
int
uart_match_port
(
struct
uart_port
*port1,
struct
uart_port
*port2);
285
286
/*
287
* Power Management
288
*/
289
int
uart_suspend_port
(
struct
uart_driver
*
reg
,
struct
uart_port
*port);
290
int
uart_resume_port
(
struct
uart_driver
*
reg
,
struct
uart_port
*port);
291
292
#define uart_circ_empty(circ) ((circ)->head == (circ)->tail)
293
#define uart_circ_clear(circ) ((circ)->head = (circ)->tail = 0)
294
295
#define uart_circ_chars_pending(circ) \
296
(CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE))
297
298
#define uart_circ_chars_free(circ) \
299
(CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
300
301
static
inline
int
uart_tx_stopped(
struct
uart_port
*port)
302
{
303
struct
tty_struct
*tty = port->
state
->port.tty;
304
if
(tty->
stopped
|| tty->
hw_stopped
)
305
return
1;
306
return
0;
307
}
308
309
/*
310
* The following are helper functions for the low level drivers.
311
*/
312
313
extern
void
uart_handle_dcd_change
(
struct
uart_port
*uport,
314
unsigned
int
status
);
315
extern
void
uart_handle_cts_change
(
struct
uart_port
*uport,
316
unsigned
int
status
);
317
318
extern
void
uart_insert_char
(
struct
uart_port
*port,
unsigned
int
status
,
319
unsigned
int
overrun
,
unsigned
int
ch,
unsigned
int
flag
);
320
321
#ifdef SUPPORT_SYSRQ
322
static
inline
int
323
uart_handle_sysrq_char
(
struct
uart_port
*port,
unsigned
int
ch)
324
{
325
if
(port->sysrq) {
326
if
(ch &&
time_before
(jiffies, port->sysrq)) {
327
handle_sysrq
(ch);
328
port->sysrq = 0;
329
return
1;
330
}
331
port->sysrq = 0;
332
}
333
return
0;
334
}
335
#else
336
#define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; })
337
#endif
338
339
/*
340
* We do the SysRQ and SAK checking like this...
341
*/
342
static
inline
int
uart_handle_break(
struct
uart_port
*port)
343
{
344
struct
uart_state
*
state
= port->
state
;
345
346
if
(port->
handle_break
)
347
port->
handle_break
(port);
348
349
#ifdef SUPPORT_SYSRQ
350
if
(port->
cons
&& port->
cons
->index == port->
line
) {
351
if
(!port->sysrq) {
352
port->sysrq =
jiffies
+
HZ
*5;
353
return
1;
354
}
355
port->sysrq = 0;
356
}
357
#endif
358
if
(port->
flags
&
UPF_SAK
)
359
do_SAK
(state->
port
.tty);
360
return
0;
361
}
362
363
/*
364
* UART_ENABLE_MS - determine if port should enable modem status irqs
365
*/
366
#define UART_ENABLE_MS(port,cflag) ((port)->flags & UPF_HARDPPS_CD || \
367
(cflag) & CRTSCTS || \
368
!((cflag) & CLOCAL))
369
370
#endif
/* LINUX_SERIAL_CORE_H */
Generated on Thu Jan 10 2013 14:52:34 for Linux Kernel by
1.8.2