]> git.lizzy.rs Git - plan9front.git/commitdiff
ac97: fix probe code
authorcinap_lenrek <cinap_lenrek@localhost>
Thu, 19 May 2011 17:00:58 +0000 (17:00 +0000)
committercinap_lenrek <cinap_lenrek@localhost>
Thu, 19 May 2011 17:00:58 +0000 (17:00 +0000)
sys/src/9/pc/audioac97.c

index c62f349d7bf4b32fe4506328bfb6b449188848c5..e8e674489166b0c5dc606ec63a6042db670b4132 100644 (file)
@@ -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;