misc: update HTC camera code from evita MR1 release

HTC kernel version: evitaul-jb-crc-3.4.10-08ef01e

Change-Id: Id6493dbefef21d9b6fec46e44501232cb9780d10
diff --git a/arch/arm/mach-msm/clock-8960.c b/arch/arm/mach-msm/clock-8960.c
index 61fd0cd..9c5be32 100755
--- a/arch/arm/mach-msm/clock-8960.c
+++ b/arch/arm/mach-msm/clock-8960.c
@@ -5775,15 +5775,15 @@
 	CLK_LOOKUP("cam_clk",		cam0_clk.c,	"4-0034"),
 	CLK_LOOKUP("cam_clk",		cam1_clk.c,	"4-0036"),
 	CLK_LOOKUP("cam_clk",		cam1_clk.c,	"4-003c"),
-	CLK_LOOKUP("csi_src_clk",	csi0_src_clk.c,		"msm_csid.0"),
-	CLK_LOOKUP("csi_src_clk",	csi1_src_clk.c,		"msm_csid.1"),
-	CLK_LOOKUP("csi_src_clk",	csi2_src_clk.c,		"msm_csid.2"),
-	CLK_LOOKUP("csi_clk",		csi0_clk.c,		"msm_csid.0"),
-	CLK_LOOKUP("csi_clk",		csi1_clk.c,		"msm_csid.1"),
-	CLK_LOOKUP("csi_clk",		csi2_clk.c,		"msm_csid.2"),
-	CLK_LOOKUP("csi_phy_clk",	csi0_phy_clk.c,		"msm_csid.0"),
-	CLK_LOOKUP("csi_phy_clk",	csi1_phy_clk.c,		"msm_csid.1"),
-	CLK_LOOKUP("csi_phy_clk",	csi2_phy_clk.c,		"msm_csid.2"),
+	CLK_LOOKUP("csi_src_clk",	csi0_src_clk.c,		"msm_csiphy.0"),
+	CLK_LOOKUP("csi_src_clk",	csi1_src_clk.c,		"msm_csiphy.1"),
+	CLK_LOOKUP("csi_src_clk",	csi2_src_clk.c,		"msm_csiphy.2"),
+	CLK_LOOKUP("csi_clk",		csi0_clk.c,		"msm_csiphy.0"),
+	CLK_LOOKUP("csi_clk",		csi1_clk.c,		"msm_csiphy.1"),
+	CLK_LOOKUP("csi_clk",		csi2_clk.c,		"msm_csiphy.2"),
+	CLK_LOOKUP("csi_phy_clk",	csi0_phy_clk.c,		"msm_csiphy.0"),
+	CLK_LOOKUP("csi_phy_clk",	csi1_phy_clk.c,		"msm_csiphy.1"),
+	CLK_LOOKUP("csi_phy_clk",	csi2_phy_clk.c,		"msm_csiphy.2"),
 	CLK_LOOKUP("csi_pix_clk",	csi_pix_clk.c,		"msm_ispif.0"),
 	CLK_LOOKUP("csi_rdi_clk",	csi_rdi_clk.c,		"msm_ispif.0"),
 	CLK_LOOKUP("csi_src_clk",	csi2_src_clk.c,		NULL),
@@ -5846,9 +5846,9 @@
 	CLK_LOOKUP("bus_clk",		vpe_axi_clk.c,	"footswitch-8x60.9"),
 	CLK_LOOKUP("arb_clk",		amp_p_clk.c,		"mipi_dsi.1"),
 	CLK_LOOKUP("arb_clk",		amp_p_clk.c,		"mipi_dsi.2"),
-	CLK_LOOKUP("csi_pclk",		csi_p_clk.c,		"msm_csid.0"),
-	CLK_LOOKUP("csi_pclk",		csi_p_clk.c,		"msm_csid.1"),
-	CLK_LOOKUP("csi_pclk",		csi_p_clk.c,		"msm_csid.2"),
+	CLK_LOOKUP("csi_pclk",		csi_p_clk.c,		"msm_csiphy.0"),
+	CLK_LOOKUP("csi_pclk",		csi_p_clk.c,		"msm_csiphy.1"),
+	CLK_LOOKUP("csi_pclk",		csi_p_clk.c,		"msm_csiphy.2"),
 	CLK_LOOKUP("master_iface_clk",	dsi1_m_p_clk.c,		"mipi_dsi.1"),
 	CLK_LOOKUP("slave_iface_clk",	dsi1_s_p_clk.c,		"mipi_dsi.1"),
 	CLK_LOOKUP("master_iface_clk",	dsi2_m_p_clk.c,		"mipi_dsi.2"),
diff --git a/arch/arm/mach-msm/htc/elite/board-elite-camera.c b/arch/arm/mach-msm/htc/elite/board-elite-camera.c
index 02b3d70..31d16cb 100644
--- a/arch/arm/mach-msm/htc/elite/board-elite-camera.c
+++ b/arch/arm/mach-msm/htc/elite/board-elite-camera.c
@@ -859,7 +859,8 @@
 
 static struct camera_flash_cfg msm_camera_sensor_s5k3h2yx_flash_cfg = {
 	.low_temp_limit		= 5,
-	.low_cap_limit		= 15,
+	.low_cap_limit		= 14,
+	.low_cap_limit_dual	= 0,
 	.flash_info             = &msm_camera_sensor_s5k3h2yx_flash_info,
 };
 
@@ -1143,7 +1144,8 @@
 
 static struct camera_flash_cfg msm_camera_sensor_imx175_flash_cfg = {
 	.low_temp_limit		= 5,
-	.low_cap_limit		= 15,
+	.low_cap_limit		= 14,
+	.low_cap_limit_dual	= 0,
 	.flash_info             = &msm_camera_sensor_imx175_flash_info,
 };
 
diff --git a/arch/arm/mach-msm/htc/fighter/board-fighter-camera.c b/arch/arm/mach-msm/htc/fighter/board-fighter-camera.c
index 343dd24..04cdf90 100644
--- a/arch/arm/mach-msm/htc/fighter/board-fighter-camera.c
+++ b/arch/arm/mach-msm/htc/fighter/board-fighter-camera.c
@@ -646,7 +646,8 @@
 
 static struct camera_flash_cfg msm_camera_sensor_s5k3h2yx_flash_cfg = {
 	.low_temp_limit		= 5,
-	.low_cap_limit		= 15,
+	.low_cap_limit		= 14,
+	.low_cap_limit_dual	= 0,
 	.flash_info             = &msm_camera_sensor_s5k3h2yx_flash_info,
 };
 /* Andrew_Cheng linear led 20111205 ME */
@@ -900,7 +901,8 @@
 
 static struct camera_flash_cfg msm_camera_sensor_imx105_flash_cfg = {
 	.low_temp_limit		= 5,
-	.low_cap_limit		= 15,
+	.low_cap_limit		= 14,
+	.low_cap_limit_dual	= 0,
 	.flash_info		= &msm_camera_sensor_imx105_flash_info,
 };
 /* Andrew_Cheng linear led 20111205 ME */
diff --git a/arch/arm/mach-msm/htc/htc_awb_cal.c b/arch/arm/mach-msm/htc/htc_awb_cal.c
index ec49902..4bcd176 100644
--- a/arch/arm/mach-msm/htc/htc_awb_cal.c
+++ b/arch/arm/mach-msm/htc/htc_awb_cal.c
@@ -40,6 +40,9 @@
 	
 	unsigned long int flashcaBuff[8];  
 	
+       
+       unsigned long int ois_data[8];
+       
 
 };
 
@@ -111,7 +114,7 @@
 	 int i, *pint;
 	 printk(KERN_INFO "awb_calibration_show():\n");
 	 pint = (int *)buf;
-	 for (i = 0; i < 906; i++)
+	 for (i = 0; i < 914; i++)
 	   printk(KERN_INFO "%d-%x\n", i, pint[i]);
 
    }
diff --git a/arch/arm/mach-msm/htc/jet/board-jet-camera.c b/arch/arm/mach-msm/htc/jet/board-jet-camera.c
index 79a765a..6f1518b 100644
--- a/arch/arm/mach-msm/htc/jet/board-jet-camera.c
+++ b/arch/arm/mach-msm/htc/jet/board-jet-camera.c
@@ -854,7 +854,8 @@
 
 static struct camera_flash_cfg msm_camera_sensor_s5k3h2yx_flash_cfg = {
 	.low_temp_limit		= 5,
-	.low_cap_limit		= 15,
+	.low_cap_limit		= 14,
+	.low_cap_limit_dual	= 0,
 	.flash_info             = &msm_camera_sensor_s5k3h2yx_flash_info,
 };
 
@@ -1104,7 +1105,8 @@
 
 static struct camera_flash_cfg msm_camera_sensor_imx175_flash_cfg = {
 	.low_temp_limit		= 5,
-	.low_cap_limit		= 15,
+	.low_cap_limit		= 14,
+	.low_cap_limit_dual	= 0,
 	.flash_info             = &msm_camera_sensor_imx175_flash_info,
 };
 
diff --git a/arch/arm/mach-msm/htc/ville/board-ville-camera.c b/arch/arm/mach-msm/htc/ville/board-ville-camera.c
index 849fbd4..149c034 100644
--- a/arch/arm/mach-msm/htc/ville/board-ville-camera.c
+++ b/arch/arm/mach-msm/htc/ville/board-ville-camera.c
@@ -943,7 +943,8 @@
 
 static struct camera_flash_cfg msm_camera_sensor_s5k3h2yx_flash_cfg = {
 	.low_temp_limit		= 5,
-	.low_cap_limit		= 15,
+	.low_cap_limit		= 14,
+	.low_cap_limit_dual	= 0,
 	.flash_info             = &msm_camera_sensor_s5k3h2yx_flash_info,
 };
 /* Andrew_Cheng linear led 20111205 ME */
diff --git a/arch/arm/mach-msm/include/mach/board-ext-htc.h b/arch/arm/mach-msm/include/mach/board-ext-htc.h
index 407b366..777739a 100644
--- a/arch/arm/mach-msm/include/mach/board-ext-htc.h
+++ b/arch/arm/mach-msm/include/mach/board-ext-htc.h
@@ -147,6 +147,7 @@
 	int (*camera_flash)(int level);
 	uint16_t low_temp_limit;
 	uint16_t low_cap_limit;
+	uint16_t low_cap_limit_dual;
 	uint8_t postpone_led_mode;
 	struct camera_flash_info *flash_info;
 };
@@ -189,6 +190,17 @@
 	int max_voltage;
 	int op_mode;
 };
+
+enum htc_camera_image_type_board {
+	HTC_CAMERA_IMAGE_NONE_BOARD,
+	HTC_CAMERA_IMAGE_YUSHANII_BOARD,
+	HTC_CAMERA_IMAGE_MAX_BOARD,
+};
+
+enum cam_vcm_onoff_type {
+	STATUS_OFF,
+	STATUS_ON,
+};
 #endif /* CONFIG_MSM_CAMERA */
 
 #endif /* __ASM_ARCH_MSM_BOARD_EXT_HTC_H */
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index 6051072..9f65fc7 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -275,6 +275,8 @@
 	int vcm_enable;
 #ifdef CONFIG_MACH_HTC
 	int use_rawchip_af;
+	void (*vcm_wa_vreg_on) (void);
+	void (*vcm_wa_vreg_off) (void);
 #endif
 };
 
@@ -314,7 +316,10 @@
 	struct msm_camera_gpio_conf *gpio_conf;
 	int (*camera_power_on)(void);
 	int (*camera_power_off)(void);
+	enum htc_camera_image_type_board htc_image;
 	int use_rawchip;
+	int hdr_mode;
+	int video_hdr_capability;
 	int power_down_disable;
 	int mirror_mode;
 	struct camera_flash_cfg* flash_cfg;
diff --git a/arch/arm/mach-msm/include/mach/camera.h b/arch/arm/mach-msm/include/mach/camera.h
index 4da23ea..fc81192 100644
--- a/arch/arm/mach-msm/include/mach/camera.h
+++ b/arch/arm/mach-msm/include/mach/camera.h
@@ -212,12 +212,14 @@
 	struct msm_camera_csiphy_params csiphy_params;
 };
 
+#ifndef CONFIG_MSM_CAMERA_V4L2
 #define VFE31_OUTPUT_MODE_PT (0x1 << 0)
 #define VFE31_OUTPUT_MODE_S (0x1 << 1)
 #define VFE31_OUTPUT_MODE_V (0x1 << 2)
 #define VFE31_OUTPUT_MODE_P (0x1 << 3)
 #define VFE31_OUTPUT_MODE_T (0x1 << 4)
 #define VFE31_OUTPUT_MODE_P_ALL_CHNLS (0x1 << 5)
+#endif
 
 #define CSI_EMBED_DATA 0x12
 #define CSI_RESERVED_DATA_0 0x13
@@ -359,6 +361,15 @@
 	int (*a_power_down)(void *);
 	int (*a_create_subdevice)(void *, void *);
 	int (*a_config)(void __user *);
+	int is_ois_supported;
+    int is_cal_supported; 
+	
+	void (*do_vcm_on_cb)(void);
+	void (*do_vcm_off_cb)(void);
+	void (*actuator_poweroff_af)(void);
+	struct mutex *actrl_vcm_on_mut; 
+	enum cam_vcm_onoff_type *actrl_vcm_wa_camera_on;
+	
 };
 
 struct msm_strobe_flash_ctrl {
@@ -493,6 +504,7 @@
 	struct file *file;
 	struct msm_pmem_info info;
 	struct ion_handle *handle;
+	unsigned long vaddr;
 };
 
 struct axidata {
@@ -673,6 +685,7 @@
 u32 msm_io_r(void __iomem *addr);
 u32 msm_io_r_mb(void __iomem *addr);
 void msm_io_dump(void __iomem *addr, int size);
+void msm_csi_io_dump(void __iomem *addr, int size);
 void msm_io_memcpy(void __iomem *dest_addr, void __iomem *src_addr, u32 len);
 void msm_camio_set_perf_lvl(enum msm_bus_perf_setting);
 void msm_camio_bus_scale_cfg(
diff --git a/drivers/media/video/msm/Kconfig b/drivers/media/video/msm/Kconfig
index 146e74c..2cc8144 100644
--- a/drivers/media/video/msm/Kconfig
+++ b/drivers/media/video/msm/Kconfig
@@ -115,7 +115,7 @@
 config VX6953
 	bool "Sensor VX6953 (BAYER 5M)"
 	depends on MSM_CAMERA && (ARCH_MSM7X30 || ARCH_MSM8X60)
-	default y
+	default n
 	---help---
 	STM 5M Bayer Sensor with EDOF
 config SN12M0PZ
@@ -278,6 +278,20 @@
 	---help---
 	  ST Yushan rawchip
 
+config RAWCHIPII
+        bool "RawchipII"
+        depends on MSM_CAMERA
+        default n
+        ---help---
+          ST Yushan rawchipII
+
+config CAMERA_IMAGE_NONE_BOARD
+	bool "CameraImageNoneBoard"
+	depends on MSM_CAMERA
+	default n
+	---help---
+	  camera image none board
+
 config QUP_EXCLUSIVE_TO_CAMERA
 	bool "QUP exclusive to camera"
 	depends on MSM_CAMERA
@@ -339,6 +353,13 @@
 	---help---
 	  Autofocus of imx175 actuator
 
+config RUMBAS_ACT
+	bool "RUMBA-S actuator"
+	depends on MSM_CAMERA
+	default n
+	---help---
+	  Autofocus of RUMBA-S actuator
+
 config AD5823_ACT
        bool "Lens actuator ad5823"
        depends on MSM_CAMERA
@@ -355,7 +376,21 @@
        bool "Lens actuator ti201"
        depends on MSM_CAMERA
        ---help---
-         ti201 lens actuator driver for SONY IMX175 and IMX091.
+         ti201 lens actuator driver for SONY IMX175, IMX091 and VD6869.
+
+config ACT_OIS_BINDER
+       bool "Act_Ois_Binder"
+       depends on MSM_CAMERA
+       default n
+       ---help---
+         Act_Ois_Binder for OIS function through ti201 lens actuator driver.
+
+config LC898212_ACT
+       bool "Lens actuator lc898212"
+       depends on MSM_CAMERA
+       default n
+       ---help---
+         lc898212 lens actuator driver for VD6869.
 
 config MT9V113
 	bool "Sensor mt9v113 (VGA YUV)"
@@ -392,6 +427,13 @@
 	---help---
 	  ST Yushan rawchip MCLK
 
+config DISABLE_MCLK_RAWCHIP_TO_MAINCAM
+	bool "DISABLE MCLK FROM RAWCHIP TO MAINCAM"
+	depends on MSM_CAMERA
+	default n
+	---help---
+	  For the design for K2 two MCLK control of rawchip
+
 config S5K6A2YA
 	bool "Sensor s5k6a2ya (Samsung 1.6M)"
 	depends on MSM_CAMERA
@@ -399,3 +441,25 @@
 	---help---
 	  Support for S5K6A2YA samsung sensor driver.
 	  It is a Bayer 1.6MP sensor it supports one mipi lanes.
+
+config S5K6AAFX
+	bool "Sensor s5k6aafx (Samsung 1.3M)"
+	depends on MSM_CAMERA
+	default n
+	---help---
+	  Samsung 1.3M without Autofocus
+
+config VD6869
+	bool "Sensor VD6869 (BAYER 4M)"
+	depends on MSM_CAMERA
+	default n
+	---help---
+	ST 4MP Bayer Sensor
+
+config OV4688
+	bool "Sensor ov4688 (BAYER 4M)"
+	depends on MSM_CAMERA
+	default n
+	---help---
+	ov 4MP Bayer Sensor
+
diff --git a/drivers/media/video/msm/Makefile b/drivers/media/video/msm/Makefile
index 2352088..392e658 100644
--- a/drivers/media/video/msm/Makefile
+++ b/drivers/media/video/msm/Makefile
@@ -8,12 +8,12 @@
   EXTRA_CFLAGS += -Idrivers/media/video/msm/io
   EXTRA_CFLAGS += -Idrivers/media/video/msm/sensors
   obj-$(CONFIG_MSM_CAMERA) += msm_isp.o msm.o msm_mem.o msm_mctl.o msm_mctl_buf.o msm_mctl_pp.o
-  obj-$(CONFIG_MSM_CAMERA) += rawchip/ io/ sensors/ actuators/ csi/
+  obj-$(CONFIG_MSM_CAMERA) += rawchip/ yushanII/ io/ sensors/ actuators/ csi/
   obj-$(CONFIG_MSM_CAMERA) += msm_gesture.o
 else
   obj-$(CONFIG_MSM_CAMERA) += msm_camera.o
 endif
-obj-$(CONFIG_MSM_CAMERA) += msm_axi_qos.o gemini/
+obj-$(CONFIG_MSM_CAMERA) += msm_axi_qos.o gemini/ swfv/
 obj-$(CONFIG_MSM_CAMERA_FLASH) += flash.o
 obj-$(CONFIG_ARCH_MSM_ARM11) += msm_vfe7x.o msm_io7x.o
 ifeq ($(CONFIG_MSM_CAMERA_V4L2),y)
@@ -23,7 +23,11 @@
 endif
 obj-$(CONFIG_ARCH_MSM7X30) += msm_vfe31.o msm_io_vfe31.o msm_vpe1.o
 obj-$(CONFIG_ARCH_QSD8X50) += msm_vfe8x.o msm_vfe8x_proc.o msm_io8x.o
+ifeq ($(CONFIG_MSM_CAMERA_V4L2),y)
+  obj-$(CONFIG_ARCH_MSM8X60) += msm_io_8x60_v4l2.o msm_vfe31_v4l2.o msm_vpe.o
+else
 obj-$(CONFIG_ARCH_MSM8X60) += msm_vfe31.o msm_io_8x60.o msm_vpe1.o
+endif
 obj-$(CONFIG_ARCH_MSM8960) += msm_io_8960.o msm_vfe32.o msm_vpe.o
 obj-$(CONFIG_MT9T013) += mt9t013.o mt9t013_reg.o
 obj-$(CONFIG_SN12M0PZ) += sn12m0pz.o sn12m0pz_reg.o
diff --git a/drivers/media/video/msm/actuators/Makefile b/drivers/media/video/msm/actuators/Makefile
index 644dc21..39c8a30 100644
--- a/drivers/media/video/msm/actuators/Makefile
+++ b/drivers/media/video/msm/actuators/Makefile
@@ -1,6 +1,8 @@
 GCC_VERSION      := $(shell $(CONFIG_SHELL) $(PWD)/scripts/gcc-version.sh $(CROSS_COMPILE)gcc)
 EXTRA_CFLAGS += -Idrivers/media/video/msm
 EXTRA_CFLAGS += -Idrivers/media/video/msm/io
+EXTRA_CFLAGS += -Idrivers/media/video/msm/sensors
+obj-$(CONFIG_TI201_ACT) += LC898111/
 obj-$(CONFIG_MSM_ACTUATOR) += msm_actuator.o
 obj-$(CONFIG_IMX074_ACT) += imx074_act.o
 obj-$(CONFIG_IMX105_ACT) += imx105_act.o
@@ -11,3 +13,6 @@
 obj-$(CONFIG_DW9712_ACT) += dw9712_act.o
 obj-$(CONFIG_AD5046_ACT) += ad5046_act.o
 obj-$(CONFIG_IMX175_ACT) += imx175_act.o
+obj-$(CONFIG_OV5693_ACT) += ov5693_act.o
+obj-$(CONFIG_RUMBAS_ACT) += rumbas_act.o
+obj-$(CONFIG_LC898212_ACT) += lc898212_act.o
diff --git a/drivers/media/video/msm/actuators/imx175_act.c b/drivers/media/video/msm/actuators/imx175_act.c
index 33fabd7..6267145 100644
--- a/drivers/media/video/msm/actuators/imx175_act.c
+++ b/drivers/media/video/msm/actuators/imx175_act.c
@@ -15,11 +15,8 @@
 #include "msm_camera_i2c.h"
 #include <mach/gpio.h>
 
-#ifdef USE_RAWCHIP_AF
-#define	IMX175_TOTAL_STEPS_NEAR_TO_FAR			256
-#else
 #define	IMX175_TOTAL_STEPS_NEAR_TO_FAR			52
-#endif
+#define	IMX175_TOTAL_STEPS_NEAR_TO_FAR_RAWCHIP_AF                  256 
 
 #define REG_VCM_NEW_CODE			0x30F2
 #define REG_VCM_I2C_ADDR			0x18
@@ -108,11 +105,17 @@
 
 	if (a_ctrl->func_tbl.actuator_set_params)
 		a_ctrl->func_tbl.actuator_set_params(a_ctrl);
-
+#if 0
 	if (imx175_act_t.step_position_table) {
 		LINFO("%s table inited\n", __func__);
 		return rc;
 	}
+#endif
+
+	if (imx175_msm_actuator_info->use_rawchip_af && a_ctrl->af_algo == AF_ALGO_RAWCHIP)
+		a_ctrl->set_info.total_steps = IMX175_TOTAL_STEPS_NEAR_TO_FAR_RAWCHIP_AF;
+	else
+		a_ctrl->set_info.total_steps = IMX175_TOTAL_STEPS_NEAR_TO_FAR;
 
 	
 	if (a_ctrl->step_position_table != NULL) {
@@ -132,12 +135,10 @@
 
 		a_ctrl->step_position_table[0] = a_ctrl->initial_code;
 		for (i = 1; i <= a_ctrl->set_info.total_steps; i++) {
-#ifdef USE_RAWCHIP_AF
-			if (imx175_msm_actuator_info->use_rawchip_af)
+			if (imx175_msm_actuator_info->use_rawchip_af && a_ctrl->af_algo == AF_ALGO_RAWCHIP) 
 				a_ctrl->step_position_table[i] =
 					a_ctrl->step_position_table[i-1] + 4;
 			else
-#endif
 			{
 			if (i <= imx175_nl_region_boundary1) {
 				a_ctrl->step_position_table[i] =
@@ -387,7 +388,7 @@
 	},
 
 	.set_info = {
-		.total_steps = IMX175_TOTAL_STEPS_NEAR_TO_FAR,
+		.total_steps = IMX175_TOTAL_STEPS_NEAR_TO_FAR_RAWCHIP_AF, 
 		.gross_steps = 3,	
 		.fine_steps = 1,	
 	},
@@ -396,6 +397,7 @@
 	.curr_region_index = 0,
 	.initial_code = 0,	
 	.actuator_mutex = &imx175_act_mutex,
+	.af_algo = AF_ALGO_RAWCHIP, 
 
 	.func_tbl = {
 		.actuator_init_table = imx175_msm_actuator_init_table,
diff --git a/drivers/media/video/msm/actuators/msm_actuator.c b/drivers/media/video/msm/actuators/msm_actuator.c
index 9468b0a..a3f6940 100644
--- a/drivers/media/video/msm/actuators/msm_actuator.c
+++ b/drivers/media/video/msm/actuators/msm_actuator.c
@@ -193,7 +193,7 @@
 
 	a_ctrl->curr_step_pos = 0;
 	a_ctrl->curr_region_index = 0;
-
+	a_ctrl->af_OTP_info.VCM_OTP_Read = false;
 	return rc;
 }
 
@@ -225,6 +225,7 @@
 		LINFO("%s after msm_actuator_set_default_focus\n", __func__);
 	}
 	kfree(a_ctrl->step_position_table);
+	a_ctrl->step_position_table=NULL; 
 	return rc;
 }
 
@@ -244,6 +245,7 @@
 	switch (cdata.cfgtype) {
 	case CFG_GET_ACTUATOR_INFO:
 		cdata.is_af_supported = 1;
+		cdata.is_ois_supported = a_ctrl->actuator_ext_ctrl.is_ois_supported;
 		cdata.cfg.get_info = a_ctrl->get_info;
 		if (copy_to_user((void *)argp,
 				 &cdata,
@@ -251,9 +253,6 @@
 			rc = -EFAULT;
 		break;
 	case CFG_SET_ACTUATOR_INFO:
-#ifdef USE_RAWCHIP_AF
-		if (board_info && !board_info->use_rawchip_af)
-#endif
 		a_ctrl->set_info = cdata.cfg.set_info;
 		rc = a_ctrl->func_tbl.actuator_init_table(a_ctrl);
 		if (rc < 0)
@@ -282,7 +281,114 @@
 				 sizeof(struct msm_actuator_cfg_data)))
 			rc = -EFAULT;
 		break;
+	case CFG_SET_ACTUATOR_AF_ALGO:
+		a_ctrl->af_algo = cdata.cfg.af_algo;
+		rc = a_ctrl->func_tbl.actuator_init_table(a_ctrl);
+		if (rc < 0)
+			LERROR("%s init table failed %d\n", __func__, rc);
+		break;
 
+	case CFG_SET_OIS_MODE:
+		if (a_ctrl->actuator_ext_ctrl.is_ois_supported) {
+			if (a_ctrl->func_tbl.actuator_set_ois_mode != NULL) {
+				rc = a_ctrl->func_tbl.actuator_set_ois_mode(a_ctrl, cdata.cfg.ois_mode);
+				if (rc < 0)
+					LERROR("%s set ois mode failed %d\n", __func__, rc);
+			} else {
+				LERROR("%s a_ctrl->func_tbl.actuator_set_ois_mode is NULL\n", __func__);
+			}
+		} else {
+			LINFO("%s ois is not supported\n", __func__);
+		}
+		break;
+	case CFG_UPDATE_OIS_TBL:
+		if (a_ctrl->actuator_ext_ctrl.is_ois_supported) {
+			if (a_ctrl->func_tbl.actuator_update_ois_tbl != NULL) {
+				rc = a_ctrl->func_tbl.actuator_update_ois_tbl(a_ctrl, &(cdata.cfg.sensor_actuator_info));
+				if (rc < 0)
+					LERROR("%s update ois table failed %d\n", __func__, rc);
+			} else {
+				LERROR("%s a_ctrl->func_tbl.actuator_update_ois_tbl is NULL\n", __func__);
+			}
+		} else {
+			LINFO("%s ois is not supported\n", __func__);
+		}
+		break;
+	case CFG_GET_OIS_DEBUG_INFO:
+		if (a_ctrl->actuator_ext_ctrl.is_ois_supported) {
+			cdata.cfg.get_ois_info = a_ctrl->get_ois_info;
+			if (copy_to_user((void *)argp,
+				&cdata,
+				sizeof(struct msm_actuator_cfg_data)))
+			rc = -EFAULT;
+		} else {
+			LINFO("%s ois is not supported\n", __func__);
+		}
+		break;
+	case CFG_GET_OIS_DEBUG_TBL:
+		if (a_ctrl->actuator_ext_ctrl.is_ois_supported) {
+			cdata.cfg.get_ois_tbl = a_ctrl->get_ois_tbl;
+			if (copy_to_user((void *)argp,
+				&cdata,
+				sizeof(struct msm_actuator_cfg_data)))
+			rc = -EFAULT;
+		} else {
+			LINFO("%s ois is not supported\n", __func__);
+		}
+		break;
+	case CFG_SET_ACTUATOR_AF_VALUE:
+		if (a_ctrl->func_tbl.actuator_set_af_value != NULL) {
+			rc = a_ctrl->func_tbl.actuator_set_af_value(a_ctrl, cdata.cfg.af_value);
+			if (rc < 0)
+				LERROR("%s set af value failed %d\n", __func__, rc);
+		} else {
+			LERROR("%s a_ctrl->func_tbl.actuator_set_af_value is NULL\n", __func__);
+		}
+		break;
+	case CFG_SET_OIS_CALIBRATION:
+		if (a_ctrl->actuator_ext_ctrl.is_ois_supported) {
+			if (a_ctrl->func_tbl.actuator_set_ois_calibration != NULL) {
+				rc = a_ctrl->func_tbl.actuator_set_ois_calibration(a_ctrl, &cdata.cfg.get_osi_cal_info);
+				if (rc < 0) {
+					LERROR("%s set ois calibration failed %d\n", __func__, rc);
+				} else {
+					if (copy_to_user((void *)argp,
+						&cdata,
+						sizeof(struct msm_actuator_cfg_data)))
+						rc = -EFAULT;
+				}
+			} else {
+				LERROR("%s a_ctrl->func_tbl.actuator_set_ois_calibration is NULL\n", __func__);
+				rc = -EFAULT;
+			}
+		} else {
+			LINFO("%s ois is not supported\n", __func__);
+		}
+		break;
+	
+    case CFG_SET_VCM_CALIBRATION:
+        if (a_ctrl->actuator_ext_ctrl.is_cal_supported) {
+            if (a_ctrl->func_tbl.actuator_do_cal) {
+                rc = a_ctrl->func_tbl.actuator_do_cal (a_ctrl, &cdata.cfg.get_vcm_cal_info);
+                if (rc < 0) {
+                    LERROR("%s calibration failed %d\n", __func__, rc);
+                } else {
+                    if (copy_to_user((void *)argp,
+                        &cdata,
+                        sizeof(struct msm_actuator_cfg_data)))
+                        rc = -EFAULT;
+                }
+            }
+            else {
+                LERROR("%s a_ctrl->func_tbl.acturator_do_cal is NULL\n", __func__);
+                rc = -EFAULT;
+            }
+        }
+        else {
+            LINFO("%s cal is not supported\n", __func__);
+        }
+        break;
+	
 	default:
 		break;
 	}
diff --git a/drivers/media/video/msm/actuators/msm_actuator.h b/drivers/media/video/msm/actuators/msm_actuator.h
index daca93c..d71049d 100644
--- a/drivers/media/video/msm/actuators/msm_actuator.h
+++ b/drivers/media/video/msm/actuators/msm_actuator.h
@@ -38,9 +38,6 @@
 #define LINFO(fmt, args...) CDBG(fmt, ##args)
 #endif
 
-#ifdef CONFIG_RAWCHIP
-#define USE_RAWCHIP_AF
-#endif
 
 struct msm_actuator_ctrl_t;
 
@@ -68,6 +65,12 @@
 			struct damping_params_t *,
 			int8_t,
 			int16_t);
+	int32_t (*actuator_set_ois_mode) (struct msm_actuator_ctrl_t *, int);
+	int32_t (*actuator_update_ois_tbl) (struct msm_actuator_ctrl_t *, struct sensor_actuator_info_t *);
+	int32_t (*actuator_set_af_value) (struct msm_actuator_ctrl_t *, af_value_t);
+	int32_t (*actuator_set_ois_calibration) (struct msm_actuator_ctrl_t *, struct msm_actuator_get_ois_cal_info_t *);
+    int32_t (*actuator_do_cal)(struct msm_actuator_ctrl_t *, struct msm_actuator_get_vcm_cal_info_t *); 
+
 };
 
 struct msm_actuator_ctrl_t {
@@ -94,6 +97,12 @@
 	void *user_data;
 	uint32_t vcm_pwd;
 	uint32_t vcm_enable;
+	af_algo_t af_algo; 
+	int ois_ready_version; 
+	uint8_t ois_mfgtest_in_progress; 
+	struct msm_actuator_get_ois_info_t get_ois_info;
+	struct msm_actuator_get_ois_tbl_t get_ois_tbl;
+	struct msm_actuator_af_OTP_info_t af_OTP_info;
 };
 
 int32_t msm_actuator_i2c_write_b_af(struct msm_actuator_ctrl_t *a_ctrl,
diff --git a/drivers/media/video/msm/actuators/s5k3h2yx_act.c b/drivers/media/video/msm/actuators/s5k3h2yx_act.c
index d9c152a..56e354c 100644
--- a/drivers/media/video/msm/actuators/s5k3h2yx_act.c
+++ b/drivers/media/video/msm/actuators/s5k3h2yx_act.c
@@ -15,11 +15,8 @@
 #include "msm_camera_i2c.h"
 #include <mach/gpio.h>
 
-#ifdef USE_RAWCHIP_AF
-#define	S5K3H2YX_TOTAL_STEPS_NEAR_TO_FAR			256
-#else
 #define	S5K3H2YX_TOTAL_STEPS_NEAR_TO_FAR			52
-#endif
+#define S5K3H2YX_TOTAL_STEPS_NEAR_TO_FAR_RAWCHIP_AF                        256 
 
 #define REG_VCM_NEW_CODE			0x30F2
 #define REG_VCM_I2C_ADDR			0x18
@@ -108,11 +105,17 @@
 
 	if (a_ctrl->func_tbl.actuator_set_params)
 		a_ctrl->func_tbl.actuator_set_params(a_ctrl);
-
+#if 0
 	if (s5k3h2yx_act_t.step_position_table) {
 		LINFO("%s table inited\n", __func__);
 		return rc;
 	}
+#endif
+
+	if (s5k3h2yx_msm_actuator_info->use_rawchip_af && a_ctrl->af_algo == AF_ALGO_RAWCHIP)
+		a_ctrl->set_info.total_steps = S5K3H2YX_TOTAL_STEPS_NEAR_TO_FAR_RAWCHIP_AF;
+	else
+		a_ctrl->set_info.total_steps = S5K3H2YX_TOTAL_STEPS_NEAR_TO_FAR;
 
 	
 	if (a_ctrl->step_position_table != NULL) {
@@ -132,12 +135,10 @@
 
 		a_ctrl->step_position_table[0] = a_ctrl->initial_code;
 		for (i = 1; i <= a_ctrl->set_info.total_steps; i++) {
-#ifdef USE_RAWCHIP_AF
-			if (s5k3h2yx_msm_actuator_info->use_rawchip_af)
+			if (s5k3h2yx_msm_actuator_info->use_rawchip_af && a_ctrl->af_algo == AF_ALGO_RAWCHIP) 
 				a_ctrl->step_position_table[i] =
 					a_ctrl->step_position_table[i-1] + 4;
 			else
-#endif
 			{
 			if (i <= s5k3h2yx_nl_region_boundary1) {
 				a_ctrl->step_position_table[i] =
@@ -387,7 +388,7 @@
 	},
 
 	.set_info = {
-		.total_steps = S5K3H2YX_TOTAL_STEPS_NEAR_TO_FAR,
+		.total_steps = S5K3H2YX_TOTAL_STEPS_NEAR_TO_FAR_RAWCHIP_AF, 
 		.gross_steps = 3,	
 		.fine_steps = 1,	
 	},
@@ -396,6 +397,7 @@
 	.curr_region_index = 0,
 	.initial_code = 0,	
 	.actuator_mutex = &s5k3h2yx_act_mutex,
+	.af_algo = AF_ALGO_RAWCHIP, 
 
 	.func_tbl = {
 		.actuator_init_table = s5k3h2yx_msm_actuator_init_table,
diff --git a/drivers/media/video/msm/csi/Makefile b/drivers/media/video/msm/csi/Makefile
index 6e8eb122..92c82809 100644
--- a/drivers/media/video/msm/csi/Makefile
+++ b/drivers/media/video/msm/csi/Makefile
@@ -2,3 +2,4 @@
 EXTRA_CFLAGS += -Idrivers/media/video/msm
 obj-$(CONFIG_ARCH_MSM8960) += msm_csiphy.o msm_csid.o msm_ispif.o
 obj-$(CONFIG_ARCH_MSM7X27A) += msm_csic.o
+obj-$(CONFIG_ARCH_MSM8X60) += msm_csic.o msm_ispif.o
diff --git a/drivers/media/video/msm/csi/msm_csid.c b/drivers/media/video/msm/csi/msm_csid.c
index 91ac3a5..39bc0ff 100644
--- a/drivers/media/video/msm/csi/msm_csid.c
+++ b/drivers/media/video/msm/csi/msm_csid.c
@@ -51,8 +51,10 @@
 #define CSID_TG_DT_n_CFG_1_ADDR                     0xAC
 #define CSID_TG_DT_n_CFG_2_ADDR                     0xB0
 #define CSID_TG_DT_n_CFG_3_ADDR                     0xD8
+#define CSID_RST_DONE_IRQ_BITSHIFT                  11
+#define CSID_RST_STB_ALL                            0x7FFF
 
-#define DBG_CSID 0
+#define DBG_CSID 1
 
 static int msm_csid_cid_lut(
 	struct msm_camera_csid_lut_params *csid_lut_params,
@@ -88,8 +90,8 @@
 {
 	uint32_t val = 0;
 	val = ((1 << csid_params->lane_cnt) - 1) << 20;
-	msm_camera_io_w(0x7f010800 | val, csidbase + CSID_IRQ_MASK_ADDR);
-	msm_camera_io_w(0x7f010800 | val, csidbase + CSID_IRQ_CLEAR_CMD_ADDR);
+	msm_io_w(0x7f010800 | val, csidbase + CSID_IRQ_MASK_ADDR);
+	msm_io_w(0x7f010800 | val, csidbase + CSID_IRQ_CLEAR_CMD_ADDR);
 }
 #else
 static void msm_csid_set_debug_reg(void __iomem *csidbase,
@@ -131,11 +133,21 @@
 	uint32_t irq;
 	struct csid_device *csid_dev = data;
 	irq = msm_io_r(csid_dev->base + CSID_IRQ_STATUS_ADDR);
-	CDBG("%s CSID_IRQ_STATUS_ADDR = 0x%x\n", __func__, irq);
+	pr_info("%s CSID%d_IRQ_STATUS_ADDR = 0x%x\n",
+		 __func__, csid_dev->pdev->id, irq);
+	if (irq & (0x1 << CSID_RST_DONE_IRQ_BITSHIFT))
+			complete(&csid_dev->reset_complete);
 	msm_io_w(irq, csid_dev->base + CSID_IRQ_CLEAR_CMD_ADDR);
 	return IRQ_HANDLED;
 }
 
+static void msm_csid_reset(struct csid_device *csid_dev)
+{
+	msm_io_w(CSID_RST_STB_ALL, csid_dev->base + CSID_RST_CMD_ADDR);
+	wait_for_completion_interruptible(&csid_dev->reset_complete);
+	return;
+}
+
 static int msm_csid_subdev_g_chip_ident(struct v4l2_subdev *sd,
 			struct v4l2_dbg_chip_ident *chip)
 {
@@ -146,10 +158,6 @@
 }
 
 static struct msm_cam_clk_info csid_clk_info[] = {
-	{"csi_src_clk", 177780000},
-	{"csi_clk", -1},
-	{"csi_phy_clk", -1},
-	{"csi_pclk", -1},
 };
 
 static int msm_csid_init(struct v4l2_subdev *sd, uint32_t *csid_version)
@@ -174,7 +182,8 @@
 	if (rc < 0) {
 		iounmap(csid_dev->base);
 		csid_dev->base = NULL;
-		return rc;
+		pr_err("%s: regulator enable failed\n", __func__);
+		goto clk_enable_failed;
 	}
 
 #if DBG_CSID
@@ -186,11 +195,25 @@
 
 	*csid_version = csid_dev->hw_version;
 
-	return 0;
+	init_completion(&csid_dev->reset_complete);
+
+	rc = request_irq(csid_dev->irq->start, msm_csid_irq,
+		IRQF_TRIGGER_RISING, "csid", csid_dev);
+
+	msm_csid_reset(csid_dev);
+	pr_info("%s:%d\n", __func__, __LINE__);
+	return rc;
+
+clk_enable_failed:
+	iounmap(csid_dev->base);
+	csid_dev->base = NULL;
+	pr_info("%s:%d\n", __func__, __LINE__);
+	return rc;
 }
 
 static int msm_csid_release(struct v4l2_subdev *sd)
 {
+	uint32_t irq;
 	struct csid_device *csid_dev;
 	csid_dev = v4l2_get_subdevdata(sd);
 
@@ -198,6 +221,12 @@
 	disable_irq(csid_dev->irq->start);
 #endif
 
+	irq = msm_io_r(csid_dev->base + CSID_IRQ_STATUS_ADDR);
+	msm_io_w(irq, csid_dev->base + CSID_IRQ_CLEAR_CMD_ADDR);
+	msm_io_w(0, csid_dev->base + CSID_IRQ_MASK_ADDR);
+
+	free_irq(csid_dev->irq->start, csid_dev);
+
 	msm_cam_clk_enable(&csid_dev->pdev->dev, csid_clk_info,
 		csid_dev->csid_clk, ARRAY_SIZE(csid_clk_info), 0);
 
@@ -209,19 +238,29 @@
 static long msm_csid_subdev_ioctl(struct v4l2_subdev *sd,
 			unsigned int cmd, void *arg)
 {
+	int rc = -ENOIOCTLCMD;
 	struct csid_cfg_params cfg_params;
+	struct csid_device *csid_dev = v4l2_get_subdevdata(sd);
+
+	mutex_lock(&csid_dev->mutex);
 	switch (cmd) {
 	case VIDIOC_MSM_CSID_CFG:
 		cfg_params.subdev = sd;
 		cfg_params.parms = arg;
-		return msm_csid_config((struct csid_cfg_params *)&cfg_params);
+		rc = msm_csid_config((struct csid_cfg_params *)&cfg_params);
+		break;
 	case VIDIOC_MSM_CSID_INIT:
-		return msm_csid_init(sd, (uint32_t *)arg);
+		rc = msm_csid_init(sd, (uint32_t *)arg);
+		break;
 	case VIDIOC_MSM_CSID_RELEASE:
-		return msm_csid_release(sd);
+		rc = msm_csid_release(sd);
+		break;
 	default:
-		return -ENOIOCTLCMD;
+		pr_err("%s: command not found\n", __func__);
 	}
+	mutex_unlock(&csid_dev->mutex);
+
+	return rc;
 }
 static const struct v4l2_subdev_internal_ops msm_csid_internal_ops;
 
@@ -277,28 +316,6 @@
 		goto csid_no_resource;
 	}
 
-	rc = request_irq(new_csid_dev->irq->start, msm_csid_irq,
-		IRQF_TRIGGER_RISING, "csid", new_csid_dev);
-	if (rc < 0) {
-		release_mem_region(new_csid_dev->mem->start,
-			resource_size(new_csid_dev->mem));
-		pr_err("%s: irq request fail\n", __func__);
-		rc = -EBUSY;
-		goto csid_no_resource;
-	}
-	disable_irq(new_csid_dev->irq->start);
-
-	new_csid_dev->base = ioremap(new_csid_dev->mem->start,
-		resource_size(new_csid_dev->mem));
-	if (!new_csid_dev->base) {
-		rc = -ENOMEM;
-		goto csid_no_resource;
-	}
-
-	new_csid_dev->hw_version =
-		msm_io_r(new_csid_dev->base + CSID_HW_VERSION_ADDR);
-	iounmap(new_csid_dev->base);
-
 	new_csid_dev->pdev = pdev;
 	
 	msm_cam_register_subdev_node(&new_csid_dev->subdev, CSID_DEV, pdev->id);
diff --git a/drivers/media/video/msm/csi/msm_csid.h b/drivers/media/video/msm/csi/msm_csid.h
index f90abf2..46061eb 100644
--- a/drivers/media/video/msm/csi/msm_csid.h
+++ b/drivers/media/video/msm/csi/msm_csid.h
@@ -27,6 +27,9 @@
 	struct mutex mutex;
 	uint32_t hw_version;
 
+	struct regulator *csi_vdd;
+	struct completion reset_complete;
+
 	struct clk *csid_clk[5];
 };
 
diff --git a/drivers/media/video/msm/csi/msm_csiphy.c b/drivers/media/video/msm/csi/msm_csiphy.c
index 67c814f..da0ad6d 100644
--- a/drivers/media/video/msm/csi/msm_csiphy.c
+++ b/drivers/media/video/msm/csi/msm_csiphy.c
@@ -21,7 +21,7 @@
 #include "msm_csiphy.h"
 #include "msm.h"
 
-#define DBG_CSIPHY 0
+#define DBG_CSIPHY 1
 
 #define V4L2_IDENT_CSIPHY                        50003
 
@@ -38,6 +38,8 @@
 #define MIPI_CSIPHY_LNCK_MISC1_ADDR              0x128
 #define MIPI_CSIPHY_GLBL_T_INIT_CFG0_ADDR        0x1E0
 #define MIPI_CSIPHY_T_WAKEUP_CFG0_ADDR           0x1E8
+#define MIPI_CSIPHY_T_WAKEUP_CFG1_ADDR           0x1EC
+#define MIPI_CSIPHY_GLBL_RESET_ADDR             0x0140
 #define MIPI_CSIPHY_GLBL_PWR_CFG_ADDR           0x0144
 #define MIPI_CSIPHY_INTERRUPT_STATUS0_ADDR      0x0180
 #define MIPI_CSIPHY_INTERRUPT_STATUS1_ADDR      0x0184
@@ -60,6 +62,8 @@
 	int rc = 0;
 	int i = 0;
 	uint32_t val = 0;
+	uint8_t lane_cnt = 0, lane_mask = 0;
+
 	struct csiphy_device *csiphy_dev;
 	struct msm_camera_csiphy_params *csiphy_params;
 	void __iomem *csiphybase;
@@ -69,6 +73,10 @@
 		return -ENOMEM;
 	
 	csiphy_params = cfg_params->parms;
+
+	lane_mask = csiphy_params->lane_mask;
+	lane_cnt = csiphy_params->lane_cnt;
+
 	if (csiphy_params->lane_cnt < 1 || csiphy_params->lane_cnt > 4) {
 		CDBG("%s: unsupported lane cnt %d\n",
 			__func__, csiphy_params->lane_cnt);
@@ -96,12 +104,7 @@
 	msm_io_w(0x24,
 		csiphybase + MIPI_CSIPHY_INTERRUPT_CLEAR0_ADDR);
 
-	for (i = 1; i <= csiphy_params->lane_cnt; i++) {
-		msm_io_w(0x6F,
-			csiphybase + MIPI_CSIPHY_INTERRUPT_MASK0_ADDR + 0x4*i);
-		msm_io_w(0x6F,
-			csiphybase + MIPI_CSIPHY_INTERRUPT_CLEAR0_ADDR + 0x4*i);
-	}
+	
 	return rc;
 }
 
@@ -111,24 +114,36 @@
 	struct csiphy_device *csiphy_dev = data;
 	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS0_ADDR);
 	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR0_ADDR);
-	CDBG("%s MIPI_CSIPHY_INTERRUPT_STATUS0 = 0x%x\n", __func__, irq);
+	pr_info("%s MIPI_CSIPHY%d_INTERRUPT_STATUS0 = 0x%x\n",
+		__func__, csiphy_dev->pdev->id, irq);
 	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS1_ADDR);
 	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR1_ADDR);
-	CDBG("%s MIPI_CSIPHY_INTERRUPT_STATUS1 = 0x%x\n", __func__, irq);
+	pr_info("%s MIPI_CSIPHY%d_INTERRUPT_STATUS1 = 0x%x\n",
+		__func__, csiphy_dev->pdev->id, irq);
 	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS2_ADDR);
 	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR2_ADDR);
-	CDBG("%s MIPI_CSIPHY_INTERRUPT_STATUS2 = 0x%x\n", __func__, irq);
+	pr_info("%s MIPI_CSIPHY%d_INTERRUPT_STATUS2 = 0x%x\n",
+		__func__, csiphy_dev->pdev->id, irq);
 	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS3_ADDR);
 	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR3_ADDR);
-	CDBG("%s MIPI_CSIPHY_INTERRUPT_STATUS3 = 0x%x\n", __func__, irq);
+	pr_info("%s MIPI_CSIPHY%d_INTERRUPT_STATUS3 = 0x%x\n",
+		__func__, csiphy_dev->pdev->id, irq);
 	irq = msm_io_r(csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_STATUS4_ADDR);
 	msm_io_w(irq, csiphy_dev->base + MIPI_CSIPHY_INTERRUPT_CLEAR4_ADDR);
-	CDBG("%s MIPI_CSIPHY_INTERRUPT_STATUS4 = 0x%x\n", __func__, irq);
+	pr_info("%s MIPI_CSIPHY%d_INTERRUPT_STATUS4 = 0x%x\n",
+		__func__, csiphy_dev->pdev->id, irq);
 	msm_io_w(0x1, csiphy_dev->base + 0x164);
 	msm_io_w(0x0, csiphy_dev->base + 0x164);
 	return IRQ_HANDLED;
 }
 
+static void msm_csiphy_reset(struct csiphy_device *csiphy_dev)
+{
+	msm_io_w(0x1, csiphy_dev->base + MIPI_CSIPHY_GLBL_RESET_ADDR);
+	usleep_range(5000, 8000);
+	msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_GLBL_RESET_ADDR);
+}
+
 static int msm_csiphy_subdev_g_chip_ident(struct v4l2_subdev *sd,
 			struct v4l2_dbg_chip_ident *chip)
 {
@@ -141,6 +156,14 @@
 static struct msm_cam_clk_info csiphy_clk_info[] = {
 	{"csiphy_timer_src_clk", 177780000},
 	{"csiphy_timer_clk", -1},
+	{"csi_src_clk", 177780000},
+	{"csi_phy_clk", -1},
+	{"csi_clk", -1},
+	{"csi_pclk", -1},
+};
+
+static struct camera_vreg_t csiphy_8960_vreg_info[] = {
+	{"mipi_csi_vdd", REG_LDO, 1200000, 1200000, 20000},
 };
 
 static int msm_csiphy_init(struct v4l2_subdev *sd)
@@ -160,6 +183,22 @@
 		return rc;
 	}
 
+	rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev,
+		csiphy_8960_vreg_info, ARRAY_SIZE(csiphy_8960_vreg_info),
+		&csiphy_dev->csi_vdd, 1);
+	if (rc < 0) {
+		pr_err("%s: regulator on failed\n", __func__);
+		
+	}
+
+	rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
+		csiphy_8960_vreg_info, ARRAY_SIZE(csiphy_8960_vreg_info),
+		&csiphy_dev->csi_vdd, 1);
+	if (rc < 0) {
+		pr_err("%s: regulator enable failed\n", __func__);
+		
+	}
+
 	rc = msm_cam_clk_enable(&csiphy_dev->pdev->dev, csiphy_clk_info,
 			csiphy_dev->csiphy_clk, ARRAY_SIZE(csiphy_clk_info), 1);
 
@@ -173,6 +212,8 @@
 	enable_irq(csiphy_dev->irq->start);
 #endif
 
+	msm_csiphy_reset(csiphy_dev);
+
 	return 0;
 }
 
@@ -188,12 +229,26 @@
 	msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_LNCK_CFG2_ADDR);
 	msm_io_w(0x0, csiphy_dev->base + MIPI_CSIPHY_GLBL_PWR_CFG_ADDR);
 
-	msm_cam_clk_enable(&csiphy_dev->pdev->dev, csiphy_clk_info,
-		csiphy_dev->csiphy_clk, ARRAY_SIZE(csiphy_clk_info), 0);
-
 #if DBG_CSIPHY
 	disable_irq(csiphy_dev->irq->start);
 #endif
+
+	
+
+	pr_info("%s MIPI_CSIPHY_GLBL_PWR_CFG_ADDR=0x%x",
+		__func__, msm_io_r(csiphy_dev->base + MIPI_CSIPHY_GLBL_PWR_CFG_ADDR));
+
+	msm_camera_enable_vreg(&csiphy_dev->pdev->dev,
+		csiphy_8960_vreg_info, ARRAY_SIZE(csiphy_8960_vreg_info),
+		&csiphy_dev->csi_vdd, 0);
+
+	msm_camera_config_vreg(&csiphy_dev->pdev->dev,
+		csiphy_8960_vreg_info, ARRAY_SIZE(csiphy_8960_vreg_info),
+		&csiphy_dev->csi_vdd, 0);
+
+	msm_cam_clk_enable(&csiphy_dev->pdev->dev, csiphy_clk_info,
+		csiphy_dev->csiphy_clk, ARRAY_SIZE(csiphy_clk_info), 0);
+
 	iounmap(csiphy_dev->base);
 	csiphy_dev->base = NULL;
 	return 0;
@@ -202,20 +257,30 @@
 static long msm_csiphy_subdev_ioctl(struct v4l2_subdev *sd,
 			unsigned int cmd, void *arg)
 {
+	int rc = -ENOIOCTLCMD;
 	struct csiphy_cfg_params cfg_params;
+	struct csiphy_device *csiphy_dev = v4l2_get_subdevdata(sd);
+
+	mutex_lock(&csiphy_dev->mutex);
 	switch (cmd) {
 	case VIDIOC_MSM_CSIPHY_CFG:
 		cfg_params.subdev = sd;
 		cfg_params.parms = arg;
-		return msm_csiphy_config(
+		rc = msm_csiphy_config(
 			(struct csiphy_cfg_params *)&cfg_params);
+		break;
 	case VIDIOC_MSM_CSIPHY_INIT:
-		return msm_csiphy_init(sd);
+		rc = msm_csiphy_init(sd);
+		break;
 	case VIDIOC_MSM_CSIPHY_RELEASE:
-		return msm_csiphy_release(sd);
+		rc = msm_csiphy_release(sd);
+		break;
 	default:
-		return -ENOIOCTLCMD;
+		pr_err("%s: command not found\n", __func__);
 	}
+	mutex_unlock(&csiphy_dev->mutex);
+
+	return rc;
 }
 static const struct v4l2_subdev_internal_ops msm_csiphy_internal_ops;
 
diff --git a/drivers/media/video/msm/csi/msm_csiphy.h b/drivers/media/video/msm/csi/msm_csiphy.h
index 522a1c1..2ada33c 100644
--- a/drivers/media/video/msm/csi/msm_csiphy.h
+++ b/drivers/media/video/msm/csi/msm_csiphy.h
@@ -25,8 +25,8 @@
 	struct resource *io;
 	void __iomem *base;
 	struct mutex mutex;
-
-	struct clk *csiphy_clk[2];
+	struct clk *csiphy_clk[6];
+	struct regulator *csi_vdd;
 };
 
 struct csiphy_cfg_params {
diff --git a/drivers/media/video/msm/flash.c b/drivers/media/video/msm/flash.c
index 835cb7e..f61b214 100644
--- a/drivers/media/video/msm/flash.c
+++ b/drivers/media/video/msm/flash.c
@@ -164,6 +164,9 @@
 		case MSM_CAMERA_LED_LOW:
 			flash_level = FL_MODE_PRE_FLASH;
 			break;
+                case MSM_CAMERA_LED_VIDEO:
+			flash_level = FL_MODE_VIDEO_TORCH;
+			break;
 		case MSM_CAMERA_LED_OFF:
 		case MSM_CAMERA_LED_INIT:
 		case MSM_CAMERA_LED_RELEASE:
diff --git a/drivers/media/video/msm/gemini/msm_gemini_hw.c b/drivers/media/video/msm/gemini/msm_gemini_hw.c
index 19bf063..c238439 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_hw.c
+++ b/drivers/media/video/msm/gemini/msm_gemini_hw.c
@@ -425,7 +425,7 @@
 	}
 }
 
-int msm_gemini_hw_exec_cmds(struct msm_gemini_hw_cmd *hw_cmd_p, uint32_t m_cmds)
+int msm_gemini_hw_exec_cmds(struct msm_gemini_hw_cmd *hw_cmd_p, int m_cmds)
 {
 	int is_copy_to_user = -1;
 	uint32_t data;
diff --git a/drivers/media/video/msm/gemini/msm_gemini_hw.h b/drivers/media/video/msm/gemini/msm_gemini_hw.h
index 6fac7c8..3aba612 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_hw.h
+++ b/drivers/media/video/msm/gemini/msm_gemini_hw.h
@@ -94,7 +94,7 @@
 void msm_gemini_hw_write(struct msm_gemini_hw_cmd *hw_cmd_p);
 int msm_gemini_hw_wait(struct msm_gemini_hw_cmd *hw_cmd_p, int m_us);
 void msm_gemini_hw_delay(struct msm_gemini_hw_cmd *hw_cmd_p, int m_us);
-int msm_gemini_hw_exec_cmds(struct msm_gemini_hw_cmd *hw_cmd_p, uint32_t m_cmds);
+int msm_gemini_hw_exec_cmds(struct msm_gemini_hw_cmd *hw_cmd_p, int m_cmds);
 void msm_gemini_hw_region_dump(int size);
 
 #define MSM_GEMINI_PIPELINE_CLK_128MHZ 128 
diff --git a/drivers/media/video/msm/gemini/msm_gemini_platform.c b/drivers/media/video/msm/gemini/msm_gemini_platform.c
index 2d846d0..93dbd32 100644
--- a/drivers/media/video/msm/gemini/msm_gemini_platform.c
+++ b/drivers/media/video/msm/gemini/msm_gemini_platform.c
@@ -148,11 +148,13 @@
 			goto fail2;
 		}
 	} else {
+#ifndef CONFIG_ARCH_MSM8X60
 		rc = msm_cam_clk_enable(&pgmn_dev->pdev->dev,
 				gemini_imem_clk_info, &pgmn_dev->gemini_clk[2],
 				ARRAY_SIZE(gemini_imem_clk_info), 1);
 		if (!rc)
 			pgmn_dev->hw_version = GEMINI_8960;
+#endif 
 	}
 
 	if (pgmn_dev->hw_version != GEMINI_7X) {
diff --git a/drivers/media/video/msm/io/msm_camera_i2c.c b/drivers/media/video/msm/io/msm_camera_i2c.c
index 6fd656a..5838626 100644
--- a/drivers/media/video/msm/io/msm_camera_i2c.c
+++ b/drivers/media/video/msm/io/msm_camera_i2c.c
@@ -12,6 +12,32 @@
 
 #include "msm_camera_i2c.h"
 
+#if defined(CONFIG_MACH_MONARUDO) || defined(CONFIG_MACH_DELUXE_J) || defined(CONFIG_MACH_DELUXE_R) || defined(CONFIG_MACH_IMPRESSION_J)\
+			|| defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY)
+
+#define MAX_I2C_RETRIES 20
+
+static int i2c_transfer_retry(struct i2c_adapter *adap,
+			struct i2c_msg *msgs,
+			int len)
+{
+	int i2c_retry = 0;
+	int ns; 
+
+	while (i2c_retry++ < MAX_I2C_RETRIES) {
+		ns = i2c_transfer(adap, msgs, len);
+		if (ns == len)
+			break;
+		pr_err("[CAM]%s: try %d/%d: i2c_transfer sent: %d, len %d\n",
+			__func__,
+			i2c_retry, MAX_I2C_RETRIES, ns, len);
+		msleep(10);
+	}
+
+	return ns == len ? 0 : -EIO;
+}
+#endif
+
 int32_t msm_camera_i2c_rxdata(struct msm_camera_i2c_client *dev_client,
 	unsigned char *rxdata, int data_length)
 {
@@ -31,7 +57,12 @@
 			.buf   = rxdata,
 		},
 	};
+#if defined(CONFIG_MACH_MONARUDO) || defined(CONFIG_MACH_DELUXE_J) || defined(CONFIG_MACH_DELUXE_R) || defined(CONFIG_MACH_IMPRESSION_J)\
+		|| defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY)
+	rc = i2c_transfer_retry(dev_client->client->adapter, msgs, 2);
+#else
 	rc = i2c_transfer(dev_client->client->adapter, msgs, 2);
+#endif
 	if (rc < 0)
 		S_I2C_DBG("msm_camera_i2c_rxdata failed 0x%x\n", saddr);
 	return rc;
@@ -50,7 +81,13 @@
 			.buf = txdata,
 		 },
 	};
+#if defined(CONFIG_MACH_MONARUDO) || defined(CONFIG_MACH_DELUXE_J) || defined(CONFIG_MACH_DELUXE_R) || defined(CONFIG_MACH_IMPRESSION_J)\
+			|| defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY)
+	rc = i2c_transfer_retry(dev_client->client->adapter, msg, 1);
+#else
 	rc = i2c_transfer(dev_client->client->adapter, msg, 1);
+#endif
+
 	if (rc < 0)
 		S_I2C_DBG("msm_camera_i2c_txdata faild 0x%x\n", saddr);
 	return 0;
@@ -590,4 +627,81 @@
 	return rc;
 }
 
+int32_t msm_camera_i2c_rxdata_rumbas(struct msm_camera_i2c_client *dev_client,
+	unsigned char *rxdata, int data_length)
+{
+	int32_t rc = 0;
+	uint16_t saddr = dev_client->client->addr >> 1;
+	struct i2c_msg msgs[] = {
+		{
+			.addr  = saddr,
+			.flags = 0,
+			.len   = data_length,
+			.buf   = rxdata,
+		},
+		{
+			.addr  = saddr,
+			.flags = I2C_M_RD,
+			.len   = data_length,
+			.buf   = rxdata,
+		},
+	};
+	rc = i2c_transfer(dev_client->client->adapter, msgs, 2);
+	if (rc < 0)
+		S_I2C_DBG("msm_camera_i2c_rxdata failed 0x%x\n", saddr);
+	return (rc < 0) ? rc : 0;
+}
 
+
+int32_t msm_camera_i2c_read_seq_rumbas(struct msm_camera_i2c_client *client,
+	uint16_t addr, uint8_t *data, uint16_t num_byte)
+{
+	int32_t rc = -EFAULT;
+	unsigned char buf[client->addr_type+num_byte];
+	int i;
+
+	memset(buf, 0, sizeof(buf));
+	if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR
+		&& client->addr_type != MSM_CAMERA_I2C_WORD_ADDR)
+		|| num_byte == 0)
+		return rc;
+
+	if (client->addr_type == MSM_CAMERA_I2C_BYTE_ADDR) {
+		buf[0] = addr;
+	} else if (client->addr_type == MSM_CAMERA_I2C_WORD_ADDR) {
+		buf[0] = addr >> BITS_PER_BYTE;
+		buf[1] = addr;
+	}
+
+	rc = msm_camera_i2c_rxdata_rumbas(client, buf, num_byte);
+	if (rc < 0) {
+		S_I2C_DBG("%s fail\n", __func__);
+		return rc;
+	}
+
+	S_I2C_DBG("%s addr = 0x%x", __func__, addr);
+	for (i = 0; i < num_byte; i++) {
+		data[i] = buf[i];
+		S_I2C_DBG("Byte %d: 0x%x\n", i, buf[i]);
+		S_I2C_DBG("Data: 0x%x\n", data[i]);
+	}
+	return rc;
+}
+
+int32_t msm_camera_i2c_txdata_rumbas(struct msm_camera_i2c_client *dev_client, unsigned char *txdata, int length)
+{
+	int32_t rc = 0;
+	uint16_t saddr = dev_client->client->addr >> 1;
+
+	struct i2c_msg msg[] = {
+		{
+			.addr = saddr,
+			.flags = 0,
+			.len = length,
+			.buf = txdata,
+		 },
+	};
+	rc = i2c_transfer(dev_client->client->adapter, msg, 1);
+	
+	return rc;
+}
diff --git a/drivers/media/video/msm/io/msm_camera_i2c.h b/drivers/media/video/msm/io/msm_camera_i2c.h
index 75dd986..48cd3bc 100644
--- a/drivers/media/video/msm/io/msm_camera_i2c.h
+++ b/drivers/media/video/msm/io/msm_camera_i2c.h
@@ -128,4 +128,8 @@
 
 int32_t msm_sensor_write_all_conf_array(struct msm_camera_i2c_client *client,
 	struct msm_camera_i2c_conf_array *array, uint16_t size);
+int32_t msm_camera_i2c_read_seq_rumbas(struct msm_camera_i2c_client *client,
+	uint16_t addr, uint8_t *data, uint16_t num_byte);
+int32_t msm_camera_i2c_txdata_rumbas(struct msm_camera_i2c_client *client,
+	unsigned char *txdata, int length);
 #endif
diff --git a/drivers/media/video/msm/io/msm_io_util.c b/drivers/media/video/msm/io/msm_io_util.c
index dfa543f..72ed2c2 100644
--- a/drivers/media/video/msm/io/msm_io_util.c
+++ b/drivers/media/video/msm/io/msm_io_util.c
@@ -18,6 +18,8 @@
 #include <mach/camera.h>
 #include <mach/gpiomux.h>
 
+#define BUFF_SIZE_128 128
+
 int msm_cam_clk_enable(struct device *dev, struct msm_cam_clk_info *clk_info,
 		struct clk **clk_ptr, int num_clk, int enable)
 {
@@ -299,3 +301,31 @@
 	}
 	return rc;
 }
+
+void msm_csi_io_dump(void __iomem *addr, int size)
+{
+	char line_str[BUFF_SIZE_128], *p_str;
+	int i;
+	u32 *p = (u32 *) addr;
+	u32 data;
+	pr_err("%s: %p %d\n", __func__, addr, size);
+	line_str[0] = '\0';
+	p_str = line_str;
+	for (i = 0; i < size/4; i++) {
+		if (i % 4 == 0) {
+			snprintf(p_str, 12, "%08x: ", (u32) p);
+			p_str += 10;
+		}
+		data = readl_relaxed(p++);
+		snprintf(p_str, 12, "%08x ", data);
+		p_str += 9;
+		if ((i + 1) % 4 == 0) {
+			pr_err("%s\n", line_str);
+			line_str[0] = '\0';
+			p_str = line_str;
+		}
+	}
+	if (line_str[0] != '\0')
+		pr_err("%s\n", line_str);
+}
+
diff --git a/drivers/media/video/msm/msm.c b/drivers/media/video/msm/msm.c
index ffe0842..b1ce82d 100644
--- a/drivers/media/video/msm/msm.c
+++ b/drivers/media/video/msm/msm.c
@@ -48,6 +48,15 @@
 static dev_t msm_devno;
 static int vnode_count;
 
+static struct cam_vcm_wa_ctrl g_vcm_wa_ctl;
+DEFINE_MUTEX(cam_vcm_on_mut);
+static enum cam_vcm_onoff_type cam_vcm_on = STATUS_OFF;
+static enum cam_vcm_onoff_type camera_on = STATUS_OFF;
+static struct workqueue_struct *cam_vcm_off_wq;
+static struct work_struct cam_vcm_off_work;
+static int is_actuator_probe_success = 0;
+static void cam_on_check_vcm(void);
+
 module_param(msm_camera_v4l2_nr, uint, 0644);
 MODULE_PARM_DESC(msm_camera_v4l2_nr, "videoX start number, -1 is autodetect");
 
@@ -344,7 +353,7 @@
 	D("Waiting for config status\n");
 
 wait_event:
-	rc = wait_event_interruptible_timeout(queue->wait,
+	rc = wait_event_timeout(queue->wait,
 		!list_empty_careful(&queue->list),
 		msecs_to_jiffies(out->timeout_ms));
 	D("Waiting is over for config status\n");
@@ -358,6 +367,13 @@
 			goto wait_event;
 		}
 		else if (rc < 0) {
+			
+			struct msm_cam_media_controller *pmctl = NULL;
+			struct msm_sensor_ctrl_t *s_ctrl = NULL;
+			pmctl = msm_camera_get_mctl(pcam->mctl_handle);
+			if (pmctl)
+				s_ctrl = get_sctrl(pmctl->sensor_sdev);
+			
 			if (++server_dev->server_evt_id == 0)
 				server_dev->server_evt_id++;
 			pr_err("%s: wait_event error %d\n", __func__, rc);
@@ -369,7 +385,17 @@
 						((struct msm_ctrl_cmd *)out->value)->type);
 			}
 			
+			
+			if(s_ctrl && s_ctrl->sensor_first_mutex)  {
+				mutex_lock(s_ctrl->sensor_first_mutex);
+			}
+			
 			msm_cam_stop_hardware(pcam);
+			
+			if(s_ctrl && s_ctrl->sensor_first_mutex)  {
+				mutex_unlock(s_ctrl->sensor_first_mutex);
+			}
+			
 
 			return rc;
 		}
@@ -420,7 +446,7 @@
 
 	memset(&ctrlcmd, 0, sizeof(ctrlcmd)); 
 	ctrlcmd.type	   = MSM_V4L2_OPEN;
-	ctrlcmd.timeout_ms = 10000;
+	ctrlcmd.timeout_ms = 20000;
 	ctrlcmd.length	 = strnlen(g_server_dev.config_info.config_dev_name[0],
 				MAX_DEV_NAME_LEN)+1;
 	ctrlcmd.value    = (char *)g_server_dev.config_info.config_dev_name[0];
@@ -442,7 +468,7 @@
 
 	memset(&ctrlcmd, 0, sizeof(ctrlcmd)); 
 	ctrlcmd.type	   = MSM_V4L2_CLOSE;
-	ctrlcmd.timeout_ms = 10000;
+	ctrlcmd.timeout_ms = 20000;
 	ctrlcmd.length	 = strnlen(g_server_dev.config_info.config_dev_name[0],
 				MAX_DEV_NAME_LEN)+1;
 	ctrlcmd.value    = (char *)g_server_dev.config_info.config_dev_name[0];
@@ -557,7 +583,7 @@
 	ctrlcmd.type       = MSM_V4L2_VID_CAP_TYPE;
 	ctrlcmd.length     = sizeof(struct img_plane_info);
 	ctrlcmd.value      = (void *)&plane_info;
-	ctrlcmd.timeout_ms = 10000;
+	ctrlcmd.timeout_ms = 20000;
 	ctrlcmd.vnode_id   = pcam->vnode_id;
 	ctrlcmd.queue_idx = pcam->server_queue_idx;
 
@@ -585,7 +611,7 @@
 
 	memset(&ctrlcmd, 0, sizeof(ctrlcmd)); 
 	ctrlcmd.type	   = MSM_V4L2_STREAM_ON;
-	ctrlcmd.timeout_ms = 10000;
+	ctrlcmd.timeout_ms = 6000;
 	ctrlcmd.length	 = 0;
 	ctrlcmd.value    = NULL;
 	ctrlcmd.stream_type = pcam->dev_inst[idx]->image_mode;
@@ -608,7 +634,7 @@
 	D("%s, pcam = 0x%x\n", __func__, (u32)pcam);
 	memset(&ctrlcmd, 0, sizeof(ctrlcmd));  
 	ctrlcmd.type        = MSM_V4L2_STREAM_OFF;
-	ctrlcmd.timeout_ms  = 10000;
+	ctrlcmd.timeout_ms  = 20000;
 	ctrlcmd.length      = 0;
 	ctrlcmd.value       = NULL;
 	ctrlcmd.stream_type = pcam->dev_inst[idx]->image_mode;
@@ -674,7 +700,7 @@
 	if (tmp_cmd->timeout_ms > 0)
 		ctrlcmd.timeout_ms = tmp_cmd->timeout_ms;
 	else
-		ctrlcmd.timeout_ms = 1000;
+		ctrlcmd.timeout_ms = 2000;
 	ctrlcmd.vnode_id = pcam->vnode_id;
 	ctrlcmd.queue_idx = pcam->server_queue_idx;
 	ctrlcmd.config_ident = g_server_dev.config_info.config_dev_id[0];
@@ -730,7 +756,7 @@
 	ctrlcmd.length = sizeof(struct v4l2_control);
 	ctrlcmd.value = (void *)ctrl_data;
 	memcpy(ctrlcmd.value, ctrl, ctrlcmd.length);
-	ctrlcmd.timeout_ms = 1000;
+	ctrlcmd.timeout_ms = 2000;
 	ctrlcmd.vnode_id = pcam->vnode_id;
 	ctrlcmd.queue_idx = pcam->server_queue_idx;
 	ctrlcmd.config_ident = g_server_dev.config_info.config_dev_id[0];
@@ -763,7 +789,7 @@
 	ctrlcmd.length = sizeof(struct v4l2_control);
 	ctrlcmd.value = (void *)ctrl_data;
 	memcpy(ctrlcmd.value, ctrl, ctrlcmd.length);
-	ctrlcmd.timeout_ms = 1000;
+	ctrlcmd.timeout_ms = 2000;
 	ctrlcmd.vnode_id = pcam->vnode_id;
 	ctrlcmd.queue_idx = pcam->server_queue_idx;
 	ctrlcmd.config_ident = g_server_dev.config_info.config_dev_id[0];
@@ -791,7 +817,7 @@
 	ctrlcmd.length = sizeof(struct v4l2_queryctrl);
 	ctrlcmd.value = (void *)ctrl_data;
 	memcpy(ctrlcmd.value, queryctrl, ctrlcmd.length);
-	ctrlcmd.timeout_ms = 1000;
+	ctrlcmd.timeout_ms = 2000;
 	ctrlcmd.vnode_id = pcam->vnode_id;
 	ctrlcmd.config_ident = g_server_dev.config_info.config_dev_id[0];
 
@@ -899,7 +925,7 @@
 	ctrlcmd.type = MSM_V4L2_GET_CROP;
 	ctrlcmd.length = sizeof(struct v4l2_crop);
 	ctrlcmd.value = (void *)crop;
-	ctrlcmd.timeout_ms = 1000;
+	ctrlcmd.timeout_ms = 2000;
 	ctrlcmd.vnode_id = pcam->vnode_id;
 	ctrlcmd.queue_idx = pcam->server_queue_idx;
 	ctrlcmd.stream_type = pcam->dev_inst[idx]->image_mode;
@@ -1763,7 +1789,7 @@
 
 	
 	D("Waiting for config status\n");
-	rc = wait_event_interruptible_timeout(queue->wait,
+	rc = wait_event_timeout(queue->wait,
 		!list_empty_careful(&queue->list),
 		msecs_to_jiffies(out->timeout_ms));
 	D("Waiting is over for config status\n");
@@ -1934,6 +1960,9 @@
 
 		
 		D("%s: call mctl_open\n", __func__);
+
+		cam_on_check_vcm(); 
+
 		rc = pmctl->mctl_open(pmctl, MSM_APPS_ID_V4L2);
 
 		if (rc < 0) {
@@ -1961,7 +1990,7 @@
 
 	if (pcam->use_count == 1) {
 		rc = msm_send_open_server(pcam);
-		if (rc < 0 && rc != -ERESTARTSYS) {
+		if (rc < 0) {	
 			pr_err("%s: msm_send_open_server failed %d\n",
 				__func__, rc);
 			goto msm_send_open_server_failed;
@@ -1972,6 +2001,12 @@
 	return rc;
 	
 msm_send_open_server_failed:
+	
+	pr_info("%s: rc = %d", __func__, rc);
+	if (rc == -ERESTARTSYS) {
+		msm_send_close_server(pcam);
+	}
+	
 	v4l2_fh_del(&pcam_inst->eventHandle);
 	v4l2_fh_exit(&pcam_inst->eventHandle);
 mctl_event_q_setup_failed:
@@ -2078,6 +2113,9 @@
 	}
 
 	D("%s: call mctl_open\n", __func__);
+
+	cam_on_check_vcm(); 
+
 	rc = pmctl->mctl_open(pmctl, MSM_APPS_ID_V4L2);
 
 	if (rc < 0) {
@@ -2170,6 +2208,9 @@
 	struct msm_cam_v4l2_dev_inst *pcam_inst;
 	struct msm_cam_server_queue *queue;
 	struct msm_cam_media_controller *pmctl;
+	
+	struct msm_sensor_ctrl_t *s_ctrl ;
+	
 	pcam_inst = container_of(f->private_data,
 		struct msm_cam_v4l2_dev_inst, eventHandle);
 	pcam = pcam_inst->pcam;
@@ -2183,19 +2224,27 @@
 		pr_err("%s NULL mctl pointer\n", __func__);
 		return -EINVAL;
 	}
-
+	
+    s_ctrl  = get_sctrl(pmctl->sensor_sdev);
+    if(s_ctrl && s_ctrl->sensor_first_mutex)  {
+	    mutex_lock(s_ctrl->sensor_first_mutex);
+	}
+	
 
 	mutex_lock(&pcam->vid_lock);
 	mutex_lock(&pcam_inst->inst_lock);
 
 	if (pcam_inst->streamon) {
+	
+	#if 0
 		if (pmctl->mctl_release) {
 			rc = pmctl->mctl_release(pmctl);
 			if (rc < 0)
 				pr_err("mctl_release fails %d\n", rc);
 		}
 		pmctl->mctl_release = NULL;
-		
+	#endif
+	
 		msm_cam_stop_hardware(pcam);
 	}
 
@@ -2231,11 +2280,6 @@
 	if (pcam->use_count == 0) {
 		int ges_evt = MSM_V4L2_GES_CAM_CLOSE;
 		
-		struct msm_sensor_ctrl_t *s_ctrl = get_sctrl(pmctl->sensor_sdev);
-		if(s_ctrl && s_ctrl->sensor_first_mutex)  {
-			mutex_lock(s_ctrl->sensor_first_mutex);
-			mutex_unlock(s_ctrl->sensor_first_mutex);
-		}
 
 		if (g_server_dev.use_count > 0) {
 			rc = msm_send_close_server(pcam);
@@ -2270,6 +2314,11 @@
 			NOTIFY_GESTURE_CAM_EVT, &ges_evt);
 	}
 	mutex_unlock(&pcam->vid_lock);
+	
+    if(s_ctrl && s_ctrl->sensor_first_mutex)  {
+	   mutex_unlock(s_ctrl->sensor_first_mutex);
+    }
+	
 	return rc;
 }
 
@@ -2733,6 +2782,13 @@
 							k_msg_value,
 					 k_isp_event->isp_data.isp_msg.len)) {
 						rc = -EINVAL;
+						
+						pr_err("%s: %d copy_to_user failed. msg_id: %d, frame id: %d\n",
+							__func__, __LINE__, k_isp_event->isp_data.isp_msg.msg_id,
+							k_isp_event->isp_data.isp_msg.frame_id);
+						kfree(k_msg_value);
+						kfree(k_isp_event);
+						
 						break;
 					}
 					kfree(k_msg_value);
@@ -2743,6 +2799,12 @@
 				(void *)&u_isp_event, sizeof(
 				struct msm_isp_event_ctrl))) {
 			rc = -EINVAL;
+			
+			pr_err("%s: %d copy_to_user failed. msg_id: %d, frame id: %d\n",
+				__func__, __LINE__, k_isp_event->isp_data.isp_msg.msg_id,
+				k_isp_event->isp_data.isp_msg.frame_id);
+			kfree(k_isp_event);
+			
 			break;
 		}
 		kfree(k_isp_event);
@@ -2760,12 +2822,13 @@
 	case MSM_CAM_IOCTL_V4L2_EVT_NOTIFY:
 		rc = msm_v4l2_evt_notify(config_cam->p_mctl, cmd, arg);
 		break;
-
+#if 0
 	case MSM_CAM_IOCTL_SET_MEM_MAP_INFO:
 		if (copy_from_user(&config_cam->mem_map, (void __user *)arg,
 				sizeof(struct msm_mem_map_info)))
 			rc = -EINVAL;
 		break;
+#endif
 
 	default:{
 		
@@ -2979,6 +3042,7 @@
 static uint32_t led_hotspot_status_value;
 static uint16_t led_low_temp_limit;
 static uint16_t led_low_cap_limit;
+static uint16_t led_low_cap_limit_dual;
 
 static ssize_t led_ril_status_get(struct device *dev,
 				struct device_attribute *attr, char *buf)
@@ -3058,6 +3122,14 @@
 	return length;
 }
 
+static ssize_t low_cap_limit_dual_get(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	ssize_t length;
+	length = sprintf(buf, "%d\n", led_low_cap_limit_dual);
+	return length;
+}
+
 static DEVICE_ATTR(led_ril_status, 0644,
 	led_ril_status_get,
 	led_ril_status_set);
@@ -3078,6 +3150,10 @@
 	low_cap_limit_get,
 	NULL);
 
+static DEVICE_ATTR(low_cap_limit_dual, 0444,
+	low_cap_limit_dual_get,
+	NULL);
+
 static int msm_sensor_attr_node(struct msm_camera_sensor_info *sdata)
 {
 	int ret = 0;
@@ -3140,6 +3216,13 @@
 		ret = -EFAULT;
 		goto error;
 	}
+	ret = sysfs_create_file(led_status_obj,
+		&dev_attr_low_cap_limit_dual.attr);
+	if (ret) {
+		pr_info("msm_camera: sysfs_create_file dev_attr_low_cap_limit_dual failed\n");
+		ret = -EFAULT;
+		goto error;
+	}
 
 	if ((sdata->flash_data->flash_type != MSM_CAMERA_FLASH_NONE) &&
 		sdata->flash_cfg && sdata->flash_cfg->flash_info) {
@@ -3150,6 +3233,7 @@
 
 	led_low_temp_limit = sdata->flash_cfg->low_temp_limit;
 	led_low_cap_limit = sdata->flash_cfg->low_cap_limit;
+	led_low_cap_limit_dual = sdata->flash_cfg->low_cap_limit_dual;
 
 	return ret;
 
@@ -3634,6 +3718,98 @@
 	return rc;
 }
 
+static void cam_on_check_vcm(void)
+{
+	pr_info("[CAM_VCM_CB]  cam_on_check_vcm()  START\n");
+	mutex_lock(&cam_vcm_on_mut);
+
+	if (cam_vcm_on == STATUS_ON) {
+		pr_info("[CAM_VCM_CB]  cam_on_check_vcm()   CAM_VCM_ON !!!   need to power off vcm and sensor\n");
+		if (g_vcm_wa_ctl.actuator_power_off_af)
+			g_vcm_wa_ctl.actuator_power_off_af();
+		if (g_vcm_wa_ctl.vcm_vreg_off)
+			g_vcm_wa_ctl.vcm_vreg_off();
+		mdelay(1);
+		cam_vcm_on = STATUS_OFF;
+	}
+	camera_on = STATUS_ON;
+
+	mutex_unlock(&cam_vcm_on_mut);
+	pr_info("[CAM_VCM_CB]  cam_on_check_vcm()  END\n");
+}
+
+void cam_vcm_on_cb(void)
+{
+	if (!is_actuator_probe_success) {
+		pr_info("[CAM_VCM_CB] %s: no actuator, skip vibration workaround", __func__);
+		return;
+	}
+
+	pr_info("[CAM_VCM_CB]  cam_vcm_on_cb()  START\n");
+	mutex_lock(&cam_vcm_on_mut);
+
+	if(camera_on == STATUS_ON) {
+		pr_info("[CAM_VCM_CB]  cam_vcm_on_cb() END   already CAMERA ON\n");
+		mutex_unlock(&cam_vcm_on_mut);
+		return;
+	}
+
+	if (cam_vcm_on == STATUS_ON) {
+		pr_info("[CAM_VCM_CB]  cam_vcm_on_cb()  END   already VCM ON\n");
+		mutex_unlock(&cam_vcm_on_mut);
+		return;
+	}
+
+	if(g_vcm_wa_ctl.cam_do_vcm_on_cb)
+		g_vcm_wa_ctl.cam_do_vcm_on_cb();
+
+	cam_vcm_on = STATUS_ON;
+	mutex_unlock(&cam_vcm_on_mut);
+	pr_info("[CAM_VCM_CB]  cam_vcm_on_cb()  END\n");
+}
+
+void cam_vcm_off_cb(void)
+{
+	if (!is_actuator_probe_success) {
+		pr_info("[CAM_VCM_CB] %s: no actuator, skip vibration workaround", __func__);
+		return;
+	}
+
+	if (cam_vcm_off_wq) {
+		pr_info("[CAM_VCM_CB]  cam_vcm_off_cb()   queue work cam_vcm_off_work\n");
+		queue_work_on(0, cam_vcm_off_wq, &cam_vcm_off_work);
+	} else {
+		pr_info("[CAM_VCM_CB]  cam_vcm_off_cb()   cam_vcm_off_wq is NULL\n");
+	}
+}
+
+static void do_cam_vcm_off_work(struct work_struct *work)
+{
+	pr_info("[CAM_VCM_CB]  do_cam_vcm_off_work()  START\n");
+
+	mutex_lock(&cam_vcm_on_mut);
+
+	if(camera_on == STATUS_ON) {
+		pr_info("[CAM_VCM_CB]  do_cam_vcm_off_work() already CAMERA ON\n");
+		mutex_unlock(&cam_vcm_on_mut);
+		return;
+	}
+
+	if (cam_vcm_on == STATUS_OFF) {
+		pr_info("[CAM_VCM_CB]  do_cam_vcm_off_work() already VCM OFF\n");
+		mutex_unlock(&cam_vcm_on_mut);
+		return;
+	}
+	cam_vcm_on = STATUS_OFF;
+
+	if(g_vcm_wa_ctl.cam_do_vcm_off_cb)
+		g_vcm_wa_ctl.cam_do_vcm_off_cb();
+
+	mutex_unlock(&cam_vcm_on_mut);
+	pr_info("[CAM_VCM_CB]  do_cam_vcm_off_work()  END\n");
+
+}
+
 static int msm_actuator_probe(struct msm_actuator_info *actuator_info,
 			      struct v4l2_subdev *act_sdev,
 			      struct msm_actuator_ctrl *actctrl)
@@ -3663,6 +3839,11 @@
 	*actctrl = *a_ext_ctrl;
 	a_ext_ctrl->a_create_subdevice((void *)actuator_info,
 				       (void *)act_sdev);
+
+	is_actuator_probe_success = 1; 
+	pr_info("%s: actuator_info->board_info->type=%s", __func__, actuator_info->board_info->type);
+	pr_info("%s: actuator_info->board_info->addr=0x%x", __func__, actuator_info->board_info->addr);
+
 	return rc;
 
 client_fail:
@@ -3671,6 +3852,7 @@
 	i2c_put_adapter(adapter);
 	adapter = NULL;
 probe_fail:
+	pr_info("%s: probe failed", __func__);
 	actctrl->a_init_table = NULL;
 	actctrl->a_power_up = NULL;
 	actctrl->a_power_down = NULL;
@@ -3794,6 +3976,34 @@
 		g_server_dev.camera_info.num_cameras);
 
 	
+	if(actctrl) {
+		
+		actctrl->actrl_vcm_on_mut = &cam_vcm_on_mut;
+		
+		actctrl->actrl_vcm_wa_camera_on = &camera_on;
+
+		
+		if(actctrl->actuator_poweroff_af) {
+			g_vcm_wa_ctl.actuator_power_off_af = actctrl->actuator_poweroff_af;
+		}
+
+		
+		if(actctrl->do_vcm_on_cb) {
+			g_vcm_wa_ctl.cam_do_vcm_on_cb = actctrl->do_vcm_on_cb;
+		}
+		if(actctrl->do_vcm_off_cb) {
+			g_vcm_wa_ctl.cam_do_vcm_off_cb = actctrl->do_vcm_off_cb;
+		}
+	}
+
+	
+	if(sdata->actuator_info) {
+		if(sdata->actuator_info->vcm_wa_vreg_off)
+			g_vcm_wa_ctl.vcm_vreg_off = sdata->actuator_info->vcm_wa_vreg_off;
+	}
+	
+
+	
 	rc = msm_cam_register_subdev_node(sensor_sd, SENSOR_DEV, vnode_count);
 	if (rc < 0) {
 		D("%s sensor sub device register failed\n",
@@ -3913,6 +4123,15 @@
 		goto error;
 	}
 
+	
+	INIT_WORK(&cam_vcm_off_work, do_cam_vcm_off_work);
+	cam_vcm_off_wq = create_singlethread_workqueue("cam_vcm_off_wq");
+	if (!cam_vcm_off_wq) {
+		pr_err("%s, create_singlethread_workqueue cam_vcm_off_wq fail\n", __func__);
+	}
+	memset(&g_vcm_wa_ctl, 0, sizeof(g_vcm_wa_ctl));
+	
+
 	return ret;
 error:
 	kobject_del(htccallback_obj);
diff --git a/drivers/media/video/msm/msm.h b/drivers/media/video/msm/msm.h
index 8c2f598..fe3c968 100644
--- a/drivers/media/video/msm/msm.h
+++ b/drivers/media/video/msm/msm.h
@@ -279,6 +279,7 @@
 #ifdef CONFIG_PERFLOCK
 	struct perf_lock *cam_perf_lock;
 #endif
+	struct stats_htc_af htc_af_info;
 };
 
 struct msm_isp_ops {
@@ -413,6 +414,12 @@
 	uint32_t handle;
 };
 
+struct cam_vcm_wa_ctrl {
+	void (*cam_do_vcm_on_cb)(void);
+	void (*cam_do_vcm_off_cb)(void);
+	void (*vcm_vreg_off)(void);
+	void (*actuator_power_off_af)(void);
+};
 
 struct msm_cam_server_dev {
 
@@ -504,6 +511,10 @@
 	struct msm_cam_media_controller *mctl,
 	unsigned long addr, int *fd);
 
+unsigned long msm_pmem_stats_ptov_lookup_2(
+	struct msm_cam_media_controller *mctl,
+	unsigned long addr, int *fd);
+
 int msm_vfe_subdev_init(struct v4l2_subdev *sd,
 			struct msm_cam_media_controller *mctl);
 void msm_vfe_subdev_release(struct v4l2_subdev *sd);
diff --git a/drivers/media/video/msm/msm_io_8960.c b/drivers/media/video/msm/msm_io_8960.c
index 030c8c0..10cd59b 100644
--- a/drivers/media/video/msm/msm_io_8960.c
+++ b/drivers/media/video/msm/msm_io_8960.c
@@ -96,8 +96,16 @@
 	u32 *d = (u32 *) dest_addr;
 	u32 *s = (u32 *) src_addr;
 	
-	for (i = 0; i < len; i++)
-		writel_relaxed(*s++, d++);
+	for (i = 0; i < len; i++) {
+		
+		if (s)
+			writel_relaxed(*s++, d++);
+		else {
+			pr_err("%s: invalid address %p, break", __func__, s);
+			break;
+		}
+		
+	}
 }
 
 void msm_io_dump(void __iomem *addr, int size)
@@ -137,209 +145,6 @@
 		pr_err("%s: invalid address %p %p", __func__, dest_addr, src_addr);
 }
 
-#if 1	
-static int msm_camera_vreg_enable(struct msm_camera_sensor_info *s_info)
-{
-#if 0 
-	if (mipi_csi_vdd == NULL) {
-		mipi_csi_vdd = regulator_get(&pdev->dev, "mipi_csi_vdd");
-		if (IS_ERR(mipi_csi_vdd)) {
-			CDBG("%s: VREG MIPI CSI VDD get failed\n", __func__);
-			mipi_csi_vdd = NULL;
-			return -ENODEV;
-		}
-		if (regulator_set_voltage(mipi_csi_vdd, CAM_CSI_VDD_MINUV,
-			CAM_CSI_VDD_MAXUV)) {
-			CDBG("%s: VREG MIPI CSI VDD set voltage failed\n",
-				__func__);
-			goto mipi_csi_vdd_put;
-		}
-		if (regulator_set_optimum_mode(mipi_csi_vdd,
-			CAM_CSI_LOAD_UA) < 0) {
-			CDBG("%s: VREG MIPI CSI set optimum mode failed\n",
-				__func__);
-			goto mipi_csi_vdd_release;
-		}
-		if (regulator_enable(mipi_csi_vdd)) {
-			CDBG("%s: VREG MIPI CSI VDD enable failed\n",
-				__func__);
-			goto mipi_csi_vdd_disable;
-		}
-	}
-	if (cam_vana == NULL) {
-		cam_vana = regulator_get(&pdev->dev, "cam_vana");
-		if (IS_ERR(cam_vana)) {
-			CDBG("%s: VREG CAM VANA get failed\n", __func__);
-			cam_vana = NULL;
-			goto mipi_csi_vdd_disable;
-		}
-		if (regulator_set_voltage(cam_vana, CAM_VANA_MINUV,
-			CAM_VANA_MAXUV)) {
-			CDBG("%s: VREG CAM VANA set voltage failed\n",
-				__func__);
-			goto cam_vana_put;
-		}
-		if (regulator_set_optimum_mode(cam_vana,
-			CAM_VANA_LOAD_UA) < 0) {
-			CDBG("%s: VREG CAM VANA set optimum mode failed\n",
-				__func__);
-			goto cam_vana_release;
-		}
-		if (regulator_enable(cam_vana)) {
-			CDBG("%s: VREG CAM VANA enable failed\n", __func__);
-			goto cam_vana_disable;
-		}
-	}
-	if (cam_vio == NULL) {
-		cam_vio = regulator_get(&pdev->dev, "cam_vio");
-		if (IS_ERR(cam_vio)) {
-			CDBG("%s: VREG VIO get failed\n", __func__);
-			cam_vio = NULL;
-			goto cam_vana_disable;
-		}
-		if (regulator_enable(cam_vio)) {
-			CDBG("%s: VREG VIO enable failed\n", __func__);
-			goto cam_vio_put;
-		}
-	}
-	if (cam_vdig == NULL) {
-		cam_vdig = regulator_get(&pdev->dev, "cam_vdig");
-		if (IS_ERR(cam_vdig)) {
-			CDBG("%s: VREG CAM VDIG get failed\n", __func__);
-			cam_vdig = NULL;
-			goto cam_vio_disable;
-		}
-		if (regulator_set_voltage(cam_vdig, CAM_VDIG_MINUV,
-			CAM_VDIG_MAXUV)) {
-			CDBG("%s: VREG CAM VDIG set voltage failed\n",
-				__func__);
-			goto cam_vdig_put;
-		}
-		if (regulator_set_optimum_mode(cam_vdig,
-			CAM_VDIG_LOAD_UA) < 0) {
-			CDBG("%s: VREG CAM VDIG set optimum mode failed\n",
-				__func__);
-			goto cam_vdig_release;
-		}
-		if (regulator_enable(cam_vdig)) {
-			CDBG("%s: VREG CAM VDIG enable failed\n", __func__);
-			goto cam_vdig_disable;
-		}
-	}
-	if (cam_vaf == NULL) {
-		cam_vaf = regulator_get(&pdev->dev, "cam_vaf");
-		if (IS_ERR(cam_vaf)) {
-			CDBG("%s: VREG CAM VAF get failed\n", __func__);
-			cam_vaf = NULL;
-			goto cam_vdig_disable;
-		}
-		if (regulator_set_voltage(cam_vaf, CAM_VAF_MINUV,
-			CAM_VAF_MAXUV)) {
-			CDBG("%s: VREG CAM VAF set voltage failed\n",
-				__func__);
-			goto cam_vaf_put;
-		}
-		if (regulator_set_optimum_mode(cam_vaf,
-			CAM_VAF_LOAD_UA) < 0) {
-			CDBG("%s: VREG CAM VAF set optimum mode failed\n",
-				__func__);
-			goto cam_vaf_release;
-		}
-		if (regulator_enable(cam_vaf)) {
-			CDBG("%s: VREG CAM VAF enable failed\n", __func__);
-			goto cam_vaf_disable;
-		}
-	}
-#endif 
-	return 0;
-
-#if 0 
-cam_vaf_disable:
-	regulator_set_optimum_mode(cam_vaf, 0);
-cam_vaf_release:
-	regulator_set_voltage(cam_vaf, 0, CAM_VAF_MAXUV);
-	regulator_disable(cam_vaf);
-cam_vaf_put:
-	regulator_put(cam_vaf);
-	cam_vaf = NULL;
-cam_vdig_disable:
-	regulator_set_optimum_mode(cam_vdig, 0);
-cam_vdig_release:
-	regulator_set_voltage(cam_vdig, 0, CAM_VDIG_MAXUV);
-	regulator_disable(cam_vdig);
-cam_vdig_put:
-	regulator_put(cam_vdig);
-	cam_vdig = NULL;
-cam_vio_disable:
-	regulator_disable(cam_vio);
-cam_vio_put:
-	regulator_put(cam_vio);
-	cam_vio = NULL;
-cam_vana_disable:
-	regulator_set_optimum_mode(cam_vana, 0);
-cam_vana_release:
-	regulator_set_voltage(cam_vana, 0, CAM_VANA_MAXUV);
-	regulator_disable(cam_vana);
-cam_vana_put:
-	regulator_put(cam_vana);
-	cam_vana = NULL;
-mipi_csi_vdd_disable:
-	regulator_set_optimum_mode(mipi_csi_vdd, 0);
-mipi_csi_vdd_release:
-	regulator_set_voltage(mipi_csi_vdd, 0, CAM_CSI_VDD_MAXUV);
-	regulator_disable(mipi_csi_vdd);
-
-mipi_csi_vdd_put:
-	regulator_put(mipi_csi_vdd);
-	mipi_csi_vdd = NULL;
-	return -ENODEV;
-#endif 
-}
-
-static void msm_camera_vreg_disable(void)
-{
-#if 0 
-	if (mipi_csi_vdd) {
-		regulator_set_voltage(mipi_csi_vdd, 0, CAM_CSI_VDD_MAXUV);
-		regulator_set_optimum_mode(mipi_csi_vdd, 0);
-		regulator_disable(mipi_csi_vdd);
-		regulator_put(mipi_csi_vdd);
-		mipi_csi_vdd = NULL;
-	}
-
-	if (cam_vana) {
-		regulator_set_voltage(cam_vana, 0, CAM_VANA_MAXUV);
-		regulator_set_optimum_mode(cam_vana, 0);
-		regulator_disable(cam_vana);
-		regulator_put(cam_vana);
-		cam_vana = NULL;
-	}
-
-	if (cam_vio) {
-		regulator_disable(cam_vio);
-		regulator_put(cam_vio);
-		cam_vio = NULL;
-	}
-
-	if (cam_vdig) {
-		regulator_set_voltage(cam_vdig, 0, CAM_VDIG_MAXUV);
-		regulator_set_optimum_mode(cam_vdig, 0);
-		regulator_disable(cam_vdig);
-		regulator_put(cam_vdig);
-		cam_vdig = NULL;
-	}
-
-	if (cam_vaf) {
-		regulator_set_voltage(cam_vaf, 0, CAM_VAF_MAXUV);
-		regulator_set_optimum_mode(cam_vaf, 0);
-		regulator_disable(cam_vaf);
-		regulator_put(cam_vaf);
-		cam_vaf = NULL;
-	}
-#endif 
-}
-
-#endif	
 int msm_camio_clk_enable(enum msm_camio_clk_type clktype)
 {
 	int rc = 0;
@@ -585,7 +390,6 @@
 	if (rc < 0)
 		return rc;
 
-	msm_camera_vreg_enable(sinfo);
 	if (camdev && camdev->camera_csi_on)
 		rc = camdev->camera_csi_on();
 	if (rc < 0)
@@ -601,8 +405,6 @@
 	struct msm_camera_sensor_info *sinfo = sctrl->sensordata;
 	struct msm_camera_device_platform_data *camdev = sinfo->pdata;
 
-	msm_camera_vreg_disable();
-
 	if (camdev && camdev->camera_csi_off)
 		rc = camdev->camera_csi_off();
 	if (rc < 0)
diff --git a/drivers/media/video/msm/msm_isp.c b/drivers/media/video/msm/msm_isp.c
index e7fb1a3..7af7a61 100644
--- a/drivers/media/video/msm/msm_isp.c
+++ b/drivers/media/video/msm/msm_isp.c
@@ -31,6 +31,8 @@
 
 #include "msm.h"
 
+#include "swfv/swfa_k.h"
+
 #ifdef CONFIG_MSM_CAMERA_DEBUG
 #define D(fmt, args...) pr_debug("msm_isp: " fmt, ##args)
 #else
@@ -38,6 +40,8 @@
 #endif
 
 #define MSM_FRAME_AXI_MAX_BUF 32
+#define BAYER_FOCUS_BUF_SIZE 		(18 * 14 * 10 * 4)
+#define SW_FOCUS_BUF_SIZE 			32*1024
 
 
 void *msm_isp_sync_alloc(int size,
@@ -336,6 +340,9 @@
 	struct msm_cam_media_controller *pmctl =
 		(struct msm_cam_media_controller *)v4l2_get_subdev_hostdata(sd);
 	struct msm_free_buf buf;
+	unsigned long pphy;
+	int newWidth;
+	int newHeight;
 
 	if (!pmctl) {
 		pr_err("%s: no context in dsp callback.\n", __func__);
@@ -366,6 +373,11 @@
 	switch (notification) {
 	case NOTIFY_ISP_MSG_EVT: {
 		struct isp_msg_event *isp_msg = (struct isp_msg_event *)arg;
+		if (!isp_msg) {
+			pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+			rc = -EINVAL;
+			return rc;
+		}
 
 		isp_event->isp_data.isp_msg.msg_id = isp_msg->msg_id;
 		isp_event->isp_data.isp_msg.frame_id = isp_msg->sof_count;
@@ -387,6 +399,11 @@
 		int image_mode; 
 		struct isp_msg_output *isp_output =
 				(struct isp_msg_output *)arg;
+		if (!isp_output) {
+			pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+			rc = -EINVAL;
+			return rc;
+		}
 		switch (isp_output->output_id) {
 		case MSG_ID_OUTPUT_P:
 			msgid = VFE_MSG_OUTPUT_P;
@@ -418,6 +435,7 @@
                 msgid = msm_isp_vfe_msg_to_img_mode(pmctl, msgid);
                 
                 msm_mctl_return_free_buf(pmctl, msgid, &(isp_output->buf));
+                kfree(isp_event);
                 return rc;
             } else {
 			isp_event->isp_data.isp_msg.msg_id =
@@ -438,6 +456,11 @@
 	case NOTIFY_VFE_MSG_COMP_STATS: {
 		struct msm_stats_buf *stats = (struct msm_stats_buf *)arg;
 		struct msm_stats_buf *stats_buf = NULL;
+		if (!stats) {
+			pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+			rc = -EINVAL;
+			return rc;
+		}
 
 		isp_event->isp_data.isp_msg.msg_id = MSG_ID_STATS_COMPOSITE;
 		stats->aec.buff = msm_pmem_stats_ptov_lookup(pmctl,
@@ -452,6 +475,8 @@
 					stats->rs.buff, &(stats->rs.fd));
 		stats->cs.buff = msm_pmem_stats_ptov_lookup(pmctl,
 					stats->cs.buff, &(stats->cs.fd));
+		stats->skin.buff = msm_pmem_stats_ptov_lookup(pmctl,
+					stats->skin.buff, &(stats->skin.fd)); 
 
 		stats_buf = kmalloc(sizeof(struct msm_stats_buf), GFP_ATOMIC);
 		if (!stats_buf) {
@@ -468,15 +493,23 @@
 	case NOTIFY_VFE_MSG_STATS: {
 		struct msm_stats_buf stats;
 		struct isp_msg_stats *isp_stats = (struct isp_msg_stats *)arg;
-
+		if (!isp_stats) {
+			pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+			rc = -EINVAL;
+			return rc;
+		}
 		isp_event->isp_data.isp_msg.msg_id = isp_stats->id;
 		isp_event->isp_data.isp_msg.frame_id =
 			isp_stats->frameCounter;
+#ifdef CONFIG_ARCH_MSM8X60
+		stats.frame_id = isp_stats->frameCounter;
+#endif 
 		stats.buffer = msm_pmem_stats_ptov_lookup(pmctl,
 						isp_stats->buffer,
 						&(stats.fd));
 		switch (isp_stats->id) {
 		case MSG_ID_STATS_AEC:
+		case MSG_ID_STATS_BG:
 			stats.aec.buff = stats.buffer;
 			stats.aec.fd = stats.fd;
 			break;
@@ -484,6 +517,39 @@
 			stats.af.buff = stats.buffer;
 			stats.af.fd = stats.fd;
 			break;
+		case MSG_ID_STATS_BF:
+		    newWidth = 0;
+		    newHeight = 0;
+		    stats.htc_af_info.af_input.af_use_sw_sharpness = false;
+		    if (pmctl->htc_af_info.af_input.af_use_sw_sharpness) {
+
+			    pphy = msm_pmem_stats_ptov_lookup_2(pmctl,
+						isp_stats->buffer,
+						&(stats.fd));
+
+			    memset((uint8_t *)(pphy+BAYER_FOCUS_BUF_SIZE), 0x00, SW_FOCUS_BUF_SIZE);
+
+			    rc = swfa_Transform2((uint8_t *)(pphy+BAYER_FOCUS_BUF_SIZE),
+			                          &newWidth,
+			                          &newHeight);
+
+			    if(!rc)
+				    stats.htc_af_info.af_input.af_use_sw_sharpness = false;
+			    else
+				    stats.htc_af_info.af_input.af_use_sw_sharpness = pmctl->htc_af_info.af_input.af_use_sw_sharpness;
+			}
+
+			stats.htc_af_info.af_input.preview_width = pmctl->htc_af_info.af_input.preview_width;
+			stats.htc_af_info.af_input.preview_height = pmctl->htc_af_info.af_input.preview_height;
+			stats.htc_af_info.af_input.roi_x = pmctl->htc_af_info.af_input.roi_x;
+			stats.htc_af_info.af_input.roi_y = pmctl->htc_af_info.af_input.roi_y;
+			stats.htc_af_info.af_input.roi_width = newWidth;
+			stats.htc_af_info.af_input.roi_height = newHeight;
+
+			stats.af.buff = stats.buffer;
+			stats.af.fd = stats.fd;
+
+			break;
 		case MSG_ID_STATS_AWB:
 			stats.awb.buff = stats.buffer;
 			stats.awb.fd = stats.fd;
@@ -500,6 +566,10 @@
 			stats.cs.buff = stats.buffer;
 			stats.cs.fd = stats.fd;
 			break;
+		case MSG_ID_STATS_BHIST:
+			stats.skin.buff = stats.buffer;
+			stats.skin.fd = stats.fd;
+			break;
 		case MSG_ID_STATS_AWB_AEC:
 			break;
 		default:
@@ -535,6 +605,12 @@
 		break;
 	}
 
+	if (!pmctl->config_device) {
+		pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+		rc = -EINVAL;
+		return rc;
+	}
+
 	v4l2_event_queue(pmctl->config_device->config_stat_event_queue.pvdev,
 			 &v4l2_evt);
 
@@ -626,6 +702,48 @@
 	memset(&axi_data, 0, sizeof(axi_data));
 	CDBG("%s: cmd_type %d\n", __func__, cfgcmd.cmd_type);
 	switch (cfgcmd.cmd_type) {
+	case CMD_STATS_BG_ENABLE:
+		axi_data.bufnum1 =
+			msm_pmem_region_lookup(
+				&mctl->stats_info.pmem_stats_list,
+				MSM_PMEM_BAYER_GRID, &region[0],
+				NUM_STAT_OUTPUT_BUFFERS);
+		if (!axi_data.bufnum1) {
+			pr_err("%s %d: pmem region lookup error\n",
+				__func__, __LINE__);
+			return -EINVAL;
+		}
+		axi_data.region = &region[0];
+		return msm_isp_subdev_ioctl(sd, &cfgcmd,
+							&axi_data);
+	case CMD_STATS_BF_ENABLE:
+		axi_data.bufnum1 =
+			msm_pmem_region_lookup(
+				&mctl->stats_info.pmem_stats_list,
+				MSM_PMEM_BAYER_FOCUS, &region[0],
+				NUM_STAT_OUTPUT_BUFFERS);
+		if (!axi_data.bufnum1) {
+			pr_err("%s %d: pmem region lookup error\n",
+				__func__, __LINE__);
+			return -EINVAL;
+		}
+		axi_data.region = &region[0];
+		return msm_isp_subdev_ioctl(sd, &cfgcmd,
+							&axi_data);
+	case CMD_STATS_BHIST_ENABLE:
+		axi_data.bufnum1 =
+			msm_pmem_region_lookup(
+				&mctl->stats_info.pmem_stats_list,
+				MSM_PMEM_BAYER_HIST, &region[0],
+				NUM_STAT_OUTPUT_BUFFERS);
+		if (!axi_data.bufnum1) {
+			pr_err("%s %d: pmem region lookup error\n",
+				__func__, __LINE__);
+			return -EINVAL;
+		}
+		axi_data.region = &region[0];
+		return msm_isp_subdev_ioctl(sd, &cfgcmd,
+							&axi_data);
 	case CMD_STATS_AF_ENABLE:
 		axi_data.bufnum1 =
 			msm_pmem_region_lookup(
@@ -801,7 +919,12 @@
 			cfgcmd.cmd_type = CMD_STATS_CS_BUF_RELEASE;
 		else if (buf.type == STAT_AEAW)
 			cfgcmd.cmd_type = CMD_STATS_BUF_RELEASE;
-
+		else if (buf.type == STAT_BG)
+			cfgcmd.cmd_type = CMD_STATS_BG_BUF_RELEASE;
+		else if (buf.type == STAT_BF)
+			cfgcmd.cmd_type = CMD_STATS_BF_BUF_RELEASE;
+		else if (buf.type == STAT_BHIST)
+			cfgcmd.cmd_type = CMD_STATS_BHIST_BUF_RELEASE;
 		else {
 			pr_err("%s: invalid buf type %d\n",
 				__func__,
diff --git a/drivers/media/video/msm/msm_mctl.c b/drivers/media/video/msm/msm_mctl.c
index 6cd88a4..ad12f2f 100644
--- a/drivers/media/video/msm/msm_mctl.c
+++ b/drivers/media/video/msm/msm_mctl.c
@@ -39,11 +39,14 @@
 #include "msm_vpe.h"
 #include "msm_vfe32.h"
 
-#if 1	
+
 #ifdef CONFIG_RAWCHIP
 #include "rawchip/rawchip.h"
 #endif
-#endif 
+
+#ifdef CONFIG_RAWCHIPII
+#include "yushanII/yushanII.h"
+#endif
 
 #ifdef CONFIG_MSM_CAMERA_DEBUG
 #define D(fmt, args...) pr_debug("msm_mctl: " fmt, ##args)
@@ -192,6 +195,10 @@
 	info.actuator_enabled = sdata->actuator_info ? 1 : 0;
 	info.strobe_flash_enabled = sdata->strobe_flash_data ? 1 : 0;
 
+	pr_info("msm_get_sensor_info,sdata->htc_image=%d,sdata->use_rawchip=%d,sdata->hdr_mode=%d,sdata->video_hdr_capability=%d",sdata->htc_image,sdata->use_rawchip,sdata->hdr_mode,sdata->video_hdr_capability);
+	info.htc_image = sdata->htc_image;
+	info.hdr_mode = sdata->hdr_mode;
+	info.video_hdr_capability = sdata->video_hdr_capability;
 	
 	if (sdata->use_rawchip == RAWCHIP_ENABLE)
 		info.use_rawchip = RAWCHIP_ENABLE;
@@ -297,6 +304,8 @@
 			return -EFAULT;
 		}
 		cdata.is_af_supported = 0;
+		cdata.is_ois_supported = 0;
+		cdata.is_cal_supported = 0; 
 		rc = 0;
 
 		if (p_mctl->actctrl->a_config) {
@@ -307,6 +316,9 @@
 				sdata->actuator_info->cam_name);
 
 			cdata.is_af_supported = 1;
+			cdata.is_ois_supported = p_mctl->actctrl->is_ois_supported;
+			cdata.is_cal_supported = p_mctl->actctrl->is_cal_supported; 
+
 			cdata.cfg.cam_name =
 				(enum af_camera_name)sdata->
 				actuator_info->cam_name;
@@ -339,6 +351,9 @@
 				break;
 			}
 			act_data.is_af_supported = 0;
+			act_data.is_ois_supported = 0;
+			act_data.is_cal_supported = 0; 
+
 			rc = copy_to_user((void *)argp,
 					 &act_data,
 					 sizeof(struct msm_actuator_cfg_data));
@@ -681,6 +696,11 @@
 		if (rc)
 			pr_info("%s msm_camio_probe_on rc(%d)\n", __func__, rc);
 
+		
+		if(p_mctl->actctrl->actrl_vcm_on_mut)
+			mutex_lock(p_mctl->actctrl->actrl_vcm_on_mut);
+		
+
 		if (p_mctl->sdata->use_rawchip) {
 #ifdef CONFIG_RAWCHIP
 			rc = rawchip_open_init();
@@ -689,6 +709,17 @@
 			}
 #endif
 		}
+
+		if (p_mctl->sdata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) {
+#ifdef CONFIG_RAWCHIPII
+			rc = YushanII_open_init();
+			if (rc < 0) {
+				goto sensor_sdev_failed;
+			}
+#endif
+		}
+
+
 #endif 
 
 		
@@ -699,10 +730,6 @@
 			goto sensor_sdev_failed;
 		}
 
-#if 1		
-		msm_sensor_match_id(s_ctrl);
-#endif 
-
 		
 		if (p_mctl->actctrl->a_init_table)
 			rc = p_mctl->actctrl->a_init_table();
@@ -716,12 +743,17 @@
 		if (p_mctl->actctrl->a_power_up)
 			rc = p_mctl->actctrl->a_power_up(
 				p_mctl->sdata->actuator_info);
-
+		mdelay(50);
 		if (rc < 0) {
 			pr_err("%s: act power failed:%d\n", __func__, rc);
 			goto act_power_up_failed;
 		}
 
+		
+		if(p_mctl->actctrl->actrl_vcm_on_mut)
+			mutex_unlock(p_mctl->actctrl->actrl_vcm_on_mut);
+		
+
 		if (camdev->is_ispif) {
 			pm_qos_add_request(&p_mctl->pm_qos_req_list,
 				PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
@@ -779,6 +811,12 @@
 	wake_unlock(&p_mctl->wake_lock_suspend);
 
 	mutex_unlock(&p_mctl->lock);
+
+	
+	if(p_mctl->actctrl->actrl_vcm_on_mut)
+		mutex_unlock(p_mctl->actctrl->actrl_vcm_on_mut);
+	
+
 	return rc;
 }
 
@@ -827,6 +865,14 @@
 			VIDIOC_MSM_CSIPHY_RELEASE, NULL);
 	}
 
+	
+	if(p_mctl->actctrl->actrl_vcm_on_mut)
+		mutex_lock(p_mctl->actctrl->actrl_vcm_on_mut);
+
+	if(p_mctl->actctrl->actrl_vcm_wa_camera_on)
+		*p_mctl->actctrl->actrl_vcm_wa_camera_on = STATUS_OFF;
+	
+
 	if (p_mctl->actctrl->a_power_down)
 		p_mctl->actctrl->a_power_down(
 			p_mctl->sdata->actuator_info);
@@ -836,6 +882,12 @@
 		rawchip_release();
 #endif
 	}
+
+	if (p_mctl->sdata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) {
+#ifdef CONFIG_RAWCHIPII
+		YushanII_release();
+#endif
+	}
 	
 	rc = msm_camio_probe_off(s_ctrl);
 	if (rc)
@@ -843,6 +895,12 @@
 	
 
 	v4l2_subdev_call(p_mctl->sensor_sdev, core, s_power, 0);
+
+	
+	if(p_mctl->actctrl->actrl_vcm_on_mut)
+		mutex_unlock(p_mctl->actctrl->actrl_vcm_on_mut);
+	
+
 	if (camdev->is_ispif) {
 		pm_qos_update_request(&p_mctl->pm_qos_req_list,
 				PM_QOS_DEFAULT_VALUE);
diff --git a/drivers/media/video/msm/msm_mctl_buf.c b/drivers/media/video/msm/msm_mctl_buf.c
index 0e6df08..a84670d 100644
--- a/drivers/media/video/msm/msm_mctl_buf.c
+++ b/drivers/media/video/msm/msm_mctl_buf.c
@@ -28,6 +28,8 @@
 #include "msm.h"
 #include "msm_ispif.h"
 
+#include "swfv/swfa_k.h"
+
 #ifdef CONFIG_MSM_CAMERA_DEBUG
 #define D(fmt, args...) pr_debug("msm_mctl_buf: " fmt, ##args)
 #else
@@ -35,9 +37,10 @@
 #endif
 
 static int msm_vb2_ops_queue_setup(struct vb2_queue *vq,
+					const struct v4l2_format *fmt,
 					unsigned int *num_buffers,
 					unsigned int *num_planes,
-					unsigned long sizes[],
+					unsigned int sizes[],
 					void *alloc_ctxs[])
 {
 	
@@ -53,9 +56,9 @@
 
 	*num_planes = pcam_inst->plane_info.num_planes;
 	for (i = 0; i < pcam_inst->vid_fmt.fmt.pix_mp.num_planes; i++) {
-		sizes[i] = PAGE_ALIGN(pcam_inst->plane_info.plane[i].size);
-		D("%s Inst %p : Plane %d Offset = %d Size = %ld"
-			"Aligned Size = %ld", __func__, pcam_inst, i,
+		sizes[i] = pcam_inst->plane_info.plane[i].size;
+		D("%s Inst %p : Plane %d Offset = %d Size = %ld" \
+			"Aligned Size = %d\n", __func__, pcam_inst, i,
 			pcam_inst->plane_info.plane[i].offset,
 			pcam_inst->plane_info.plane[i].size, sizes[i]);
 	}
@@ -117,6 +120,10 @@
 	if(!pmctl) return -EINVAL;
 	for (i = 0; i < vb->num_planes; i++) {
 		mem = vb2_plane_cookie(vb, i);
+		if (!mem) { 
+			pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+			return -EINVAL;
+		} 
 		if (buf_type == VIDEOBUF2_MULTIPLE_PLANES)
 			offset.data_offset =
 				pcam_inst->plane_info.plane[i].offset;
@@ -146,7 +153,7 @@
 	struct msm_cam_v4l2_dev_inst *pcam_inst;
 	struct msm_cam_v4l2_device *pcam;
 	struct msm_frame_buffer *buf;
-	struct vb2_queue	*vq = NULL;
+	struct vb2_queue *vq;
 
 	D("%s\n", __func__);
 	if (!vb) {
@@ -246,7 +253,8 @@
 				&pcam_inst->free_vq, list) {
 			buf_phyaddr = (unsigned long)
 				videobuf2_to_pmem_contig(&buf->vidbuf, 0);
-			D("%s vb_idx=%d,vb_paddr=0x%x,phyaddr=0x%x\n",
+			if (!buf_phyaddr || !vb_phyaddr)
+			pr_info("%s vb_idx=%d,vb_paddr=0x%x,phyaddr=0x%x\n",
 				__func__, buf->vidbuf.v4l2_buf.index,
 				buf_phyaddr, vb_phyaddr);
 			if (vb_phyaddr == buf_phyaddr) {
@@ -261,13 +269,17 @@
 	if(pmctl)  {
 		for (i = 0; i < vb->num_planes; i++) {
 			mem = vb2_plane_cookie(vb, i);
+			if (!mem) { 
+				pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+				return;
+			} 
 			videobuf2_pmem_contig_user_put(mem, pmctl->client);
 		}
 	}
 	buf->state = MSM_BUFFER_STATE_UNUSED;
 }
 
-static int msm_vb2_ops_start_streaming(struct vb2_queue *q)
+static int msm_vb2_ops_start_streaming(struct vb2_queue *q, unsigned int count)
 {
 	return 0;
 }
@@ -379,6 +391,10 @@
 			&pcam_inst->free_vq, list) {
 		buf_idx = buf->vidbuf.v4l2_buf.index;
 		mem = vb2_plane_cookie(&buf->vidbuf, 0);
+		if (!mem) { 
+			pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+			return NULL;
+		} 
 		if (mem->buffer_type ==	VIDEOBUF2_MULTIPLE_PLANES)
 			offset = mem->offset.data_offset +
 				pcam_inst->buf_offset[buf_idx][0].data_offset;
@@ -387,7 +403,8 @@
 		buf_phyaddr = (unsigned long)
 				videobuf2_to_pmem_contig(&buf->vidbuf, 0) +
 				offset;
-		D("%s vb_idx=%d,vb_paddr=0x%x ch0=0x%x\n",
+		if (!buf_phyaddr)
+		pr_info("%s vb_idx=%d,vb_paddr=0x%x ch0=0x%x\n",
 			__func__, buf->vidbuf.v4l2_buf.index,
 			buf_phyaddr, fbuf->ch_paddr[0]);
 		if (fbuf->ch_paddr[0] == buf_phyaddr) {
@@ -409,8 +426,10 @@
 		int image_mode, struct msm_free_buf *fbuf,
 		uint32_t *frame_id, int gen_timestamp)
 {
+	int rc = 0;
 	struct msm_frame_buffer *buf = NULL;
 	int del_buf = 1;
+	struct videobuf2_contig_pmem *mem;
 
 	buf = msm_mctl_buf_find(pmctl, pcam_inst, del_buf,
 					image_mode, fbuf);
@@ -419,6 +438,26 @@
 			__func__, fbuf->ch_paddr[0]);
 		return -EINVAL;
 	}
+
+	mem = vb2_plane_cookie(&buf->vidbuf, 0);
+
+	if(pmctl->htc_af_info.af_input.preview_width*pmctl->htc_af_info.af_input.preview_height > mem->size)
+	    pmctl->htc_af_info.af_input.af_use_sw_sharpness = false;
+
+	if (pmctl->htc_af_info.af_input.af_use_sw_sharpness && image_mode == MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW)
+	{
+	    rc = swfa_FeatureAnalysis((uint8_t* )mem->arm_vaddr,
+			                          pmctl->htc_af_info.af_input.preview_width,
+			                          pmctl->htc_af_info.af_input.preview_height,
+			                          pmctl->htc_af_info.af_input.roi_x,
+			                          pmctl->htc_af_info.af_input.roi_y,
+			                          pmctl->htc_af_info.af_input.roi_width,
+			                          pmctl->htc_af_info.af_input.roi_height,
+			                          1);
+	    if(!rc)
+	        pmctl->htc_af_info.af_input.af_use_sw_sharpness = false;
+	}
+
 	if (gen_timestamp) {
 		if (frame_id)
 			buf->vidbuf.v4l2_buf.sequence = *frame_id;
@@ -603,6 +642,10 @@
 				pcam_inst->plane_info.num_planes;
 			for (i = 0; i < free_buf->num_planes; i++) {
 				mem = vb2_plane_cookie(&buf->vidbuf, i);
+				if (!mem) { 
+					pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+					return -EINVAL;
+				} 
 				if (mem->buffer_type ==
 						VIDEOBUF2_MULTIPLE_PLANES)
 					plane_offset =
@@ -623,6 +666,10 @@
 			}
 		} else {
 			mem = vb2_plane_cookie(&buf->vidbuf, 0);
+			if (!mem) { 
+				pr_err("%s: null pointer check, line(%d)", __func__, __LINE__);
+				return -EINVAL;
+			} 
 			free_buf->ch_paddr[0] = (uint32_t)
 				videobuf2_to_pmem_contig(&buf->vidbuf, 0) +
 				mem->offset.sp_off.y_off;
@@ -645,8 +692,8 @@
 		++pcam_inst->no_free_buf_cnt;
 		if (pcam_inst->no_free_buf_cnt < 50 ||
 			pcam_inst->no_free_buf_cnt % 5 == 0)
-			pr_info("%s: No free buffer available: inst = 0x%p, cnt %d\n",
-				__func__, pcam_inst, pcam_inst->no_free_buf_cnt);
+			pr_info("%s: No free buffer available: image_mode=%d inst = 0x%p, cnt %d\n",
+				__func__, image_mode, pcam_inst, pcam_inst->no_free_buf_cnt);
 	}
 	spin_unlock_irqrestore(&pcam_inst->vq_irqlock, flags);
 	return rc;
@@ -720,6 +767,8 @@
 	list_for_each_entry(buf, &pcam_inst->free_vq, list) {
 		buf_phyaddr =
 			(uint32_t) videobuf2_to_pmem_contig(&buf->vidbuf, 0);
+		if (!buf_phyaddr)
+			pr_info("%s buf_phyaddr is null", __func__);
 		if (free_buf->ch_paddr[0] == buf_phyaddr) {
 			D("%s buf = 0x%x ", __func__, free_buf->ch_paddr[0]);
 			buf->state = MSM_BUFFER_STATE_UNUSED;
diff --git a/drivers/media/video/msm/msm_mctl_pp.c b/drivers/media/video/msm/msm_mctl_pp.c
index 5118491..469f7b7 100644
--- a/drivers/media/video/msm/msm_mctl_pp.c
+++ b/drivers/media/video/msm/msm_mctl_pp.c
@@ -153,7 +153,8 @@
 		buf_phyaddr = (unsigned long)
 			videobuf2_to_pmem_contig(&buf->vidbuf, 0) +
 			offset;
-		D("%s vb_idx=%d,vb_paddr=0x%x ch0=0x%x\n",
+		if (!buf_phyaddr)
+		pr_info("%s vb_idx=%d,vb_paddr=0x%x ch0=0x%x\n",
 		  __func__, buf->vidbuf.v4l2_buf.index,
 		  buf_phyaddr, fbuf->ch_paddr[0]);
 		if (fbuf->ch_paddr[0] == buf_phyaddr) {
@@ -315,7 +316,8 @@
 			pcam_inst->buf_offset[buf_idx][i].data_offset;
 			pp_frame->mp[i].fd = (int)mem->vaddr;
 			pp_frame->mp[i].length = mem->size;
-			D("%s frame id %d buffer %d plane %d phy addr 0x%x"
+			if (!pp_frame->mp[i].phy_addr)
+			pr_info("%s frame id %d buffer %d plane %d phy addr 0x%x"
 				" fd %d length %d\n", __func__,
 				pp_frame->frame_id, buf_idx, i,
 				(uint32_t)pp_frame->mp[i].phy_addr,
diff --git a/drivers/media/video/msm/msm_mem.c b/drivers/media/video/msm/msm_mem.c
index 34ff87ba..2790f91 100644
--- a/drivers/media/video/msm/msm_mem.c
+++ b/drivers/media/video/msm/msm_mem.c
@@ -139,6 +139,7 @@
 	if (ion_map_iommu(client, region->handle, CAMERA_DOMAIN, GEN_POOL,
 				  SZ_4K, 0, &paddr, &len, 0, 0) < 0)
 		goto out2;
+
 #elif CONFIG_ANDROID_PMEM
 	rc = get_pmem_file(info->fd, &paddr, &kvstart, &len, &file);
 	if (rc < 0) {
@@ -209,6 +210,9 @@
 	case MSM_PMEM_IHIST:
 	case MSM_PMEM_SKIN:
 	case MSM_PMEM_AEC_AWB:
+	case MSM_PMEM_BAYER_GRID:
+	case MSM_PMEM_BAYER_FOCUS:
+	case MSM_PMEM_BAYER_HIST:
 		rc = msm_pmem_table_add(ptype, pinfo, client);
 		break;
 
@@ -236,6 +240,9 @@
 	case MSM_PMEM_IHIST:
 	case MSM_PMEM_SKIN:
 	case MSM_PMEM_AEC_AWB:
+	case MSM_PMEM_BAYER_GRID:
+	case MSM_PMEM_BAYER_FOCUS:
+	case MSM_PMEM_BAYER_HIST:
 		hlist_for_each_entry_safe(region, node, n,
 				ptype, list) {
 
@@ -382,6 +389,30 @@
 		}
 	}
 
+    if (addr != 0)
+        pr_err("%s: abnormal addr == 0X%x\n", __func__, (uint32_t)addr);
+
+	return 0;
+}
+
+unsigned long msm_pmem_stats_ptov_lookup_2(
+		struct msm_cam_media_controller *mctl,
+		unsigned long addr, int *fd)
+{
+	struct msm_pmem_region *region;
+	struct hlist_node *node, *n;
+
+	hlist_for_each_entry_safe(region, node, n,
+	&mctl->stats_info.pmem_stats_list, list) {
+		if (addr == region->paddr) {
+			*fd = region->info.fd;
+			return (unsigned long)(region->vaddr);
+		}
+	}
+
+    if (addr != 0)
+        pr_err("%s: abnormal addr == 0X%x\n", __func__, (uint32_t)addr);
+
 	return 0;
 }
 
diff --git a/drivers/media/video/msm/msm_vfe32.c b/drivers/media/video/msm/msm_vfe32.c
index b92c421..f190c37 100644
--- a/drivers/media/video/msm/msm_vfe32.c
+++ b/drivers/media/video/msm/msm_vfe32.c
@@ -222,6 +222,26 @@
 		{VFE_CMD_GET_RGB_G_TABLE},
 		{VFE_CMD_GET_LA_TABLE},
 		{VFE_CMD_DEMOSAICV3_UPDATE},
+		{VFE_CMD_ACTIVE_REGION_CFG},
+ {VFE_CMD_COLOR_PROCESSING_CONFIG},
+		{VFE_CMD_STATS_WB_AEC_CONFIG},
+		{VFE_CMD_STATS_WB_AEC_UPDATE},
+		{VFE_CMD_Y_GAMMA_CONFIG},
+		{VFE_CMD_SCALE_OUTPUT1_CONFIG},
+ {VFE_CMD_SCALE_OUTPUT2_CONFIG},
+		{VFE_CMD_CAPTURE_RAW},
+		{VFE_CMD_STOP_LIVESHOT},
+		{VFE_CMD_RECONFIG_VFE},
+		{VFE_CMD_STATS_BG_START, V32_STATS_BG_LEN, V32_STATS_BG_OFF},
+ {VFE_CMD_STATS_BG_STOP},
+		{VFE_CMD_STATS_BF_START, V32_STATS_BF_LEN, V32_STATS_BF_OFF},
+		{VFE_CMD_STATS_BF_STOP},
+		{VFE_CMD_STATS_BHIST_START, V32_STATS_BHIST_LEN,
+			V32_STATS_BHIST_OFF},
+		{VFE_CMD_STATS_BHIST_STOP},
+	{VFE_CMD_SET_BAYER_ENABLE},
+		{VFE_CMD_SET_CAMERA_MODE}, 
+		{VFE_CMD_SET_SW_SHARPNESS_CMD},
 };
 
 uint32_t vfe32_AXI_WM_CFG[] = {
@@ -364,8 +384,25 @@
 	"GET_RGB_G_TABLE",
 	"GET_LA_TABLE",
 	"DEMOSAICV3_UPDATE",
+	"STATS_BG_START",
+	"STATS_BG_STOP",
+	"STATS_BF_START",
+	"STATS_BF_STOP",
+	"STATS_BHIST_START",
+	"STATS_BHIST_STOP",
 };
 
+uint8_t vfe32_use_bayer_stats(void)
+{
+    
+	if (vfe32_ctrl->ver_num.main >= 4) {
+		
+		return TRUE;
+	} else {
+		return FALSE;
+	}
+}
+
 static void vfe32_stop(void)
 {
 	uint8_t  axiBusyFlag = true;
@@ -412,6 +449,8 @@
 	msm_io_w(VFE_IMASK_WHILE_STOPPING_1,
 		vfe32_ctrl->vfebase + VFE_IRQ_MASK_1);
 
+        msm_io_dump(vfe32_ctrl->vfebase, vfe32_ctrl->register_total * 4);
+
 	msm_io_w_mb(VFE_RESET_UPON_STOP_CMD,
 		vfe32_ctrl->vfebase + VFE_GLOBAL_RESET);
 }
@@ -517,15 +556,17 @@
 	
 	vfe32_ctrl->vfeFrameId = 0;
 	
-	memset(&(vfe32_ctrl->afStatsControl), 0,
+	memset(&(vfe32_ctrl->afbfStatsControl), 0,
 		sizeof(struct vfe_stats_control));
 
 	memset(&(vfe32_ctrl->awbStatsControl), 0,
 		sizeof(struct vfe_stats_control));
 
-	memset(&(vfe32_ctrl->aecStatsControl), 0,
+	memset(&(vfe32_ctrl->aecbgStatsControl), 0,
 		sizeof(struct vfe_stats_control));
 
+	memset(&(vfe32_ctrl->bhistStatsControl), 0,
+		sizeof(struct vfe_stats_control));
 	memset(&(vfe32_ctrl->ihistStatsControl), 0,
 		sizeof(struct vfe_stats_control));
 
@@ -540,6 +581,51 @@
 	vfe32_ctrl->snapshot_frame_cnt = 0;
 }
 
+static void vfe32_program_dmi_cfg(enum VFE32_DMI_RAM_SEL bankSel)
+{
+	
+	uint32_t value = VFE_DMI_CFG_DEFAULT;
+	value += (uint32_t)bankSel;
+	CDBG("%s: banksel = %d\n", __func__, bankSel);
+
+	msm_io_w(value, vfe32_ctrl->vfebase + VFE_DMI_CFG);
+	
+	msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_ADDR);
+}
+
+static void vfe32_reset_dmi_tables(void)
+{
+	int i = 0;
+
+	
+	CDBG("Reset Bayer histogram LUT : 0\n");
+	vfe32_program_dmi_cfg(STATS_BHIST_RAM0);
+	
+	for (i = 0; i < 256; i++) {
+		msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_DATA_HI);
+		msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_DATA_LO);
+	}
+	vfe32_program_dmi_cfg(NO_MEM_SELECTED);
+
+	CDBG("Reset Bayer Histogram LUT: 1\n");
+	vfe32_program_dmi_cfg(STATS_BHIST_RAM1);
+	
+	for (i = 0; i < 256; i++) {
+		msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_DATA_HI);
+		msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_DATA_LO);
+	}
+	vfe32_program_dmi_cfg(NO_MEM_SELECTED);
+
+	CDBG("Reset IHistogram LUT\n");
+	vfe32_program_dmi_cfg(STATS_IHIST_RAM);
+	
+	for (i = 0; i < 256; i++) {
+		msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_DATA_HI);
+		msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_DATA_LO);
+	}
+	vfe32_program_dmi_cfg(NO_MEM_SELECTED);
+}
+
 static void vfe32_reset(void)
 {
 	vfe32_reset_internal_variables();
@@ -602,31 +688,45 @@
 	return 0;
 }
 
-static uint32_t vfe_stats_aec_buf_init(struct vfe_cmd_stats_buf *in)
+static uint32_t vfe_stats_aec_bg_buf_init(struct vfe_cmd_stats_buf *in)
 {
 	uint32_t *ptr = in->statsBuf;
 	uint32_t addr;
 
 	addr = ptr[0];
-	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_WR_PING_ADDR);
+	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_BG_WR_PING_ADDR);
 	addr = ptr[1];
-	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_WR_PONG_ADDR);
+	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_BG_WR_PONG_ADDR);
 
-	vfe32_ctrl->aecStatsControl.nextFrameAddrBuf = in->statsBuf[2];
+	vfe32_ctrl->aecbgStatsControl.nextFrameAddrBuf = in->statsBuf[2];
 	return 0;
 }
 
-static uint32_t vfe_stats_af_buf_init(struct vfe_cmd_stats_buf *in)
+static uint32_t vfe_stats_af_bf_buf_init(struct vfe_cmd_stats_buf *in)
 {
 	uint32_t *ptr = in->statsBuf;
 	uint32_t addr;
 
 	addr = ptr[0];
-	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_WR_PING_ADDR);
+	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_BF_WR_PING_ADDR);
 	addr = ptr[1];
-	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_WR_PONG_ADDR);
+	msm_io_w(addr, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_BF_WR_PONG_ADDR);
 
-	vfe32_ctrl->afStatsControl.nextFrameAddrBuf = in->statsBuf[2];
+	vfe32_ctrl->afbfStatsControl.nextFrameAddrBuf = in->statsBuf[2];
+	return 0;
+}
+
+static uint32_t vfe_stats_bhist_buf_init(struct vfe_cmd_stats_buf *in)
+{
+	uint32_t *ptr = in->statsBuf;
+	uint32_t addr;
+	addr = ptr[0];
+	msm_io_w(addr,
+		vfe32_ctrl->vfebase + VFE_BUS_STATS_SKIN_BHIST_WR_PING_ADDR);
+	addr = ptr[1];
+	msm_io_w(addr,
+		vfe32_ctrl->vfebase + VFE_BUS_STATS_SKIN_BHIST_WR_PONG_ADDR);
+	vfe32_ctrl->bhistStatsControl.nextFrameAddrBuf = in->statsBuf[2];
 	return 0;
 }
 
@@ -1066,17 +1166,6 @@
 	msm_io_w(value, vfe32_ctrl->vfebase + V32_TIMER_SELECT_OFF);
 }
 
-static void vfe32_program_dmi_cfg(enum VFE32_DMI_RAM_SEL bankSel)
-{
-	
-	uint32_t value = VFE_DMI_CFG_DEFAULT;
-	value += (uint32_t)bankSel;
-	CDBG("%s: banksel = %d\n", __func__, bankSel);
-
-	msm_io_w(value, vfe32_ctrl->vfebase + VFE_DMI_CFG);
-	
-	msm_io_w(0, vfe32_ctrl->vfebase + VFE_DMI_ADDR);
-}
 static void vfe32_write_gamma_cfg(enum VFE32_DMI_RAM_SEL channel_sel,
 						const uint32_t *tbl)
 {
@@ -1226,11 +1315,12 @@
 	struct msm_isp_cmd *cmd)
 {
 	int i , rc = 0;
-	uint32_t old_val = 0 , new_val = 0;
+	uint32_t old_val = 0 , new_val = 0, module_val = 0;
 	uint32_t *cmdp = NULL;
 	uint32_t *cmdp_local = NULL;
 	uint32_t snapshot_cnt = 0;
 	uint32_t temp1 = 0, temp2 = 0;
+	vfe_camera_mode_type vfe_cam_mode = VFE_CAMERA_MODE_DEFAULT; 
 
 	CDBG("vfe32_proc_general: cmdID = %s, length = %d\n",
 		vfe32_general_cmd[cmd->id], cmd->length);
@@ -1366,8 +1456,18 @@
 		rc = vfe32_operation_config(cmdp);
 		}
 		break;
-
+	case VFE_CMD_SET_BAYER_ENABLE:
+		if (*(int *)cmd->value)
+			vfe32_ctrl->ver_num.main = 4;
+		else
+			vfe32_ctrl->ver_num.main = 0;
+		break;
 	case VFE_CMD_STATS_AE_START: {
+		if (vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
 		cmdp = kmalloc(cmd->length, GFP_ATOMIC);
 		if (!cmdp) {
 			rc = -ENOMEM;
@@ -1388,6 +1488,11 @@
 		}
 		break;
 	case VFE_CMD_STATS_AF_START: {
+		if (vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
 		cmdp = kmalloc(cmd->length, GFP_ATOMIC);
 		if (!cmdp) {
 			rc = -ENOMEM;
@@ -1408,6 +1513,11 @@
 		}
 		break;
 	case VFE_CMD_STATS_AWB_START: {
+		if (vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
 		cmdp = kmalloc(cmd->length, GFP_ATOMIC);
 		if (!cmdp) {
 			rc = -ENOMEM;
@@ -1427,7 +1537,6 @@
 				cmdp, (vfe32_cmd[cmd->id].length));
 		}
 		break;
-
 	case VFE_CMD_STATS_IHIST_START: {
 		cmdp = kmalloc(cmd->length, GFP_ATOMIC);
 		if (!cmdp) {
@@ -1448,8 +1557,6 @@
 				cmdp, (vfe32_cmd[cmd->id].length));
 		}
 		break;
-
-
 	case VFE_CMD_STATS_RS_START: {
 		cmdp = kmalloc(cmd->length, GFP_ATOMIC);
 		if (!cmdp) {
@@ -1483,7 +1590,47 @@
 				cmdp, (vfe32_cmd[cmd->id].length));
 		}
 		break;
-
+	case VFE_CMD_STATS_BG_START:
+	case VFE_CMD_STATS_BF_START:
+	case VFE_CMD_STATS_BHIST_START: {
+		if (!vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
+		old_val = msm_io_r(
+					vfe32_ctrl->vfebase + VFE_STATS_CFG);
+		module_val = msm_io_r(
+					vfe32_ctrl->vfebase + VFE_MODULE_CFG);
+		if (VFE_CMD_STATS_BG_START == cmd->id) {
+			module_val |= AE_BG_ENABLE_MASK;
+			old_val |= STATS_BG_ENABLE_MASK;
+		} else if (VFE_CMD_STATS_BF_START == cmd->id) {
+			module_val |= AF_BF_ENABLE_MASK;
+			old_val |= STATS_BF_ENABLE_MASK;
+		} else {
+			module_val |= SKIN_BHIST_ENABLE_MASK;
+			old_val |= STATS_BHIST_ENABLE_MASK;
+		}
+		msm_io_w(old_val, vfe32_ctrl->vfebase + VFE_STATS_CFG);
+		msm_io_w(module_val,
+			vfe32_ctrl->vfebase + VFE_MODULE_CFG);
+		cmdp = kmalloc(cmd->length, GFP_ATOMIC);
+		if (!cmdp) {
+			rc = -ENOMEM;
+			goto proc_general_done;
+		}
+		if (copy_from_user(cmdp,
+				(void __user *)(cmd->value),
+				cmd->length)) {
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
+		msm_io_memcpy(
+			vfe32_ctrl->vfebase + vfe32_cmd[cmd->id].offset,
+			cmdp, (vfe32_cmd[cmd->id].length));
+		}
+		break;
 	case VFE_CMD_MCE_UPDATE:
 	case VFE_CMD_MCE_CFG:{
 		cmdp = kmalloc(cmd->length, GFP_ATOMIC);
@@ -2074,8 +2221,12 @@
 			goto proc_general_done;
 		}
 		break;
-
 	case VFE_CMD_STATS_AWB_STOP: {
+		if (vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
 		old_val = msm_io_r(vfe32_ctrl->vfebase + VFE_MODULE_CFG);
 		old_val &= ~AWB_ENABLE_MASK;
 		msm_io_w(old_val,
@@ -2083,6 +2234,11 @@
 		}
 		break;
 	case VFE_CMD_STATS_AE_STOP: {
+		if (vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
 		old_val = msm_io_r(vfe32_ctrl->vfebase + VFE_MODULE_CFG);
 		old_val &= ~AE_BG_ENABLE_MASK;
 		msm_io_w(old_val,
@@ -2090,6 +2246,11 @@
 		}
 		break;
 	case VFE_CMD_STATS_AF_STOP: {
+		if (vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
 		old_val = msm_io_r(vfe32_ctrl->vfebase + VFE_MODULE_CFG);
 		old_val &= ~AF_BF_ENABLE_MASK;
 		msm_io_w(old_val,
@@ -2120,6 +2281,24 @@
 			vfe32_ctrl->vfebase + VFE_MODULE_CFG);
 		}
 		break;
+	case VFE_CMD_STATS_BG_STOP:
+	case VFE_CMD_STATS_BF_STOP:
+	case VFE_CMD_STATS_BHIST_STOP: {
+		if (!vfe32_use_bayer_stats()) {
+			
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
+		old_val = msm_io_r(vfe32_ctrl->vfebase + VFE_STATS_CFG);
+		if (VFE_CMD_STATS_BG_STOP == cmd->id)
+			old_val &= ~STATS_BG_ENABLE_MASK;
+		else if (VFE_CMD_STATS_BF_STOP == cmd->id)
+			old_val &= ~STATS_BF_ENABLE_MASK;
+		else
+			old_val &= ~STATS_BHIST_ENABLE_MASK;
+		msm_io_w(old_val, vfe32_ctrl->vfebase + VFE_STATS_CFG);
+		}
+		break;
 	case VFE_CMD_STOP:
 		pr_info("vfe32_proc_general: cmdID = %s\n",
 			vfe32_general_cmd[cmd->id]);
@@ -2402,6 +2581,25 @@
 		CDBG("%s Stopping liveshot ", __func__);
 		vfe32_stop_liveshot(pmctl);
 		break;
+	
+	case VFE_CMD_SET_CAMERA_MODE:
+		if (copy_from_user(&vfe_cam_mode, (void __user *)(cmd->value),
+				sizeof(vfe_camera_mode_type))) {
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
+		pr_info("%s: cmdID = VFE_CMD_SET_CAMERA_MODE: %d\n", __func__, vfe_cam_mode);
+		vfe32_ctrl->vfe_camera_mode = vfe_cam_mode;
+		break;
+	
+	case VFE_CMD_SET_SW_SHARPNESS_CMD:
+		if (copy_from_user(&temp1, (void __user *)(cmd->value),
+				sizeof(struct stats_htc_af_input))) {
+			rc = -EFAULT;
+			goto proc_general_done;
+		}
+		memcpy(&pmctl->htc_af_info.af_input, &temp1, sizeof(struct stats_htc_af_input));
+		break;
 	default:
 		if (cmd->length != vfe32_cmd[cmd->id].length)
 			return -EINVAL;
@@ -2425,18 +2623,27 @@
 	return rc;
 }
 
-static void vfe32_stats_af_ack(struct vfe_cmd_stats_ack *pAck)
+static void vfe32_stats_af_bf_ack(struct vfe_cmd_stats_ack *pAck)
 {
 	unsigned long flags;
 	spinlock_t *lock = (vfe32_ctrl->stats_comp ?
 		&vfe32_ctrl->comp_stats_ack_lock :
-		&vfe32_ctrl->af_ack_lock);
+		&vfe32_ctrl->af_bf_ack_lock);
 	spin_lock_irqsave(lock, flags);
-	vfe32_ctrl->afStatsControl.nextFrameAddrBuf = pAck->nextStatsBuf;
-	vfe32_ctrl->afStatsControl.ackPending = FALSE;
+	vfe32_ctrl->afbfStatsControl.nextFrameAddrBuf = pAck->nextStatsBuf;
+	vfe32_ctrl->afbfStatsControl.ackPending = FALSE;
 	spin_unlock_irqrestore(lock, flags);
 }
 
+static void vfe32_stats_bhist_ack(struct vfe_cmd_stats_ack *pAck)
+{
+	unsigned long flags;
+	spin_lock_irqsave(&vfe32_ctrl->bhist_ack_lock, flags);
+	vfe32_ctrl->bhistStatsControl.nextFrameAddrBuf = pAck->nextStatsBuf;
+	vfe32_ctrl->bhistStatsControl.ackPending = FALSE;
+	spin_unlock_irqrestore(&vfe32_ctrl->bhist_ack_lock, flags);
+}
+
 static void vfe32_stats_awb_ack(struct vfe_cmd_stats_ack *pAck)
 {
 	unsigned long flags;
@@ -2449,15 +2656,15 @@
 	spin_unlock_irqrestore(lock, flags);
 }
 
-static void vfe32_stats_aec_ack(struct vfe_cmd_stats_ack *pAck)
+static void vfe32_stats_aec_bg_ack(struct vfe_cmd_stats_ack *pAck)
 {
 	unsigned long flags;
 	spinlock_t *lock = (vfe32_ctrl->stats_comp ?
 		&vfe32_ctrl->comp_stats_ack_lock :
-		&vfe32_ctrl->aec_ack_lock);
+		&vfe32_ctrl->aec_bg_ack_lock);
 	spin_lock_irqsave(lock, flags);
-	vfe32_ctrl->aecStatsControl.nextFrameAddrBuf = pAck->nextStatsBuf;
-	vfe32_ctrl->aecStatsControl.ackPending = FALSE;
+	vfe32_ctrl->aecbgStatsControl.nextFrameAddrBuf = pAck->nextStatsBuf;
+	vfe32_ctrl->aecbgStatsControl.ackPending = FALSE;
 	spin_unlock_irqrestore(lock, flags);
 }
 
@@ -2509,6 +2716,10 @@
 	out->camifStatus = msm_io_r(temp);
 	CDBG("camifStatus  = 0x%x\n", out->camifStatus);
 
+    if ((!(out->vfeIrqStatus0 & 0x01000000)) && vfe32_ctrl->stats_comp) {
+        out->vfeIrqStatus0 = (out->vfeIrqStatus0 & 0xFFF01FFF);
+    }
+    
 	
 	msm_io_w(out->vfeIrqStatus0, vfe32_ctrl->vfebase + VFE_IRQ_CLEAR_0);
 	msm_io_w(out->vfeIrqStatus1, vfe32_ctrl->vfebase + VFE_IRQ_CLEAR_1);
@@ -2696,13 +2907,38 @@
 	msm_io_w(0, vfe32_ctrl->vfebase + VFE_CLAMP_MIN);
 	msm_io_w(0xFFFFFF, vfe32_ctrl->vfebase + VFE_CLAMP_MAX);
 
-	
-	msm_io_w(0x3980007, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_UB_CFG);
-	msm_io_w(0x3A00007, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_UB_CFG);
-	msm_io_w(0x3A8000F, vfe32_ctrl->vfebase + VFE_BUS_STATS_AWB_UB_CFG);
-	msm_io_w(0x3B80007, vfe32_ctrl->vfebase + VFE_BUS_STATS_RS_UB_CFG);
-	msm_io_w(0x3C0001F, vfe32_ctrl->vfebase + VFE_BUS_STATS_CS_UB_CFG);
-	msm_io_w(0x3E0001F, vfe32_ctrl->vfebase + VFE_BUS_STATS_HIST_UB_CFG);
+	CDBG("%s: Use bayer stats = %d\n", __func__, vfe32_use_bayer_stats());
+	pr_info("%s vfe_camera_mode=%d\n", __func__, vfe32_ctrl->vfe_camera_mode);
+	if (!vfe32_use_bayer_stats()) {
+		msm_io_w(0x3980007, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_BG_UB_CFG);
+		msm_io_w(0x3A00007, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_BF_UB_CFG);
+		msm_io_w(0x3A8000F, vfe32_ctrl->vfebase + VFE_BUS_STATS_AWB_UB_CFG);
+		msm_io_w(0x3B80007, vfe32_ctrl->vfebase + VFE_BUS_STATS_RS_UB_CFG);
+		msm_io_w(0x3C0001F, vfe32_ctrl->vfebase + VFE_BUS_STATS_CS_UB_CFG);
+		msm_io_w(0x3E0001F, vfe32_ctrl->vfebase + VFE_BUS_STATS_HIST_UB_CFG);
+	} else {
+		
+		if (vfe32_ctrl->vfe_camera_mode == VFE_CAMERA_MODE_ZOE || vfe32_ctrl->vfe_camera_mode == VFE_CAMERA_MODE_ZSL) {
+			pr_info("disable RSCS for UB config\n");
+			msm_io_w(0x0, vfe32_ctrl->vfebase + VFE_BUS_STATS_RS_UB_CFG);
+			msm_io_w(0x0, vfe32_ctrl->vfebase + VFE_BUS_STATS_CS_UB_CFG);
+			msm_io_w(0x310001F, vfe32_ctrl->vfebase + VFE_BUS_STATS_HIST_UB_CFG);
+			msm_io_w(0x330007F, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_BG_UB_CFG);
+			msm_io_w(0x3B0003F, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_BF_UB_CFG);
+			msm_io_w(0x3F0000F, vfe32_ctrl->vfebase + VFE_BUS_STATS_SKIN_BHIST_UB_CFG);
+		}
+		else {
+			pr_info("enable RSCS for UB config\n");
+			msm_io_w(0x2E80007, vfe32_ctrl->vfebase + VFE_BUS_STATS_RS_UB_CFG);
+			msm_io_w(0x2F0001F, vfe32_ctrl->vfebase + VFE_BUS_STATS_CS_UB_CFG);
+			msm_io_w(0x310001F, vfe32_ctrl->vfebase + VFE_BUS_STATS_HIST_UB_CFG);
+			msm_io_w(0x330007F, vfe32_ctrl->vfebase + VFE_BUS_STATS_AEC_BG_UB_CFG);
+			msm_io_w(0x3B0003F, vfe32_ctrl->vfebase + VFE_BUS_STATS_AF_BF_UB_CFG);
+			msm_io_w(0x3F0000F, vfe32_ctrl->vfebase + VFE_BUS_STATS_SKIN_BHIST_UB_CFG);
+		}
+		
+	}
+	vfe32_reset_dmi_tables();
 }
 
 static void vfe32_process_reset_irq(void)
@@ -3042,17 +3278,19 @@
 
 	switch (statsNum) {
 	case statsAeNum:{
-		msgStats.id = MSG_ID_STATS_AEC;
-		spin_lock_irqsave(&vfe32_ctrl->aec_ack_lock, flags);
-		vfe32_ctrl->aecStatsControl.ackPending = TRUE;
-		spin_unlock_irqrestore(&vfe32_ctrl->aec_ack_lock, flags);
+		msgStats.id = (!vfe32_use_bayer_stats()) ? MSG_ID_STATS_AEC
+				: MSG_ID_STATS_BG;
+		spin_lock_irqsave(&vfe32_ctrl->aec_bg_ack_lock, flags);
+		vfe32_ctrl->aecbgStatsControl.ackPending = TRUE;
+		spin_unlock_irqrestore(&vfe32_ctrl->aec_bg_ack_lock, flags);
 		}
 		break;
 	case statsAfNum:{
-		msgStats.id = MSG_ID_STATS_AF;
-		spin_lock_irqsave(&vfe32_ctrl->af_ack_lock, flags);
-		vfe32_ctrl->afStatsControl.ackPending = TRUE;
-		spin_unlock_irqrestore(&vfe32_ctrl->af_ack_lock, flags);
+		msgStats.id = (!vfe32_use_bayer_stats()) ? MSG_ID_STATS_AF
+				: MSG_ID_STATS_BF;
+		spin_lock_irqsave(&vfe32_ctrl->af_bf_ack_lock, flags);
+		vfe32_ctrl->afbfStatsControl.ackPending = TRUE;
+		spin_unlock_irqrestore(&vfe32_ctrl->af_bf_ack_lock, flags);
 		}
 		break;
 	case statsAwbNum: {
@@ -3084,7 +3322,13 @@
 		spin_unlock_irqrestore(&vfe32_ctrl->cs_ack_lock, flags);
 		}
 		break;
-
+	case statsSkinNum: {
+		msgStats.id = MSG_ID_STATS_BHIST;
+		spin_lock_irqsave(&vfe32_ctrl->bhist_ack_lock, flags);
+		vfe32_ctrl->bhistStatsControl.ackPending = TRUE;
+		spin_unlock_irqrestore(&vfe32_ctrl->bhist_ack_lock, flags);
+		}
+		break;
 	default:
 		goto stats_done;
 	}
@@ -3105,13 +3349,14 @@
 	msgStats.frame_id = vfe32_ctrl->vfeFrameId;
 	msgStats.status_bits = status_bits;
 
-	msgStats.aec.buff = vfe32_ctrl->aecStatsControl.bufToRender;
+	msgStats.aec.buff = vfe32_ctrl->aecbgStatsControl.bufToRender;  
 	msgStats.awb.buff = vfe32_ctrl->awbStatsControl.bufToRender;
-	msgStats.af.buff = vfe32_ctrl->afStatsControl.bufToRender;
+	msgStats.af.buff = vfe32_ctrl->afbfStatsControl.bufToRender;  
 
 	msgStats.ihist.buff = vfe32_ctrl->ihistStatsControl.bufToRender;
 	msgStats.rs.buff = vfe32_ctrl->rsStatsControl.bufToRender;
 	msgStats.cs.buff = vfe32_ctrl->csStatsControl.bufToRender;
+	msgStats.skin.buff = vfe32_ctrl->bhistStatsControl.bufToRender; 
 
 	temp = msm_io_r(vfe32_ctrl->vfebase + VFE_STATS_AWB_SGW_CFG);
 	msgStats.awb_ymin = (0xFF00 & temp) >> 8;
@@ -3121,23 +3366,23 @@
 				&msgStats);
 }
 
-static void vfe32_process_stats_ae_irq(void)
+static void vfe32_process_stats_ae_bg_irq(void)
 {
 	unsigned long flags;
-	spin_lock_irqsave(&vfe32_ctrl->aec_ack_lock, flags);
-	if (!(vfe32_ctrl->aecStatsControl.ackPending)) {
-		spin_unlock_irqrestore(&vfe32_ctrl->aec_ack_lock, flags);
-		vfe32_ctrl->aecStatsControl.bufToRender =
+	spin_lock_irqsave(&vfe32_ctrl->aec_bg_ack_lock, flags);
+	if (!(vfe32_ctrl->aecbgStatsControl.ackPending)) {
+		spin_unlock_irqrestore(&vfe32_ctrl->aec_bg_ack_lock, flags);
+		vfe32_ctrl->aecbgStatsControl.bufToRender =
 			vfe32_process_stats_irq_common(statsAeNum,
-			vfe32_ctrl->aecStatsControl.nextFrameAddrBuf);
+			vfe32_ctrl->aecbgStatsControl.nextFrameAddrBuf);
 
-		vfe_send_stats_msg(vfe32_ctrl->aecStatsControl.bufToRender,
+		vfe_send_stats_msg(vfe32_ctrl->aecbgStatsControl.bufToRender,
 						statsAeNum);
 	} else{
-		spin_unlock_irqrestore(&vfe32_ctrl->aec_ack_lock, flags);
-		vfe32_ctrl->aecStatsControl.droppedStatsFrameCount++;
+		spin_unlock_irqrestore(&vfe32_ctrl->aec_bg_ack_lock, flags);
+		vfe32_ctrl->aecbgStatsControl.droppedStatsFrameCount++;
 		CDBG("%s: droppedStatsFrameCount = %d", __func__,
-			vfe32_ctrl->aecStatsControl.droppedStatsFrameCount);
+			vfe32_ctrl->aecbgStatsControl.droppedStatsFrameCount);
 	}
 }
 
@@ -3161,23 +3406,39 @@
 	}
 }
 
-static void vfe32_process_stats_af_irq(void)
+static void vfe32_process_stats_af_bf_irq(void)
 {
 	unsigned long flags;
-	spin_lock_irqsave(&vfe32_ctrl->af_ack_lock, flags);
-	if (!(vfe32_ctrl->afStatsControl.ackPending)) {
-		spin_unlock_irqrestore(&vfe32_ctrl->af_ack_lock, flags);
-		vfe32_ctrl->afStatsControl.bufToRender =
+	spin_lock_irqsave(&vfe32_ctrl->af_bf_ack_lock, flags);
+	if (!(vfe32_ctrl->afbfStatsControl.ackPending)) {
+		spin_unlock_irqrestore(&vfe32_ctrl->af_bf_ack_lock, flags);
+		vfe32_ctrl->afbfStatsControl.bufToRender =
 			vfe32_process_stats_irq_common(statsAfNum,
-			vfe32_ctrl->afStatsControl.nextFrameAddrBuf);
+			vfe32_ctrl->afbfStatsControl.nextFrameAddrBuf);
 
-		vfe_send_stats_msg(vfe32_ctrl->afStatsControl.bufToRender,
+		vfe_send_stats_msg(vfe32_ctrl->afbfStatsControl.bufToRender,
 						statsAfNum);
 	} else{
-		spin_unlock_irqrestore(&vfe32_ctrl->af_ack_lock, flags);
-		vfe32_ctrl->afStatsControl.droppedStatsFrameCount++;
-		CDBG("%s: droppedStatsFrameCount = %d", __func__,
-			vfe32_ctrl->afStatsControl.droppedStatsFrameCount);
+		spin_unlock_irqrestore(&vfe32_ctrl->af_bf_ack_lock, flags);
+		vfe32_ctrl->afbfStatsControl.droppedStatsFrameCount++;
+	}
+}
+
+static void vfe32_process_stats_bhist_irq(void)
+{
+	unsigned long flags;
+	spin_lock_irqsave(&vfe32_ctrl->bhist_ack_lock, flags);
+	if (!(vfe32_ctrl->bhistStatsControl.ackPending)) {
+		spin_unlock_irqrestore(&vfe32_ctrl->bhist_ack_lock, flags);
+		vfe32_ctrl->bhistStatsControl.bufToRender =
+			vfe32_process_stats_irq_common(statsSkinNum,
+			vfe32_ctrl->bhistStatsControl.nextFrameAddrBuf);
+
+		vfe_send_stats_msg(vfe32_ctrl->bhistStatsControl.bufToRender,
+						statsSkinNum);
+	} else{
+		spin_unlock_irqrestore(&vfe32_ctrl->bhist_ack_lock, flags);
+		vfe32_ctrl->bhistStatsControl.droppedStatsFrameCount++;
 	}
 }
 
@@ -3236,21 +3497,24 @@
 	CDBG("%s, stats = 0x%x\n", __func__, status_bits);
 
 	spin_lock_irqsave(&vfe32_ctrl->comp_stats_ack_lock, flags);
-	if (status_bits & VFE_IRQ_STATUS0_STATS_AEC) {
-		if (!vfe32_ctrl->aecStatsControl.ackPending) {
-			vfe32_ctrl->aecStatsControl.ackPending = TRUE;
-			vfe32_ctrl->aecStatsControl.bufToRender =
+	
+	if (status_bits & VFE_IRQ_STATUS0_STATS_AEC_BG) {
+		if (!vfe32_ctrl->aecbgStatsControl.ackPending) {
+			vfe32_ctrl->aecbgStatsControl.ackPending = TRUE;
+			vfe32_ctrl->aecbgStatsControl.bufToRender =
 				vfe32_process_stats_irq_common(statsAeNum,
-				vfe32_ctrl->aecStatsControl.nextFrameAddrBuf);
+				vfe32_ctrl->aecbgStatsControl.nextFrameAddrBuf);
+            CDBG("%s: buftorender : 0x%X, nextframe : 0x%X\n", __func__, vfe32_ctrl->aecbgStatsControl.bufToRender,
+                vfe32_ctrl->aecbgStatsControl.nextFrameAddrBuf);
 			process_stats = true;
 		} else{
-			vfe32_ctrl->aecStatsControl.bufToRender = 0;
-			vfe32_ctrl->aecStatsControl.droppedStatsFrameCount++;
+			vfe32_ctrl->aecbgStatsControl.bufToRender = 0;
+			vfe32_ctrl->aecbgStatsControl.droppedStatsFrameCount++;
 		}
 	} else {
-		vfe32_ctrl->aecStatsControl.bufToRender = 0;
+		vfe32_ctrl->aecbgStatsControl.bufToRender = 0;
 	}
-
+	
 	if (status_bits & VFE_IRQ_STATUS0_STATS_AWB) {
 		if (!vfe32_ctrl->awbStatsControl.ackPending) {
 			vfe32_ctrl->awbStatsControl.ackPending = TRUE;
@@ -3266,21 +3530,22 @@
 		vfe32_ctrl->awbStatsControl.bufToRender = 0;
 	}
 
-
-	if (status_bits & VFE_IRQ_STATUS0_STATS_AF) {
-		if (!vfe32_ctrl->afStatsControl.ackPending) {
-			vfe32_ctrl->afStatsControl.ackPending = TRUE;
-			vfe32_ctrl->afStatsControl.bufToRender =
+	
+	if (status_bits & VFE_IRQ_STATUS0_STATS_AF_BF) {
+		if (!vfe32_ctrl->afbfStatsControl.ackPending) {
+			vfe32_ctrl->afbfStatsControl.ackPending = TRUE;
+			vfe32_ctrl->afbfStatsControl.bufToRender =
 				vfe32_process_stats_irq_common(statsAfNum,
-				vfe32_ctrl->afStatsControl.nextFrameAddrBuf);
+				vfe32_ctrl->afbfStatsControl.nextFrameAddrBuf);
 			process_stats = true;
 		} else {
-			vfe32_ctrl->afStatsControl.bufToRender = 0;
-			vfe32_ctrl->afStatsControl.droppedStatsFrameCount++;
+			vfe32_ctrl->afbfStatsControl.bufToRender = 0;
+			vfe32_ctrl->afbfStatsControl.droppedStatsFrameCount++;
 		}
 	} else {
-		vfe32_ctrl->afStatsControl.bufToRender = 0;
+		vfe32_ctrl->afbfStatsControl.bufToRender = 0;
 	}
+	
 
 	if (status_bits & VFE_IRQ_STATUS0_STATS_IHIST) {
 		if (!vfe32_ctrl->ihistStatsControl.ackPending) {
@@ -3327,6 +3592,18 @@
 	} else {
 		vfe32_ctrl->csStatsControl.bufToRender = 0;
 	}
+    if (status_bits & VFE_IRQ_STATUS0_STATS_SK_BHIST) {
+	if (!(vfe32_ctrl->bhistStatsControl.ackPending)) {
+        vfe32_ctrl->bhistStatsControl.ackPending = TRUE;
+		vfe32_ctrl->bhistStatsControl.bufToRender =
+			vfe32_process_stats_irq_common(statsSkinNum,
+			vfe32_ctrl->bhistStatsControl.nextFrameAddrBuf);
+        process_stats = true;
+	} else{
+		vfe32_ctrl->bhistStatsControl.droppedStatsFrameCount++;
+        vfe32_ctrl->bhistStatsControl.bufToRender = 0;
+	}
+    }
 
 	spin_unlock_irqrestore(&vfe32_ctrl->comp_stats_ack_lock, flags);
 	if (process_stats)
@@ -3356,7 +3633,8 @@
 		vfe32_process_stats_irq(irqstatus);
 		return;
 	}
-
+	
+    
 	switch (irqstatus) {
 	case VFE_IRQ_STATUS0_CAMIF_SOF_MASK:
 		CDBG("irq	camifSofIrq\n");
@@ -3370,17 +3648,21 @@
 		CDBG("irq	resetAckIrq\n");
 		vfe32_process_reset_irq();
 		break;
-	case VFE_IRQ_STATUS0_STATS_AEC:
-		CDBG("Stats AEC irq occured.\n");
-		vfe32_process_stats_ae_irq();
-		break;
+	case VFE_IRQ_STATUS0_STATS_AEC_BG:
+	    CDBG("Stats AEC irq occured.\n");
+	    vfe32_process_stats_ae_bg_irq();
+	    break;
 	case VFE_IRQ_STATUS0_STATS_AWB:
-		CDBG("Stats AWB irq occured.\n");
+	    CDBG("Stats AWB irq occured.\n");
 		vfe32_process_stats_awb_irq();
 		break;
-	case VFE_IRQ_STATUS0_STATS_AF:
+	case VFE_IRQ_STATUS0_STATS_AF_BF:
 		CDBG("Stats AF irq occured.\n");
-		vfe32_process_stats_af_irq();
+		vfe32_process_stats_af_bf_irq();
+		break;
+	case VFE_IRQ_STATUS0_STATS_SK_BHIST:
+		CDBG("Stats BHIST irq occured.\n");
+		vfe32_process_stats_bhist_irq();
 		break;
 	case VFE_IRQ_STATUS0_STATS_IHIST:
 		CDBG("Stats IHIST irq occured.\n");
@@ -3484,10 +3766,10 @@
 			} else {
 				
 				if (qcmd->vfeInterruptStatus0 &
-						VFE_IRQ_STATUS0_STATS_AEC)
+						VFE_IRQ_STATUS0_STATS_AEC_BG)
 					v4l2_subdev_notify(&axi_ctrl->subdev,
 					NOTIFY_VFE_IRQ,
-					(void *)VFE_IRQ_STATUS0_STATS_AEC);
+					(void *)VFE_IRQ_STATUS0_STATS_AEC_BG);
 
 				if (qcmd->vfeInterruptStatus0 &
 						VFE_IRQ_STATUS0_STATS_AWB)
@@ -3496,10 +3778,17 @@
 					(void *)VFE_IRQ_STATUS0_STATS_AWB);
 
 				if (qcmd->vfeInterruptStatus0 &
-						VFE_IRQ_STATUS0_STATS_AF)
+						VFE_IRQ_STATUS0_STATS_AF_BF)
 					v4l2_subdev_notify(&axi_ctrl->subdev,
 					NOTIFY_VFE_IRQ,
-					(void *)VFE_IRQ_STATUS0_STATS_AF);
+					(void *)VFE_IRQ_STATUS0_STATS_AF_BF);
+
+				if (qcmd->vfeInterruptStatus0 &
+						VFE_IRQ_STATUS0_STATS_SK_BHIST)
+					v4l2_subdev_notify(&axi_ctrl->subdev,
+					NOTIFY_VFE_IRQ,
+					(void *)VFE_IRQ_STATUS0_STATS_SK_BHIST);
+
 				if (qcmd->vfeInterruptStatus0 &
 						VFE_IRQ_STATUS0_STATS_IHIST)
 					v4l2_subdev_notify(&axi_ctrl->subdev,
@@ -3614,7 +3903,10 @@
 		cmd->cmd_type != CMD_STATS_IHIST_BUF_RELEASE &&
 		cmd->cmd_type != CMD_STATS_RS_BUF_RELEASE &&
 		cmd->cmd_type != CMD_STATS_CS_BUF_RELEASE &&
-		cmd->cmd_type != CMD_STATS_AF_BUF_RELEASE) {
+		cmd->cmd_type != CMD_STATS_AF_BUF_RELEASE &&
+		cmd->cmd_type != CMD_STATS_BG_BUF_RELEASE &&
+		cmd->cmd_type != CMD_STATS_BF_BUF_RELEASE &&
+		cmd->cmd_type != CMD_STATS_BHIST_BUF_RELEASE) {
 		if (copy_from_user(&vfecmd,
 				(void __user *)(cmd->value),
 				sizeof(vfecmd))) {
@@ -3646,7 +3938,10 @@
 		(cmd->cmd_type == CMD_STATS_IHIST_ENABLE) ||
 		(cmd->cmd_type == CMD_STATS_RS_ENABLE)    ||
 		(cmd->cmd_type == CMD_STATS_CS_ENABLE)    ||
-		(cmd->cmd_type == CMD_STATS_AEC_ENABLE)) {
+		(cmd->cmd_type == CMD_STATS_AEC_ENABLE)   ||
+		(cmd->cmd_type == CMD_STATS_BG_ENABLE)    ||
+		(cmd->cmd_type == CMD_STATS_BF_ENABLE)    ||
+		(cmd->cmd_type == CMD_STATS_BHIST_ENABLE)) {
 		struct axidata *axid;
 		axid = data;
 		if (!axid) {
@@ -3672,10 +3967,15 @@
 		
 		switch (cmd->cmd_type) {
 		case CMD_STATS_AEC_ENABLE:
-			rc = vfe_stats_aec_buf_init(scfg);
+		case CMD_STATS_BG_ENABLE:
+			rc = vfe_stats_aec_bg_buf_init(scfg);
 			break;
 		case CMD_STATS_AF_ENABLE:
-			rc = vfe_stats_af_buf_init(scfg);
+		case CMD_STATS_BF_ENABLE:
+			rc = vfe_stats_af_bf_buf_init(scfg);
+			break;
+		case CMD_STATS_BHIST_ENABLE:
+			rc = vfe_stats_bhist_buf_init(scfg);
 			break;
 		case CMD_STATS_AWB_ENABLE:
 			rc = vfe_stats_awb_buf_init(scfg);
@@ -3700,7 +4000,6 @@
 	case CMD_GENERAL:
 		rc = vfe32_proc_general(pmctl, &vfecmd);
 		break;
-
 	case CMD_CONFIG_PING_ADDR: {
 		int path = *((int *)cmd->value);
 		struct vfe32_output_ch *outch = vfe32_get_ch(path);
@@ -3729,10 +4028,15 @@
 	case CMD_SNAP_BUF_RELEASE:
 		break;
 	case CMD_STATS_AEC_BUF_RELEASE:
-		vfe32_stats_aec_ack(sack);
+	case CMD_STATS_BG_BUF_RELEASE:
+		vfe32_stats_aec_bg_ack(sack);
 		break;
 	case CMD_STATS_AF_BUF_RELEASE:
-		vfe32_stats_af_ack(sack);
+	case CMD_STATS_BF_BUF_RELEASE:
+		vfe32_stats_af_bf_ack(sack);
+		break;
+	case CMD_STATS_BHIST_BUF_RELEASE:
+		vfe32_stats_bhist_ack(sack);
 		break;
 	case CMD_STATS_AWB_BUF_RELEASE:
 		vfe32_stats_awb_ack(sack);
@@ -3868,15 +4172,17 @@
 {
 	int rc = 0;
 	v4l2_set_subdev_hostdata(sd, mctl);
+	pr_info("%s\n", __func__);
 
 	spin_lock_init(&vfe32_ctrl->stop_flag_lock);
 	spin_lock_init(&vfe32_ctrl->state_lock);
 	spin_lock_init(&vfe32_ctrl->io_lock);
 	spin_lock_init(&vfe32_ctrl->update_ack_lock);
 
-	spin_lock_init(&vfe32_ctrl->aec_ack_lock);
+	spin_lock_init(&vfe32_ctrl->aec_bg_ack_lock);
 	spin_lock_init(&vfe32_ctrl->awb_ack_lock);
-	spin_lock_init(&vfe32_ctrl->af_ack_lock);
+	spin_lock_init(&vfe32_ctrl->af_bf_ack_lock);
+	spin_lock_init(&vfe32_ctrl->bhist_ack_lock);
 	spin_lock_init(&vfe32_ctrl->ihist_ack_lock);
 	spin_lock_init(&vfe32_ctrl->rs_ack_lock);
 	spin_lock_init(&vfe32_ctrl->cs_ack_lock);
@@ -3888,6 +4194,7 @@
 	vfe32_ctrl->update_la = false;
 	vfe32_ctrl->update_gamma = false;
 	vfe32_ctrl->hfr_mode = HFR_MODE_OFF;
+	vfe32_ctrl->vfe_camera_mode = VFE_CAMERA_MODE_DEFAULT;
 
 	return rc;
 }
@@ -4203,6 +4510,7 @@
 		axi32_do_tasklet, (unsigned long)axi_ctrl);
 
 	vfe32_ctrl->pdev = pdev;
+	vfe32_ctrl->ver_num.main = 0;
 	msm_cam_register_subdev_node(&vfe32_ctrl->subdev, VFE_DEV, 0);
 	
 	return 0;
diff --git a/drivers/media/video/msm/msm_vfe32.h b/drivers/media/video/msm/msm_vfe32.h
index ff2e578..5c00d56 100644
--- a/drivers/media/video/msm/msm_vfe32.h
+++ b/drivers/media/video/msm/msm_vfe32.h
@@ -67,12 +67,13 @@
 #define VFE_IRQ_STATUS1_RESET_AXI_HALT_ACK_MASK   0x00800000
 #define VFE_IRQ_STATUS0_STATS_COMPOSIT_MASK       0x01000000
 
-#define VFE_IRQ_STATUS0_STATS_AEC     0x2000  
-#define VFE_IRQ_STATUS0_STATS_AF      0x4000  
-#define VFE_IRQ_STATUS0_STATS_AWB     0x8000  
-#define VFE_IRQ_STATUS0_STATS_RS      0x10000  
-#define VFE_IRQ_STATUS0_STATS_CS      0x20000  
-#define VFE_IRQ_STATUS0_STATS_IHIST   0x40000  
+#define VFE_IRQ_STATUS0_STATS_AEC_BG    0x2000  
+#define VFE_IRQ_STATUS0_STATS_AF_BF     0x4000  
+#define VFE_IRQ_STATUS0_STATS_AWB       0x8000  
+#define VFE_IRQ_STATUS0_STATS_RS        0x10000  
+#define VFE_IRQ_STATUS0_STATS_CS        0x20000  
+#define VFE_IRQ_STATUS0_STATS_IHIST     0x40000  
+#define VFE_IRQ_STATUS0_STATS_SK_BHIST  0x80000 
 
 #define VFE_IRQ_STATUS0_SYNC_TIMER0   0x2000000  
 #define VFE_IRQ_STATUS0_SYNC_TIMER1   0x4000000  
@@ -111,8 +112,13 @@
 #define RS_CS_ENABLE_MASK 0x00000300   
 #define CLF_ENABLE_MASK 0x00002000     
 #define IHIST_ENABLE_MASK 0x00010000   
+#define SKIN_BHIST_ENABLE_MASK 0x00080000 
 #define STATS_ENABLE_MASK 0x000903E0   
 
+#define STATS_BG_ENABLE_MASK     0x00000002 
+#define STATS_BF_ENABLE_MASK     0x00000004 
+#define STATS_BHIST_ENABLE_MASK  0x00000008 
+
 #define VFE_REG_UPDATE_TRIGGER           1
 #define VFE_PM_BUF_MAX_CNT_MASK          0xFF
 #define VFE_DMI_CFG_DEFAULT              0x00000100
@@ -314,6 +320,15 @@
 #define V32_CLF_CHROMA_UPDATE_OFF 0x000006F0
 #define V32_CLF_CHROMA_UPDATE_LEN 8
 
+#define V32_STATS_BG_OFF 0x00000700
+#define V32_STATS_BG_LEN 12
+
+#define V32_STATS_BF_OFF 0x0000070c
+#define V32_STATS_BF_LEN 24
+
+#define V32_STATS_BHIST_OFF 0x00000724
+#define V32_STATS_BHIST_LEN 8
+
 struct vfe_cmd_hw_version {
 	uint32_t minorVersion;
 	uint32_t majorVersion;
@@ -777,12 +792,12 @@
 #define VFE_AXI_STATUS        0x000001DC
 #define VFE_BUS_STATS_PING_PONG_BASE    0x000000F4
 
-#define VFE_BUS_STATS_AEC_WR_PING_ADDR    0x000000F4
-#define VFE_BUS_STATS_AEC_WR_PONG_ADDR    0x000000F8
-#define VFE_BUS_STATS_AEC_UB_CFG          0x000000FC
-#define VFE_BUS_STATS_AF_WR_PING_ADDR     0x00000100
-#define VFE_BUS_STATS_AF_WR_PONG_ADDR     0x00000104
-#define VFE_BUS_STATS_AF_UB_CFG           0x00000108
+#define VFE_BUS_STATS_AEC_BG_WR_PING_ADDR    0x000000F4
+#define VFE_BUS_STATS_AEC_BG_WR_PONG_ADDR    0x000000F8
+#define VFE_BUS_STATS_AEC_BG_UB_CFG          0x000000FC
+#define VFE_BUS_STATS_AF_BF_WR_PING_ADDR     0x00000100
+#define VFE_BUS_STATS_AF_BF_WR_PONG_ADDR     0x00000104
+#define VFE_BUS_STATS_AF_BF_UB_CFG           0x00000108
 #define VFE_BUS_STATS_AWB_WR_PING_ADDR    0x0000010C
 #define VFE_BUS_STATS_AWB_WR_PONG_ADDR    0x00000110
 #define VFE_BUS_STATS_AWB_UB_CFG          0x00000114
@@ -796,9 +811,9 @@
 #define VFE_BUS_STATS_HIST_WR_PING_ADDR   0x00000130
 #define VFE_BUS_STATS_HIST_WR_PONG_ADDR   0x00000134
 #define VFE_BUS_STATS_HIST_UB_CFG          0x00000138
-#define VFE_BUS_STATS_SKIN_WR_PING_ADDR    0x0000013C
-#define VFE_BUS_STATS_SKIN_WR_PONG_ADDR    0x00000140
-#define VFE_BUS_STATS_SKIN_UB_CFG          0x00000144
+#define VFE_BUS_STATS_SKIN_BHIST_WR_PING_ADDR    0x0000013C
+#define VFE_BUS_STATS_SKIN_BHIST_WR_PONG_ADDR    0x00000140
+#define VFE_BUS_STATS_SKIN_BHIST_UB_CFG          0x00000144
 #define VFE_CAMIF_COMMAND               0x000001E0
 #define VFE_CAMIF_STATUS                0x00000204
 #define VFE_REG_UPDATE_CMD              0x00000260
@@ -820,6 +835,7 @@
 #define VFE_STATS_AWB_SGW_CFG           0x00000554
 #define VFE_DMI_CFG                     0x00000598
 #define VFE_DMI_ADDR                    0x0000059C
+#define VFE_DMI_DATA_HI                 0x000005A0  
 #define VFE_DMI_DATA_LO                 0x000005A4
 #define VFE_BUS_IO_FORMAT_CFG           0x000006F8
 #define VFE_PIXEL_IF_CFG                0x000006FC
@@ -877,9 +893,10 @@
 	spinlock_t  state_lock;
 	spinlock_t  io_lock;
 
-	spinlock_t  aec_ack_lock;
+	spinlock_t  aec_bg_ack_lock;
 	spinlock_t  awb_ack_lock;
-	spinlock_t  af_ack_lock;
+	spinlock_t  af_bf_ack_lock;
+	spinlock_t  bhist_ack_lock;
 	spinlock_t  ihist_ack_lock;
 	spinlock_t  rs_ack_lock;
 	spinlock_t  cs_ack_lock;
@@ -918,12 +935,14 @@
 	uint32_t output2Period;
 	uint32_t vfeFrameSkipCount;
 	uint32_t vfeFrameSkipPeriod;
-	struct vfe_stats_control afStatsControl;
+	struct msm_ver_num_info ver_num;
+	struct vfe_stats_control afbfStatsControl;
 	struct vfe_stats_control awbStatsControl;
-	struct vfe_stats_control aecStatsControl;
+	struct vfe_stats_control aecbgStatsControl;
 	struct vfe_stats_control ihistStatsControl;
 	struct vfe_stats_control rsStatsControl;
 	struct vfe_stats_control csStatsControl;
+	struct vfe_stats_control bhistStatsControl;
 
 	
 	struct v4l2_subdev subdev;
@@ -933,6 +952,7 @@
 	uint32_t frame_skip_cnt;
 	uint32_t frame_skip_pattern;
 	uint32_t snapshot_frame_cnt;
+	vfe_camera_mode_type vfe_camera_mode; 
 };
 
 #define statsAeNum      0
diff --git a/drivers/media/video/msm/msm_vpe.c b/drivers/media/video/msm/msm_vpe.c
index 4a425a4..8f7c620 100644
--- a/drivers/media/video/msm/msm_vpe.c
+++ b/drivers/media/video/msm/msm_vpe.c
@@ -509,7 +509,7 @@
 	}
 	spin_unlock_irqrestore(&vpe_ctrl->lock, flags);
 
-	rc = wait_event_interruptible_timeout(vpe_ctrl->vpe_event_queue,
+	rc = wait_event_timeout(vpe_ctrl->vpe_event_queue,
 		vpe_ctrl->vpe_event_done, msecs_to_jiffies(500));
 
 	if (rc < 0)
diff --git a/drivers/media/video/msm/rawchip/Yushan_API.c b/drivers/media/video/msm/rawchip/Yushan_API.c
index 8fc6ac3..65949264 100644
--- a/drivers/media/video/msm/rawchip/Yushan_API.c
+++ b/drivers/media/video/msm/rawchip/Yushan_API.c
@@ -933,7 +933,7 @@
 	bData[1]=sDxoPdpTuning->bDeadPixelCorrectionMedGain;
 	bData[2]=sDxoPdpTuning->bDeadPixelCorrectionHiGain;
 
-	
+	/* Only three bytes need to be written. Fourth byte write will overwrite the */
 	
 	fStatus = SPI_Write(DXO_PDP_BASE_ADDR+DxOPDP_dead_pixels_correction_lowGain_7_0, 3, pData);
 
@@ -987,7 +987,7 @@
 	pData = (uint8_t *) bData;
 
 	bData[0]=sDxoDopTuning->bEstimationMode ;
-	
+	/* First five consecutive registers written. */
 	fStatus = SPI_Write(DXO_DOP_BASE_ADDR+DxODOP_estimation_mode_7_0, 1, pData);
 
 	bData[0]=sDxoDopTuning->bSharpness;
@@ -1730,10 +1730,10 @@
 		
 		sYushanNewContextConfig->bSelectStillVfMode = YUSHAN_FRAME_FORMAT_VF_MODE;
 	} else {
-		if (bCurrentStreamingMode == YUSHAN_FRAME_FORMAT_VF_MODE) {
+		
 		
 		sYushanNewContextConfig->bSelectStillVfMode = YUSHAN_FRAME_FORMAT_STILL_MODE;
-		}
+		
 	}
 
 	
@@ -1973,7 +1973,7 @@
 	fStatus &= SPI_Write(YUSHAN_CLK_CTRL+1, 1, (uint8_t*)(&bSpiData));
 
 	
-	
+	// SPI_Read(YUSHAN_CLK_CTRL+1, 1, (uint8_t*)(&bSpiData));	/* No need of read, as the data written is saved in bSpiData */
 	bSpiData |= ((bSpiData>>1)|0x01)<<1;						
 	fStatus &= SPI_Write(YUSHAN_CLK_CTRL+1, 1, (uint8_t*)(&bSpiData));
 
diff --git a/drivers/media/video/msm/rawchip/Yushan_API.h b/drivers/media/video/msm/rawchip/Yushan_API.h
index b4d2a45..7322a2b 100644
--- a/drivers/media/video/msm/rawchip/Yushan_API.h
+++ b/drivers/media/video/msm/rawchip/Yushan_API.h
@@ -400,7 +400,7 @@
 	uint16_t	uwDxoPdpStartAddr;
 	
 	uint16_t	uwDxoPdpBootAddr;
-	
+	// IP Boot address, where first add of Microcode has to be written
 	uint16_t 	uwDxoPdpRamImageSize[2];
 	
 	uint16_t	uwBaseAddrPdpMicroCode[2];
@@ -410,7 +410,7 @@
 	uint16_t	uwDxoDppStartAddr;
 	
 	uint16_t	uwDxoDppBootAddr;
-	
+	// IP Boot address, where first add of Microcode has to be written
 	uint16_t 	uwDxoDppRamImageSize[2];
 	
 	uint16_t	uwBaseAddrDppMicroCode[2];
@@ -420,7 +420,7 @@
 	uint16_t	uwDxoDopStartAddr;
 	
 	uint16_t	uwDxoDopBootAddr;
-	
+	// IP Boot address, where first add of Microcode has to be written
 	uint16_t 	uwDxoDopRamImageSize[2];
 	
 	uint16_t	uwBaseAddrDopMicroCode[2];
diff --git a/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.c b/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.c
index 97de14a..e9e4118 100644
--- a/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.c
+++ b/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.c
@@ -366,6 +366,10 @@
 	uint32_t		udwIntrMask[] = {0x3DE38E3B, 0xFC3C3C3C, 0x001B7FFB};	
 	uint16_t		uwAssignITRGrpToPad1 = 0x008; 
 
+#ifdef CONFIG_DISABLE_MCLK_RAWCHIP_TO_MAINCAM
+	uint8_t bSpiData = 0;
+#endif
+
 #if 0
 	Yushan_AF_ROI_t					sYushanAfRoi[5];
 	Yushan_DXO_ROI_Active_Number_t	sYushanDxoRoiActiveNumber;
@@ -502,6 +506,28 @@
 		p_yushan_regs->dppclib_first_addr = yushan_regs_clib_ov2722.dppclib_first_addr;
 		p_yushan_regs->dopclib_first_addr = yushan_regs_clib_ov2722.dopclib_first_addr;
 	}
+	else if (strcmp(data.sensor_name, "ov5693") == 0) {
+		p_yushan_regs->pdpclib = yushan_regs_clib_ov5693.pdpclib;
+		p_yushan_regs->dppclib = yushan_regs_clib_ov5693.dppclib;
+		p_yushan_regs->dopclib = yushan_regs_clib_ov5693.dopclib;
+		p_yushan_regs->pdpclib_size = yushan_regs_clib_ov5693.pdpclib_size;
+		p_yushan_regs->dppclib_size = yushan_regs_clib_ov5693.dppclib_size;
+		p_yushan_regs->dopclib_size = yushan_regs_clib_ov5693.dopclib_size;
+		p_yushan_regs->pdpclib_first_addr = yushan_regs_clib_ov5693.pdpclib_first_addr;
+		p_yushan_regs->dppclib_first_addr = yushan_regs_clib_ov5693.dppclib_first_addr;
+		p_yushan_regs->dopclib_first_addr = yushan_regs_clib_ov5693.dopclib_first_addr;
+	}
+	else if (strcmp(data.sensor_name, "s5k6a2ya") == 0) {
+		p_yushan_regs->pdpclib = yushan_regs_clib_s5k6a2ya.pdpclib;
+		p_yushan_regs->dppclib = yushan_regs_clib_s5k6a2ya.dppclib;
+		p_yushan_regs->dopclib = yushan_regs_clib_s5k6a2ya.dopclib;
+		p_yushan_regs->pdpclib_size = yushan_regs_clib_s5k6a2ya.pdpclib_size;
+		p_yushan_regs->dppclib_size = yushan_regs_clib_s5k6a2ya.dppclib_size;
+		p_yushan_regs->dopclib_size = yushan_regs_clib_s5k6a2ya.dopclib_size;
+		p_yushan_regs->pdpclib_first_addr = yushan_regs_clib_s5k6a2ya.pdpclib_first_addr;
+		p_yushan_regs->dppclib_first_addr = yushan_regs_clib_s5k6a2ya.dppclib_first_addr;
+		p_yushan_regs->dopclib_first_addr = yushan_regs_clib_s5k6a2ya.dopclib_first_addr;
+	}
 
 	sDxoStruct.pDxoPdpRamImage[0] = (uint8_t *)p_yushan_regs->pdpcode;
 	sDxoStruct.pDxoDppRamImage[0] = (uint8_t *)p_yushan_regs->dppcode;
@@ -645,6 +671,7 @@
 	sDxoDopTuning.bNoiseVsDetailsMedGain = 0x80;
 	sDxoDopTuning.bNoiseVsDetailsHiGain = 0x80;
 	bDppMode = DPP_enable ? 0x03 : 0;
+	bDopMode = DOP_enable ? (0x01|(((~denoise_enable)&0x01)<<4)) : 0;
 
 	if (strcmp(data.sensor_name, "s5k3h2yx") == 0)
 	{
@@ -656,22 +683,48 @@
 	    sDxoDopTuning.bSharpness = 0x01;
 	    sDxoDopTuning.bDenoisingLowGain = 0x30;
 	    sDxoDopTuning.bDenoisingMedGain = 0x80;
-	    sDxoDopTuning.bDenoisingHiGain =  0x60;
+	    sDxoDopTuning.bDenoisingHiGain =  0x56;
  
 	    sDxoDopTuning.bNoiseVsDetailsLowGain = 0xD0;
 	    sDxoDopTuning.bNoiseVsDetailsMedGain = 0xB0;
-	    sDxoDopTuning.bNoiseVsDetailsHiGain = 0xB0;
+	    sDxoDopTuning.bNoiseVsDetailsHiGain =  0xA0;
 	}
 	else if (strcmp(data.sensor_name, "ar0260") == 0)
 	{
-		sDxoDopTuning.bDenoisingLowGain = 0x60;
-		sDxoDopTuning.bDenoisingMedGain = 0x60;
-		sDxoDopTuning.bDenoisingHiGain =  0x60;
+		sDxoDopTuning.bDenoisingLowGain = 0x30;
+		sDxoDopTuning.bDenoisingMedGain = 0x30;
+		sDxoDopTuning.bDenoisingHiGain =  0x20;
 	    sDxoDopTuning.bNoiseVsDetailsLowGain = 0x80;
 	    sDxoDopTuning.bNoiseVsDetailsMedGain = 0x80;
-	    sDxoDopTuning.bNoiseVsDetailsHiGain = 0x80;
+	    sDxoDopTuning.bNoiseVsDetailsHiGain = 0xB0;
 	    sDxoDopTuning.bSharpness = 0;
 		bDppMode =0;
+		bDopMode =0xd;
+	}
+	else if (strcmp(data.sensor_name, "ov2722") == 0)   
+	{
+		sDxoDopTuning.bDenoisingLowGain = 0x10;
+		sDxoDopTuning.bDenoisingMedGain = 0x10;
+		sDxoDopTuning.bDenoisingHiGain =  0x45;
+	    sDxoDopTuning.bNoiseVsDetailsLowGain = 0x80;
+	    sDxoDopTuning.bNoiseVsDetailsMedGain = 0x80;
+	    sDxoDopTuning.bNoiseVsDetailsHiGain = 0xA8;
+	    sDxoDopTuning.bSharpness = 0;
+#if defined(CONFIG_MACH_MONARUDO) ||\
+    defined(CONFIG_MACH_DELUXE_J) ||\
+    defined(CONFIG_MACH_DELUXE_R) ||\
+    defined(CONFIG_MACH_IMPRESSION_J) ||\
+    defined(CONFIG_MACH_DUMMY) ||\
+    defined(CONFIG_MACH_DUMMY) ||\
+    defined(CONFIG_MACH_DUMMY)
+		bDppMode =0; 
+#endif
+		bDopMode =0xd;
+	}
+	else if (strcmp(data.sensor_name, "ov5693") == 0)
+	{
+		sDxoDopTuning.bDenoisingMedGain = 0x30;
+		sDxoDopTuning.bDenoisingHiGain = 0x30;
 	}
 	else
 	{
@@ -806,6 +859,15 @@
 	SPI_Write(YUSHAN_SMIA_FM_EOF_INT_EN, 1,  &bSpiData);
 #endif
 
+#ifdef CONFIG_DISABLE_MCLK_RAWCHIP_TO_MAINCAM
+	if (strcmp(data.sensor_name, "s5k6a2ya") == 0) {
+		SPI_Read(YUSHAN_CLK_CTRL, 1, (uint8_t*)(&bSpiData)); 
+		bSpiData &= 0xEF; 
+		SPI_Write(YUSHAN_CLK_CTRL, 1, (uint8_t*)(&bSpiData));
+		pr_info("[CAM] Disable MCLK of main cam");
+	}
+#endif
+
 	return (bStatus == SUCCESS) ? 0 : -1;
 #endif
 	return 0;
diff --git a/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.h b/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.h
index b8edfd7..af882d8 100644
--- a/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.h
+++ b/drivers/media/video/msm/rawchip/Yushan_HTC_Functions.h
@@ -113,7 +113,8 @@
 extern struct yushan_reg_clib_t yushan_regs_clib_ov8838;
 extern struct yushan_reg_clib_t yushan_regs_clib_ar0260;
 extern struct yushan_reg_clib_t yushan_regs_clib_ov2722;
-
+extern struct yushan_reg_clib_t yushan_regs_clib_ov5693;
+extern struct yushan_reg_clib_t yushan_regs_clib_s5k6a2ya;
 
 struct rawchip_sensor_init_data {
 	const char *sensor_name;
diff --git a/drivers/media/video/msm/rawchip/yushan_reg_ov2722.c b/drivers/media/video/msm/rawchip/yushan_reg_ov2722.c
index 867daf3..9b72b9e 100644
--- a/drivers/media/video/msm/rawchip/yushan_reg_ov2722.c
+++ b/drivers/media/video/msm/rawchip/yushan_reg_ov2722.c
@@ -21,565 +21,565 @@
 
 uint8_t pdpclib_u_ov2722[] =
 {
-0x01,
-0x03,
-0x01,
-0x88,
-0x07,
-0x40,
-0x04,
-0x02,
-0x10,
-0x00,
-0x00,
-0x01,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x10,
-0x00,
-0x00,
-0x01,
-0x00,
-0x02,
-0x00,
-0x04,
-0x00,
-0x08,
-0x00,
-0x10,
-0x80,
-0x00,
-0x00,
-0x01,
-0x00,
-0x02,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x80,
-0x00,
-0x00,
-0x00,
-0x40,
-0x00,
-0x00,
-0x00,
-0x20,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x01,
-0x00,
-0x02,
-0x00,
-0x08,
-0x00,
-0x10,
-0x78,
-0x01,
-0x00,
-0x01,
-0x60,
-0x02,
-0x50,
-0x03,
-0x04,
-0x06,
-0x0a,
-0x0e,
-0xd6,
-0x01,
-0x40,
-0x01,
-0x60,
-0x02,
-0x50,
-0x03,
-0x04,
-0x0a,
-0x11,
-0x17,
-0xd6,
-0x01,
-0x40,
-0x01,
-0x60,
-0x02,
-0x50,
-0x03,
-0x04,
-0x0f,
-0x16,
-0x1e,
-0x78,
-0x01,
-0x00,
-0x01,
-0x60,
-0x02,
-0x50,
-0x03,
-0x04,
-0x03,
-0x05,
-0x07,
-0xd6,
-0x01,
-0x40,
-0x01,
-0x60,
-0x02,
-0x50,
-0x03,
-0x04,
-0x05,
-0x08,
-0x0b,
-0xd6,
-0x01,
-0x40,
-0x01,
-0x60,
-0x02,
-0x50,
-0x03,
-0x04,
-0x07,
-0x0b,
-0x0f,
-0xab,
-0x0f,
-0x00,
-0x00,
-0xab,
-0x0a,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xab,
-0x00,
-0x00,
-0x00,
-0x2b,
-0x01,
-0x00,
-0x00,
-0x80,
-0x01,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0xa0,
-0x00,
-0x00,
-0x00,
-0xa0,
-0x00,
-0x00,
-0x00,
-0xe0,
-0x00,
-0x00,
-0x00,
-0xab,
-0x0f,
-0x00,
-0x00,
-0xab,
-0x0a,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x55,
-0x00,
-0x00,
-0x00,
-0x80,
-0x00,
-0x00,
-0x00,
-0xab,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x00,
-0x40,
-0x00,
-0x00,
-0x00,
-0x60,
-0x00,
-0x00,
-0x00,
-0x80,
-0x00,
-0x00,
-0x00,
-0xff,
-0x01,
-0xff,
-0x05,
+0x02, 
+0x03, 
+0x01, 
+0x88, 
+0x07, 
+0x40, 
+0x04, 
+0x02, 
+0x10, 
+0x00, 
+0x00, 
+0x01, 
+0x01, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x10, 
+0x00, 
+0x00, 
+0x01, 
+0x00, 
+0x02, 
+0x00, 
+0x04, 
+0x00, 
+0x08, 
+0x00, 
+0x10, 
+0x80, 
+0x00, 
+0x00, 
+0x01, 
+0x00, 
+0x02, 
+0x00, 
+0x00, 
+0x00, 
+0x01, 
+0x00, 
+0x00, 
+0x80, 
+0x00, 
+0x00, 
+0x00, 
+0x40, 
+0x00, 
+0x00, 
+0x00, 
+0x20, 
+0x00, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x42, 
+0x42, 
+0x42, 
+0x42, 
+0x0a, 
+0x01, 
+0x42, 
+0x42, 
+0x42, 
+0x42, 
+0x0a, 
+0x01, 
+0x42, 
+0x42, 
+0x42, 
+0x42, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x43, 
+0x43, 
+0x43, 
+0x0a, 
+0x01, 
+0x43, 
+0x45, 
+0x43, 
+0x45, 
+0x0a, 
+0x01, 
+0x43, 
+0x45, 
+0x43, 
+0x45, 
+0x0a, 
+0x01, 
+0x43, 
+0x45, 
+0x43, 
+0x45, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x01, 
+0x00, 
+0x02, 
+0x00, 
+0x08, 
+0x00, 
+0x10, 
+0x78, 
+0x01, 
+0x00, 
+0x01, 
+0x60, 
+0x02, 
+0x50, 
+0x03, 
+0x04, 
+0x05, 
+0x0f, 
+0x19, 
+0xd6, 
+0x01, 
+0x40, 
+0x01, 
+0x60, 
+0x02, 
+0x50, 
+0x03, 
+0x04, 
+0x00, 
+0x1b, 
+0x36, 
+0xd6, 
+0x01, 
+0x40, 
+0x01, 
+0x60, 
+0x02, 
+0x50, 
+0x03, 
+0x04, 
+0x00, 
+0x23, 
+0x48, 
+0x78, 
+0x01, 
+0x00, 
+0x01, 
+0x60, 
+0x02, 
+0x50, 
+0x03, 
+0x04, 
+0x02, 
+0x08, 
+0x0d, 
+0xd6, 
+0x01, 
+0x40, 
+0x01, 
+0x60, 
+0x02, 
+0x50, 
+0x03, 
+0x04, 
+0x00, 
+0x0d, 
+0x1b, 
+0xd6, 
+0x01, 
+0x40, 
+0x01, 
+0x60, 
+0x02, 
+0x50, 
+0x03, 
+0x04, 
+0x00, 
+0x12, 
+0x24, 
+0xab, 
+0x0f, 
+0x00, 
+0x00, 
+0xab, 
+0x0a, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x2b, 
+0xff, 
+0xff, 
+0xff, 
+0x00, 
+0x02, 
+0x00, 
+0x00, 
+0xd5, 
+0x04, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x01, 
+0x00, 
+0x00, 
+0x40, 
+0x02, 
+0x00, 
+0x00, 
+0xab, 
+0x0f, 
+0x00, 
+0x00, 
+0xab, 
+0x0a, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0xab, 
+0xff, 
+0xff, 
+0xff, 
+0xd5, 
+0x00, 
+0x00, 
+0x00, 
+0x55, 
+0x02, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0x00, 
+0xa0, 
+0x00, 
+0x00, 
+0x00, 
+0x20, 
+0x01, 
+0x00, 
+0x00, 
+0xff, 
+0x01, 
+0xff, 
+0x05, 
 
 };
 
 uint8_t dppclib_u_ov2722[] =
 {
-	0x01,
+	0x02,
 	0x03,
 	0x01,
 	0x88,
@@ -589,11 +589,11 @@
 	0x02,
 	0x05,
 	0xfa,
-	0x4d,
+	0x44,
 	0x00,
 	0xca,
 	0xfe,
-	0x77,
+	0x1a,
 	0x01,
 	0x02,
 	0x05,
@@ -612,36 +612,36 @@
 	0x00,
 	0x00,
 	0x00,
-	0x8f,
+	0x9d,
+	0x00,
+	0x0d,
+	0x01,
+	0x01,
+	0xfb,
 	0xfe,
-	0x09,
+	0x01,
 	0x00,
-	0x00,
-	0x02,
-	0x00,
-	0x00,
-	0x00,
-	0x10,
-	0x00,
-	0xfd,
+	0x1f,
+	0x01,
+	0xf9,
 	0xff,
 	0x00,
+	0xf9,
+	0x95,
+	0x01,
+	0x0a,
+	0x01,
+	0x00,
+	0xfa,
 	0xfd,
-	0x8e,
-	0xfe,
-	0x08,
+	0x01,
 	0x00,
-	0x00,
-	0x02,
-	0x00,
-	0x00,
-	0x00,
-	0x0e,
-	0x00,
-	0xfd,
+	0x17,
+	0x01,
+	0xfb,
 	0xff,
 	0x00,
-	0xfe,
+	0xfc,
 	0x80,
 	0x00,
 	0x00,
@@ -657,36 +657,36 @@
 	0x00,
 	0x00,
 	0x00,
-	0x7f,
-	0x00,
-	0x00,
+	0x7c,
 	0xff,
-	0x01,
+	0xfd,
 	0xff,
 	0x00,
 	0x00,
-	0x00,
 	0x02,
 	0xff,
+	0x01,
+	0xfd,
+	0x00,
+	0x01,
+	0x00,
+	0x00,
+	0x02,
+	0x7a,
+	0xff,
+	0xfd,
+	0xff,
+	0x00,
+	0x00,
 	0x02,
 	0x00,
 	0x00,
-	0x01,
-	0x82,
+	0xfa,
 	0x00,
 	0x02,
 	0x00,
-	0x01,
-	0xfe,
 	0x00,
-	0x00,
-	0x00,
-	0x04,
-	0x00,
-	0x01,
-	0x00,
-	0x00,
-	0x01,
+	0x02,
 	0x00,
 	0x00,
 	0x00,
@@ -1057,7 +1057,7 @@
 
 uint8_t dopclib_u_ov2722[] =
 {
-	0x01,
+	0x02,
 	0x03,
 	0x01,
 	0x01,
@@ -1369,21 +1369,21 @@
 	0x01,
 	0x03,
 	0x01,
-	0x00,
+	0x02,
 	0x04,
 	0x04,
 	0x03,
 	0x03,
-	0x00,
 	0x04,
 	0x04,
-	0x03,
-	0x03,
-	0x00,
 	0x04,
 	0x04,
-	0x03,
-	0x03,
+	0x04,
+	0x06,
+	0x05,
+	0x05,
+	0x04,
+	0x04,
 	0x00,
 	0x00,
 	0x00,
@@ -1397,18 +1397,18 @@
 	0x00,
 	0x00,
 	0xab,
-	0xfd,
+	0xfe,
 	0xc0,
 	0xff,
-	0xc0,
+	0xe0,
 	0xff,
 	0x00,
 	0x00,
-	0x11,
-	0x11,
-	0x0a,
-	0x09,
+	0x0c,
+	0x0c,
+	0x08,
 	0x07,
+	0x06,
 	0x80,
 	0x02,
 	0x00,
@@ -1420,21 +1420,21 @@
 	0x05,
 	0x03,
 	0x04,
-	0x00,
+	0x02,
 	0x04,
 	0x04,
 	0x03,
 	0x03,
-	0x00,
 	0x04,
 	0x04,
-	0x03,
-	0x03,
-	0x00,
 	0x04,
 	0x04,
-	0x03,
-	0x03,
+	0x04,
+	0x06,
+	0x05,
+	0x05,
+	0x04,
+	0x04,
 	0x00,
 	0x00,
 	0x00,
@@ -1447,19 +1447,19 @@
 	0x10,
 	0x00,
 	0x00,
-	0x00,
-	0xfa,
+	0x55,
+	0xfc,
 	0x00,
 	0xff,
-	0x60,
+	0xc0,
 	0xff,
 	0x00,
 	0x00,
-	0x2d,
-	0x2d,
-	0x1b,
-	0x17,
-	0x12,
+	0x20,
+	0x20,
+	0x15,
+	0x11,
+	0x0f,
 	0x65,
 	0x54,
 	0x33,
@@ -2013,7 +2013,7 @@
 	0x1c,
 	0x1c,
 	0x39,
-	0x31,
+	0x39,
 	0x80,
 	0x01,
 	0x00,
@@ -2022,104 +2022,104 @@
 	0x06,
 	0x00,
 	0x0c,
-	0x39,
-	0x3c,
-	0x3e,
-	0x36,
+	0x27,
+	0x2d,
+	0x33,
+	0x2c,
 	0x16,
 	0x18,
 	0x16,
-	0x34,
+	0x2d,
 	0x07,
-	0x2e,
-	0x2a,
-	0x30,
-	0x27,
+	0x1d,
+	0x2d,
+	0x33,
+	0x2c,
 	0x11,
 	0x15,
 	0x11,
+	0x2d,
+	0x04,
+	0x15,
+	0x23,
+	0x30,
 	0x27,
-	0x05,
-	0x1f,
-	0x36,
-	0x38,
-	0x31,
 	0x0e,
 	0x13,
 	0x0e,
-	0x30,
+	0x2a,
 	0x03,
-	0x1a,
+	0x10,
+	0x2b,
+	0x3a,
+	0x33,
+	0x09,
+	0x10,
+	0x09,
+	0x36,
+	0x01,
+	0x0d,
+	0x2a,
+	0x3b,
+	0x34,
+	0x04,
+	0x0e,
+	0x04,
+	0x38,
+	0x00,
+	0x39,
+	0x80,
+	0x01,
+	0x00,
+	0x03,
+	0x00,
+	0x06,
+	0x00,
+	0x0c,
+	0x3f,
+	0x3f,
+	0x3f,
+	0x3f,
+	0x16,
+	0x18,
+	0x16,
+	0x3f,
+	0x07,
+	0x3f,
+	0x33,
+	0x38,
 	0x32,
-	0x35,
+	0x11,
+	0x15,
+	0x11,
+	0x33,
+	0x05,
+	0x37,
+	0x28,
+	0x34,
 	0x2e,
+	0x0e,
+	0x13,
+	0x0e,
+	0x31,
+	0x04,
+	0x2a,
+	0x21,
+	0x30,
+	0x28,
 	0x09,
 	0x10,
 	0x09,
 	0x2c,
-	0x02,
-	0x14,
-	0x34,
-	0x35,
-	0x2e,
-	0x04,
-	0x0e,
-	0x04,
-	0x2d,
-	0x01,
-	0x31,
-	0x80,
-	0x01,
-	0x00,
 	0x03,
-	0x00,
-	0x06,
-	0x00,
-	0x0c,
-	0x3f,
-	0x3f,
-	0x3f,
-	0x3f,
-	0x16,
-	0x18,
-	0x16,
-	0x3f,
-	0x07,
-	0x3f,
+	0x21,
+	0x21,
 	0x31,
-	0x35,
-	0x2e,
-	0x11,
-	0x15,
-	0x11,
-	0x2d,
-	0x06,
-	0x3f,
-	0x3d,
-	0x3f,
-	0x36,
-	0x0e,
-	0x13,
-	0x0e,
-	0x35,
-	0x04,
-	0x3f,
-	0x37,
-	0x3b,
-	0x33,
-	0x09,
-	0x10,
-	0x09,
-	0x32,
-	0x03,
-	0x33,
-	0x3a,
-	0x3c,
-	0x34,
+	0x2a,
 	0x04,
 	0x0e,
 	0x04,
-	0x32,
+	0x30,
 	0x02,
 	0x40,
 	0x00,
diff --git a/drivers/media/video/msm/sensors/Makefile b/drivers/media/video/msm/sensors/Makefile
index b56b811..6a9e968 100644
--- a/drivers/media/video/msm/sensors/Makefile
+++ b/drivers/media/video/msm/sensors/Makefile
@@ -2,6 +2,7 @@
 EXTRA_CFLAGS += -Idrivers/media/video/msm
 EXTRA_CFLAGS += -Idrivers/media/video/msm/io
 EXTRA_CFLAGS += -Idrivers/media/video/msm/csi
+EXTRA_CFLAGS += -Idrivers/media/video/msm/yushanII
 obj-$(CONFIG_MSM_CAMERA_SENSOR) += msm_sensor.o
 obj-$(CONFIG_OV5647) += ov5647_v4l2.o
 obj-$(CONFIG_IMX091) += imx091_v4l2.o
@@ -10,6 +11,13 @@
 obj-$(CONFIG_MACH_ELITE) += imx175_2lane_v4l2.o
 obj-$(CONFIG_MACH_JET) += imx175_2lane_v4l2.o
 obj-$(CONFIG_IMX135) += imx135_v4l2.o
+ifdef CONFIG_CAMERA_IMAGE_NONE_BOARD
+obj-$(CONFIG_OV4688) += ov4688_non_v4l2.o
+obj-$(CONFIG_VD6869) += vd6869_non_v4l2.o
+else
+obj-$(CONFIG_OV4688) += ov4688_v4l2.o
+obj-$(CONFIG_VD6869) += vd6869_v4l2.o
+endif
 obj-$(CONFIG_OV8838) += ov8838_v4l2.o
 obj-$(CONFIG_S5K3H2YX) += s5k3h2yx_v4l2.o
 obj-$(CONFIG_S5K6A1GX) += s5k6a1gx_v4l2.o
@@ -22,8 +30,9 @@
 obj-$(CONFIG_MT9E013) += mt9e013_v4l2.o
 obj-$(CONFIG_WEBCAM_OV9726) += ov9726_v4l2.o
 obj-$(CONFIG_WEBCAM_OV7692_QRD) += ov7692_qrd_v4l2.o
-obj-$(CONFIG_MT9V113) += mt9v113_v4l2.o mt9v113_reg_lens_9251.o
 obj-$(CONFIG_OV2722) += ov2722_v4l2.o
 obj-$(CONFIG_OV5693) += ov5693_v4l2.o
 obj-$(CONFIG_S5K6A2YA) += s5k6a2ya_v4l2.o
+obj-$(CONFIG_MT9V113) += mt9v113_v4l2.o mt9v113_reg_lens_9251.o
+obj-$(CONFIG_S5K6AAFX) += s5k6aafx_v4l2.o s5k6aafx_reg_valentewx.o
 
diff --git a/drivers/media/video/msm/sensors/imx175_2lane_v4l2.c b/drivers/media/video/msm/sensors/imx175_2lane_v4l2.c
index 78e7ad6..9e0cbae 100644
--- a/drivers/media/video/msm/sensors/imx175_2lane_v4l2.c
+++ b/drivers/media/video/msm/sensors/imx175_2lane_v4l2.c
@@ -309,6 +309,61 @@
 	{0x0387, 0x01}, 
 };
 
+static struct msm_camera_i2c_reg_conf imx175_4_3_settings[] = {
+	
+	{0x030C, 0x00}, 
+	{0x030D, 0xDD}, 
+	{0x0301, 0x0A}, 
+	{0x0303, 0x01}, 
+	{0x0305, 0x06}, 
+	{0x0309, 0x0A}, 
+	{0x030B, 0x01}, 
+	{0x3368, 0x18}, 
+	{0x3369, 0x00},
+	{0x3344, 0x6F},
+	{0x3345, 0x1F},
+	{0x3370, 0x7F},
+	{0x3371, 0x37},
+	{0x3372, 0x67},
+	{0x3373, 0x3F},
+	{0x3374, 0x3F},
+	{0x3375, 0x47},
+	{0x3376, 0xCF},
+	{0x3377, 0x47},
+	
+	{0x0340, 0x09}, 
+	{0x0341, 0xC4},
+	{0x0342, 0x0D}, 
+	{0x0343, 0x70},
+	{0x0344, 0x00}, 
+	{0x0345, 0x00},
+	{0x0346, 0x00}, 
+	{0x0347, 0x00},
+	{0x0348, 0x0C}, 
+	{0x0349, 0xCF},
+	{0x034A, 0x09}, 
+	{0x034B, 0x9F},
+	{0x034C, 0x0C}, 
+	{0x034D, 0xD0},
+	{0x034E, 0x09}, 
+	{0x034F, 0xA0},
+	{0x33D4, 0x0C},
+	{0x33D5, 0xD0},
+	{0x33D6, 0x09},
+	{0x33D7, 0xA0},
+	{0x3013, 0x04},
+	{0x30B0, 0x32},
+	{0x30D0, 0x00},
+	{0x0390, 0x00}, 
+	{0x0401, 0x00}, 
+	{0x0405, 0x10}, 
+	{0x33C8, 0x00},
+	{0x3364, 0x02}, 
+	{0x0202, 0x09}, 
+	{0x0203, 0xC0},
+	{0x0387, 0x01}, 
+};
+
 static struct msm_camera_i2c_reg_conf imx175_snap_wide_settings[] = {
 	
 	{0x030C, 0x00}, 
@@ -453,6 +508,8 @@
 	ARRAY_SIZE(imx175_fast_video_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
 	{&imx175_snap_wide_settings[0],
 	ARRAY_SIZE(imx175_snap_wide_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
+	{&imx175_4_3_settings[0],
+	ARRAY_SIZE(imx175_4_3_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
 	{&imx175_night_settings[0],
 	ARRAY_SIZE(imx175_night_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
 };
@@ -548,6 +605,24 @@
 		.y_odd_inc = 1,
 		.binning_rawchip = 0x11,
 	},
+	{
+		.x_output = 0xCD0,
+		.y_output = 0x9A0,
+		.line_length_pclk = 0xD70,
+		.frame_length_lines = 0x9C4,
+		.vt_pixel_clk = 176800000,
+		.op_pixel_clk = 176800000,
+		.binning_factor = 1,
+		.x_addr_start = 0,
+		.y_addr_start = 0,
+		.x_addr_end = 0xCCF,
+		.y_addr_end = 0x99F,
+		.x_even_inc = 1,
+		.x_odd_inc = 1,
+		.y_even_inc = 1,
+		.y_odd_inc = 1,
+		.binning_rawchip = 0x11,
+	},
 	{ 
 		.x_output = 0xCD0,
 		.y_output = 0x9A0,
diff --git a/drivers/media/video/msm/sensors/msm_sensor.c b/drivers/media/video/msm/sensors/msm_sensor.c
index 4d42181..d99f10a 100644
--- a/drivers/media/video/msm/sensors/msm_sensor.c
+++ b/drivers/media/video/msm/sensors/msm_sensor.c
@@ -19,6 +19,14 @@
 #include "rawchip/rawchip.h"
 #endif
 
+#ifdef CONFIG_RAWCHIPII
+#include "yushanII.h"
+#include "ilp0100_ST_api.h"
+#include "ilp0100_customer_sensor_config.h"
+#endif
+
+uint32_t ois_line;
+
 static struct task_struct *tsk_sensor_init = NULL;
 static int oem_sensor_init(void *arg);
 
@@ -159,11 +167,20 @@
 	int32_t rc;
 	CDBG("%s: called\n", __func__);
 
-	rc = msm_sensor_write_all_conf_array(
-		s_ctrl->sensor_i2c_client,
-		s_ctrl->msm_sensor_reg->init_settings,
-		s_ctrl->msm_sensor_reg->init_size);
-	return rc;
+	if ((s_ctrl->sensordata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) && (s_ctrl->msm_sensor_reg->init_settings_yushanii))
+	{
+		rc = msm_sensor_write_all_conf_array(
+			s_ctrl->sensor_i2c_client,
+			s_ctrl->msm_sensor_reg->init_settings_yushanii,
+			s_ctrl->msm_sensor_reg->init_size_yushanii);
+	} else {
+		rc = msm_sensor_write_all_conf_array(
+			s_ctrl->sensor_i2c_client,
+			s_ctrl->msm_sensor_reg->init_settings,
+			s_ctrl->msm_sensor_reg->init_size);
+	}
+
+    return rc;
 }
 
 int32_t msm_sensor_write_res_settings(struct msm_sensor_ctrl_t *s_ctrl,
@@ -200,6 +217,19 @@
 	if (s_ctrl->func_tbl->sensor_adjust_frame_lines)
 		rc = s_ctrl->func_tbl->sensor_adjust_frame_lines(s_ctrl, res);
 
+	if (s_ctrl->prev_dig_gain > 0 && s_ctrl->prev_line > 0){
+		if (s_ctrl->func_tbl->
+			sensor_write_exp_gain_ex != NULL){
+		    s_ctrl->func_tbl->
+		        sensor_write_exp_gain_ex(
+		        s_ctrl,
+		        SENSOR_PREVIEW_MODE,
+		        s_ctrl->prev_gain,
+		        s_ctrl->prev_dig_gain,
+		        s_ctrl->prev_line);
+		}
+	}
+
 	return rc;
 }
 
@@ -232,22 +262,40 @@
 {
 	CDBG("%s: called\n", __func__);
 
-	msm_camera_i2c_write_tbl(
+	if ((s_ctrl->sensordata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) && (s_ctrl->msm_sensor_reg->start_stream_conf_yushanii))
+	{
+		msm_camera_i2c_write_tbl(
+		s_ctrl->sensor_i2c_client,
+		s_ctrl->msm_sensor_reg->start_stream_conf_yushanii,
+		s_ctrl->msm_sensor_reg->start_stream_conf_size_yushanii,
+		s_ctrl->msm_sensor_reg->default_data_type);
+	} else {
+		msm_camera_i2c_write_tbl(
 		s_ctrl->sensor_i2c_client,
 		s_ctrl->msm_sensor_reg->start_stream_conf,
 		s_ctrl->msm_sensor_reg->start_stream_conf_size,
 		s_ctrl->msm_sensor_reg->default_data_type);
+	}
 }
 
 void msm_sensor_stop_stream(struct msm_sensor_ctrl_t *s_ctrl)
 {
 	CDBG("%s: called\n", __func__);
 
-	msm_camera_i2c_write_tbl(
+	if ((s_ctrl->sensordata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) && (s_ctrl->msm_sensor_reg->stop_stream_conf_yushanii))
+	{
+		msm_camera_i2c_write_tbl(
+		s_ctrl->sensor_i2c_client,
+		s_ctrl->msm_sensor_reg->stop_stream_conf_yushanii,
+		s_ctrl->msm_sensor_reg->stop_stream_conf_size_yushanii,
+		s_ctrl->msm_sensor_reg->default_data_type);
+	} else {
+		msm_camera_i2c_write_tbl(
 		s_ctrl->sensor_i2c_client,
 		s_ctrl->msm_sensor_reg->stop_stream_conf,
 		s_ctrl->msm_sensor_reg->stop_stream_conf_size,
 		s_ctrl->msm_sensor_reg->default_data_type);
+	}
 }
 
 void msm_sensor_group_hold_on(struct msm_sensor_ctrl_t *s_ctrl)
@@ -388,7 +436,7 @@
 
 	uint32_t fps_divider = Q10;
 	CDBG("%s: called\n", __func__);
-
+    ois_line = line;
 	if (mode == SENSOR_PREVIEW_MODE)
 		fps_divider = s_ctrl->fps_divider;
 
@@ -472,7 +520,6 @@
 	uint16_t aec_lsb;
 	uint32_t phy_line_2 = 0;
 
-
 	uint32_t fps_divider = Q10;
 	CDBG("%s: called\n", __func__);
 
@@ -514,10 +561,15 @@
 {
 	int32_t rc = 0;
 	static int csi_config;
+
+#ifdef CONFIG_RAWCHIP
+	struct rawchip_sensor_data rawchip_data;
+	struct timespec ts_start, ts_end;
+#endif
 	CDBG("%s: called\n", __func__);
 
 	s_ctrl->func_tbl->sensor_stop_stream(s_ctrl);
-	msleep(30);
+
 	if (update_type == MSM_SENSOR_REG_INIT) {
 		CDBG("Register INIT\n");
 		s_ctrl->curr_csi_params = NULL;
@@ -538,11 +590,68 @@
 				s_ctrl->curr_csic_params);
 			CDBG("CSI config is done\n");
 			mb();
-			msleep(30);
+			msleep(20);
 			csi_config = 1;
 		}
+#ifdef CONFIG_RAWCHIP
+			if (s_ctrl->sensordata->use_rawchip) {
+				rawchip_data.sensor_name = s_ctrl->sensordata->sensor_name;
+				rawchip_data.datatype = s_ctrl->curr_csic_params->data_format;
+					CDBG("datatype = %d\n", rawchip_data.datatype);
+				rawchip_data.lane_cnt = s_ctrl->curr_csic_params->lane_cnt;
+					CDBG("lane_cnt = %d\n", rawchip_data.lane_cnt);
+				rawchip_data.pixel_clk = s_ctrl->msm_sensor_reg->output_settings[res].op_pixel_clk;
+					CDBG("pixel_clk = %d\n", rawchip_data.pixel_clk);
+				rawchip_data.mirror_flip = s_ctrl->mirror_flip;
+					CDBG("mirror_flip = %d\n", rawchip_data.mirror_flip);
+
+				rawchip_data.width = s_ctrl->msm_sensor_reg->output_settings[res].x_output;
+					CDBG("width = %d\n", rawchip_data.width);
+				rawchip_data.height = s_ctrl->msm_sensor_reg->output_settings[res].y_output;
+					CDBG("height = %d\n", rawchip_data.height);
+				rawchip_data.line_length_pclk = s_ctrl->msm_sensor_reg->output_settings[res].line_length_pclk;
+					CDBG("line_length_pclk = %d\n", rawchip_data.line_length_pclk);
+				rawchip_data.frame_length_lines = s_ctrl->msm_sensor_reg->output_settings[res].frame_length_lines;
+					CDBG("frame_length_lines = %d\n", rawchip_data.frame_length_lines);
+				rawchip_data.x_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_start;
+					CDBG("x_addr_start = %d\n", rawchip_data.x_addr_start);
+				rawchip_data.y_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_start;
+					CDBG("y_addr_start = %d\n", rawchip_data.y_addr_start);
+				rawchip_data.x_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_end;
+					CDBG("x_addr_end = %d\n", rawchip_data.x_addr_end);
+				rawchip_data.y_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_end;
+					CDBG("y_addr_end = %d\n", rawchip_data.y_addr_end);
+				rawchip_data.x_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_even_inc;
+					CDBG("x_even_inc = %d\n", rawchip_data.x_even_inc);
+				rawchip_data.x_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_odd_inc;
+					CDBG("x_odd_inc = %d\n", rawchip_data.x_odd_inc);
+				rawchip_data.y_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_even_inc;
+					CDBG("y_even_inc = %d\n", rawchip_data.y_even_inc);
+				rawchip_data.y_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_odd_inc;
+					CDBG("y_odd_inc = %d\n", rawchip_data.y_odd_inc);
+				rawchip_data.binning_rawchip = s_ctrl->msm_sensor_reg->output_settings[res].binning_rawchip;
+					CDBG("binning_rawchip = %d\n", rawchip_data.binning_rawchip);
+
+				rawchip_data.fullsize_width = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].x_output;
+					CDBG("fullsize_width = %d\n", rawchip_data.fullsize_width);
+				rawchip_data.fullsize_height = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].y_output;
+					CDBG("fullsize_height = %d\n", rawchip_data.fullsize_height);
+				rawchip_data.fullsize_line_length_pclk =
+					s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].line_length_pclk;
+					CDBG("fullsize_line_length_pclk = %d\n", rawchip_data.fullsize_line_length_pclk);
+				rawchip_data.fullsize_frame_length_lines =
+					s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].frame_length_lines;
+					CDBG("rawchip_data.fullsize_frame_length_lines = %d\n", rawchip_data.fullsize_frame_length_lines);
+				rawchip_data.use_rawchip = s_ctrl->sensordata->use_rawchip;
+
+				ktime_get_ts(&ts_start);
+				rawchip_set_size(rawchip_data);
+				ktime_get_ts(&ts_end);
+				pr_info("%s: %ld ms\n", __func__,
+					(ts_end.tv_sec-ts_start.tv_sec)*1000+(ts_end.tv_nsec-ts_start.tv_nsec)/1000000);
+			}
+#endif
 		s_ctrl->func_tbl->sensor_start_stream(s_ctrl);
-		msleep(50);
 	}
 	return rc;
 }
@@ -562,6 +671,10 @@
 	if (update_type == MSM_SENSOR_REG_INIT) {
 		mutex_lock(s_ctrl->sensor_first_mutex);  
 
+#ifdef CONFIG_RAWCHIPII
+		YushanII_reload_firmware();
+#endif
+
 		tsk_sensor_init = kthread_create(oem_sensor_init, s_ctrl, "oem_sensor_init");
 		if (IS_ERR(tsk_sensor_init)) {
 			pr_err("%s: kthread_create failed", __func__);
@@ -578,6 +691,14 @@
 		
 		mutex_lock(s_ctrl->sensor_first_mutex);
 
+#ifdef CONFIG_RAWCHIPII
+        if (s_ctrl->sensordata->stop_yushanii_first) {
+    		if(YushanII_Get_reloadInfo() == 0){
+    			pr_info("stop YushanII first");
+    			Ilp0100_stop();
+    		}
+		}
+#endif
 		v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
 			NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM(
 			PIX_0, ISPIF_OFF_IMMEDIATELY));
@@ -611,53 +732,62 @@
 			mb();
 			msleep(20);
 		}
+
 #ifdef CONFIG_RAWCHIP
-			if (s_ctrl->sensordata->use_rawchip) {
-				rawchip_data.sensor_name = s_ctrl->sensordata->sensor_name;
-				rawchip_data.datatype = s_ctrl->curr_csi_params->csid_params.lut_params.vc_cfg->dt;
-				rawchip_data.lane_cnt = s_ctrl->curr_csi_params->csid_params.lane_cnt;
-				rawchip_data.pixel_clk = s_ctrl->msm_sensor_reg->output_settings[res].op_pixel_clk;
-				rawchip_data.mirror_flip = s_ctrl->mirror_flip;
+		if (s_ctrl->sensordata->use_rawchip) {
+			rawchip_data.sensor_name = s_ctrl->sensordata->sensor_name;
+			rawchip_data.datatype = s_ctrl->curr_csi_params->csid_params.lut_params.vc_cfg->dt;
+			rawchip_data.lane_cnt = s_ctrl->curr_csi_params->csid_params.lane_cnt;
+			rawchip_data.pixel_clk = s_ctrl->msm_sensor_reg->output_settings[res].op_pixel_clk;
+			rawchip_data.mirror_flip = s_ctrl->mirror_flip;
 
-				rawchip_data.width = s_ctrl->msm_sensor_reg->output_settings[res].x_output;
-				rawchip_data.height = s_ctrl->msm_sensor_reg->output_settings[res].y_output;
-				rawchip_data.line_length_pclk = s_ctrl->msm_sensor_reg->output_settings[res].line_length_pclk;
-				rawchip_data.frame_length_lines = s_ctrl->msm_sensor_reg->output_settings[res].frame_length_lines;
-				rawchip_data.x_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_start;
-				rawchip_data.y_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_start;
-				rawchip_data.x_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_end;
-				rawchip_data.y_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_end;
-				rawchip_data.x_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_even_inc;
-				rawchip_data.x_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_odd_inc;
-				rawchip_data.y_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_even_inc;
-				rawchip_data.y_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_odd_inc;
-				rawchip_data.binning_rawchip = s_ctrl->msm_sensor_reg->output_settings[res].binning_rawchip;
+			rawchip_data.width = s_ctrl->msm_sensor_reg->output_settings[res].x_output;
+			rawchip_data.height = s_ctrl->msm_sensor_reg->output_settings[res].y_output;
+			rawchip_data.line_length_pclk = s_ctrl->msm_sensor_reg->output_settings[res].line_length_pclk;
+			rawchip_data.frame_length_lines = s_ctrl->msm_sensor_reg->output_settings[res].frame_length_lines;
+			rawchip_data.x_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_start;
+			rawchip_data.y_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_start;
+			rawchip_data.x_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_end;
+			rawchip_data.y_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_end;
+			rawchip_data.x_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_even_inc;
+			rawchip_data.x_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_odd_inc;
+			rawchip_data.y_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_even_inc;
+			rawchip_data.y_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_odd_inc;
+			rawchip_data.binning_rawchip = s_ctrl->msm_sensor_reg->output_settings[res].binning_rawchip;
 
-				rawchip_data.fullsize_width = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].x_output;
-				rawchip_data.fullsize_height = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].y_output;
-				rawchip_data.fullsize_line_length_pclk =
-					s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].line_length_pclk;
-				rawchip_data.fullsize_frame_length_lines =
-					s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].frame_length_lines;
-				rawchip_data.use_rawchip = s_ctrl->sensordata->use_rawchip;
+			rawchip_data.fullsize_width = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].x_output;
+			rawchip_data.fullsize_height = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].y_output;
+			rawchip_data.fullsize_line_length_pclk =
+				s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].line_length_pclk;
+			rawchip_data.fullsize_frame_length_lines =
+				s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].frame_length_lines;
+			rawchip_data.use_rawchip = s_ctrl->sensordata->use_rawchip;
 
-				ktime_get_ts(&ts_start);
-				rawchip_set_size(rawchip_data);
-				ktime_get_ts(&ts_end);
-				pr_info("%s: %ld ms\n", __func__,
-					(ts_end.tv_sec-ts_start.tv_sec)*1000+(ts_end.tv_nsec-ts_start.tv_nsec)/1000000);
+			ktime_get_ts(&ts_start);
+			rawchip_set_size(rawchip_data);
+			ktime_get_ts(&ts_end);
+			pr_info("%s: %ld ms\n", __func__,
+				(ts_end.tv_sec-ts_start.tv_sec)*1000+(ts_end.tv_nsec-ts_start.tv_nsec)/1000000);
+		}
+#endif
+
+#ifdef CONFIG_RAWCHIPII
+			if (s_ctrl->sensordata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) {
+				if (s_ctrl->msm_sensor_reg->output_settings_yushanii)	 
+					s_ctrl->msm_sensor_reg->output_settings = s_ctrl->msm_sensor_reg->output_settings_yushanii;
+				YushanII_Init(s_ctrl,res);
 			}
 #endif
 
-			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
-				NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg->
-				output_settings[res].op_pixel_clk);
-			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
-				NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM(
-				PIX_0, ISPIF_ON_FRAME_BOUNDARY));
-			s_ctrl->func_tbl->sensor_start_stream(s_ctrl);
-			msleep(30);
-			mutex_unlock(s_ctrl->sensor_first_mutex);  
+		v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
+			NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg->
+			output_settings[res].op_pixel_clk);
+		v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
+			NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM(
+			PIX_0, ISPIF_ON_FRAME_BOUNDARY));
+		s_ctrl->func_tbl->sensor_start_stream(s_ctrl);
+		msleep(30);
+		mutex_unlock(s_ctrl->sensor_first_mutex);  
 	}
 	return rc;
 }
@@ -898,8 +1028,13 @@
 	struct timespec ts_start, ts_end;
 #endif
 
-	mutex_lock(s_ctrl->sensor_first_mutex);
-	
+	pr_info("%s: E", __func__);
+
+	v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
+		NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM(
+		PIX_0, ISPIF_OFF_IMMEDIATELY));
+	s_ctrl->func_tbl->sensor_stop_stream(s_ctrl);
+
 	s_ctrl->curr_csi_params = NULL;
 	msm_sensor_enable_debugfs(s_ctrl);
 	msm_sensor_write_init_settings(s_ctrl);
@@ -928,6 +1063,122 @@
 
 #ifdef CONFIG_RAWCHIP
 		if (s_ctrl->sensordata->use_rawchip) {
+			rawchip_data.sensor_name = s_ctrl->sensordata->sensor_name;
+			rawchip_data.datatype = s_ctrl->curr_csi_params->csid_params.lut_params.vc_cfg->dt;
+			rawchip_data.lane_cnt = s_ctrl->curr_csi_params->csid_params.lane_cnt;
+			rawchip_data.pixel_clk = s_ctrl->msm_sensor_reg->output_settings[res].op_pixel_clk;
+			rawchip_data.mirror_flip = s_ctrl->mirror_flip;
+
+			rawchip_data.width = s_ctrl->msm_sensor_reg->output_settings[res].x_output;
+			rawchip_data.height = s_ctrl->msm_sensor_reg->output_settings[res].y_output;
+			rawchip_data.line_length_pclk = s_ctrl->msm_sensor_reg->output_settings[res].line_length_pclk;
+			rawchip_data.frame_length_lines = s_ctrl->msm_sensor_reg->output_settings[res].frame_length_lines;
+			rawchip_data.x_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_start;
+			rawchip_data.y_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_start;
+			rawchip_data.x_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_end;
+			rawchip_data.y_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_end;
+			rawchip_data.x_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_even_inc;
+			rawchip_data.x_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_odd_inc;
+			rawchip_data.y_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_even_inc;
+			rawchip_data.y_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_odd_inc;
+			rawchip_data.binning_rawchip = s_ctrl->msm_sensor_reg->output_settings[res].binning_rawchip;
+
+			rawchip_data.fullsize_width = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].x_output;
+			rawchip_data.fullsize_height = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].y_output;
+			rawchip_data.fullsize_line_length_pclk =
+				s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].line_length_pclk;
+			rawchip_data.fullsize_frame_length_lines =
+				s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].frame_length_lines;
+			rawchip_data.use_rawchip = s_ctrl->sensordata->use_rawchip;
+
+			ktime_get_ts(&ts_start);
+			rawchip_set_size(rawchip_data);
+			ktime_get_ts(&ts_end);
+			pr_info("%s: %ld ms\n", __func__,
+				(ts_end.tv_sec-ts_start.tv_sec)*1000+(ts_end.tv_nsec-ts_start.tv_nsec)/1000000);
+		}
+#endif
+
+	pr_info("%s: X", __func__);
+	mutex_unlock(s_ctrl->sensor_first_mutex);  
+
+	return rc;
+}
+
+
+int32_t msm_sensor_setting_parallel_ov(struct msm_sensor_ctrl_t *s_ctrl,
+			int update_type, int res)
+{
+	int32_t rc = 0;
+
+#ifdef CONFIG_RAWCHIP
+	struct rawchip_sensor_data rawchip_data;
+	struct timespec ts_start, ts_end;
+#endif
+
+	pr_info("%s: update_type=%d, res=%d\n", __func__, update_type, res);
+
+	if (update_type == MSM_SENSOR_REG_INIT) {
+		mutex_lock(s_ctrl->sensor_first_mutex);  
+
+#ifdef CONFIG_RAWCHIPII
+		YushanII_reload_firmware();
+#endif
+
+		tsk_sensor_init = kthread_create(oem_sensor_init_ov, s_ctrl, "oem_sensor_init_ov");
+		if (IS_ERR(tsk_sensor_init)) {
+			pr_err("%s: kthread_create failed", __func__);
+			rc = PTR_ERR(tsk_sensor_init);
+			tsk_sensor_init = NULL;
+			mutex_unlock(s_ctrl->sensor_first_mutex);  
+		} else
+			wake_up_process(tsk_sensor_init);
+			 
+
+		first_init = 1;
+		
+	} else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) {
+	
+		mutex_lock(s_ctrl->sensor_first_mutex);
+
+		v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
+			NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM(
+			PIX_0, ISPIF_OFF_IMMEDIATELY));
+		msleep(30);
+		s_ctrl->func_tbl->sensor_stop_stream(s_ctrl);
+
+		
+		if(!first_init)
+			mdelay(50);
+		first_init = 0;
+
+		pr_info("%s: update_type=MSM_SENSOR_UPDATE_PERIODIC, res=%d\n", __func__, res);  
+		
+
+		msm_sensor_write_res_settings(s_ctrl, res);
+		if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) {
+			s_ctrl->curr_csi_params = s_ctrl->csi_params[res];
+			s_ctrl->curr_csi_params->csid_params.lane_assign =
+				s_ctrl->sensordata->sensor_platform_info->
+				csi_lane_params->csi_lane_assign;
+			s_ctrl->curr_csi_params->csiphy_params.lane_mask =
+				s_ctrl->sensordata->sensor_platform_info->
+				csi_lane_params->csi_lane_mask;
+			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
+				NOTIFY_CSID_CFG,
+				&s_ctrl->curr_csi_params->csid_params);
+			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
+						NOTIFY_CID_CHANGE, NULL);
+			mb();
+			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
+				NOTIFY_CSIPHY_CFG,
+				&s_ctrl->curr_csi_params->csiphy_params);
+			mb();
+			msleep(20);
+		}
+
+#ifdef CONFIG_RAWCHIP
+		if (s_ctrl->sensordata->use_rawchip) {
 
 			pr_info("%s: use_rawchip\n", __func__);
 
@@ -966,114 +1217,15 @@
 				(ts_end.tv_sec-ts_start.tv_sec)*1000+(ts_end.tv_nsec-ts_start.tv_nsec)/1000000);
 		}
 #endif
-	mutex_unlock(s_ctrl->sensor_first_mutex);
-	
-	return rc;
-}
 
-
-int32_t msm_sensor_setting_parallel_ov(struct msm_sensor_ctrl_t *s_ctrl,
-			int update_type, int res)
-{
-	int32_t rc = 0;
-
-#ifdef CONFIG_RAWCHIP
-	struct rawchip_sensor_data rawchip_data;
-	struct timespec ts_start, ts_end;
-#endif
-
-	pr_info("%s: update_type=%d, res=%d\n", __func__, update_type, res);
-
-	v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
-		NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM(
-		PIX_0, ISPIF_OFF_IMMEDIATELY));
-
-	msleep(30);
-	if (update_type == MSM_SENSOR_REG_INIT) {
-		mutex_lock(s_ctrl->sensor_first_mutex);  
-
-		tsk_sensor_init = kthread_create(oem_sensor_init_ov, s_ctrl, "oem_sensor_init_ov");
-		if (IS_ERR(tsk_sensor_init)) {
-			pr_err("%s: kthread_create failed", __func__);
-			rc = PTR_ERR(tsk_sensor_init);
-			tsk_sensor_init = NULL;
-			mutex_unlock(s_ctrl->sensor_first_mutex);  
-		} else
-			wake_up_process(tsk_sensor_init);
-		first_init = 1;
-		
-	} else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) {
-	
-		mutex_lock(s_ctrl->sensor_first_mutex);
-		
-		if(!first_init)
-			mdelay(50);
-		first_init = 0;
-
-		if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) {
-			s_ctrl->curr_csi_params = s_ctrl->csi_params[res];
-			s_ctrl->curr_csi_params->csid_params.lane_assign =
-				s_ctrl->sensordata->sensor_platform_info->
-				csi_lane_params->csi_lane_assign;
-			s_ctrl->curr_csi_params->csiphy_params.lane_mask =
-				s_ctrl->sensordata->sensor_platform_info->
-				csi_lane_params->csi_lane_mask;
-			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
-				NOTIFY_CSID_CFG,
-				&s_ctrl->curr_csi_params->csid_params);
-			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
-						NOTIFY_CID_CHANGE, NULL);
-			mb();
-			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
-				NOTIFY_CSIPHY_CFG,
-				&s_ctrl->curr_csi_params->csiphy_params);
-			mb();
-			msleep(20);
+#ifdef CONFIG_RAWCHIPII
+		if (s_ctrl->sensordata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) {
+			if (s_ctrl->msm_sensor_reg->output_settings_yushanii)
+				s_ctrl->msm_sensor_reg->output_settings = s_ctrl->msm_sensor_reg->output_settings_yushanii;
+			YushanII_Init(s_ctrl,res);
 		}
-
-#ifdef CONFIG_RAWCHIP
-			if (s_ctrl->sensordata->use_rawchip) {
-
-				pr_info("%s: use_rawchip\n", __func__);
-
-				rawchip_data.sensor_name = s_ctrl->sensordata->sensor_name;
-				rawchip_data.datatype = s_ctrl->curr_csi_params->csid_params.lut_params.vc_cfg->dt;
-				rawchip_data.lane_cnt = s_ctrl->curr_csi_params->csid_params.lane_cnt;
-				rawchip_data.pixel_clk = s_ctrl->msm_sensor_reg->output_settings[res].op_pixel_clk;
-				rawchip_data.mirror_flip = s_ctrl->mirror_flip;
-
-				rawchip_data.width = s_ctrl->msm_sensor_reg->output_settings[res].x_output;
-				rawchip_data.height = s_ctrl->msm_sensor_reg->output_settings[res].y_output;
-				rawchip_data.line_length_pclk = s_ctrl->msm_sensor_reg->output_settings[res].line_length_pclk;
-				rawchip_data.frame_length_lines = s_ctrl->msm_sensor_reg->output_settings[res].frame_length_lines;
-				rawchip_data.x_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_start;
-				rawchip_data.y_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_start;
-				rawchip_data.x_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_end;
-				rawchip_data.y_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_end;
-				rawchip_data.x_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_even_inc;
-				rawchip_data.x_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_odd_inc;
-				rawchip_data.y_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_even_inc;
-				rawchip_data.y_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_odd_inc;
-				rawchip_data.binning_rawchip = s_ctrl->msm_sensor_reg->output_settings[res].binning_rawchip;
-
-				rawchip_data.fullsize_width = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].x_output;
-				rawchip_data.fullsize_height = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].y_output;
-				rawchip_data.fullsize_line_length_pclk =
-					s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].line_length_pclk;
-				rawchip_data.fullsize_frame_length_lines =
-					s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].frame_length_lines;
-				rawchip_data.use_rawchip = s_ctrl->sensordata->use_rawchip;
-
-				ktime_get_ts(&ts_start);
-				rawchip_set_size(rawchip_data);
-				ktime_get_ts(&ts_end);
-				pr_info("%s: %ld ms\n", __func__,
-					(ts_end.tv_sec-ts_start.tv_sec)*1000+(ts_end.tv_nsec-ts_start.tv_nsec)/1000000);
-			}
 #endif
 
-		msm_sensor_write_res_settings(s_ctrl, res);
-
 		v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
 			NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg->
 			output_settings[res].op_pixel_clk);
@@ -1124,6 +1276,10 @@
 		s_ctrl->curr_res = MSM_SENSOR_INVALID_RES;
 		s_ctrl->cam_mode = mode;
 
+		s_ctrl->prev_gain = 0;
+		s_ctrl->prev_dig_gain = 0;
+		s_ctrl->prev_line = 0;
+
 		rc = s_ctrl->func_tbl->sensor_setting(s_ctrl,
 			MSM_SENSOR_REG_INIT, 0);
 	}
@@ -1134,6 +1290,7 @@
 		struct sensor_output_info_t *sensor_output_info)
 {
 	int rc = 0;
+	int i=0;
 	CDBG("%s: called\n", __func__);
 
 	sensor_output_info->num_info = s_ctrl->msm_sensor_reg->num_conf;
@@ -1147,12 +1304,38 @@
 		s_ctrl->sensor_exp_gain_info->sensor_max_linecount = 0xFFFFFFFF;
 
 	sensor_output_info->sensor_max_linecount = s_ctrl->sensor_exp_gain_info->sensor_max_linecount;
-	if (copy_to_user((void *)sensor_output_info->output_info,
-		s_ctrl->msm_sensor_reg->output_settings,
-		sizeof(struct msm_sensor_output_info_t) *
-		s_ctrl->msm_sensor_reg->num_conf))
-		rc = -EFAULT;
-
+	
+    for (i=0;i<s_ctrl->msm_sensor_reg->num_conf;++i) {
+        if (s_ctrl->adjust_y_output_size)
+            s_ctrl->msm_sensor_reg->output_settings[i].y_output -= 1;
+        if (s_ctrl->adjust_frame_length_line)
+            s_ctrl->msm_sensor_reg->output_settings[i].line_length_pclk *= 2;
+    }
+	
+	
+	 
+	if ((s_ctrl->sensordata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) && (s_ctrl->msm_sensor_reg->output_settings_yushanii)) {
+		if (copy_to_user((void *)sensor_output_info->output_info,
+			s_ctrl->msm_sensor_reg->output_settings_yushanii,
+			sizeof(struct msm_sensor_output_info_t) *
+			s_ctrl->msm_sensor_reg->num_conf))
+			rc = -EFAULT;
+	} else {
+		if (copy_to_user((void *)sensor_output_info->output_info,
+			s_ctrl->msm_sensor_reg->output_settings,
+			sizeof(struct msm_sensor_output_info_t) *
+			s_ctrl->msm_sensor_reg->num_conf))
+			rc = -EFAULT;
+	}
+	
+    for (i=0;i<s_ctrl->msm_sensor_reg->num_conf;++i) {
+        if (s_ctrl->adjust_y_output_size)
+            s_ctrl->msm_sensor_reg->output_settings[i].y_output += 1;
+        if (s_ctrl->adjust_frame_length_line)
+            s_ctrl->msm_sensor_reg->output_settings[i].line_length_pclk /= 2;
+    }
+    
+	
 	return rc;
 }
 
@@ -1198,6 +1381,7 @@
 {
 	struct sensor_cfg_data cdata;
 	long   rc = 0;
+
 	if (copy_from_user(&cdata,
 		(void *)argp,
 		sizeof(struct sensor_cfg_data)))
@@ -1234,7 +1418,38 @@
 					cdata.cfg.exp_gain.dig_gain, 
 					cdata.cfg.exp_gain.line);
 			s_ctrl->prev_gain = cdata.cfg.exp_gain.gain;
-			s_ctrl->prev_line = cdata.cfg.exp_gain.line;					
+			s_ctrl->prev_line = cdata.cfg.exp_gain.line;
+			s_ctrl->prev_dig_gain= cdata.cfg.exp_gain.dig_gain;
+			break;
+
+		case CFG_SET_HDR_EXP_GAIN:
+			if (s_ctrl->func_tbl->
+			sensor_write_hdr_exp_gain_ex == NULL) {
+				rc = -EFAULT;
+				break;
+			}
+			rc =
+				s_ctrl->func_tbl->
+				sensor_write_hdr_exp_gain_ex(
+					s_ctrl,
+					cdata.mode, 
+					cdata.cfg.exp_gain.gain,
+					cdata.cfg.exp_gain.long_dig_gain,
+					cdata.cfg.exp_gain.short_dig_gain,
+					cdata.cfg.exp_gain.long_line,
+					cdata.cfg.exp_gain.short_line);
+			break;
+		case CFG_SET_HDR_OUTDOOR_FLAG:
+			if (s_ctrl->func_tbl->
+			sensor_write_hdr_outdoor_flag == NULL) {
+				rc = -EFAULT;
+				break;
+			}
+			rc =
+				s_ctrl->func_tbl->
+				sensor_write_hdr_outdoor_flag(
+					s_ctrl,
+					cdata.cfg.exp_gain.is_outdoor);
 			break;
 
 		case CFG_SET_PICT_EXP_GAIN:
@@ -1541,20 +1756,30 @@
 {
 	int32_t rc = 0;
 	uint16_t chipid = 0;
+#if defined(CONFIG_MACH_MONARUDO) || defined(CONFIG_MACH_DELUXE_J) || defined(CONFIG_MACH_DELUXE_R) || defined(CONFIG_MACH_IMPRESSION_J)\
+		|| defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY)
+	int i=1;
+#else
 	int i=10;
+#endif
 	CDBG("%s: called %d\n", __func__, __LINE__);
 
 	while(i--)
 	{
-		pr_info("%s: retry %d\n",  __func__, i);
-	
 		rc = msm_camera_i2c_read(
 				s_ctrl->sensor_i2c_client,
 				s_ctrl->sensor_id_info->sensor_id_reg_addr, &chipid,
 				MSM_CAMERA_I2C_WORD_DATA);
 
-		if(rc>=0)
-			break;
+		if (rc >= 0) {
+			if (chipid != s_ctrl->sensor_id_info->sensor_id) {
+				pr_info("%s sensor id: 0x%X?\n", __func__, chipid);
+			} else
+				break;
+		}
+
+		pr_info("%s: retry %d\n",  __func__, i);
+
 	}
 	if (rc < 0) {
 		pr_err("%s: read id failed\n", __func__);
@@ -1579,7 +1804,7 @@
 		}
 #endif
 	if (chipid != s_ctrl->sensor_id_info->sensor_id) {
-#if defined(CONFIG_MACH_MONARUDO) || defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DELUXE_R) || defined(CONFIG_MACH_DUMMY)\
+#if defined(CONFIG_MACH_MONARUDO) || defined(CONFIG_MACH_DELUXE_J) || defined(CONFIG_MACH_DELUXE_R) || defined(CONFIG_MACH_IMPRESSION_J)\
     || defined(CONFIG_MACH_DUMMY) || defined(CONFIG_MACH_DUMMY)
 		if (chipid == 0x174 && s_ctrl->sensor_id_info->sensor_id == 0x175)
 		{
@@ -1644,6 +1869,26 @@
 #endif
 	}
 
+	
+#ifdef CONFIG_RAWCHIPII
+		rc = YushanII_probe_init();
+		if (rc < 0) {
+			pr_err("%s: rawchip probe init failed\n", __func__);
+			if(s_ctrl->sensordata->camera_yushanii_probed != NULL) {
+				pr_info("%s: update htc_image to 0", __func__);
+				s_ctrl->sensordata->camera_yushanii_probed(HTC_CAMERA_IMAGE_NONE_BOARD);
+			}
+			
+		} else {
+			pr_info("%s rawhchip probe init success\n", __func__);
+			if(s_ctrl->sensordata->camera_yushanii_probed != NULL) {
+				pr_info("%s: update htc_image to 1", __func__);
+				s_ctrl->sensordata->camera_yushanii_probed(HTC_CAMERA_IMAGE_YUSHANII_BOARD);
+			}
+		}
+#endif
+	
+
 	if (s_ctrl->func_tbl && s_ctrl->func_tbl->sensor_power_up)
 		rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
 
@@ -1698,6 +1943,12 @@
 #endif
 	}
 
+	if (s_ctrl->sensordata->htc_image == HTC_CAMERA_IMAGE_YUSHANII_BOARD) {
+#ifdef CONFIG_RAWCHIPII
+		YushanII_probe_deinit();
+#endif
+	}
+
 	msm_camio_probe_off_bootup(s_ctrl);	
 
 	return rc;
diff --git a/drivers/media/video/msm/sensors/msm_sensor.h b/drivers/media/video/msm/sensors/msm_sensor.h
index 20ade5d..3897530 100644
--- a/drivers/media/video/msm/sensors/msm_sensor.h
+++ b/drivers/media/video/msm/sensors/msm_sensor.h
@@ -28,6 +28,9 @@
 #include <media/v4l2-subdev.h>
 #include "msm_camera_i2c.h"
 #include "msm_camera_eeprom.h"
+#include "../yushanII/ilp0100_ST_definitions.h"
+#include <media/linux_yushanii.h>
+
 #define Q8  0x00000100
 #define Q10 0x00000400
 
@@ -35,6 +38,21 @@
 #define MSM_SENSOR_MCLK_16HZ 16000000
 #define MSM_SENSOR_MCLK_24HZ 24000000
 
+extern uint32_t ois_line;
+
+typedef enum {
+	OTP_VCM_CALIBRATION = 0,
+	OTP_NUM_TYPES
+} OTP_DATA_TYPE;
+typedef enum {
+	OTP_READ_DATA_SUCCESS = 0,
+	OTP_DATA_NOT_READY_ERROR,
+	OTP_READ_DATA_TYPE_ERROR,
+	OTP_READ_DATA_STATUS_NUM
+} OTP_DATA_READ_STATUS;
+int set_VCM_OTP(int type, uint8_t* data, int size);
+int get_VCM_OTP(int type, uint8_t* data, int size);
+
 enum msm_sensor_reg_update {
 	
 	MSM_SENSOR_REG_INIT,
@@ -79,15 +97,29 @@
 	uint8_t start_stream_conf_size;
 	struct msm_camera_i2c_reg_conf *stop_stream_conf;
 	uint8_t stop_stream_conf_size;
+
+	struct msm_camera_i2c_reg_conf *start_stream_conf_yushanii;
+	uint8_t start_stream_conf_size_yushanii;
+	struct msm_camera_i2c_reg_conf *stop_stream_conf_yushanii;
+	uint8_t stop_stream_conf_size_yushanii;
+
 	struct msm_camera_i2c_reg_conf *group_hold_on_conf;
 	uint8_t group_hold_on_conf_size;
 	struct msm_camera_i2c_reg_conf *group_hold_off_conf;
 	uint8_t group_hold_off_conf_size;
 	struct msm_camera_i2c_conf_array *init_settings;
 	uint8_t init_size;
+
+	struct msm_camera_i2c_conf_array *init_settings_yushanii;
+	uint8_t init_size_yushanii;
+
+	struct msm_camera_i2c_conf_array *init_settings_2;
+	uint8_t init_size_2;
+
 	struct msm_camera_i2c_conf_array *mode_settings;
 	struct msm_camera_i2c_conf_array *no_effect_settings;
 	struct msm_sensor_output_info_t *output_settings;
+	struct msm_sensor_output_info_t *output_settings_yushanii;
 	uint8_t num_conf;
 };
 
@@ -124,6 +156,9 @@
 			uint16_t, uint32_t);
 	int32_t (*sensor_write_exp_gain_ex) (struct msm_sensor_ctrl_t *,
 			int, uint16_t, uint16_t, uint32_t); 
+	int32_t (*sensor_write_hdr_outdoor_flag) (struct msm_sensor_ctrl_t *, uint8_t); 
+	int32_t (*sensor_write_hdr_exp_gain_ex) (struct msm_sensor_ctrl_t *,
+			int, uint16_t, uint16_t, uint16_t, uint32_t, uint32_t); 
 	int32_t (*sensor_write_snapshot_exp_gain_ex) (struct msm_sensor_ctrl_t *,
 			int, uint16_t, uint16_t, uint32_t); 
 	int32_t (*sensor_setting) (struct msm_sensor_ctrl_t *,
@@ -146,10 +181,20 @@
 		(struct msm_sensor_ctrl_t *s_ctrl, uint16_t res);
 
 	int32_t (*sensor_set_dig_gain) (struct msm_sensor_ctrl_t *, uint16_t); 
+	int32_t (*sensor_set_hdr_dig_gain) (struct msm_sensor_ctrl_t *, uint16_t, uint16_t); 
 	
 	void (*sensor_ov2722_write_exp_line) (struct msm_sensor_ctrl_t *, uint16_t); 
 
 	int (*sensor_write_output_settings_specific)(struct msm_sensor_ctrl_t *s_ctrl, uint16_t res); 
+	int (*sensor_i2c_read_otp)(struct sensor_cfg_data *cdata, struct msm_sensor_ctrl_t *s_ctrl);
+
+	void (*sensor_yushanii_status_line_modifier2)(uint8_t*);
+	void (*sensor_yushanii_status_line_modifier)(uint16_t*);
+	void (*sensor_yushanii_line_length_pclk_modifier)(uint16_t*);
+	void (*sensor_yushanii_status_line_outputed_modifier)(unsigned char*);
+    void (*sensor_yushanII_set_output_format)(struct msm_sensor_ctrl_t *sensor,int res, Ilp0100_structFrameFormat *output_format);
+	void (*sensor_yushanII_set_parm)(struct msm_sensor_ctrl_t *sensor, int res,Ilp0100_structSensorParams *YushanII_sensor);
+    void (*sensor_yushanII_set_IQ)(struct msm_sensor_ctrl_t *sensor,int*,int*,int*,struct yushanii_cls*);
 };
 
 struct msm_sensor_ctrl_t {
@@ -172,6 +217,7 @@
 	uint16_t curr_frame_length_lines;
 	uint16_t prev_gain;
 	uint16_t prev_line;
+	uint16_t prev_dig_gain;
 
 	uint32_t fps_divider;
 	enum msm_sensor_resolution_t curr_res;
@@ -193,6 +239,11 @@
 	long clk_rate;
 	int mirror_flip;	
 	struct mutex *sensor_first_mutex;  
+	int hdr_mode;
+	int yushanII_switch_virtual_channel;
+	int adjust_y_output_size;
+	int adjust_frame_length_line;
+	uint8_t driver_ic;
 };
 
 void msm_sensor_start_stream(struct msm_sensor_ctrl_t *s_ctrl);
diff --git a/drivers/media/video/msm/sensors/s5k3h2yx_v4l2.c b/drivers/media/video/msm/sensors/s5k3h2yx_v4l2.c
index 517c6f2..94203d9 100644
--- a/drivers/media/video/msm/sensors/s5k3h2yx_v4l2.c
+++ b/drivers/media/video/msm/sensors/s5k3h2yx_v4l2.c
@@ -355,6 +355,62 @@
 	{ 0x301A , 0x77 }, 
 };
 
+static struct msm_camera_i2c_reg_conf s5k3h2yx_4_3_settings[] = {
+	
+	{0x0305, 0x04},
+	{0x0306, 0x00},
+	{0x0307, 0x98},
+	{0x0303, 0x01},
+	{0x0301, 0x05},
+	{0x030B, 0x01},
+	{0x0309, 0x05},
+	{0x30CC, 0xE0},
+	{0x31A1, 0x5A},
+
+	
+	{0x0200, 0x02},
+	{0x0201, 0x50},
+	{0x0202, 0x04},
+	{0x0203, 0xE7},
+	{0x0204, 0x00},
+	{0x0205, 0x20},
+	{0x0342, 0x0D},
+	{0x0343, 0x8E},
+#ifdef CONFIG_RAWCHIP
+	{0x0340, 0x09},
+	{0x0341, 0xC4},
+#else
+	{0x0340, 0x09},
+	{0x0341, 0xC0},
+#endif
+	
+	{0x0344, 0x00},
+	{0x0345, 0x00},
+	{0x0346, 0x00},
+	{0x0347, 0x00},
+	{0x0348, 0x0C},
+	{0x0349, 0xCF},
+	{0x034A, 0x09},
+	{0x034B, 0x9F},
+	{0x0381, 0x01},
+	{0x0383, 0x01},
+	{0x0385, 0x01},
+	{0x0387, 0x01},
+	{0x0105, 0x01}, 
+	{0x0401, 0x00},
+	{0x0405, 0x10},
+	{0x0700, 0x05},
+	{0x0701, 0x30},
+	{0x034C, 0x0C},
+	{0x034D, 0xD0},
+	{0x034E, 0x09},
+	{0x034F, 0xA0},
+
+	
+	{ 0x300E , 0x29 }, 
+	{ 0x31A3 , 0x00 }, 
+	{ 0x301A , 0x77 }, 
+};
 
 static struct msm_camera_i2c_reg_conf s5k3h2yx_snap_wide_settings[] = {
 
@@ -576,6 +632,8 @@
 	ARRAY_SIZE(s5k3h2yx_fast_video_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
 	{&s5k3h2yx_snap_wide_settings[0],
 	ARRAY_SIZE(s5k3h2yx_snap_wide_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
+	{&s5k3h2yx_4_3_settings[0],
+	ARRAY_SIZE(s5k3h2yx_4_3_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
 	{&s5k3h2yx_night_settings[0],
 	ARRAY_SIZE(s5k3h2yx_night_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
 };
@@ -715,6 +773,28 @@
 		.binning_rawchip = 0x11,
 	},
 	{
+		.x_output = 0xCD0,
+		.y_output = 0x9A0,
+		.line_length_pclk = 0xD8E,
+#ifdef CONFIG_RAWCHIP
+		.frame_length_lines = 0x9C4,
+#else
+		.frame_length_lines = 0x9C0,
+#endif
+		.vt_pixel_clk = 182400000,
+		.op_pixel_clk = 182400000,
+		.binning_factor = 1,
+		.x_addr_start = 0,
+		.y_addr_start = 0,
+		.x_addr_end = 0xCCF,
+		.y_addr_end = 0x99F,
+		.x_even_inc = 1,
+		.x_odd_inc = 1,
+		.y_even_inc = 1,
+		.y_odd_inc = 1,
+		.binning_rawchip = 0x11,
+	},	
+	{
 		.x_output = 0x668,
 		.y_output = 0x4D0,
 		.line_length_pclk = 0xD8E,
@@ -738,6 +818,26 @@
 	},
 };
 
+#ifdef CONFIG_ARCH_MSM8X60
+
+static struct msm_camera_csi_params s5k3h2yx_csi_params = {
+	.data_format = CSI_RAW10,
+	.lane_cnt    = 2,
+	.lane_assign = 0xe4,
+	.dpcm_scheme = 0,
+	.settle_cnt  = 0x2a,
+};
+
+static struct msm_camera_csi_params *s5k3h2yx_csi_params_array[] = {
+	&s5k3h2yx_csi_params,
+	&s5k3h2yx_csi_params,
+	&s5k3h2yx_csi_params,
+	&s5k3h2yx_csi_params,
+	&s5k3h2yx_csi_params,
+	&s5k3h2yx_csi_params,
+};
+
+#else  
 static struct msm_camera_csid_vc_cfg s5k3h2yx_cid_cfg[] = {
 	{0, CSI_RAW10, CSI_DECODE_10BIT},
 	{1, CSI_EMBED_DATA, CSI_DECODE_8BIT},
@@ -766,6 +866,7 @@
 	&s5k3h2yx_csi_params,
 	&s5k3h2yx_csi_params
 };
+#endif 
 
 static struct msm_sensor_output_reg_addr_t s5k3h2yx_reg_addr = {
 	.x_output = 0x34C,
@@ -1457,7 +1558,11 @@
 	.sensor_set_fps = msm_sensor_set_fps,
 	.sensor_write_exp_gain_ex = msm_sensor_write_exp_gain1_ex,
 	.sensor_write_snapshot_exp_gain_ex = msm_sensor_write_exp_gain1_ex,
+#ifdef CONFIG_ARCH_MSM8X60
+	.sensor_setting = msm_sensor_setting1,
+#else
 	.sensor_setting = msm_sensor_setting,
+#endif
 	.sensor_set_sensor_mode = msm_sensor_set_sensor_mode,
 	.sensor_mode_init = msm_sensor_mode_init,
 	.sensor_get_output_info = msm_sensor_get_output_info,
@@ -1493,7 +1598,11 @@
 	.sensor_id_info = &s5k3h2yx_id_info,
 	.sensor_exp_gain_info = &s5k3h2yx_exp_gain_info,
 	.cam_mode = MSM_SENSOR_MODE_INVALID,
+#ifdef CONFIG_ARCH_MSM8X60
+	.csic_params = &s5k3h2yx_csi_params_array[0],
+#else
 	.csi_params = &s5k3h2yx_csi_params_array[0],
+#endif
 	.msm_sensor_mutex = &s5k3h2yx_mut,
 	.sensor_i2c_driver = &s5k3h2yx_i2c_driver,
 	.sensor_v4l2_subdev_info = s5k3h2yx_subdev_info,
diff --git a/drivers/media/video/msm/swfv/Makefile b/drivers/media/video/msm/swfv/Makefile
new file mode 100644
index 0000000..be04fe7
--- /dev/null
+++ b/drivers/media/video/msm/swfv/Makefile
@@ -0,0 +1,3 @@
+GCC_VERSION      := $(shell $(CONFIG_SHELL) $(PWD)/scripts/gcc-version.sh $(CROSS_COMPILE)gcc)
+EXTRA_CFLAGS += -Idrivers/media/video/msm
+obj-$(CONFIG_MSM_CAMERA) += swfa_k.o
diff --git a/drivers/media/video/msm/swfv/swfa_k.c b/drivers/media/video/msm/swfv/swfa_k.c
new file mode 100644
index 0000000..c8dca35
--- /dev/null
+++ b/drivers/media/video/msm/swfv/swfa_k.c
@@ -0,0 +1,201 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include "swfa_k.h"
+#include <linux/vmalloc.h>
+#include "../yushanII/file_operation.h"
+#include <linux/fs.h>
+#include <linux/slab.h>
+
+#define SW_BUF_SIZE 	32*1024
+#define ROI_BUF_SIZE 	128*1024
+
+static int m_nCurROIWidth = 0, m_nCurROIHeight = 0;
+static uint8_t *Y1 = 0;
+static int nNewROIX = 0;
+static int nNewROIY = 0;
+static int nNewROIW = 0;
+static int nNewROIH = 0;
+
+int swfa_FeatureAnalysis(uint8_t* pCurBuffer, int nImgWidth, int nImgHeight, int nROIX, int nROIY, int nROIW, int nROIH, int bRefineROI)
+{
+	int status = 1;
+
+#if 0
+	uint8_t *path= "/data/test.yuv";
+	struct file *pFile;
+	static int i=0;
+
+	if (i==0){
+		pFile = file_open(path, O_CREAT|O_RDWR, 666);
+		if(pFile == NULL){
+			pr_err("open file %s fail",path);
+			return 0;
+		}
+		file_write(pFile, 0, (void*)pCurBuffer, nImgWidth*nImgHeight*3/2);
+		file_close(pFile);
+		i++;
+	}
+#endif
+	if(!pCurBuffer || (nROIW<16) || (nROIH<16)){
+		return 0;
+	}
+
+	if((nROIX + nROIW > nImgWidth) || (nROIY + nROIH > nImgHeight)){
+		return 0;
+	}
+
+	
+	if(bRefineROI==0){
+		nNewROIX = nROIX;
+		nNewROIY = nROIY;
+		nNewROIW = nROIW;
+		nNewROIH = nROIH;
+	}
+	else{
+#if 0
+		nNewROIX = nROIX + nROIW*15/100;
+		nNewROIW = nNewROIX + nROIW*7/10 < nImgWidth ? nROIW*7/10 : nImgWidth-1-nNewROIX;
+#else
+		nNewROIX = nROIX;
+		nNewROIW = nROIW;
+#endif
+		nNewROIY = nROIY;
+		nNewROIH = nNewROIY + nROIH*SWFA_ROIRATIO_HEIGHT < nImgHeight ? nROIH*SWFA_ROIRATIO_HEIGHT : nImgHeight-1-nNewROIY;
+
+	}
+
+	nNewROIW-=(nNewROIW%4);
+	nNewROIH-=(nNewROIH%4);
+
+	if( (nNewROIW*nNewROIH) > ROI_BUF_SIZE){
+		return 0;
+	}
+
+	status = swfa_Transform( pCurBuffer, nNewROIX, nNewROIY, nNewROIW, nNewROIH, nImgWidth);
+	return status;
+}
+
+int swfa_Transform(uint8_t* pCurBuffer, int nNewROIX, int nNewROIY, int nImgWidth, int nImgHeight, int nWholeImgWidth)
+{
+
+	register unsigned int x=0, y=0;
+	int nHalfWLWidth=0;
+	int nHalfWLHeight=0;
+	uint8_t *pY1 = Y1;
+	uint8_t *pBuf = pCurBuffer;
+	
+	
+
+	if(!Y1){
+		pr_err("[swfa] %s: memory allocate error\n", __func__);
+		return 0;
+	}
+
+	nHalfWLWidth = nImgWidth/2;
+	nHalfWLHeight = nImgHeight/2;
+
+	for(y=0; y<nImgHeight; y++)
+	{
+		pBuf = pCurBuffer + ((y+nNewROIY)*nWholeImgWidth+nNewROIX);
+		pY1 = Y1 + y*nImgWidth;
+		for(x=0; x<nHalfWLWidth/2; x++)
+		{
+			*pY1 = ((*pBuf) + (*(pBuf+1)))>>1;
+			*((pY1++)+nHalfWLWidth/2) = abs((*pBuf)-(*(pBuf+1)));
+			pBuf+=4;
+		}
+	}
+	return 1;
+}
+
+int swfa_Transform2(uint8_t *swfaBuffer, int *newROIW, int *newROIH)
+{
+	register unsigned int x=0, y=0;
+	int nHalfWLWidth=0;
+	int nHalfWLHeight=0;
+	int nTmp1;
+	unsigned int nTmp;
+	uint8_t *pY1 = Y1;
+	uint8_t *pTarget =0;
+
+	*newROIW = nNewROIW;
+	*newROIH = nNewROIH;
+
+	if(!Y1){
+		pr_err("[swfa] %s: memory allocate error\n", __func__);
+		return 0;
+	}
+
+	nHalfWLWidth = nNewROIW/2;
+	nHalfWLHeight = nNewROIH/2;
+
+	nTmp = nHalfWLHeight/2 * nNewROIW;
+	nTmp1 = nHalfWLHeight/2 * nNewROIW/2;
+	pTarget = swfaBuffer;
+
+	for(y=0; y<nHalfWLHeight/2; y++)
+	{
+		pY1 = Y1 + 4*y*nNewROIW;
+		for(x=0; x<nNewROIW/2; x++)
+		{
+			*pTarget=((*pY1) + (*(pY1+nNewROIW)))>>1;
+			*((pTarget++)+nTmp1) = abs((*pY1)-(*(pY1+nNewROIW)));
+			++pY1;
+		}
+	}
+	return 1;
+}
+
+void swfa_DeleteBuf(int nBufWidth, int nBufHeight)
+{
+
+	if(nBufWidth<=0 || nBufHeight<=0)
+		return;
+
+	if(Y1!=0){
+		kfree(Y1);
+	}
+}
+
+static int __init swfa_init(void)
+{
+	
+	Y1=0;
+	m_nCurROIWidth = -1;
+	m_nCurROIHeight = -1;
+	nNewROIX = 0;
+	nNewROIY = 0;
+	nNewROIW = 0;
+	nNewROIH = 0;
+	Y1 = kcalloc(ROI_BUF_SIZE, sizeof(*Y1), GFP_ATOMIC);
+	if(!Y1){
+		return 0;
+	}
+	pr_info("[swfa] %s: SW-MM-A-2013-0314-1600-v0001\n", __func__);
+	return 1;
+}
+
+static void __exit swfa_exit(void)
+{
+	if(Y1!=0){
+		kfree(Y1);
+	}
+}
+
+MODULE_DESCRIPTION("swfa");
+MODULE_VERSION("swfa 1.0");
+
+
+module_init(swfa_init);
+module_exit(swfa_exit);
diff --git a/drivers/media/video/msm/swfv/swfa_k.h b/drivers/media/video/msm/swfv/swfa_k.h
new file mode 100644
index 0000000..5cc223f
--- /dev/null
+++ b/drivers/media/video/msm/swfv/swfa_k.h
@@ -0,0 +1,31 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef SWFA_K_H
+#define SWFA_K_H
+
+#include <linux/types.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+
+#define SWFA_AUTHOR "SW-MM-A"
+#define SWFA_TIME "2013-0314-1600"
+#define SWFA_VERSION "v0001"
+#define SWFA_ROIRATIO_HEIGHT 2
+
+int swfa_FeatureAnalysis(uint8_t* pCurBuffer, int nImgWidth, int nImgHeight, int nROIX, int nROIY, int nROIW, int nROIH, int bRefineROI);
+int swfa_Transform(uint8_t* pCurBuffer, int nNewROIX, int nNewROIY, int nWidht, int nHeight , int nWholeImgWidth);
+
+int swfa_Transform2(uint8_t *swfaBuffer, int *newROIW, int *newROIH);
+#endif
+
+
diff --git a/drivers/media/video/msm/yushanII/Makefile b/drivers/media/video/msm/yushanII/Makefile
new file mode 100644
index 0000000..012e8f8
--- /dev/null
+++ b/drivers/media/video/msm/yushanII/Makefile
@@ -0,0 +1,8 @@
+GCC_VERSION      := $(shell $(CONFIG_SHELL) $(PWD)/scripts/gcc-version.sh $(CROSS_COMPILE)gcc)
+
+EXTRA_CFLAGS += -Idrivers/media/video/msm/sensors
+EXTRA_CFLAGS += -Idrivers/media/video/msm/io
+EXTRA_CFLAGS += -Idrivers/media/video/msm
+
+obj-$(CONFIG_RAWCHIPII) += file_operation.o rawchip_spi.o yushanII.o ilp0100_customer_iqsettings.o ilp0100_customer_platform.o ilp0100_customer_sensor_config.o ilp0100_ST_core.o ilp0100_ST_debugging.o
+
diff --git a/drivers/media/video/msm/yushanII/file_operation.h b/drivers/media/video/msm/yushanII/file_operation.h
new file mode 100644
index 0000000..5a50b72
--- /dev/null
+++ b/drivers/media/video/msm/yushanII/file_operation.h
@@ -0,0 +1,21 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+
+
+ void file_close(struct file* file);
+ int file_write(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size);
+ int file_read(struct file* file, unsigned long long offset, unsigned char* data, unsigned int size);
+ struct file* file_open(const char* path, int flags, int rights);
+
+ 
diff --git a/drivers/media/video/msm/yushanII/ilp0100_ST_definitions.h b/drivers/media/video/msm/yushanII/ilp0100_ST_definitions.h
new file mode 100644
index 0000000..73e8caf
--- /dev/null
+++ b/drivers/media/video/msm/yushanII/ilp0100_ST_definitions.h
@@ -0,0 +1,362 @@
+/*******************************************************************************
+################################################################################
+#                             (C) STMicroelectronics 2012
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 and only version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+#------------------------------------------------------------------------------
+#                             Imaging Division
+################################################################################
+********************************************************************************/
+
+#ifndef ILP0100_ST_DEFINITIONS_H_
+#define ILP0100_ST_DEFINITIONS_H_
+#include <linux/types.h>
+#include "ilp0100_customer_platform_types.h"
+
+
+
+
+#define ILP0100_MAJOR_VERSION_NUMBER 0
+#define ILP0100_MINOR_VERSION_NUMBER 19
+
+#ifndef TRUE
+#define TRUE	1
+#endif
+#ifndef FALSE
+#define FALSE	0
+#endif
+
+#define INTR_PIN_0 	0
+#define INTR_PIN_1	1
+
+#define ILP0100_CLOCK	0
+#define EXTERNAL_CLOCK	1
+
+#define HDR_NONE	0
+#define STAGGERED	1
+
+#define NORMAL_OR_HDR_SHORT	0
+#define HDR_LONG			1
+
+#define SENSOR_0	0
+#define SENSOR_1	1
+#define SENSOR_NONE	2
+
+#define RAW_8	8
+#define RAW_10	10
+#define RAW_12  12
+
+#define GR 0
+#define RG 1
+#define BG 2
+#define GB 3
+
+#define ORIENTATION_NORMAL	0
+#define ORIENTATION_MIRROR	1
+#define ORIENTATION_VFLIP	2
+#define ORIENTATION_VFLIP_AND_MIRROR	ORIENTATION_MIRROR|ORIENTATION_VFLIP
+
+
+#define INTR_SPI_COMMS_READY				0x00000001
+#define INTR_IDLE_COMPLETE					0x00000002
+#define INTR_ISP_STREAMING					0x00000004
+#define INTR_MODE_CHANGE_COMPLETE			0x00000008
+#define INTR_START_OF_FRAME					0x00000020
+#define INTR_END_OF_FRAME					0x00000040
+#define INTR_MODE_CHANGE_REQUEST			0x00000080
+#define INTR_LONGEXP_GLACE_STATS_READY		0x00000100
+#define INTR_LONGEXP_HISTOGRAM_STATS_READY	0x00000200
+#define INTR_SHORTEXP_GLACE_STATS_READY		0x00010000
+#define INTR_SHORTEXP_HISTOGRAM_STATS_READY	0x00020000
+#define INTR_ITPOINT_LONG					0x00200000
+#define INTR_ITPOINT_SHORT_OR_NORMAL		0x00400000
+#define INTR_ITPOINT_MERGED					0x00800000
+
+#define INTR_RXPHY_ERROR			0x00000001
+#define INTR_CSI2RX_ERROR 			0x00000002
+#define INTR_SMIA_UNPACK_ERROR 		0x00000004
+#define INTR_P2W_FIFO_ERROR 		0x00000008
+#define INTR_LTYPE_RETAG_ERROR 		0x00000010
+#define INTR_HDR_MERGE_ERROR 		0x00000020
+#define INTR_TONE_MAP_ERROR 		0x00000040
+#define INTR_MISC_SYS_ERROR 		0x00000080
+#define INTR_CSI2TX_ERROR 			0x00000100
+#define INTR_TXPHY_ERROR 			0x00000200
+#define INTR_INCORRECT_WORD_COUNT 	0x00000400
+#define INCORRECT_LSCP2P_BUFFER 	0x00000800
+
+#define	ENABLE_NO_INTR					0x0000
+#define ENABLE_STATISTICS_INTR				INTR_LONGEXP_GLACE_STATS_READY|INTR_SHORTEXP_GLACE_STATS_READY
+#define ENABLE_RECOMMENDED_DEBUG_INTR_PIN0 	ENABLE_STATISTICS_INTR
+#define ENABLE_HTC_INTR	ENABLE_STATISTICS_INTR|\
+							INTR_SPI_COMMS_READY|\
+							INTR_IDLE_COMPLETE|\
+							INTR_MODE_CHANGE_COMPLETE|\
+							INTR_START_OF_FRAME|\
+							INTR_END_OF_FRAME
+#define ENABLE_ALL_ERROR_INTR				INTR_RXPHY_ERROR|INTR_CSI2RX_ERROR|INTR_SMIA_UNPACK_ERROR|INTR_P2W_FIFO_ERROR|INTR_LTYPE_RETAG_ERROR|INTR_HDR_MERGE_ERROR|INTR_TONE_MAP_ERROR|INTR_MISC_SYS_ERROR|INTR_CSI2TX_ERROR|INTR_TXPHY_ERROR|INTR_INCORRECT_WORD_COUNT|INCORRECT_LSCP2P_BUFFER
+#define ENABLE_RECOMMENDED_DEBUG_INTR_PIN1	ENABLE_ALL_ERROR_INTR
+
+
+
+
+
+#define BYPASS_NO_BYPASS			0x0000
+#define BYPASS_CHANNEL_OFFSET 		0x0001
+#define BYPASS_DEFCOR				0x0002
+#define BYPASS_STATS				0x0004
+#define BYPASS_HDR_MERGE_KEEP_LONG	0x0008
+#define BYPASS_HDR_MERGE_KEEP_SHORT	0x0010
+#define BYPASS_TONE_MAPPING			0x0020  
+#define BYPASS_LSC					0x0040
+#define BYPASS_ISP					0x0080
+#define ENABLE_CHANNEL_OFFSET_ONLY BYPASS_DEFCOR|BYPASS_STATS|BYPASS_HDR_MERGE_KEEP_SHORT|BYPASS_TONE_MAPPING|BYPASS_LSC
+#define BYPASS_ALL_IPS			BYPASS_CHANNEL_OFFSET|BYPASS_DEFCOR|BYPASS_STATS|BYPASS_HDR_MERGE_KEEP_SHORT|BYPASS_TONE_MAPPING|BYPASS_LSC
+#define FORCE_LSC_GRIDS0			0x0100
+#define FORCE_LSC_GRIDS1			0x0200
+#define FORCE_LSC_GRIDS2			0x0400
+#define FORCE_LSC_GRIDS3			0x0800
+
+
+#define TEST_NO_TEST_MODE		0x00
+#define TEST_UNIFORM_GREY		0x01
+#define	TEST_COLORBAR			0x02
+#define TEST_PN29				0x04
+#define TEST_SOLID				0x06
+#define TEST_ADD_STATUS_LINES	0x08	
+
+
+
+
+typedef uint16_t ilp0100_error;
+
+
+
+typedef	struct{
+	
+	
+	uint8_t 	NumberOfLanes;
+	
+	
+	uint16_t 	uwPixelFormat;
+	
+	
+	uint32_t 	BitRate;
+	uint32_t 	ExternalClock;
+	uint8_t 	ClockUsed;
+	bool_t		UsedSensorInterface;
+	uint32_t	IntrEnablePin1; 
+	uint32_t	IntrEnablePin2; 
+} Ilp0100_structInit;
+
+typedef	struct{
+	uint8_t 	*pIlp0100Firmware;
+	uint32_t	Ilp0100FirmwareSize;
+	uint8_t 	*pIlp0100SensorGenericCalibData;
+	uint32_t	Ilp0100SensorGenericCalibDataSize;
+	uint8_t 	*pIlp0100SensorRawPart2PartCalibData;
+	uint32_t	Ilp0100SensorRawPart2PartCalibDataSize;
+} Ilp0100_structInitFirmware;
+
+typedef struct{
+	
+	uint16_t	FullActivePixels;			
+	
+	uint16_t	MinLineLength;
+	
+	uint16_t	FullActiveLines;	
+	
+    uint8_t     PixelOrder;
+    uint8_t		StatusNbLines;
+} Ilp0100_structSensorParams;
+
+typedef struct{
+	uint16_t	ActiveLineLengthPixels;
+	uint16_t	ActiveFrameLengthLines;
+	uint16_t	LineLengthPixels;
+	uint16_t 	FrameLengthLines;
+	bool_t		StatusLinesOutputted;
+	uint16_t	StatusLineLengthPixels;
+	uint16_t	StatusNbLines;
+	uint16_t	MinInterframe;
+	bool_t		AutomaticFrameParamsUpdate;
+	uint8_t 	HDRMode;
+	uint8_t 	uwOutputPixelFormat;
+	uint8_t 	ImageOrientation;
+	uint32_t 	HScaling; 
+	uint32_t 	VScaling; 
+	uint8_t 	Binning;
+	uint16_t 	Hoffset; 
+	uint16_t 	Voffset; 
+
+} Ilp0100_structFrameFormat;
+
+
+typedef enum{
+  OFF = 0,
+  SINGLET_ONLY = 1,
+  COUPLET_ONLY = 2,
+  SINGLET_AND_COUPLET =3
+}Ilp0100_enumDefcorMode;
+
+typedef struct{
+  Ilp0100_enumDefcorMode Mode;
+} Ilp0100_structDefcorConfig;
+
+typedef struct{
+  uint8_t SingletThreshold;     
+  uint8_t CoupletThreshold; 
+  uint8_t BlackStrength;    
+  uint8_t WhiteStrength;    
+} Ilp0100_structDefcorParams;
+
+
+typedef struct{
+  bool_t Enable;
+} Ilp0100_structChannelOffsetConfig;
+
+typedef struct{
+  uint16_t SensorPedestalGreenRed;
+  uint16_t SensorPedestalRed;
+  uint16_t SensorPedestalBlue;
+  uint16_t SensorPedestalGreenBlue;
+} Ilp0100_structChannelOffsetParams;
+
+
+typedef struct{
+  bool_t Enable;
+  uint16_t RoiHStart;                                                             
+  uint16_t RoiVStart;                                                             
+  uint16_t RoiHBlockSize;      
+  uint16_t RoiVBlockSize;      
+  uint8_t RoiHNumberOfBlocks; 
+  uint8_t RoiVNumberOfBlocks; 
+  uint8_t SaturationLevelRed; 
+  uint8_t SaturationLevelGreen;
+  uint8_t SaturationLevelBlue; 
+} Ilp0100_structGlaceConfig;
+
+typedef enum{
+  HIST_OFF = 0,
+  REDGREENBLUE = 1,
+  LUMINANCE = 2
+}Ilp0100_enumHistMode;
+
+typedef struct{
+  Ilp0100_enumHistMode Mode;
+  uint16_t RoiXOffset;
+  uint16_t RoiYOffset;
+  uint16_t RoiXSize;
+  uint16_t RoiYSize;
+  uint8_t YConversionFactorGreenRed; 
+  uint8_t YConversionFactorRed; 
+  uint8_t YConversionFactorBlue; 
+  uint8_t YConversionFactorGreenBlue; 
+} Ilp0100_structHistConfig;
+
+typedef struct{
+	uint8_t 	GlaceStatsRedMean[48];
+	uint8_t 	GlaceStatsGreenMean[48];
+	uint8_t 	GlaceStatsBlueMean[48];
+	uint16_t    GlaceStatsNbOfSaturatedPixels[48];
+} Ilp0100_structGlaceStatsData;
+
+
+typedef struct{
+	uint32_t	HistStatsRedBin[64];
+	uint32_t 	HistStatsGreenBin[64];
+	uint32_t	HistStatsBlueBin[64];
+	uint16_t	HistStatsRedDarkestBin;
+	uint32_t	HistStatsRedDarkestCount;
+	uint16_t 	HistStatsRedBrightestBin;
+	uint32_t 	HistStatsRedBrightestCount;
+	uint16_t	HistStatsRedHighestBin;
+	uint32_t	HistStatsRedHighestCount;
+	uint16_t	HistStatsGreenDarkestBin;
+	uint32_t	HistStatsGreenDarkestCount;
+	uint16_t 	HistStatsGreenBrightestBin;
+	uint32_t 	HistStatsGreenBrightestCount;
+	uint16_t	HistStatsGreenHighestBin;
+	uint32_t	HistStatsGreenHighestCount;
+	uint16_t	HistStatsBlueDarkestBin;
+	uint32_t	HistStatsBlueDarkestCount;
+	uint16_t 	HistStatsBlueBrightestBin;
+	uint32_t 	HistStatsBlueBrightestCount;
+	uint16_t	HistStatsBlueHighestBin;
+	uint32_t	HistStatsBlueHighestCount;
+} Ilp0100_structHistStatsData;
+
+typedef enum{
+  ON = 0,
+  OUTPUT_LONG_ONLY  = 1,
+  OUTPUT_SHORT_ONLY = 2
+} Ilp0100_enumHdrMergeMode;
+
+typedef struct{
+	Ilp0100_enumHdrMergeMode Mode;
+} Ilp0100_structHdrMergeConfig;
+
+typedef enum{
+  USE_KNEE_POINTS = 0,
+  USE_AVERAGE  = 1,
+  USE_AVERAGE_AND_KNEE_POINTS = 2
+} Ilp0100_enumHdrMergeMethod;
+
+typedef enum{
+MAX_MACRO_PIXEL = 0,
+LUMA = 1
+} Ilp0100_enumHdrMergeImageCodes;
+
+typedef struct{
+ Ilp0100_enumHdrMergeMethod Method;
+ Ilp0100_enumHdrMergeImageCodes ImageCodes;
+} Ilp0100_structHdrMergeParams;
+
+typedef struct{
+  bool_t Enable;
+} Ilp0100_structClsConfig;
+
+typedef struct{
+  uint8_t 	BowlerCornerGain; 
+  
+  uint16_t 	ColorTempKelvin;
+} Ilp0100_structClsParams;
+
+typedef struct{
+  bool_t Enable;
+  bool_t UserDefinedCurveEnable;
+} Ilp0100_structToneMappingConfig; 
+
+typedef struct{
+  uint8_t Strength; 
+  uint16_t UserDefinedCurve[256];
+} Ilp0100_structToneMappingParams;
+
+typedef struct{
+	uint16_t    ExposureTime;
+	uint16_t    AnalogGainCodeGreen;
+	uint16_t    AnalogGainCodeRed;
+	uint16_t    AnalogGainCodeBlue;
+	uint16_t    DigitalGainCodeGreen;
+	uint16_t    DigitalGainCodeRed;
+	uint16_t    DigitalGainCodeBlue;
+} Ilp0100_structFrameParams;
+
+
+
+
+
+
+#endif 
diff --git a/drivers/media/video/msm/yushanII/ilp0100_customer_platform_types.h b/drivers/media/video/msm/yushanII/ilp0100_customer_platform_types.h
new file mode 100644
index 0000000..dfc6c08
--- /dev/null
+++ b/drivers/media/video/msm/yushanII/ilp0100_customer_platform_types.h
@@ -0,0 +1,46 @@
+/*******************************************************************************
+################################################################################
+#                             (C) STMicroelectronics 2012
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License version 2 and only version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+#------------------------------------------------------------------------------
+#                             Imaging Division
+################################################################################
+********************************************************************************/
+
+#ifndef ILP0100_CUSTOMER_PLATFORM_TYPES_H_
+#define ILP0100_CUSTOMER_PLATFORM_TYPES_H_
+
+
+#ifdef ST_SPECIFIC
+typedef unsigned char bool_t;
+typedef unsigned char uint8_t;
+typedef signed char int8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef short	int16_t;
+typedef int	int32_t;
+typedef float float_t;
+#else
+typedef unsigned char bool_t;
+typedef float float_t;
+#endif 
+
+
+
+
+
+
+#endif 
diff --git a/drivers/media/video/videobuf2-core.c b/drivers/media/video/videobuf2-core.c
index 6951a42..2e78562 100644
--- a/drivers/media/video/videobuf2-core.c
+++ b/drivers/media/video/videobuf2-core.c
@@ -404,8 +404,9 @@
 	memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx));
 	q->memory = req->memory;
 
-	ret = call_qop(q, queue_setup, q, &num_buffers, &num_planes,
-		       plane_sizes, q->alloc_ctx);
+	ret = call_qop(q, queue_setup, q, NULL, &num_buffers,
+				&num_planes, q->plane_sizes, q->alloc_ctx);
+
 	if (ret)
 		return ret;
 
@@ -421,8 +422,8 @@
 		unsigned int orig_num_buffers;
 
 		orig_num_buffers = num_buffers = ret;
-		ret = call_qop(q, queue_setup, q, &num_buffers, &num_planes,
-			       plane_sizes, q->alloc_ctx);
+		ret = call_qop(q, queue_setup, q, NULL, &num_buffers,
+			       &num_planes, q->plane_sizes, q->alloc_ctx);
 		if (ret)
 			goto free_mem;
 
@@ -598,10 +599,13 @@
 	return 0;
 err:
 	
-	for (; plane > 0; --plane) {
-		call_memop(q, plane, put_userptr,
-				vb->planes[plane - 1].mem_priv);
-		vb->planes[plane - 1].mem_priv = NULL;
+	for (plane = 0; plane < vb->num_planes; ++plane) {
+		if (vb->planes[plane].mem_priv)
+			call_memop(q, plane, put_userptr,
+				   vb->planes[plane].mem_priv);
+		vb->planes[plane].mem_priv = NULL;
+		vb->v4l2_planes[plane].m.userptr = 0;
+		vb->v4l2_planes[plane].length = 0;
 	}
 
 	return ret;
@@ -802,6 +806,23 @@
 }
 EXPORT_SYMBOL_GPL(vb2_dqbuf);
 
+static void __vb2_queue_cancel(struct vb2_queue *q)
+{
+	unsigned int i;
+
+	if (q->streaming)
+		call_qop(q, stop_streaming, q);
+	q->streaming = 0;
+
+	INIT_LIST_HEAD(&q->queued_list);
+	INIT_LIST_HEAD(&q->done_list);
+	atomic_set(&q->queued_count, 0);
+	wake_up_all(&q->done_wq);
+
+	for (i = 0; i < q->num_buffers; ++i)
+		q->bufs[i]->state = VB2_BUF_STATE_DEQUEUED;
+}
+
 int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type)
 {
 	struct vb2_buffer *vb;
@@ -822,45 +843,23 @@
 		return -EBUSY;
 	}
 
-	if (V4L2_TYPE_IS_OUTPUT(q->type)) {
-		if (list_empty(&q->queued_list)) {
-			dprintk(1, "streamon: no output buffers queued\n");
-			return -EINVAL;
-		}
-	}
+	list_for_each_entry(vb, &q->queued_list, queued_entry)
+		__enqueue_in_driver(vb);
 
-	ret = call_qop(q, start_streaming, q);
+	ret = call_qop(q, start_streaming, q, atomic_read(&q->queued_count));
 	if (ret) {
 		dprintk(1, "streamon: driver refused to start streaming\n");
+		__vb2_queue_cancel(q);
 		return ret;
 	}
 
 	q->streaming = 1;
 
-	list_for_each_entry(vb, &q->queued_list, queued_entry)
-		__enqueue_in_driver(vb);
-
 	dprintk(3, "Streamon successful\n");
 	return 0;
 }
 EXPORT_SYMBOL_GPL(vb2_streamon);
 
-static void __vb2_queue_cancel(struct vb2_queue *q)
-{
-	unsigned int i;
-
-	if (q->streaming)
-		call_qop(q, stop_streaming, q);
-	q->streaming = 0;
-
-	INIT_LIST_HEAD(&q->queued_list);
-	INIT_LIST_HEAD(&q->done_list);
-	atomic_set(&q->queued_count, 0);
-	wake_up_all(&q->done_wq);
-
-	for (i = 0; i < q->num_buffers; ++i)
-		q->bufs[i]->state = VB2_BUF_STATE_DEQUEUED;
-}
 
 int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
 {
diff --git a/drivers/media/video/videobuf2-msm-mem.c b/drivers/media/video/videobuf2-msm-mem.c
index 7878330..eccf5f8 100644
--- a/drivers/media/video/videobuf2-msm-mem.c
+++ b/drivers/media/video/videobuf2-msm-mem.c
@@ -185,6 +185,7 @@
 		SZ_4K, 0, (unsigned long *)&mem->phyaddr, &len, 0, 0);
 	if (rc < 0)
 		ion_free(client, mem->ion_handle);
+
 #elif CONFIG_ANDROID_PMEM
 	rc = get_pmem_file((int)mem->vaddr, (unsigned long *)&mem->phyaddr,
 					&kvstart, &len, &mem->file);
@@ -215,10 +216,6 @@
 {
 	if (mem->is_userptr) {
 #ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
-	if (IS_ERR_OR_NULL(mem->ion_handle)) {
-		pr_err("%s ION import failed\n", __func__);
-		return;
-	}
 		ion_unmap_iommu(client, mem->ion_handle,
 				CAMERA_DOMAIN, GEN_POOL);
 		ion_free(client, mem->ion_handle);
@@ -338,6 +335,8 @@
 	mem = vb2_plane_cookie(vb, plane_no);
 	BUG_ON(!mem);
 	MAGIC_CHECK(mem->magic, MAGIC_PMEM);
+	if (!mem->mapped_phyaddr)
+		pr_err("%s mem->mapped_phyaddr is null", __func__);
 	return mem->mapped_phyaddr;
 }
 EXPORT_SYMBOL_GPL(videobuf2_to_pmem_contig);
diff --git a/include/linux/htc_flashlight.h b/include/linux/htc_flashlight.h
index 15be786..1be4e46 100644
--- a/include/linux/htc_flashlight.h
+++ b/include/linux/htc_flashlight.h
@@ -47,7 +47,11 @@
 	FL_MODE_FLASH_LEVEL5,
 	FL_MODE_FLASH_LEVEL6,
 	FL_MODE_FLASH_LEVEL7,
-
+	FL_MODE_VIDEO_TORCH = 30,
+	FL_MODE_VIDEO_TORCH_1,
+	FL_MODE_VIDEO_TORCH_2,
+	FL_MODE_VIDEO_TORCH_3,
+	FL_MODE_VIDEO_TORCH_4,
 };
 
 #ifdef CONFIG_FLASHLIGHT_AAT
@@ -77,7 +81,12 @@
 	uint8_t led_count; 
 	uint32_t tps61310_strb0;
 	uint32_t tps61310_strb1;
+	uint32_t tps61310_reset;
 	uint8_t mode_pin_suspend_state_low;
+	uint8_t enable_FLT_1500mA;
+	uint8_t disable_tx_mask;
+	uint32_t power_save; 
+	uint32_t power_save_2;
 };
 
 int aat1271_flashlight_control(int mode);
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
index 1639106..148632d 100644
--- a/include/linux/videodev2.h
+++ b/include/linux/videodev2.h
@@ -65,7 +65,7 @@
 #include <linux/ioctl.h>
 #include <linux/types.h>
 
-#define VIDEO_MAX_FRAME               32
+#define VIDEO_MAX_FRAME               64 
 #define VIDEO_MAX_PLANES               8
 
 #ifndef __KERNEL__
@@ -460,7 +460,8 @@
 struct v4l2_jpegcompression {
 	int quality;
 
-	int  APPn;              
+	int  APPn;              /* Number of APP segment to be written,
+				 * must be 0..15 */
 	int  APP_len;           
 	char APP_data[60];      
 
@@ -1310,6 +1311,10 @@
 #define V4L2_CID_MPEG_QCOM_BASE	(V4L2_CTRL_CLASS_MPEG | 0x2100)
 
 #define V4L2_CID_MPEG_QCOM_SET_PERF_LEVEL (V4L2_CID_MPEG_QCOM_BASE + 0)
+enum v3l2_mpeg_qcom_perf_level {
+	V4L2_CID_MPEG_QCOM_PERF_LEVEL_PERFORMANCE		= 0,
+	V4L2_CID_MPEG_QCOM_PERF_LEVEL_TURBO			= 1,
+};
 
 #define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY		(V4L2_CID_MPEG_MFC51_BASE+0)
 #define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE	(V4L2_CID_MPEG_MFC51_BASE+1)
@@ -1335,6 +1340,23 @@
 #define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC		(V4L2_CID_MPEG_MFC51_BASE+53)
 #define V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P		(V4L2_CID_MPEG_MFC51_BASE+54)
 
+#define V4L2_QCOM_BUF_FLAG_CODECCONFIG	0x4000 
+
+#define V4L2_CID_MPEG_MSM_VIDC_BASE		(V4L2_CTRL_CLASS_MPEG | 0x2000)
+
+#define V4L2_CID_MPEG_VIDC_VIDEO_H264_AU_DELIMITER \
+		(V4L2_CID_MPEG_MSM_VIDC_BASE + 22)
+enum v4l2_mpeg_vidc_video_h264_au_delimiter {
+	V4L2_MPEG_VIDC_VIDEO_H264_AU_DELIMITER_DISABLED = 0,
+	V4L2_MPEG_VIDC_VIDEO_H264_AU_DELIMITER_ENABLED = 1
+};
+
+#define V4L2_CID_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO \
+		(V4L2_CID_MPEG_MSM_VIDC_BASE + 23)
+enum v4l2_mpeg_vidc_video_h264_vui_timing_info {
+	V4L2_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO_DISABLED = 0,
+	V4L2_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO_ENABLED = 1
+};
 #define V4L2_CID_CAMERA_CLASS_BASE 	(V4L2_CTRL_CLASS_CAMERA | 0x900)
 #define V4L2_CID_CAMERA_CLASS 		(V4L2_CTRL_CLASS_CAMERA | 1)
 
diff --git a/include/media/linux_yushanii.h b/include/media/linux_yushanii.h
new file mode 100644
index 0000000..568e22e
--- /dev/null
+++ b/include/media/linux_yushanii.h
@@ -0,0 +1,221 @@
+/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, and the entire permission notice in its entirety,
+ *    including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * ALTERNATIVELY, this product may be distributed under the terms of
+ * the GNU General Public License, version 2, in which case the provisions
+ * of the GPL version 2 are required INSTEAD OF the BSD license.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef __LINUX_YUSHANII_H
+#define __LINUX_YUSHANII_H
+
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+#define YUSHANII_IOCTL_MAGIC 'y'
+
+#define YUSHANII_GET_INT \
+	_IOR(YUSHANII_IOCTL_MAGIC, 1, struct yushanii_stats_event_ctrl *)
+
+#define YUSHANII_GET_LOGN_GLACE \
+	_IOR(YUSHANII_IOCTL_MAGIC, 2, struct GlaceStatsData *)
+
+#define YUSHANII_GET_LOGN_HIST \
+	_IOR(YUSHANII_IOCTL_MAGIC, 3, struct HistStatsData *)
+
+#define YUSHANII_GET_SHORT_GLACE \
+	_IOR(YUSHANII_IOCTL_MAGIC, 4, struct GlaceStatsData *)
+
+#define YUSHANII_GET_SHORT_HIST \
+	_IOR(YUSHANII_IOCTL_MAGIC, 5, struct HistStatsData *)
+
+#define YUSHANII_SET_CHANNEL_OFFSET \
+	_IOR(YUSHANII_IOCTL_MAGIC, 6, int *)
+
+#define YUSHANII_SET_TONE_MAPPING \
+	_IOR(YUSHANII_IOCTL_MAGIC, 7, int *)
+
+#define YUSHANII_SET_DISABLE_DEFCOR \
+	_IOR(YUSHANII_IOCTL_MAGIC, 8, int *)
+
+#define YUSHANII_SET_CLS \
+	_IOR(YUSHANII_IOCTL_MAGIC, 9, int *)
+
+#define YUSHANII_SET_EXP \
+	_IOR(YUSHANII_IOCTL_MAGIC, 10, struct yushanii_exposure *)
+
+#define YUSHANII_SET_HDR_MERGE \
+	_IOR(YUSHANII_IOCTL_MAGIC, 11, struct yushanii_hdr_merge *)
+
+#define YUSHANII_SET_GLACE_CONFIG \
+	_IOR(YUSHANII_IOCTL_MAGIC, 12, struct yushanii_glace_config *)
+
+#define YUSHANII_SET_HDR_MERGE_MODE \
+	_IOR(YUSHANII_IOCTL_MAGIC, 13, struct yushanii_hdr_merge_mode *)
+
+#define YUSHANII_SET_HDR_FACTOR \
+       _IOR(YUSHANII_IOCTL_MAGIC, 14, uint8_t *)
+
+#define SPI_COMMS_READY  				0x00000001
+#define IDLE_COMPLETE  					0x00000002
+#define ISP_STREAMING  					0x00000004
+#define MODE_CHANGE_COMPLETE	 		0x00000008
+#define START_OF_FRAME  				0x00000020
+#define END_OF_FRAME  					0x00000040
+#define LONGEXP_GLACE_STATS_READY 	0x00000100
+#define LONGEXP_HISTOGRAM_STATS_READY  0x00000200
+#define SHORTEXP_GLACE_STATS_READY  	0x00010000
+#define SHORTEXP_HISTOGRAM_STATS_READY  0x00020000
+#define ITPOINT_LONG  					0x00200000
+#define ITPOINT_SHORT_OR_NORMAL 		0x00400000
+#define ITPOINT_MERGED  				0x00800000
+
+#define RXPHY_ERROR  		0x00000001
+#define CSI2RX_ERROR  		0x00000002
+#define SMIA_UNPACK_ERROR  0x00000004
+#define P2W_FIFO_ERROR  	0x00000008
+#define LTYPE_RETAG_ERROR  0x00000010
+#define HDR_MERGE_ERROR  	0x00000020
+#define TONE_MAP_ERROR  	0x00000040
+#define MISC_SYS_ERROR  	0x00000080
+#define CSI2TX_ERROR  		0x00000100
+#define TXPHY_ERROR  		0x00000200
+#define INCORRECT_WORD_COUNT  0x00000400
+
+typedef struct{
+  unsigned char Enable;
+  uint16_t RoiHStart;
+  uint16_t RoiVStart;
+  uint16_t RoiHBlockSize;      
+  uint16_t RoiVBlockSize;      
+  uint8_t RoiHNumberOfBlocks; 
+  uint8_t RoiVNumberOfBlocks; 
+  uint8_t SaturationLevelRed;
+  uint8_t SaturationLevelGreen;
+  uint8_t SaturationLevelBlue;
+} GlaceConfig_t;
+
+struct yushanii_glace_config {
+	GlaceConfig_t long_glace_config;
+	GlaceConfig_t short_glace_config;
+};
+
+typedef struct{
+	uint8_t 	GlaceStatsRedMean[48];
+	uint8_t 	GlaceStatsGreenMean[48];
+	uint8_t 	GlaceStatsBlueMean[48];
+	uint32_t    GlaceStatsNbOfSaturatedPixels[48];
+} GlaceStatsData;
+
+
+typedef struct{
+	uint32_t	HistStatsRedBin[64];
+	uint32_t 	HistStatsGreenBin[64];
+	uint32_t	HistStatsBlueBin[64];
+	uint16_t	HistStatsRedDarkestBin;
+	uint32_t	HistStatsRedDarkestCount;
+	uint16_t 	HistStatsRedBrightestBin;
+	uint32_t 	HistStatsRedBrightestCount;
+	uint16_t	HistStatsRedHighestBin;
+	uint32_t	HistStatsRedHighestCount;
+	uint16_t	HistStatsGreenDarkestBin;
+	uint32_t	HistStatsGreenDarkestCount;
+	uint16_t 	HistStatsGreenBrightestBin;
+	uint32_t 	HistStatsGreenBrightestCount;
+	uint16_t	HistStatsGreenHighestBin;
+	uint32_t	HistStatsGreenHighestCount;
+	uint16_t	HistStatsBlueDarkestBin;
+	uint32_t	HistStatsBlueDarkestCount;
+	uint16_t 	HistStatsBlueBrightestBin;
+	uint32_t 	HistStatsBlueBrightestCount;
+	uint16_t	HistStatsBlueHighestBin;
+	uint32_t	HistStatsBlueHighestCount;
+} HistStatsData;
+
+struct yushanii_hist {	
+	GlaceStatsData hist_glace_long;
+	GlaceStatsData hist_glace_short;
+	HistStatsData hist_long;
+	HistStatsData hist_short;
+};
+
+
+struct yushanii_stats_event_ctrl {
+	uint32_t type;
+	uint32_t timeout_ms;
+	uint32_t length;
+	void *data;
+};
+
+
+struct yushanii_exposure{
+	uint16_t long_exposure;
+	uint16_t short_exposure;
+	uint16_t AnalogGain_G;
+	uint16_t AnalogGain_R;
+	uint16_t AnalogGain_B;
+	uint16_t DigitalShortGain_G;
+	uint16_t DigitalShortGain_R;
+	uint16_t DigitalShortGain_B;
+	uint16_t DigitalLongGain_G;
+	uint16_t DigitalLongGain_R;
+	uint16_t DigitalLongGain_B;
+};
+
+struct yushanii_cls{
+	int cls_enable;
+	uint32_t color_temp;
+};
+
+typedef enum{
+	KNEE_POINTS = 0,
+	HDR_AVERAGE  = 1,
+	AVERAGE_AND_KNEE_POINTS = 2
+} HdrMergeMethod;
+
+typedef enum{
+	HDR_MAX_MACRO_PIXEL = 0,
+	HDR_LUMA = 1
+} HdrMergeImageCodes;
+
+struct yushanii_hdr_merge{
+	HdrMergeMethod method;
+	HdrMergeImageCodes code;
+};
+
+typedef enum{
+  HDR_ON = 0,
+  HDR_OUTPUT_LONG_ONLY  = 1,
+  HDR_OUTPUT_SHORT_ONLY = 2
+} HDRMergeMode;
+
+struct yushanii_hdr_merge_mode{
+	HDRMergeMode Mode;
+};
+#endif 
+
diff --git a/include/media/msm_camera.h b/include/media/msm_camera.h
index 7cb49b7..301a446 100644
--- a/include/media/msm_camera.h
+++ b/include/media/msm_camera.h
@@ -216,6 +216,7 @@
 #define MSM_CAMERA_LED_HIGH 2
 #define MSM_CAMERA_LED_INIT 3
 #define MSM_CAMERA_LED_RELEASE 4
+#define MSM_CAMERA_LED_VIDEO 30
 
 #define MSM_CAMERA_STROBE_FLASH_NONE 0
 #define MSM_CAMERA_STROBE_FLASH_XENON 1
@@ -425,6 +426,7 @@
 #define CMD_AXI_CFG_ZSL 43
 #define CMD_AXI_CFG_SNAP_VPE 44
 #define CMD_AXI_CFG_SNAP_THUMB_VPE 45
+
 #define CMD_CONFIG_PING_ADDR 46
 #define CMD_CONFIG_PONG_ADDR 47
 #define CMD_CONFIG_FREE_BUF_ADDR 48
@@ -438,6 +440,13 @@
 #define CMD_AXI_CFG_SEC			0xF4
 #define CMD_AXI_CFG_SEC_ALL_CHNLS	0xF8
 
+#define CMD_STATS_BG_ENABLE 53
+#define CMD_STATS_BF_ENABLE 54
+#define CMD_STATS_BHIST_ENABLE 55
+#define CMD_STATS_BG_BUF_RELEASE 56
+#define CMD_STATS_BF_BUF_RELEASE 57
+#define CMD_STATS_BHIST_BUF_RELEASE 58
+
 struct msm_vfe_cfg_cmd {
 	int cmd_type;
 	uint16_t length;
@@ -475,7 +484,10 @@
 #define MSM_PMEM_C2D			17
 #define MSM_PMEM_MAINIMG_VPE    18
 #define MSM_PMEM_THUMBNAIL_VPE  19
-#define MSM_PMEM_MAX            20
+#define MSM_PMEM_BAYER_GRID		20
+#define MSM_PMEM_BAYER_FOCUS	21
+#define MSM_PMEM_BAYER_HIST		22
+#define MSM_PMEM_MAX            23
 
 #define STAT_AEAW			0
 #define STAT_AEC			1
@@ -485,7 +497,10 @@
 #define STAT_CS				5
 #define STAT_IHIST			6
 #define STAT_SKIN			7
-#define STAT_MAX			8
+#define STAT_BG				8
+#define STAT_BF				9
+#define STAT_BHIST			10
+#define STAT_MAX			11
 
 #define FRAME_PREVIEW_OUTPUT1		0
 #define FRAME_PREVIEW_OUTPUT2		1
@@ -634,6 +649,28 @@
 	int fd;
 };
 
+struct stats_htc_af_input {
+	int preview_width;
+	int preview_height;
+	int roi_x;
+	int roi_y;
+	int roi_width;
+	int roi_height;
+	uint8_t af_use_sw_sharpness;
+};
+
+struct stats_htc_af_output {
+	uint32_t hw_frame_id;
+	uint32_t sw_frame_id;
+	uint32_t actuator_frame_id;
+	uint32_t sw_sharpness_value;
+};
+
+struct stats_htc_af {
+	struct stats_htc_af_input af_input;
+	struct stats_htc_af_output af_output;
+};
+
 struct msm_stats_buf {
 	uint8_t awb_ymin;
 	struct stats_buff aec;
@@ -650,6 +687,7 @@
 	int length;
 	struct ion_handle *handle;
 	uint32_t frame_id;
+	struct stats_htc_af htc_af_info;
 };
 #define MSM_V4L2_EXT_CAPTURE_MODE_DEFAULT 0
 #define MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW \
@@ -794,7 +832,17 @@
 #endif 
 #define CFG_GET_ACTUATOR_CURR_STEP_POS 63
 #define CFG_GET_VCM_OPTIMIZED_POSITIONS 64 
-#define CFG_MAX			65
+#define CFG_SET_ACTUATOR_AF_ALGO		65 
+#define CFG_SET_OIS_MODE                         66 
+#define CFG_SET_HDR_EXP_GAIN           67 
+#define CFG_UPDATE_OIS_TBL           68 
+#define CFG_GET_OIS_DEBUG_INFO			69
+#define CFG_GET_OIS_DEBUG_TBL			70
+#define CFG_SET_ACTUATOR_AF_VALUE		71
+#define CFG_SET_HDR_OUTDOOR_FLAG		72 
+#define CFG_SET_OIS_CALIBRATION		73 
+#define CFG_SET_VCM_CALIBRATION 74 
+#define CFG_MAX			        75
 
 #define CFG_I2C_IOCTL_R_OTP 70
 
@@ -1010,6 +1058,11 @@
 struct exp_gain_cfg {
 	uint16_t gain;
 	uint32_t line;
+	uint32_t long_line;
+	uint32_t short_line;
+	uint16_t long_dig_gain;
+	uint16_t short_dig_gain;
+	uint8_t is_outdoor;
 	uint16_t dig_gain; 
 };
 
@@ -1087,6 +1140,11 @@
 	MSM_SENSOR_RES_VIDEO,
 	MSM_SENSOR_RES_VIDEO_HFR,
 	MSM_SENSOR_RES_16_9,
+	MSM_SENSOR_RES_4_3,
+	MSM_SENSOR_RES_VIDEO_HFR_5_3,
+	MSM_SENSOR_RES_5_3,
+	MSM_SENSOR_RES_ZOE,
+	MSM_SENSOR_RES_VIDEO_60FPS,
 	MSM_SENSOR_RES_2,
 	MSM_SENSOR_RES_3,
 	MSM_SENSOR_RES_4,
@@ -1114,7 +1172,11 @@
 	uint16_t y_even_inc;
 	uint16_t y_odd_inc;
 	uint8_t binning_rawchip;
+	uint8_t is_hdr;
 	
+	uint8_t yushan_status_line_enable;
+	uint8_t yushan_status_line; 
+	uint8_t yushan_sensor_status_line; 
 };
 
 struct sensor_output_info_t {
@@ -1238,11 +1300,33 @@
     uint16_t max;
 }vcm_pos;
 
+typedef struct{
+	uint8_t VCM_START_MSB;
+	uint8_t VCM_START_LSB;
+	uint8_t AF_INF_MSB;
+	uint8_t AF_INF_LSB;
+	uint8_t AF_MACRO_MSB;
+	uint8_t AF_MACRO_LSB;
+	
+	uint8_t VCM_BIAS;
+	uint8_t VCM_OFFSET;
+	uint8_t VCM_BOTTOM_MECH_MSB;
+	uint8_t VCM_BOTTOM_MECH_LSB;
+	uint8_t VCM_TOP_MECH_MSB;
+	uint8_t VCM_TOP_MECH_LSB;
+	uint8_t VCM_VENDOR_ID_VERSION;
+	
+	uint8_t VCM_VENDOR;
+	uint8_t ACT_ID;
+}af_value_t;
+
 struct sensor_cfg_data {
 	int cfgtype;
 	int mode;
 	int rs;
 	uint8_t max_steps;
+	int8_t sensor_ver;
+	af_value_t af_value;
 
 	union {
 		int8_t effect;
@@ -1298,6 +1382,34 @@
 	} cfg;
 };
 
+typedef enum {
+  AF_ALGO_QCT,
+  AF_ALGO_RAWCHIP,
+} af_algo_t;
+
+typedef enum {
+  VFE_CAMERA_MODE_DEFAULT,
+  VFE_CAMERA_MODE_ZOE,
+  VFE_CAMERA_MODE_ZSL,
+  VFE_CAMERA_MODE_VIDEO,
+  VFE_CAMERA_MODE_VIDEO_60FPS,
+  VFE_CAMERA_MODE_MAX
+} vfe_camera_mode_type;
+
+typedef enum {
+  CAM_MODE_CAMERA_PREVIEW,
+  CAM_MODE_VIDEO_RECORDING,
+} camera_video_mode_type;
+
+struct sensor_actuator_info_t {
+  int16_t startup_mode;
+  camera_video_mode_type cam_mode;
+  uint32_t cur_line_cnt;
+  uint32_t cur_exp_time;
+  int32_t zoom_level;
+  int16_t fast_reset_mode;
+};
+
 struct damping_params_t {
 	uint32_t damping_step;
 	uint32_t damping_delay;
@@ -1374,6 +1486,7 @@
 	uint32_t total_steps; 
 	uint16_t gross_steps; 
 	uint16_t fine_steps; 
+	uint16_t ois_mfgtest_in_progress_reload; 
 	struct msm_actuator_params_t actuator_params;
 	struct msm_actuator_tuning_params_t af_tuning_params;
 };
@@ -1393,6 +1506,86 @@
 	uint32_t ver_view_angle_den;
 };
 
+struct msm_actuator_get_ois_info_t {
+	uint32_t gyro_info;
+	uint8_t ois_index;
+};
+
+struct msm_actuator_get_ois_tbl_t {
+	uint32_t tbl_thre[5];
+	uint32_t tbl_info[9][2];
+};
+
+
+enum ois_cal_mode_type_t {
+	OIS_CAL_MODE_READ_FIRMWARE,
+	OIS_CAL_MODE_COLLECT_DATA,
+	OIS_CAL_MODE_WRITE_FIRMWARE,
+};
+
+struct msm_actuator_get_ois_cal_info_t {
+	
+	int16_t x_offset;
+	int16_t y_offset;
+	int16_t temperature;
+	int8_t x_slope;
+	int8_t y_slope;
+
+	
+	enum ois_cal_mode_type_t ois_cal_mode;
+	int16_t cal_collect_interval;
+	int16_t lens_position;
+	int8_t write_flash_status;
+	int8_t otp_check_pass;
+	int8_t cal_method;
+	int8_t cal_current_point;
+	int8_t cal_max_point;
+};
+
+struct msm_actuator_get_vcm_cal_info_t {
+    uint8_t offset;
+    uint8_t bias;
+    uint16_t hall_max;
+    uint16_t hall_min;
+    uint8_t rc;
+};
+
+struct msm_flash_ois_cal_data_t {
+	
+	int16_t x_offset_sharp;
+	int16_t y_offset_sharp;
+	int16_t temperature_sharp;
+	int8_t x_slope_sharp;
+	int8_t y_slope_sharp;
+
+	
+	int16_t x_offset_htc;
+	int16_t y_offset_htc;
+	int16_t temperature_htc;
+	int8_t x_slope_htc;
+	int8_t y_slope_htc;
+
+	
+	int8_t write_sharp_data;
+	int8_t write_htc_data;
+};
+
+struct msm_actuator_af_OTP_info_t {
+	uint8_t VCM_OTP_Read;
+	uint16_t VCM_Start;
+	uint16_t VCM_Infinity;
+	uint16_t VCM_Macro;
+	
+	uint8_t VCM_Bias;
+	uint8_t VCM_Offset;
+	uint16_t VCM_Bottom_Mech;
+	uint16_t VCM_Top_Mech;
+	uint8_t VCM_Vendor_Id_Version;
+	
+	uint8_t VCM_Vendor;
+	uint8_t act_id;
+};
+
 enum af_camera_name {
 	ACTUATOR_MAIN_CAM_0,
 	ACTUATOR_MAIN_CAM_1,
@@ -1408,12 +1601,22 @@
 struct msm_actuator_cfg_data {
 	int cfgtype;
 	uint8_t is_af_supported;
+	uint8_t is_ois_supported;
+    uint8_t is_cal_supported; 
 	union {
 		struct msm_actuator_move_params_t move;
 		struct msm_actuator_set_info_t set_info;
 		struct msm_actuator_get_info_t get_info;
 		enum af_camera_name cam_name;
 		int16_t curr_step_pos; 
+		af_algo_t af_algo; 
+		int16_t ois_mode; 
+		struct msm_actuator_get_ois_info_t get_ois_info;
+		struct msm_actuator_get_ois_tbl_t get_ois_tbl;
+		af_value_t af_value;
+		struct msm_actuator_get_ois_cal_info_t get_osi_cal_info; 
+		struct sensor_actuator_info_t sensor_actuator_info; 
+		struct msm_actuator_get_vcm_cal_info_t get_vcm_cal_info; 
 	} cfg;
 };
 
@@ -1474,6 +1677,12 @@
 	} ctrl_data;
 };
 
+enum htc_camera_image_type {
+	HTC_CAMERA_IMAGE_NONE,
+	HTC_CAMERA_IMAGE_YUSHANII,
+	HTC_CAMERA_IMAGE_MAX,
+};
+
 #define GET_NAME			0
 #define GET_PREVIEW_LINE_PER_FRAME	1
 #define GET_PREVIEW_PIXELS_PER_LINE	2
@@ -1496,7 +1705,10 @@
 	int mount_angle;
 	uint32_t max_width;
 	uint32_t max_height;
+	enum htc_camera_image_type htc_image;	
+	uint8_t hdr_mode;	
 	uint8_t use_rawchip; 
+	uint8_t video_hdr_capability;
 };
 
 #define V4L2_SINGLE_PLANE	0
@@ -1549,5 +1761,10 @@
 	void __user *ioctl_ptr;
 };
 
+struct msm_ver_num_info {
+        uint32_t main;
+        uint32_t minor;
+        uint32_t rev;
+};
 
 #endif 
diff --git a/include/media/msm_isp.h b/include/media/msm_isp.h
index 984bb40..20a24c8 100644
--- a/include/media/msm_isp.h
+++ b/include/media/msm_isp.h
@@ -59,7 +59,10 @@
 #define MSG_ID_OUTPUT_SECONDARY         41
 #define MSG_ID_STATS_COMPOSITE          42
 #define MSG_ID_HDR_SOF_ACK              43 
-#define MSG_ID_STOP_LS_ACK              44
+#define MSG_ID_STATS_BG                 44
+#define MSG_ID_STATS_BF                 45
+#define MSG_ID_STATS_BHIST              46
+#define MSG_ID_STOP_LS_ACK              47
 
 #define VFE_CMD_DUMMY_0                                 0
 #define VFE_CMD_SET_CLK                                 1
@@ -200,6 +203,15 @@
 #define VFE_CMD_CAPTURE_RAW                             136
 #define VFE_CMD_STOP_LIVESHOT                           137
 #define VFE_CMD_RECONFIG_VFE                            138
+#define VFE_CMD_STATS_BG_START                          139
+#define VFE_CMD_STATS_BG_STOP                           140
+#define VFE_CMD_STATS_BF_START                          141
+#define VFE_CMD_STATS_BF_STOP                           142
+#define VFE_CMD_STATS_BHIST_START                       143
+#define VFE_CMD_STATS_BHIST_STOP                        144
+#define VFE_CMD_SET_BAYER_ENABLE                        145
+#define VFE_CMD_SET_CAMERA_MODE                         146 
+#define VFE_CMD_SET_SW_SHARPNESS_CMD                    147
 
 struct msm_isp_cmd {
 	int32_t  id;
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index 08680c8..94f3b2b 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -81,9 +81,9 @@
 };
 
 struct vb2_ops {
-	int (*queue_setup)(struct vb2_queue *q, unsigned int *num_buffers,
-			   unsigned int *num_planes, unsigned long sizes[],
-			   void *alloc_ctxs[]);
+	int (*queue_setup)(struct vb2_queue *q, const struct v4l2_format *fmt,
+				unsigned int *num_buffers, unsigned int *num_planes,
+				unsigned int sizes[], void *alloc_ctxs[]);
 
 	void (*wait_prepare)(struct vb2_queue *q);
 	void (*wait_finish)(struct vb2_queue *q);
@@ -93,7 +93,7 @@
 	int (*buf_finish)(struct vb2_buffer *vb);
 	void (*buf_cleanup)(struct vb2_buffer *vb);
 
-	int (*start_streaming)(struct vb2_queue *q);
+	int (*start_streaming)(struct vb2_queue *q, unsigned int count);
 	int (*stop_streaming)(struct vb2_queue *q);
 
 	void (*buf_queue)(struct vb2_buffer *vb);
@@ -121,6 +121,7 @@
 	wait_queue_head_t		done_wq;
 
 	void				*alloc_ctx[VIDEO_MAX_PLANES];
+	unsigned int            plane_sizes[VIDEO_MAX_PLANES];
 
 	unsigned int			streaming:1;
 
diff --git a/include/media/videobuf2-msm-mem.h b/include/media/videobuf2-msm-mem.h
index d23a0f6..5e35b67 100644
--- a/include/media/videobuf2-msm-mem.h
+++ b/include/media/videobuf2-msm-mem.h
@@ -59,6 +59,7 @@
 	unsigned long mapped_phyaddr;
 	struct ion_handle *ion_handle;
 	struct ion_client *client;
+	void *arm_vaddr;
 };
 void videobuf2_queue_pmem_contig_init(struct vb2_queue *q,
 					enum v4l2_buf_type type,