diff options
author | Quinn Jensen <quinn.jensen@freescale.com> | 2007-04-04 17:41:46 -0600 |
---|---|---|
committer | Quinn Jensen <quinn.jensen@freescale.com> | 2007-05-24 16:21:44 -0600 |
commit | 3cf3f67ce0711596dae0db7a58fe326ab14c1081 (patch) | |
tree | 02609461bba8f4eb57f8714694b7090133321d7e /sound | |
parent | 8555e205e0839078884a677427ba551909b87e94 (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.c | 18 |
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; |