ralink_com.c revision 1.3 1 /* $NetBSD: ralink_com.c,v 1.3 2012/02/01 02:05:14 matt Exp $ */
2 /*-
3 * Copyright (c) 2011 CradlePoint Technology, Inc.
4 * All rights reserved.
5 *
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY CRADLEPOINT TECHNOLOGY, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /*-
30 * Copyright (c) 2006 Urbana-Champaign Independent Media Center.
31 * Copyright (c) 2006 Garrett D'Amore.
32 * All rights reserved.
33 *
34 * Portions of this code were written by Garrett D'Amore for the
35 * Champaign-Urbana Community Wireless Network Project.
36 *
37 * Redistribution and use in source and binary forms, with or
38 * without modification, are permitted provided that the following
39 * conditions are met:
40 * 1. Redistributions of source code must retain the above copyright
41 * notice, this list of conditions and the following disclaimer.
42 * 2. Redistributions in binary form must reproduce the above
43 * copyright notice, this list of conditions and the following
44 * disclaimer in the documentation and/or other materials provided
45 * with the distribution.
46 * 3. All advertising materials mentioning features or use of this
47 * software must display the following acknowledgements:
48 * This product includes software developed by the Urbana-Champaign
49 * Independent Media Center.
50 * This product includes software developed by Garrett D'Amore.
51 * 4. Urbana-Champaign Independent Media Center's name and Garrett
52 * D'Amore's name may not be used to endorse or promote products
53 * derived from this software without specific prior written permission.
54 *
55 * THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT
56 * MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR
57 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
58 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
59 * ARE DISCLAIMED. IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT
60 * MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT,
61 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
62 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
63 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
64 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
65 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
66 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
67 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
68 */
69
70 /*-
71 * Copyright (c) 1998 The NetBSD Foundation, Inc.
72 * All rights reserved.
73 *
74 * This code is derived from software contributed to The NetBSD Foundation
75 * by Charles M. Hannum.
76 *
77 * Redistribution and use in source and binary forms, with or without
78 * modification, are permitted provided that the following conditions
79 * are met:
80 * 1. Redistributions of source code must retain the above copyright
81 * notice, this list of conditions and the following disclaimer.
82 * 2. Redistributions in binary form must reproduce the above copyright
83 * notice, this list of conditions and the following disclaimer in the
84 * documentation and/or other materials provided with the distribution.
85 *
86 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
87 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
88 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
89 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
90 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
91 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
92 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
93 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
94 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
95 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
96 * POSSIBILITY OF SUCH DAMAGE.
97 */
98
99 /*-
100 * Copyright (c) 1991 The Regents of the University of California.
101 * All rights reserved.
102 *
103 * Redistribution and use in source and binary forms, with or without
104 * modification, are permitted provided that the following conditions
105 * are met:
106 * 1. Redistributions of source code must retain the above copyright
107 * notice, this list of conditions and the following disclaimer.
108 * 2. Redistributions in binary form must reproduce the above copyright
109 * notice, this list of conditions and the following disclaimer in the
110 * documentation and/or other materials provided with the distribution.
111 * 3. Neither the name of the University nor the names of its contributors
112 * may be used to endorse or promote products derived from this software
113 * without specific prior written permission.
114 *
115 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
116 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
117 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
118 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
119 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
120 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
121 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
122 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
123 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
124 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
125 * SUCH DAMAGE.
126 *
127 * @(#)com.c 7.5 (Berkeley) 5/16/91
128 */
129
130 /* ralink_com.c -- Ralink 3052 uart console driver */
131
132 #include <sys/cdefs.h>
133 __KERNEL_RCSID(0, "$NetBSD: ralink_com.c,v 1.3 2012/02/01 02:05:14 matt Exp $");
134
135 #include <sys/param.h>
136 #include <sys/bus.h>
137 #include <sys/device.h>
138 #include <sys/kernel.h>
139 #include <sys/systm.h>
140 #include <sys/tty.h>
141 #include <sys/termios.h>
142 #include <sys/ttydefaults.h>
143
144 #include <dev/cons.h>
145 #include <dev/ic/comreg.h>
146 #include <dev/ic/comvar.h>
147
148 #include <mips/cpuregs.h>
149
150 #include <mips/ralink/ralink_reg.h>
151 #include <mips/ralink/ralink_var.h>
152
153 #include "opt_com.h"
154
155 struct ralink_com_softc {
156 struct com_softc sc_com;
157 void * sc_ih;
158 };
159
160 static int ralink_com_match(device_t, cfdata_t , void *);
161 static void ralink_com_attach(device_t, device_t, void *);
162 static void ralink_com_initmap(struct com_regs *regsp);
163
164 CFATTACH_DECL_NEW(ralink_com, sizeof(struct ralink_com_softc),
165 ralink_com_match, ralink_com_attach, NULL, NULL);
166
167 #define CONMODE \
168 ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
169
170 #ifndef COM_REGMAP
171 #error COM_REGMAP not defined!
172 #endif
173
174 static inline uint32_t
175 sysctl_read(const u_int offset)
176 {
177 return *RA_IOREG_VADDR(RA_SYSCTL_BASE, offset);
178 }
179
180 static inline void
181 sysctl_write(const u_int offset, uint32_t val)
182 {
183 *RA_IOREG_VADDR(RA_SYSCTL_BASE, offset) = val;
184 }
185
186 static inline uint32_t
187 uart_read(const u_int offset)
188 {
189 return *RA_IOREG_VADDR(RA_UART_LITE_BASE, offset);
190 }
191
192 static inline void
193 uart_write(const u_int offset, const uint32_t val)
194 {
195 *RA_IOREG_VADDR(RA_UART_LITE_BASE, offset) = val;
196 }
197
198 #ifdef RALINK_CONSOLE_EARLY
199 static int
200 ralink_cngetc(dev_t dv)
201 {
202 if ((uart_read(RA_UART_LSR) & LSR_RXRDY) == 0)
203 return -1;
204
205 return uart_read(RA_UART_RBR) & 0xff;
206 }
207
208 static void
209 ralink_cnputc(dev_t dv, int c)
210 {
211 int timo = 150000;
212
213 while ((uart_read(RA_UART_LSR) & LSR_TXRDY) == 0 && --timo > 0)
214 ;
215
216 uart_write(RA_UART_TBR, c);
217 __asm __volatile("sync");
218
219 timo = 150000;
220 while ((uart_read(RA_UART_LSR) & LSR_TSRE) == 0 && --timo > 0)
221 ;
222 }
223
224 static struct consdev ralink_earlycons = {
225 .cn_putc = ralink_cnputc,
226 .cn_getc = ralink_cngetc,
227 .cn_pollc = nullcnpollc,
228 };
229
230 void
231 ralink_console_early(void)
232 {
233 cn_tab = &ralink_earlycons;
234 }
235 #endif
236
237
238 int
239 ralink_com_match(device_t parent, cfdata_t cf, void *aux)
240 {
241 if (cn_tab == NULL || cn_tab->cn_pri < CN_NORMAL) {
242 printf("NULL console set, don't install ourselves "
243 "(of course this shouldn't print)");
244 return 0;
245 }
246
247 /*
248 * If we got this far, assume we want to install it as the console.
249 * No need to probe. Future possibilities include checking to see if it
250 * is console or KGDB but now it is our only console method if we aren't
251 * forcing a null console
252 */
253 return 1;
254 }
255
256 void
257 ralink_com_attach(device_t parent, device_t self, void *aux)
258 {
259 const struct mainbus_attach_args *ma = aux;
260 struct ralink_com_softc * const rtsc = device_private(self);
261 struct com_softc * const sc = &rtsc->sc_com;
262 bus_space_handle_t ioh;
263 int error;
264
265 if ((error = bus_space_map(ma->ma_memt, RA_UART_LITE_BASE,
266 0x1000, 0, &ioh)) != 0) {
267 aprint_error(": can't map registers, error=%d\n", error);
268 return;
269 }
270
271 COM_INIT_REGS(sc->sc_regs, ma->ma_memt, ioh, RA_UART_LITE_BASE);
272 sc->sc_dev = self;
273 sc->sc_frequency = RA_UART_FREQ;
274 sc->sc_regs.cr_nports = 0x1000;
275 sc->sc_type = COM_TYPE_AU1x00;
276 sc->enabled = 1;
277
278 ralink_com_initmap(&sc->sc_regs);
279
280 rtsc->sc_ih = ra_intr_establish(RA_IRQ_UARTL, comintr, sc, 1);
281
282 com_attach_subr(sc);
283 }
284
285 static void
286 ralink_com_initmap(struct com_regs *regsp)
287 {
288 regsp->cr_map[COM_REG_RXDATA] = RA_UART_RBR;
289 regsp->cr_map[COM_REG_TXDATA] = RA_UART_TBR;
290 regsp->cr_map[COM_REG_DLBL] = RA_UART_DLL;
291 regsp->cr_map[COM_REG_IER] = RA_UART_IER;
292 regsp->cr_map[COM_REG_IIR] = RA_UART_IIR;
293 regsp->cr_map[COM_REG_FIFO] = RA_UART_FCR;
294 regsp->cr_map[COM_REG_LCR] = RA_UART_LCR;
295 regsp->cr_map[COM_REG_MCR] = RA_UART_MCR;
296 regsp->cr_map[COM_REG_LSR] = RA_UART_LSR;
297 regsp->cr_map[COM_REG_MSR] = RA_UART_MSR;
298 }
299
300 void
301 ralink_com_early(int silent)
302 {
303 struct com_regs regs;
304 uint32_t r;
305 int error;
306
307 /* reset */
308 r = sysctl_read(RA_SYSCTL_RST);
309 r |= RST_UARTL;
310 sysctl_write(RA_SYSCTL_RST, r);
311 r ^= RST_UARTL;
312 sysctl_write(RA_SYSCTL_RST, r);
313
314 if (silent) {
315 /*
316 * put us in PIO mode,
317 * effectively tri-stating the UARTL block
318 */
319 r = sysctl_read(RA_SYSCTL_GPIOMODE);
320 r |= GPIOMODE_UARTL;
321 sysctl_write(RA_SYSCTL_GPIOMODE, r);
322 } else {
323 /* make sure we are in UART mode */
324 r = sysctl_read(RA_SYSCTL_GPIOMODE);
325 r &= ~GPIOMODE_UARTL;
326 sysctl_write(RA_SYSCTL_GPIOMODE, r);
327 }
328
329 uart_write(RA_UART_IER, 0); /* disable interrupts */
330 uart_write(RA_UART_FCR, 0); /* disable fifos */
331
332 /* set baud rate */
333 uart_write(RA_UART_LCR,
334 UART_LCR_WLS0 | UART_LCR_WLS1 | UART_LCR_DLAB);
335 uart_write(RA_UART_DLL,
336 (RA_UART_FREQ / RA_SERIAL_CLKDIV / RA_BAUDRATE)
337 & 0xffff);
338 uart_write(RA_UART_LCR,
339 UART_LCR_WLS0 | UART_LCR_WLS1);
340
341 regs.cr_iot = &ra_bus_memt;
342 regs.cr_iobase = RA_UART_LITE_BASE;
343 regs.cr_nports = 0x1000;
344 ralink_com_initmap(®s);
345
346 if ((error = bus_space_map(regs.cr_iot, regs.cr_iobase, regs.cr_nports,
347 0, ®s.cr_ioh)) != 0) {
348 return;
349 }
350
351 /* Ralink UART has a 16-bit rate latch (like the AU1x00) */
352 comcnattach1(®s, RA_BAUDRATE, RA_UART_FREQ,
353 COM_TYPE_AU1x00, CONMODE);
354 }
355