[alsa-devel] [PATCH 0/2] ASoC: fsi: bugfix for DMAEngine
Hi Mark, Liam
These are bugfix for FSI DMAEngine. Without these patches, FSI playback includes noise. These are for v3.5 kernel
Kuninori Morimoto (2): ASoC: fsi: bugfix: correct dma area ASoC: fsi: bugfix: ensure dma is terminated
Best regards --- Kuninori Morimoto
FSI driver is using dma_sync_single_xxx(), but the dma area was not correct. This patch fix it up.
Signed-off-by: Kuninori Morimoto kuninori.morimoto.gx@renesas.com --- -- this is v3.5 bugfix
sound/soc/sh/fsi.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 0da021a..02ffe79 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -1052,6 +1052,13 @@ static int fsi_dma_quit(struct fsi_priv *fsi, struct fsi_stream *io) return 0; }
+static dma_addr_t fsi_dma_get_area(struct fsi_stream *io) +{ + struct snd_pcm_runtime *runtime = io->substream->runtime; + + return io->dma + samples_to_bytes(runtime, io->buff_sample_pos); +} + static void fsi_dma_complete(void *data) { struct fsi_stream *io = (struct fsi_stream *)data; @@ -1061,7 +1068,7 @@ static void fsi_dma_complete(void *data) enum dma_data_direction dir = fsi_stream_is_play(fsi, io) ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
- dma_sync_single_for_cpu(dai->dev, io->dma, + dma_sync_single_for_cpu(dai->dev, fsi_dma_get_area(io), samples_to_bytes(runtime, io->period_samples), dir);
io->buff_sample_pos += io->period_samples; @@ -1078,13 +1085,6 @@ static void fsi_dma_complete(void *data) snd_pcm_period_elapsed(io->substream); }
-static dma_addr_t fsi_dma_get_area(struct fsi_stream *io) -{ - struct snd_pcm_runtime *runtime = io->substream->runtime; - - return io->dma + samples_to_bytes(runtime, io->buff_sample_pos); -} - static void fsi_dma_do_tasklet(unsigned long data) { struct fsi_stream *io = (struct fsi_stream *)data; @@ -1110,7 +1110,7 @@ static void fsi_dma_do_tasklet(unsigned long data) len = samples_to_bytes(runtime, io->period_samples); buf = fsi_dma_get_area(io);
- dma_sync_single_for_device(dai->dev, io->dma, len, dir); + dma_sync_single_for_device(dai->dev, buf, len, dir);
sg_init_table(&sg, 1); sg_set_page(&sg, pfn_to_page(PFN_DOWN(buf)),
FSI DMAEngine has to be stopped certainly at the start/stop time. Without this patch, it will include noise on playback.
Signed-off-by: Kuninori Morimoto kuninori.morimoto.gx@renesas.com --- this is v3.5 bugfix
sound/soc/sh/fsi.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index 02ffe79..18c920f 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -1178,6 +1178,8 @@ static void fsi_dma_push_start_stop(struct fsi_priv *fsi, struct fsi_stream *io,
fsi_reg_mask_set(fsi, OUT_DMAC, DMA_ON, enable);
+ dmaengine_terminate_all(io->chan); + if (fsi_is_clk_master(fsi)) fsi_master_mask_set(master, CLK_RST, clk, (enable) ? clk : 0); }
participants (2)
-
Kuninori Morimoto
-
Mark Brown