Hi Morimoto-san,
+#define soc_dai_mark_push(dai, substream, tgt) ((dai)->mark_##tgt = substream)
we may want a check that detects if the pointer is NULL before assigning it, otherwise we won't be able to detect bad configuration where a pointer is overwritten by 2 mark_push() calls on the same object?
+#define soc_dai_mark_pop(dai, substream, tgt) ((dai)->mark_##tgt = NULL) +#define soc_dai_mark_match(dai, substream, tgt) ((dai)->mark_##tgt == substream)
- /**
- snd_soc_dai_set_sysclk - configure DAI system or master clock.
- @dai: DAI
@@ -348,15 +356,26 @@ int snd_soc_dai_startup(struct snd_soc_dai *dai, dai->driver->ops->startup) ret = dai->driver->ops->startup(substream, dai);
- /* mark substream if succeeded */
- if (ret == 0)
soc_dai_mark_push(dai, substream, startup);
I am a bit concerned here about the case of a bi-directional DAI, it's my understanding that the .startup() callback could be called for each direction?
soc-dapm.c: ret = snd_soc_dai_startup(source, substream); soc-dapm.c: ret = snd_soc_dai_startup(sink, substream);
To convince myself of this, I added a dummy startup routine and I do see it called when I do playback and capture at the same time:
[ 179.057494] plb: ssp2 startup stream 0 [ 183.976963] plb: ssp2 startup stream 1
That makes me nervous about having a single pointer and unbalanced calls between startup and shutdown.
We had such issues in the past so I may be on the paranoid side here...
Thanks -Pierre