diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 16:31:07 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 16:31:07 +0200 |
commit | 7db23bb2f00a9c8f53f7aa063112e946f7a9539a (patch) | |
tree | bc17c198f1b57c67c5bbe21f4289d120a697af9f | |
parent | 652508728d0a8486948b776b788da00ce5de6c05 (diff) |
audiosb16: cleanup audioprobe(), cast ISAConf.port to ulong
-rw-r--r-- | sys/src/9/pc/audiosb16.c | 99 |
1 files changed, 53 insertions, 46 deletions
diff --git a/sys/src/9/pc/audiosb16.c b/sys/src/9/pc/audiosb16.c index a38483aed..e629abb4d 100644 --- a/sys/src/9/pc/audiosb16.c +++ b/sys/src/9/pc/audiosb16.c @@ -474,6 +474,8 @@ audiointr(Ureg *, void *arg) adev = arg; ctlr = adev->ctlr; + if(ctlr == nil || ctlr->adev != adev) + return; if(!ctlr->active){ iprint("#A%d: unexpected %s interrupt\n", ctlr->adev->ctlrno, ctlr->adev->name); @@ -672,46 +674,14 @@ ess1688(ISAConf* sbconf, Blaster *blaster, int ctlrno) return 0; } +static int irqmap[] = {9,5,7,10}; + static int -audioprobe(Audio *adev) +reset1(Audio *adev, Ctlr *ctlr) { - static int irq[] = {9,5,7,10}; - static Ctlr *cards = nil; - - Ctlr *ctlr; Blaster *blaster; int i, x; - /* make a list of audio isa cards if not already done */ - if(cards == nil){ - for(i=0; i<nelem(irq); i++){ - ctlr = mallocz(sizeof(Ctlr), 1); - if(ctlr == nil){ - print("sb16: can't allocate memory\n"); - break; - } - ctlr->conf.port = 0x220 + i*0x10; - ctlr->conf.irq = irq[i]; - ctlr->conf.dma = 0; - if(isaconfig("audio", i, &ctlr->conf) == 0){ - free(ctlr); - break; - } - ctlr->next = cards; - cards = ctlr; - } - } - - /* pick a card */ - for(ctlr = cards; ctlr; ctlr = ctlr->next){ - if(ctlr->conf.type && strcmp(adev->name, ctlr->conf.type) == 0){ - ctlr->conf.type = nil; - goto Found; - } - } - return -1; - -Found: switch(ctlr->conf.port){ case 0x220: case 0x240: @@ -719,25 +689,22 @@ Found: case 0x280: break; default: - print("#A%d: bad port %#lux\n", adev->ctlrno, ctlr->conf.port); + print("#A%d: bad port %lux\n", adev->ctlrno, (ulong)ctlr->conf.port); return -1; } if(ioalloc(ctlr->conf.port, 0x10, 0, "audio") < 0){ print("#A%d: cannot ioalloc range %lux+0x10\n", - adev->ctlrno, ctlr->conf.port); + adev->ctlrno, (ulong)ctlr->conf.port); return -1; } if(ioalloc(ctlr->conf.port+0x100, 1, 0, "audio.mpu401") < 0){ iofree(ctlr->conf.port); print("#A%d: cannot ioalloc range %lux+0x01\n", - adev->ctlrno, ctlr->conf.port+0x100); + adev->ctlrno, (ulong)ctlr->conf.port+0x100); return -1; } - ctlr->adev = adev; - adev->ctlr = ctlr; - blaster = &ctlr->blaster; blaster->reset = ctlr->conf.port + 0x6; blaster->read = ctlr->conf.port + 0xa; @@ -795,16 +762,16 @@ Errout: } /* set irq */ - for(i=0; i<nelem(irq); i++){ - if(ctlr->conf.irq == irq[i]){ + for(i=0; i<nelem(irqmap); i++){ + if(ctlr->conf.irq == irqmap[i]){ mxcmd(blaster, 0x80, 1<<i); break; } } x = mxread(blaster, 0x80); - for(i=0; i<nelem(irq); i++){ + for(i=0; i<nelem(irqmap); i++){ if(x & (1<<i)){ - ctlr->conf.irq = irq[i]; + ctlr->conf.irq = irqmap[i]; break; } } @@ -828,7 +795,7 @@ Errout: } print("#A%d: %s port 0x%04lux irq %d dma %lud\n", adev->ctlrno, adev->name, - ctlr->conf.port, ctlr->conf.irq, ctlr->conf.dma); + (ulong)ctlr->conf.port, ctlr->conf.irq, ctlr->conf.dma); ctlr->ring.nbuf = Blocks*Blocksize; if(dmainit(ctlr->conf.dma, ctlr->ring.nbuf)) @@ -839,6 +806,7 @@ Errout: setempty(ctlr); + adev->ctlr = ctlr; adev->write = audiowrite; adev->close = audioclose; adev->volread = audiovolread; @@ -851,6 +819,45 @@ Errout: return 0; } +static int +audioprobe(Audio *adev) +{ + static Ctlr *cards = nil; + Ctlr *ctlr; + int i; + + /* make a list of audio isa cards if not already done */ + if(cards == nil){ + for(i=0; i<nelem(irqmap); i++){ + ctlr = mallocz(sizeof(Ctlr), 1); + if(ctlr == nil){ + print("sb16: can't allocate memory\n"); + break; + } + ctlr->conf.port = 0x220 + i*0x10; + ctlr->conf.irq = irqmap[i]; + ctlr->conf.dma = 0; + if(!isaconfig("audio", i, &ctlr->conf)){ + free(ctlr); + break; + } + ctlr->next = cards; + cards = ctlr; + } + } + + /* pick a card */ + for(ctlr = cards; ctlr; ctlr = ctlr->next){ + if(ctlr->adev == nil && strcmp(adev->name, ctlr->conf.type) == 0){ + ctlr->adev = adev; + if(reset1(adev, ctlr) == 0) + return 0; + ctlr->adev = (void*)-1; + } + } + return -1; +} + void audiosb16link(void) { |