ref: 2417e3f61def0443d8f75bcc5003a63e02fe880b
parent: 96601790b2847b87bbab95382ed7010fa230cbbc
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Aug 29 17:07:01 EDT 2022
imx8/sai: reduce watermark; use the fifo size reported by the platform; remove useless stuff
--- a/sys/src/9/imx8/sai.c
+++ b/sys/src/9/imx8/sai.c
@@ -12,8 +12,9 @@
enum {
Byteps = 4,
- Wmark = 96,
+ Wmark = 8,
+ PARAM = 0x04/4,
TCSR = 0x08/4,
TCSR_TE = 1<<31,
TCSR_FR = 1<<25,
@@ -22,14 +23,11 @@
TCSR_FWF = 1<<17,
TCSR_FRF = 1<<16, /* watermark hit */
TCSR_FEIE = 1<<10,
- TCSR_FWIE = 1<<9,
TCSR_FRIE = 1<<8,
TCR1 = 0x0c/4,
TCR2 = 0x10/4,
- TCR2_MSEL_MCLK1 = 1<<26,
TCR2_BCP = 1<<25,
TCR2_BCD_SLAVE = 0<<24,
- TCR2_BCD_MASTER = 1<<24,
TCR3 = 0x14/4,
TCR3_TCE_SHIFT = 16,
TCR4 = 0x18/4,
@@ -42,7 +40,6 @@
TCR4_FSE = 1<<3,
TCR4_FSP_LOW = 1<<1,
TCR4_FSD_SLAVE = 0<<0,
- TCR4_FSD_MASTER = 1<<0,
TCR5 = 0x1c/4,
TCR5_WNW_SHIFT = 24,
TCR5_W0W_SHIFT = 16,
@@ -67,6 +64,7 @@
struct Ctlr {
u32int *reg;
Audio *adev;
+ int fifosz;
int hp;
Ring w;
@@ -256,7 +254,6 @@
char *p, *e, *x, *tok[4];
Ctlr *ctlr = adev->ctlr;
int ntok;
- u32int v;
p = a;
e = p + n;
@@ -269,15 +266,9 @@
if(ntok <= 0)
continue;
- if(cistrcmp(tok[0], "div") == 0 && ntok >= 2){
- v = strtoul(tok[1], nil, 0);
- wr(TCR2, (rd(TCR2) & ~0xff) | (v & 0xff));
- }else if(cistrcmp(tok[0], "msel") == 0 && ntok >= 2){
- v = strtoul(tok[1], nil, 0);
- wr(TCR2, (rd(TCR2) & ~(3<<26)) | (v & 3)<<26);
- }else if(cistrcmp(tok[0], "reset") == 0){
+ if(cistrcmp(tok[0], "reset") == 0)
saireset(ctlr);
- }else
+ else
error(Ebadctl);
}
return n;
@@ -322,9 +313,9 @@
if(v & (TCSR_FEF | TCSR_FRF | TCSR_FWF)){
r = &ctlr->w;
if(ctlr->wactive){
- if(buffered(r) < 128*Byteps) /* having less than fifo buffered */
+ if(buffered(r) < ctlr->fifosz*Byteps) /* having less than fifo buffered */
saistop(ctlr);
- else if(fifo(ctlr, (128-Wmark)*Byteps) > 0)
+ else if(fifo(ctlr, (ctlr->fifosz-Wmark)*Byteps) > 0)
wr(TCSR, v | TCSR_TE | TCSR_FEF);
}
wakeup(&r->r);
@@ -343,7 +334,7 @@
e = s + n;
v = rd(TCSR);
p = rd(TFR0);
- s = seprint(s, e, "transmit wfp %d rfp %d delay %d buf %ld avail %ld active %d %s%s%s%s\n",
+ s = seprint(s, e, "transmit wfp %d rfp %d delay %d buf %ld avail %ld active %d%s%s%s%s\n",
(p>>TFRx_WFP_SHIFT) & 0xff,
(p>>TFRx_RFP_SHIFT) & 0xff,
adev->delay,
@@ -391,6 +382,7 @@
ctlr->w.buf = malloc(ctlr->w.nbuf = 44100*Byteps*2);
ctlr->reg = (u32int*)(VIRTIO + 0x8b0000);
ctlr->adev = adev;
+ ctlr->fifosz = 1 << ((rd(PARAM)>>8) & 0xf);
adev->delay = 2048;
adev->ctlr = ctlr;