summaryrefslogtreecommitdiff
path: root/sys/src/9/imx8
diff options
context:
space:
mode:
authorSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2022-08-19 00:46:34 +0000
committerSigrid Solveig Haflínudóttir <sigrid@ftrv.se>2022-08-19 00:46:34 +0000
commitbdc9a81b2fba73ecfeb1a35954aef9f0cef69897 (patch)
treedee9de17513162db264f1b92bbd9482d7869b947 /sys/src/9/imx8
parente0e2e9d81b4dbdabb7521dcc68e9f980f26cc3a9 (diff)
imx8/sai: flush the ring on close to avoid garbage leftovers on restarts
Diffstat (limited to 'sys/src/9/imx8')
-rw-r--r--sys/src/9/imx8/sai.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/sys/src/9/imx8/sai.c b/sys/src/9/imx8/sai.c
index 96412c357..0e5a35d15 100644
--- a/sys/src/9/imx8/sai.c
+++ b/sys/src/9/imx8/sai.c
@@ -156,6 +156,15 @@ saikick(Ctlr *ctlr)
}
static void
+setempty(Ctlr *ctlr)
+{
+ ilock(ctlr);
+ ctlr->w.ri = 0;
+ ctlr->w.wi = 0;
+ iunlock(ctlr);
+}
+
+static void
saistop(Ctlr *ctlr)
{
if(!ctlr->wactive)
@@ -164,6 +173,13 @@ saistop(Ctlr *ctlr)
wr(TCSR, TCSR_FR | TCSR_SR);
}
+static int
+inactive(void *arg)
+{
+ Ctlr *ctlr = arg;
+ return !ctlr->wactive;
+}
+
static long
saiwrite(Audio *adev, void *a, long n, vlong)
{
@@ -193,8 +209,10 @@ saiclose(Audio *adev, int mode)
{
Ctlr *ctlr = adev->ctlr;
- if(mode == OWRITE || mode == ORDWR)
- saistop(ctlr);
+ if(mode == OWRITE || mode == ORDWR){
+ sleep(&ctlr->w.r, inactive, ctlr);
+ setempty(ctlr);
+ }
}
static void