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, ®ion[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 = ®ion[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, ®ion[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 = ®ion[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, ®ion[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 = ®ion[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,