Merge branches 'arm/exynos', 'arm/renesas', 'arm/rockchip', 'arm/omap', 'arm/mediatek...
[linux] / drivers / iommu / fsl_pamu_domain.c
index 01c7347..f089136 100644 (file)
@@ -33,6 +33,8 @@ static struct kmem_cache *fsl_pamu_domain_cache;
 static struct kmem_cache *iommu_devinfo_cache;
 static DEFINE_SPINLOCK(device_domain_lock);
 
+struct iommu_device pamu_iommu;        /* IOMMU core code handle */
+
 static struct fsl_dma_domain *to_fsl_dma_domain(struct iommu_domain *dom)
 {
        return container_of(dom, struct fsl_dma_domain, iommu_domain);
@@ -981,11 +983,14 @@ static int fsl_pamu_add_device(struct device *dev)
 
        iommu_group_put(group);
 
+       iommu_device_link(&pamu_iommu, dev);
+
        return 0;
 }
 
 static void fsl_pamu_remove_device(struct device *dev)
 {
+       iommu_device_unlink(&pamu_iommu, dev);
        iommu_group_remove_device(dev);
 }
 
@@ -1071,6 +1076,19 @@ int __init pamu_domain_init(void)
        if (ret)
                return ret;
 
+       ret = iommu_device_sysfs_add(&pamu_iommu, NULL, NULL, "iommu0");
+       if (ret)
+               return ret;
+
+       iommu_device_set_ops(&pamu_iommu, &fsl_pamu_ops);
+
+       ret = iommu_device_register(&pamu_iommu);
+       if (ret) {
+               iommu_device_sysfs_remove(&pamu_iommu);
+               pr_err("Can't register iommu device\n");
+               return ret;
+       }
+
        bus_set_iommu(&platform_bus_type, &fsl_pamu_ops);
        bus_set_iommu(&pci_bus_type, &fsl_pamu_ops);