tx39io.c revision 1.3.2.2 1 1.3.2.2 wrstuden /* $NetBSD: tx39io.c,v 1.3.2.2 1999/12/27 18:32:12 wrstuden Exp $ */
2 1.3.2.2 wrstuden
3 1.3.2.2 wrstuden /*
4 1.3.2.2 wrstuden * Copyright (c) 1999, by UCHIYAMA Yasushi
5 1.3.2.2 wrstuden * All rights reserved.
6 1.3.2.2 wrstuden *
7 1.3.2.2 wrstuden * Redistribution and use in source and binary forms, with or without
8 1.3.2.2 wrstuden * modification, are permitted provided that the following conditions
9 1.3.2.2 wrstuden * are met:
10 1.3.2.2 wrstuden * 1. Redistributions of source code must retain the above copyright
11 1.3.2.2 wrstuden * notice, this list of conditions and the following disclaimer.
12 1.3.2.2 wrstuden * 2. The name of the developer may NOT be used to endorse or promote products
13 1.3.2.2 wrstuden * derived from this software without specific prior written permission.
14 1.3.2.2 wrstuden *
15 1.3.2.2 wrstuden * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 1.3.2.2 wrstuden * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 1.3.2.2 wrstuden * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 1.3.2.2 wrstuden * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.3.2.2 wrstuden * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.3.2.2 wrstuden * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 1.3.2.2 wrstuden * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.3.2.2 wrstuden * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.3.2.2 wrstuden * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.3.2.2 wrstuden * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.3.2.2 wrstuden * SUCH DAMAGE.
26 1.3.2.2 wrstuden *
27 1.3.2.2 wrstuden */
28 1.3.2.2 wrstuden #include "opt_tx39_debug.h"
29 1.3.2.2 wrstuden #include "opt_tx39iodebug.h"
30 1.3.2.2 wrstuden
31 1.3.2.2 wrstuden #include <sys/param.h>
32 1.3.2.2 wrstuden #include <sys/systm.h>
33 1.3.2.2 wrstuden #include <sys/device.h>
34 1.3.2.2 wrstuden
35 1.3.2.2 wrstuden #include <machine/bus.h>
36 1.3.2.2 wrstuden
37 1.3.2.2 wrstuden #include <hpcmips/tx/tx39var.h>
38 1.3.2.2 wrstuden #include <hpcmips/tx/tx39ioreg.h>
39 1.3.2.2 wrstuden #include <hpcmips/tx/tx39icureg.h>
40 1.3.2.2 wrstuden
41 1.3.2.2 wrstuden #define TX39IO_ATTACH_DUMMYHANDLER 0
42 1.3.2.2 wrstuden #undef TX39IO_MFIOOUTPORT_ON
43 1.3.2.2 wrstuden
44 1.3.2.2 wrstuden int tx39io_match __P((struct device*, struct cfdata*, void*));
45 1.3.2.2 wrstuden void tx39io_attach __P((struct device*, struct device*, void*));
46 1.3.2.2 wrstuden
47 1.3.2.2 wrstuden struct tx39io_softc {
48 1.3.2.2 wrstuden struct device sc_dev;
49 1.3.2.2 wrstuden tx_chipset_tag_t sc_tc;
50 1.3.2.2 wrstuden };
51 1.3.2.2 wrstuden
52 1.3.2.2 wrstuden struct cfattach tx39io_ca = {
53 1.3.2.2 wrstuden sizeof(struct tx39io_softc), tx39io_match, tx39io_attach
54 1.3.2.2 wrstuden };
55 1.3.2.2 wrstuden
56 1.3.2.2 wrstuden int tx39io_intr __P((void*));
57 1.3.2.2 wrstuden int tx39mfio_intr __P((void*));
58 1.3.2.2 wrstuden
59 1.3.2.2 wrstuden void tx39io_dump_and_attach_handler __P((struct tx39io_softc*, int));
60 1.3.2.2 wrstuden void __dump_and_attach_handler __P((tx_chipset_tag_t, u_int32_t, u_int32_t, u_int32_t, u_int32_t, int, int, int (*) __P((void*)), void*));
61 1.3.2.2 wrstuden
62 1.3.2.2 wrstuden #define ISSET(x, s) ((x) & (1 << (s)))
63 1.3.2.2 wrstuden #define STD_IN 1
64 1.3.2.2 wrstuden #define STD_OUT 2
65 1.3.2.2 wrstuden #define STD_INOUT 3
66 1.3.2.2 wrstuden
67 1.3.2.2 wrstuden struct {
68 1.3.2.2 wrstuden char *std_pin_name;
69 1.3.2.2 wrstuden int std_type;
70 1.3.2.2 wrstuden } mfio_map[TX39_IO_MFIO_MAX] = {
71 1.3.2.2 wrstuden [31] = {"CHIFS", STD_INOUT},
72 1.3.2.2 wrstuden [30] = {"CHICLK", STD_INOUT},
73 1.3.2.2 wrstuden [29] = {"CHIDOUT", STD_OUT},
74 1.3.2.2 wrstuden [28] = {"CHIDIN", STD_IN},
75 1.3.2.2 wrstuden [27] = {"DREQ", STD_IN},
76 1.3.2.2 wrstuden [26] = {"DGRINT", STD_OUT},
77 1.3.2.2 wrstuden [25] = {"BC32K", STD_OUT},
78 1.3.2.2 wrstuden [24] = {"TXD", STD_OUT},
79 1.3.2.2 wrstuden [23] = {"RXD", STD_IN},
80 1.3.2.2 wrstuden [22] = {"CS1", STD_OUT},
81 1.3.2.2 wrstuden [21] = {"CS2", STD_OUT},
82 1.3.2.2 wrstuden [20] = {"CS3", STD_OUT},
83 1.3.2.2 wrstuden [19] = {"MCS0", STD_OUT},
84 1.3.2.2 wrstuden [18] = {"MCS1", STD_OUT},
85 1.3.2.2 wrstuden #ifdef TX391X
86 1.3.2.2 wrstuden [17] = {"MCS2", STD_OUT},
87 1.3.2.2 wrstuden [16] = {"MCS3", STD_OUT},
88 1.3.2.2 wrstuden #endif /* TX391X */
89 1.3.2.2 wrstuden #ifdef TX392X
90 1.3.2.2 wrstuden [17] = {"RXPWR", STD_OUT},
91 1.3.2.2 wrstuden [16] = {"IROUT", STD_OUT},
92 1.3.2.2 wrstuden #endif /* TX392X */
93 1.3.2.2 wrstuden [15] = {"SPICLK", STD_OUT},
94 1.3.2.2 wrstuden [14] = {"SPIOUT", STD_OUT},
95 1.3.2.2 wrstuden [13] = {"SPIN", STD_IN},
96 1.3.2.2 wrstuden [12] = {"SIBMCLK", STD_INOUT},
97 1.3.2.2 wrstuden [11] = {"CARDREG", STD_OUT},
98 1.3.2.2 wrstuden [10] = {"CARDIOWR", STD_OUT},
99 1.3.2.2 wrstuden [9] = {"CARDIORD", STD_OUT},
100 1.3.2.2 wrstuden [8] = {"CARD1CSL", STD_OUT},
101 1.3.2.2 wrstuden [7] = {"CARD1CSH", STD_OUT},
102 1.3.2.2 wrstuden [6] = {"CARD2CSL", STD_OUT},
103 1.3.2.2 wrstuden [5] = {"CARD2CSH", STD_OUT},
104 1.3.2.2 wrstuden [4] = {"CARD1WAIT", STD_IN},
105 1.3.2.2 wrstuden [3] = {"CARD2WAIT", STD_IN},
106 1.3.2.2 wrstuden [2] = {"CARDDIR", STD_OUT},
107 1.3.2.2 wrstuden #ifdef TX391X
108 1.3.2.2 wrstuden [1] = {"MFIO[1]", 0},
109 1.3.2.2 wrstuden [0] = {"MFIO[0]", 0}
110 1.3.2.2 wrstuden #endif /* TX391X */
111 1.3.2.2 wrstuden #ifdef TX392X
112 1.3.2.2 wrstuden [1] = {"MCS1WAIT", 0},
113 1.3.2.2 wrstuden [0] = {"MCS0WAIT", 0}
114 1.3.2.2 wrstuden #endif /* TX392X */
115 1.3.2.2 wrstuden };
116 1.3.2.2 wrstuden
117 1.3.2.2 wrstuden int
118 1.3.2.2 wrstuden tx39io_match(parent, cf, aux)
119 1.3.2.2 wrstuden struct device *parent;
120 1.3.2.2 wrstuden struct cfdata *cf;
121 1.3.2.2 wrstuden void *aux;
122 1.3.2.2 wrstuden {
123 1.3.2.2 wrstuden
124 1.3.2.2 wrstuden return 1;
125 1.3.2.2 wrstuden }
126 1.3.2.2 wrstuden
127 1.3.2.2 wrstuden int
128 1.3.2.2 wrstuden tx39io_intr(arg)
129 1.3.2.2 wrstuden void *arg;
130 1.3.2.2 wrstuden {
131 1.3.2.2 wrstuden #ifdef TX39_DEBUG
132 1.3.2.2 wrstuden #if 0
133 1.3.2.2 wrstuden static int i;
134 1.3.2.2 wrstuden if (i ^= 1) {
135 1.3.2.2 wrstuden tx39debugflag = 1;
136 1.3.2.2 wrstuden } else {
137 1.3.2.2 wrstuden tx39debugflag = 0;
138 1.3.2.2 wrstuden }
139 1.3.2.2 wrstuden #endif
140 1.3.2.2 wrstuden printf("io (%d:%d)\n", (tx39intrvec >> 16) & 0xffff,
141 1.3.2.2 wrstuden tx39intrvec & 0xfff);
142 1.3.2.2 wrstuden #endif
143 1.3.2.2 wrstuden return 0;
144 1.3.2.2 wrstuden }
145 1.3.2.2 wrstuden
146 1.3.2.2 wrstuden int
147 1.3.2.2 wrstuden tx39mfio_intr(arg)
148 1.3.2.2 wrstuden void *arg;
149 1.3.2.2 wrstuden {
150 1.3.2.2 wrstuden #ifdef TX39_DEBUG
151 1.3.2.2 wrstuden #if 0
152 1.3.2.2 wrstuden struct tx39io_softc *sc = arg;
153 1.3.2.2 wrstuden tx39io_dump_and_attach_handler(sc, 0);
154 1.3.2.2 wrstuden #endif
155 1.3.2.2 wrstuden printf("mfio (%d:%d)\n", (tx39intrvec >> 16) & 0xffff,
156 1.3.2.2 wrstuden tx39intrvec & 0xfff);
157 1.3.2.2 wrstuden #endif
158 1.3.2.2 wrstuden return 0;
159 1.3.2.2 wrstuden }
160 1.3.2.2 wrstuden
161 1.3.2.2 wrstuden void
162 1.3.2.2 wrstuden tx39io_attach(parent, self, aux)
163 1.3.2.2 wrstuden struct device *parent;
164 1.3.2.2 wrstuden struct device *self;
165 1.3.2.2 wrstuden void *aux;
166 1.3.2.2 wrstuden {
167 1.3.2.2 wrstuden struct txsim_attach_args *ta = aux;
168 1.3.2.2 wrstuden struct tx39io_softc *sc = (void*)self;
169 1.3.2.2 wrstuden tx_chipset_tag_t tc;
170 1.3.2.2 wrstuden tc = sc->sc_tc = ta->ta_tc;
171 1.3.2.2 wrstuden
172 1.3.2.2 wrstuden printf("\n");
173 1.3.2.2 wrstuden #ifdef COMPAQ_LOCAL_INTR
174 1.3.2.2 wrstuden /* 2010c Rec button */
175 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(5, (1<<6)), IST_EDGE, IPL_CLOCK, tx39io_intr, sc);
176 1.3.2.2 wrstuden /* Play button */
177 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(5, (1<<5)), IST_EDGE, IPL_CLOCK, tx39io_intr, sc);
178 1.3.2.2 wrstuden /* It seems that these interrupt arise when serial session start */
179 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(3, (1<<30)), IST_EDGE, IPL_CLOCK, tx39mfio_intr, sc);
180 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(3, (1<<5)), IST_EDGE, IPL_CLOCK, tx39mfio_intr, sc);
181 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(4, (1<<30)), IST_EDGE, IPL_CLOCK, tx39mfio_intr, sc);
182 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(4, (1<<5)), IST_EDGE, IPL_CLOCK, tx39mfio_intr, sc);
183 1.3.2.2 wrstuden #endif
184 1.3.2.2 wrstuden
185 1.3.2.2 wrstuden #ifdef VICTOR_INTERLINK_INTR
186 1.3.2.2 wrstuden /* open panel */
187 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(8, (1<<20)), IST_EDGE, IPL_CLOCK, tx39io_intr, sc);
188 1.3.2.2 wrstuden /* close panel */
189 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(8, (1<<4)), IST_EDGE, IPL_CLOCK, tx39io_intr, sc);
190 1.3.2.2 wrstuden /* serial session */
191 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(4, (1<<29)), IST_EDGE, IPL_CLOCK, tx39mfio_intr, sc);
192 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(4, (1<<30)), IST_EDGE, IPL_CLOCK, tx39mfio_intr, sc);
193 1.3.2.2 wrstuden /* REC button */
194 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(8, (1<<7)), IST_EDGE, IPL_CLOCK, tx39io_intr, sc);
195 1.3.2.2 wrstuden /* kbd */
196 1.3.2.2 wrstuden tx_intr_establish(tc, MAKEINTR(3, (1<<7)), IST_EDGE, IPL_CLOCK, tx39mfio_intr, sc);
197 1.3.2.2 wrstuden #endif
198 1.3.2.2 wrstuden
199 1.3.2.2 wrstuden #ifdef TX39IODEBUG
200 1.3.2.2 wrstuden tx39io_dump_and_attach_handler(sc, TX39IO_ATTACH_DUMMYHANDLER);
201 1.3.2.2 wrstuden #endif /* TX39IODEBUG */
202 1.3.2.2 wrstuden }
203 1.3.2.2 wrstuden
204 1.3.2.2 wrstuden #ifdef TX39IODEBUG
205 1.3.2.2 wrstuden void
206 1.3.2.2 wrstuden tx39io_dump_and_attach_handler(sc, dummy)
207 1.3.2.2 wrstuden struct tx39io_softc *sc;
208 1.3.2.2 wrstuden int dummy;
209 1.3.2.2 wrstuden {
210 1.3.2.2 wrstuden tx_chipset_tag_t tc;
211 1.3.2.2 wrstuden u_int32_t reg, reg_out, reg_dir, reg_in, reg_sel, reg_pwr, reg_deb;
212 1.3.2.2 wrstuden int i;
213 1.3.2.2 wrstuden int (*iointr) __P((void*));
214 1.3.2.2 wrstuden int (*mfiointr) __P((void*));
215 1.3.2.2 wrstuden
216 1.3.2.2 wrstuden tc = sc->sc_tc;
217 1.3.2.2 wrstuden if (dummy) {
218 1.3.2.2 wrstuden iointr = tx39io_intr;
219 1.3.2.2 wrstuden mfiointr = tx39mfio_intr;
220 1.3.2.2 wrstuden } else {
221 1.3.2.2 wrstuden iointr = mfiointr = 0;
222 1.3.2.2 wrstuden }
223 1.3.2.2 wrstuden
224 1.3.2.2 wrstuden printf("--------------------------------------------------------------\n");
225 1.3.2.2 wrstuden printf(" Debounce Direction DataOut DataIn PowerDown Select\n");
226 1.3.2.2 wrstuden printf("--------------------------------------------------------------\n");
227 1.3.2.2 wrstuden /* IO */
228 1.3.2.2 wrstuden reg = tx_conf_read(tc, TX39_IOCTRL_REG);
229 1.3.2.2 wrstuden reg_deb = TX39_IOCTRL_IODEBSEL(reg);
230 1.3.2.2 wrstuden reg_dir = TX39_IOCTRL_IODIREC(reg);
231 1.3.2.2 wrstuden #ifdef TX391X
232 1.3.2.2 wrstuden reg_out = TX39_IOCTRL_IODOUT(reg);
233 1.3.2.2 wrstuden reg_in = TX39_IOCTRL_IODIN(reg);
234 1.3.2.2 wrstuden #endif /* TX391X */
235 1.3.2.2 wrstuden #ifdef TX392X
236 1.3.2.2 wrstuden reg = tx_conf_read(tc, TX39_IODATAINOUT_REG);
237 1.3.2.2 wrstuden reg_out = TX39_IODATAINOUT_DOUT(reg);
238 1.3.2.2 wrstuden reg_in = TX39_IODATAINOUT_DIN(reg);
239 1.3.2.2 wrstuden #endif /* TX392X */
240 1.3.2.2 wrstuden reg = tx_conf_read(tc, TX39_IOIOPOWERDWN_REG);
241 1.3.2.2 wrstuden reg_pwr = TX39_IOIOPOWERDWN_IOPD(reg);
242 1.3.2.2 wrstuden for (i = TX39_IO_IO_MAX - 1; i >= 0 ; i--) {
243 1.3.2.2 wrstuden printf("IO %2d: ", i);
244 1.3.2.2 wrstuden printf("%s", ISSET(reg_dir, i) ? "On " : "Off");
245 1.3.2.2 wrstuden printf(" ");
246 1.3.2.2 wrstuden __dump_and_attach_handler(tc, reg_dir, reg_out, reg_in,
247 1.3.2.2 wrstuden reg_pwr, i, 1, iointr, sc);
248 1.3.2.2 wrstuden
249 1.3.2.2 wrstuden printf(" -");
250 1.3.2.2 wrstuden printf("\n");
251 1.3.2.2 wrstuden }
252 1.3.2.2 wrstuden /* MFIO */
253 1.3.2.2 wrstuden printf("--------------------------------------------------------------\n");
254 1.3.2.2 wrstuden reg_out = tx_conf_read(tc, TX39_IOMFIODATAOUT_REG);
255 1.3.2.2 wrstuden reg_dir = tx_conf_read(tc, TX39_IOMFIODATADIR_REG);
256 1.3.2.2 wrstuden reg_in = tx_conf_read(tc, TX39_IOMFIODATAIN_REG);
257 1.3.2.2 wrstuden reg_sel = tx_conf_read(tc, TX39_IOMFIODATASEL_REG);
258 1.3.2.2 wrstuden reg_pwr = tx_conf_read(tc, TX39_IOMFIOPOWERDWN_REG);
259 1.3.2.2 wrstuden for (i = TX39_IO_MFIO_MAX - 1; i >= 0 ; i--) {
260 1.3.2.2 wrstuden printf("MFIO %2d: - ", i);
261 1.3.2.2 wrstuden __dump_and_attach_handler(tc, reg_dir, reg_out, reg_in,
262 1.3.2.2 wrstuden reg_pwr, i, 0, mfiointr, sc);
263 1.3.2.2 wrstuden printf(" ");
264 1.3.2.2 wrstuden printf(ISSET(reg_sel, i) ? "MFIO(%s)" : "%s",
265 1.3.2.2 wrstuden mfio_map[i].std_pin_name);
266 1.3.2.2 wrstuden printf("\n");
267 1.3.2.2 wrstuden }
268 1.3.2.2 wrstuden printf("--------------------------------------------------------------\n");
269 1.3.2.2 wrstuden }
270 1.3.2.2 wrstuden
271 1.3.2.2 wrstuden void
272 1.3.2.2 wrstuden __dump_and_attach_handler(tc, reg_dir, reg_out, reg_in, reg_pwr,
273 1.3.2.2 wrstuden i, io, func, arg)
274 1.3.2.2 wrstuden tx_chipset_tag_t tc;
275 1.3.2.2 wrstuden u_int32_t reg_dir, reg_out, reg_in, reg_pwr;
276 1.3.2.2 wrstuden int i, io;
277 1.3.2.2 wrstuden int (*func) __P((void*));
278 1.3.2.2 wrstuden void *arg;
279 1.3.2.2 wrstuden {
280 1.3.2.2 wrstuden int pset, nset, pofs, nofs;
281 1.3.2.2 wrstuden
282 1.3.2.2 wrstuden if (io) {
283 1.3.2.2 wrstuden #ifdef TX391X
284 1.3.2.2 wrstuden pset = nset = 5;
285 1.3.2.2 wrstuden pofs = i + 7;
286 1.3.2.2 wrstuden nofs = i;
287 1.3.2.2 wrstuden #endif
288 1.3.2.2 wrstuden #ifdef TX392X
289 1.3.2.2 wrstuden pset = nset = 8;
290 1.3.2.2 wrstuden pofs = i + 16;
291 1.3.2.2 wrstuden nofs = i;
292 1.3.2.2 wrstuden #endif
293 1.3.2.2 wrstuden } else {
294 1.3.2.2 wrstuden pset = 3;
295 1.3.2.2 wrstuden nset = 4;
296 1.3.2.2 wrstuden pofs = nofs = i;
297 1.3.2.2 wrstuden }
298 1.3.2.2 wrstuden
299 1.3.2.2 wrstuden if (ISSET(reg_dir, i)) {
300 1.3.2.2 wrstuden #ifdef TX39IO_MFIOOUTPORT_ON
301 1.3.2.2 wrstuden txreg_t reg;
302 1.3.2.2 wrstuden if (io) {
303 1.3.2.2 wrstuden #ifdef TX392X
304 1.3.2.2 wrstuden reg = tx_conf_read(tc, TX39_IODATAINOUT_REG);
305 1.3.2.2 wrstuden reg |= (1 << (i + 16));
306 1.3.2.2 wrstuden tx_conf_write(tc, TX39_IODATAINOUT_REG, reg);
307 1.3.2.2 wrstuden #endif /* TX392X */
308 1.3.2.2 wrstuden } else {
309 1.3.2.2 wrstuden reg = tx_conf_read(tc, TX39_IOMFIODATAOUT_REG);
310 1.3.2.2 wrstuden reg |= (1 << i);
311 1.3.2.2 wrstuden tx_conf_write(tc, TX39_IOMFIODATAOUT_REG, reg);
312 1.3.2.2 wrstuden }
313 1.3.2.2 wrstuden #endif /* TX39IO_MFIOOUTPORT_ON */
314 1.3.2.2 wrstuden printf("Out");
315 1.3.2.2 wrstuden } else {
316 1.3.2.2 wrstuden printf("In ");
317 1.3.2.2 wrstuden if (func) {
318 1.3.2.2 wrstuden /* Positive Edge */
319 1.3.2.2 wrstuden tx_intr_establish(
320 1.3.2.2 wrstuden tc, MAKEINTR(pset, (1 << pofs)),
321 1.3.2.2 wrstuden IST_EDGE, IPL_TTY, func, arg);
322 1.3.2.2 wrstuden /* Negative Edge */
323 1.3.2.2 wrstuden tx_intr_establish(
324 1.3.2.2 wrstuden tc, MAKEINTR(nset, (1 << nofs)),
325 1.3.2.2 wrstuden IST_EDGE, IPL_TTY, func, arg);
326 1.3.2.2 wrstuden }
327 1.3.2.2 wrstuden }
328 1.3.2.2 wrstuden printf(" ");
329 1.3.2.2 wrstuden printf("%d", ISSET(reg_out, i) ? 1 : 0);
330 1.3.2.2 wrstuden printf(" ");
331 1.3.2.2 wrstuden printf("%d", ISSET(reg_in, i) ? 1 : 0);
332 1.3.2.2 wrstuden printf(" ");
333 1.3.2.2 wrstuden printf("%s", ISSET(reg_pwr, i) ? "Down ": "Active");
334 1.3.2.2 wrstuden };
335 1.3.2.2 wrstuden
336 1.3.2.2 wrstuden #endif /* TX39IODEBUG */
337