Annotation of sys/arch/arm/sa11x0/sa11x1_pcic.c, Revision 1.1.1.1
1.1 nbrk 1: /* $NetBSD: sa11x1_pcic.c,v 1.16 2007/10/17 19:53:43 garbled Exp $ */
2:
3: /*-
4: * Copyright (c) 2001 The NetBSD Foundation, Inc.
5: * All rights reserved.
6: *
7: * This code is derived from software contributed to The NetBSD Foundation
8: * by IWAMOTO Toshihiro.
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 by the NetBSD
21: * Foundation, Inc. and its contributors.
22: * 4. Neither the name of The NetBSD Foundation nor the names of its
23: * contributors may be used to endorse or promote products derived
24: * from this software without specific prior written permission.
25: *
26: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27: * ``AS IS'' AND 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 THE FOUNDATION OR CONTRIBUTORS
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: __KERNEL_RCSID(0, "$NetBSD: sa11x1_pcic.c,v 1.16 2007/10/17 19:53:43 garbled Exp $");
41:
42: #include <sys/param.h>
43: #include <sys/systm.h>
44: #include <sys/types.h>
45: #include <sys/conf.h>
46: #include <sys/file.h>
47: #include <sys/device.h>
48: #include <sys/kernel.h>
49: #include <sys/kthread.h>
50: #include <sys/malloc.h>
51:
52: #include <machine/bus.h>
53:
54: #include <dev/pcmcia/pcmciachip.h>
55: #include <dev/pcmcia/pcmciavar.h>
56: #include <arm/sa11x0/sa11x0_reg.h>
57: #include <arm/sa11x0/sa11x0_var.h>
58: #include <arm/sa11x0/sa1111_reg.h>
59: #include <arm/sa11x0/sa1111_var.h>
60: #include <arm/sa11x0/sa11x1_pcicreg.h>
61: #include <arm/sa11x0/sa11xx_pcicvar.h>
62: #include <arm/sa11x0/sa11x1_pcicvar.h>
63:
64: #include "sacpcic.h"
65:
66: static int sacpcic_print(void *, const char *);
67:
68: void
69: sacpcic_attach_common(struct sacc_softc *psc, struct sacpcic_softc *sc,
70: void *aux, void (* socket_setup_hook)(struct sapcic_socket *))
71: {
72: int i;
73: struct pcmciabus_attach_args paa;
74:
75: printf("\n");
76:
77: sc->sc_pc.sc_iot = psc->sc_iot;
78: sc->sc_ioh = psc->sc_ioh;
79:
80: for (i = 0; i < 2; i++) {
81: sc->sc_socket[i].sc = (struct sapcic_softc *)sc;
82: sc->sc_socket[i].socket = i;
83: sc->sc_socket[i].pcictag_cookie = psc;
84: sc->sc_socket[i].pcictag = NULL;
85: sc->sc_socket[i].event_thread = NULL;
86: sc->sc_socket[i].event = 0;
87: sc->sc_socket[i].laststatus = SAPCIC_CARD_INVALID;
88: sc->sc_socket[i].shutdown = 0;
89:
90: socket_setup_hook(&sc->sc_socket[i]);
91:
92: paa.paa_busname = "pcmcia";
93: paa.pct = (pcmcia_chipset_tag_t)&sa11x0_pcmcia_functions;
94: paa.pch = (pcmcia_chipset_handle_t)&sc->sc_socket[i];
95: paa.iobase = 0;
96: paa.iosize = 0x4000000;
97:
98: sc->sc_socket[i].pcmcia =
99: config_found_ia(&sc->sc_pc.sc_dev, "pcmciabus", &paa,
100: sacpcic_print);
101:
102: sacc_intr_establish((sacc_chipset_tag_t)psc,
103: i ? IRQ_S1_CDVALID : IRQ_S0_CDVALID,
104: IST_EDGE_RAISE, IPL_BIO, sapcic_intr,
105: &sc->sc_socket[i]);
106:
107: /* create kthread */
108: sapcic_kthread_create(&sc->sc_socket[i]);
109: #if 0 /* XXX */
110: /* establish_intr should be after creating the kthread */
111: config_interrupt(&sc->sc_socket[i], sapcic_config_intr);
112: #endif
113: }
114: }
115:
116: int
117: sacpcic_print(void *aux, const char *name)
118: {
119:
120: return UNCONF;
121: }
122:
123: int
124: sacpcic_read(struct sapcic_socket *so, int reg)
125: {
126: int cr, bit;
127: struct sacpcic_softc *sc = (struct sacpcic_softc *)so->sc;
128:
129: cr = bus_space_read_4(sc->sc_pc.sc_iot, sc->sc_ioh, SACPCIC_SR);
130:
131: switch (reg) {
132: case SAPCIC_STATUS_CARD:
133: bit = (so->socket ? SR_S1_CARDDETECT : SR_S0_CARDDETECT) & cr;
134: if (bit)
135: return SAPCIC_CARD_INVALID;
136: else
137: return SAPCIC_CARD_VALID;
138:
139: case SAPCIC_STATUS_VS1:
140: bit = (so->socket ? SR_S1_VS1 : SR_S0_VS1);
141: return (bit & cr);
142:
143: case SAPCIC_STATUS_VS2:
144: bit = (so->socket ? SR_S1_VS2 : SR_S0_VS2);
145: return (bit & cr);
146:
147: case SAPCIC_STATUS_READY:
148: bit = (so->socket ? SR_S1_READY : SR_S0_READY);
149: return (bit & cr);
150:
151: default:
152: panic("sacpcic_read: bogus register");
153: }
154: }
155:
156: void
157: sacpcic_write(struct sapcic_socket *so, int reg, int arg)
158: {
159: int s, oldvalue, newvalue, mask;
160: struct sacpcic_softc *sc = (struct sacpcic_softc *)so->sc;
161:
162: s = splhigh();
163: oldvalue = bus_space_read_4(sc->sc_pc.sc_iot, sc->sc_ioh, SACPCIC_CR);
164:
165: switch (reg) {
166: case SAPCIC_CONTROL_RESET:
167: mask = so->socket ? CR_S1_RST : CR_S0_RST;
168:
169: newvalue = (oldvalue & ~mask) | (arg ? mask : 0);
170: break;
171:
172: case SAPCIC_CONTROL_LINEENABLE:
173: mask = so->socket ? CR_S1_FLT : CR_S0_FLT;
174:
175: newvalue = (oldvalue & ~mask) | (arg ? mask : 0);
176: break;
177:
178: case SAPCIC_CONTROL_WAITENABLE:
179: mask = so->socket ? CR_S1_PWAITEN : CR_S0_PWAITEN;
180:
181: newvalue = (oldvalue & ~mask) | (arg ? mask : 0);
182: break;
183:
184: case SAPCIC_CONTROL_POWERSELECT:
185: mask = so->socket ? CR_S1_PSE : CR_S0_PSE;
186: newvalue = oldvalue & ~mask;
187:
188: switch (arg) {
189: case SAPCIC_POWER_3V:
190: break;
191: case SAPCIC_POWER_5V:
192: newvalue |= mask;
193: break;
194: default:
195: splx(s);
196: panic("sacpcic_write: bogus arg");
197: }
198: break;
199:
200: default:
201: splx(s);
202: panic("sacpcic_write: bogus register");
203: }
204: bus_space_write_4(sc->sc_pc.sc_iot, sc->sc_ioh, SACPCIC_CR, newvalue);
205: splx(s);
206: }
207:
208: void
209: sacpcic_clear_intr(int arg)
210: {
211: /* sacc_intr_dispatch takes care of intr status */
212: }
213:
214: void *
215: sacpcic_intr_establish(struct sapcic_socket *so, int level,
216: int (*ih_fun)(void *), void *ih_arg)
217: {
218: int irq;
219:
220: irq = so->socket ? IRQ_S1_READY : IRQ_S0_READY;
221: return sacc_intr_establish((sacc_chipset_tag_t)so->pcictag_cookie, irq,
222: IST_EDGE_FALL, level, ih_fun, ih_arg);
223: }
224:
225: void
226: sacpcic_intr_disestablish(struct sapcic_socket *so, void *ih)
227: {
228: sacc_intr_disestablish((sacc_chipset_tag_t)so->pcictag_cookie, ih);
229: }
CVSweb