9 #include <sys/kernel.h>
10 #include <sys/module.h>
12 #include <sys/fcntl.h>
18 #include <sys/mutex.h>
20 #include <machine/bus_pio.h>
21 #include <machine/bus.h>
22 #include <machine/resource.h>
25 #include <isa/isavar.h>
27 #include <dev/mcd/mcdreg.h>
28 #include <dev/mcd/mcdvar.h>
30 static int mcd_isa_probe (device_t);
31 static int mcd_isa_attach (device_t);
32 static int mcd_isa_detach (device_t);
34 static int mcd_alloc_resources (device_t);
35 static void mcd_release_resources (device_t);
38 mcd_isa_probe (device_t dev)
40 struct mcd_softc * sc;
44 if (isa_get_vendorid(dev))
47 /* IO port must be configured. */
48 if (bus_get_resource_start(dev, SYS_RES_IOPORT, 0) == 0)
51 sc = device_get_softc(dev);
54 sc->port_type = SYS_RES_IOPORT;
55 error = mcd_alloc_resources(dev);
59 error = mcd_probe(sc);
61 device_printf(dev, "Probe failed.\n");
65 device_set_desc(dev, sc->data.name);
68 mcd_release_resources(dev);
73 mcd_isa_attach (device_t dev)
75 struct mcd_softc * sc;
78 sc = device_get_softc(dev);
83 sc->port_type = SYS_RES_IOPORT;
84 error = mcd_alloc_resources(dev);
88 error = mcd_probe(sc);
90 device_printf(dev, "Re-Probe failed.\n");
94 error = mcd_attach(sc);
96 device_printf(dev, "Attach failed.\n");
102 mcd_release_resources(dev);
107 mcd_isa_detach (device_t dev)
109 struct mcd_softc * sc;
112 sc = device_get_softc(dev);
115 destroy_dev(sc->mcd_dev_t);
117 mcd_release_resources(dev);
123 mcd_alloc_resources (device_t dev)
125 struct mcd_softc * sc;
128 sc = device_get_softc(dev);
132 sc->port = bus_alloc_resource_any(dev, sc->port_type,
133 &sc->port_rid, RF_ACTIVE);
134 if (sc->port == NULL) {
135 device_printf(dev, "Unable to allocate PORT resource.\n");
139 sc->port_bst = rman_get_bustag(sc->port);
140 sc->port_bsh = rman_get_bushandle(sc->port);
144 sc->irq = bus_alloc_resource_any(dev, sc->irq_type,
145 &sc->irq_rid, RF_ACTIVE);
146 if (sc->irq == NULL) {
147 device_printf(dev, "Unable to allocate IRQ resource.\n");
154 sc->drq = bus_alloc_resource_any(dev, sc->drq_type,
155 &sc->drq_rid, RF_ACTIVE);
156 if (sc->drq == NULL) {
157 device_printf(dev, "Unable to allocate DRQ resource.\n");
163 mtx_init(&sc->mtx, device_get_nameunit(dev),
164 "Interrupt lock", MTX_DEF | MTX_RECURSE);
171 mcd_release_resources (device_t dev)
173 struct mcd_softc * sc;
175 sc = device_get_softc(dev);
178 bus_teardown_intr(dev, sc->irq, sc->irq_ih);
180 bus_release_resource(dev, sc->port_type, sc->port_rid, sc->port);
185 bus_release_resource(dev, sc->irq_type, sc->irq_rid, sc->irq);
187 bus_release_resource(dev, sc->drq_type, sc->drq_rid, sc->drq);
189 if (mtx_initialized(&sc->mtx) != 0)
190 mtx_destroy(&sc->mtx);
195 static device_method_t mcd_isa_methods[] = {
196 DEVMETHOD(device_probe, mcd_isa_probe),
197 DEVMETHOD(device_attach, mcd_isa_attach),
198 DEVMETHOD(device_detach, mcd_isa_detach),
203 static driver_t mcd_isa_driver = {
206 sizeof(struct mcd_softc)
209 static devclass_t mcd_devclass;
211 DRIVER_MODULE(mcd, isa, mcd_isa_driver, mcd_devclass, NULL, 0);