From: Markus Pargmann <mpa@pengutronix.de>
To: Timur Tabi <timur@tabi.org>, Mark Brown <broonie@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>
Cc: alsa-devel@alsa-project.org,
linux-arm-kernel@lists.infradead.org, kernel@pengutronix.de,
Juergen Beisert <jbe@pengutronix.de>,
stable@vger.kernel.org, Markus Pargmann <mpa@pengutronix.de>
Subject: [PATCH] ASoC: fsl-ssi: fix SDMA starvation
Date: Tue, 12 Nov 2013 12:17:36 +0100 [thread overview]
Message-ID: <1384255056-25673-1-git-send-email-mpa@pengutronix.de> (raw)
From: Juergen Beisert <jbe@pengutronix.de>
In cases when capturing is already running and someone enables also
playback, the SDMA unit of the i.MX SoC does not see an edge on its TX DMA
request line. This is due to the TX FIFOs are empty, and this request line is
active all the time, when the CCSR_SSI_SIER_TDMAE bit is set.
In this case also the TX FIFO underrun interrupt will flood the system forever.
To ensure the first edge happens after enabling the TX side of the SSI unit and
to trigger the SDMA unit successfully enable the CCSR_SSI_SIER_TDMAE on
demand only. To be sure, this patch does the same for the CCSR_SSI_SIER_RDMAE
(RX side) bit.
Signed-off-by: Juergen Beisert <jbe@pengutronix.de>
Cc: stable@vger.kernel.org
Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
---
Hi,
The patch is based on Mark's "fix/fsl" branch.
Regards,
Markus Pargmann
sound/soc/fsl/fsl_ssi.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
index 6b81d0c..8c94632 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
@@ -107,10 +107,9 @@ static inline void write_ssi_mask(u32 __iomem *addr, u32 clear, u32 set)
#endif
/* SIER bitflag of interrupts to enable */
-#define SIER_FLAGS (CCSR_SSI_SIER_TFRC_EN | CCSR_SSI_SIER_TDMAE | \
- CCSR_SSI_SIER_TIE | CCSR_SSI_SIER_TUE0_EN | \
- CCSR_SSI_SIER_TUE1_EN | CCSR_SSI_SIER_RFRC_EN | \
- CCSR_SSI_SIER_RDMAE | CCSR_SSI_SIER_RIE | \
+#define SIER_FLAGS (CCSR_SSI_SIER_TFRC_EN | CCSR_SSI_SIER_TIE | \
+ CCSR_SSI_SIER_TUE0_EN | CCSR_SSI_SIER_TUE1_EN | \
+ CCSR_SSI_SIER_RFRC_EN | CCSR_SSI_SIER_RIE | \
CCSR_SSI_SIER_ROE0_EN | CCSR_SSI_SIER_ROE1_EN)
/**
@@ -548,6 +547,9 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
*
* The DMA channel is in external master start and pause mode, which
* means the SSI completely controls the flow of data.
+ *
+ * To use the i.MX's SDMA unit it is important to create an edge on the
+ * corresponding request line. Otherwise the request will be ignored!
*/
static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
@@ -580,20 +582,26 @@ static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
write_ssi_mask(&ssi->scr, 0,
CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE);
- else
+ write_ssi_mask(&ssi->sier, 0, CCSR_SSI_SIER_TDMAE);
+ } else {
write_ssi_mask(&ssi->scr, 0,
CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE);
+ write_ssi_mask(&ssi->sier, 0, CCSR_SSI_SIER_RDMAE);
+ }
break;
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
write_ssi_mask(&ssi->scr, CCSR_SSI_SCR_TE, 0);
- else
+ write_ssi_mask(&ssi->sier, CCSR_SSI_SIER_TDMAE, 0);
+ } else {
write_ssi_mask(&ssi->scr, CCSR_SSI_SCR_RE, 0);
+ write_ssi_mask(&ssi->sier, CCSR_SSI_SIER_RDMAE, 0);
+ }
if (!ssi_private->imx_ac97 && (read_ssi(&ssi->scr) &
(CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE)) == 0)
--
1.8.4.2
next reply other threads:[~2013-11-12 11:17 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-12 11:17 Markus Pargmann [this message]
2013-11-12 12:55 ` [PATCH] ASoC: fsl-ssi: fix SDMA starvation Timur Tabi
2013-11-12 13:24 ` Markus Pargmann
2013-11-12 20:17 ` [alsa-devel] " Timur Tabi
2013-11-13 8:31 ` Jürgen Beisert
2013-11-13 13:11 ` Timur Tabi
2013-11-13 12:16 ` Markus Pargmann
2013-11-13 13:10 ` Timur Tabi
2013-11-13 13:38 ` Markus Pargmann
2013-11-13 14:15 ` Timur Tabi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1384255056-25673-1-git-send-email-mpa@pengutronix.de \
--to=mpa@pengutronix.de \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=jbe@pengutronix.de \
--cc=kernel@pengutronix.de \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=stable@vger.kernel.org \
--cc=timur@tabi.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).