Annotation of sys/arch/arm/xscale/pxa2x0_com.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: pxa2x0_com.c,v 1.7 2005/07/18 00:50:19 uwe Exp $ */
2: /* $NetBSD: pxa2x0_com.c,v 1.4 2003/07/15 00:24:55 lukem Exp $ */
3:
4: /*
5: * Copyright 2003 Wasabi Systems, Inc.
6: * All rights reserved.
7: *
8: * Written by Steve C. Woodford for Wasabi Systems, Inc.
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: * 3. All advertising materials mentioning features or use of this software
19: * must display the following acknowledgement:
20: * This product includes software developed for the NetBSD Project by
21: * Wasabi Systems, Inc.
22: * 4. The name of Wasabi Systems, Inc. may not be used to endorse
23: * or promote products derived from this software without specific prior
24: * written permission.
25: *
26: * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
30: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36: * POSSIBILITY OF SUCH DAMAGE.
37: */
38:
39: #include <sys/cdefs.h>
40: /*
41: __KERNEL_RCSID(0, "$NetBSD: pxa2x0_com.c,v 1.4 2003/07/15 00:24:55 lukem Exp $");
42: */
43:
44: #ifndef COM_PXA2X0
45: #error "You must use options COM_PXA2X0 to get PXA2x0 serial port support"
46: #endif
47:
48: #include <sys/param.h>
49: #include <sys/systm.h>
50: #include <sys/device.h>
51: #include <sys/tty.h>
52:
53: #include <machine/intr.h>
54: #include <machine/bus.h>
55:
56: #include <dev/ic/comreg.h>
57: #include <dev/ic/comvar.h>
58:
59: #define com_isr 8
60: #define ISR_RECV (ISR_RXPL | ISR_XMODE | ISR_RCVEIR)
61:
62: #include <arm/xscale/pxa2x0reg.h>
63: #include <arm/xscale/pxa2x0var.h>
64:
65: #ifdef __zaurus__
66: #include <zaurus/dev/zaurus_scoopvar.h>
67: #endif
68:
69: int pxauart_match(struct device *, void *, void *);
70: void pxauart_attach(struct device *, struct device *, void *);
71: void pxauart_power(int why, void *);
72:
73: struct cfattach com_pxaip_ca = {
74: sizeof (struct com_softc), pxauart_match, pxauart_attach
75: };
76:
77: int
78: pxauart_match(struct device *parent, void *cf, void *aux)
79: {
80: struct pxaip_attach_args *pxa = aux;
81: bus_space_tag_t bt = &pxa2x0_a4x_bs_tag; /* XXX: This sucks */
82: bus_space_handle_t bh;
83: int rv;
84:
85: switch (pxa->pxa_addr) {
86: case PXA2X0_FFUART_BASE:
87: if (pxa->pxa_intr != PXA2X0_INT_FFUART)
88: return (0);
89: break;
90:
91: case PXA2X0_STUART_BASE:
92: if (pxa->pxa_intr != PXA2X0_INT_STUART)
93: return (0);
94: break;
95:
96: case PXA2X0_BTUART_BASE: /* XXX: Config file option ... */
97: if (pxa->pxa_intr != PXA2X0_INT_BTUART)
98: return (0);
99: break;
100:
101: default:
102: return (0);
103: }
104:
105: pxa->pxa_size = 0x20;
106:
107: {
108: extern bus_addr_t comconsaddr;
109:
110: if (comconsaddr == pxa->pxa_addr)
111: return (1);
112: }
113:
114: if (bus_space_map(bt, pxa->pxa_addr, pxa->pxa_size, 0, &bh))
115: return (0);
116:
117: /* Make sure the UART is enabled */
118: bus_space_write_1(bt, bh, com_ier, IER_EUART);
119:
120: rv = comprobe1(bt, bh);
121: bus_space_unmap(bt, bh, pxa->pxa_size);
122:
123: return (rv);
124: }
125:
126: void
127: pxauart_attach(struct device *parent, struct device *self, void *aux)
128: {
129: struct com_softc *sc = (struct com_softc *)self;
130: struct pxaip_attach_args *pxa = aux;
131:
132: sc->sc_iot = &pxa2x0_a4x_bs_tag; /* XXX: This sucks */
133: sc->sc_iobase = pxa->pxa_addr;
134: sc->sc_frequency = PXA2X0_COM_FREQ;
135: sc->sc_uarttype = COM_UART_PXA2X0;
136:
137: #if 0
138: if (com_is_console(sc->sc_iot, sc->sc_iobase, &sc->sc_ioh) == 0 &&
139: bus_space_map(sc->sc_iot, sc->sc_iobase, pxa->pxa_size, 0,
140: &sc->sc_ioh)) {
141: printf(": can't map registers\n");
142: return;
143: }
144: #endif
145: bus_space_map(sc->sc_iot, sc->sc_iobase, pxa->pxa_size, 0, &sc->sc_ioh);
146:
147: com_attach_subr(sc);
148:
149: (void)pxa2x0_intr_establish(pxa->pxa_intr, IPL_TTY, comintr,
150: sc, sc->sc_dev.dv_xname);
151:
152: (void)powerhook_establish(&pxauart_power, sc);
153: }
154:
155: void
156: pxauart_power(int why, void *arg)
157: {
158: struct com_softc *sc = arg;
159: bus_space_tag_t iot = sc->sc_iot;
160: bus_space_handle_t ioh = sc->sc_ioh;
161: struct tty *tp = sc->sc_tty;
162:
163: switch (why) {
164: case PWR_SUSPEND:
165: case PWR_STANDBY:
166: if (sc->enabled && ISSET(sc->sc_hwflags, COM_HW_SIR))
167: scoop_set_irled(0);
168: break;
169: case PWR_RESUME:
170: if (sc->enabled) {
171: sc->sc_initialize = 1;
172: comparam(tp, &tp->t_termios);
173: bus_space_write_1(iot, ioh, com_ier, sc->sc_ier);
174:
175: if (ISSET(sc->sc_hwflags, COM_HW_SIR)) {
176: scoop_set_irled(1);
177: bus_space_write_1(iot, ioh, com_isr,
178: ISR_RECV);
179: }
180: }
181: break;
182: }
183: }
CVSweb