return 0;
 }
 
-static void mtk_iommu_v1_set_platform_dma(struct device *dev)
+static int mtk_iommu_v1_identity_attach(struct iommu_domain *identity_domain,
+                                       struct device *dev)
 {
        struct mtk_iommu_v1_data *data = dev_iommu_priv_get(dev);
 
        mtk_iommu_v1_config(data, dev, false);
+       return 0;
+}
+
+static struct iommu_domain_ops mtk_iommu_v1_identity_ops = {
+       .attach_dev = mtk_iommu_v1_identity_attach,
+};
+
+static struct iommu_domain mtk_iommu_v1_identity_domain = {
+       .type = IOMMU_DOMAIN_IDENTITY,
+       .ops = &mtk_iommu_v1_identity_ops,
+};
+
+static void mtk_iommu_v1_set_platform_dma(struct device *dev)
+{
+       mtk_iommu_v1_identity_attach(&mtk_iommu_v1_identity_domain, dev);
 }
 
 static int mtk_iommu_v1_map(struct iommu_domain *domain, unsigned long iova,
 
 static int mtk_iommu_v1_def_domain_type(struct device *dev)
 {
-       return IOMMU_DOMAIN_UNMANAGED;
+       return IOMMU_DOMAIN_IDENTITY;
 }
 
 static struct iommu_device *mtk_iommu_v1_probe_device(struct device *dev)
 }
 
 static const struct iommu_ops mtk_iommu_v1_ops = {
+       .identity_domain = &mtk_iommu_v1_identity_domain,
        .domain_alloc   = mtk_iommu_v1_domain_alloc,
        .probe_device   = mtk_iommu_v1_probe_device,
        .probe_finalize = mtk_iommu_v1_probe_finalize,