aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>2017-01-11 09:39:31 -0500
committerVinod Koul <vinod.koul@intel.com>2017-01-13 01:44:28 -0500
commit3139dc8ded6f27552a248d23fe9f086e3027fa12 (patch)
tree792ee80b684775c3790f5c662601ed1e7da05f2b
parent527a27591312e4b3a0f8179f321f9e85c0850df0 (diff)
dmaengine: rcar-dmac: unmap slave resource when channel is freed
The slave mapping should be removed together with other channel resources when the channel is freed. If it's not unmapped it will hang around forever after the channel is freed. Fixes: 9f878603dbdb7db3 ("dmaengine: rcar-dmac: add iommu support for slave transfers") Reported-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r--drivers/dma/sh/rcar-dmac.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
index 2e441d0ccd79..4c357d475465 100644
--- a/drivers/dma/sh/rcar-dmac.c
+++ b/drivers/dma/sh/rcar-dmac.c
@@ -986,6 +986,7 @@ static void rcar_dmac_free_chan_resources(struct dma_chan *chan)
986{ 986{
987 struct rcar_dmac_chan *rchan = to_rcar_dmac_chan(chan); 987 struct rcar_dmac_chan *rchan = to_rcar_dmac_chan(chan);
988 struct rcar_dmac *dmac = to_rcar_dmac(chan->device); 988 struct rcar_dmac *dmac = to_rcar_dmac(chan->device);
989 struct rcar_dmac_chan_map *map = &rchan->map;
989 struct rcar_dmac_desc_page *page, *_page; 990 struct rcar_dmac_desc_page *page, *_page;
990 struct rcar_dmac_desc *desc; 991 struct rcar_dmac_desc *desc;
991 LIST_HEAD(list); 992 LIST_HEAD(list);
@@ -1019,6 +1020,13 @@ static void rcar_dmac_free_chan_resources(struct dma_chan *chan)
1019 free_page((unsigned long)page); 1020 free_page((unsigned long)page);
1020 } 1021 }
1021 1022
1023 /* Remove slave mapping if present. */
1024 if (map->slave.xfer_size) {
1025 dma_unmap_resource(chan->device->dev, map->addr,
1026 map->slave.xfer_size, map->dir, 0);
1027 map->slave.xfer_size = 0;
1028 }
1029
1022 pm_runtime_put(chan->device->dev); 1030 pm_runtime_put(chan->device->dev);
1023} 1031}
1024 1032