summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorQuinn Jensen <quinn.jensen@freescale.com>2007-04-04 17:41:46 -0600
committerQuinn Jensen <quinn.jensen@freescale.com>2007-05-24 16:21:44 -0600
commit3cf3f67ce0711596dae0db7a58fe326ab14c1081 (patch)
tree02609461bba8f4eb57f8714694b7090133321d7e /sound
parent8555e205e0839078884a677427ba551909b87e94 (diff)
Bug fix: TLSbo73840. Enables ALSA playback without audio corruption in
the presence of ATA disk activity. http://www.bitshrine.org/gpp/linux-2.6.19.2-mx-alsa_playback_ata_corruption.patch
Diffstat (limited to 'sound')
-rw-r--r--sound/arm/mxc-alsa-pmic.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/sound/arm/mxc-alsa-pmic.c b/sound/arm/mxc-alsa-pmic.c
index f4a4e9f924ca..4699e2114b54 100644
--- a/sound/arm/mxc-alsa-pmic.c
+++ b/sound/arm/mxc-alsa-pmic.c
@@ -84,6 +84,13 @@
#define SOUND_CARD_NAME "MXC"
/*!
+ * These defines enable DMA chaining for playback
+ * and capture respectively.
+ */
+#define MXC_SOUND_PLAYBACK_CHAIN_DMA_EN 1
+#define MXC_SOUND_CAPTURE_CHAIN_DMA_EN 1
+
+/*!
* ID for this card
*/
static char *id = NULL;
@@ -1681,6 +1688,11 @@ static void audio_playback_dma(audio_stream_t * s)
memset(&dma_request, 0, sizeof(mxc_dma_requestbuf_t));
if (s->active) {
+ if (ssi_get_status(s->ssi) & ssi_transmitter_underrun_0) {
+ ssi_enable(s->ssi, false);
+ ssi_transmit_enable(s->ssi, false);
+ ssi_enable(s->ssi, true);
+ }
dma_size = frames_to_bytes(runtime, runtime->period_size);
pr_debug("s->period (%x) runtime->periods (%d)\n",
s->period, runtime->periods);
@@ -1712,7 +1724,7 @@ static void audio_playback_dma(audio_stream_t * s)
mxc_dma_config(s->dma_wchannel, &dma_request, 1,
MXC_DMA_MODE_WRITE);
ret = mxc_dma_enable(s->dma_wchannel);
-
+ ssi_transmit_enable(s->ssi, true);
s->tx_spin = 1; /* FGA little trick to retrieve DMA pos */
if (ret) {
@@ -2167,7 +2179,9 @@ static int snd_mxc_audio_playback_prepare(snd_pcm_substream_t * substream)
pr_debug(KERN_ERR "MXC: PMIC Playback Config FAILED\n");
ssi_interrupt_enable(ssi, ssi_tx_fifo_0_empty);
- ssi_transmit_enable(ssi, true);
+ /*
+ ssi_transmit_enable(ssi, true);
+ */
s->period = 0;
s->periods = 0;