| From e4f78b53d46ae1b7d680a535c57face76d34b370 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Sun, 22 Jun 2014 17:55:18 -0700 |
| Subject: ASoC: fsi: use SNDRV_DMA_TYPE_DEV for sound buffer |
| |
| Current fsi driver is using SNDRV_DMA_TYPE_CONTINUOUS |
| for snd_pcm_lib_preallocate_pages_for_all(). |
| But, it came from original dma-sh7760.c, |
| and no longer needed. |
| This patch exchange its parameter, and removed |
| original dma mapping and un-needed |
| dma_sync_single_xxx() from driver. |
| |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Signed-off-by: Mark Brown <broonie@linaro.org> |
| (cherry picked from commit ffb83e8cb14cace1b08ceb56695b580c808d8a41) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| arch/arm/mach-shmobile/board-armadillo800eva.c | 4 +++ |
| arch/arm/mach-shmobile/board-kzm9g.c | 2 ++ |
| arch/arm/mach-shmobile/board-mackerel.c | 4 +++ |
| arch/sh/boards/mach-ecovec24/setup.c | 2 ++ |
| sound/soc/sh/fsi.c | 42 +++----------------------- |
| 5 files changed, 17 insertions(+), 37 deletions(-) |
| |
| diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c |
| index 4612a18c797f..922887b2492f 100644 |
| --- a/arch/arm/mach-shmobile/board-armadillo800eva.c |
| +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c |
| @@ -1034,6 +1034,8 @@ static struct platform_device fsi_wm8978_device = { |
| .id = 0, |
| .dev = { |
| .platform_data = &fsi_wm8978_info, |
| + .coherent_dma_mask = DMA_BIT_MASK(32), |
| + .dma_mask = &fsi_wm8978_device.dev.coherent_dma_mask, |
| }, |
| }; |
| |
| @@ -1057,6 +1059,8 @@ static struct platform_device fsi_hdmi_device = { |
| .id = 1, |
| .dev = { |
| .platform_data = &fsi2_hdmi_info, |
| + .coherent_dma_mask = DMA_BIT_MASK(32), |
| + .dma_mask = &fsi_hdmi_device.dev.coherent_dma_mask, |
| }, |
| }; |
| |
| diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c |
| index dc529f9f58d7..c4336cc1d8ed 100644 |
| --- a/arch/arm/mach-shmobile/board-kzm9g.c |
| +++ b/arch/arm/mach-shmobile/board-kzm9g.c |
| @@ -605,6 +605,8 @@ static struct platform_device fsi_ak4648_device = { |
| .name = "asoc-simple-card", |
| .dev = { |
| .platform_data = &fsi2_ak4648_info, |
| + .coherent_dma_mask = DMA_BIT_MASK(32), |
| + .dma_mask = &fsi_ak4648_device.dev.coherent_dma_mask, |
| }, |
| }; |
| |
| diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c |
| index 304b76f3bf4a..79f448e93abb 100644 |
| --- a/arch/arm/mach-shmobile/board-mackerel.c |
| +++ b/arch/arm/mach-shmobile/board-mackerel.c |
| @@ -523,6 +523,8 @@ static struct platform_device fsi_hdmi_device = { |
| .id = 1, |
| .dev = { |
| .platform_data = &fsi2_hdmi_info, |
| + .coherent_dma_mask = DMA_BIT_MASK(32), |
| + .dma_mask = &fsi_hdmi_device.dev.coherent_dma_mask, |
| }, |
| }; |
| |
| @@ -919,6 +921,8 @@ static struct platform_device fsi_ak4643_device = { |
| .name = "asoc-simple-card", |
| .dev = { |
| .platform_data = &fsi2_ak4643_info, |
| + .coherent_dma_mask = DMA_BIT_MASK(32), |
| + .dma_mask = &fsi_ak4643_device.dev.coherent_dma_mask, |
| }, |
| }; |
| |
| diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c |
| index 85d5255d259f..0d3049244cd3 100644 |
| --- a/arch/sh/boards/mach-ecovec24/setup.c |
| +++ b/arch/sh/boards/mach-ecovec24/setup.c |
| @@ -874,6 +874,8 @@ static struct platform_device fsi_da7210_device = { |
| .name = "asoc-simple-card", |
| .dev = { |
| .platform_data = &fsi_da7210_info, |
| + .coherent_dma_mask = DMA_BIT_MASK(32), |
| + .dma_mask = &fsi_da7210_device.dev.coherent_dma_mask, |
| }, |
| }; |
| |
| diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c |
| index 710a079a7377..7a6b632c3db8 100644 |
| --- a/sound/soc/sh/fsi.c |
| +++ b/sound/soc/sh/fsi.c |
| @@ -233,7 +233,6 @@ struct fsi_stream { |
| */ |
| struct dma_chan *chan; |
| struct work_struct work; |
| - dma_addr_t dma; |
| int dma_id; |
| int loop_cnt; |
| int additional_pos; |
| @@ -1279,11 +1278,6 @@ static irqreturn_t fsi_interrupt(int irq, void *data) |
| */ |
| static int fsi_dma_init(struct fsi_priv *fsi, struct fsi_stream *io) |
| { |
| - struct snd_pcm_runtime *runtime = io->substream->runtime; |
| - struct snd_soc_dai *dai = fsi_get_dai(io->substream); |
| - enum dma_data_direction dir = fsi_stream_is_play(fsi, io) ? |
| - DMA_TO_DEVICE : DMA_FROM_DEVICE; |
| - |
| /* |
| * 24bit data : 24bit bus / package in back |
| * 16bit data : 16bit bus / stream mode |
| @@ -1293,19 +1287,7 @@ static int fsi_dma_init(struct fsi_priv *fsi, struct fsi_stream *io) |
| |
| io->loop_cnt = 2; /* push 1st, 2nd period first, then 3rd, 4th... */ |
| io->additional_pos = 0; |
| - io->dma = dma_map_single(dai->dev, runtime->dma_area, |
| - snd_pcm_lib_buffer_bytes(io->substream), dir); |
| - return 0; |
| -} |
| - |
| -static int fsi_dma_quit(struct fsi_priv *fsi, struct fsi_stream *io) |
| -{ |
| - struct snd_soc_dai *dai = fsi_get_dai(io->substream); |
| - enum dma_data_direction dir = fsi_stream_is_play(fsi, io) ? |
| - DMA_TO_DEVICE : DMA_FROM_DEVICE; |
| |
| - dma_unmap_single(dai->dev, io->dma, |
| - snd_pcm_lib_buffer_bytes(io->substream), dir); |
| return 0; |
| } |
| |
| @@ -1317,7 +1299,8 @@ static dma_addr_t fsi_dma_get_area(struct fsi_stream *io, int additional) |
| if (period >= runtime->periods) |
| period = 0; |
| |
| - return io->dma + samples_to_bytes(runtime, period * io->period_samples); |
| + return runtime->dma_addr + |
| + samples_to_bytes(runtime, period * io->period_samples); |
| } |
| |
| static void fsi_dma_complete(void *data) |
| @@ -1325,12 +1308,6 @@ static void fsi_dma_complete(void *data) |
| struct fsi_stream *io = (struct fsi_stream *)data; |
| struct fsi_priv *fsi = fsi_stream_to_priv(io); |
| struct snd_pcm_runtime *runtime = io->substream->runtime; |
| - struct snd_soc_dai *dai = fsi_get_dai(io->substream); |
| - enum dma_data_direction dir = fsi_stream_is_play(fsi, io) ? |
| - DMA_TO_DEVICE : DMA_FROM_DEVICE; |
| - |
| - dma_sync_single_for_cpu(dai->dev, fsi_dma_get_area(io, 0), |
| - samples_to_bytes(runtime, io->period_samples), dir); |
| |
| io->buff_sample_pos += io->period_samples; |
| io->period_pos++; |
| @@ -1369,8 +1346,6 @@ static void fsi_dma_do_work(struct work_struct *work) |
| for (i = 0; i < io->loop_cnt; i++) { |
| buf = fsi_dma_get_area(io, io->additional_pos); |
| |
| - dma_sync_single_for_device(dai->dev, buf, len, dir); |
| - |
| desc = dmaengine_prep_slave_single(io->chan, buf, len, dir, |
| DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
| if (!desc) { |
| @@ -1495,7 +1470,6 @@ static int fsi_dma_remove(struct fsi_priv *fsi, struct fsi_stream *io) |
| |
| static struct fsi_stream_handler fsi_dma_push_handler = { |
| .init = fsi_dma_init, |
| - .quit = fsi_dma_quit, |
| .probe = fsi_dma_probe, |
| .transfer = fsi_dma_transfer, |
| .remove = fsi_dma_remove, |
| @@ -1850,16 +1824,10 @@ static void fsi_pcm_free(struct snd_pcm *pcm) |
| |
| static int fsi_pcm_new(struct snd_soc_pcm_runtime *rtd) |
| { |
| - struct snd_pcm *pcm = rtd->pcm; |
| - |
| - /* |
| - * dont use SNDRV_DMA_TYPE_DEV, since it will oops the SH kernel |
| - * in MMAP mode (i.e. aplay -M) |
| - */ |
| return snd_pcm_lib_preallocate_pages_for_all( |
| - pcm, |
| - SNDRV_DMA_TYPE_CONTINUOUS, |
| - snd_dma_continuous_data(GFP_KERNEL), |
| + rtd->pcm, |
| + SNDRV_DMA_TYPE_DEV, |
| + rtd->card->snd_card->dev, |
| PREALLOC_BUFFER, PREALLOC_BUFFER_MAX); |
| } |
| |
| -- |
| 2.1.2 |
| |