xref: /netbsd-src/sys/arch/mips/atheros/dev/com_arbus.c (revision 7fa608457b817eca6e0977b37f758ae064f3c99c)
1 /* $Id: com_arbus.c,v 1.5 2007/02/17 23:25:26 jmcneill Exp $ */
2 /*-
3  * Copyright (c) 2006 Urbana-Champaign Independent Media Center.
4  * Copyright (c) 2006 Garrett D'Amore.
5  * All rights reserved.
6  *
7  * Portions of this code were written by Garrett D'Amore for the
8  * Champaign-Urbana Community Wireless Network Project.
9  *
10  * Redistribution and use in source and binary forms, with or
11  * without modification, are permitted provided that the following
12  * conditions 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
16  *    copyright notice, this list of conditions and the following
17  *    disclaimer in the documentation and/or other materials provided
18  *    with the distribution.
19  * 3. All advertising materials mentioning features or use of this
20  *    software must display the following acknowledgements:
21  *      This product includes software developed by the Urbana-Champaign
22  *      Independent Media Center.
23  *	This product includes software developed by Garrett D'Amore.
24  * 4. Urbana-Champaign Independent Media Center's name and Garrett
25  *    D'Amore's name may not be used to endorse or promote products
26  *    derived from this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT
29  * MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR
30  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32  * ARE DISCLAIMED.  IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT
33  * MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT,
34  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
35  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
36  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
37  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
38  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
39  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
40  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41  */
42 
43 /*-
44  * Copyright (c) 1998 The NetBSD Foundation, Inc.
45  * All rights reserved.
46  *
47  * This code is derived from software contributed to The NetBSD Foundation
48  * by Charles M. Hannum.
49  *
50  * Redistribution and use in source and binary forms, with or without
51  * modification, are permitted provided that the following conditions
52  * are met:
53  * 1. Redistributions of source code must retain the above copyright
54  *    notice, this list of conditions and the following disclaimer.
55  * 2. Redistributions in binary form must reproduce the above copyright
56  *    notice, this list of conditions and the following disclaimer in the
57  *    documentation and/or other materials provided with the distribution.
58  * 3. All advertising materials mentioning features or use of this software
59  *    must display the following acknowledgement:
60  *        This product includes software developed by the NetBSD
61  *        Foundation, Inc. and its contributors.
62  * 4. Neither the name of The NetBSD Foundation nor the names of its
63  *    contributors may be used to endorse or promote products derived
64  *    from this software without specific prior written permission.
65  *
66  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
67  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
68  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
69  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
70  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
71  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
72  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
73  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
74  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
75  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
76  * POSSIBILITY OF SUCH DAMAGE.
77  */
78 
79 /*-
80  * Copyright (c) 1991 The Regents of the University of California.
81  * All rights reserved.
82  *
83  * Redistribution and use in source and binary forms, with or without
84  * modification, are permitted provided that the following conditions
85  * are met:
86  * 1. Redistributions of source code must retain the above copyright
87  *    notice, this list of conditions and the following disclaimer.
88  * 2. Redistributions in binary form must reproduce the above copyright
89  *    notice, this list of conditions and the following disclaimer in the
90  *    documentation and/or other materials provided with the distribution.
91  * 3. Neither the name of the University nor the names of its contributors
92  *    may be used to endorse or promote products derived from this software
93  *    without specific prior written permission.
94  *
95  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
96  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
97  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
98  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
99  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
100  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
101  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
102  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
103  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
104  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
105  * SUCH DAMAGE.
106  *
107  *	@(#)com.c	7.5 (Berkeley) 5/16/91
108  */
109 
110 #include <sys/cdefs.h>
111 __KERNEL_RCSID(0, "$NetBSD: com_arbus.c,v 1.5 2007/02/17 23:25:26 jmcneill Exp $");
112 
113 #include <sys/param.h>
114 #include <sys/systm.h>
115 #include <sys/device.h>
116 #include <sys/kernel.h>
117 #include <sys/termios.h>
118 #include <sys/ttydefaults.h>
119 #include <sys/types.h>
120 
121 #include <machine/bus.h>
122 
123 #include <dev/cons.h>
124 #include <dev/ic/comreg.h>
125 #include <dev/ic/comvar.h>
126 
127 #include <mips/cpuregs.h>
128 #include <mips/atheros/include/arbusvar.h>
129 #include <mips/atheros/include/ar531xvar.h>
130 
131 #include "opt_com.h"
132 
133 struct com_arbus_softc {
134 	struct com_softc sc_com;
135 };
136 
137 static void com_arbus_initmap(struct com_regs *);
138 //static bus_space_tag_t com_arbus_get_bus_space_tag(void);
139 static int com_arbus_match(struct device *, struct cfdata *, void *);
140 static void com_arbus_attach(struct device *, struct device *, void *);
141 
142 CFATTACH_DECL(com_arbus, sizeof(struct com_arbus_softc),
143     com_arbus_match, com_arbus_attach, NULL, NULL);
144 
145 #if 0
146 #ifdef	TTYDEF_SPEED
147 #define	COM_ARBUS_BAUD	TTYDEF_SPEED
148 #else
149 #define	COM_ARBUS_BAUD	115200
150 #endif
151 #endif
152 
153 #ifndef COM_ARBUS_BAUD
154 #define	COM_ARBUS_BAUD	115200
155 #endif
156 
157 int	com_arbus_baud = COM_ARBUS_BAUD;
158 
159 #define CONMODE	((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
160 
161 #ifndef	COM_REGMAP
162 #error	COM_REGMAP not defined!
163 #endif
164 
165 int
166 com_arbus_match(struct device *parent, struct cfdata *cf, void *aux)
167 {
168 	struct arbus_attach_args	*aa = aux;
169 	struct com_regs			regs;
170 	int				rv;
171 
172 	if (strcmp(aa->aa_name, cf->cf_name) != 0)
173 		return 0;
174 
175 	if (com_is_console(aa->aa_bst, aa->aa_addr, &regs.cr_ioh))
176 		return 1;
177 
178 	if (bus_space_map(aa->aa_bst, aa->aa_addr, aa->aa_size,
179 		0, &regs.cr_ioh))
180 		return 0;
181 
182 	regs.cr_iot = aa->aa_bst;
183 	regs.cr_iobase = aa->aa_addr;
184 	regs.cr_nports = aa->aa_size;
185 	com_arbus_initmap(&regs);
186 
187 	rv = com_probe_subr(&regs);
188 
189 	bus_space_unmap(aa->aa_bst, regs.cr_ioh, aa->aa_size);
190 
191 	return rv;
192 }
193 
194 void
195 com_arbus_attach(struct device *parent, struct device *self, void *aux)
196 {
197 	struct com_arbus_softc *arsc = (void *)self;
198 	struct com_softc *sc = &arsc->sc_com;
199 	struct arbus_attach_args *aa = aux;
200 	prop_number_t prop;
201 	bus_space_handle_t ioh;
202 
203 	prop = prop_dictionary_get(device_properties(&sc->sc_dev),
204 	    "frequency");
205 	if (prop == NULL) {
206 		printf(": unable to get frequency property\n");
207 		return;
208 	}
209 	KASSERT(prop_object_type(prop) == PROP_TYPE_NUMBER);
210 
211 	sc->sc_frequency = (int)prop_number_integer_value(prop);
212 
213 	if (!com_is_console(aa->aa_bst, aa->aa_addr, &ioh) &&
214 	    bus_space_map(aa->aa_bst, aa->aa_addr, aa->aa_size, 0,
215 		&ioh) != 0) {
216 		printf(": can't map registers\n");
217 		return;
218 	}
219 
220 	COM_INIT_REGS(sc->sc_regs, aa->aa_bst, ioh, aa->aa_addr);
221 	sc->sc_regs.cr_nports = aa->aa_size;
222 	com_arbus_initmap(&sc->sc_regs);
223 
224 	com_attach_subr(sc);
225 
226 	arbus_intr_establish(aa->aa_cirq, aa->aa_mirq, comintr, sc);
227 }
228 
229 void
230 com_arbus_initmap(struct com_regs *regsp)
231 {
232 	int	i;
233 
234 	/* rewrite the map to shift for alignment */
235 	for (i = 0;
236 	     i < (sizeof (regsp->cr_map) / sizeof (regsp->cr_map[0])); i++) {
237 		regsp->cr_map[i] = (com_std_map[i] * 4) + 3;
238 	}
239 }
240 
241 void
242 com_arbus_cnattach(bus_addr_t addr, uint32_t freq)
243 {
244 	struct com_regs		regs;
245 
246 	regs.cr_iot = arbus_get_bus_space_tag();
247 	regs.cr_iobase = addr;
248 	regs.cr_nports = 0x1000;
249 	com_arbus_initmap(&regs);
250 
251 	if (bus_space_map(regs.cr_iot, regs.cr_iobase, regs.cr_nports, 0,
252 		&regs.cr_ioh))
253 		return;
254 
255 	comcnattach1(&regs, com_arbus_baud, freq, COM_TYPE_NORMAL, CONMODE);
256 }
257 
258