aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sound/isa/gusc.c
diff options
context:
space:
mode:
authorSeigo Tanimura <tanimura@FreeBSD.org>1999-11-25 01:13:52 +0000
committerSeigo Tanimura <tanimura@FreeBSD.org>1999-11-25 01:13:52 +0000
commit5d6784867c2405eae7c81588055b1b72e31369fc (patch)
tree761e9d2dfbf10691b58e0e6b518b6fa0d3685998 /sys/dev/sound/isa/gusc.c
parent3082a6dc59ac18c9d75f22bf2991816967b001f5 (diff)
Attach the resources as given in the configuration in a proper way
for non-PnP cards. Noticed by: Pascal Hofstee <daeron@shadowmere.student.utwente.nl>
Notes
Notes: svn path=/head/; revision=53682
Diffstat (limited to 'sys/dev/sound/isa/gusc.c')
-rw-r--r--sys/dev/sound/isa/gusc.c60
1 files changed, 46 insertions, 14 deletions
diff --git a/sys/dev/sound/isa/gusc.c b/sys/dev/sound/isa/gusc.c
index 9c531b2dc237..93fa2501a695 100644
--- a/sys/dev/sound/isa/gusc.c
+++ b/sys/dev/sound/isa/gusc.c
@@ -57,9 +57,10 @@
#if NGUSC > 0
-#define LOGICALID_PCM 0x0000561e
-#define LOGICALID_OPL 0x0300561e
-#define LOGICALID_MIDI 0x0400561e
+#define LOGICALID_NOPNP 0
+#define LOGICALID_PCM 0x0000561e
+#define LOGICALID_OPL 0x0300561e
+#define LOGICALID_MIDI 0x0400561e
/* Interrupt handler. */
struct gusc_ihandler {
@@ -477,23 +478,41 @@ find_masterdev(sc_p scp)
}
#endif /* notyet */
-static int io_range[3] = {0x10, 0x4, 0x4};
+static int io_range[3] = {0x10, 0x8 , 0x4 };
+static int io_offset[3] = {0x0 , 0x100, 0x10c};
static int
alloc_resource(sc_p scp)
{
- int i;
+ int i, base, lid, flags;
#if notyet
device_t dev;
#endif /* notyet */
- switch(isa_get_logicalid(scp->dev)) {
+ flags = 0;
+ if (isa_get_vendorid(scp->dev))
+ lid = isa_get_logicalid(scp->dev);
+ else {
+ lid = LOGICALID_NOPNP;
+ flags = device_get_flags(scp->dev);
+ }
+ switch(lid) {
case LOGICALID_PCM:
- default: /* XXX Non-PnP */
+ case LOGICALID_NOPNP: /* XXX Non-PnP */
+ if (lid == LOGICALID_NOPNP)
+ base = isa_get_port(scp->dev);
+ else
+ base = 0;
for (i = 0 ; i < sizeof(scp->io) / sizeof(*scp->io) ; i++) {
if (scp->io[i] == NULL) {
scp->io_rid[i] = i;
- scp->io[i] = bus_alloc_resource(scp->dev, SYS_RES_IOPORT, &scp->io_rid[i],
- 0, ~0, io_range[i], RF_ACTIVE);
+ if (base == 0)
+ scp->io[i] = bus_alloc_resource(scp->dev, SYS_RES_IOPORT, &scp->io_rid[i],
+ 0, ~0, io_range[i], RF_ACTIVE);
+ else
+ scp->io[i] = bus_alloc_resource(scp->dev, SYS_RES_IOPORT, &scp->io_rid[i],
+ base + io_offset[i],
+ base + io_offset[i] + io_range[i] - 1
+ , io_range[i], RF_ACTIVE);
if (scp->io[i] == NULL)
return (1);
scp->io_alloced[i] = 0;
@@ -510,8 +529,14 @@ alloc_resource(sc_p scp)
for (i = 0 ; i < sizeof(scp->drq) / sizeof(*scp->drq) ; i++) {
if (scp->drq[i] == NULL) {
scp->drq_rid[i] = i;
- scp->drq[i] = bus_alloc_resource(scp->dev, SYS_RES_DRQ, &scp->drq_rid[i],
- 0, ~0, 1, RF_ACTIVE);
+ if (base == 0 || i == 0)
+ scp->drq[i] = bus_alloc_resource(scp->dev, SYS_RES_DRQ, &scp->drq_rid[i],
+ 0, ~0, 1, RF_ACTIVE);
+ else if ((flags & DV_F_DUAL_DMA) != 0)
+ /* XXX The secondary drq is specified in the flag. */
+ scp->drq[i] = bus_alloc_resource(scp->dev, SYS_RES_DRQ, &scp->drq_rid[i],
+ flags & DV_F_DRQ_MASK,
+ flags & DV_F_DRQ_MASK, 1, RF_ACTIVE);
if (scp->drq[i] == NULL)
return (1);
scp->drq_alloced[i] = 0;
@@ -559,14 +584,21 @@ alloc_resource(sc_p scp)
static int
release_resource(sc_p scp)
{
- int i;
+ int i, lid, flags;
#if notyet
device_t dev;
#endif /* notyet */
- switch(isa_get_logicalid(scp->dev)) {
+ flags = 0;
+ if (isa_get_vendorid(scp->dev))
+ lid = isa_get_logicalid(scp->dev);
+ else {
+ lid = LOGICALID_NOPNP;
+ flags = device_get_flags(scp->dev);
+ }
+ switch(lid) {
case LOGICALID_PCM:
- default: /* XXX Non-PnP */
+ case LOGICALID_NOPNP: /* XXX Non-PnP */
for (i = 0 ; i < sizeof(scp->io) / sizeof(*scp->io) ; i++) {
if (scp->io[i] != NULL) {
bus_release_resource(scp->dev, SYS_RES_IOPORT, scp->io_rid[i], scp->io[i]);