slhci_isa.c revision 1.6.18.1 1 /* $NetBSD: slhci_isa.c,v 1.6.18.1 2007/05/22 14:57:32 itohy Exp $ */
2
3 /*
4 * Copyright (c) 2001 Kiyoshi Ikehara. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by Kiyoshi Ikehara.
17 * 4. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33 /*
34 * ISA-USB host board
35 */
36
37 #include <sys/cdefs.h>
38 __KERNEL_RCSID(0, "$NetBSD: slhci_isa.c,v 1.6.18.1 2007/05/22 14:57:32 itohy Exp $");
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/device.h>
43
44 #include <machine/bus.h>
45 #include <machine/cpu.h>
46
47 #include <dev/usb/usb.h>
48 #include <dev/usb/usbdi.h>
49 #include <dev/usb/usbdivar.h>
50 #include <dev/usb/usb_mem_nodma.h>
51
52 #include <dev/ic/sl811hsreg.h>
53 #include <dev/ic/sl811hsvar.h>
54
55 #include <dev/isa/isavar.h>
56
57 struct slhci_isa_softc {
58 struct slhci_softc sc;
59 isa_chipset_tag_t sc_ic;
60 void *sc_ih;
61 };
62
63 static int slhci_isa_match(struct device *, struct cfdata *, void *);
64 static void slhci_isa_attach(struct device *, struct device *, void *);
65
66 CFATTACH_DECL(slhci_isa, sizeof(struct slhci_isa_softc),
67 slhci_isa_match, slhci_isa_attach, NULL, NULL);
68
69 static int
70 slhci_isa_match(struct device *parent, struct cfdata *cf,
71 void *aux)
72 {
73 struct slhci_softc sc;
74 struct isa_attach_args *ia = aux;
75 bus_space_tag_t iot = ia->ia_iot;
76 bus_space_handle_t ioh;
77 int result = 0;
78
79 if (bus_space_map(iot, ia->ia_io[0].ir_addr, SL11_PORTSIZE, 0, &ioh))
80 goto out;
81
82 memset(&sc, 0, sizeof(sc));
83 sc.sc_iot = iot;
84 sc.sc_ioh = ioh;
85 if (sl811hs_find(&sc) >= 0)
86 result = 1;
87
88 bus_space_unmap(iot, ioh, SL11_PORTSIZE);
89
90 out:
91 return (result);
92 }
93
94 static void
95 slhci_isa_attach(struct device *parent, struct device *self, void *aux)
96 {
97 struct slhci_isa_softc *isc = (struct slhci_isa_softc *)self;
98 struct slhci_softc *sc = &isc->sc;
99 struct isa_attach_args *ia = aux;
100 bus_space_tag_t iot = ia->ia_iot;
101 bus_space_handle_t ioh;
102
103 printf("\n");
104
105 /* Map I/O space */
106 if (bus_space_map(iot, ia->ia_io[0].ir_addr, SL11_PORTSIZE, 0, &ioh)) {
107 printf("%s: can't map I/O space\n",
108 sc->sc_bus.bdev.dv_xname);
109 return;
110 }
111
112 /* Initialize sc */
113 sc->sc_iot = iot;
114 sc->sc_ioh = ioh;
115 sc->sc_enable_power = NULL;
116 sc->sc_enable_intr = NULL;
117 sc->sc_arg = isc;
118
119 /* Establish the interrupt handler */
120 isc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq,
121 IST_EDGE, IPL_USB, slhci_intr, sc);
122 if (isc->sc_ih == NULL) {
123 printf("%s: can't establish interrupt\n",
124 sc->sc_bus.bdev.dv_xname);
125 return;
126 }
127
128 /* Attach SL811HS/T */
129 if (slhci_attach(sc))
130 return;
131 }
132