Merge "msm: camera: ION migration for gemini driver." into msm-3.0
diff --git a/drivers/media/video/msm/gemini/msm_gemini_core.c b/drivers/media/video/msm/gemini/msm_gemini_core.c
index db0f505..480500b 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_core.c
+++ b/drivers/media/video/msm/gemini/msm_gemini_core.c
@@ -71,7 +71,8 @@
 	for (i = 0; i < 2; i++) {
 		if (we_pingpong_buf.buf_status[i] && release_buf)
 			msm_gemini_platform_p2v(we_pingpong_buf.buf[i].file,
-					&we_pingpong_buf.buf[i].msm_buffer);
+					&we_pingpong_buf.buf[i].msm_buffer,
+					&we_pingpong_buf.buf[i].handle);
 		we_pingpong_buf.buf_status[i] = 0;
 	}
 }
diff --git a/drivers/media/video/msm/gemini/msm_gemini_hw.h b/drivers/media/video/msm/gemini/msm_gemini_hw.h
index f91a1359..3c2fc6a 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_hw.h
+++ b/drivers/media/video/msm/gemini/msm_gemini_hw.h
@@ -16,6 +16,7 @@
 #include <media/msm_gemini.h>
 #include "msm_gemini_hw_reg.h"
 #include <mach/msm_subsystem_map.h>
+#include <linux/ion.h>
 
 struct msm_gemini_hw_buf {
 	struct msm_gemini_buf vbuf;
@@ -28,6 +29,7 @@
 	uint32_t num_of_mcu_rows;
 	struct msm_mapped_buffer *msm_buffer;
 	int *subsystem_id;
+	struct ion_handle *handle;
 };
 
 struct msm_gemini_hw_pingpong {
diff --git a/drivers/media/video/msm/gemini/msm_gemini_platform.c b/drivers/media/video/msm/gemini/msm_gemini_platform.c
index 9f5ec16..e81215e 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_platform.c
+++ b/drivers/media/video/msm/gemini/msm_gemini_platform.c
@@ -25,29 +25,38 @@
 
 /* AXI rate in KHz */
 #define MSM_SYSTEM_BUS_RATE	160000
+struct ion_client *gemini_client;
 
 void msm_gemini_platform_p2v(struct file  *file,
-				struct msm_mapped_buffer **msm_buffer)
+				struct msm_mapped_buffer **msm_buffer,
+				struct ion_handle **ionhandle)
 {
-
 	if (msm_subsystem_unmap_buffer(
 		(struct msm_mapped_buffer *)*msm_buffer) < 0)
 		pr_err("%s: umapped stat memory\n",  __func__);
 	*msm_buffer = NULL;
-#ifdef CONFIG_ANDROID_PMEM
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+	ion_free(gemini_client, *ionhandle);
+	*ionhandle = NULL;
+#elif CONFIG_ANDROID_PMEM
 	put_pmem_file(file);
 #endif
 }
 
 uint32_t msm_gemini_platform_v2p(int fd, uint32_t len, struct file **file_p,
-					struct msm_mapped_buffer **msm_buffer,
-					int *subsys_id)
+				struct msm_mapped_buffer **msm_buffer,
+				int *subsys_id, struct ion_handle **ionhandle)
 {
 	unsigned long paddr;
 	unsigned long size;
 	int rc;
 	int flags;
-#ifdef CONFIG_ANDROID_PMEM
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+	*ionhandle = ion_import_fd(gemini_client, fd);
+	if (IS_ERR_OR_NULL(*ionhandle))
+		return 0;
+	rc = ion_phys(gemini_client, *ionhandle, &paddr, (size_t *)&size);
+#elif CONFIG_ANDROID_PMEM
 	unsigned long kvstart;
 	rc = get_pmem_file(fd, &paddr, &kvstart, &size, file_p);
 #else
@@ -73,6 +82,12 @@
 					flags, subsys_id, 1);
 	if (IS_ERR((void *)*msm_buffer)) {
 		pr_err("%s: msm_subsystem_map_buffer failed\n", __func__);
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+		ion_free(gemini_client, *ionhandle);
+		*ionhandle = NULL;
+#elif CONFIG_ANDROID_PMEM
+		put_pmem_file(*file_p);
+#endif
 		return 0;
 	}
 	paddr = ((struct msm_mapped_buffer *)*msm_buffer)->iova[0];
@@ -136,6 +151,10 @@
 	*mem  = gemini_mem;
 	*base = gemini_base;
 	*irq  = gemini_irq;
+
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+	gemini_client = msm_ion_client_create(-1, "camera/gemini");
+#endif
 	GMN_DBG("%s:%d] success\n", __func__, __LINE__);
 
 	return rc;
@@ -159,7 +178,9 @@
 	result = msm_camio_jpeg_clk_disable();
 	iounmap(base);
 	release_mem_region(mem->start, resource_size(mem));
-
+#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
+	ion_client_destroy(gemini_client);
+#endif
 	GMN_DBG("%s:%d] success\n", __func__, __LINE__);
 	return result;
 }
diff --git a/drivers/media/video/msm/gemini/msm_gemini_platform.h b/drivers/media/video/msm/gemini/msm_gemini_platform.h
index cd897b0..c54d7df 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_platform.h
+++ b/drivers/media/video/msm/gemini/msm_gemini_platform.h
@@ -15,12 +15,13 @@
 
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
-
+#include <linux/ion.h>
 void msm_gemini_platform_p2v(struct file  *file,
-				struct msm_mapped_buffer **msm_buffer);
+				struct msm_mapped_buffer **msm_buffer,
+				struct ion_handle **ionhandle);
 uint32_t msm_gemini_platform_v2p(int fd, uint32_t len, struct file **file,
 				struct msm_mapped_buffer **msm_buffer,
-				int *subsys_id);
+				int *subsys_id, struct ion_handle **ionhandle);
 
 int msm_gemini_platform_clk_enable(void);
 int msm_gemini_platform_clk_disable(void);
diff --git a/drivers/media/video/msm/gemini/msm_gemini_sync.c b/drivers/media/video/msm/gemini/msm_gemini_sync.c
index c8d4fa0..0f0bd67 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_sync.c
+++ b/drivers/media/video/msm/gemini/msm_gemini_sync.c
@@ -151,7 +151,7 @@
 		buf_p = msm_gemini_q_out(q_p);
 		if (buf_p) {
 			msm_gemini_platform_p2v(buf_p->file,
-						&buf_p->msm_buffer);
+				&buf_p->msm_buffer, &buf_p->handle);
 			GMN_DBG("%s:%d] %s\n", __func__, __LINE__, q_p->name);
 			kfree(buf_p->subsystem_id);
 			kfree(buf_p);
@@ -317,7 +317,8 @@
 	}
 
 	buf_cmd = buf_p->vbuf;
-	msm_gemini_platform_p2v(buf_p->file, &buf_p->msm_buffer);
+	msm_gemini_platform_p2v(buf_p->file, &buf_p->msm_buffer,
+				&buf_p->handle);
 	kfree(buf_p->subsystem_id);
 	kfree(buf_p);
 
@@ -368,7 +369,7 @@
 	}
 	buf_p->y_buffer_addr = msm_gemini_platform_v2p(buf_cmd.fd,
 		buf_cmd.y_len, &buf_p->file, &buf_p->msm_buffer,
-		buf_p->subsystem_id);
+		buf_p->subsystem_id, &buf_p->handle);
 	if (!buf_p->y_buffer_addr) {
 		GMN_PR_ERR("%s:%d] v2p wrong\n", __func__, __LINE__);
 		kfree(buf_p->subsystem_id);
@@ -434,7 +435,8 @@
 	}
 
 	buf_cmd = buf_p->vbuf;
-	msm_gemini_platform_p2v(buf_p->file, &buf_p->msm_buffer);
+	msm_gemini_platform_p2v(buf_p->file, &buf_p->msm_buffer,
+				&buf_p->handle);
 	kfree(buf_p->subsystem_id);
 	kfree(buf_p);
 
@@ -484,7 +486,7 @@
 	}
 	buf_p->y_buffer_addr    = msm_gemini_platform_v2p(buf_cmd.fd,
 		buf_cmd.y_len + buf_cmd.cbcr_len, &buf_p->file,
-			&buf_p->msm_buffer, buf_p->subsystem_id)
+			&buf_p->msm_buffer, buf_p->subsystem_id, &buf_p->handle)
 			+ buf_cmd.offset;
 	buf_p->y_len          = buf_cmd.y_len;