diff options
Diffstat (limited to 'sound/soc/davinci/davinci-pcm.c')
-rw-r--r-- | sound/soc/davinci/davinci-pcm.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index 93ea3bf567e1..afab81f844ae 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | #include <linux/dma-mapping.h> | 17 | #include <linux/dma-mapping.h> |
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/genalloc.h> | ||
19 | 20 | ||
20 | #include <sound/core.h> | 21 | #include <sound/core.h> |
21 | #include <sound/pcm.h> | 22 | #include <sound/pcm.h> |
@@ -23,7 +24,6 @@ | |||
23 | #include <sound/soc.h> | 24 | #include <sound/soc.h> |
24 | 25 | ||
25 | #include <asm/dma.h> | 26 | #include <asm/dma.h> |
26 | #include <mach/sram.h> | ||
27 | 27 | ||
28 | #include "davinci-pcm.h" | 28 | #include "davinci-pcm.h" |
29 | 29 | ||
@@ -67,13 +67,9 @@ static struct snd_pcm_hardware pcm_hardware_playback = { | |||
67 | SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME| | 67 | SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME| |
68 | SNDRV_PCM_INFO_BATCH), | 68 | SNDRV_PCM_INFO_BATCH), |
69 | .formats = DAVINCI_PCM_FMTBITS, | 69 | .formats = DAVINCI_PCM_FMTBITS, |
70 | .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | | 70 | .rates = SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_KNOT, |
71 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | | ||
72 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | | ||
73 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | | ||
74 | SNDRV_PCM_RATE_KNOT), | ||
75 | .rate_min = 8000, | 71 | .rate_min = 8000, |
76 | .rate_max = 96000, | 72 | .rate_max = 192000, |
77 | .channels_min = 2, | 73 | .channels_min = 2, |
78 | .channels_max = 384, | 74 | .channels_max = 384, |
79 | .buffer_bytes_max = 128 * 1024, | 75 | .buffer_bytes_max = 128 * 1024, |
@@ -90,13 +86,9 @@ static struct snd_pcm_hardware pcm_hardware_capture = { | |||
90 | SNDRV_PCM_INFO_PAUSE | | 86 | SNDRV_PCM_INFO_PAUSE | |
91 | SNDRV_PCM_INFO_BATCH), | 87 | SNDRV_PCM_INFO_BATCH), |
92 | .formats = DAVINCI_PCM_FMTBITS, | 88 | .formats = DAVINCI_PCM_FMTBITS, |
93 | .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | | 89 | .rates = SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_KNOT, |
94 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | | ||
95 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | | ||
96 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | | ||
97 | SNDRV_PCM_RATE_KNOT), | ||
98 | .rate_min = 8000, | 90 | .rate_min = 8000, |
99 | .rate_max = 96000, | 91 | .rate_max = 192000, |
100 | .channels_min = 2, | 92 | .channels_min = 2, |
101 | .channels_max = 384, | 93 | .channels_max = 384, |
102 | .buffer_bytes_max = 128 * 1024, | 94 | .buffer_bytes_max = 128 * 1024, |
@@ -259,7 +251,9 @@ static void davinci_pcm_dma_irq(unsigned link, u16 ch_status, void *data) | |||
259 | } | 251 | } |
260 | } | 252 | } |
261 | 253 | ||
262 | static int allocate_sram(struct snd_pcm_substream *substream, unsigned size, | 254 | #ifdef CONFIG_GENERIC_ALLOCATOR |
255 | static int allocate_sram(struct snd_pcm_substream *substream, | ||
256 | struct gen_pool *sram_pool, unsigned size, | ||
263 | struct snd_pcm_hardware *ppcm) | 257 | struct snd_pcm_hardware *ppcm) |
264 | { | 258 | { |
265 | struct snd_dma_buffer *buf = &substream->dma_buffer; | 259 | struct snd_dma_buffer *buf = &substream->dma_buffer; |
@@ -271,9 +265,10 @@ static int allocate_sram(struct snd_pcm_substream *substream, unsigned size, | |||
271 | return 0; | 265 | return 0; |
272 | 266 | ||
273 | ppcm->period_bytes_max = size; | 267 | ppcm->period_bytes_max = size; |
274 | iram_virt = sram_alloc(size, &iram_phys); | 268 | iram_virt = (void *)gen_pool_alloc(sram_pool, size); |
275 | if (!iram_virt) | 269 | if (!iram_virt) |
276 | goto exit1; | 270 | goto exit1; |
271 | iram_phys = gen_pool_virt_to_phys(sram_pool, (unsigned)iram_virt); | ||
277 | iram_dma = kzalloc(sizeof(*iram_dma), GFP_KERNEL); | 272 | iram_dma = kzalloc(sizeof(*iram_dma), GFP_KERNEL); |
278 | if (!iram_dma) | 273 | if (!iram_dma) |
279 | goto exit2; | 274 | goto exit2; |
@@ -285,11 +280,33 @@ static int allocate_sram(struct snd_pcm_substream *substream, unsigned size, | |||
285 | return 0; | 280 | return 0; |
286 | exit2: | 281 | exit2: |
287 | if (iram_virt) | 282 | if (iram_virt) |
288 | sram_free(iram_virt, size); | 283 | gen_pool_free(sram_pool, (unsigned)iram_virt, size); |
289 | exit1: | 284 | exit1: |
290 | return -ENOMEM; | 285 | return -ENOMEM; |
291 | } | 286 | } |
292 | 287 | ||
288 | static void davinci_free_sram(struct snd_pcm_substream *substream, | ||
289 | struct snd_dma_buffer *iram_dma) | ||
290 | { | ||
291 | struct davinci_runtime_data *prtd = substream->runtime->private_data; | ||
292 | struct gen_pool *sram_pool = prtd->params->sram_pool; | ||
293 | |||
294 | gen_pool_free(sram_pool, (unsigned) iram_dma->area, iram_dma->bytes); | ||
295 | } | ||
296 | #else | ||
297 | static int allocate_sram(struct snd_pcm_substream *substream, | ||
298 | struct gen_pool *sram_pool, unsigned size, | ||
299 | struct snd_pcm_hardware *ppcm) | ||
300 | { | ||
301 | return 0; | ||
302 | } | ||
303 | |||
304 | static void davinci_free_sram(struct snd_pcm_substream *substream, | ||
305 | struct snd_dma_buffer *iram_dma) | ||
306 | { | ||
307 | } | ||
308 | #endif | ||
309 | |||
293 | /* | 310 | /* |
294 | * Only used with ping/pong. | 311 | * Only used with ping/pong. |
295 | * This is called after runtime->dma_addr, period_bytes and data_type are valid | 312 | * This is called after runtime->dma_addr, period_bytes and data_type are valid |
@@ -676,7 +693,7 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream) | |||
676 | 693 | ||
677 | ppcm = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? | 694 | ppcm = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? |
678 | &pcm_hardware_playback : &pcm_hardware_capture; | 695 | &pcm_hardware_playback : &pcm_hardware_capture; |
679 | allocate_sram(substream, params->sram_size, ppcm); | 696 | allocate_sram(substream, params->sram_pool, params->sram_size, ppcm); |
680 | snd_soc_set_runtime_hwparams(substream, ppcm); | 697 | snd_soc_set_runtime_hwparams(substream, ppcm); |
681 | /* ensure that buffer size is a multiple of period size */ | 698 | /* ensure that buffer size is a multiple of period size */ |
682 | ret = snd_pcm_hw_constraint_integer(runtime, | 699 | ret = snd_pcm_hw_constraint_integer(runtime, |
@@ -819,7 +836,7 @@ static void davinci_pcm_free(struct snd_pcm *pcm) | |||
819 | buf->area = NULL; | 836 | buf->area = NULL; |
820 | iram_dma = buf->private_data; | 837 | iram_dma = buf->private_data; |
821 | if (iram_dma) { | 838 | if (iram_dma) { |
822 | sram_free(iram_dma->area, iram_dma->bytes); | 839 | davinci_free_sram(substream, iram_dma); |
823 | kfree(iram_dma); | 840 | kfree(iram_dma); |
824 | } | 841 | } |
825 | } | 842 | } |