return;
}
+
+#else
+static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
+{
+ unsigned int mem_info[2];
+
+ of_property_read_u32_array(dev->plat_dev->dev.of_node,
+ "samsung,mfc-l", mem_info, 2);
+ if (dma_declare_coherent_memory(dev->mem_dev_l, mem_info[0],
+ mem_info[0], mem_info[1],
+ DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE) == 0) {
+ mfc_err("Failed to declare coherent memory for\n"
+ "MFC device\n");
+ return -ENOMEM;
+ }
+ of_property_read_u32_array(dev->plat_dev->dev.of_node,
+ "samsung,mfc-r", mem_info, 2);
+ if (dma_declare_coherent_memory(dev->mem_dev_r, mem_info[0],
+ mem_info[0], mem_info[1],
+ DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE) == 0) {
+ pr_err("Failed to declare coherent memory for\n"
+ "MFC device\n");
+ return -ENOMEM;
+ }
+ return 0;
+}
+
#endif
static void *mfc_get_drv_data(struct platform_device *pdev);
}
if (pdev->dev.of_node) {
-#if defined(S5P_MFC_USE_34_BACKPORT) && defined(CONFIG_EXYNOS_IOMMU)
- dev->mem_dev_l = kzalloc(sizeof(struct device), GFP_KERNEL);
+ dev->mem_dev_l = devm_kzalloc(&pdev->dev, sizeof(struct device),
+ GFP_KERNEL);
if (!dev->mem_dev_l) {
mfc_err("Not enough memory\n");
ret = -ENOMEM;
goto err_res;
}
- dev->mem_dev_r = kzalloc(sizeof(struct device), GFP_KERNEL);
+ dev->mem_dev_r = devm_kzalloc(&pdev->dev, sizeof(struct device),
+ GFP_KERNEL);
if (!dev->mem_dev_r) {
mfc_err("Not enough memory\n");
ret = -ENOMEM;
}
dev->mem_dev_l->init_name = "mfc_l";
dev->mem_dev_r->init_name = "mfc_r";
+#if defined(S5P_MFC_USE_34_BACKPORT) && defined(CONFIG_EXYNOS_IOMMU)
ret = iommu_init(pdev, dev->mem_dev_r, dev->mem_dev_l);
+#else
+ ret = s5p_mfc_alloc_memdevs(dev);
+#endif
if (ret) {
v4l2_err(&dev->v4l2_dev, "failed to initialize IOMMU\n");
goto err_res;
}
-#else
- unsigned int mem_info[2];
- dev->mem_dev_l = kzalloc(sizeof(struct device), GFP_KERNEL);
- if (!dev->mem_dev_l) {
- mfc_err("Not enough memory\n");
- ret = -ENOMEM;
- goto err_res;
- }
- of_property_read_u32_array(pdev->dev.of_node, "samsung,mfc-l",
- mem_info, 2);
- if (dma_declare_coherent_memory(dev->mem_dev_l, mem_info[0],
- mem_info[0], mem_info[1],
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE) == 0) {
- mfc_err("Failed to declare coherent memory for\n"
- "MFC device\n");
- ret = -ENOMEM;
- goto err_res;
- }
-
- dev->mem_dev_r = kzalloc(sizeof(struct device), GFP_KERNEL);
- if (!dev->mem_dev_r) {
- mfc_err("Not enough memory\n");
- ret = -ENOMEM;
- goto err_res;
- }
- of_property_read_u32_array(pdev->dev.of_node, "samsung,mfc-r",
- mem_info, 2);
- if (dma_declare_coherent_memory(dev->mem_dev_r, mem_info[0],
- mem_info[0], mem_info[1],
- DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE) == 0) {
- pr_err("Failed to declare coherent memory for\n"
- "MFC device\n");
- ret = -ENOMEM;
- goto err_res;
- }
-#endif
} else {
dev->mem_dev_l = device_find_child(&dev->plat_dev->dev,
"s5p-mfc-l", match_child);
s5p_mfc_release_firmware(dev);
vb2_dma_contig_cleanup_ctx(dev->alloc_ctx[0]);
vb2_dma_contig_cleanup_ctx(dev->alloc_ctx[1]);
-
+ if (pdev->dev.of_node) {
#if defined(S5P_MFC_USE_34_BACKPORT) && defined(CONFIG_EXYNOS_IOMMU)
- iommu_deinit(dev->mem_dev_r, dev->mem_dev_l);
+ iommu_deinit(dev->mem_dev_r, dev->mem_dev_l);
#endif
+ put_device(dev->mem_dev_l);
+ put_device(dev->mem_dev_r);
+ }
+
s5p_mfc_final_pm(dev);
return 0;
}