aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch')
-rw-r--r--recipes/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/recipes/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch b/recipes/linux/linux-smdk2443/0037-Use-dma_size-parameter-and-fix-buffdone-oops.patch
new file mode 100644
index 0000000000..720f3b4868
--- /dev/null
+++ b/recipes/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
+