Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: fsi: Configure DMA slave settings

Current FSI driver is assuming that dst_addr/src_addr of DMAEngine
will be set by platform data. But it should be set via
dmaengine_slave_config(). Special thanks to Arnd

Reported-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>

authored by

Kuninori Morimoto and committed by
Vinod Koul
7c6cc8f2 5b7cdc80

+12 -3
+12 -3
sound/soc/sh/fsi.c
··· 250 250 251 251 struct fsi_priv { 252 252 void __iomem *base; 253 + phys_addr_t phys; 253 254 struct fsi_master *master; 254 255 255 256 struct fsi_stream playback; ··· 1375 1374 struct dma_slave_config cfg = {}; 1376 1375 int ret; 1377 1376 1378 - cfg.dst_addr = 0; /* use default addr */ 1379 - cfg.src_addr = 0; /* use default addr */ 1380 - cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; 1377 + if (is_play) { 1378 + cfg.dst_addr = fsi->phys + REG_DODT; 1379 + cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 1380 + cfg.direction = DMA_MEM_TO_DEV; 1381 + } else { 1382 + cfg.src_addr = fsi->phys + REG_DIDT; 1383 + cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 1384 + cfg.direction = DMA_DEV_TO_MEM; 1385 + } 1381 1386 1382 1387 ret = dmaengine_slave_config(io->chan, &cfg); 1383 1388 if (ret < 0) { ··· 1947 1940 /* FSI A setting */ 1948 1941 fsi = &master->fsia; 1949 1942 fsi->base = master->base; 1943 + fsi->phys = res->start; 1950 1944 fsi->master = master; 1951 1945 fsi_port_info_init(fsi, &info.port_a); 1952 1946 fsi_handler_init(fsi, &info.port_a); ··· 1960 1952 /* FSI B setting */ 1961 1953 fsi = &master->fsib; 1962 1954 fsi->base = master->base + 0x40; 1955 + fsi->phys = res->start + 0x40; 1963 1956 fsi->master = master; 1964 1957 fsi_port_info_init(fsi, &info.port_b); 1965 1958 fsi_handler_init(fsi, &info.port_b);