diff options
Diffstat (limited to 'packages/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch')
-rw-r--r-- | packages/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/packages/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch b/packages/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch new file mode 100644 index 0000000000..720f3b4868 --- /dev/null +++ b/packages/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch @@ -0,0 +1,104 @@ +From b0679d107622f7480a6629d3e92af714d9ea78b4 Mon Sep 17 00:00:00 2001 +From: Graeme Gregory <gg@a10082.wolfsonmicro.main> +Date: Mon, 26 Mar 2007 15:34:29 +0100 +Subject: [PATCH] Use dma_size parameter and fix buffdone oops + +Make use of the dma_size parameter in i2s.c and pcm.c + +Move the access of prtd in buffdone until after we have checked for an +abort as flush may be called when prtd is no longer valid. + +Signed-off-by: Graeme Gregory <gg@opensource.wolfsonmicro.com> +--- + sound/soc/s3c24xx/s3c24xx-i2s.c | 6 ++++-- + sound/soc/s3c24xx/s3c24xx-pcm.c | 16 +++++++++------- + 2 files changed, 13 insertions(+), 9 deletions(-) + +diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.c b/sound/soc/s3c24xx/s3c24xx-i2s.c +index df655a5..8ca314d 100644 +--- a/sound/soc/s3c24xx/s3c24xx-i2s.c ++++ b/sound/soc/s3c24xx/s3c24xx-i2s.c +@@ -61,13 +61,15 @@ static struct s3c2410_dma_client s3c24xx_dma_client_in = { + static struct s3c24xx_pcm_dma_params s3c24xx_i2s_pcm_stereo_out = { + .client = &s3c24xx_dma_client_out, + .channel = DMACH_I2S_OUT, +- .dma_addr = S3C2410_PA_IIS + S3C2410_IISFIFO ++ .dma_addr = S3C2410_PA_IIS + S3C2410_IISFIFO, ++ .dma_size = 2, + }; + + static struct s3c24xx_pcm_dma_params s3c24xx_i2s_pcm_stereo_in = { + .client = &s3c24xx_dma_client_in, + .channel = DMACH_I2S_IN, +- .dma_addr = S3C2410_PA_IIS + S3C2410_IISFIFO ++ .dma_addr = S3C2410_PA_IIS + S3C2410_IISFIFO, ++ .dma_size = 2, + }; + + struct s3c24xx_i2s_info { +diff --git a/sound/soc/s3c24xx/s3c24xx-pcm.c b/sound/soc/s3c24xx/s3c24xx-pcm.c +index 867f1b3..dc28bc6 100644 +--- a/sound/soc/s3c24xx/s3c24xx-pcm.c ++++ b/sound/soc/s3c24xx/s3c24xx-pcm.c +@@ -38,7 +38,7 @@ + + #include "s3c24xx-pcm.h" + +-#define S3C24XX_PCM_DEBUG 0 ++#define S3C24XX_PCM_DEBUG 1 + #if S3C24XX_PCM_DEBUG + #define DBG(x...) printk(KERN_DEBUG x) + #else +@@ -119,13 +119,15 @@ static void s3c24xx_audio_buffdone(struct s3c2410_dma_chan *channel, + enum s3c2410_dma_buffresult result) + { + struct snd_pcm_substream *substream = dev_id; +- struct s3c24xx_runtime_data *prtd = substream->runtime->private_data; ++ struct s3c24xx_runtime_data *prtd; + + DBG("Entered %s\n", __FUNCTION__); + + if (result == S3C2410_RES_ABORT || result == S3C2410_RES_ERR) + return; + ++ prtd = substream->runtime->private_data; ++ + if (substream) + snd_pcm_period_elapsed(substream); + +@@ -177,10 +179,12 @@ static int s3c24xx_pcm_hw_params(struct snd_pcm_substream *substream, + S3C2410_DISRCC_APB, prtd->params->dma_addr); + + s3c2410_dma_config(prtd->params->channel, +- 2, S3C2410_DCON_SYNC_PCLK | S3C2410_DCON_HANDSHAKE); ++ prtd->params->dma_size, ++ S3C2410_DCON_SYNC_PCLK | S3C2410_DCON_HANDSHAKE); + } else { + s3c2410_dma_config(prtd->params->channel, +- 2, S3C2410_DCON_HANDSHAKE | S3C2410_DCON_SYNC_PCLK); ++ prtd->params->dma_size, ++ S3C2410_DCON_HANDSHAKE | S3C2410_DCON_SYNC_PCLK); + + s3c2410_dma_devconfig(prtd->params->channel, + S3C2410_DMASRC_HW, 0x3, +@@ -214,7 +218,7 @@ static int s3c24xx_pcm_hw_free(struct snd_pcm_substream *substream) + + /* TODO - do we need to ensure DMA flushed */ + snd_pcm_set_runtime_buffer(substream, NULL); +- ++ + if (prtd->params) { + s3c2410_dma_free(prtd->params->channel, prtd->params->client); + prtd->params = NULL; +@@ -321,8 +325,6 @@ static int s3c24xx_pcm_open(struct snd_pcm_substream *substream) + struct snd_pcm_runtime *runtime = substream->runtime; + struct s3c24xx_runtime_data *prtd; + +- int ret; +- + DBG("Entered %s\n", __FUNCTION__); + + snd_soc_set_runtime_hwparams(substream, &s3c24xx_pcm_hardware); +-- +1.5.0.3 + |