aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/mxs
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2013-03-22 09:12:13 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-03-26 10:17:41 -0400
commitb7e5e91210fc9d40f93f87e386823e4ba9b32805 (patch)
tree40b5ead3e2e813845c389cece7a9a5735d2f62a0 /sound/soc/mxs
parent312bb4f626328fdc246c8d13082ab00e26e7d048 (diff)
ASoC: mxs: Embed the mxs_dma_data struct in the mxs_pcm_dma_params struct
Currently the mxs_dma_data struct, which gets passed to the dmaengine driver, is allocated in the pcm driver's open callback. The mxs_dma_data struct has exactly one field which is initialized from the the same field in the mxs_pcm_dma_params struct. The mxs_pcm_dma_params struct gets passed to the pcm driver from the dai driver. Instead of taking this indirection embed the mxs_dma_data struct directly in the mxs_pcm_dma_params struct. This allows us to simplify the pcm driver quite a bit, since we don't have to care about memory managing the mxs_dma_data struct anymore. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Tested-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/mxs')
-rw-r--r--sound/soc/mxs/mxs-pcm.c43
-rw-r--r--sound/soc/mxs/mxs-pcm.h4
-rw-r--r--sound/soc/mxs/mxs-saif.c6
3 files changed, 11 insertions, 42 deletions
diff --git a/sound/soc/mxs/mxs-pcm.c b/sound/soc/mxs/mxs-pcm.c
index 564b5b60319d..ebbef8597554 100644
--- a/sound/soc/mxs/mxs-pcm.c
+++ b/sound/soc/mxs/mxs-pcm.c
@@ -28,7 +28,6 @@
28#include <linux/platform_device.h> 28#include <linux/platform_device.h>
29#include <linux/slab.h> 29#include <linux/slab.h>
30#include <linux/dmaengine.h> 30#include <linux/dmaengine.h>
31#include <linux/fsl/mxs-dma.h>
32 31
33#include <sound/core.h> 32#include <sound/core.h>
34#include <sound/initval.h> 33#include <sound/initval.h>
@@ -39,11 +38,6 @@
39 38
40#include "mxs-pcm.h" 39#include "mxs-pcm.h"
41 40
42struct mxs_pcm_dma_data {
43 struct mxs_dma_data dma_data;
44 struct mxs_pcm_dma_params *dma_params;
45};
46
47static struct snd_pcm_hardware snd_mxs_hardware = { 41static struct snd_pcm_hardware snd_mxs_hardware = {
48 .info = SNDRV_PCM_INFO_MMAP | 42 .info = SNDRV_PCM_INFO_MMAP |
49 SNDRV_PCM_INFO_MMAP_VALID | 43 SNDRV_PCM_INFO_MMAP_VALID |
@@ -66,8 +60,7 @@ static struct snd_pcm_hardware snd_mxs_hardware = {
66 60
67static bool filter(struct dma_chan *chan, void *param) 61static bool filter(struct dma_chan *chan, void *param)
68{ 62{
69 struct mxs_pcm_dma_data *pcm_dma_data = param; 63 struct mxs_pcm_dma_params *dma_params = param;
70 struct mxs_pcm_dma_params *dma_params = pcm_dma_data->dma_params;
71 64
72 if (!mxs_dma_is_apbx(chan)) 65 if (!mxs_dma_is_apbx(chan))
73 return false; 66 return false;
@@ -75,7 +68,7 @@ static bool filter(struct dma_chan *chan, void *param)
75 if (chan->chan_id != dma_params->chan_num) 68 if (chan->chan_id != dma_params->chan_num)
76 return false; 69 return false;
77 70
78 chan->private = &pcm_dma_data->dma_data; 71 chan->private = &dma_params->dma_data;
79 72
80 return true; 73 return true;
81} 74}
@@ -91,37 +84,11 @@ static int snd_mxs_pcm_hw_params(struct snd_pcm_substream *substream,
91static int snd_mxs_open(struct snd_pcm_substream *substream) 84static int snd_mxs_open(struct snd_pcm_substream *substream)
92{ 85{
93 struct snd_soc_pcm_runtime *rtd = substream->private_data; 86 struct snd_soc_pcm_runtime *rtd = substream->private_data;
94 struct mxs_pcm_dma_data *pcm_dma_data;
95 int ret;
96
97 pcm_dma_data = kzalloc(sizeof(*pcm_dma_data), GFP_KERNEL);
98 if (pcm_dma_data == NULL)
99 return -ENOMEM;
100
101 pcm_dma_data->dma_params = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
102 pcm_dma_data->dma_data.chan_irq = pcm_dma_data->dma_params->chan_irq;
103
104 ret = snd_dmaengine_pcm_open(substream, filter, pcm_dma_data);
105 if (ret) {
106 kfree(pcm_dma_data);
107 return ret;
108 }
109 87
110 snd_soc_set_runtime_hwparams(substream, &snd_mxs_hardware); 88 snd_soc_set_runtime_hwparams(substream, &snd_mxs_hardware);
111 89
112 snd_dmaengine_pcm_set_data(substream, pcm_dma_data); 90 return snd_dmaengine_pcm_open(substream, filter,
113 91 snd_soc_dai_get_dma_data(rtd->cpu_dai, substream));
114 return 0;
115}
116
117static int snd_mxs_close(struct snd_pcm_substream *substream)
118{
119 struct mxs_pcm_dma_data *pcm_dma_data = snd_dmaengine_pcm_get_data(substream);
120
121 snd_dmaengine_pcm_close(substream);
122 kfree(pcm_dma_data);
123
124 return 0;
125} 92}
126 93
127static int snd_mxs_pcm_mmap(struct snd_pcm_substream *substream, 94static int snd_mxs_pcm_mmap(struct snd_pcm_substream *substream,
@@ -137,7 +104,7 @@ static int snd_mxs_pcm_mmap(struct snd_pcm_substream *substream,
137 104
138static struct snd_pcm_ops mxs_pcm_ops = { 105static struct snd_pcm_ops mxs_pcm_ops = {
139 .open = snd_mxs_open, 106 .open = snd_mxs_open,
140 .close = snd_mxs_close, 107 .close = snd_dmaengine_pcm_close,
141 .ioctl = snd_pcm_lib_ioctl, 108 .ioctl = snd_pcm_lib_ioctl,
142 .hw_params = snd_mxs_pcm_hw_params, 109 .hw_params = snd_mxs_pcm_hw_params,
143 .trigger = snd_dmaengine_pcm_trigger, 110 .trigger = snd_dmaengine_pcm_trigger,
diff --git a/sound/soc/mxs/mxs-pcm.h b/sound/soc/mxs/mxs-pcm.h
index 35ba2ca42384..3aa918f9ed3e 100644
--- a/sound/soc/mxs/mxs-pcm.h
+++ b/sound/soc/mxs/mxs-pcm.h
@@ -19,8 +19,10 @@
19#ifndef _MXS_PCM_H 19#ifndef _MXS_PCM_H
20#define _MXS_PCM_H 20#define _MXS_PCM_H
21 21
22#include <linux/fsl/mxs-dma.h>
23
22struct mxs_pcm_dma_params { 24struct mxs_pcm_dma_params {
23 int chan_irq; 25 struct mxs_dma_data dma_data;
24 int chan_num; 26 int chan_num;
25}; 27};
26 28
diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
index 3a2aa1d19b93..f13bd8730b0f 100644
--- a/sound/soc/mxs/mxs-saif.c
+++ b/sound/soc/mxs/mxs-saif.c
@@ -753,9 +753,9 @@ static int mxs_saif_probe(struct platform_device *pdev)
753 return ret; 753 return ret;
754 } 754 }
755 755
756 saif->dma_param.chan_irq = platform_get_irq(pdev, 1); 756 saif->dma_param.dma_data.chan_irq = platform_get_irq(pdev, 1);
757 if (saif->dma_param.chan_irq < 0) { 757 if (saif->dma_param.dma_data.chan_irq < 0) {
758 ret = saif->dma_param.chan_irq; 758 ret = saif->dma_param.dma_data.chan_irq;
759 dev_err(&pdev->dev, "failed to get dma irq resource: %d\n", 759 dev_err(&pdev->dev, "failed to get dma irq resource: %d\n",
760 ret); 760 ret);
761 return ret; 761 return ret;