summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-05-19 17:00:58 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-05-19 17:00:58 +0000
commite1400c2d5b429f3baa2a5f8227494e80367f7ee0 (patch)
treef4e2b6655cfc35cb4384bb769d8bbbad643fc424
parentf5b15ebcd3edfa52a4c8eaa1ef2dd88a60196285 (diff)
downloadplan9front-e1400c2d5b429f3baa2a5f8227494e80367f7ee0.tar.xz
ac97: fix probe code
-rw-r--r--sys/src/9/pc/audioac97.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/sys/src/9/pc/audioac97.c b/sys/src/9/pc/audioac97.c
index c62f349d7..e8e674489 100644
--- a/sys/src/9/pc/audioac97.c
+++ b/sys/src/9/pc/audioac97.c
@@ -70,6 +70,10 @@ struct Ctlr {
int hardrate;
int attachok;
+
+ /* for probe */
+ Pcidev *pcidev;
+ Ctlr *next;
};
#define iorl(c, r) (inl((c)->port+(r)))
@@ -483,20 +487,34 @@ sethwp(Ctlr *ctlr, long off, void *ptr)
static int
ac97reset(Audio *adev)
{
- static int ncards = 1;
- int i, irq, tbdf;
+ static Ctlr *cards = nil;
Pcidev *p;
+ int i, irq, tbdf;
Ctlr *ctlr;
ulong ctl, stat = 0;
- p = nil;
- for(i = 0; i < ncards; i++)
- if((p = ac97match(p)) == nil)
- return -1;
- ncards++;
+ /* make a list of all ac97 cards if not already done */
+ if(cards == nil){
+ p = nil;
+ while(p = ac97match(p)){
+ ctlr = xspanalloc(sizeof(Ctlr), 8, 0);
+ memset(ctlr, 0, sizeof(Ctlr));
+ ctlr->pcidev = p;
+ ctlr->next = cards;
+ cards = ctlr;
+ }
+ }
+
+ /* pick a card from the list */
+ for(ctlr = cards; ctlr; ctlr = ctlr->next){
+ if(p = ctlr->pcidev){
+ ctlr->pcidev = nil;
+ goto Found;
+ }
+ }
+ return -1;
- ctlr = xspanalloc(sizeof(Ctlr), 8, 0);
- memset(ctlr, 0, sizeof(Ctlr));
+Found:
adev->ctlr = ctlr;
ctlr->targetrate = 44100;
ctlr->hardrate = 44100;