add iommu switch in dts for iep
authorljf <ljf@rock-chips.com>
Thu, 7 Aug 2014 08:38:31 +0000 (16:38 +0800)
committerljf <ljf@rock-chips.com>
Thu, 7 Aug 2014 08:38:31 +0000 (16:38 +0800)
drivers/video/rockchip/iep/hw_iep_reg.c
drivers/video/rockchip/iep/iep_drv.c

index 0552a3984fe7bddce6fec116841a5acae12303e7..810206eebf1d207b9d41c6abd6fae930eebd4cd1 100755 (executable)
@@ -1195,7 +1195,7 @@ void iep_config(iep_session *session, IEP_MSG *iep_msg)
     \r
 #if defined(CONFIG_IEP_IOMMU)\r
     INIT_LIST_HEAD(&reg->mem_region_list);    \r
-#endif    \r
+#endif\r
 \r
     //write config\r
     iep_config_src_size(iep_msg);\r
@@ -1249,10 +1249,12 @@ void iep_config(iep_session *session, IEP_MSG *iep_msg)
 #endif\r
 \r
 #if defined(CONFIG_IEP_IOMMU)\r
-    if (0 > iep_reg_address_translate(&iep_service, reg)) {\r
-        IEP_ERR("error: translate reg address failed\n");\r
-        kfree(reg);\r
-        return;\r
+    if (iep_service.iommu_dev) {\r
+        if (0 > iep_reg_address_translate(&iep_service, reg)) {\r
+            IEP_ERR("error: translate reg address failed\n");\r
+            kfree(reg);\r
+            return;\r
+        }\r
     }\r
 #endif\r
 \r
index d5c8d96b102547d4d88707d80734a5fc9daf13d4..f1d0114a201d13a8066a1b8cd1f4d50e498045e2 100755 (executable)
@@ -79,11 +79,13 @@ static void iep_reg_deinit(struct iep_reg *reg)
 #if defined(CONFIG_IEP_IOMMU)\r
     struct iep_mem_region *mem_region = NULL, *n;\r
     // release memory region attach to this registers table.\r
-    list_for_each_entry_safe(mem_region, n, &reg->mem_region_list, reg_lnk) {\r
-        ion_unmap_iommu(iep_service.iommu_dev, iep_service.ion_client, mem_region->hdl);\r
-        ion_free(iep_service.ion_client, mem_region->hdl);\r
-        list_del_init(&mem_region->reg_lnk);\r
-        kfree(mem_region);\r
+    if (iep_service.iommu_dev) {\r
+        list_for_each_entry_safe(mem_region, n, &reg->mem_region_list, reg_lnk) {\r
+            ion_unmap_iommu(iep_service.iommu_dev, iep_service.ion_client, mem_region->hdl);\r
+            ion_free(iep_service.ion_client, mem_region->hdl);\r
+            list_del_init(&mem_region->reg_lnk);\r
+            kfree(mem_region);\r
+        }\r
     }\r
 #endif \r
     list_del_init(&reg->session_link);\r
@@ -797,7 +799,10 @@ static int iep_drv_probe(struct platform_device *pdev)
     int ret = 0;\r
     struct resource *res = NULL;\r
 #if defined(CONFIG_IEP_IOMMU)\r
+    u32 iommu_en = 0;\r
     struct device *mmu_dev = NULL;\r
+    struct device_node *np = pdev->dev.of_node;\r
+    of_property_read_u32(np, "iommu_enabled", &iommu_en);\r
 #endif\r
 \r
     data = (struct iep_drvdata*)devm_kzalloc(&pdev->dev, sizeof(struct iep_drvdata), GFP_KERNEL);\r
@@ -884,24 +889,26 @@ static int iep_drv_probe(struct platform_device *pdev)
     \r
 #if defined(CONFIG_IEP_IOMMU)\r
     iep_service.iommu_dev = NULL;\r
-    iep_power_on();\r
-    iep_service.ion_client = rockchip_ion_client_create("iep");\r
-    if (IS_ERR(iep_service.ion_client)) {\r
-        IEP_ERR("failed to create ion client for vcodec");\r
-        return PTR_ERR(iep_service.ion_client);\r
-    } else {\r
-        IEP_INFO("iep ion client create success!\n");\r
-    }\r
-   \r
-    mmu_dev = rockchip_get_sysmmu_device_by_compatible("iommu,iep_mmu");\r
-    \r
-    if (mmu_dev) {\r
-        platform_set_sysmmu(mmu_dev, &pdev->dev);\r
-        iovmm_activate(&pdev->dev);\r
+    if (iommu_en) {\r
+        iep_power_on();\r
+        iep_service.ion_client = rockchip_ion_client_create("iep");\r
+        if (IS_ERR(iep_service.ion_client)) {\r
+            IEP_ERR("failed to create ion client for vcodec");\r
+            return PTR_ERR(iep_service.ion_client);\r
+        } else {\r
+            IEP_INFO("iep ion client create success!\n");\r
+        }\r
+\r
+        mmu_dev = rockchip_get_sysmmu_device_by_compatible("iommu,iep_mmu");\r
+        \r
+        if (mmu_dev) {\r
+            platform_set_sysmmu(mmu_dev, &pdev->dev);\r
+            iovmm_activate(&pdev->dev);\r
+        }\r
+\r
+        iep_service.iommu_dev = &pdev->dev;\r
+        iep_power_off();\r
     }\r
-    \r
-    iep_service.iommu_dev = &pdev->dev;\r
-    iep_power_off();\r
 #endif\r
 \r
     IEP_INFO("IEP Driver loaded succesfully\n");\r