mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 05:34:13 +08:00
ASoC: rsnd: dma: set bus width to data width for monaural data
According to R-Car3 HW manual 40.3.3 (Data Format on Audio Local Bus), in case of monaural data writing or reading through Audio-DMAC, it's always in Left Justified format, so both src and dst DMA Bus width should be equal to physical data width. Therefore set src and dst's DMA bus width to: - [monaural case] data width - [non-monaural case] 32bits (as prior applying the patch) Cc: Andrew Gabbasov <andrew_gabbasov@mentor.com> Cc: Timo Wischer <twischer@de.adit-jv.com> Signed-off-by: Jiada Wang <jiada_wang@mentor.com> Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com> Link: https://lore.kernel.org/r/20191022185518.12838-1-erosca@de.adit-jv.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
2b544dd7b4
commit
d4d9360bf7
@ -165,14 +165,40 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod,
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
struct dma_async_tx_descriptor *desc;
|
||||
struct dma_slave_config cfg = {};
|
||||
enum dma_slave_buswidth buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
int is_play = rsnd_io_is_play(io);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* in case of monaural data writing or reading through Audio-DMAC
|
||||
* data is always in Left Justified format, so both src and dst
|
||||
* DMA Bus width need to be set equal to physical data width.
|
||||
*/
|
||||
if (rsnd_runtime_channel_original(io) == 1) {
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
int bits = snd_pcm_format_physical_width(runtime->format);
|
||||
|
||||
switch (bits) {
|
||||
case 8:
|
||||
buswidth = DMA_SLAVE_BUSWIDTH_1_BYTE;
|
||||
break;
|
||||
case 16:
|
||||
buswidth = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
break;
|
||||
case 32:
|
||||
buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "invalid format width %d\n", bits);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
|
||||
cfg.src_addr = dma->src_addr;
|
||||
cfg.dst_addr = dma->dst_addr;
|
||||
cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
cfg.src_addr_width = buswidth;
|
||||
cfg.dst_addr_width = buswidth;
|
||||
|
||||
dev_dbg(dev, "%s %pad -> %pad\n",
|
||||
rsnd_mod_name(mod),
|
||||
|
Loading…
Reference in New Issue
Block a user