From 7b6675ff1a1da63c2f738b50d3ee2eb062c3ab63 Mon Sep 17 00:00:00 2001 From: ment Date: Mon, 27 Jun 2011 23:01:58 +0200 Subject: [PATCH] audio/hda: added archfile command interface --- sys/src/9/pc/audiohda.c | 47 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/sys/src/9/pc/audiohda.c b/sys/src/9/pc/audiohda.c index 7b978f117..a58cdcd45 100644 --- a/sys/src/9/pc/audiohda.c +++ b/sys/src/9/pc/audiohda.c @@ -277,9 +277,9 @@ struct Ctlr { uchar *mem; ulong size; + Queue *q; ulong *corb; ulong corbsize; - ulong *rirb; ulong rirbsize; @@ -370,6 +370,8 @@ static char *pinloc2[] = { "other", }; +Ctlr *lastcard; + static int waitup8(Ctlr *ctlr, int reg, uchar mask, uchar set) { @@ -1264,6 +1266,45 @@ hdamatch(Pcidev *p) return nil; } +static long +hdacmdread(Chan *, void *a, long n, vlong) +{ + Ctlr *ctlr; + + ctlr = lastcard; + if(ctlr == nil) + error(Enodev); + if(n & 7) + error(Ebadarg); + return qread(ctlr->q, a, n); +} + +static long +hdacmdwrite(Chan *, void *a, long n, vlong) +{ + Ctlr *ctlr; + ulong *lp; + int i; + uint w[2]; + + ctlr = lastcard; + if(ctlr == nil) + error(Enodev); + if(n & 3) + error(Ebadarg); + lp = a; + qlock(ctlr); + for(i=0; iq, w, sizeof(w)); + } + qunlock(ctlr); + return n; +} + static int hdareset(Audio *adev) { @@ -1304,6 +1345,7 @@ Found: ctlr->no = adev->ctlrno; ctlr->size = p->mem[0].size; + ctlr->q = qopen(256, 0, 0, 0); ctlr->mem = vmap(p->mem[0].bar & ~0x0F, ctlr->size); if(ctlr->mem == nil){ print("#A%d: can't map %.8lux\n", ctlr->no, p->mem[0].bar); @@ -1345,6 +1387,8 @@ Found: adev->ctl = hdactl; intrenable(irq, hdainterrupt, adev, tbdf, "hda"); + lastcard = ctlr; + addarchfile("hdacmd", 0664, hdacmdread, hdacmdwrite); return 0; } @@ -1354,3 +1398,4 @@ audiohdalink(void) { addaudiocard("hda", hdareset); } + -- 2.44.0