32#include <sys/kernel.h>
34#include <sys/malloc.h>
35#include <sys/module.h>
36#include <machine/resource.h>
37#include <machine/bus.h>
40#ifdef HAVE_KERNEL_OPTION_HEADERS
48#include <isa/isavar.h>
49#include <isa/isa_common.h>
53#define LOGICALID_NOPNP 0
54#define LOGICALID_PCM 0x0000561e
55#define LOGICALID_OPL 0x0300561e
56#define LOGICALID_MIDI 0x0400561e
75 struct resource *
io[3];
81 struct resource *
drq[2];
96 rman_res_t start, rman_res_t end, rman_res_t
count, u_int flags);
110 u_int32_t logical_id;
115 logical_id = isa_get_logicalid(
dev);
119 if (logical_id != 0 && (ret = ISA_PNP_PROBE(device_get_parent(
dev),
dev,
gusc_ids)) != 0)
126 switch (logical_id) {
128 s =
"Gravis UltraSound Plug & Play PCM";
133 child = device_add_child(
dev,
"pcm", -1);
137 s =
"Gravis UltraSound Plug & Play OPL";
142 child = device_add_child(
dev,
"midi", -1);
146 s =
"Gravis UltraSound Plug & Play MIDI";
151 child = device_add_child(
dev,
"midi", -1);
157 device_set_desc(
dev, s);
165port_wr(
struct resource *r,
int i,
unsigned char v)
167 bus_space_write_1(rman_get_bustag(
r), rman_get_bushandle(
r), i, v);
173 return bus_space_read_1(rman_get_bustag(
r), rman_get_bushandle(
r), i);
184 struct resource *res, *res2;
189 flags = device_get_flags(
dev);
191 res = bus_alloc_resource(
dev, SYS_RES_IOPORT, &
rid,
base + 0x100,
192 base + 0x107, 8, RF_ACTIVE);
240 res2 = bus_alloc_resource(
dev, SYS_RES_IOPORT, &rid2,
base,
base, 1,
251 if (
val == 0xff || (
val & 0x06) == 0)
259 bus_release_resource(
dev, SYS_RES_IOPORT, rid2, res2);
260 bus_release_resource(
dev, SYS_RES_IOPORT,
rid, res);
267 bus_set_resource(
dev, SYS_RES_IOPORT, 2,
base + 0x10c, 8);
270 bus_set_resource(
dev, SYS_RES_DRQ, 1,
279 child = device_add_child(
dev,
"midi", -1);
284 printf(
"xxx: gus pcm not attached, out of memory\n");
287 child = device_add_child(
dev,
"pcm", -1);
290 device_set_desc(
dev,
"Gravis UltraSound MAX");
301 bus_release_resource(
dev, SYS_RES_IOPORT,
rid, res);
311 gone_in_dev(
dev, 14,
"ISA sound driver");
312 scp = device_get_softc(
dev);
314 bzero(scp,
sizeof(*scp));
322 if (scp->
irq != NULL)
324 bus_generic_attach(
dev);
350 }
while (did_something != 0);
353static struct resource *
355 rman_res_t start, rman_res_t end, rman_res_t
count, u_int flags)
358 int *alloced, rid_max, alloced_max;
359 struct resource **res;
361 scp = device_get_softc(
bus);
385 if (*
rid > rid_max || alloced[*
rid] == alloced_max)
397 int *alloced, rid_max;
399 scp = device_get_softc(
bus);
417 if (
rid > rid_max || alloced[
rid] == 0)
426 driver_filter_t *filter,
427 driver_intr_t *
intr,
void *arg,
void **cookiep)
432 if (filter != NULL) {
433 printf(
"gusc.c: we cannot use a filter here\n");
436 devclass = device_get_devclass(
child);
437 if (strcmp(devclass_get_name(devclass),
"midi") == 0) {
441 }
else if (strcmp(devclass_get_name(devclass),
"pcm") == 0) {
446 return bus_generic_setup_intr(
dev,
child,
irq, flags,
458 devclass = device_get_devclass(scp->
dev);
459 units = devclass_get_maxunit(devclass);
461 for (i = 0 ; i < units ; i++) {
462 dev = devclass_get_device(devclass, i);
463 if (isa_get_vendorid(
dev) == isa_get_vendorid(scp->
dev)
465 && isa_get_serial(
dev) == isa_get_serial(scp->
dev))
479 int i,
base, lid, flags;
483 if (isa_get_vendorid(scp->
dev))
484 lid = isa_get_logicalid(scp->
dev);
487 flags = device_get_flags(scp->
dev);
496 for (i = 0 ; i < nitems(scp->
io); i++) {
497 if (scp->
io[i] == NULL) {
501 bus_alloc_resource_anywhere(scp->
dev,
507 scp->
io[i] = bus_alloc_resource(scp->
dev, SYS_RES_IOPORT, &scp->
io_rid[i],
511 if (scp->
io[i] == NULL)
516 if (scp->
irq == NULL) {
519 bus_alloc_resource_any(scp->
dev, SYS_RES_IRQ,
521 RF_ACTIVE|RF_SHAREABLE);
522 if (scp->
irq == NULL)
526 for (i = 0 ; i < nitems(scp->
drq); i++) {
527 if (scp->
drq[i] == NULL) {
529 if (
base == 0 || i == 0)
531 bus_alloc_resource_any(
532 scp->
dev, SYS_RES_DRQ,
537 scp->
drq[i] = bus_alloc_resource(scp->
dev, SYS_RES_DRQ, &scp->
drq_rid[i],
540 if (scp->
drq[i] == NULL)
547 if (scp->
io[0] == NULL) {
549 scp->
io[0] = bus_alloc_resource_anywhere(scp->
dev,
554 if (scp->
io[0] == NULL)
560 if (scp->
io[0] == NULL) {
562 scp->
io[0] = bus_alloc_resource_anywhere(scp->
dev,
567 if (scp->
io[0] == NULL)
571 if (scp->
irq == NULL) {
577 scp->
irq = BUS_ALLOC_RESOURCE(
dev, NULL, SYS_RES_IRQ, &scp->
irq_rid,
578 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
579 if (scp->
irq == NULL)
594 if (isa_get_vendorid(scp->
dev))
595 lid = isa_get_logicalid(scp->
dev);
602 for (i = 0 ; i < nitems(scp->
io); i++) {
603 if (scp->
io[i] != NULL) {
604 bus_release_resource(scp->
dev, SYS_RES_IOPORT, scp->
io_rid[i], scp->
io[i]);
608 if (scp->
irq != NULL) {
609 bus_release_resource(scp->
dev, SYS_RES_IRQ, scp->
irq_rid, scp->
irq);
612 for (i = 0 ; i < nitems(scp->
drq); i++) {
613 if (scp->
drq[i] != NULL) {
614 bus_release_resource(scp->
dev, SYS_RES_DRQ, scp->
drq_rid[i], scp->
drq[i]);
620 if (scp->
io[0] != NULL) {
621 bus_release_resource(scp->
dev, SYS_RES_IOPORT, scp->
io_rid[0], scp->
io[0]);
626 if (scp->
io[0] != NULL) {
627 bus_release_resource(scp->
dev, SYS_RES_IOPORT, scp->
io_rid[0], scp->
io[0]);
630 if (scp->
irq != NULL) {
635 BUS_RELEASE_RESOURCE(
dev, NULL, SYS_RES_IOPORT, scp->
irq_rid, scp->
irq);
647 DEVMETHOD(device_detach, bus_generic_detach),
648 DEVMETHOD(device_shutdown, bus_generic_shutdown),
649 DEVMETHOD(device_suspend, bus_generic_suspend),
650 DEVMETHOD(device_resume, bus_generic_resume),
655 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
656 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
658 DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
static int gusc_probe(device_t dev)
static driver_t gusc_driver
static struct isa_pnp_id gusc_ids[]
static device_method_t gusc_methods[]
static devclass_t gusc_devclass
MODULE_VERSION(snd_gusc, 1)
static void port_wr(struct resource *r, int i, unsigned char v)
static int release_resource(sc_p scp)
static int gusc_attach(device_t dev)
static device_t find_masterdev(sc_p scp)
SND_DECLARE_FILE("$FreeBSD$")
static void gusc_intr(void *)
DRIVER_MODULE(snd_gusc, isa, gusc_driver, gusc_devclass, 0, 0)
static int port_rd(struct resource *r, int i)
static int gusisa_probe(device_t dev)
static int gusc_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, driver_filter_t *filter, driver_intr_t *intr, void *arg, void **cookiep)
static int gusc_release_resource(device_t bus, device_t child, int type, int rid, struct resource *r)
static struct resource * gusc_alloc_resource(device_t bus, device_t child, int type, int *rid, rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
MODULE_DEPEND(snd_gusc, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
static int alloc_resource(sc_p scp)
int snd_setup_intr(device_t dev, struct resource *res, int flags, driver_intr_t hand, void *param, void **cookiep)
struct gusc_ihandler midi_intr
struct gusc_ihandler pcm_intr