msm: camera: use ION for stats and userptr buffers in V4L2 driver.

Change-Id: Ibc7db3a7355d07f421e63e990354e44e372e79d0
Signed-off-by: Ankit Premrajka <ankitp@codeaurora.org>
diff --git a/drivers/media/video/videobuf2-msm-mem.c b/drivers/media/video/videobuf2-msm-mem.c
index d765244..fa7e3fd 100644
--- a/drivers/media/video/videobuf2-msm-mem.c
+++ b/drivers/media/video/videobuf2-msm-mem.c
@@ -151,16 +151,27 @@
 int videobuf2_pmem_contig_user_get(struct videobuf2_contig_pmem *mem,
 					struct videobuf2_msm_offset *offset,
 					enum videobuf2_buffer_type buffer_type,
-					uint32_t addr_offset, int path)
+					uint32_t addr_offset, int path,
+					struct ion_client *client)
 {
-	unsigned long kvstart;
 	unsigned long len;
-	int rc;
+	int rc = 0;
+#ifndef CONFIG_MSM_MULTIMEDIA_USE_ION
+	unsigned long kvstart;
+#endif
 	unsigned int flags = 0;
-
+	unsigned long paddr = 0;
 	if (mem->phyaddr != 0)
 		return 0;
-
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+	mem->ion_handle = ion_import_fd(client, (int)mem->vaddr);
+	if (IS_ERR_OR_NULL(mem->ion_handle)) {
+		pr_err("%s ION import failed\n", __func__);
+		return PTR_ERR(mem->ion_handle);
+	}
+	rc = ion_phys(client, mem->ion_handle, (ion_phys_addr_t *)&mem->phyaddr,
+			 (size_t *)&len);
+#elif CONFIG_ANDROID_PMEM
 	rc = get_pmem_file((int)mem->vaddr, (unsigned long *)&mem->phyaddr,
 					&kvstart, &len, &mem->file);
 	if (rc < 0) {
@@ -168,32 +179,48 @@
 					__func__, (int)mem->vaddr, rc);
 		return rc;
 	}
+#else
+	paddr = 0;
+	kvstart = 0;
+#endif
 	if (offset)
 		mem->offset = *offset;
 	else
 		memset(&mem->offset, 0, sizeof(struct videobuf2_msm_offset));
 	mem->path = path;
 	mem->buffer_type = buffer_type;
+	paddr = mem->phyaddr;
 	flags = MSM_SUBSYSTEM_MAP_IOVA;
 	mem->subsys_id = MSM_SUBSYSTEM_CAMERA;
 	mem->msm_buffer = msm_subsystem_map_buffer(mem->phyaddr, len,
 					flags, &(mem->subsys_id), 1);
 	if (IS_ERR((void *)mem->msm_buffer)) {
 		pr_err("%s: msm_subsystem_map_buffer failed\n", __func__);
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+		ion_free(client, mem->ion_handle);
+#elif CONFIG_ANDROID_PMEM
 		put_pmem_file(mem->file);
+#endif
 		return PTR_ERR((void *)mem->msm_buffer);
 	}
-	mem->mapped_phyaddr = mem->msm_buffer->iova[0] + addr_offset;
+	paddr = mem->msm_buffer->iova[0];
+	mem->mapped_phyaddr = paddr + addr_offset;
 	return rc;
 }
 EXPORT_SYMBOL_GPL(videobuf2_pmem_contig_user_get);
 
-void videobuf2_pmem_contig_user_put(struct videobuf2_contig_pmem *mem)
+void videobuf2_pmem_contig_user_put(struct videobuf2_contig_pmem *mem,
+					struct ion_client *client)
 {
 	if (msm_subsystem_unmap_buffer(mem->msm_buffer) < 0)
 		D("%s unmapped memory\n", __func__);
-	if (mem->is_userptr)
+	if (mem->is_userptr) {
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+		ion_free(client, mem->ion_handle);
+#elif CONFIG_ANDROID_PMEM
 		put_pmem_file(mem->file);
+#endif
+	}
 	mem->is_userptr = 0;
 	mem->phyaddr = 0;
 	mem->size = 0;