aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>2017-01-11 09:39:31 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-26 02:24:45 -0500
commit172270c743487ec24cc145949a77bd57136ffff9 (patch)
tree1ade5ede9454f6ef6843e8fb12c347fde971eb9c
parent3bef7578e05f8188743641da8bc7ddfdbb64d268 (diff)
dmaengine: rcar-dmac: unmap slave resource when channel is freed
commit 3139dc8ded6f27552a248d23fe9f086e3027fa12 upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-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