xref: /netbsd-src/sys/arch/acorn32/mainbus/com_pioc.c (revision 6d4870476f69938cdd065da8ea9ad989cef459f4)
1 /*	$NetBSD: com_pioc.c,v 1.17 2018/12/08 17:46:09 thorpej Exp $	*/
2 
3 /*-
4  * Copyright (c) 1998 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Charles M. Hannum.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*-
33  * Copyright (c) 1991 The Regents of the University of California.
34  * All rights reserved.
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
39  * 1. Redistributions of source code must retain the above copyright
40  *    notice, this list of conditions and the following disclaimer.
41  * 2. Redistributions in binary form must reproduce the above copyright
42  *    notice, this list of conditions and the following disclaimer in the
43  *    documentation and/or other materials provided with the distribution.
44  * 3. Neither the name of the University nor the names of its contributors
45  *    may be used to endorse or promote products derived from this software
46  *    without specific prior written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58  * SUCH DAMAGE.
59  *
60  *	@(#)com.c	7.5 (Berkeley) 5/16/91
61  */
62 
63 #include <sys/param.h>
64 
65 __KERNEL_RCSID(0, "$NetBSD: com_pioc.c,v 1.17 2018/12/08 17:46:09 thorpej Exp $");
66 
67 #include <sys/systm.h>
68 #include <sys/tty.h>
69 #include <sys/proc.h>
70 #include <sys/conf.h>
71 #include <sys/kernel.h>
72 #include <sys/device.h>
73 #include <sys/bus.h>
74 
75 #include <machine/intr.h>
76 #include <machine/io.h>
77 
78 #include <acorn32/mainbus/piocvar.h>
79 #include <dev/ic/comreg.h>
80 #include <dev/ic/comvar.h>
81 
82 #include <dev/cons.h>
83 
84 #include "locators.h"
85 
86 struct com_pioc_softc {
87 	struct	com_softc sc_com;	/* real "com" softc */
88 	void	*sc_ih;			/* interrupt handler */
89 };
90 
91 /* Prototypes for functions */
92 
93 cons_decl(com);
94 
95 static int  com_pioc_probe   (device_t, cfdata_t , void *);
96 static void com_pioc_attach  (device_t, device_t, void *);
97 
98 /* device attach structure */
99 
100 CFATTACH_DECL_NEW(com_pioc, sizeof(struct com_pioc_softc),
101     com_pioc_probe, com_pioc_attach, NULL, NULL);
102 
103 extern bus_space_tag_t comconstag;	/* From pioc.c */
104 
105 /*
106  * int com_pioc_probe(device_t parent, cfdata_t cf, void *aux)
107  *
108  * Make sure we are trying to attach a com device and then
109  * probe for one.
110  */
111 
112 static int
com_pioc_probe(device_t parent,cfdata_t cf,void * aux)113 com_pioc_probe(device_t parent, cfdata_t cf, void *aux)
114 {
115 	bus_space_tag_t iot;
116 	bus_space_handle_t ioh;
117 	int iobase;
118 	int rv = 1;
119 	struct pioc_attach_args *pa = aux;
120 
121 	/* We need an offset */
122 	if (pa->pa_offset == PIOCCF_OFFSET_DEFAULT)
123 		return(0);
124 
125 	iot = pa->pa_iot;
126 	iobase = pa->pa_iobase + pa->pa_offset;
127 
128 	/* if it's in use as console, it's there. */
129 	if (!com_is_console(iot, iobase, 0)) {
130 		if (bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh)) {
131 			return 0;
132 		}
133 		rv = comprobe1(iot, ioh);
134 		bus_space_unmap(iot, ioh, COM_NPORTS);
135 	}
136 
137 	if (rv) {
138 		pa->pa_iosize = COM_NPORTS;
139 	}
140 	return (rv);
141 }
142 
143 /*
144  * void com_pioc_attach(device_t parent, device_t self, void *aux)
145  *
146  * attach the com device
147  */
148 
149 static void
com_pioc_attach(device_t parent,device_t self,void * aux)150 com_pioc_attach(device_t parent, device_t self, void *aux)
151 {
152 	struct com_pioc_softc *psc = device_private(self);
153 	struct com_softc *sc = &psc->sc_com;
154 	u_int iobase;
155 	bus_space_tag_t iot;
156 	bus_space_handle_t ioh;
157 	struct pioc_attach_args *pa = aux;
158 	int count;
159 
160 	sc->sc_dev = self;
161 	iot = pa->pa_iot;
162 	iobase = pa->pa_iobase + pa->pa_offset;
163 
164 /*
165 	printf(" (iot = %p, iobase = 0x%08x) ", iot, iobase);
166 */
167 	if (!com_is_console(iot, iobase, &ioh)
168 	    && bus_space_map(iot, iobase, COM_NPORTS, 0, &ioh))
169 		panic("comattach: io mapping failed");
170 	com_init_regs(&sc->sc_regs, iot, ioh, iobase);
171 
172 	sc->sc_frequency = COM_FREQ;
173 
174 	com_attach_subr(sc);
175 
176 	if (pa->pa_irq != MAINBUSCF_IRQ_DEFAULT) {
177 		psc->sc_ih = intr_claim(pa->pa_irq, IPL_SERIAL, "com",
178 		    comintr, sc);
179 	}
180 
181 	if (!pmf_device_register1(self, com_suspend, com_resume, com_cleanup)) {
182 		aprint_error_dev(self,
183 		    "could not establish shutdown hook");
184 	}
185 
186 	/*
187 	 * This is a patch for bugged revision 1-4 SMC FDC37C665
188 	 * I/O controllers.
189 	 * If there is RX data pending when the FIFO in turned on
190 	 * the RX register cannot be emptied.
191 	 *
192 	 * Solution:
193 	 *   Make sure FIFO is off.
194 	 *   Read pending data / int status etc.
195 	 */
196 	bus_space_write_1(iot, ioh, com_fifo, 0);
197 	for (count = 0; count < 8; ++count)
198 		(void)bus_space_read_1(iot, ioh, count);
199 
200 }
201 
202 /*
203  * Console attachment functions
204  */
205 
206 void
comcnprobe(struct consdev * cp)207 comcnprobe(struct consdev *cp)
208 {
209 
210 #ifdef  COMCONSOLE
211 	cp->cn_pri = CN_REMOTE;	/* Force a serial port console */
212 #else
213 	cp->cn_pri = CN_NORMAL;
214 #endif
215 }
216 
217 void
comcninit(struct consdev * cp)218 comcninit(struct consdev *cp)
219 {
220 	int result;
221 
222 #ifndef CONMODE
223 #define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
224 #endif
225 #ifndef CONSPEED
226 #define CONSPEED 38400
227 #endif
228 #ifndef CONADDR
229 #define CONADDR	0x3f8
230 #endif
231 
232 	result = comcnattach(comconstag, (IO_CONF_BASE + CONADDR), CONSPEED,
233 	    COM_FREQ, COM_TYPE_NORMAL, CONMODE);
234 	if (result) {
235 		printf("initialising serial; got errornr %d\n", result);
236 		panic("can't init serial console @%x", CONADDR);
237 	};
238 }
239 
240 
241 /* End of com_pioc.c */
242