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

soc/tegra: fuse: Fix reading registers using DMA on Tegra20

FUSE driver doesn't configure DMA channel properly, because of it DMA
transfer is never issued and tegra20_fuse_read() always return 0x0.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>

authored by

Dmitry Osipenko and committed by
Thierry Reding
55a042b3 c641ec6e

+4 -1
+1
drivers/soc/tegra/fuse/fuse-tegra.c
··· 135 135 136 136 /* take over the memory region from the early initialization */ 137 137 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 138 + fuse->phys = res->start; 138 139 fuse->base = devm_ioremap_resource(&pdev->dev, res); 139 140 if (IS_ERR(fuse->base)) 140 141 return PTR_ERR(fuse->base);
+3 -1
drivers/soc/tegra/fuse/fuse-tegra20.c
··· 59 59 60 60 mutex_lock(&fuse->apbdma.lock); 61 61 62 - fuse->apbdma.config.src_addr = fuse->apbdma.phys + FUSE_BEGIN + offset; 62 + fuse->apbdma.config.src_addr = fuse->phys + FUSE_BEGIN + offset; 63 63 64 64 err = dmaengine_slave_config(fuse->apbdma.chan, &fuse->apbdma.config); 65 65 if (err) ··· 119 119 fuse->apbdma.config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 120 120 fuse->apbdma.config.src_maxburst = 1; 121 121 fuse->apbdma.config.dst_maxburst = 1; 122 + fuse->apbdma.config.direction = DMA_DEV_TO_MEM; 123 + fuse->apbdma.config.device_fc = false; 122 124 123 125 init_completion(&fuse->apbdma.wait); 124 126 mutex_init(&fuse->apbdma.lock);