slhci_isa.c revision 1.4.54.1 1 /* $NetBSD: slhci_isa.c,v 1.4.54.1 2006/10/22 06:06:04 yamt 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.4.54.1 2006/10/22 06:06:04 yamt 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
51 #include <dev/ic/sl811hsreg.h>
52 #include <dev/ic/sl811hsvar.h>
53
54 #include <dev/isa/isavar.h>
55
56 struct slhci_isa_softc {
57 struct slhci_softc sc;
58 isa_chipset_tag_t sc_ic;
59 void *sc_ih;
60 };
61
62 static int slhci_isa_match(struct device *, struct cfdata *, void *);
63 static void slhci_isa_attach(struct device *, struct device *, void *);
64
65 CFATTACH_DECL(slhci_isa, sizeof(struct slhci_isa_softc),
66 slhci_isa_match, slhci_isa_attach, NULL, NULL);
67
68 static int
69 slhci_isa_match(struct device *parent __unused, struct cfdata *cf __unused,
70 void *aux)
71 {
72 struct slhci_softc sc;
73 struct isa_attach_args *ia = aux;
74 bus_space_tag_t iot = ia->ia_iot;
75 bus_space_handle_t ioh;
76 int result = 0;
77
78 if (bus_space_map(iot, ia->ia_io[0].ir_addr, SL11_PORTSIZE, 0, &ioh))
79 goto out;
80
81 memset(&sc, 0, sizeof(sc));
82 sc.sc_iot = iot;
83 sc.sc_ioh = ioh;
84 if (sl811hs_find(&sc) >= 0)
85 result = 1;
86
87 bus_space_unmap(iot, ioh, SL11_PORTSIZE);
88
89 out:
90 return (result);
91 }
92
93 static void
94 slhci_isa_attach(struct device *parent __unused, struct device *self, void *aux)
95 {
96 struct slhci_isa_softc *isc = (struct slhci_isa_softc *)self;
97 struct slhci_softc *sc = &isc->sc;
98 struct isa_attach_args *ia = aux;
99 bus_space_tag_t iot = ia->ia_iot;
100 bus_space_handle_t ioh;
101
102 printf("\n");
103
104 /* Map I/O space */
105 if (bus_space_map(iot, ia->ia_io[0].ir_addr, SL11_PORTSIZE, 0, &ioh)) {
106 printf("%s: can't map I/O space\n",
107 sc->sc_bus.bdev.dv_xname);
108 return;
109 }
110
111 /* Initialize sc */
112 sc->sc_iot = iot;
113 sc->sc_ioh = ioh;
114 sc->sc_dmat = ia->ia_dmat;
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, self))
130 return;
131 }
132