s5p-mfc: Fix kernel warning on memory init
authorJohn Sheu <sheu@chromium.org>
Fri, 8 Mar 2013 02:37:13 +0000 (18:37 -0800)
committerChromeBot <chrome-bot@google.com>
Wed, 20 Mar 2013 09:05:17 +0000 (02:05 -0700)
<UPSTREAM MERGE NOT REQUIRED>

linux-media commit 6e83e6e25eb49dc57a69b3f8ecc1e764c9775101
Original commit message as follows:

  Cleaned up the memory devices allocation code and added
  missing device_initialize() call to remove the kernel warning
  during memory allocations.

Signed-off-by: Arun Kumar K <arun.kk@samsung.com>
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Change-Id: Ie9cf1d8fcdc3e70acf23329449c8985eab5cd68e
Signed-off-by: John Sheu <sheu@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/45100

drivers/media/video/s5p-mfc/s5p_mfc.c

index a63afe5..bde2813 100644 (file)
@@ -1065,6 +1065,33 @@ static void iommu_deinit(struct device *mfc_l, struct device *mfc_r)
 
        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);
@@ -1127,14 +1154,15 @@ static int s5p_mfc_probe(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;
@@ -1142,47 +1170,15 @@ static int s5p_mfc_probe(struct platform_device *pdev)
                }
                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);
@@ -1330,10 +1326,14 @@ static int s5p_mfc_remove(struct platform_device *pdev)
        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;
 }