Subversion Repositories shark

Rev

Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
422 giacomo 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
 *  $Id: serial_core.h,v 1.1 2004-01-28 15:26:38 giacomo Exp $
21
 */
22
 
23
/*
24
 * The type definitions.  These are from Ted Ts'o's serial.h
25
 */
26
#define PORT_UNKNOWN    0
27
#define PORT_8250       1
28
#define PORT_16450      2
29
#define PORT_16550      3
30
#define PORT_16550A     4
31
#define PORT_CIRRUS     5
32
#define PORT_16650      6
33
#define PORT_16650V2    7
34
#define PORT_16750      8
35
#define PORT_STARTECH   9
36
#define PORT_16C950     10
37
#define PORT_16654      11
38
#define PORT_16850      12
39
#define PORT_RSA        13
40
#define PORT_NS16550A   14
41
#define PORT_MAX_8250   14      /* max port ID */
42
 
43
/*
44
 * ARM specific type numbers.  These are not currently guaranteed
45
 * to be implemented, and will change in the future.  These are
46
 * separate so any additions to the old serial.c that occur before
47
 * we are merged can be easily merged here.
48
 */
49
#define PORT_AMBA       32
50
#define PORT_CLPS711X   33
51
#define PORT_SA1100     34
52
#define PORT_UART00     35
53
#define PORT_21285      37
54
 
55
/* Sparc type numbers.  */
56
#define PORT_SUNZILOG   38
57
#define PORT_SUNSAB     39
58
 
59
/* NEC v850.  */
60
#define PORT_V850E_UART 40
61
 
62
/* NEC PC-9800 */
63
#define PORT_8251_PC98  41
64
#define PORT_19K_PC98   42
65
#define PORT_FIFO_PC98  43
66
#define PORT_VFAST_PC98 44
67
#define PORT_PC9861     45
68
#define PORT_PC9801_101 46
69
 
70
/* DZ */
71
#define PORT_DZ         47
72
 
73
/* Parisc type numbers. */
74
#define PORT_MUX        48
75
 
76
/* Macintosh Zilog type numbers */
77
#define PORT_MAC_ZILOG  50      /* m68k : not yet implemented */
78
#define PORT_PMAC_ZILOG 51
79
 
80
#ifdef __KERNEL__
81
 
82
#include <linux/config.h>
83
#include <linux/interrupt.h>
84
#include <linux/circ_buf.h>
85
#include <linux/spinlock.h>
86
 
87
struct uart_port;
88
struct uart_info;
89
struct serial_struct;
90
 
91
/*
92
 * This structure describes all the operations that can be
93
 * done on the physical hardware.
94
 */
95
struct uart_ops {
96
        unsigned int    (*tx_empty)(struct uart_port *);
97
        void            (*set_mctrl)(struct uart_port *, unsigned int mctrl);
98
        unsigned int    (*get_mctrl)(struct uart_port *);
99
        void            (*stop_tx)(struct uart_port *, unsigned int tty_stop);
100
        void            (*start_tx)(struct uart_port *, unsigned int tty_start);
101
        void            (*send_xchar)(struct uart_port *, char ch);
102
        void            (*stop_rx)(struct uart_port *);
103
        void            (*enable_ms)(struct uart_port *);
104
        void            (*break_ctl)(struct uart_port *, int ctl);
105
        int             (*startup)(struct uart_port *);
106
        void            (*shutdown)(struct uart_port *);
107
        void            (*set_termios)(struct uart_port *, struct termios *new,
108
                                       struct termios *old);
109
        void            (*pm)(struct uart_port *, unsigned int state,
110
                              unsigned int oldstate);
111
        int             (*set_wake)(struct uart_port *, unsigned int state);
112
 
113
        /*
114
         * Return a string describing the type of the port
115
         */
116
        const char *(*type)(struct uart_port *);
117
 
118
        /*
119
         * Release IO and memory resources used by the port.
120
         * This includes iounmap if necessary.
121
         */
122
        void            (*release_port)(struct uart_port *);
123
 
124
        /*
125
         * Request IO and memory resources used by the port.
126
         * This includes iomapping the port if necessary.
127
         */
128
        int             (*request_port)(struct uart_port *);
129
        void            (*config_port)(struct uart_port *, int);
130
        int             (*verify_port)(struct uart_port *, struct serial_struct *);
131
        int             (*ioctl)(struct uart_port *, unsigned int, unsigned long);
132
};
133
 
134
#define UART_CONFIG_TYPE        (1 << 0)
135
#define UART_CONFIG_IRQ         (1 << 1)
136
 
137
struct uart_icount {
138
        __u32   cts;
139
        __u32   dsr;
140
        __u32   rng;
141
        __u32   dcd;
142
        __u32   rx;
143
        __u32   tx;
144
        __u32   frame;
145
        __u32   overrun;
146
        __u32   parity;
147
        __u32   brk;
148
        __u32   buf_overrun;
149
};
150
 
151
struct uart_port {
152
        spinlock_t              lock;                   /* port lock */
153
        unsigned int            iobase;                 /* in/out[bwl] */
154
        char                    *membase;               /* read/write[bwl] */
155
        unsigned int            irq;                    /* irq number */
156
        unsigned int            uartclk;                /* base uart clock */
157
        unsigned char           fifosize;               /* tx fifo size */
158
        unsigned char           x_char;                 /* xon/xoff char */
159
        unsigned char           regshift;               /* reg offset shift */
160
        unsigned char           iotype;                 /* io access style */
161
 
162
#define UPIO_PORT               (0)
163
#define UPIO_HUB6               (1)
164
#define UPIO_MEM                (2)
165
 
166
        unsigned int            read_status_mask;       /* driver specific */
167
        unsigned int            ignore_status_mask;     /* driver specific */
168
        struct uart_info        *info;                  /* pointer to parent info */
169
        struct uart_icount      icount;                 /* statistics */
170
 
171
        struct console          *cons;                  /* struct console, if any */
172
#ifdef CONFIG_SERIAL_CORE_CONSOLE
173
        unsigned long           sysrq;                  /* sysrq timeout */
174
#endif
175
 
176
        unsigned int            flags;
177
 
178
#define UPF_HUP_NOTIFY          (1 << 0)
179
#define UPF_FOURPORT            (1 << 1)
180
#define UPF_SAK                 (1 << 2)
181
#define UPF_SPD_MASK            (0x1030)
182
#define UPF_SPD_HI              (0x0010)
183
#define UPF_SPD_VHI             (0x0020)
184
#define UPF_SPD_CUST            (0x0030)
185
#define UPF_SPD_SHI             (0x1000)
186
#define UPF_SPD_WARP            (0x1010)
187
#define UPF_SKIP_TEST           (1 << 6)
188
#define UPF_AUTO_IRQ            (1 << 7)
189
#define UPF_HARDPPS_CD          (1 << 11)
190
#define UPF_LOW_LATENCY         (1 << 13)
191
#define UPF_BUGGY_UART          (1 << 14)
192
#define UPF_AUTOPROBE           (1 << 15)
193
#define UPF_MAGIC_MULTIPLIER    (1 << 16)
194
#define UPF_BOOT_ONLYMCA        (1 << 22)
195
#define UPF_CONS_FLOW           (1 << 23)
196
#define UPF_SHARE_IRQ           (1 << 24)
197
#define UPF_BOOT_AUTOCONF       (1 << 28)
198
#define UPF_RESOURCES           (1 << 30)
199
#define UPF_IOREMAP             (1 << 31)
200
 
201
#define UPF_CHANGE_MASK         (0x17fff)
202
#define UPF_USR_MASK            (UPF_SPD_MASK|UPF_LOW_LATENCY)
203
 
204
        unsigned int            mctrl;                  /* current modem ctrl settings */
205
        unsigned int            timeout;                /* character-based timeout */
206
        unsigned int            type;                   /* port type */
207
        struct uart_ops         *ops;
208
        unsigned int            custom_divisor;
209
        unsigned int            line;                   /* port index */
210
        unsigned long           mapbase;                /* for ioremap */
211
        unsigned char           hub6;                   /* this should be in the 8250 driver */
212
        unsigned char           unused[3];
213
};
214
 
215
/*
216
 * This is the state information which is persistent across opens.
217
 * The low level driver must not to touch any elements contained
218
 * within.
219
 */
220
struct uart_state {
221
        unsigned int            close_delay;
222
        unsigned int            closing_wait;
223
 
224
#define USF_CLOSING_WAIT_INF    (0)
225
#define USF_CLOSING_WAIT_NONE   (65535)
226
 
227
        int                     count;
228
        int                     pm_state;
229
        struct uart_info        *info;
230
        struct uart_port        *port;
231
 
232
        struct semaphore        sem;
233
};
234
 
235
#define UART_XMIT_SIZE 1024
236
/*
237
 * This is the state information which is only valid when the port
238
 * is open; it may be freed by the core driver once the device has
239
 * been closed.  Either the low level driver or the core can modify
240
 * stuff here.
241
 */
242
struct uart_info {
243
        struct tty_struct       *tty;
244
        struct circ_buf         xmit;
245
        unsigned int            flags;
246
 
247
/*
248
 * These are the flags that specific to info->flags, and reflect our
249
 * internal state.  They can not be accessed via port->flags.  Low
250
 * level drivers must not change these, but may query them instead.
251
 */
252
#define UIF_CHECK_CD            (1 << 25)
253
#define UIF_CTS_FLOW            (1 << 26)
254
#define UIF_NORMAL_ACTIVE       (1 << 29)
255
#define UIF_INITIALIZED         (1 << 31)
256
 
257
        unsigned char           *tmpbuf;
258
        struct semaphore        tmpbuf_sem;
259
 
260
        int                     blocked_open;
261
 
262
        struct tasklet_struct   tlet;
263
 
264
        wait_queue_head_t       open_wait;
265
        wait_queue_head_t       delta_msr_wait;
266
};
267
 
268
/* number of characters left in xmit buffer before we ask for more */
269
#define WAKEUP_CHARS            256
270
 
271
struct module;
272
struct tty_driver;
273
 
274
struct uart_driver {
275
        struct module           *owner;
276
        const char              *driver_name;
277
        const char              *dev_name;
278
        const char              *devfs_name;
279
        int                      major;
280
        int                      minor;
281
        int                      nr;
282
        struct console          *cons;
283
 
284
        /*
285
         * these are private; the low level driver should not
286
         * touch these; they should be initialised to NULL
287
         */
288
        struct uart_state       *state;
289
        struct tty_driver       *tty_driver;
290
};
291
 
292
void uart_write_wakeup(struct uart_port *port);
293
 
294
/*
295
 * Baud rate helpers.
296
 */
297
void uart_update_timeout(struct uart_port *port, unsigned int cflag,
298
                         unsigned int baud);
299
unsigned int uart_get_baud_rate(struct uart_port *port, struct termios *termios,
300
                                struct termios *old, unsigned int min,
301
                                unsigned int max);
302
unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud);
303
 
304
/*
305
 * Console helpers.
306
 */
307
struct uart_port *uart_get_console(struct uart_port *ports, int nr,
308
                                   struct console *c);
309
void uart_parse_options(char *options, int *baud, int *parity, int *bits,
310
                        int *flow);
311
int uart_set_options(struct uart_port *port, struct console *co, int baud,
312
                     int parity, int bits, int flow);
313
struct tty_driver *uart_console_device(struct console *co, int *index);
314
 
315
/*
316
 * Port/driver registration/removal
317
 */
318
int uart_register_driver(struct uart_driver *uart);
319
void uart_unregister_driver(struct uart_driver *uart);
320
void uart_unregister_port(struct uart_driver *reg, int line);
321
int uart_register_port(struct uart_driver *reg, struct uart_port *port);
322
int uart_add_one_port(struct uart_driver *reg, struct uart_port *port);
323
int uart_remove_one_port(struct uart_driver *reg, struct uart_port *port);
324
 
325
/*
326
 * Power Management
327
 */
328
int uart_suspend_port(struct uart_driver *reg, struct uart_port *port);
329
int uart_resume_port(struct uart_driver *reg, struct uart_port *port);
330
 
331
#define uart_circ_empty(circ)           ((circ)->head == (circ)->tail)
332
#define uart_circ_clear(circ)           ((circ)->head = (circ)->tail = 0)
333
 
334
#define uart_circ_chars_pending(circ)   \
335
        (CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE))
336
 
337
#define uart_circ_chars_free(circ)      \
338
        (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
339
 
340
#define uart_tx_stopped(port)           \
341
        ((port)->info->tty->stopped || (port)->info->tty->hw_stopped)
342
 
343
/*
344
 * The following are helper functions for the low level drivers.
345
 */
346
#ifdef SUPPORT_SYSRQ
347
static inline int
348
uart_handle_sysrq_char(struct uart_port *port, unsigned int ch,
349
                       struct pt_regs *regs)
350
{
351
        if (port->sysrq) {
352
                if (ch && time_before(jiffies, port->sysrq)) {
353
                        handle_sysrq(ch, regs, NULL);
354
                        port->sysrq = 0;
355
                        return 1;
356
                }
357
                port->sysrq = 0;
358
        }
359
        return 0;
360
}
361
#else
362
#define uart_handle_sysrq_char(port,ch,regs)    (0)
363
#endif
364
 
365
/*
366
 * We do the SysRQ and SAK checking like this...
367
 */
368
static inline int uart_handle_break(struct uart_port *port)
369
{
370
        struct uart_info *info = port->info;
371
#ifdef SUPPORT_SYSRQ
372
        if (port->cons && port->cons->index == port->line) {
373
                if (!port->sysrq) {
374
                        port->sysrq = jiffies + HZ*5;
375
                        return 1;
376
                }
377
                port->sysrq = 0;
378
        }
379
#endif
380
        if (info->flags & UPF_SAK)
381
                do_SAK(info->tty);
382
        return 0;
383
}
384
 
385
/**
386
 *      uart_handle_dcd_change - handle a change of carrier detect state
387
 *      @port: uart_port structure for the open port
388
 *      @status: new carrier detect status, nonzero if active
389
 */
390
static inline void
391
uart_handle_dcd_change(struct uart_port *port, unsigned int status)
392
{
393
        struct uart_info *info = port->info;
394
 
395
        port->icount.dcd++;
396
 
397
#ifdef CONFIG_HARD_PPS
398
        if ((port->flags & UPF_HARDPPS_CD) && status)
399
                hardpps();
400
#endif
401
 
402
        if (info->flags & UIF_CHECK_CD) {
403
                if (status)
404
                        wake_up_interruptible(&info->open_wait);
405
                else if (info->tty)
406
                        tty_hangup(info->tty);
407
        }
408
}
409
 
410
/**
411
 *      uart_handle_cts_change - handle a change of clear-to-send state
412
 *      @port: uart_port structure for the open port
413
 *      @status: new clear to send status, nonzero if active
414
 */
415
static inline void
416
uart_handle_cts_change(struct uart_port *port, unsigned int status)
417
{
418
        struct uart_info *info = port->info;
419
        struct tty_struct *tty = info->tty;
420
 
421
        port->icount.cts++;
422
 
423
        if (info->flags & UIF_CTS_FLOW) {
424
                if (tty->hw_stopped) {
425
                        if (status) {
426
                                tty->hw_stopped = 0;
427
                                port->ops->start_tx(port, 0);
428
                                uart_write_wakeup(port);
429
                        }
430
                } else {
431
                        if (!status) {
432
                                tty->hw_stopped = 1;
433
                                port->ops->stop_tx(port, 0);
434
                        }
435
                }
436
        }
437
}
438
 
439
/*
440
 *      UART_ENABLE_MS - determine if port should enable modem status irqs
441
 */
442
#define UART_ENABLE_MS(port,cflag)      ((port)->flags & UPF_HARDPPS_CD || \
443
                                         (cflag) & CRTSCTS || \
444
                                         !((cflag) & CLOCAL))
445
 
446
#endif