From 05b0c4ab7407f952951fd4dfaf6c846a3928f202 Mon Sep 17 00:00:00 2001 From: Hiroshi Doyu Date: Thu, 24 Jan 2013 15:16:57 +0200 Subject: [PATCH] --- yaml --- r: 358818 b: refs/heads/master c: 6fe367580339a3adf77273d4366652665319bdeb h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/arm/include/asm/dma-iommu.h | 1 + trunk/arch/arm/mm/dma-mapping.c | 25 +++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index e7e8b61a1331..67ee017af018 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fab112a394b9cf5e3bf888af6ff5076ba9fa0f06 +refs/heads/master: 6fe367580339a3adf77273d4366652665319bdeb diff --git a/trunk/arch/arm/include/asm/dma-iommu.h b/trunk/arch/arm/include/asm/dma-iommu.h index 666d8a8c3a2b..a8c56acc8c98 100644 --- a/trunk/arch/arm/include/asm/dma-iommu.h +++ b/trunk/arch/arm/include/asm/dma-iommu.h @@ -30,6 +30,7 @@ void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping); int arm_iommu_attach_device(struct device *dev, struct dma_iommu_mapping *mapping); +void arm_iommu_detach_device(struct device *dev); #endif /* __KERNEL__ */ #endif diff --git a/trunk/arch/arm/mm/dma-mapping.c b/trunk/arch/arm/mm/dma-mapping.c index d91c4880f559..6563e3872659 100644 --- a/trunk/arch/arm/mm/dma-mapping.c +++ b/trunk/arch/arm/mm/dma-mapping.c @@ -1848,4 +1848,29 @@ int arm_iommu_attach_device(struct device *dev, return 0; } +/** + * arm_iommu_detach_device + * @dev: valid struct device pointer + * + * Detaches the provided device from a previously attached map. + * This voids the dma operations (dma_map_ops pointer) + */ +void arm_iommu_detach_device(struct device *dev) +{ + struct dma_iommu_mapping *mapping; + + mapping = to_dma_iommu_mapping(dev); + if (!mapping) { + dev_warn(dev, "Not attached\n"); + return; + } + + iommu_detach_device(mapping->domain, dev); + kref_put(&mapping->kref, release_iommu_mapping); + mapping = NULL; + set_dma_ops(dev, NULL); + + pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev)); +} + #endif