This source file includes following definitions.
- sb_isa_match
- sbfind
- sb_isa_attach
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/errno.h>
41 #include <sys/ioctl.h>
42 #include <sys/syslog.h>
43 #include <sys/device.h>
44 #include <sys/proc.h>
45
46 #include <machine/bus.h>
47
48 #include <sys/audioio.h>
49 #include <dev/audio_if.h>
50 #include <dev/midi_if.h>
51 #include <dev/mulaw.h>
52
53 #include <dev/isa/isavar.h>
54 #include <dev/isa/isadmavar.h>
55
56 #include <dev/isa/sbreg.h>
57 #include <dev/isa/sbvar.h>
58
59 #include <dev/isa/sbdspvar.h>
60
61 static int sbfind(struct device *, struct sbdsp_softc *, struct isa_attach_args *);
62
63 int sb_isa_match(struct device *, void *, void *);
64 void sb_isa_attach(struct device *, struct device *, void *);
65
66 struct cfattach sb_isa_ca = {
67 sizeof(struct sbdsp_softc), sb_isa_match, sb_isa_attach
68 };
69
70
71
72
73
74
75
76
77 int
78 sb_isa_match(parent, match, aux)
79 struct device *parent;
80 void *match;
81 void *aux;
82 {
83 struct sbdsp_softc probesc, *sc = &probesc;
84
85 bzero(sc, sizeof *sc);
86 sc->sc_dev.dv_cfdata = ((struct device *)match)->dv_cfdata;
87 strlcpy(sc->sc_dev.dv_xname, "sb", sizeof sc->sc_dev.dv_xname);
88 return sbfind(parent, sc, aux);
89 }
90
91 static int
92 sbfind(parent, sc, ia)
93 struct device *parent;
94 struct sbdsp_softc *sc;
95 struct isa_attach_args *ia;
96 {
97 int rc = 0;
98
99 if (!SB_BASE_VALID(ia->ia_iobase))
100 return 0;
101
102 sc->sc_iot = ia->ia_iot;
103
104
105 if (bus_space_map(sc->sc_iot, ia->ia_iobase, SBP_NPORT, 0,
106 &sc->sc_ioh))
107 return 0;
108
109 sc->sc_iobase = ia->ia_iobase;
110 sc->sc_irq = ia->ia_irq;
111 sc->sc_drq8 = ia->ia_drq;
112 sc->sc_drq16 = ia->ia_drq2;
113 sc->sc_ic = ia->ia_ic;
114
115 if (!sbmatch(sc))
116 goto bad;
117
118 if ((sc->sc_drq8 != -1 && !isa_drq_isfree(parent, sc->sc_drq8)) ||
119 (sc->sc_drq16 != -1 && !isa_drq_isfree(parent, sc->sc_drq16)))
120 goto bad;
121
122 if (ISSBPROCLASS(sc))
123 ia->ia_iosize = SBP_NPORT;
124 else
125 ia->ia_iosize = SB_NPORT;
126
127 if (!ISSB16CLASS(sc) && sc->sc_model != SB_JAZZ)
128 ia->ia_drq2 = -1;
129
130 ia->ia_irq = sc->sc_irq;
131
132 rc = 1;
133
134 bad:
135 bus_space_unmap(sc->sc_iot, sc->sc_ioh, SBP_NPORT);
136 return rc;
137 }
138
139
140
141
142
143
144 void
145 sb_isa_attach(parent, self, aux)
146 struct device *parent, *self;
147 void *aux;
148 {
149 struct sbdsp_softc *sc = (struct sbdsp_softc *)self;
150 struct isa_attach_args *ia = aux;
151
152 if (!sbfind(parent, sc, ia) ||
153 bus_space_map(sc->sc_iot, ia->ia_iobase, ia->ia_iosize, 0,
154 &sc->sc_ioh)) {
155 printf("%s: sbfind failed\n", sc->sc_dev.dv_xname);
156 return;
157 }
158 sc->sc_ic = ia->ia_ic;
159 sc->sc_isa = parent;
160 sbattach(sc);
161 }