}
        }
 
+       /*
+        * use the first registered sysmmu device for performing
+        * dma mapping operations on iommu page tables (cpu cache flush)
+        */
+       if (!dma_dev)
+               dma_dev = &pdev->dev;
+
        pm_runtime_enable(dev);
 
        return 0;
        .of_xlate = exynos_iommu_of_xlate,
 };
 
-static bool init_done;
-
 static int __init exynos_iommu_init(void)
 {
        int ret;
                goto err_set_iommu;
        }
 
-       init_done = true;
-
        return 0;
 err_set_iommu:
        kmem_cache_free(lv2table_kmem_cache, zero_lv2_table);
        kmem_cache_destroy(lv2table_kmem_cache);
        return ret;
 }
+core_initcall(exynos_iommu_init);
 
-static int __init exynos_iommu_of_setup(struct device_node *np)
-{
-       struct platform_device *pdev;
-
-       if (!init_done)
-               exynos_iommu_init();
-
-       pdev = of_platform_device_create(np, NULL, platform_bus_type.dev_root);
-       if (!pdev)
-               return -ENODEV;
-
-       /*
-        * use the first registered sysmmu device for performing
-        * dma mapping operations on iommu page tables (cpu cache flush)
-        */
-       if (!dma_dev)
-               dma_dev = &pdev->dev;
-
-       return 0;
-}
-
-IOMMU_OF_DECLARE(exynos_iommu_of, "samsung,exynos-sysmmu",
-                exynos_iommu_of_setup);
+IOMMU_OF_DECLARE(exynos_iommu_of, "samsung,exynos-sysmmu", NULL);