]> Git Repo - linux.git/blobdiff - sound/soc/sh/rcar/dma.c
Merge branch 'for-5.4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux.git] / sound / soc / sh / rcar / dma.c
index 28f65eba2bb459fa354c03af97c455e3dd1270d8..95aa26d62e4fa4fd95013a9555e4c4aafe5bd96c 100644 (file)
@@ -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),
This page took 0.029789 seconds and 4 git commands to generate.