|
@@ -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
|