FreeBSD/Linux Kernel Cross Reference
sys/dev/ic/comvar.h
1 /* $NetBSD: comvar.h,v 1.54 2006/07/13 22:56:02 gdamore Exp $ */
2
3 /*
4 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by Christopher G. Demetriou
17 * for the NetBSD Project.
18 * 4. The name of the author may not be used to endorse or promote products
19 * derived from this software without specific prior written permission
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #include "rnd.h"
34 #include "opt_multiprocessor.h"
35 #include "opt_lockdebug.h"
36 #include "opt_com.h"
37 #include "opt_kgdb.h"
38
39 #if NRND > 0 && defined(RND_COM)
40 #include <sys/rnd.h>
41 #endif
42
43 #include <sys/callout.h>
44 #include <sys/timepps.h>
45 #include <sys/lock.h>
46
47 #include <dev/ic/comreg.h> /* for COM_NPORTS */
48
49 struct com_regs;
50
51 int comcnattach(bus_space_tag_t, bus_addr_t, int, int, int, tcflag_t);
52 int comcnattach1(struct com_regs *, int, int, int, tcflag_t);
53
54 #ifdef KGDB
55 int com_kgdb_attach(bus_space_tag_t, bus_addr_t, int, int, int, tcflag_t);
56 int com_kgdb_attach1(struct com_regs *, int, int, int, tcflag_t);
57 #endif
58
59 int com_is_console(bus_space_tag_t, bus_addr_t, bus_space_handle_t *);
60
61 /* Hardware flag masks */
62 #define COM_HW_NOIEN 0x01
63 #define COM_HW_FIFO 0x02
64 /* 0x04 free for use */
65 #define COM_HW_FLOW 0x08
66 #define COM_HW_DEV_OK 0x20
67 #define COM_HW_CONSOLE 0x40
68 #define COM_HW_KGDB 0x80
69 #define COM_HW_TXFIFO_DISABLE 0x100
70 #define COM_HW_NO_TXPRELOAD 0x200
71
72 /* Buffer size for character buffer */
73 #define COM_RING_SIZE 2048
74
75 #ifdef COM_REGMAP
76 #define COM_REG_RXDATA 0
77 #define COM_REG_TXDATA 1
78 #define COM_REG_DLBL 2
79 #define COM_REG_DLBH 3
80 #define COM_REG_IER 4
81 #define COM_REG_IIR 5
82 #define COM_REG_FIFO 6
83 #define COM_REG_EFR 7
84 #define COM_REG_LCR 8
85 #define COM_REG_MCR 9
86 #define COM_REG_LSR 10
87 #define COM_REG_MSR 11
88
89 struct com_regs {
90 bus_space_tag_t cr_iot;
91 bus_space_handle_t cr_ioh;
92 bus_addr_t cr_iobase;
93 bus_size_t cr_nports;
94 bus_size_t cr_map[16];
95 };
96
97 extern const bus_size_t com_std_map[16];
98
99 #define COM_INIT_REGS(regs, tag, hdl, addr) \
100 do { \
101 regs.cr_iot = tag; \
102 regs.cr_ioh = hdl; \
103 regs.cr_iobase = addr; \
104 regs.cr_nports = COM_NPORTS; \
105 memcpy(regs.cr_map, com_std_map, sizeof (regs.cr_map)); \
106 } while (0)
107
108 #else
109 #define COM_REG_RXDATA com_data
110 #define COM_REG_TXDATA com_data
111 #define COM_REG_DLBL com_dlbl
112 #define COM_REG_DLBH com_dlbh
113 #define COM_REG_IER com_ier
114 #define COM_REG_IIR com_iir
115 #define COM_REG_FIFO com_fifo
116 #define COM_REG_EFR com_efr
117 #define COM_REG_LCR com_lctl
118 #define COM_REG_MCR com_mcr
119 #define COM_REG_LSR com_lsr
120 #define COM_REG_MSR com_msr
121
122 struct com_regs {
123 bus_space_tag_t cr_iot;
124 bus_space_handle_t cr_ioh;
125 bus_addr_t cr_iobase;
126 bus_size_t cr_nports;
127 };
128
129 #define COM_INIT_REGS(regs, tag, hdl, addr) \
130 do { \
131 regs.cr_iot = tag; \
132 regs.cr_ioh = hdl; \
133 regs.cr_iobase = addr; \
134 regs.cr_nports = COM_NPORTS; \
135 } while (0)
136
137 #endif
138
139 struct com_softc {
140 struct device sc_dev;
141 void *sc_si;
142 struct tty *sc_tty;
143
144 struct callout sc_diag_callout;
145
146 int sc_frequency;
147
148 struct com_regs sc_regs;
149 bus_space_handle_t sc_hayespioh;
150
151
152 u_int sc_overflows,
153 sc_floods,
154 sc_errors;
155
156 int sc_hwflags,
157 sc_swflags;
158 u_int sc_fifolen;
159
160 u_int sc_r_hiwat,
161 sc_r_lowat;
162 u_char *volatile sc_rbget,
163 *volatile sc_rbput;
164 volatile u_int sc_rbavail;
165 u_char *sc_rbuf,
166 *sc_ebuf;
167
168 u_char *sc_tba;
169 u_int sc_tbc,
170 sc_heldtbc;
171
172 volatile u_char sc_rx_flags,
173 #define RX_TTY_BLOCKED 0x01
174 #define RX_TTY_OVERFLOWED 0x02
175 #define RX_IBUF_BLOCKED 0x04
176 #define RX_IBUF_OVERFLOWED 0x08
177 #define RX_ANY_BLOCK 0x0f
178 sc_tx_busy,
179 sc_tx_done,
180 sc_tx_stopped,
181 sc_st_check,
182 sc_rx_ready;
183
184 volatile u_char sc_heldchange;
185 volatile u_char sc_msr, sc_msr_delta, sc_msr_mask, sc_mcr,
186 sc_mcr_active, sc_lcr, sc_ier, sc_fifo, sc_dlbl, sc_dlbh, sc_efr;
187 u_char sc_mcr_dtr, sc_mcr_rts, sc_msr_cts, sc_msr_dcd;
188
189 #ifdef COM_HAYESP
190 u_char sc_prescaler;
191 #endif
192
193 /*
194 * There are a great many almost-ns16550-compatible UARTs out
195 * there, which have minor differences. The type field here
196 * lets us distinguish between them.
197 */
198 int sc_type;
199 #define COM_TYPE_NORMAL 0 /* normal 16x50 */
200 #define COM_TYPE_HAYESP 1 /* Hayes ESP modem */
201 #define COM_TYPE_PXA2x0 2 /* Intel PXA2x0 processor built-in */
202 #define COM_TYPE_AU1x00 3 /* AMD/Alchemy Au1x000 proc. built-in */
203
204 /* power management hooks */
205 int (*enable)(struct com_softc *);
206 void (*disable)(struct com_softc *);
207 int enabled;
208
209 #ifdef __HAVE_TIMECOUNTER
210 struct pps_state sc_pps_state; /* pps state */
211 #else /* !__HAVE_TIMECOUNTER */
212 /* PPS signal on DCD, with or without inkernel clock disciplining */
213 u_char sc_ppsmask; /* pps signal mask */
214 u_char sc_ppsassert; /* pps leading edge */
215 u_char sc_ppsclear; /* pps trailing edge */
216 pps_info_t ppsinfo;
217 pps_params_t ppsparam;
218 #endif /* !__HAVE_TIMECOUNTER */
219
220 #if NRND > 0 && defined(RND_COM)
221 rndsource_element_t rnd_source;
222 #endif
223 void *sc_powerhook; /* power management hook */
224 struct simplelock sc_lock;
225 };
226
227 int comprobe1(bus_space_tag_t, bus_space_handle_t);
228 int comintr(void *);
229 void com_attach_subr(struct com_softc *);
230 int com_probe_subr(struct com_regs *);
231 int com_detach(struct device *, int);
232 int com_activate(struct device *, enum devact);
233 void com_cleanup(void *);
234
235 #ifndef __HAVE_GENERIC_SOFT_INTERRUPTS
236 #ifdef __NO_SOFT_SERIAL_INTERRUPT
237 #define IPL_SERIAL IPL_TTY
238 #define splserial() spltty()
239 #define IPL_SOFTSERIAL IPL_TTY
240 #define splsoftserial() spltty()
241 #endif
242 #endif
Cache object: 6d8adfa15f75273fcb1739965c8c0877
|