Re: [PATCH] ASoC: rsnd: dma: set bus width to data width for monaural data

2019-10-22 Thread Kuninori Morimoto


Hi

> 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 
> Cc: Timo Wischer 
> Signed-off-by: Jiada Wang 
> Signed-off-by: Eugeniu Rosca 
> ---

I don't know how Monaural works, but I know you are using it.
Thus don't say Acked-by and/or Reviewed-by,
but I have no objection about this patch.

Thank you for your help !!
Best regards
---
Kuninori Morimoto


[PATCH] ASoC: rsnd: dma: set bus width to data width for monaural data

2019-10-22 Thread Eugeniu Rosca
From: Jiada Wang 

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 
Cc: Timo Wischer 
Signed-off-by: Jiada Wang 
Signed-off-by: Eugeniu Rosca 
---
 sound/soc/sh/rcar/dma.c | 30 --
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
index 28f65eba2bb4..95aa26d62e4f 100644
--- a/sound/soc/sh/rcar/dma.c
+++ b/sound/soc/sh/rcar/dma.c
@@ -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),
-- 
2.23.0