more changes on original files
[linux-2.4.git] / include / linux / serialP.h
1 /*
2  * Private header file for the (dumb) serial driver
3  *
4  * Copyright (C) 1997 by Theodore Ts'o.
5  * 
6  * Redistribution of this file is permitted under the terms of the GNU 
7  * Public License (GPL)
8  */
9
10 #ifndef _LINUX_SERIALP_H
11 #define _LINUX_SERIALP_H
12
13 /*
14  * This is our internal structure for each serial port's state.
15  * 
16  * Many fields are paralleled by the structure used by the serial_struct
17  * structure.
18  *
19  * For definitions of the flags field, see tty.h
20  */
21
22 #include <linux/config.h>
23 #include <linux/termios.h>
24 #include <linux/tqueue.h>
25 #include <linux/circ_buf.h>
26 #include <linux/wait.h>
27 #if (LINUX_VERSION_CODE < 0x020300)
28 /* Unfortunate, but Linux 2.2 needs async_icount defined here and
29  * it got moved in 2.3 */
30 #include <linux/serial.h>
31 #endif
32
33 struct serial_state {
34         int     magic;
35         int     baud_base;
36         unsigned long   port;
37         int     irq;
38         int     flags;
39         int     hub6;
40         int     type;
41         int     line;
42         int     revision;       /* Chip revision (950) */
43         int     xmit_fifo_size;
44         int     custom_divisor;
45         int     count;
46         u8      *iomem_base;
47         u16     iomem_reg_shift;
48         unsigned short  close_delay;
49         unsigned short  closing_wait; /* time to wait before closing */
50         struct async_icount     icount; 
51         struct termios          normal_termios;
52         struct termios          callout_termios;
53         int     io_type;
54         struct async_struct *info;
55         struct pci_dev  *dev;
56 };
57
58 struct async_struct {
59         int                     magic;
60         unsigned long           port;
61         int                     hub6;
62         int                     flags;
63         int                     xmit_fifo_size;
64         struct serial_state     *state;
65         struct tty_struct       *tty;
66         int                     read_status_mask;
67         int                     ignore_status_mask;
68         int                     timeout;
69         int                     quot;
70         int                     x_char; /* xon/xoff character */
71         int                     close_delay;
72         unsigned short          closing_wait;
73         unsigned short          closing_wait2;
74         int                     IER;    /* Interrupt Enable Register */
75         int                     MCR;    /* Modem control register */
76         int                     LCR;    /* Line control register */
77         int                     ACR;     /* 16950 Additional Control Reg. */
78         unsigned long           event;
79         unsigned long           last_active;
80         int                     line;
81         int                     blocked_open; /* # of blocked opens */
82         long                    session; /* Session of opening process */
83         long                    pgrp; /* pgrp of opening process */
84         struct circ_buf         xmit;
85         spinlock_t              xmit_lock;
86         u8                      *iomem_base;
87         u16                     iomem_reg_shift;
88         int                     io_type;
89         struct tq_struct        tqueue;
90 #ifdef DECLARE_WAITQUEUE
91         wait_queue_head_t       open_wait;
92         wait_queue_head_t       close_wait;
93         wait_queue_head_t       delta_msr_wait;
94 #else   
95         struct wait_queue       *open_wait;
96         struct wait_queue       *close_wait;
97         struct wait_queue       *delta_msr_wait;
98 #endif  
99         struct async_struct     *next_port; /* For the linked list */
100         struct async_struct     *prev_port;
101 };
102
103 #define CONFIGURED_SERIAL_PORT(info) ((info)->port || ((info)->iomem_base))
104
105 #define SERIAL_MAGIC 0x5301
106 #define SSTATE_MAGIC 0x5302
107
108 /*
109  * Events are used to schedule things to happen at timer-interrupt
110  * time, instead of at rs interrupt time.
111  */
112 #define RS_EVENT_WRITE_WAKEUP   0
113
114 /*
115  * Multiport serial configuration structure --- internal structure
116  */
117 struct rs_multiport_struct {
118         int             port1;
119         unsigned char   mask1, match1;
120         int             port2;
121         unsigned char   mask2, match2;
122         int             port3;
123         unsigned char   mask3, match3;
124         int             port4;
125         unsigned char   mask4, match4;
126         int             port_monitor;
127 };
128
129 #if defined(__alpha__) && !defined(CONFIG_PCI)
130 /*
131  * Digital did something really horribly wrong with the OUT1 and OUT2
132  * lines on at least some ALPHA's.  The failure mode is that if either
133  * is cleared, the machine locks up with endless interrupts.
134  */
135 #define ALPHA_KLUDGE_MCR  (UART_MCR_OUT2 | UART_MCR_OUT1)
136 #else
137 #define ALPHA_KLUDGE_MCR 0
138 #endif
139
140 /*
141  * Structures and definitions for PCI support
142  */
143 struct pci_dev;
144 struct pci_board {
145         int flags;
146         int num_ports;
147         int base_baud;
148         int uart_offset;
149         int reg_shift;
150         int (*init_fn)(struct pci_dev *dev, struct pci_board *board,
151                         int enable);
152         int first_uart_offset;
153 };
154
155 struct pci_board_inst {
156         struct pci_board        board;
157         struct pci_dev          *dev;
158 };
159
160 extern int pci_siig10x_fn(struct pci_dev *dev, struct pci_board *board, int enable);
161 extern int pci_siig20x_fn(struct pci_dev *dev, struct pci_board *board, int enable);
162
163 #ifndef PCI_ANY_ID
164 #define PCI_ANY_ID (~0)
165 #endif
166
167 #define SPCI_FL_BASE_MASK       0x0007
168 #define SPCI_FL_BASE0   0x0000
169 #define SPCI_FL_BASE1   0x0001
170 #define SPCI_FL_BASE2   0x0002
171 #define SPCI_FL_BASE3   0x0003
172 #define SPCI_FL_BASE4   0x0004
173 #define SPCI_FL_GET_BASE(x)     (x & SPCI_FL_BASE_MASK)
174
175 #define SPCI_FL_IRQ_MASK       (0x0007 << 4)
176 #define SPCI_FL_IRQBASE0       (0x0000 << 4)
177 #define SPCI_FL_IRQBASE1       (0x0001 << 4)
178 #define SPCI_FL_IRQBASE2       (0x0002 << 4)
179 #define SPCI_FL_IRQBASE3       (0x0003 << 4)
180 #define SPCI_FL_IRQBASE4       (0x0004 << 4)
181 #define SPCI_FL_GET_IRQBASE(x)        ((x & SPCI_FL_IRQ_MASK) >> 4)
182
183 /* Use successive BARs (PCI base address registers), 
184    else use offset into some specified BAR */
185 #define SPCI_FL_BASE_TABLE      0x0100
186
187 /* Use successive entries in the irq resource table */
188 #define SPCI_FL_IRQ_TABLE       0x0200
189
190 /* Use the irq resource table instead of dev->irq */
191 #define SPCI_FL_IRQRESOURCE     0x0400
192
193 /* Use the Base address register size to cap number of ports */
194 #define SPCI_FL_REGION_SZ_CAP   0x0800
195
196 /* Do not use irq sharing for this device */
197 #define SPCI_FL_NO_SHIRQ        0x1000
198
199 /* This is a PNP device */
200 #define SPCI_FL_ISPNP           0x2000
201
202 #define SPCI_FL_PNPDEFAULT      (SPCI_FL_IRQRESOURCE|SPCI_FL_ISPNP)
203
204 #endif /* _LINUX_SERIAL_H */