diff options
Diffstat (limited to 'sound/soc/omap/omap-mcpdm.c')
-rw-r--r-- | sound/soc/omap/omap-mcpdm.c | 71 |
1 files changed, 46 insertions, 25 deletions
diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c index b7f4f7e015f3..f161c2f5ed36 100644 --- a/sound/soc/omap/omap-mcpdm.c +++ b/sound/soc/omap/omap-mcpdm.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include <plat/dma.h> | 36 | #include <plat/dma.h> |
37 | #include <plat/mcbsp.h> | 37 | #include <plat/mcbsp.h> |
38 | #include "mcpdm.h" | 38 | #include "mcpdm.h" |
39 | #include "omap-mcpdm.h" | ||
40 | #include "omap-pcm.h" | 39 | #include "omap-pcm.h" |
41 | 40 | ||
42 | struct omap_mcpdm_data { | 41 | struct omap_mcpdm_data { |
@@ -89,11 +88,9 @@ static struct omap_pcm_dma_data omap_mcpdm_dai_dma_params[] = { | |||
89 | static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream, | 88 | static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream, |
90 | struct snd_soc_dai *dai) | 89 | struct snd_soc_dai *dai) |
91 | { | 90 | { |
92 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
93 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | ||
94 | int err = 0; | 91 | int err = 0; |
95 | 92 | ||
96 | if (!cpu_dai->active) | 93 | if (!dai->active) |
97 | err = omap_mcpdm_request(); | 94 | err = omap_mcpdm_request(); |
98 | 95 | ||
99 | return err; | 96 | return err; |
@@ -102,19 +99,14 @@ static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream, | |||
102 | static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, | 99 | static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, |
103 | struct snd_soc_dai *dai) | 100 | struct snd_soc_dai *dai) |
104 | { | 101 | { |
105 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 102 | if (!dai->active) |
106 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | ||
107 | |||
108 | if (!cpu_dai->active) | ||
109 | omap_mcpdm_free(); | 103 | omap_mcpdm_free(); |
110 | } | 104 | } |
111 | 105 | ||
112 | static int omap_mcpdm_dai_trigger(struct snd_pcm_substream *substream, int cmd, | 106 | static int omap_mcpdm_dai_trigger(struct snd_pcm_substream *substream, int cmd, |
113 | struct snd_soc_dai *dai) | 107 | struct snd_soc_dai *dai) |
114 | { | 108 | { |
115 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 109 | struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai); |
116 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | ||
117 | struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data; | ||
118 | int stream = substream->stream; | 110 | int stream = substream->stream; |
119 | int err = 0; | 111 | int err = 0; |
120 | 112 | ||
@@ -143,14 +135,12 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, | |||
143 | struct snd_pcm_hw_params *params, | 135 | struct snd_pcm_hw_params *params, |
144 | struct snd_soc_dai *dai) | 136 | struct snd_soc_dai *dai) |
145 | { | 137 | { |
146 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 138 | struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai); |
147 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | ||
148 | struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data; | ||
149 | struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links; | 139 | struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links; |
150 | int stream = substream->stream; | 140 | int stream = substream->stream; |
151 | int channels, err, link_mask = 0; | 141 | int channels, err, link_mask = 0; |
152 | 142 | ||
153 | snd_soc_dai_set_dma_data(cpu_dai, substream, | 143 | snd_soc_dai_set_dma_data(dai, substream, |
154 | &omap_mcpdm_dai_dma_params[stream]); | 144 | &omap_mcpdm_dai_dma_params[stream]); |
155 | 145 | ||
156 | channels = params_channels(params); | 146 | channels = params_channels(params); |
@@ -189,9 +179,7 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, | |||
189 | static int omap_mcpdm_dai_hw_free(struct snd_pcm_substream *substream, | 179 | static int omap_mcpdm_dai_hw_free(struct snd_pcm_substream *substream, |
190 | struct snd_soc_dai *dai) | 180 | struct snd_soc_dai *dai) |
191 | { | 181 | { |
192 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 182 | struct omap_mcpdm_data *mcpdm_priv = snd_soc_dai_get_drvdata(dai); |
193 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | ||
194 | struct omap_mcpdm_data *mcpdm_priv = cpu_dai->private_data; | ||
195 | struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links; | 183 | struct omap_mcpdm_link *mcpdm_links = mcpdm_priv->links; |
196 | int stream = substream->stream; | 184 | int stream = substream->stream; |
197 | int err; | 185 | int err; |
@@ -215,9 +203,14 @@ static struct snd_soc_dai_ops omap_mcpdm_dai_ops = { | |||
215 | #define OMAP_MCPDM_RATES (SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) | 203 | #define OMAP_MCPDM_RATES (SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) |
216 | #define OMAP_MCPDM_FORMATS (SNDRV_PCM_FMTBIT_S32_LE) | 204 | #define OMAP_MCPDM_FORMATS (SNDRV_PCM_FMTBIT_S32_LE) |
217 | 205 | ||
218 | struct snd_soc_dai omap_mcpdm_dai = { | 206 | static int omap_mcpdm_dai_probe(struct snd_soc_dai *dai) |
219 | .name = "omap-mcpdm", | 207 | { |
220 | .id = -1, | 208 | snd_soc_dai_set_drvdata(dai, &mcpdm_data); |
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static struct snd_soc_dai_driver omap_mcpdm_dai = { | ||
213 | .probe = omap_mcpdm_dai_probe, | ||
221 | .playback = { | 214 | .playback = { |
222 | .channels_min = 1, | 215 | .channels_min = 1, |
223 | .channels_max = 4, | 216 | .channels_max = 4, |
@@ -231,19 +224,47 @@ struct snd_soc_dai omap_mcpdm_dai = { | |||
231 | .formats = OMAP_MCPDM_FORMATS, | 224 | .formats = OMAP_MCPDM_FORMATS, |
232 | }, | 225 | }, |
233 | .ops = &omap_mcpdm_dai_ops, | 226 | .ops = &omap_mcpdm_dai_ops, |
234 | .private_data = &mcpdm_data, | ||
235 | }; | 227 | }; |
236 | EXPORT_SYMBOL_GPL(omap_mcpdm_dai); | 228 | |
229 | static __devinit int asoc_mcpdm_probe(struct platform_device *pdev) | ||
230 | { | ||
231 | int ret; | ||
232 | |||
233 | ret = omap_mcpdm_probe(pdev); | ||
234 | if (ret < 0) | ||
235 | return ret; | ||
236 | ret = snd_soc_register_dai(&pdev->dev, &omap_mcpdm_dai); | ||
237 | if (ret < 0) | ||
238 | omap_mcpdm_remove(pdev); | ||
239 | return ret; | ||
240 | } | ||
241 | |||
242 | static int __devexit asoc_mcpdm_remove(struct platform_device *pdev) | ||
243 | { | ||
244 | snd_soc_unregister_dai(&pdev->dev); | ||
245 | omap_mcpdm_remove(pdev); | ||
246 | return 0; | ||
247 | } | ||
248 | |||
249 | static struct platform_driver asoc_mcpdm_driver = { | ||
250 | .driver = { | ||
251 | .name = "omap-mcpdm-dai", | ||
252 | .owner = THIS_MODULE, | ||
253 | }, | ||
254 | |||
255 | .probe = asoc_mcpdm_probe, | ||
256 | .remove = __devexit_p(asoc_mcpdm_remove), | ||
257 | }; | ||
237 | 258 | ||
238 | static int __init snd_omap_mcpdm_init(void) | 259 | static int __init snd_omap_mcpdm_init(void) |
239 | { | 260 | { |
240 | return snd_soc_register_dai(&omap_mcpdm_dai); | 261 | return platform_driver_register(&asoc_mcpdm_driver); |
241 | } | 262 | } |
242 | module_init(snd_omap_mcpdm_init); | 263 | module_init(snd_omap_mcpdm_init); |
243 | 264 | ||
244 | static void __exit snd_omap_mcpdm_exit(void) | 265 | static void __exit snd_omap_mcpdm_exit(void) |
245 | { | 266 | { |
246 | snd_soc_unregister_dai(&omap_mcpdm_dai); | 267 | platform_driver_unregister(&asoc_mcpdm_driver); |
247 | } | 268 | } |
248 | module_exit(snd_omap_mcpdm_exit); | 269 | module_exit(snd_omap_mcpdm_exit); |
249 | 270 | ||