diff options
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
| -rw-r--r-- | arch/arm/mm/dma-mapping.c | 29 | 
1 files changed, 14 insertions, 15 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index c742dfd2967b..bd83c531828a 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -2311,7 +2311,14 @@ int arm_iommu_attach_device(struct device *dev,  }  EXPORT_SYMBOL_GPL(arm_iommu_attach_device); -static void __arm_iommu_detach_device(struct device *dev) +/** + * 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; @@ -2324,22 +2331,10 @@ static void __arm_iommu_detach_device(struct device *dev)  	iommu_detach_device(mapping->domain, dev);  	kref_put(&mapping->kref, release_iommu_mapping);  	to_dma_iommu_mapping(dev) = NULL; +	set_dma_ops(dev, NULL);  	pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev));  } - -/** - * 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) -{ -	__arm_iommu_detach_device(dev); -	set_dma_ops(dev, NULL); -}  EXPORT_SYMBOL_GPL(arm_iommu_detach_device);  static const struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent) @@ -2379,7 +2374,7 @@ static void arm_teardown_iommu_dma_ops(struct device *dev)  	if (!mapping)  		return; -	__arm_iommu_detach_device(dev); +	arm_iommu_detach_device(dev);  	arm_iommu_release_mapping(mapping);  } @@ -2430,9 +2425,13 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,  		dev->dma_ops = xen_dma_ops;  	}  #endif +	dev->archdata.dma_ops_setup = true;  }  void arch_teardown_dma_ops(struct device *dev)  { +	if (!dev->archdata.dma_ops_setup) +		return; +  	arm_teardown_iommu_dma_ops(dev);  }  | 
