};
};
- fimc_is_pafstat0: fimc_is_pafstat@14440000 {
+ sensor_paf_pafstat_0: sensor-paf-pafstat@14440000 {
/* PAFSTAT CORE0 */
- compatible = "samsung,exynos5-fimc-is-pafstat";
+ compatible = "samsung,sensor-paf-pafstat";
reg = <0x0 0x14440000 0x1000>,
<0x0 0x14448000 0x1000>; /* PAFSTAT CONTEXT0 */
interrupts = <0 329 0>;
- id = <0>;
};
- fimc_is_pafstat1: fimc_is_pafstat@14444000 {
+ sensor_paf_pafstat_1: sensor-paf-pafstat@14444000 {
/* PDP CORE1 */
- compatible = "samsung,exynos5-fimc-is-pafstat";
+ compatible = "samsung,sensor-paf-pafstat";
reg = <0x0 0x14444000 0x1000>,
<0x0 0x1444C000 0x1000>; /* PAFSTAT CONTEXT1 */
interrupts = <0 330 0>;
- id = <1>;
+ };
+
+ aliases {
+ pafstat0 = &sensor_paf_pafstat_0;
+ pafstat1 = &sensor_paf_pafstat_1;
};
camerapp_gdc: gdc@14630000 {
vc_ch = <0 1 2 3 0 1 2 3>;
flite_ch = <FLITE_ID_NOTHING>;
is_bns = <0>;
+ csi_mux = <0>; /* CSIS_DPHY[2:0] = [0 0 0] */
+ multi_ch = <2>;
/* use_ssvc1_internal; */
/* use_ssvc2_internal; */
status = "okay";
vc_ch = <0 1 2 3 0 1 2 3>;
flite_ch = <FLITE_ID_NOTHING>;
is_bns = <0>;
+ csi_mux = <0>; /* CSIS_DPHY[2:0] = [0 0 0] */
+ multi_ch = <0>;
status = "okay";
};
vc_ch = <0 1 2 3>;
flite_ch = <FLITE_ID_NOTHING>;
is_bns = <0>;
+ csi_mux = <0>; /* CSIS_DPHY[2:0] = [0 0 0] */
+ multi_ch = <0>;
status = "okay";
};
vc_ch = <0 1 2 3>;
flite_ch = <FLITE_ID_NOTHING>;
is_bns = <0>;
+ csi_mux = <0>; /* CSIS_DPHY[2:0] = [0 0 0] */
+ multi_ch = <0>;
status = "okay";
};
samsung,pin-drv = <2>;
};
+ fimc_is_mclk3_in: fimc_is_mclk3_in {
+ samsung,pins = "gpg3-5";
+ samsung,pin-function = <0>;
+ samsung,pin-pud = <0>;
+ samsung,pin-drv = <2>;
+ };
+
fimc_is_mclk0_out: fimc_is_mclk0_out {
samsung,pins = "gpc2-0";
samsung,pin-function = <1>;
samsung,pin-drv = <2>;
};
+ fimc_is_mclk3_out: fimc_is_mclk3_out {
+ samsung,pins = "gpg3-5";
+ samsung,pin-function = <1>;
+ samsung,pin-pud = <1>;
+ samsung,pin-drv = <2>;
+ };
+
fimc_is_mclk0_fn: fimc_is_mclk0_fn {
samsung,pins = "gpc2-0";
samsung,pin-function = <2>;
samsung,pin-drv = <2>;
};
+ fimc_is_mclk3_fn: fimc_is_mclk3_fn {
+ samsung,pins = "gpg3-5";
+ samsung,pin-function = <2>;
+ samsung,pin-pud = <0>;
+ samsung,pin-drv = <2>;
+ };
+
decon_f_te_on: decon_f_te_on {
samsung,pins = "gpc2-3";
samsung,pin-function = <0xf>;
return 0;
}
-#if 0
-/* This function may be used when clk_enable api will be faster than now */
-int fimc_is_clk_gate_reg_set(struct fimc_is_core *core,
- bool is_on, const char* gate_str, u32 clk_gate_id,
- struct exynos_fimc_is_clk_gate_info *gate_info)
-{
- struct platform_device *pdev = core->pdev;
- if (is_on) {
- if (gate_info->clk_on(pdev, gate_str) < 0) {
- pr_err("%s: could not enable %s\n", __func__, gate_str);
- return -EINVAL;
- }
- } else {
- if (gate_info->clk_off(pdev, gate_str) < 0) {
- pr_err("%s: could not disable %s\n", __func__, gate_str);
- return -EINVAL;
- }
- }
- return 0;
-}
-#endif
-
int fimc_is_wrap_clk_gate_set(struct fimc_is_core *core,
int msk_group_id, bool is_on)
{
int fimc_is_clk_gate_init(struct fimc_is_core *core);
int fimc_is_clk_gate_lock_set(struct fimc_is_core *core, u32 instance, u32 is_start);
-int fimc_is_clk_gate_reg_set(struct fimc_is_core *core,
- bool is_on, const char* gate_str, u32 clk_gate_id,
- struct exynos_fimc_is_clk_gate_info *gate_info);
/* For several groups */
int fimc_is_wrap_clk_gate_set(struct fimc_is_core *core,
int msk_group_id, bool is_on);
module_param(debug_time_queue, int, 0644);
int debug_time_shot;
module_param(debug_time_shot, int, 0644);
+int debug_pdp;
+module_param(debug_pdp, int, 0644);
+int debug_pafstat;
+module_param(debug_pafstat, int, 0644);
struct fimc_is_device_sensor *fimc_is_get_sensor_device(struct fimc_is_core *core)
{
return 0;
}
+#if defined(SECURE_CAMERA_IRIS)
+static int fimc_is_secure_iris(struct fimc_is_device_sensor *device,
+ u32 type, u32 scenario, ulong smc_cmd)
+{
+ int ret = 0;
+
+ if (scenario != SENSOR_SCENARIO_SECURE)
+ return ret;
+
+ switch (smc_cmd) {
+ case SMC_SECCAM_PREPARE:
+ ret = exynos_smc(SMC_SECCAM_PREPARE, 0, 0, 0);
+ if (ret) {
+ merr("[SMC] SMC_SECURE_CAMERA_PREPARE fail(%d)\n", device, ret);
+ } else {
+ minfo("[SMC] Call SMC_SECURE_CAMERA_PREPARE ret(%d) / smc_state(%d->%d)\n",
+ device, ret, device->smc_state, FIMC_IS_SENSOR_SMC_PREPARE);
+ device->smc_state = FIMC_IS_SENSOR_SMC_PREPARE;
+ }
+ break;
+ case SMC_SECCAM_UNPREPARE:
+ if (device->smc_state != FIMC_IS_SENSOR_SMC_PREPARE)
+ break;
+
+ ret = exynos_smc(SMC_SECCAM_UNPREPARE, 0, 0, 0);
+ if (ret != 0) {
+ merr("[SMC] SMC_SECURE_CAMERA_UNPREPARE fail(%d)\n", device, ret);
+ } else {
+ minfo("[SMC] Call SMC_SECURE_CAMERA_UNPREPARE ret(%d) / smc_state(%d->%d)\n",
+ device, ret, device->smc_state, FIMC_IS_SENSOR_SMC_UNPREPARE);
+ device->smc_state = FIMC_IS_SENSOR_SMC_UNPREPARE;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+#endif
+
+#if defined(SECURE_CAMERA_FACE)
+static int fimc_is_secure_face(struct fimc_is_core *core,
+ u32 type, u32 scenario, ulong smc_cmd)
+{
+ int ret = 0;
+
+ if (scenario != FIMC_IS_SCENARIO_SECURE)
+ return ret;
+
+ mutex_lock(&core->secure_state_lock);
+ switch (smc_cmd) {
+ case SMC_SECCAM_PREPARE:
+ if (core->secure_state == FIMC_IS_STATE_UNSECURE) {
+#if defined(SECURE_CAMERA_FACE_SEQ_CHK)
+ ret = 0;
+#else
+ ret = exynos_smc(SMC_SECCAM_PREPARE, 0, 0, 0);
+#endif
+ if (ret != 0) {
+ err("[SMC] SMC_SECCAM_PREPARE fail(%d)", ret);
+ } else {
+ info("[SMC] Call SMC_SECCAM_PREPARE ret(%d) / state(%d->%d)\n",
+ ret, core->secure_state, FIMC_IS_STATE_SECURED);
+ core->secure_state = FIMC_IS_STATE_SECURED;
+ }
+ }
+ break;
+ case SMC_SECCAM_UNPREPARE:
+ if (core->secure_state == FIMC_IS_STATE_SECURED) {
+#if defined(SECURE_CAMERA_FACE_SEQ_CHK)
+ ret = 0;
+#else
+ ret = exynos_smc(SMC_SECCAM_UNPREPARE, 0, 0, 0);
+#endif
+ if (ret != 0) {
+ err("[SMC] SMC_SECCAM_UNPREPARE fail(%d)\n", ret);
+ } else {
+ info("[SMC] Call SMC_SECCAM_UNPREPARE ret(%d) / smc_state(%d->%d)\n",
+ ret, core->secure_state, FIMC_IS_STATE_UNSECURE);
+ core->secure_state = FIMC_IS_STATE_UNSECURE;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ mutex_unlock(&core->secure_state_lock);
+
+ return ret;
+}
+#endif
+
+int fimc_is_secure_func(struct fimc_is_core *core,
+ struct fimc_is_device_sensor *device, u32 type, u32 scenario, ulong smc_cmd)
+{
+ int ret = 0;
+
+ switch (type) {
+ case FIMC_IS_SECURE_CAMERA_IRIS:
+#if defined(SECURE_CAMERA_IRIS)
+ ret = fimc_is_secure_iris(device, type, scenario, smc_cmd);
+#endif
+ break;
+ case FIMC_IS_SECURE_CAMERA_FACE:
+#if defined(SECURE_CAMERA_FACE)
+ ret = fimc_is_secure_face(core, type, scenario, smc_cmd);
+#endif
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
#ifdef ENABLE_FAULT_HANDLER
static void fimc_is_print_target_dva(struct fimc_is_frame *leader_frame)
{
if (test_bit(FIMC_IS_SUBDEV_START, &subdev->state) && framemgr) {
for (j = 0; j < framemgr->num_frames; ++j) {
for (k = 0; k < framemgr->frames[j].planes; k++) {
- msinfo(" BUF[%d][%d] = 0x%08X(0x%lX)\n",
+ msinfo(" BUF[%d][%d] %pad = (0x%lX)\n",
subdev, subdev, j, k,
- framemgr->frames[j].dvaddr_buffer[k],
+ &framemgr->frames[j].dvaddr_buffer[k],
framemgr->frames[j].mem_state);
shot = framemgr->frames[j].shot;
for (j = 0; j < framemgr->num_frames; ++j) {
for (k = 0; k < framemgr->frames[j].planes; k++) {
- pr_err("[SS%d] BUF[%d][%d] = 0x%08X(0x%lX)\n", i, j, k,
- framemgr->frames[j].dvaddr_buffer[k],
+ pr_err("[SS%d] BUF[%d][%d] = %pad(0x%lX)\n", i, j, k,
+ &framemgr->frames[j].dvaddr_buffer[k],
framemgr->frames[j].mem_state);
}
}
sysfs_debug.pattern_en = cmd;
break;
default:
- pr_warn("%s: invalid paramter (%lu)\n", __func__, cmd);
+ pr_warn("%s: invalid paramter (%d)\n", __func__, cmd);
break;
}
u32 channel;
#endif
struct pinctrl_state *s;
+#if defined(SECURE_CAMERA_IRIS) || defined(SECURE_CAMERA_FACE)
+ ulong mem_info_addr, mem_info_size;
+#endif
probe_info("%s:start(%ld, %ld)\n", __func__,
sizeof(struct fimc_is_core), sizeof(struct fimc_is_video_ctx));
fimc_is_31g_video_probe(core);
#endif
+#ifdef SOC_32S
+ /* video entity - 3a2 */
+ fimc_is_32s_video_probe(core);
+#endif
+
+#ifdef SOC_32P
+ /* video entity - 3a2 preview */
+ fimc_is_32p_video_probe(core);
+#endif
+
#ifdef SOC_I0S
/* video entity - isp0 */
fimc_is_i0s_video_probe(core);
fimc_is_me0c_video_probe(core);
#endif
+#ifdef SOC_ME1C
+ /* video entity - me out */
+ fimc_is_me1c_video_probe(core);
+#endif
+
#if defined(SOC_DIS) || defined(SOC_D0S)
/* video entity - tpu0 */
fimc_is_d0s_video_probe(core);
EXYNOS_MIF_ADD_NOTIFIER(&exynos_fimc_is_mif_throttling_nb);
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(SECURE_CAMERA_EMULATE)
- ret = exynos_smc(SMC_SECCAM_SETENV, SECURE_CAMERA_CH, ION_EXYNOS_HEAP_ID_SECURE_CAMERA, 0);
+#if defined(SECURE_CAMERA_IRIS) || defined(SECURE_CAMERA_FACE)
+ probe_info("%s: call SMC_SECCAM_SETENV, SECURE_CAMERA_CH(%#x), SECURE_CAMERA_HEAP_ID(%d)\n",
+ __func__, SECURE_CAMERA_CH, SECURE_CAMERA_HEAP_ID);
+
+#if defined(SECURE_CAMERA_FACE_SEQ_CHK)
+ ret = 0;
+#else
+ ret = exynos_smc(SMC_SECCAM_SETENV, SECURE_CAMERA_CH, SECURE_CAMERA_HEAP_ID, 0);
+#endif
if (ret) {
dev_err(fimc_is_dev, "[SMC] SMC_SECCAM_SETENV fail(%d)\n", ret);
goto p_err3;
}
- ret = exynos_smc(SMC_SECCAM_INIT, SECURE_CAMERA_MEM_ADDR, SECURE_CAMERA_MEM_SIZE, 0);
+
+ mem_info_addr = core->secure_mem_info[0] ? core->secure_mem_info[0] : SECURE_CAMERA_MEM_ADDR;
+ mem_info_size = core->secure_mem_info[1] ? core->secure_mem_info[1] : SECURE_CAMERA_MEM_SIZE;
+
+ probe_info("%s: call SMC_SECCAM_INIT, mem_info(%#08lx, %#08lx)\n",
+ __func__, mem_info_addr, mem_info_size);
+#if defined(SECURE_CAMERA_FACE_SEQ_CHK)
+ ret = 0;
+#else
+ ret = exynos_smc(SMC_SECCAM_INIT, mem_info_addr, mem_info_size, 0);
+#endif
if (ret) {
dev_err(fimc_is_dev, "[SMC] SMC_SECCAM_INIT fail(%d)\n", ret);
goto p_err3;
}
+ mem_info_addr = core->non_secure_mem_info[0] ? core->non_secure_mem_info[0] : NON_SECURE_CAMERA_MEM_ADDR;
+ mem_info_size = core->non_secure_mem_info[1] ? core->non_secure_mem_info[1] : NON_SECURE_CAMERA_MEM_SIZE;
+
+ probe_info("%s: call SMC_SECCAM_INIT_NSBUF, mem_info(%#08lx, %#08lx)\n",
+ __func__, mem_info_addr, mem_info_size);
+#if defined(SECURE_CAMERA_FACE_SEQ_CHK)
+ ret = 0;
+#else
+ ret = exynos_smc(SMC_SECCAM_INIT_NSBUF, mem_info_addr, mem_info_size, 0);
+#endif
+ if (ret) {
+ dev_err(fimc_is_dev, "[SMC] SMC_SECCAM_INIT_NSBUF fail(%d)\n", ret);
+ goto p_err3;
+ }
#endif
#if defined(CONFIG_PM)
}
#endif
+ mutex_init(&core->ois_mode_lock);
+
/* set sysfs for debuging */
sysfs_debug.en_clk_gate = 0;
sysfs_debug.en_dvfs = 1;
FIMC_IS_DEBUG_DCC3
};
+enum fimc_is_secure_camera_type {
+ FIMC_IS_SECURE_CAMERA_IRIS = 1,
+ FIMC_IS_SECURE_CAMERA_FACE = 2,
+};
+
enum fimc_is_front_input_entity {
FIMC_IS_FRONT_INPUT_NONE = 0,
FIMC_IS_FRONT_INPUT_SENSOR,
struct fimc_is_video video_31p;
struct fimc_is_video video_31f;
struct fimc_is_video video_31g;
+ struct fimc_is_video video_32s;
+ struct fimc_is_video video_32p;
struct fimc_is_video video_i0s;
struct fimc_is_video video_i0c;
struct fimc_is_video video_i0p;
struct fimc_is_video video_i1c;
struct fimc_is_video video_i1p;
struct fimc_is_video video_me0c;
+ struct fimc_is_video video_me1c;
struct fimc_is_video video_scc;
struct fimc_is_video video_scp;
struct fimc_is_video video_d0s;
struct mutex secure_state_lock;
unsigned long secure_state;
#endif
+ ulong secure_mem_info[2]; /* size, addr */
+ ulong non_secure_mem_info[2]; /* size, addr */
+ u32 scenario;
unsigned long sensor_map;
struct fimc_is_dual_info dual_info;
+ struct mutex ois_mode_lock;
};
+int fimc_is_secure_func(struct fimc_is_core *core,
+ struct fimc_is_device_sensor *device, u32 type, u32 scenario, ulong smc_cmd);
struct fimc_is_device_sensor *fimc_is_get_sensor_device(struct fimc_is_core *core);
int fimc_is_put_sensor_device(struct fimc_is_core *core);
void fimc_is_print_frame_dva(struct fimc_is_subdev *subdev);
/* pointer address from device sensor */
struct v4l2_subdev **subdev;
struct phy *phy;
-#if defined(CONFIG_SECURE_CAMERA_USE)
- struct phy *extra_phy;
- int extra_phy_off;
-#endif
u32 error_id[CSI_VIRTUAL_CH_MAX];
u32 error_count;
{
FIMC_BUG(!frame);
- csi_hw_s_dma_addr(csi->base_reg, vc, index, frame->dvaddr_buffer[0]);
+ csi_hw_s_dma_addr(csi->base_reg, vc, index,
+ (u32)frame->dvaddr_buffer[0]);
}
static inline void csi_s_multibuf_addr(struct fimc_is_device_csi *csi, struct fimc_is_frame *frame, u32 index, u32 vc)
{
FIMC_BUG(!frame);
- csi_hw_s_multibuf_dma_addr(csi->base_reg, vc, index, frame->dvaddr_buffer[0]);
+ csi_hw_s_multibuf_dma_addr(csi->base_reg, vc, index,
+ (u32)frame->dvaddr_buffer[0]);
}
static inline void csi_s_output_dma(struct fimc_is_device_csi *csi, u32 vc, bool enable)
continue;
if (test_bit(FIMC_IS_SUBDEV_INTERNAL_USE, &dma_subdev->state)) {
+ if ((csi->sensor_cfg->output[vc].type == VC_NOTHING) ||
+ (csi->sensor_cfg->output[vc].type == VC_PRIVATE))
+ continue;
+
/* set from internal subdev setting */
- fmt.pixelformat = dma_subdev->pixelformat;
+ fmt.pixelformat = V4L2_PIX_FMT_PRIV_MAGIC;
framecfg.format = &fmt;
framecfg.width = dma_subdev->output.width;
} else {
}
csi_hw_s_config_dma(csi->vc_reg[csi->scm][vc], vc, &framecfg, vci_config[vc].hwformat);
- csi_hw_s_config_dma_cmn(csi->cmn_reg[csi->scm][vc], vc, vci_config[vc].hwformat);
+
+ /* vc: determine for vc0 img format for otf path
+ * dma_subdev->vc_ch[csi->scm]: actual channel at each vc used,
+ * it need to csis_wdma input path select(ch0 or ch1)
+ */
+ csi_hw_s_config_dma_cmn(csi->cmn_reg[csi->scm][vc],
+ vc, dma_subdev->vc_ch[csi->scm], vci_config[vc].hwformat);
}
}
{
FIMC_BUG_VOID(!frame);
- csi_hw_s_dma_addr(csi->vc_reg[csi->scm][vc], vc, index, frame->dvaddr_buffer[0]);
+ csi_hw_s_dma_addr(csi->vc_reg[csi->scm][vc], vc, index,
+ (u32)frame->dvaddr_buffer[0]);
}
static inline void csi_s_multibuf_addr(struct fimc_is_device_csi *csi, struct fimc_is_frame *frame, u32 index, u32 vc)
{
FIMC_BUG_VOID(!frame);
- csi_hw_s_multibuf_dma_addr(csi->vc_reg[csi->scm][vc], vc, index, frame->dvaddr_buffer[0]);
+ csi_hw_s_multibuf_dma_addr(csi->vc_reg[csi->scm][vc], vc, index,
+ (u32)frame->dvaddr_buffer[0]);
}
static inline void csi_s_output_dma(struct fimc_is_device_csi *csi, u32 vc, bool enable)
if (!dma_subdev
|| (!test_bit(FIMC_IS_SUBDEV_INTERNAL_USE, &dma_subdev->state))
|| (!test_bit(FIMC_IS_SUBDEV_START, &dma_subdev->state))
- || (csi->sensor_cfg->output[vc].type == VC_NOTHING))
+ || (csi->sensor_cfg->output[vc].type == VC_NOTHING)
+ || (csi->sensor_cfg->output[vc].type == VC_PRIVATE))
continue;
framemgr = GET_SUBDEV_FRAMEMGR(dma_subdev);
u32 vc;
int cur_dma_enable;
struct fimc_is_framemgr *framemgr;
+ struct fimc_is_frame *frame;
struct fimc_is_subdev *dma_subdev;
/* default disable dma setting for several virtual ch 0 ~ 3 */
framemgr = GET_SUBDEV_FRAMEMGR(dma_subdev);
framemgr_e_barrier(framemgr, 0);
if (likely(framemgr)) {
+ /* process to NDONE if set to bad frame */
+ if (framemgr->queued_count[FS_PROCESS]) {
+ frame = peek_frame(framemgr, FS_PROCESS);
+
+ if (frame->result) {
+ mserr("[F%d] NDONE(%d, E%X)\n", dma_subdev, dma_subdev,
+ frame->fcount, frame->index, frame->result);
+ trans_frame(framemgr, frame, FS_COMPLETE);
+ CALL_VOPS(dma_subdev->vctx, done, frame->index, VB2_BUF_STATE_ERROR);
+ }
+ }
+
/*
* W/A: DMA should be on forcely at invalid frame state.
* The invalid state indicates that there is process frame at DMA off.
if (!subdev
|| !test_bit(FIMC_IS_SUBDEV_START, &subdev->state)
|| !test_bit(FIMC_IS_SUBDEV_INTERNAL_USE, &subdev->state)
- || (csi->sensor_cfg->output[vc].type == VC_NOTHING))
+ || (csi->sensor_cfg->output[vc].type == VC_NOTHING)
+ || (csi->sensor_cfg->output[vc].type == VC_PRIVATE))
return;
framemgr = GET_SUBDEV_FRAMEMGR(subdev);
CALL_BUFOP(dma_subdev->pb_subdev[frame->index], sync_for_cpu,
dma_subdev->pb_subdev[frame->index],
0,
- dma_subdev->output.width * dma_subdev->output.height * 2,
+ dma_subdev->pb_subdev[frame->index]->size,
DMA_FROM_DEVICE);
}
data_type = CSIS_NOTIFY_DMA_END_VC_EMBEDDED;
+
+ mdbgd_front("%s, %s[%d] = %d\n", csi, __func__, "VC_EMBEDDED",
+ frameptr, frame->fcount);
+
+ } else if (csi->sensor_cfg->output[vc].type == VC_MIPISTAT) {
+ u32 frameptr = csi_hw_g_frameptr(csi->vc_reg[csi->scm][vc], vc);
+
+ frameptr = frameptr % framemgr->num_frames;
+ frame = &framemgr->frames[frameptr];
+
+ data_type = CSIS_NOTIFY_DMA_END_VC_MIPISTAT;
+
+ mdbgd_front("%s, %s[%d] = %d\n", csi, __func__, "VC_MIPISTAT",
+ frameptr, frame->fcount);
} else {
return;
}
if (dma_frame_end) {
#if !defined(SUPPORTED_EARLYBUF_DONE_HW)
/* VC0 */
- if (csi->dma_subdev[CSI_VIRTUAL_CH_0] && (dma_frame_end & (1 << CSI_VIRTUAL_CH_0)))
- csi_wq_func_schedule(csi, &csi->wq_csis_dma[CSI_VIRTUAL_CH_0]);
+ if (csi->dma_subdev[CSI_VIRTUAL_CH_0] && (dma_frame_end & (1 << CSI_VIRTUAL_CH_0))) {
+ if (IS_ENABLED(CHAIN_USE_VC_TASKLET)) {
+ csi_wq_func_schedule(csi, &csi->wq_csis_dma[CSI_VIRTUAL_CH_0]);
+ } else {
+ framemgr = csis_get_vc_framemgr(csi, CSI_VIRTUAL_CH_0);
+ if (framemgr)
+ csi_dma_tag(*csi->subdev, csi, framemgr, CSI_VIRTUAL_CH_0);
+ }
+ }
#endif
for (vc = CSI_VIRTUAL_CH_1; vc < CSI_VIRTUAL_CH_MAX; vc++) {
if ((dma_frame_end & (1 << vc)) && csi->dma_subdev[vc]) {
return -EINVAL;
}
- if (on) {
+ if (on)
ret = phy_power_on(csi->phy);
- } else {
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
- if (csi->phy->power_count > 0)
-#endif
- {
- ret = phy_power_off(csi->phy);
- }
- }
+ else
+ ret = phy_power_off(csi->phy);
if (ret) {
err("fail to csi%d power on/off(%d)", csi->instance, on);
goto p_err;
}
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
- if (csi->extra_phy) {
- if (on && (csi->extra_phy->power_count == 0))
- ret = phy_power_on(csi->extra_phy);
- else if (!on && (csi->extra_phy->power_count == 1))
- ret = phy_power_off(csi->extra_phy);
-
- if (ret)
- warn("fail to extra csi%d power on/off(%d)",
- csi->instance, on);
- }
-#endif
-
p_err:
mdbgd_front("%s(%d, %d)\n", csi, __func__, on, ret);
return ret;
/* if sensor's output otf was enabled, enable line irq */
if (!test_bit(FIMC_IS_SENSOR_OTF_OUTPUT, &device->state)) {
+ /* update line_fcount for sensor_notify_by_line */
+ device->line_fcount = atomic_read(&csi->fcount) + 1;
+ minfo("[CSI] start line irq cnt(%d)\n", csi, device->line_fcount);
+
csi_hw_s_control(base_reg, CSIS_CTRL_LINE_RATIO, csi->image.window.height * CSI_LINE_RATIO / 20);
csi_hw_s_control(base_reg, CSIS_CTRL_ENABLE_LINE_IRQ, 0x1);
tasklet_init(&csi->tasklet_csis_line, tasklet_csis_line, (unsigned long)subdev);
ret = get_dma(device, &dma_ch);
if (ret)
goto err_get_dma;
- /* FIXME: 10KB 10KB 5KB -> 36KB, 36KB, 8KB, 16KB */
+ /* SRAM0: 10KB SRAM1: 10KB */
csi_hw_s_dma_common_dynamic(csi_dma->base_reg, 10 * SZ_1K, dma_ch);
#if defined(ENABLE_PDP_STAT_DMA)
csi_hw_s_dma_common_dynamic(csi_dma->base_reg_stat, 5 * SZ_1K, dma_ch);
if (csi_hw_g_output_dma_enable(csi->vc_reg[csi->scm][vc], vc)) {
err("[VC%d][F%d] already DMA enabled!!", vc, frame->fcount);
ret = -EINVAL;
+
+ frame->result = IS_SHOT_BAD_FRAME;
+ trans_frame(framemgr, frame, FS_PROCESS);
} else {
csi_s_buf_addr(csi, frame, 0, vc);
csi_s_output_dma(csi, vc, true);
goto err_get_phy_dev;
}
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
- csi->extra_phy = devm_phy_get(dev, "extra_csis_dphy");
- if (IS_ERR(csi->extra_phy))
- csi->extra_phy = NULL;
-#endif
-
irq_name = __getname();
if (unlikely(!irq_name)) {
ret = -ENOMEM;
__putname(irq_name);
err_alloc_irq_name:
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
- devm_phy_put(dev, csi->extra_phy);
-#endif
devm_phy_put(dev, csi->phy);
err_get_phy_dev:
frame = peek_frame(framemgr, FS_REQUEST);
if (frame) {
- flite_hw_set_dma_addr(flite->base_reg, 0, true, frame->dvaddr_buffer[0]);
+ flite_hw_set_dma_addr(flite->base_reg, 0, true,
+ (u32)frame->dvaddr_buffer[0]);
trans_frame(framemgr, frame, FS_PROCESS);
} else {
flite_hw_set_dma_addr(flite->base_reg, 0, false, 0);
frame = peek_frame(framemgr, FS_REQUEST);
if (frame) {
- flite_hw_set_dma_addr(flite->base_reg, 0, true, frame->dvaddr_buffer[0]);
+ flite_hw_set_dma_addr(flite->base_reg, 0, true,
+ (u32)frame->dvaddr_buffer[0]);
trans_frame(framemgr, frame, FS_PROCESS);
} else {
flite_hw_set_dma_addr(flite->base_reg, 0, false, 0);
(1 << FLITE_STATUS_MIPI_VALID), false)) {
merr("over vblank", flite);
} else {
- flite_hw_set_dma_addr(flite->base_reg, 0, true, frame->dvaddr_buffer[0]);
+ flite_hw_set_dma_addr(flite->base_reg, 0, true,
+ (u32)frame->dvaddr_buffer[0]);
trans_frame(framemgr, frame, FS_PROCESS);
}
} else {
if (framemgr->queued_count[FS_REQUEST] >= 1) {
frame = peek_frame(framemgr, FS_REQUEST);
if (frame) {
- flite_hw_set_dma_addr(flite->base_reg, 0, true, frame->dvaddr_buffer[0]);
+ flite_hw_set_dma_addr(flite->base_reg, 0, true,
+ (u32)frame->dvaddr_buffer[0]);
trans_frame(framemgr, frame, FS_PROCESS);
buffer_ready = true;
} else {
frame = peek_frame(framemgr, FS_REQUEST);
if (frame) {
if (!flite_hw_get_output_dma(flite->base_reg)) {
- flite_hw_set_dma_addr(flite->base_reg, 0, true, frame->dvaddr_buffer[0]);
+ flite_hw_set_dma_addr(flite->base_reg, 0, true,
+ (u32)frame->dvaddr_buffer[0]);
trans_frame(framemgr, frame, FS_PROCESS);
}
}
static void fimc_is_itf_param_init(struct is_region *region)
{
- memset(®ion->parameter, 0x0, sizeof(struct is_param_region));
-
memcpy(®ion->parameter.sensor, &init_sensor_param,
sizeof(struct sensor_param));
memcpy(®ion->parameter.taa, &init_taa_param,
#ifdef SOC_SCP
memcpy(®ion->parameter.scalerp, &init_scp_param,
sizeof(struct scp_param));
-#endif
-#ifdef SOC_MCS
- memcpy(®ion->parameter.mcs, &init_mcs_param,
- sizeof(struct mcs_param));
#endif
memcpy(®ion->parameter.vra, &init_vra_param,
sizeof(struct vra_param));
return ret;
}
+#ifdef ENABLE_IS_CORE
int fimc_is_itf_map(struct fimc_is_device_ischain *device,
- u32 group, u32 shot_addr, u32 shot_size)
+ u32 group, dma_addr_t shot_addr, size_t shot_size)
{
int ret = 0;
mdbgd_ischain("%s()\n", device, __func__);
- ret = fimc_is_itf_map_wrap(device, group, shot_addr, shot_size);
+ ret = fimc_is_itf_map_wrap(device, group, (u32)shot_addr,
+ (u32)shot_size);
return ret;
}
return ret;
}
+#endif
int fimc_is_itf_stream_on(struct fimc_is_device_ischain *device)
{
unsigned long flags;
struct fimc_is_group *head;
struct fimc_is_framemgr *framemgr;
+ bool is_remosaic_preview = false;
#endif
FIMC_BUG(!device);
FIMC_BUG(!group);
mgrdbgs(1, " SHOT(%d)\n", device, group, frame, frame->index);
#ifdef CONFIG_USE_SENSOR_GROUP
+
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+ if (!test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)
+ && CHK_REMOSAIC_SCN(frame->shot->ctl.aa.sceneMode))
+ is_remosaic_preview = true;
+#endif
+
head = GET_HEAD_GROUP_IN_DEVICE(FIMC_IS_DEVICE_ISCHAIN, group);
- if (head) {
+ if (head && !is_remosaic_preview) {
ret = fimc_is_itf_shot_wrap(device, group, frame);
} else {
framemgr = GET_HEAD_GROUP_FRAMEMGR(group);
sensor_config->max_target_fps = device->sensor->max_target_fps;
#endif
- if (ex_mode == EX_DUALFPS)
+ if (ex_mode == EX_DUALFPS_960 || ex_mode == EX_DUALFPS_480)
sensor_config->early_config_lock = 1;
else
sensor_config->early_config_lock = 0;
case V4L2_PIX_FMT_NV61:
for (i = 0; i < frame->planes; i++) {
j = i * 2;
- target_addr[j] = frame->dvaddr_buffer[i];
+ target_addr[j] = (typeof(*target_addr))frame->dvaddr_buffer[i];
target_addr[j + 1] = target_addr[j] + (width * height);
}
break;
case V4L2_PIX_FMT_YVU420M:
for (i = 0; i < frame->planes; i += 3) {
- target_addr[i] = frame->dvaddr_buffer[i];
- target_addr[i + 1] = frame->dvaddr_buffer[i + 2];
- target_addr[i + 2] = frame->dvaddr_buffer[i + 1];
+ target_addr[i] = (typeof(*target_addr))frame->dvaddr_buffer[i];
+ target_addr[i + 1] = (typeof(*target_addr))frame->dvaddr_buffer[i + 2];
+ target_addr[i + 2] = (typeof(*target_addr))frame->dvaddr_buffer[i + 1];
}
break;
case V4L2_PIX_FMT_YUV420:
for (i = 0; i < frame->planes; i++) {
j = i * 3;
- target_addr[j] = frame->dvaddr_buffer[i];
+ target_addr[j] = (typeof(*target_addr))frame->dvaddr_buffer[i];
target_addr[j + 1] = target_addr[j] + (width * height);
target_addr[j + 2] = target_addr[j + 1] + (width * height / 4);
}
case V4L2_PIX_FMT_YVU420: /* AYV12 spec: The width should be aligned by 16 pixel. */
for (i = 0; i < frame->planes; i++) {
j = i * 3;
- target_addr[j] = frame->dvaddr_buffer[i];
+ target_addr[j] = (typeof(*target_addr))frame->dvaddr_buffer[i];
target_addr[j + 2] = target_addr[j] + (ALIGN(width, 16) * height);
target_addr[j + 1] = target_addr[j + 2] + (ALIGN(width / 2, 16) * height / 2);
}
case V4L2_PIX_FMT_YUV422P:
for (i = 0; i < frame->planes; i++) {
j = i * 3;
- target_addr[j] = frame->dvaddr_buffer[i];
+ target_addr[j] = (typeof(*target_addr))frame->dvaddr_buffer[i];
target_addr[j + 1] = target_addr[j] + (width * height);
target_addr[j + 2] = target_addr[j + 1] + (width * height / 2);
}
case V4L2_PIX_FMT_NV21M_S10B:
for (i = 0; i < frame->planes; i += 2) {
j = i * 2;
- target_addr[j] = frame->dvaddr_buffer[i]; /* Y_ADDR */
- target_addr[j + 1] = frame->dvaddr_buffer[i + 1]; /* UV_ADDR */
- target_addr[j + 2] = target_addr[j] + NV12M_Y_SIZE(width, height); /* Y_2BIT_ADDR */
- target_addr[j + 3] = target_addr[j + 1] + NV12M_CBCR_SIZE(width, height); /* UV_2BIT_ADDR */
+ /* Y_ADDR, UV_ADDR, Y_2BIT_ADDR, UV_2BIT_ADDR */
+ target_addr[j] = (typeof(*target_addr))frame->dvaddr_buffer[i];
+ target_addr[j + 1] = (typeof(*target_addr))frame->dvaddr_buffer[i + 1];
+ target_addr[j + 2] = target_addr[j] + NV12M_Y_SIZE(width, height);
+ target_addr[j + 3] = target_addr[j + 1] + NV12M_CBCR_SIZE(width, height);
}
break;
case V4L2_PIX_FMT_NV16M_S10B:
case V4L2_PIX_FMT_NV61M_S10B:
for (i = 0; i < frame->planes; i += 2) {
j = i * 2;
- target_addr[j] = frame->dvaddr_buffer[i]; /* Y_ADDR */
- target_addr[j + 1] = frame->dvaddr_buffer[i + 1]; /* UV_ADDR */
- target_addr[j + 2] = target_addr[j] + NV16M_Y_SIZE(width, height); /* Y_2BIT_ADDR */
- target_addr[j + 3] = target_addr[j + 1] + NV16M_CBCR_SIZE(width, height); /* UV_2BIT_ADDR */
+ /* Y_ADDR, UV_ADDR, Y_2BIT_ADDR, UV_2BIT_ADDR */
+ target_addr[j] = (typeof(*target_addr))frame->dvaddr_buffer[i];
+ target_addr[j + 1] = (typeof(*target_addr))frame->dvaddr_buffer[i + 1];
+ target_addr[j + 2] = target_addr[j] + NV16M_Y_SIZE(width, height);
+ target_addr[j + 3] = target_addr[j + 1] + NV16M_CBCR_SIZE(width, height);
}
break;
default:
for (i = 0; i < frame->planes; i++)
- target_addr[i] = frame->dvaddr_buffer[i];
+ target_addr[i] = (typeof(*target_addr))frame->dvaddr_buffer[i];
break;
}
break;
default:
for (i = 0; i < frame->planes; i++)
- target_addr[i] = (uint64_t)frame->dvaddr_buffer[i];
+ target_addr[i] = (typeof(*target_addr))frame->dvaddr_buffer[i];
break;
}
device->dvaddr_shared = minfo->dvaddr +
(u32)((ulong)&device->is_region->shared[0] - minfo->kvaddr);
+ memset(&device->is_region->parameter, 0x0, sizeof(struct is_param_region));
+
#ifdef ENABLE_HYBRID_FD
spin_lock_init(&device->is_region->fdae_info.slock);
#endif
+
#ifdef SOC_DRC
fimc_is_subdev_open(&device->drc, NULL, (void *)&init_drc_param.control);
#endif
* So vender must set this cal_address to let F/W load cal data.
*/
module->ext.sensor_con.cal_address = 0;
- ret = fimc_is_vender_cal_load(vender, module);
+ ret = fimc_is_vender_cal_load(sensor, vender, module);
if (ret) {
merr("fimc_is_vender_cal_load is fail(%d)", device, ret);
goto p_err;
sensor_id = priv->front_sensor_id;
break;
case SENSOR_POSITION_REAR2:
- sensor_id = priv->rear_second_sensor_id;
+ sensor_id = priv->rear2_sensor_id;
break;
case SENSOR_POSITION_FRONT2:
- sensor_id = priv->front_second_sensor_id;
+ sensor_id = priv->front2_sensor_id;
break;
case SENSOR_POSITION_REAR3:
- sensor_id = priv->rear_third_sensor_id;
+ sensor_id = priv->rear3_sensor_id;
break;
-#ifdef CONFIG_SECURE_CAMERA_USE
+#if defined(SECURE_CAMERA_IRIS)
case SENSOR_POSITION_SECURE:
sensor_id = priv->secure_sensor_id;
break;
static int fimc_is_ischain_paf_reqbufs(void *qdevice,
struct fimc_is_queue *queue, u32 count)
{
+#ifdef ENABLE_IS_CORE
int ret = 0;
struct fimc_is_device_ischain *device = qdevice;
struct fimc_is_group *group;
}
return ret;
+#else
+ return 0;
+#endif
}
static int fimc_is_ischain_paf_s_format(void *qdevice,
static int fimc_is_ischain_3aa_reqbufs(void *qdevice,
struct fimc_is_queue *queue, u32 count)
{
+#ifdef ENABLE_IS_CORE
int ret = 0;
struct fimc_is_device_ischain *device = qdevice;
struct fimc_is_group *group;
}
return ret;
+#else
+ return 0;
+#endif
}
static int fimc_is_ischain_3aa_s_format(void *qdevice,
static int fimc_is_ischain_isp_reqbufs(void *qdevice,
struct fimc_is_queue *queue, u32 count)
{
+#ifdef ENABLE_IS_CORE
int ret = 0;
struct fimc_is_device_ischain *device = qdevice;
struct fimc_is_group *group;
}
return ret;
+#else
+ return 0;
+#endif
}
static int fimc_is_ischain_isp_s_format(void *qdevice,
static int fimc_is_ischain_dis_reqbufs(void *qdevice,
struct fimc_is_queue *queue, u32 count)
{
+#ifdef ENABLE_IS_CORE
int ret = 0;
struct fimc_is_device_ischain *device = qdevice;
struct fimc_is_group *group;
}
return ret;
+#else
+ return 0;
+#endif
}
static int fimc_is_ischain_dis_s_format(void *qdevice,
static int fimc_is_ischain_dcp_reqbufs(void *qdevice,
struct fimc_is_queue *queue, u32 count)
{
+#ifdef ENABLE_IS_CORE
int ret = 0;
struct fimc_is_device_ischain *device = qdevice;
struct fimc_is_group *group;
}
return ret;
+#else
+ return 0;
+#endif
}
static int fimc_is_ischain_dcp_s_format(void *qdevice,
static int fimc_is_ischain_mcs_reqbufs(void *qdevice,
struct fimc_is_queue *queue, u32 count)
{
+#ifdef ENABLE_IS_CORE
int ret = 0;
struct fimc_is_device_ischain *device = qdevice;
struct fimc_is_group *group;
}
return ret;
+#else
+ return 0;
+#endif
}
static int fimc_is_ischain_mcs_s_format(void *qdevice,
static int fimc_is_ischain_vra_reqbufs(void *qdevice,
struct fimc_is_queue *queue, u32 count)
{
+#ifdef ENABLE_IS_CORE
int ret = 0;
struct fimc_is_device_ischain *device = qdevice;
struct fimc_is_group *group;
}
return ret;
+#else
+ return 0;
+#endif
}
static int fimc_is_ischain_vra_s_format(void *qdevice,
}
break;
case FIMC_IS_VIDEO_ME0C_NUM:
+ case FIMC_IS_VIDEO_ME1C_NUM:
subdev = group->subdev[ENTRY_MEXC];
if (subdev && test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
ret = CALL_SOPS(subdev, tag, device, frame, cap_node);
}
break;
case FIMC_IS_VIDEO_ME0C_NUM:
+ case FIMC_IS_VIDEO_ME1C_NUM:
subdev = group->subdev[ENTRY_MEXC];
if (subdev && test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
ret = CALL_SOPS(subdev, tag, device, frame, cap_node);
}
#endif
+ /* At Full-OTF case(Head group is OTF),
+ * set next_noise_idx for next frame applying.
+ *
+ * At DMA input case, set cur_noise_idx for current frame appling.
+ */
+ if (test_bit(FIMC_IS_GROUP_OTF_INPUT, &head->state)) {
+ frame->noise_idx = device->next_noise_idx[frame->fcount % NI_BACKUP_MAX];
+ /* clear back up NI value */
+ device->next_noise_idx[frame->fcount % NI_BACKUP_MAX] = 0xFFFFFFFF;
+ } else {
+ frame->noise_idx = device->cur_noise_idx[frame->fcount % NI_BACKUP_MAX];
+ /* clear back up NI value */
+ device->cur_noise_idx[frame->fcount % NI_BACKUP_MAX] = 0xFFFFFFFF;
+ }
+
#ifdef ENABLE_DNR_IN_MCSC
if (dnr) {
- /* At Full-OTF case(Head group is OTF),
- * set next_noise_idx for next frame applying.
- *
- * At DMA input case, set cur_noise_idx for current frame appling.
- */
- if (test_bit(FIMC_IS_GROUP_OTF_INPUT, &head->state)) {
- frame->noise_idx = device->next_noise_idx[frame->fcount % NI_BACKUP_MAX];
- /* clear back up NI value */
- device->next_noise_idx[frame->fcount % NI_BACKUP_MAX] = 0xFFFFFFFF;
- } else {
- frame->noise_idx = device->cur_noise_idx[frame->fcount % NI_BACKUP_MAX];
- /* clear back up NI value */
- device->cur_noise_idx[frame->fcount % NI_BACKUP_MAX] = 0xFFFFFFFF;
- }
-
if ((frame->shot_ext->dnr_bypass) || (device->hardware->hw_fro_en)) {
if (test_bit(FIMC_IS_SUBDEV_RUN, &dnr->state)) {
ret = fimc_is_ischain_dnr_bypass(device, frame, true);
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (unlikely(!test_bit(FRAME_MEM_MAPPED, &frame->mem_state))) {
fimc_is_itf_map(device, GROUP_ID(group->id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
frame->shot->ctl.vendor_entry.lowIndexParam = 0;
frame->shot->ctl.vendor_entry.highIndexParam = 0;
frame->shot->ctl.aa.captureIntent, frame->shot->ctl.aa.vendor_captureCount,
frame->shot->ctl.aa.vendor_captureExposureTime);
}
+
+ if (group->lens_ctl.aperture != 0) {
+ frame->shot->ctl.lens.aperture = group->lens_ctl.aperture;
+ group->lens_ctl.aperture = 0;
+ }
}
/* fd information copy */
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (unlikely(!test_bit(FRAME_MEM_MAPPED, &frame->mem_state))) {
fimc_is_itf_map(device, GROUP_ID(group->id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
frame->shot->ctl.vendor_entry.lowIndexParam = 0;
frame->shot->ctl.vendor_entry.highIndexParam = 0;
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (unlikely(!test_bit(FRAME_MEM_MAPPED, &frame->mem_state))) {
fimc_is_itf_map(device, GROUP_ID(group->id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
frame->shot->ctl.vendor_entry.lowIndexParam = 0;
frame->shot->ctl.vendor_entry.highIndexParam = 0;
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (unlikely(!test_bit(FRAME_MEM_MAPPED, &frame->mem_state))) {
fimc_is_itf_map(device, GROUP_ID(group->id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
frame->shot->ctl.vendor_entry.lowIndexParam = 0;
frame->shot->ctl.vendor_entry.highIndexParam = 0;
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (unlikely(!test_bit(FRAME_MEM_MAPPED, &frame->mem_state))) {
fimc_is_itf_map(device, GROUP_ID(group->id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
frame->shot->ctl.vendor_entry.lowIndexParam = 0;
frame->shot->ctl.vendor_entry.highIndexParam = 0;
goto p_err;
}
+
+#ifdef ENABLE_IS_CORE
if (unlikely(!test_bit(FRAME_MEM_MAPPED, &frame->mem_state))) {
fimc_is_itf_map(device, GROUP_ID(group->id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
frame->shot->ctl.vendor_entry.lowIndexParam = 0;
frame->shot->ctl.vendor_entry.highIndexParam = 0;
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (unlikely(!test_bit(FRAME_MEM_MAPPED, &frame->mem_state))) {
fimc_is_itf_map(device, GROUP_ID(group->id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
frame->shot->ctl.vendor_entry.lowIndexParam = 0;
frame->shot->ctl.vendor_entry.highIndexParam = 0;
return ret;
}
-
-int fimc_is_ischain_camctl(struct fimc_is_device_ischain *this,
- struct fimc_is_frame *frame,
- u32 fcount)
-{
- int ret = 0;
-#ifdef ENABLE_SENSOR_DRIVER
- struct fimc_is_interface *itf;
- struct camera2_uctl *applied_ctl;
-
- struct camera2_sensor_ctl *isp_sensor_ctl;
- struct camera2_lens_ctl *isp_lens_ctl;
- struct camera2_flash_ctl *isp_flash_ctl;
-
- u32 index;
-
- mdbgs_ischain(4, "%s()\n", device, __func__);
-
- itf = this->interface;
- isp_sensor_ctl = &itf->isp_peri_ctl.sensorUd.ctl;
- isp_lens_ctl = &itf->isp_peri_ctl.lensUd.ctl;
- isp_flash_ctl = &itf->isp_peri_ctl.flashUd.ctl;
-
- /*lens*/
- index = (fcount + 0) & SENSOR_MAX_CTL_MASK;
- applied_ctl = &this->peri_ctls[index];
- applied_ctl->lensUd.ctl.focusDistance = isp_lens_ctl->focusDistance;
-
- /*sensor*/
- index = (fcount + 1) & SENSOR_MAX_CTL_MASK;
- applied_ctl = &this->peri_ctls[index];
- applied_ctl->sensorUd.ctl.exposureTime = isp_sensor_ctl->exposureTime;
- applied_ctl->sensorUd.ctl.frameDuration = isp_sensor_ctl->frameDuration;
- applied_ctl->sensorUd.ctl.sensitivity = isp_sensor_ctl->sensitivity;
-
- /*flash*/
- index = (fcount + 0) & SENSOR_MAX_CTL_MASK;
- applied_ctl = &this->peri_ctls[index];
- applied_ctl->flashUd.ctl.flashMode = isp_flash_ctl->flashMode;
- applied_ctl->flashUd.ctl.firingPower = isp_flash_ctl->firingPower;
- applied_ctl->flashUd.ctl.firingTime = isp_flash_ctl->firingTime;
-#endif
- return ret;
-}
-
-int fimc_is_ischain_tag(struct fimc_is_device_ischain *ischain,
- struct fimc_is_frame *frame)
-{
- int ret = 0;
-#ifdef ENABLE_SENSOR_DRIVER
- struct camera2_uctl *applied_ctl;
- struct timeval curtime;
- u32 fcount;
-
- fcount = frame->fcount;
- applied_ctl = &ischain->peri_ctls[fcount & SENSOR_MAX_CTL_MASK];
-
- do_gettimeofday(&curtime);
-
- /* Request */
- frame->shot->dm.request.frameCount = fcount;
-
- /* Lens */
- frame->shot->dm.lens.focusDistance =
- applied_ctl->lensUd.ctl.focusDistance;
-
- /* Sensor */
- frame->shot->dm.sensor.exposureTime =
- applied_ctl->sensorUd.ctl.exposureTime;
- frame->shot->dm.sensor.sensitivity =
- applied_ctl->sensorUd.ctl.sensitivity;
- frame->shot->dm.sensor.frameDuration =
- applied_ctl->sensorUd.ctl.frameDuration;
- frame->shot->dm.sensor.timeStamp =
- (uint64_t)curtime.tv_sec*1000000 + curtime.tv_usec;
-
- /* Flash */
- frame->shot->dm.flash.flashMode =
- applied_ctl->flashUd.ctl.flashMode;
- frame->shot->dm.flash.firingPower =
- applied_ctl->flashUd.ctl.firingPower;
- frame->shot->dm.flash.firingTime =
- applied_ctl->flashUd.ctl.firingTime;
-#else
- struct timespec curtime;
-
- ktime_get_ts(&curtime);
-
- frame->shot->dm.request.frameCount = frame->fcount;
- frame->shot->dm.sensor.timeStamp = fimc_is_get_timestamp();
-#endif
- return ret;
-}
-
void fimc_is_bts_control(struct fimc_is_device_ischain *device)
{
#if defined(USE_BTS_SCEN)
#define FIMC_IS_CRANGE_FULL 0
#define FIMC_IS_CRANGE_LIMITED 1
-#define NI_BACKUP_MAX 10
+#define NI_BACKUP_MAX 32
+
+/* TODO: remove AA_SCENE_MODE_REMOSAIC */
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+#define CHK_REMOSAIC_SCN(sceneMode) \
+ (((sceneMode == AA_SCENE_MODE_REMOSAIC) \
+ || (sceneMode == AA_SCENE_MODE_REMOSAIC_PURE_BAYER_ONLY) \
+ || (sceneMode == AA_SCENE_MODE_REMOSAIC_MFHDR_PURE_BAYER_ONLY)) ? 1 : 0)
+#endif
/*global state*/
enum fimc_is_ischain_state {
int fimc_is_ischain_isp_buffer_finish(struct fimc_is_device_ischain *this,
u32 index);
-/*scc subdev*/
-/*scp subdev*/
-int fimc_is_ischain_scp_s_format(struct fimc_is_device_ischain *device,
- u32 pixelformat, u32 width, u32 height);
-
/* dis subdev */
int fimc_is_ischain_dis_open(struct fimc_is_device_ischain *device,
struct fimc_is_video_ctx *vctx);
int fimc_is_ischain_vra_buffer_finish(struct fimc_is_device_ischain *this,
u32 index);
-/*special api for sensor*/
-int fimc_is_ischain_camctl(struct fimc_is_device_ischain *this,
- struct fimc_is_frame *frame,
- u32 fcount);
-int fimc_is_ischain_tag(struct fimc_is_device_ischain *ischain,
- struct fimc_is_frame *frame);
-
int fimc_is_itf_stream_on(struct fimc_is_device_ischain *this);
int fimc_is_itf_stream_off(struct fimc_is_device_ischain *this);
int fimc_is_itf_process_start(struct fimc_is_device_ischain *device,
u32 group);
int fimc_is_itf_force_stop(struct fimc_is_device_ischain *device,
u32 group);
+#ifdef ENABLE_IS_CORE
int fimc_is_itf_map(struct fimc_is_device_ischain *device,
- u32 group, u32 shot_addr, u32 shot_size);
+ u32 group, dma_addr_t shot_addr, size_t shot_size);
+#endif
int fimc_is_itf_grp_shot(struct fimc_is_device_ischain *device,
struct fimc_is_group *group,
struct fimc_is_frame *frame);
goto p_err;
}
+ ret = v4l2_subdev_call(device->subdev_module, video,
+ s_routing, 0, 0, 0);
+ if (ret) {
+ merr("failed at s_routing for module(%d)", device, ret);
+ goto p_err;
+ }
+
flite = (struct fimc_is_device_flite *)v4l2_get_subdevdata(subdev_flite);
if (!flite) {
merr("flite is NULL", device);
#define CSIS_NOTIFY_FEND 4
#define CSIS_NOTIFY_DMA_END 5
#define CSIS_NOTIFY_DMA_END_VC_EMBEDDED 6
-#define CSIS_NOTIFY_LINE 7
+#define CSIS_NOTIFY_DMA_END_VC_MIPISTAT 7
+#define CSIS_NOTIFY_LINE 8
#define SENSOR_MAX_ENUM 4 /* 4 modules(2 rear, 2 front) for same csis */
#define ACTUATOR_MAX_ENUM 3
#define OIS_I2C_ADDR_MASK 0xFF0000
#define OIS_I2C_ADDR_SHIFT 16
+#define SENSOR_OTP_PAGE 256
+#define SENSOR_OTP_PAGE_SIZE 64
+
#define SENSOR_SIZE_WIDTH_MASK 0xFFFF0000
#define SENSOR_SIZE_WIDTH_SHIFT 16
#define SENSOR_SIZE_HEIGHT_MASK 0xFFFF
SENSOR_IOCTL_PATTERN_DISABLE,
};
-#if defined(CONFIG_SECURE_CAMERA_USE)
-#define MC_SECURE_CAMERA_SYSREG_PROT ((uint32_t)(0x82002132))
-#define MC_SECURE_CAMERA_INIT ((uint32_t)(0x83000041))
-#define MC_SECURE_CAMERA_CFW_ENABLE ((uint32_t)(0x83000042))
-#define MC_SECURE_CAMERA_PREPARE ((uint32_t)(0x83000043))
-#define MC_SECURE_CAMERA_UNPREPARE ((uint32_t)(0x83000044))
-
+#if defined(SECURE_CAMERA_IRIS)
enum fimc_is_sensor_smc_state {
FIMC_IS_SENSOR_SMC_INIT = 0,
FIMC_IS_SENSOR_SMC_CFW_ENABLE,
EX_NONE = 0,
EX_DRAMTEST = 1,
EX_LIVEFOCUS = 2,
- EX_DUALFPS = 3,
+ EX_DUALFPS_960 = 3,
+ EX_DUALFPS_480 = 4,
+ EX_PDAF_OFF = 5,
+ EX_SSM_TEST = 6,
+ EX_3DHDR = 7,
};
struct fimc_is_sensor_cfg {
};
-struct fimc_is_sensor_vc_max_size {
+struct fimc_is_sensor_vc_extra_info {
int stat_type;
- u32 width;
- u32 height;
- u32 element_size;
+ int sensor_mode;
+ u32 max_width;
+ u32 max_height;
+ u32 max_element;
};
struct fimc_is_sensor_ops {
u32 bitwidth;
u32 cfgs;
struct fimc_is_sensor_cfg *cfg;
- struct fimc_is_sensor_vc_max_size vc_max_size[VC_BUF_DATA_TYPE_MAX];
- u32 vc_max_buf;
+ struct fimc_is_sensor_vc_extra_info vc_extra_info[VC_BUF_DATA_TYPE_MAX];
u32 vc_buffer_offset[CSI_VIRTUAL_CH_MAX];
struct i2c_client *client;
struct sensor_open_extended ext;
FIMC_IS_SENSOR_SUBDEV_MODULE_INIT, /* Deprecated: from device-sensor_v2 */
FIMC_IS_SENSOR_OTF_OUTPUT,
FIMC_IS_SENSOR_ITF_REGISTER, /* to check whether sensor interfaces are registered */
- FIMC_IS_SENSOR_WAIT_STREAMING
+ FIMC_IS_SENSOR_WAIT_STREAMING,
+ SENSOR_MODULE_GOT_INTO_TROUBLE,
};
enum sensor_subdev_internel_use {
SUBDEV_SSVC3_INTERNAL_USE,
};
+/*
+ * Cal data status
+ * [0]: NO ERROR
+ * [1]: CRC FAIL
+ * [2]: LIMIT FAIL
+ * => Check AWB out of the ratio EEPROM/OTP data
+ */
+
+enum fimc_is_sensor_cal_status {
+ CRC_NO_ERROR = 0,
+ CRC_ERROR,
+ LIMIT_FAILURE,
+};
+
struct fimc_is_device_sensor {
struct v4l2_device v4l2_dev;
struct platform_device *pdev;
spinlock_t slock_state;
struct mutex mlock_state;
atomic_t group_open_cnt;
-#if defined(CONFIG_SECURE_CAMERA_USE)
+#if defined(SECURE_CAMERA_IRIS)
enum fimc_is_sensor_smc_state smc_state;
#endif
bool dtp_check;
struct timer_list dtp_timer;
unsigned long force_stop;
- u32 dtp_del_flag;
/* for early buffer done */
u32 early_buf_done_mode;
struct fimc_is_flash *flash;
struct v4l2_subdev *subdev_ois;
struct fimc_is_ois *ois;
+ struct v4l2_subdev *subdev_mcu;
+ struct fimc_is_mcu *mcu;
struct v4l2_subdev *subdev_aperture;
+ struct v4l2_subdev *subdev_eeprom;
+ struct fimc_is_eeprom *eeprom;
struct fimc_is_aperture *aperture;
void *private_data;
struct fimc_is_group group_sensor;
float chk_wb[WB_GAIN_COUNT];
u32 init_wb_cnt;
#endif
+
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+ struct fimc_is_frame *mode_chg_frame;
+#endif
+
+ bool use_otp_cal;
+ const char *otp_filename;
+ u32 cal_status[CAMERA_CRC_INDEX_MAX];
+ u8 otp_cal_buf[SENSOR_OTP_PAGE][SENSOR_OTP_PAGE_SIZE];
};
int fimc_is_sensor_open(struct fimc_is_device_sensor *device,
sensor_id = priv->front_sensor_id;
break;
case SENSOR_POSITION_REAR2:
- sensor_id = priv->rear_second_sensor_id;
+ sensor_id = priv->rear2_sensor_id;
break;
case SENSOR_POSITION_FRONT2:
- sensor_id = priv->front_second_sensor_id;
+ sensor_id = priv->front2_sensor_id;
break;
case SENSOR_POSITION_REAR3:
- sensor_id = priv->rear_third_sensor_id;
+ sensor_id = priv->rear3_sensor_id;
break;
-#ifdef CONFIG_SECURE_CAMERA_USE
+#if defined(SECURE_CAMERA_IRIS)
case SENSOR_POSITION_SECURE:
sensor_id = priv->secure_sensor_id;
break;
#endif
-#ifdef CONFIG_VENDER_PSV
case SENSOR_POSITION_VIRTUAL:
sensor_id = SENSOR_NAME_VIRTUAL;
break;
-#endif
default:
merr("invalid module position(%d)", device, position);
ret = -EINVAL;
if (mindex >= mmax) {
*module = NULL;
- merr("module(%d) is not found", device, sensor_id);
+ merr("module(%d) is not found, position(%d)", device, sensor_id, position);
ret = -EINVAL;
}
FIMC_BUG_VOID(!device);
- if (device->dtp_del_flag) {
- del_timer(&device->dtp_timer);
- device->dtp_del_flag = false;
- }
-
/* Don't need to dtp check */
- if ((!device->force_stop && !device->dtp_check) || sysfs_debug.pattern_en)
+ if ((!device->force_stop && !device->dtp_check) || sysfs_debug.pattern_en ||
+ !test_bit(FIMC_IS_SENSOR_FRONT_START, &device->state))
return;
- err("forcely reset due to 0x%08lx", device->force_stop);
device->dtp_check = false;
- device->force_stop = 0;
+
+ if (device->force_stop) {
+ device->force_stop = 0;
+ err("forcely reset due to 0x%08lx", device->force_stop);
+ } else {
+ err("DTP detected");
+ }
fimc_is_sensor_dump(device);
ret = v4l2_subdev_call(subdev_module, video, s_stream, true);
if (ret) {
merr("v4l2_subdev_call(s_stream) is fail(%d)", device, ret);
+ set_bit(SENSOR_MODULE_GOT_INTO_TROUBLE, &device->state);
goto p_err;
}
set_bit(FIMC_IS_SENSOR_WAIT_STREAMING, &device->state);
frame->fcount = ldr_frame->fcount;
frame->stream->findex = ldr_frame->index;
frame->stream->fcount = ldr_frame->fcount;
+ frame->result = 0;
ret = v4l2_subdev_call(v_subdev, video, s_rx_buffer, (void *)frame, NULL);
if (ret) {
{
int ret = 0;
u32 hashkey;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
FIMC_BUG(!device);
FIMC_BUG(!frame);
+ subdev_module = device->subdev_module;
+ if (!subdev_module) {
+ err("subdev_module is NULL");
+ return -EINVAL;
+ }
+
+ module = v4l2_get_subdevdata(subdev_module);
+ if (!module) {
+ err("module is NULL");
+ return -EINVAL;
+ }
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+
+ subdev_cis = sensor_peri->subdev_cis;
+ if (!subdev_cis) {
+ err("[SEN:%d] no subdev_cis", module->sensor_id);
+ return -ENXIO;
+ }
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev_cis);
+ FIMC_BUG(!cis);
+
hashkey = frame->fcount % FIMC_IS_TIMESTAMP_HASH_KEY;
if (frame->shot) {
frame->shot->dm.request.frameCount = frame->fcount;
* So, embedded data should be extraced before frame end.
*/
frame->shot->udm.frame_id = device->frame_id[hashkey];
+
+ /* get gyro self test value from cis */
+ if (cis->gyro_self_test_step == 2) {
+ frame->shot_ext->user.gyro_info.x = cis->gyro_test_val.x;
+ frame->shot_ext->user.gyro_info.y = cis->gyro_test_val.y;
+ frame->shot_ext->user.gyro_info.z = cis->gyro_test_val.z;
+ frame->shot_ext->user.gyro_info.state = cis->gyro_test_val.state;
+ }
#ifdef DBG_JITTER
fimc_is_jitter(frame->shot->dm.sensor.timeStamp);
#endif
+ strncpy(frame->shot_ext->user.ddk_version.ddk_version,
+ fimc_is_ischain_get_version(FIMC_IS_BIN_DDK_LIBRARY), 60);
+ strncpy(frame->shot_ext->user.ddk_version.setfile_version,
+ fimc_is_ischain_get_version(FIMC_IS_BIN_SETFILE), 60);
+
+ frame->shot_ext->user.ddk_version.header1 = 0xF85A20B4;
+ frame->shot_ext->user.ddk_version.header2 = 0xCA539ADF;
}
+ ret = v4l2_subdev_call(device->subdev_module, core, ioctl,
+ V4L2_CID_ACTUATOR_UPDATE_DYNAMIC_META, (void *)frame);
+ if (ret)
+ merr("update actuator dynamic meta is fail", device);
+
return ret;
}
framemgr_x_barrier(framemgr, 0);
return -EINVAL;
}
- frameptr = (ctrl.value + 1) % framemgr->num_frames;
+ frameptr = (ctrl.value + dma_subdev->vc_buffer_offset) % framemgr->num_frames;
frame = &framemgr->frames[frameptr];
frame->fcount = device->fcount;
+
+ mdbgd_sensor("%s, VC%d[%d] = %d\n", device, __func__,
+ i, frameptr, frame->fcount);
}
framemgr_x_barrier(framemgr, 0);
FIMC_BUG(!device);
#ifdef ENABLE_DTP
- if (device->dtp_check)
+ if (device->dtp_check) {
device->dtp_check = false;
+ /* we are in softirq, so we can use 'del_timer_sync' */
+ if (timer_pending(&device->dtp_timer))
+ del_timer_sync(&device->dtp_timer);
+ }
if (device->force_stop)
fimc_is_sensor_dtp((unsigned long)device);
{
int ret = 0;
struct fimc_is_frame *frame;
+ struct fimc_is_module_enum *module = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
FIMC_BUG(!device);
frame = (struct fimc_is_frame *)arg;
if (frame) {
switch (notification) {
+ case CSIS_NOTIFY_DMA_END_VC_MIPISTAT:
+ ret = fimc_is_sensor_g_module(device, &module);
+ if (ret) {
+ warn("%s sensor_g_module failed(%d)", __func__, ret);
+ return -EINVAL;
+ }
+
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+ if (!sensor_peri) {
+ warn("sensor_peri is null");
+ return -EINVAL;
+ };
+
+ if (test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state))
+ CALL_PDPOPS(sensor_peri->pdp, notify,
+ sensor_peri->subdev_pdp,
+ notification, (void *)&frame->fcount);
+ else if (test_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE, &sensor_peri->peri_state))
+ CALL_PAFSTATOPS(sensor_peri->pafstat, notify,
+ sensor_peri->subdev_pafstat,
+ notification, (void *)&frame->fcount);
+ break;
default:
break;
}
FIMC_BUG(!device);
- if (device->line_fcount == 0)
- device->line_fcount = 1;
-
device->line_fcount++;
group = &device->group_sensor;
case FLITE_NOTIFY_DMA_END:
case CSIS_NOTIFY_DMA_END:
case CSIS_NOTIFY_DMA_END_VC_EMBEDDED:
+ case CSIS_NOTIFY_DMA_END_VC_MIPISTAT:
ret = fimc_is_sensor_notify_by_dma_end(device, arg, notification);
if (ret)
merr("fimc_is_sensor_notify_by_dma_end is fail(%d)", device, ret);
clear_bit(FIMC_IS_SENSOR_FRONT_DTP_STOP, &device->state);
clear_bit(FIMC_IS_SENSOR_BACK_NOWAIT_STOP, &device->state);
+ clear_bit(SENSOR_MODULE_GOT_INTO_TROUBLE, &device->state);
TIME_LAUNCH_STR(LAUNCH_SENSOR_START);
ret = fimc_is_sensor_start(device);
merr("v4l2_csi_call(s_stream) is fail(%d)", device, ret);
goto p_err;
}
- set_bit(FIMC_IS_SENSOR_FRONT_START, &device->state);
- TIME_LAUNCH_END(LAUNCH_SENSOR_START);
#ifdef ENABLE_DTP
if (device->dtp_check) {
- mod_timer(&device->dtp_timer, jiffies + msecs_to_jiffies(300));
- device->dtp_del_flag = true;
+ mod_timer(&device->dtp_timer, jiffies + msecs_to_jiffies(300));
info("DTP checking...\n");
}
#endif
+ set_bit(FIMC_IS_SENSOR_FRONT_START, &device->state);
+
+ TIME_LAUNCH_END(LAUNCH_SENSOR_START);
+
#ifdef FW_SUSPEND_RESUME
if (!instant_cnt) {
/* save launch state */
device->pdata = pdata;
device->groupmgr = &core->groupmgr;
device->devicemgr = &core->devicemgr;
- device->dtp_del_flag = false;
#ifdef ENABLE_INIT_AWB
memset(device->init_wb, 0, sizeof(float) * WB_GAIN_COUNT);
memset(device->last_wb, 0, sizeof(float) * WB_GAIN_COUNT);
mutex_init(&device->mlock_state);
device_init_wakeup(&pdev->dev, true);
- /* 3. state init*/
- clear_bit(FIMC_IS_SENSOR_PROBE, &device->state);
- clear_bit(FIMC_IS_SENSOR_OPEN, &device->state);
- clear_bit(FIMC_IS_SENSOR_MCLK_ON, &device->state);
- clear_bit(FIMC_IS_SENSOR_ICLK_ON, &device->state);
- clear_bit(FIMC_IS_SENSOR_GPIO_ON, &device->state);
- clear_bit(FIMC_IS_SENSOR_S_INPUT, &device->state);
- clear_bit(FIMC_IS_SENSOR_S_CONFIG, &device->state);
- clear_bit(FIMC_IS_SENSOR_DRIVING, &device->state);
- clear_bit(FIMC_IS_SENSOR_STAND_ALONE, &device->state);
- clear_bit(FIMC_IS_SENSOR_FRONT_START, &device->state);
- clear_bit(FIMC_IS_SENSOR_FRONT_DTP_STOP, &device->state);
- clear_bit(FIMC_IS_SENSOR_BACK_START, &device->state);
- clear_bit(FIMC_IS_SENSOR_OTF_OUTPUT, &device->state);
- clear_bit(FIMC_IS_SENSOR_BACK_NOWAIT_STOP, &device->state);
- clear_bit(FIMC_IS_SENSOR_WAIT_STREAMING, &device->state);
+ /* 3. state init */
+ memset(&device->state, 0, sizeof(device->state));
atomic_set(&device->group_open_cnt, 0);
clear_bit(FIMC_IS_SENSOR_BACK_START, &device->state);
clear_bit(FIMC_IS_SENSOR_OTF_OUTPUT, &device->state);
clear_bit(FIMC_IS_SENSOR_WAIT_STREAMING, &device->state);
+ clear_bit(SENSOR_MODULE_GOT_INTO_TROUBLE, &device->state);
set_bit(FIMC_IS_SENSOR_BACK_NOWAIT_STOP, &device->state);
-#ifdef CONFIG_SECURE_CAMERA_USE
+#if defined(SECURE_CAMERA_IRIS)
device->smc_state = FIMC_IS_SENSOR_SMC_INIT;
#endif
u32 video_id)
{
int ret = 0;
-#if defined(CONFIG_SECURE_CAMERA_USE)
+#if defined(SECURE_CAMERA_IRIS)
int ret_smc = 0;
#endif
struct fimc_is_core *core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
struct v4l2_subdev *subdev_csi;
struct v4l2_subdev *subdev_flite;
struct fimc_is_module_enum *module_enum, *module;
-#if !defined(ENABLE_IS_CORE) && !defined(CONFIG_VENDER_PSV)
+#if !defined(ENABLE_IS_CORE)
struct fimc_is_device_sensor_peri *sensor_peri;
#endif
struct fimc_is_group *group;
case SENSOR_POSITION_FRONT:
sensor_id = priv->front_sensor_id;
break;
-#ifdef CONFIG_SECURE_CAMERA_USE
+ case SENSOR_POSITION_REAR2:
+ sensor_id = priv->rear2_sensor_id;
+ break;
+ case SENSOR_POSITION_FRONT2:
+ sensor_id = priv->front2_sensor_id;
+ break;
+ case SENSOR_POSITION_REAR3:
+ sensor_id = priv->rear3_sensor_id;
+ break;
+#if defined(SECURE_CAMERA_IRIS)
case SENSOR_POSITION_SECURE:
sensor_id = priv->secure_sensor_id;
break;
#endif
- case SENSOR_POSITION_REAR2:
- sensor_id = priv->rear_second_sensor_id;
- break;
-#ifdef CONFIG_VENDER_PSV
case SENSOR_POSITION_VIRTUAL:
sensor_id = SENSOR_NAME_VIRTUAL;
break;
-#endif
default:
merr("invalid module position(%d)", device, input);
ret = -EINVAL;
module->ext.sensor_con.csi_ch = device->pdata->csi_ch;
module->ext.sensor_con.csi_ch |= 0x0100;
-#if !defined(ENABLE_IS_CORE) && !defined(CONFIG_VENDER_PSV)
+#if !defined(ENABLE_IS_CORE)
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
/* set cis data */
{
sensor_peri->ois = NULL;
}
+ /* set mcu data */
+ if (device->mcu && module->ext.mcu_con.product_name == device->mcu->id) {
+ u32 i2c_channel = module->ext.mcu_con.peri_setting.i2c.channel;
+ sensor_peri->subdev_mcu = device->subdev_mcu;
+ sensor_peri->mcu = device->mcu;
+ sensor_peri->mcu->sensor_peri = sensor_peri;
+ if (device->mcu->ois) {
+ sensor_peri->mcu->ois = device->mcu->ois;
+ sensor_peri->mcu->subdev_ois = device->subdev_mcu;
+ sensor_peri->mcu->ois->sensor_peri = sensor_peri;
+ }
+ if (device->mcu->aperture) {
+ sensor_peri->mcu->aperture = device->mcu->aperture;
+ sensor_peri->mcu->subdev_aperture = device->mcu->subdev_aperture;
+ sensor_peri->mcu->aperture->sensor_peri = sensor_peri;
+ }
+
+ if (i2c_channel < SENSOR_CONTROL_I2C_MAX && device->mcu->ois)
+ sensor_peri->mcu->ois->i2c_lock = &core->i2c_lock[i2c_channel];
+ else
+ mwarn("wrong mcu i2c_channel(%d)", device, i2c_channel);
+
+ //need to be checked for mcu available.
+ if (device->mcu->ois) {
+ set_bit(FIMC_IS_SENSOR_OIS_AVAILABLE, &sensor_peri->peri_state);
+ }
+ if (device->mcu->aperture) {
+ set_bit(FIMC_IS_SENSOR_APERTURE_AVAILABLE, &sensor_peri->peri_state);
+ }
+ info("%s[%d] enable mcu i2c client. position = %d\n",
+ __func__, __LINE__, core->current_position);
+ } else {
+ sensor_peri->subdev_mcu = NULL;
+ sensor_peri->mcu = NULL;
+ }
+
/* set aperture data */
if (device->aperture && module->ext.aperture_con.product_name == device->aperture->id) {
u32 i2c_channel = module->ext.aperture_con.peri_setting.i2c.channel;
sensor_peri->aperture = NULL;
}
+ /* set eeprom data */
+ if (device->eeprom && module->ext.eeprom_con.product_name == device->eeprom->id) {
+ u32 i2c_channel = module->ext.eeprom_con.peri_setting.i2c.channel;
+ sensor_peri->subdev_eeprom = device->subdev_eeprom;
+ sensor_peri->eeprom = device->eeprom;
+ sensor_peri->eeprom->sensor_peri = sensor_peri;
+ if (i2c_channel < SENSOR_CONTROL_I2C_MAX)
+ sensor_peri->eeprom->i2c_lock = &core->i2c_lock[i2c_channel];
+ else
+ mwarn("wrong eeprom i2c_channel(%d)", device, i2c_channel);
+
+ if (sensor_peri->eeprom)
+ set_bit(FIMC_IS_SENSOR_EEPROM_AVAILABLE, &sensor_peri->peri_state);
+
+ info("%s[%d] enable eeprom i2c client. position = %d\n",
+ __func__, __LINE__, core->current_position);
+ } else {
+ sensor_peri->subdev_eeprom = NULL;
+ sensor_peri->eeprom = NULL;
+ }
+
fimc_is_sensor_peri_init_work(sensor_peri);
#endif
else
set_bit(FIMC_IS_SENSOR_STAND_ALONE, &device->state);
-#if defined(CONFIG_SECURE_CAMERA_USE)
+#if defined(SECURE_CAMERA_IRIS)
ret = fimc_is_devicemgr_binding(device->devicemgr, device, group->device, FIMC_IS_DEVICE_SENSOR);
if (ret) {
merr("fimc_is_devicemgr_binding is fail", device);
goto p_err;
}
- if (device->pdata->scenario == SENSOR_SCENARIO_SECURE) {
-#if defined(NOT_SEPERATED_SYSREG)
- mdbgd_sensor("secure state: %lu\n", device, core->secure_state);
-
- mutex_lock(&core->secure_state_lock);
- if (core->secure_state == FIMC_IS_STATE_UNSECURE) {
- core->secure_state = FIMC_IS_STATE_SECURING;
- ret = fimc_is_hw_ischain_cfg(device->ischain);
- if (ret) {
- core->secure_state = FIMC_IS_STATE_UNSECURE;
- mutex_unlock(&core->secure_state_lock);
- merr("failed to configure ischain: (%d)",
- device, ret);
- goto p_err;
- }
- ret = exynos_smc(MC_SECURE_CAMERA_SYSREG_PROT, 1, 0, 0);
- if (ret) {
- core->secure_state = FIMC_IS_STATE_UNSECURE;
- mutex_unlock(&core->secure_state_lock);
- merr("[SMC] failed to secure fimc-is: (%d)",
- device, ret);
- goto p_err;
- } else {
- core->secure_state = FIMC_IS_STATE_SECURED;
- minfo("[SMC] fimc-is was secured\n", device);
- }
- }
- mutex_unlock(&core->secure_state_lock);
-#endif
-
-#if defined(SECURE_CAMERA_EMULATE)
- ret = exynos_smc(SMC_SECCAM_PREPARE, 0, 0, 0);
-#else
- ret = exynos_smc(MC_SECURE_CAMERA_PREPARE, 0, 0, 0);
-#endif
- if(ret != 0) {
- merr("[SMC] MC_SECURE_CAMERA_PREPARE fail(%d)\n", device, ret);
- goto p_err;
- } else {
- minfo("[SMC] Call MC_SECURE_CAMERA_PREPARE ret(%d) / smc_state(%d->%d)\n",
- device, ret, device->smc_state, FIMC_IS_SENSOR_SMC_PREPARE);
- device->smc_state = FIMC_IS_SENSOR_SMC_PREPARE;
- }
- }
+ ret = fimc_is_secure_func(core, device, FIMC_IS_SECURE_CAMERA_IRIS,
+ device->pdata->scenario, SMC_SECCAM_PREPARE);
+ if (ret)
+ goto p_err;
#endif
#ifdef ENABLE_INIT_AWB
goto p_err;
}
-#if !defined(CONFIG_SECURE_CAMERA_USE)
+#if !defined(CONFIG_SECURE_CAMERA_USE) || defined(SECURE_CAMERA_FACE)
ret = fimc_is_devicemgr_binding(device->devicemgr, device, group->device, FIMC_IS_DEVICE_SENSOR);
if (ret) {
merr("fimc_is_devicemgr_binding is fail", device);
set_bit(FIMC_IS_SENSOR_S_INPUT, &device->state);
p_err:
-#if defined(CONFIG_SECURE_CAMERA_USE)
- if (ret && (device->pdata->scenario == SENSOR_SCENARIO_SECURE)) {
- if (device->smc_state == FIMC_IS_SENSOR_SMC_PREPARE) {
-#if defined(SECURE_CAMERA_EMULATE)
- ret_smc = exynos_smc(SMC_SECCAM_UNPREPARE, 0, 0, 0);
-#else
- ret_smc = exynos_smc(MC_SECURE_CAMERA_UNPREPARE, 0, 0, 0);
-#endif
- if (ret_smc != 0) {
- merr("[SMC] MC_SECURE_CAMERA_UNPREPARE fail(%d)\n", device, ret);
- } else {
- minfo("[SMC] Call MC_SECURE_CAMERA_UNPREPARE ret(%d) / smc_state(%d->%d)\n",
- device, ret, device->smc_state, FIMC_IS_SENSOR_SMC_UNPREPARE);
- device->smc_state = FIMC_IS_SENSOR_SMC_UNPREPARE;
- }
- }
-#if defined(NOT_SEPERATED_SYSREG)
- mutex_lock(&core->secure_state_lock);
- if (core->secure_state == FIMC_IS_STATE_SECURED) {
- mdbgd_sensor("configure ischain to unsecure\n", device);
-
- ret_smc = exynos_smc(MC_SECURE_CAMERA_SYSREG_PROT, 0, 0, 0);
- if (ret_smc) {
- merr("[SMC] failed to unsecure fimc-is: (%d)",
- device, ret);
- } else {
- core->secure_state = FIMC_IS_STATE_UNSECURE;
- minfo("[SMC] be unsecured fimc-is\n", device);
- }
- }
- mutex_unlock(&core->secure_state_lock);
-#endif
- }
+#if defined(SECURE_CAMERA_IRIS)
+ if (ret)
+ ret = fimc_is_secure_func(NULL, device, FIMC_IS_SECURE_CAMERA_IRIS,
+ device->pdata->scenario, SMC_SECCAM_UNPREPARE);
#endif
minfo("[SEN:D] %s(%d, %d):%d\n", device, __func__, input, scenario, ret);
struct v4l2_subdev *subdev_flite;
struct fimc_is_groupmgr *groupmgr;
struct fimc_is_group *group;
+#if defined(SECURE_CAMERA_FACE)
+ struct fimc_is_core *core;
+#endif
FIMC_BUG(!device);
goto p_err;
}
+ ret = v4l2_subdev_call(device->subdev_module, video,
+ s_routing, 0, 0, 1);
+ if (ret) {
+ merr("failed at s_routing for module(%d)", device, ret);
+ goto p_err;
+ }
+
if (subdev_flite) {
ret = v4l2_subdev_call(subdev_flite, video, s_stream, enable);
if (ret) {
goto p_err;
}
+#if defined(SECURE_CAMERA_FACE)
+ core = device->private_data;
+ if (!core) {
+ merr("core is NULL", device);
+ return -EINVAL;
+ }
+
+ ret = fimc_is_secure_func(core, device, FIMC_IS_SECURE_CAMERA_FACE,
+ core->scenario, SMC_SECCAM_PREPARE);
+ if (ret)
+ goto p_err;
+#endif
ret = fimc_is_devicemgr_start(device->devicemgr, (void *)device, FIMC_IS_DEVICE_SENSOR);
if (ret) {
merr("fimc_is_group_start is fail(%d)", device, ret);
set_bit(FIMC_IS_SENSOR_BACK_START, &device->state);
p_err:
+#if defined(SECURE_CAMERA_FACE)
+ if (ret)
+ ret = fimc_is_secure_func(core, NULL, FIMC_IS_SECURE_CAMERA_FACE,
+ core->scenario, SMC_SECCAM_UNPREPARE);
+#endif
+
minfo("[SEN:D] %s(%dx%d, %d)\n", device, __func__,
device->image.window.width, device->image.window.height, ret);
return ret;
if (ret)
merr("fimc_is_devicemgr_stop is fail(%d)", device, ret);
+ ret = v4l2_subdev_call(device->subdev_module, video,
+ s_routing, 0, 0, 0);
+ if (ret)
+ merr("failed at s_routing for module(%d)", device, ret);
+
clear_bit(FIMC_IS_SENSOR_S_CONFIG, &device->state);
clear_bit(FIMC_IS_SENSOR_BACK_START, &device->state);
set_bit(FIMC_IS_GROUP_REQUEST_FSTOP, &group->state);
ret = fimc_is_group_stop(device->groupmgr, group);
- if (ret)
+ if (ret == -EPERM) {
+ merr("group is already stop(%d), skip start sequence", device, ret);
+ goto p_skip;
+ } else if (ret != 0) {
merr("fimc_is_group_stop is fail(%d)", device, ret);
+ }
child = group;
while (child) {
mginfo("%s() done", device, group, __func__);
+p_skip:
return ret;
}
core = (struct fimc_is_core *)device->private_data;
mutex_lock(&device->mlock_state);
+
+ if (test_and_clear_bit(SENSOR_MODULE_GOT_INTO_TROUBLE, &device->state)) {
+ mwarn("sensor module have got into trouble", device);
+ goto reset_the_others;
+ }
+
if (!test_bit(FIMC_IS_SENSOR_FRONT_START, &device->state)) {
mwarn("already front stop", device);
- goto p_err;
+ goto already_stopped;
}
subdev_csi = device->subdev_csi;
set_bit(FIMC_IS_SENSOR_BACK_NOWAIT_STOP, &device->state);
clear_bit(FIMC_IS_SENSOR_FRONT_START, &device->state);
+reset_the_others:
if (device->use_standby)
fimc_is_sensor_standby_flush(device);
}
#ifdef ENABLE_DTP
- if (device->dtp_check)
+ if (device->dtp_check) {
device->dtp_check = false;
+ if (timer_pending(&device->dtp_timer))
+ del_timer_sync(&device->dtp_timer);
+ }
#endif
-p_err:
+already_stopped:
minfo("[FRT:D] %s():%d\n", device, __func__, ret);
+
mutex_unlock(&device->mlock_state);
+
return ret;
}
struct fimc_is_device_sensor *device;
struct fimc_is_module_enum *module;
struct v4l2_subdev *subdev_csi;
-#if defined(CONFIG_SECURE_CAMERA_USE) || defined(CONFIG_PM_DEVFREQ)
+#if defined(CONFIG_PM_DEVFREQ)
struct fimc_is_core *core;
-#if defined(NOT_SEPERATED_SYSREG)
- struct fimc_is_device_csi *csi;
- struct fimc_is_device_sensor *extra_device;
- struct fimc_is_device_csi *extra_csi;
- int i;
-#endif
#endif
device = NULL;
return -EINVAL;
}
-#if defined(CONFIG_SECURE_CAMERA_USE) || defined(CONFIG_PM_DEVFREQ)
+#if defined(CONFIG_PM_DEVFREQ)
core = device->private_data;
#endif
ret = fimc_is_sensor_runtime_suspend_pre(dev);
if (!subdev_csi)
mwarn("subdev_csi is NULL", device);
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
- core = device->private_data;
- csi = v4l2_get_subdevdata(device->subdev_csi);
-
- if (csi && csi->extra_phy) {
- csi->extra_phy_off = 1;
-
- for (i = 0; i < FIMC_IS_SENSOR_COUNT; i++) {
- extra_device = &core->sensor[i];
- if (!extra_device)
- continue;
-
- extra_csi = v4l2_get_subdevdata(extra_device->subdev_csi);
- if (extra_csi && (csi->extra_phy == extra_csi->phy)) {
- csi->extra_phy_off =
- !test_bit(CSIS_START_STREAM, &extra_csi->state);
- break;
- }
- }
- }
-
- if (!(core->secure_state == FIMC_IS_STATE_SECURED))
-#endif
- {
- ret = v4l2_subdev_call(subdev_csi, core, s_power, 0);
- if (ret)
- mwarn("v4l2_csi_call(s_power) is fail(%d)", device, ret);
- }
+ ret = v4l2_subdev_call(subdev_csi, core, s_power, 0);
+ if (ret)
+ mwarn("v4l2_csi_call(s_power) is fail(%d)", device, ret);
ret = fimc_is_sensor_g_module(device, &module);
if (ret) {
device->subdev_module = NULL;
p_err:
-#if defined(CONFIG_SECURE_CAMERA_USE)
- if (device->pdata->scenario == SENSOR_SCENARIO_SECURE) {
- if (device->smc_state == FIMC_IS_SENSOR_SMC_PREPARE) {
-#if defined(SECURE_CAMERA_EMULATE)
- ret = exynos_smc(SMC_SECCAM_UNPREPARE, 0, 0, 0);
-#else
- ret = exynos_smc(MC_SECURE_CAMERA_UNPREPARE, 0, 0, 0);
-#endif
- if (ret != 0) {
- merr("[SMC] MC_SECURE_CAMERA_UNPREPARE fail(%d)\n", device, ret);
- } else {
- minfo("[SMC] Call MC_SECURE_CAMERA_UNPREPARE ret(%d) / smc_state(%d->%d)\n",
- device, ret, device->smc_state, FIMC_IS_SENSOR_SMC_UNPREPARE);
- device->smc_state = FIMC_IS_SENSOR_SMC_UNPREPARE;
- }
- }
-#if defined(NOT_SEPERATED_SYSREG)
- mutex_lock(&core->secure_state_lock);
- if (core->secure_state == FIMC_IS_STATE_SECURED) {
- mdbgd_sensor("configure ischain to unsecure\n", device);
-
- ret = exynos_smc(MC_SECURE_CAMERA_SYSREG_PROT, 0, 0, 0);
- if (ret) {
- merr("[SMC] failed to unsecure fimc-is: (%d)",
- device, ret);
- } else {
- core->secure_state = FIMC_IS_STATE_UNSECURE;
- minfo("[SMC] be unsecured fimc-is\n", device);
- }
- }
- mutex_unlock(&core->secure_state_lock);
-#endif
- }
+#if defined(SECURE_CAMERA_IRIS)
+ ret = fimc_is_secure_func(NULL, device, FIMC_IS_SECURE_CAMERA_IRIS,
+ device->pdata->scenario, SMC_SECCAM_UNPREPARE);
#endif
#if defined(CONFIG_PM_DEVFREQ)
struct platform_device *pdev = to_platform_device(dev);
struct fimc_is_device_sensor *device;
struct v4l2_subdev *subdev_csi;
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
- struct fimc_is_core *core;
-#endif
device = NULL;
goto p_err;
}
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
- core = device->private_data;
- if (!(core->secure_state == FIMC_IS_STATE_SECURED))
-#endif
- {
- ret = v4l2_subdev_call(subdev_csi, core, s_power, 1);
- if (ret) {
- merr("v4l2_csi_call(s_power) is fail(%d)", device, ret);
- goto p_err;
- }
+ ret = v4l2_subdev_call(subdev_csi, core, s_power, 1);
+ if (ret) {
+ merr("v4l2_csi_call(s_power) is fail(%d)", device, ret);
+ goto p_err;
}
/* configuration clock control */
FIMC_BUG(!GET_VIDEO(sensor->vctx));
/* get the stream id */
- if (sensor->instance == 3) {
- /*
- * HACK: sensor stand alone such as secure camera
- * TODO: A ischain should not be used at sensor stand alone scenario.
- */
- ischain = &core->ischain[3];
- stream = 3;
- } else {
- for (stream = 0; stream < FIMC_IS_STREAM_COUNT; ++stream) {
- ischain = &core->ischain[stream];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &ischain->state))
- break;
- }
+ for (stream = 0; stream < FIMC_IS_STREAM_COUNT; ++stream) {
+ ischain = &core->ischain[stream];
+ if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &ischain->state))
+ break;
}
FIMC_BUG(stream >= FIMC_IS_STREAM_COUNT);
group, frame, frame->index, child_group ? "OTF" : "M2M");
/* OTF */
- if (child_group) {
+ /* FIMC_IS_SENSOR_OTF_OUTPUT bit needs to check also.
+ * because this bit can be cleared for not operate child_group_shot at remosaic sensor mode
+ */
+ if (child_group && test_bit(FIMC_IS_SENSOR_OTF_OUTPUT, &group->device->sensor->state)) {
child_group->shot_callback(child_group->device, frame);
/* M2M */
} else {
struct device_node *dvfs_np = NULL;
struct device_node *vender_np = NULL;
struct device_node *np;
+ u32 mem_info[2];
FIMC_BUG(!pdev);
of_property_read_u32(np, "chain_config", &core->chain_config);
probe_info("FIMC-IS chain configuration: %d\n", core->chain_config);
+ ret = of_property_read_u32_array(np, "secure_mem_info", mem_info, 2);
+ if (ret) {
+ core->secure_mem_info[0] = 0;
+ core->secure_mem_info[1] = 0;
+ } else {
+ core->secure_mem_info[0] = mem_info[0];
+ core->secure_mem_info[1] = mem_info[1];
+ }
+ probe_info("ret(%d) secure_mem_info(%#08lx, %#08lx)", ret,
+ core->secure_mem_info[0], core->secure_mem_info[1]);
+
+ ret = of_property_read_u32_array(np, "non_secure_mem_info", mem_info, 2);
+ if (ret) {
+ core->non_secure_mem_info[0] = 0;
+ core->non_secure_mem_info[1] = 0;
+ } else {
+ core->non_secure_mem_info[0] = mem_info[0];
+ core->non_secure_mem_info[1] = mem_info[1];
+ }
+ probe_info("ret(%d) non_secure_mem_info(%#08lx, %#08lx)", ret,
+ core->non_secure_mem_info[0], core->non_secure_mem_info[1]);
+
vender_np = of_find_node_by_name(np, "vender");
if (vender_np) {
ret = fimc_is_vender_dt(vender_np);
goto err_read_csi_ch;
}
+ ret = of_property_read_u32(dnode, "csi_mux", &pdata->csi_mux);
+ if (ret) {
+ probe_info("skip phy-csi mux data read (%d)", ret);
+ }
+
+ ret = of_property_read_u32(dnode, "multi_ch", &pdata->multi_ch);
+ if (ret) {
+ probe_info("skip multi_ch bool data read (%d)", ret);
+ }
+
+ ret = of_property_read_u32(dnode, "camif_mux_val", &pdata->camif_mux_val);
+ if (ret)
+ probe_info("skip camif sysreg mux default value read (%d)", ret);
+
elems = of_property_count_u32_elems(dnode, "dma_ch");
if (elems >= CSI_VIRTUAL_CH_MAX) {
if (elems % CSI_VIRTUAL_CH_MAX) {
return 0;
}
+static int parse_mcu_data(struct exynos_platform_fimc_is_module *pdata, struct device_node *dnode)
+{
+ u32 temp;
+ char *pprop;
+
+ DT_READ_U32(dnode, "product_name", pdata->mcu_product_name);
+ DT_READ_U32(dnode, "i2c_addr", pdata->mcu_i2c_addr);
+ DT_READ_U32(dnode, "i2c_ch", pdata->mcu_i2c_ch);
+
+ return 0;
+}
+
static int parse_aperture_data(struct exynos_platform_fimc_is_module *pdata, struct device_node *dnode)
{
u32 temp;
return 0;
}
+static int parse_eeprom_data(struct exynos_platform_fimc_is_module *pdata, struct device_node *dnode)
+{
+ u32 temp;
+ char *pprop;
+
+ DT_READ_U32(dnode, "product_name", pdata->eeprom_product_name);
+ DT_READ_U32(dnode, "i2c_addr", pdata->eeprom_i2c_addr);
+ DT_READ_U32(dnode, "i2c_ch", pdata->eeprom_i2c_ch);
+
+ return 0;
+}
+
static int parse_power_seq_data(struct exynos_platform_fimc_is_module *pdata, struct device_node *dnode)
{
u32 temp;
return ret;
}
-/* Deprecated. Use fimc_is_module_parse_dt */
-int fimc_is_sensor_module_parse_dt(struct platform_device *pdev,
- fimc_is_moudle_dt_callback module_callback)
+int fimc_is_module_parse_dt(struct device *dev,
+ fimc_is_moudle_callback module_callback)
{
int ret = 0;
struct exynos_platform_fimc_is_module *pdata;
struct device_node *flash_np;
struct device_node *preprocessor_np;
struct device_node *ois_np;
+ struct device_node *mcu_np;
struct device_node *aperture_np;
struct device_node *power_np;
struct device_node *internal_vc_np;
- struct device *dev;
+ struct device_node *eeprom_np;
- FIMC_BUG(!pdev);
- FIMC_BUG(!pdev->dev.of_node);
+ FIMC_BUG(!dev);
+ FIMC_BUG(!dev->of_node);
FIMC_BUG(!module_callback);
- dev = &pdev->dev;
dnode = dev->of_node;
-
pdata = kzalloc(sizeof(struct exynos_platform_fimc_is_module), GFP_KERNEL);
if (!pdata) {
probe_err("%s: no memory for platform data", __func__);
}
ret = of_property_read_u32(dnode, "sensor_i2c_ch", &pdata->sensor_i2c_ch);
- if (ret)
+ if (ret) {
probe_info("i2c_ch dt parsing skipped\n");
+ }
ret = of_property_read_u32(dnode, "sensor_i2c_addr", &pdata->sensor_i2c_addr);
- if (ret)
+ if (ret) {
probe_info("i2c_addr dt parsing skipped\n");
+ }
ret = of_property_read_u32(dnode, "position", &pdata->position);
if (ret) {
goto p_err;
}
- af_np = of_find_node_by_name(dnode, "af");
- if (!af_np) {
- pdata->af_product_name = ACTUATOR_NAME_NOTHING;
- } else {
- parse_af_data(pdata, af_np);
- }
-
- flash_np = of_find_node_by_name(dnode, "flash");
- if (!flash_np) {
- pdata->flash_product_name = FLADRV_NAME_NOTHING;
- } else {
- parse_flash_data(pdata, flash_np);
- }
-
- preprocessor_np = of_find_node_by_name(dnode, "preprocessor");
- if (!preprocessor_np) {
- pdata->preprocessor_product_name = PREPROCESSOR_NAME_NOTHING;
- } else {
- parse_preprocessor_data(pdata, preprocessor_np);
- }
-
- ois_np = of_find_node_by_name(dnode, "ois");
- if (!ois_np) {
- pdata->ois_product_name = OIS_NAME_NOTHING;
- } else {
- parse_ois_data(pdata, ois_np);
- }
-
- aperture_np = of_find_node_by_name(dnode, "aperture");
- if (!aperture_np) {
- pdata->aperture_product_name = APERTURE_NAME_NOTHING;
- } else {
- parse_aperture_data(pdata, aperture_np);
- }
-
- pdata->power_seq_dt = of_property_read_bool(dnode, "use_power_seq");
- if(pdata->power_seq_dt == true) {
- power_np = of_find_node_by_name(dnode, "power_seq");
- if (!power_np) {
- probe_err("power sequence is not declared to DT");
- goto p_err;
- } else {
- parse_power_seq_data(pdata, power_np);
- }
- } else {
- ret = module_callback(pdev, pdata);
- if (ret) {
- probe_err("sensor dt callback is fail(%d)", ret);
- goto p_err;
- }
- }
-
- pdata->pinctrl = devm_pinctrl_get(dev);
- if (IS_ERR(pdata->pinctrl)) {
- probe_err("devm_pinctrl_get is fail");
- goto p_err;
- }
-
- ret = get_pin_lookup_state(pdata->pinctrl, pdata->pin_ctrls);
+ ret = of_property_read_u32(dnode, "rom_id", &pdata->rom_id);
if (ret) {
- probe_err("get_pin_lookup_state is fail(%d)", ret);
- goto p_err;
+ probe_info("rom_id dt parsing skipped\n");
+ pdata->rom_id = ROM_ID_NOTHING;
}
- internal_vc_np = of_find_node_by_name(dnode, "internal_vc");
- if (internal_vc_np)
- parse_internal_vc_data(pdata, internal_vc_np);
-
- dev->platform_data = pdata;
-
- return ret;
-
-p_err:
- kfree(pdata);
- return ret;
-}
-
-/* New function for module parse dt. Use this instead of fimc_is_sensor_module_parse_dt */
-int fimc_is_module_parse_dt(struct device *dev,
- fimc_is_moudle_callback module_callback)
-{
- int ret = 0;
- struct exynos_platform_fimc_is_module *pdata;
- struct device_node *dnode;
- struct device_node *af_np;
- struct device_node *flash_np;
- struct device_node *preprocessor_np;
- struct device_node *ois_np;
- struct device_node *aperture_np;
- struct device_node *power_np;
- struct device_node *internal_vc_np;
-
- FIMC_BUG(!dev);
- FIMC_BUG(!dev->of_node);
- FIMC_BUG(!module_callback);
-
- dnode = dev->of_node;
- pdata = kzalloc(sizeof(struct exynos_platform_fimc_is_module), GFP_KERNEL);
- if (!pdata) {
- probe_err("%s: no memory for platform data", __func__);
- return -ENOMEM;
- }
-
- pdata->gpio_cfg = exynos_fimc_is_module_pins_cfg;
- pdata->gpio_dbg = exynos_fimc_is_module_pins_dbg;
-
- ret = of_property_read_u32(dnode, "id", &pdata->id);
+ ret = of_property_read_u32(dnode, "rom_type", &pdata->rom_type);
if (ret) {
- probe_err("id read is fail(%d)", ret);
- goto p_err;
+ probe_info("rom_type dt parsing skipped\n");
+ pdata->rom_type = 0;
}
- ret = of_property_read_u32(dnode, "mclk_ch", &pdata->mclk_ch);
+ ret = of_property_read_u32(dnode, "rom_cal_index", &pdata->rom_cal_index);
if (ret) {
- probe_err("mclk_ch read is fail(%d)", ret);
- goto p_err;
- }
-
- ret = of_property_read_u32(dnode, "sensor_i2c_ch", &pdata->sensor_i2c_ch);
- if (ret) {
- probe_info("i2c_ch dt parsing skipped\n");
- }
-
- ret = of_property_read_u32(dnode, "sensor_i2c_addr", &pdata->sensor_i2c_addr);
- if (ret) {
- probe_info("i2c_addr dt parsing skipped\n");
- }
-
- ret = of_property_read_u32(dnode, "position", &pdata->position);
- if (ret) {
- probe_err("position read is fail(%d)", ret);
- goto p_err;
+ probe_info("rom_cal_index dt parsing skipped\n");
+ pdata->rom_cal_index = 0;
}
af_np = of_find_node_by_name(dnode, "af");
parse_ois_data(pdata, ois_np);
}
+ mcu_np = of_find_node_by_name(dnode, "mcu");
+ if (!mcu_np) {
+ pdata->mcu_product_name = MCU_NAME_NOTHING;
+ } else {
+ parse_mcu_data(pdata, mcu_np);
+ }
+
aperture_np = of_find_node_by_name(dnode, "aperture");
if (!aperture_np) {
pdata->aperture_product_name = APERTURE_NAME_NOTHING;
parse_aperture_data(pdata, aperture_np);
}
+ eeprom_np = of_find_node_by_name(dnode, "eeprom");
+ if (!eeprom_np)
+ pdata->eeprom_product_name = EEPROM_NAME_NOTHING;
+ else
+ parse_eeprom_data(pdata, eeprom_np);
+
pdata->power_seq_dt = of_property_read_bool(dnode, "use_power_seq");
if(pdata->power_seq_dt == true) {
power_np = of_find_node_by_name(dnode, "power_seq");
int fimc_is_module_parse_dt(struct device *dev,
fimc_is_moudle_callback callback);
int fimc_is_spi_parse_dt(struct fimc_is_spi *spi);
-int fimc_is_power_setpin(struct device *dev, int position, int sensor_id);
#endif
void *subdev; /* fimc_is_subdev */
/* group leader use */
- struct camera2_shot *shot;
struct camera2_shot_ext *shot_ext;
- ulong kvaddr_shot;
- u32 dvaddr_shot;
+ struct camera2_shot *shot;
size_t shot_size;
/* stream use */
/* common use */
u32 planes; /* total planes include multi-buffers */
- u32 dvaddr_buffer[FIMC_IS_MAX_PLANES];
- ulong kvaddr_buffer[FIMC_IS_MAX_PLANES];
+ dma_addr_t dvaddr_buffer[FIMC_IS_MAX_PLANES];
+ ulong kvaddr_buffer[FIMC_IS_MAX_PLANES];
/*
* target address for capture node
u32 type;
unsigned long core_flag;
atomic_t shot_done_flag;
+#else
+ /* group leader use */
+ dma_addr_t dvaddr_shot;
#endif
#ifdef ENABLE_SYNC_REPROCESSING
#include <linux/videodev2_exynos_camera.h>
#include <linux/v4l2-mediabus.h>
#include <linux/bug.h>
+#include <soc/samsung/tmu.h>
#include "fimc-is-type.h"
#include "fimc-is-core.h"
#include "fimc-is-debug.h"
#include "fimc-is-hw.h"
#include "fimc-is-vender.h"
-#if defined(CONFIG_CAMERA_PDP)
+#if defined(CONFIG_CAMERA_PDP) || defined(CONFIG_CAMERA_EEPROM_SELECT)
#include "fimc-is-interface-sensor.h"
#include "fimc-is-device-sensor-peri.h"
#endif
return ret;
}
-int fimc_is_gframe_cancel(struct fimc_is_groupmgr *groupmgr,
- struct fimc_is_group *group, u32 target_fcount)
-{
- int ret = -EINVAL;
- struct fimc_is_group_framemgr *gframemgr;
- struct fimc_is_group_frame *gframe, *temp;
- ulong flags;
-
- FIMC_BUG(!groupmgr);
- FIMC_BUG(!group);
- FIMC_BUG(group->instance >= FIMC_IS_STREAM_COUNT);
-
- gframemgr = &groupmgr->gframemgr[group->instance];
-
- spin_lock_irqsave(&gframemgr->gframe_slock, flags);
-
- list_for_each_entry_safe(gframe, temp, &group->gframe_head, list) {
- if (gframe->fcount == target_fcount) {
- list_del(&gframe->list);
- group->gframe_cnt--;
- mwarn("gframe%d is cancelled", group, target_fcount);
- fimc_is_gframe_s_free(gframemgr, gframe);
- ret = 0;
- break;
- }
- }
-
- spin_unlock_irqrestore(&gframemgr->gframe_slock, flags);
-
- return ret;
-}
-
void * fimc_is_gframe_rewind(struct fimc_is_groupmgr *groupmgr,
struct fimc_is_group *group, u32 target_fcount)
{
#endif
}
} while (sub_frame && flush);
+
+ if (sub_vctx->video->try_smp)
+ up(&sub_vctx->video->smp_multi_input);
}
group = group->child;
return;
#ifdef DEBUG_FLASH
- if (ldr_frame->shot->dm.flash.firingStable != group->flash.firingStable) {
- group->flash.firingStable = ldr_frame->shot->dm.flash.firingStable;
- info("flash stable : %d(%d)\n", group->flash.firingStable, ldr_frame->fcount);
+ if (ldr_frame->shot->dm.flash.vendor_firingStable != group->flash.vendor_firingStable) {
+ group->flash.vendor_firingStable = ldr_frame->shot->dm.flash.vendor_firingStable;
+ info("flash stable : %d(%d)\n", group->flash.vendor_firingStable, ldr_frame->fcount);
}
- if (ldr_frame->shot->dm.flash.flashReady!= group->flash.flashReady) {
- group->flash.flashReady = ldr_frame->shot->dm.flash.flashReady;
- info("flash ready : %d(%d)\n", group->flash.flashReady, ldr_frame->fcount);
+ if (ldr_frame->shot->dm.flash.vendor_flashReady!= group->flash.vendor_flashReady) {
+ group->flash.vendor_flashReady = ldr_frame->shot->dm.flash.vendor_flashReady;
+ info("flash ready : %d(%d)\n", group->flash.vendor_flashReady, ldr_frame->fcount);
}
- if (ldr_frame->shot->dm.flash.flashOffReady!= group->flash.flashOffReady) {
- group->flash.flashOffReady = ldr_frame->shot->dm.flash.flashOffReady;
- info("flash off : %d(%d)\n", group->flash.flashOffReady, ldr_frame->fcount);
+ if (ldr_frame->shot->dm.flash.vendor_flashOffReady!= group->flash.vendor_flashOffReady) {
+ group->flash.vendor_flashOffReady = ldr_frame->shot->dm.flash.vendor_flashOffReady;
+ info("flash off : %d(%d)\n", group->flash.vendor_flashOffReady, ldr_frame->fcount);
}
#endif
}
group->skip_shots = group->asyn_shots;
}
#else
- if (ex_mode == EX_DUALFPS || framerate > 240) {
+ if (ex_mode == EX_DUALFPS_960 || ex_mode == EX_DUALFPS_480 || framerate > 240) {
group->asyn_shots = MIN_OF_ASYNC_SHOTS + 1;
group->sync_shots = MIN_OF_SYNC_SHOTS;
} else {
wq_id = (group->id == GROUP_ID_ISP0) ? WORK_I0P_FDONE: WORK_I1P_FDONE;
break;
case ENTRY_MEXC:
- wq_id = WORK_ME0C_FDONE;
+ if (group->id == GROUP_ID_3AA0 || group->id == GROUP_ID_ISP0)
+ wq_id = WORK_ME0C_FDONE;
+ else
+ wq_id = WORK_ME1C_FDONE;
break;
case ENTRY_DC1S:
wq_id = WORK_DC1S_FDONE;
if (!test_bit(FIMC_IS_GROUP_START, &group->state) &&
!test_bit(FIMC_IS_GROUP_START, &group->head->state)) {
mwarn("already group stop", group);
- goto p_err;
+ return -EPERM;
}
/* force stop set if only HEAD group OTF input */
}
#endif
+#ifdef ENABLE_FAST_AF_TRIGGER
+ /* for reduce AF control delay,
+ * it need to copy "afMode & afTrigger" in queued frame
+ * at only AF mode == CONTINUOUS_PICTURE or CONTINUOUS_VIDEO
+ * AF trigger == START
+ */
+ if (test_bit(FIMC_IS_GROUP_OTF_INPUT, &group->state)) {
+ struct fimc_is_frame *prev;
+
+ if ((frame->shot->ctl.aa.afMode == AA_AFMODE_CONTINUOUS_VIDEO ||
+ frame->shot->ctl.aa.afMode == AA_AFMODE_CONTINUOUS_PICTURE)
+ && frame->shot->ctl.aa.afTrigger == AA_AF_TRIGGER_START) {
+
+ list_for_each_entry_reverse(prev, &framemgr->queued_list[FS_REQUEST], list) {
+ prev->shot->ctl.aa.afMode = frame->shot->ctl.aa.afMode;
+ prev->shot->ctl.aa.afTrigger = frame->shot->ctl.aa.afTrigger;
+ }
+
+ list_for_each_entry_reverse(prev, &framemgr->queued_list[FS_PROCESS], list) {
+ prev->shot->ctl.aa.afMode = frame->shot->ctl.aa.afMode;
+ prev->shot->ctl.aa.afTrigger = frame->shot->ctl.aa.afTrigger;
+ }
+ }
+ }
+#endif
+
#ifdef SENSOR_REQUEST_DELAY
if (test_bit(FIMC_IS_GROUP_OTF_INPUT, &group->state) &&
(frame->shot->uctl.opMode == CAMERA_OP_MODE_HAL3_GED)) {
int req_cnt = 0;
struct fimc_is_frame *prev;
+
+ if (resourcemgr->shot_timeout_tick > 0)
+ resourcemgr->shot_timeout_tick--;
+ else
+ resourcemgr->shot_timeout = FIMC_IS_SHOT_TIMEOUT;
+
list_for_each_entry_reverse(prev, &framemgr->queued_list[FS_REQUEST], list) {
if (++req_cnt > SENSOR_REQUEST_DELAY)
break;
prev->shot->ctl.aa.aeExpCompensation = frame->shot->ctl.aa.aeExpCompensation;
prev->shot->ctl.aa.aeLock = frame->shot->ctl.aa.aeLock;
prev->shot->ctl.lens.opticalStabilizationMode = frame->shot->ctl.lens.opticalStabilizationMode;
+
+ if (frame->shot->ctl.aa.sceneMode == AA_SCENE_MODE_PRO_MODE
+ && frame->shot->ctl.aa.captureIntent == AA_CAPTURE_INTENT_STILL_CAPTURE_EXPOSURE_DYNAMIC_SHOT) {
+ prev->shot->ctl.aa.sceneMode = frame->shot->ctl.aa.sceneMode;
+ prev->shot->ctl.aa.captureIntent = frame->shot->ctl.aa.captureIntent;
+ prev->shot->ctl.aa.vendor_captureExposureTime = frame->shot->ctl.aa.vendor_captureExposureTime;
+ prev->shot->ctl.aa.vendor_captureCount = frame->shot->ctl.aa.vendor_captureCount;
+
+ resourcemgr->shot_timeout = FIMC_IS_SHOT_TIMEOUT * 12; /* 3000 x 12 = 36s */
+ resourcemgr->shot_timeout_tick = KEEP_FRAME_TICK_DEFAULT;
+ }
+ }
+ }
+#endif
+
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+ if ((GET_DEVICE_TYPE_BY_GRP(group->id) == FIMC_IS_DEVICE_SENSOR)
+ && (device->sensor && !test_bit(FIMC_IS_SENSOR_FRONT_START, &device->sensor->state))) {
+ device->sensor->mode_chg_frame = NULL;
+
+ if (CHK_REMOSAIC_SCN(frame->shot->ctl.aa.sceneMode)) {
+ clear_bit(FIMC_IS_SENSOR_OTF_OUTPUT, &device->sensor->state);
+ device->sensor->mode_chg_frame = frame;
+ } else {
+ if (group->child)
+ set_bit(FIMC_IS_SENSOR_OTF_OUTPUT, &device->sensor->state);
}
}
#endif
+
trans_frame(framemgr, frame, FS_REQUEST);
} else {
err("frame(%d) is invalid state(%d)\n", index, frame->state);
u32 done_state)
{
int ret = 0;
+ int i = 0;
struct fimc_is_device_ischain *device;
struct fimc_is_group_framemgr *gframemgr;
struct fimc_is_group_frame *gframe;
#endif
ulong flags;
struct fimc_is_group_task *gtask_child;
+ struct fimc_is_resourcemgr *resourcemgr;
FIMC_BUG(!groupmgr);
FIMC_BUG(!group);
if (test_bit(FIMC_IS_GROUP_OTF_INPUT, &group->state))
fimc_is_sensor_dm_tag(device->sensor, frame);
+ resourcemgr = device->resourcemgr;
#ifdef ENABLE_SHARED_METADATA
fimc_is_hw_shared_meta_update(device, group, frame, SHARED_META_SHOT_DONE);
#else
frame->shot->udm.ni.currentFrameNoiseIndex;
device->next_noise_idx[(frame->fcount + 2) % NI_BACKUP_MAX] =
frame->shot->udm.ni.nextNextFrameNoiseIndex;
+
+ /* thermal state update */
+ switch (resourcemgr->tmu_state) {
+ case ISP_NORMAL:
+ case ISP_COLD:
+ frame->shot_ext->thermal = CAM_THERMAL_NORMAL;
+ break;
+ case ISP_THROTTLING:
+ frame->shot_ext->thermal = CAM_THERMAL_THROTTLING;
+ break;
+ case ISP_TRIPPING:
+ frame->shot_ext->thermal = CAM_THERMAL_TRIPPING;
+ break;
+ default:
+ warn("invalid tmu_state");
+ break;
+ }
+
+ if (device->sensor->subdev_eeprom || device->sensor->use_otp_cal) {
+ /* Sensor EEPROM CAL data status update */
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ frame->shot_ext->user.crc_result[i] = device->sensor->cal_status[i];
+ }
}
#ifdef ENABLE_INIT_AWB
#define GROUP_ID_SS3 15
#define GROUP_ID_SS4 16
#define GROUP_ID_SS5 17
-#define GROUP_ID_MAX 18
+#define GROUP_ID_3AA2 18 /* VPP */
+#define GROUP_ID_MAX 19
#define GROUP_ID_PARM_MASK ((1 << (GROUP_ID_SS0)) - 1)
-#define GROUP_ID_SHIFT (18)
-#define GROUP_ID_MASK (0x3FFFF)
+#define GROUP_ID_SHIFT (19)
+#define GROUP_ID_MASK (0x7FFFF)
#define GROUP_ID(id) (1 << (id))
#define GROUP_SLOT_SENSOR 0
struct camera2_ctl fast_ctl;
#endif
struct camera2_aa_ctl intent_ctl;
+ struct camera2_lens_ctl lens_ctl;
u32 id; /* group id */
u32 slot; /* group slot */
struct fimc_is_frame *frame,
u32 done_state);
-int fimc_is_gframe_cancel(struct fimc_is_groupmgr *groupmgr,
- struct fimc_is_group *group, u32 target_fcount);
-
unsigned long fimc_is_group_lock(struct fimc_is_group *group,
enum fimc_is_device_type device_type,
bool leader_lock);
#endif
#include "fimc-is-i2c-config.h"
#include "fimc-is-core.h"
+#include "fimc-is-vender-specific.h"
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
int fimc_is_i2c_pin_config(struct i2c_client *client, int state)
struct fimc_is_core *core;
int i2c_config_state = 0;
u32 i2c_channel = 0;
+ struct fimc_is_vender_specific *specific;
if (value)
i2c_config_state = I2C_PIN_STATE_ON;
device = v4l2_get_subdev_hostdata(module->subdev);
core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ FIMC_BUG(!core);
+
+ specific = core->vender.private_data;
+
switch (scenario) {
case SENSOR_SCENARIO_NORMAL:
+ case SENSOR_SCENARIO_VISION:
if (sensor_peri->cis.client) {
info("%s[%d] cis i2c config(%d), position(%d), scenario(%d)\n",
__func__, __LINE__, i2c_config_state, module->position, scenario);
}
if (device->ois) {
i2c_channel = module->ext.ois_con.peri_setting.i2c.channel;
- if (core != NULL) {
- if (i2c_config_state == I2C_PIN_STATE_ON)
- atomic_inc(&core->i2c_rsccount[i2c_channel]);
- else if (i2c_config_state == I2C_PIN_STATE_OFF)
- atomic_dec(&core->i2c_rsccount[i2c_channel]);
- }
+
+ if (i2c_config_state == I2C_PIN_STATE_ON)
+ atomic_inc(&core->i2c_rsccount[i2c_channel]);
+ else if (i2c_config_state == I2C_PIN_STATE_OFF)
+ atomic_dec(&core->i2c_rsccount[i2c_channel]);
if (atomic_read(&core->i2c_rsccount[i2c_channel]) == value) {
info("%s[%d] ois i2c config(%d), position(%d), scenario(%d), i2c_channel(%d)\n",
__func__, __LINE__, i2c_config_state, module->position, scenario);
ret |= fimc_is_i2c_pin_config(device->aperture->client, i2c_config_state);
}
+ if (device->mcu) {
+ info("%s[%d] mcu i2c config(%d), position(%d), scenario(%d)\n",
+ __func__, __LINE__, i2c_config_state, module->position, scenario);
+ ret |= fimc_is_i2c_pin_config(device->mcu->client, i2c_config_state);
+ }
break;
case SENSOR_SCENARIO_OIS_FACTORY:
if (device->ois) {
__func__, __LINE__, i2c_config_state, module->position, scenario);
ret |= fimc_is_i2c_pin_config(device->ois->client, i2c_config_state);
}
+ if (device->mcu) {
+ info("%s[%d] mcu i2c config(%d), position(%d), scenario(%d)\n",
+ __func__, __LINE__, i2c_config_state, module->position, scenario);
+ ret |= fimc_is_i2c_pin_config(device->mcu->client, i2c_config_state);
+ }
break;
case SENSOR_SCENARIO_READ_ROM:
- if (device->actuator[module->position]) {
- info("%s[%d] actuator i2c config(%d), position(%d), scenario(%d)\n",
- __func__, __LINE__, i2c_config_state, module->position, scenario);
- ret |= fimc_is_i2c_pin_config(device->actuator[module->position]->client, i2c_config_state);
+ if (module->pdata->rom_id >= ROM_ID_REAR && module->pdata->rom_id < ROM_ID_MAX) {
+ info("%s[%d] eeprom i2c config(%d), rom_id(%d), scenario(%d)\n",
+ __func__, __LINE__, i2c_config_state, module->pdata->rom_id, scenario);
+ ret |= fimc_is_i2c_pin_config(specific->eeprom_client[module->pdata->rom_id], i2c_config_state);
}
break;
case SENSOR_SCENARIO_SECURE:
#define TRACE_WORK_ID_M4P 0x0800000
#define TRACE_WORK_ID_M5P 0x1000000
#define TRACE_WORK_ID_ME0C 0x2000000
-#define TRACE_WORK_ID_MASK 0x3FFFFFF
+#define TRACE_WORK_ID_ME1C 0x4000000
+#define TRACE_WORK_ID_32P 0x8000000
+#define TRACE_WORK_ID_MASK 0xFFFFFFF
#define MAX_NBLOCKING_COUNT 3
#define MAX_WORK_COUNT 10
WORK_31P_FDONE,
WORK_31F_FDONE,
WORK_31G_FDONE,
+ WORK_32P_FDONE,
WORK_I0C_FDONE,
WORK_I0P_FDONE,
WORK_I1C_FDONE,
WORK_I1P_FDONE,
WORK_ME0C_FDONE, /* ME */
+ WORK_ME1C_FDONE, /* ME */
WORK_D0C_FDONE, /* TPU0 */
WORK_D1C_FDONE, /* TPU1 */
WORK_DC1S_FDONE, /* DCP Master Input */
#include <linux/interrupt.h>
#include <linux/of.h>
#include <linux/dma-buf.h>
+#include <linux/dma-buf-container.h>
#include <linux/ion_exynos.h>
#include <asm/cacheflush.h>
+#include <media/videobuf2-memops.h>
#include "fimc-is-core.h"
#include "fimc-is-cmd.h"
#endif
#if defined(CONFIG_VIDEOBUF2_DMA_SG)
+struct vb2_dma_sg_buf {
+ struct device *dev;
+ void *vaddr;
+ struct page **pages;
+ struct frame_vector *vec;
+ int offset;
+ enum dma_data_direction dma_dir;
+ struct sg_table sg_table;
+ /*
+ * This will point to sg_table when used with the MMAP or USERPTR
+ * memory model, and to the dma_buf sglist when used with the
+ * DMABUF memory model.
+ */
+ struct sg_table *dma_sgt;
+ size_t size;
+ unsigned int num_pages;
+ refcount_t refcount;
+ struct vb2_vmarea_handler handler;
+
+ struct dma_buf_attachment *db_attach;
+ /*
+ * Our IO address space is not managed by dma-mapping. Therefore
+ * scatterlist.dma_address should not be corrupted by the IO address
+ * returned by iovmm_map() because it is used by cache maintenance.
+ */
+ dma_addr_t iova;
+};
+
/* fimc-is vb2 buffer operations */
-static inline ulong fimc_is_vb2_ion_plane_kvaddr(
+static inline ulong is_vb2_dma_sg_plane_kvaddr(
struct fimc_is_vb2_buf *vbuf, u32 plane)
{
return (ulong)vb2_plane_vaddr(&vbuf->vb.vb2_buf, plane);
}
-static dma_addr_t fimc_is_vb2_ion_plane_dvaddr(
+static inline dma_addr_t is_vb2_dma_sg_plane_dvaddr(
struct fimc_is_vb2_buf *vbuf, u32 plane)
{
- return (ulong)vb2_dma_sg_plane_dma_addr(&vbuf->vb.vb2_buf, plane);
+ return vb2_dma_sg_plane_dma_addr(&vbuf->vb.vb2_buf, plane);
}
-static dma_addr_t fimc_is_bufcon_map(struct fimc_is_vb2_buf *vbuf,
- struct device *dev,
- int idx,
- struct dma_buf *dmabuf)
+static inline ulong is_vb2_dma_sg_plane_kmap(
+ struct fimc_is_vb2_buf *vbuf, u32 plane)
{
- int ret = 0;
+ struct vb2_buffer *vb = &vbuf->vb.vb2_buf;
+ struct vb2_dma_sg_buf *buf = vb->planes[plane].mem_priv;
+ struct dma_buf *dbuf;
- vbuf->bufs[idx] = dmabuf;
+ if (likely(vbuf->kva[plane]))
+ return vbuf->kva[plane];
- vbuf->attachment[idx] = dma_buf_attach(dmabuf, dev);
- if (IS_ERR(vbuf->attachment[idx])) {
- ret = PTR_ERR(vbuf->attachment[idx]);
- pr_err("%s: Failed to dma_buf_attach %d\n", __func__, idx);
- goto err_attach;
+ dbuf = dma_buf_get(vb->planes[plane].m.fd);
+ if (IS_ERR_OR_NULL(dbuf)) {
+ pr_err("failed to get dmabuf of fd: %d, plane: %d\n",
+ vb->planes[plane].m.fd, plane);
+ return 0;
}
- vbuf->sgt[idx] = dma_buf_map_attachment(vbuf->attachment[idx], DMA_BIDIRECTIONAL);
- if (IS_ERR(vbuf->sgt[idx])) {
- ret = PTR_ERR(vbuf->sgt[idx]);
- pr_err("%s: Failed to dma_buf_map_attachment %d\n", __func__, idx);
- goto err_map_dmabuf;
+ if (dma_buf_begin_cpu_access(dbuf, buf->dma_dir)) {
+ dma_buf_put(dbuf);
+ pr_err("failed to access dmabuf of fd: %d, plane: %d\n",
+ vb->planes[plane].m.fd, plane);
+ return 0;
}
- vbuf->dva[idx] = ion_iovmm_map(vbuf->attachment[idx], 0, 0, DMA_BIDIRECTIONAL, 0);
- if (IS_ERR_VALUE(vbuf->dva[idx])) {
- pr_err("%s: Failed to ion_iovmm_map %d\n", __func__, idx);
- ret = -ENOMEM;
- goto err_ion_map_io;
+ vbuf->kva[plane] = (ulong)dma_buf_kmap(dbuf, buf->offset / PAGE_SIZE);
+ if (!vbuf->kva[plane]) {
+ dma_buf_end_cpu_access(dbuf, buf->dma_dir);
+ dma_buf_put(dbuf);
+ pr_err("failed to kmapping dmabuf of fd: %d, plane: %d\n",
+ vb->planes[plane].m.fd, plane);
+ return 0;
}
- return vbuf->dva[idx];
+ vbuf->dbuf[plane] = dbuf;
+ vbuf->kva[plane] += buf->offset & ~PAGE_MASK;
-err_ion_map_io:
- dma_buf_unmap_attachment(vbuf->attachment[idx], vbuf->sgt[idx], DMA_BIDIRECTIONAL);
-err_map_dmabuf:
- dma_buf_detach(dmabuf, vbuf->attachment[idx]);
-err_attach:
- vbuf->bufs[idx] = NULL;
+ return vbuf->kva[plane];
+}
+
+static inline void is_vb2_dma_sg_plane_kunmap(
+ struct fimc_is_vb2_buf *vbuf, u32 plane)
+{
+ struct dma_buf *dbuf = vbuf->dbuf[plane];
+
+ if (vbuf->kva[plane]) {
+ dma_buf_kunmap(dbuf, 0, (void *)vbuf->kva[plane]);
+ dma_buf_end_cpu_access(dbuf, 0);
+ dma_buf_put(dbuf);
+
+ vbuf->dbuf[plane] = NULL;
+ vbuf->kva[plane] = 0;
+ }
+}
+
+static long is_vb2_dma_sg_remap_attr(struct fimc_is_vb2_buf *vbuf, int attr)
+{
+#if 0
+ struct vb2_buffer *vb = &vbuf->vb.vb2_buf;
+ struct vb2_dma_sg_buf *buf;
+ unsigned int plane;
+ long ret;
+ int ioprot = IOMMU_READ | IOMMU_WRITE;
+
+ for (plane = 0; plane < vb->num_planes; ++plane) {
+ buf = vb->planes[plane].mem_priv;
+ vbuf->sgt[plane] = dma_buf_map_attachment(buf->db_attach, buf->dma_dir);
+
+ if (IS_ERR(vbuf->sgt[plane])) {
+ ret = PTR_ERR(vbuf->sgt[plane]);
+ pr_err("Error getting dmabuf scatterlist\n");
+ goto err_get_sgt;
+ }
+
+ if ((vbuf->dva[plane] == 0) || IS_ERR_VALUE(vbuf->dva[plane])) {
+ if (device_get_dma_attr(buf->dev) == DEV_DMA_COHERENT)
+ ioprot |= IOMMU_CACHE;
+
+ vbuf->dva[plane] = ion_iovmm_map_attr(buf->db_attach, 0, buf->size,
+ DMA_BIDIRECTIONAL, ioprot, attr);
+ if (IS_ERR_VALUE(vbuf->dva[plane])) {
+ ret = vbuf->dva[plane];
+ pr_err("Error from ion_iovmm_map(): %ld\n", ret);
+ goto err_map_remap;
+ }
+ }
+ }
+
+ return 0;
+
+err_map_remap:
+ dma_buf_unmap_attachment(buf->db_attach, vbuf->sgt[plane], buf->dma_dir);
+ vbuf->dva[plane] = 0;
+
+err_get_sgt:
+ while (plane-- > 0) {
+ buf = vb->planes[plane].mem_priv;
+
+ ion_iovmm_unmap_attr(buf->db_attach, vbuf->dva[plane], attr);
+ dma_buf_unmap_attachment(buf->db_attach, vbuf->sgt[plane], buf->dma_dir);
+ vbuf->dva[plane] = 0;
+ }
+ return ret;
+#else
+ info("failed remap attr : need to check ion_iovmm_map_attr func\n");
return 0;
+#endif
}
-static void fimc_is_bufcon_unmap(struct fimc_is_vb2_buf *vbuf,
- int idx)
+void is_vb2_dma_sg_unremap_attr(struct fimc_is_vb2_buf *vbuf, int attr)
{
- if (!vbuf->bufs[idx])
- return;
+#if 0
- ion_iovmm_unmap(vbuf->attachment[idx], vbuf->dva[idx]);
- vbuf->dva[idx] = 0;
+ struct vb2_buffer *vb = &vbuf->vb.vb2_buf;
+ struct vb2_dma_sg_buf *buf;
+ unsigned int plane;
- dma_buf_unmap_attachment(vbuf->attachment[idx], vbuf->sgt[idx], DMA_BIDIRECTIONAL);
- dma_buf_detach(vbuf->bufs[idx], vbuf->attachment[idx]);
+ for (plane = 0; plane < vb->num_planes; ++plane) {
+ buf = vb->planes[plane].mem_priv;
- vbuf->bufs[idx] = NULL;
+ ion_iovmm_unmap_attr(buf->db_attach, vbuf->dva[plane], attr);
+ dma_buf_unmap_attachment(buf->db_attach, vbuf->sgt[plane], buf->dma_dir);
+ vbuf->dva[plane] = 0;
+ }
+#else
+ info("failed remap attr : need to check ion_iovmm_unmap_attr func\n");
+#endif
}
-const struct fimc_is_vb2_buf_ops fimc_is_vb2_buf_ops_ion = {
- .plane_kvaddr = fimc_is_vb2_ion_plane_kvaddr,
- .plane_dvaddr = fimc_is_vb2_ion_plane_dvaddr,
- .bufcon_map = fimc_is_bufcon_map,
- .bufcon_unmap = fimc_is_bufcon_unmap,
+#ifdef CONFIG_DMA_BUF_CONTAINER
+static long is_dbufcon_prepare(struct fimc_is_vb2_buf *vbuf,
+ u32 num_planes, struct device *dev)
+{
+ struct vb2_buffer *vb = &vbuf->vb.vb2_buf;
+ struct dma_buf *dbufcon;
+ int count;
+ int p, b, i;
+ long ret;
+
+ for (p = 0; p < num_planes; p++) {
+ dbufcon = dma_buf_get(vb->planes[p].m.fd);
+ if (IS_ERR_OR_NULL(dbufcon)) {
+ err("failed to get dmabuf of fd: %d, plane: %d",
+ vb->planes[p].m.fd, p);
+ ret = -EINVAL;
+ goto err_get_dbufcon;
+ }
+
+ count = dmabuf_container_get_count(dbufcon);
+ if (count < 0) {
+ ret = 0;
+ goto err_get_count;
+ } else if (count == 0) {
+ err("empty dmabuf-container of fd: %d", vb->planes[p].m.fd);
+ ret = -EINVAL;
+ goto err_empty_dbufcon;
+ }
+
+ /* FIMC_IS_MAX_PLANES includes a meta-plane */
+ if ((count * num_planes) >= FIMC_IS_MAX_PLANES) {
+ err("out of range plane. count: %d, planes: %d >= supported: %d",
+ count, num_planes, FIMC_IS_MAX_PLANES);
+ ret = -EINVAL;
+ goto err_too_many_planes;
+
+ }
+
+ /* change the order of each plane by the order of buffer */
+ for (b = 0, i = p; b < count; b++, i = (b * num_planes) + p) {
+ vbuf->dbuf[i] = dmabuf_container_get_buffer(dbufcon, b);
+ if (IS_ERR_OR_NULL(vbuf->dbuf[i])) {
+ err("failed to get dmabuf-container's dmabuf: %d", b);
+ ret = -EINVAL;
+ goto err_get_dbuf;
+ }
+
+ vbuf->atch[i] = dma_buf_attach(vbuf->dbuf[i], dev);
+ if (IS_ERR(vbuf->atch[i])) {
+ err("failed to attach dmabuf: %d", b);
+ ret = PTR_ERR(vbuf->atch[i]);
+ goto err_attach_dbuf;
+ }
+
+ vbuf->sgt[i] = dma_buf_map_attachment(vbuf->atch[i],
+ DMA_BIDIRECTIONAL);
+ if (IS_ERR(vbuf->sgt[i])) {
+ err("failed to get dmabuf's sgt: %d", b);
+ ret = PTR_ERR(vbuf->sgt[i]);
+ goto err_get_sgt;
+ }
+ }
+
+ dma_buf_put(dbufcon);
+ }
+
+ vbuf->num_merged_dbufs = count * num_planes;
+
+ return 0;
+
+err_get_sgt:
+ dma_buf_detach(vbuf->dbuf[i], vbuf->atch[i]);
+ vbuf->sgt[i] = NULL;
+
+err_attach_dbuf:
+ dma_buf_put(vbuf->dbuf[i]);
+ vbuf->atch[i] = NULL;
+ vbuf->dbuf[i] = NULL;
+
+err_get_dbuf:
+ while (b-- > 0) {
+ i = (b * num_planes) + p;
+ dma_buf_unmap_attachment(vbuf->atch[i], vbuf->sgt[i],
+ DMA_BIDIRECTIONAL);
+ dma_buf_detach(vbuf->dbuf[i], vbuf->atch[i]);
+ dma_buf_put(vbuf->dbuf[i]);
+ vbuf->sgt[i] = NULL;
+ vbuf->atch[i] = NULL;
+ vbuf->dbuf[i] = NULL;
+ }
+
+err_too_many_planes:
+err_empty_dbufcon:
+err_get_count:
+ dma_buf_put(dbufcon);
+
+err_get_dbufcon:
+ vbuf->num_merged_dbufs = 0;
+
+ while (p-- > 0) {
+ dbufcon = dma_buf_get(vb->planes[p].m.fd);
+ count = dmabuf_container_get_count(dbufcon);
+ dma_buf_put(dbufcon);
+
+ for (b = 0, i = p; b < count; b++, i = (b * num_planes) + p) {
+ dma_buf_unmap_attachment(vbuf->atch[i], vbuf->sgt[i],
+ DMA_BIDIRECTIONAL);
+ dma_buf_detach(vbuf->dbuf[i], vbuf->atch[i]);
+ dma_buf_put(vbuf->dbuf[i]);
+ vbuf->sgt[i] = NULL;
+ vbuf->atch[i] = NULL;
+ vbuf->dbuf[i] = NULL;
+ }
+ }
+
+ return ret;
+}
+
+static void is_dbufcon_finish(struct fimc_is_vb2_buf *vbuf)
+{
+ int i;
+
+ for (i = 0; i < vbuf->num_merged_dbufs; i++) {
+ dma_buf_unmap_attachment(vbuf->atch[i], vbuf->sgt[i],
+ DMA_BIDIRECTIONAL);
+ dma_buf_detach(vbuf->dbuf[i], vbuf->atch[i]);
+ dma_buf_put(vbuf->dbuf[i]);
+ vbuf->sgt[i] = NULL;
+ vbuf->atch[i] = NULL;
+ vbuf->dbuf[i] = NULL;
+ }
+
+ vbuf->num_merged_dbufs = 0;
+}
+
+static long is_dbufcon_map(struct fimc_is_vb2_buf *vbuf)
+{
+ int i;
+ long ret;
+
+ for (i = 0; i < vbuf->num_merged_dbufs; i++) {
+ vbuf->dva[i] = ion_iovmm_map(vbuf->atch[i], 0, 0,
+ DMA_BIDIRECTIONAL, 0);
+ if (IS_ERR_VALUE(vbuf->dva[i])) {
+ err("failed to map dmabuf: %d", i);
+ ret = vbuf->dva[i];
+ goto err_map_dbuf;
+ }
+ }
+
+ return 0;
+
+err_map_dbuf:
+ vbuf->dva[i] = 0;
+
+ while (i-- > 0) {
+ ion_iovmm_unmap(vbuf->atch[i], vbuf->dva[i]);
+ vbuf->dva[i] = 0;
+ }
+
+ return ret;
+}
+
+static void is_dbufcon_unmap(struct fimc_is_vb2_buf *vbuf)
+{
+ int i;
+
+ for (i = 0; i < vbuf->num_merged_dbufs; i++) {
+ ion_iovmm_unmap(vbuf->atch[i], vbuf->dva[i]);
+ vbuf->dva[i] = 0;
+ }
+}
+#else
+static long is_dbufcon_prepare(struct fimc_is_vb2_buf *vbuf,
+ u32 num_planes, struct device *dev)
+{
+ return 0;
+}
+static void is_dbufcon_finish(struct fimc_is_vb2_buf *vbuf)
+{
+}
+
+static long is_dbufcon_map(struct fimc_is_vb2_buf *vbuf)
+{
+ return 0;
+}
+
+static void is_dbufcon_unmap(struct fimc_is_vb2_buf *vbuf)
+{
+}
+#endif
+
+const struct fimc_is_vb2_buf_ops is_vb2_buf_ops_dma_sg = {
+ .plane_kvaddr = is_vb2_dma_sg_plane_kvaddr,
+ .plane_dvaddr = is_vb2_dma_sg_plane_dvaddr,
+ .plane_kmap = is_vb2_dma_sg_plane_kmap,
+ .plane_kunmap = is_vb2_dma_sg_plane_kunmap,
+ .remap_attr = is_vb2_dma_sg_remap_attr,
+ .unremap_attr = is_vb2_dma_sg_unremap_attr,
+ .dbufcon_prepare = is_dbufcon_prepare,
+ .dbufcon_finish = is_dbufcon_finish,
+ .dbufcon_map = is_dbufcon_map,
+ .dbufcon_unmap = is_dbufcon_unmap,
};
/* fimc-is private buffer operations */
}
static struct fimc_is_priv_buf *fimc_is_ion_alloc(void *ctx,
- size_t size, size_t align)
+ size_t size, size_t align, const char *heapname)
{
struct fimc_is_ion_ctx *alloc_ctx = ctx;
struct fimc_is_priv_buf *buf;
- const char *heapname = "ion_system_heap";
+ /* const char *heapname = "ion_system_heap"; */
int ret = 0;
+ long flags = alloc_ctx->flags;
buf = vzalloc(sizeof(*buf));
if (!buf)
return ERR_PTR(-ENOMEM);
+
+ if (!heapname)
+ heapname = "ion_system_heap";
+ else
+ info("%s: heapname[%s], size[%#lx\\n", __func__, heapname, size);
+
size = PAGE_ALIGN(size);
- buf->dma_buf = ion_alloc_dmabuf(heapname, size, alloc_ctx->flags);
+ if (!strncmp(heapname, "camera_heap", 11))
+ flags |= ION_FLAG_PROTECTED;
+
+ buf->dma_buf = ion_alloc_dmabuf(heapname, size, flags);
if (IS_ERR(buf->dma_buf)) {
ret = -ENOMEM;
goto err_alloc;
return pa;
}
+
const struct fimc_is_priv_buf_ops fimc_is_priv_buf_ops_km = {
.free = fimc_is_km_free,
.kvaddr = fimc_is_km_kvaddr,
#if defined(CONFIG_VIDEOBUF2_DMA_SG)
mem->fimc_is_mem_ops = &fimc_is_mem_ops_ion;
mem->vb2_mem_ops = &vb2_dma_sg_memops;
- mem->fimc_is_vb2_buf_ops = &fimc_is_vb2_buf_ops_ion;
+ mem->fimc_is_vb2_buf_ops = &is_vb2_buf_ops_dma_sg;
mem->kmalloc = &fimc_is_kmalloc;
#endif
#include <media/videobuf2-dma-sg.h>
#endif
#include "fimc-is-framemgr.h"
+#include "exynos-fimc-is-sensor.h"
struct fimc_is_vb2_buf;
struct fimc_is_vb2_buf_ops {
ulong (*plane_kvaddr)(struct fimc_is_vb2_buf *vbuf, u32 plane);
dma_addr_t (*plane_dvaddr)(struct fimc_is_vb2_buf *vbuf, u32 plane);
- dma_addr_t (*bufcon_map)(struct fimc_is_vb2_buf *vbuf, struct device *dev, int idx, struct dma_buf *dmabuf);
- void (*bufcon_unmap)(struct fimc_is_vb2_buf *vbuf, int idx);
+ ulong (*plane_kmap)(struct fimc_is_vb2_buf *vbuf, u32 plane);
+ void (*plane_kunmap)(struct fimc_is_vb2_buf *vbuf, u32 plane);
+ long (*remap_attr)(struct fimc_is_vb2_buf *vbuf, int attr);
+ void (*unremap_attr)(struct fimc_is_vb2_buf *vbuf, int attr);
+ long (*dbufcon_prepare)(struct fimc_is_vb2_buf *vbuf, u32 num_planes, struct device *dev);
+ void (*dbufcon_finish)(struct fimc_is_vb2_buf *vbuf);
+ long (*dbufcon_map)(struct fimc_is_vb2_buf *vbuf);
+ void (*dbufcon_unmap)(struct fimc_is_vb2_buf *vbuf);
};
struct fimc_is_vb2_buf {
struct vb2_v4l2_buffer vb;
+ unsigned int num_merged_dbufs;
+ struct dma_buf *dbuf[FIMC_IS_MAX_PLANES];
+ struct dma_buf_attachment *atch[FIMC_IS_MAX_PLANES];
+ struct sg_table *sgt[FIMC_IS_MAX_PLANES];
+
+#ifdef CONFIG_DMA_BUF_CONTAINER
ulong kva[FIMC_IS_MAX_PLANES];
dma_addr_t dva[FIMC_IS_MAX_PLANES];
-
- /* buffer container operation */
- struct dma_buf_attachment *attachment[FIMC_IS_MAX_PLANES];
- struct sg_table *sgt[FIMC_IS_MAX_PLANES];
- struct dma_buf *bufs[FIMC_IS_MAX_PLANES];
-
+#else
+ ulong kva[VIDEO_MAX_PLANES];
+ dma_addr_t dva[VIDEO_MAX_PLANES];
+#endif
const struct fimc_is_vb2_buf_ops *ops;
};
struct dma_buf_attachment *attachment;
enum dma_data_direction direction;
void *kva;
- dma_addr_t iova;
- struct sg_table *sgt;
+ dma_addr_t iova;
+ struct sg_table *sgt;
};
#define vb_to_fimc_is_vb2_buf(x) \
void (*suspend)(void *ctx);
void (*set_cached)(void *ctx, bool cacheable);
int (*set_alignment)(void *ctx, size_t alignment);
- struct fimc_is_priv_buf *(*alloc)(void *ctx, size_t size, size_t align);
+ struct fimc_is_priv_buf *(*alloc)(void *ctx, size_t size, size_t align, const char *heapname);
};
struct fimc_is_ion_ctx {
struct fimc_is_minfo {
struct fimc_is_priv_buf *pb_fw;
struct fimc_is_priv_buf *pb_setfile;
- struct fimc_is_priv_buf *pb_rear_cal;
- struct fimc_is_priv_buf *pb_front_cal;
+ struct fimc_is_priv_buf *pb_cal[SENSOR_POSITION_MAX];
struct fimc_is_priv_buf *pb_debug;
struct fimc_is_priv_buf *pb_event;
struct fimc_is_priv_buf *pb_fshared;
struct fimc_is_priv_buf *pb_heap_rta; /* RTA HEAP */
struct fimc_is_priv_buf *pb_heap_ddk; /* DDK HEAP */
struct fimc_is_priv_buf *pb_taaisp;
+ struct fimc_is_priv_buf *pb_taaisp_s; /* secure */
+ struct fimc_is_priv_buf *pb_tnr;
struct fimc_is_priv_buf *pb_lhfd;
struct fimc_is_priv_buf *pb_vra;
struct fimc_is_priv_buf *pb_tpu;
dma_addr_t dvaddr_taaisp;
ulong kvaddr_taaisp;
+ dma_addr_t dvaddr_taaisp_s;
+ ulong kvaddr_taaisp_s;
dma_addr_t dvaddr_tpu;
ulong kvaddr_tpu;
dma_addr_t dvaddr_lhfd; /* FD map buffer region */
ulong kvaddr_mcsc_dnr;
ulong kvaddr_setfile;
- ulong kvaddr_rear_cal;
- ulong kvaddr_front_cal;
+ ulong kvaddr_cal[SENSOR_POSITION_MAX];
};
int fimc_is_mem_init(struct fimc_is_mem *mem, struct platform_device *pdev);
#ifdef CONFIG_CMU_EWF
#include <soc/samsung/cmu_ewf.h>
#endif
+#if defined(CONFIG_SECURE_CAMERA_USE)
+#include <linux/smc.h>
+#endif
#include <linux/of_fdt.h>
#include <linux/of_reserved_mem.h>
minfo->total_size += SIZE_LHFD_SHOT_BUF * MAX_LHFD_SHOT_BUF;
#endif
- minfo->pb_fw = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, minfo->total_size, 16);
+ minfo->pb_fw = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, minfo->total_size, 16, NULL);
if (IS_ERR(minfo->pb_fw)) {
err("failed to allocate buffer for FW");
return -ENOMEM;
}
#if defined (ENABLE_FD_SW)
- minfo->pb_lhfd = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, LHFD_MAP_SIZE, 16);
+ minfo->pb_lhfd = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, LHFD_MAP_SIZE, 16, NULL);
if (IS_ERR(minfo->pb_lhfd)) {
err("failed to allocate buffer for LHFD_MAP");
return -ENOMEM;
struct fimc_is_mem *mem = &resourcemgr->mem;
struct fimc_is_minfo *minfo = &resourcemgr->minfo;
size_t tpu_size = 0;
- size_t tnr_size;
+#if !defined(ENABLE_DYNAMIC_MEM) && defined(ENABLE_TNR)
+ size_t tnr_size = ((SIZE_TNR_IMAGE_BUF + SIZE_TNR_WEIGHT_BUF) * NUM_OF_TNR_BUF);
+#endif
+ int i;
minfo->total_size = 0;
/* setfile */
- minfo->pb_setfile = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, SETFILE_SIZE, 16);
+ minfo->pb_setfile = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, SETFILE_SIZE, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_setfile)) {
err("failed to allocate buffer for SETFILE");
return -ENOMEM;
}
minfo->total_size += minfo->pb_setfile->size;
- /* calibration data for rear lens */
- minfo->pb_rear_cal = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, REAR_CALDATA_SIZE, 16);
- if (IS_ERR_OR_NULL(minfo->pb_rear_cal)) {
- err("failed to allocate buffer for REAR_CALDATA");
- return -ENOMEM;
- }
- minfo->total_size += minfo->pb_rear_cal->size;
-
- /* calibration data for front lens */
- minfo->pb_front_cal = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, FRONT_CALDATA_SIZE, 16);
- if (IS_ERR_OR_NULL(minfo->pb_front_cal)) {
- err("failed to allocate buffer for FRONT_CALDATA");
- return -ENOMEM;
+ /* calibration data for each sensor postion */
+ for (i = 0; i < SENSOR_POSITION_MAX; i++) {
+ minfo->pb_cal[i] = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, TOTAL_CAL_DATA_SIZE, 16, NULL);
+ if (IS_ERR_OR_NULL(minfo->pb_cal[i])) {
+ err("failed to allocate buffer for REAR_CAL_DATA");
+ return -ENOMEM;
+ }
+ minfo->total_size += minfo->pb_cal[i]->size;
}
- minfo->total_size += minfo->pb_front_cal->size;
/* library logging */
minfo->pb_debug = mem->kmalloc(DEBUG_REGION_SIZE + 0x10, 16);
if (IS_ERR_OR_NULL(minfo->pb_debug)) {
/* retry by ION */
- minfo->pb_debug = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, DEBUG_REGION_SIZE + 0x10, 16);
+ minfo->pb_debug = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, DEBUG_REGION_SIZE + 0x10, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_debug)) {
err("failed to allocate buffer for DEBUG_REGION");
return -ENOMEM;
minfo->pb_event = mem->kmalloc(EVENT_REGION_SIZE + 0x10, 16);
if (IS_ERR_OR_NULL(minfo->pb_event)) {
/* retry by ION */
- minfo->pb_event = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, EVENT_REGION_SIZE + 0x10, 16);
+ minfo->pb_event = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, EVENT_REGION_SIZE + 0x10, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_event)) {
err("failed to allocate buffer for EVENT_REGION");
return -ENOMEM;
minfo->total_size += minfo->pb_event->size;
/* data region */
- minfo->pb_dregion = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, DATA_REGION_SIZE, 16);
+ minfo->pb_dregion = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, DATA_REGION_SIZE, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_dregion)) {
err("failed to allocate buffer for DATA_REGION");
return -ENOMEM;
/* parameter region */
minfo->pb_pregion = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx,
- (FIMC_IS_SENSOR_COUNT*PARAM_REGION_SIZE), 16);
+ (FIMC_IS_SENSOR_COUNT*PARAM_REGION_SIZE), 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_pregion)) {
err("failed to allocate buffer for PARAM_REGION");
return -ENOMEM;
minfo->total_size += minfo->pb_pregion->size;
/* fshared data region */
- minfo->pb_fshared = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, FSHARED_REGION_SIZE, 16);
+ minfo->pb_fshared = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, FSHARED_REGION_SIZE, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_fshared)) {
err("failed to allocate buffer for FSHARED_REGION");
return -ENOMEM;
}
minfo->total_size += minfo->pb_fshared->size;
- /* reserved memory for library */
- minfo->pb_heap_rta = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, RESERVE_LIB_SIZE, 16);
- if (IS_ERR_OR_NULL(minfo->pb_heap_rta)) {
- err("failed to allocate buffer for library");
+#if !defined(ENABLE_DYNAMIC_MEM)
+ /* 3aa/isp internal DMA buffer */
+ minfo->pb_taaisp = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, TAAISP_DMA_SIZE, 16, NULL);
+ if (IS_ERR_OR_NULL(minfo->pb_taaisp)) {
+ err("failed to allocate buffer for TAAISP_DMA");
return -ENOMEM;
}
- minfo->total_size += minfo->pb_heap_rta->size;
+ minfo->total_size += minfo->pb_taaisp->size;
+
+ info("[RSC] TAAISP_DMA memory size (aligned) : %08lx\n", TAAISP_DMA_SIZE);
- tnr_size = 0;
-#if !defined(ENABLE_DYNAMIC_MEM)
#if defined(ENABLE_TNR)
- /* 4 is double buffering & 2 instance for dual camera */
- tnr_size += ((SIZE_TNR_IMAGE_BUF + SIZE_TNR_WEIGHT_BUF) * 4);
+ /* TNR internal DMA buffer */
+ minfo->pb_tnr = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, tnr_size, 16, NULL);
+ if (IS_ERR_OR_NULL(minfo->pb_tnr)) {
+ err("failed to allocate buffer for TNR DMA");
+ return -ENOMEM;
+ }
+ minfo->total_size += minfo->pb_tnr->size;
+
+ info("[RSC] TNR_DMA memory size: %08lx\n", tnr_size);
#endif
- /* 3aa/isp internal DMA buffer */
- minfo->pb_taaisp = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, TAAISP_DMA_SIZE + tnr_size, 16);
- if (IS_ERR_OR_NULL(minfo->pb_taaisp)) {
- err("failed to allocate buffer for TAAISP_DMAE");
+#if defined (ENABLE_DNR_IN_MCSC)
+ minfo->pb_mcsc_dnr = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, MCSC_DNR_DMA_SIZE, 16, NULL);
+ if (IS_ERR_OR_NULL(minfo->pb_mcsc_dnr)) {
+ err("failed to allocate buffer for MCSC DNR");
return -ENOMEM;
}
- minfo->total_size += minfo->pb_taaisp->size;
+ minfo->total_size += minfo->pb_mcsc_dnr->size;
+
+ info("[RSC] TDNR_DMA memory size: %08lx\n", MCSC_DNR_DMA_SIZE);
+#endif
+
#endif
#if defined (ENABLE_FD_SW)
- minfo->pb_lhfd = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, LHFD_MAP_SIZE, 16);
+ minfo->pb_lhfd = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, LHFD_MAP_SIZE, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_lhfd)) {
err("failed to allocate buffer for LHFD_MAP");
return -ENOMEM;
#endif
#if defined (ENABLE_VRA)
- minfo->pb_vra = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, VRA_DMA_SIZE, 16);
+ minfo->pb_vra = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, VRA_DMA_SIZE, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_vra)) {
err("failed to allocate buffer for VRA");
return -ENOMEM;
minfo->total_size += minfo->pb_vra->size;
#endif
-#if defined (ENABLE_DNR_IN_MCSC)
- minfo->pb_mcsc_dnr = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, MCSC_DNR_DMA_SIZE, 16);
- if (IS_ERR_OR_NULL(minfo->pb_mcsc_dnr)) {
- err("failed to allocate buffer for MCSC DNR");
- return -ENOMEM;
- }
- minfo->total_size += minfo->pb_mcsc_dnr->size;
-#endif
-
#if defined (ENABLE_ODC)
tpu_size += (SIZE_ODC_INTERNAL_BUF * NUM_ODC_INTERNAL_BUF);
#endif
tpu_size += (SIZE_DNR_INTERNAL_BUF * NUM_DNR_INTERNAL_BUF);
#endif
if (tpu_size > 0) {
- minfo->pb_tpu = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, tpu_size, 16);
+ minfo->pb_tpu = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, tpu_size, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_tpu)) {
err("failed to allocate buffer for TPU");
return -ENOMEM;
{
struct fimc_is_minfo *minfo = NULL;
int ret = 0;
+ int i;
probe_info("fimc_is_init_mem - ION\n");
resourcemgr->minfo.dvaddr = 0;
resourcemgr->minfo.kvaddr = 0;
- resourcemgr->minfo.dvaddr_lib = CALL_BUFOP(minfo->pb_heap_rta, dvaddr, minfo->pb_heap_rta);
- resourcemgr->minfo.kvaddr_lib = CALL_BUFOP(minfo->pb_heap_rta, kvaddr, minfo->pb_heap_rta);
-
resourcemgr->minfo.dvaddr_debug = CALL_BUFOP(minfo->pb_debug, dvaddr, minfo->pb_debug);
resourcemgr->minfo.kvaddr_debug = CALL_BUFOP(minfo->pb_debug, kvaddr, minfo->pb_debug);
resourcemgr->minfo.phaddr_debug = CALL_BUFOP(minfo->pb_debug, phaddr, minfo->pb_debug);
#if !defined(ENABLE_DYNAMIC_MEM)
resourcemgr->minfo.dvaddr_taaisp = CALL_BUFOP(minfo->pb_taaisp, dvaddr, minfo->pb_taaisp);
resourcemgr->minfo.kvaddr_taaisp = CALL_BUFOP(minfo->pb_taaisp, kvaddr, minfo->pb_taaisp);
+
+#if defined(ENABLE_DNR_IN_MCSC)
+ resourcemgr->minfo.dvaddr_mcsc_dnr = CALL_BUFOP(minfo->pb_mcsc_dnr, dvaddr, minfo->pb_mcsc_dnr);
+ resourcemgr->minfo.kvaddr_mcsc_dnr = CALL_BUFOP(minfo->pb_mcsc_dnr, kvaddr, minfo->pb_mcsc_dnr);
+#else
+ resourcemgr->minfo.dvaddr_mcsc_dnr = 0;
+ resourcemgr->minfo.kvaddr_mcsc_dnr = 0;
+#endif
#endif
#if defined(ENABLE_FD_SW)
resourcemgr->minfo.dvaddr_lhfd = CALL_BUFOP(minfo->pb_lhfd, dvaddr, minfo->pb_lhfd);
resourcemgr->minfo.kvaddr_vra = 0;
#endif
-#if defined(ENABLE_DNR_IN_MCSC)
- resourcemgr->minfo.dvaddr_mcsc_dnr = CALL_BUFOP(minfo->pb_mcsc_dnr, dvaddr, minfo->pb_mcsc_dnr);
- resourcemgr->minfo.kvaddr_mcsc_dnr = CALL_BUFOP(minfo->pb_mcsc_dnr, kvaddr, minfo->pb_mcsc_dnr);
-#else
- resourcemgr->minfo.dvaddr_mcsc_dnr = 0;
- resourcemgr->minfo.kvaddr_mcsc_dnr = 0;
-#endif
-
#if defined(ENABLE_ODC) || defined(ENABLE_VDIS) || defined(ENABLE_DNR_IN_TPU)
resourcemgr->minfo.dvaddr_tpu = CALL_BUFOP(minfo->pb_tpu, dvaddr, minfo->pb_tpu);
resourcemgr->minfo.kvaddr_tpu = CALL_BUFOP(minfo->pb_tpu, kvaddr, minfo->pb_tpu);
resourcemgr->minfo.kvaddr_event_cnt = resourcemgr->minfo.kvaddr_event
+ EVENT_REGION_SIZE;
resourcemgr->minfo.kvaddr_setfile = CALL_BUFOP(minfo->pb_setfile, kvaddr, minfo->pb_setfile);
- resourcemgr->minfo.kvaddr_rear_cal = CALL_BUFOP(minfo->pb_rear_cal, kvaddr, minfo->pb_rear_cal);
- resourcemgr->minfo.kvaddr_front_cal = CALL_BUFOP(minfo->pb_front_cal, kvaddr, minfo->pb_front_cal);
+
+ for (i = 0; i < SENSOR_POSITION_MAX; i++)
+ resourcemgr->minfo.kvaddr_cal[i] =
+ CALL_BUFOP(minfo->pb_cal[i], kvaddr, minfo->pb_cal[i]);
probe_info("[RSC] Kernel virtual for library: %08lx\n", resourcemgr->minfo.kvaddr);
probe_info("[RSC] Kernel virtual for debug: %08lx\n", resourcemgr->minfo.kvaddr_debug);
{
struct fimc_is_mem *mem = &resourcemgr->mem;
struct fimc_is_minfo *minfo = &resourcemgr->minfo;
- size_t tnr_size;
-
- tnr_size = 0;
#if defined (ENABLE_TNR)
- /* 4 is double buffering & 2 instance for dual camera */
- tnr_size += ((SIZE_TNR_IMAGE_BUF + SIZE_TNR_WEIGHT_BUF) * 4);
+ size_t tnr_size = ((SIZE_TNR_IMAGE_BUF + SIZE_TNR_WEIGHT_BUF) * NUM_OF_TNR_BUF);
#endif
/* 3aa/isp internal DMA buffer */
- minfo->pb_taaisp = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, TAAISP_DMA_SIZE + tnr_size, 16);
+ minfo->pb_taaisp = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, TAAISP_DMA_SIZE, 16, NULL);
if (IS_ERR_OR_NULL(minfo->pb_taaisp)) {
err("failed to allocate buffer for TAAISP_DMA memory");
return -ENOMEM;
}
- info("[RSC] TAAISP_DMA memory size (aligned) : %08lx\n", TAAISP_DMA_SIZE + tnr_size);
+ info("[RSC] TAAISP_DMA memory size (aligned) : %08lx\n", TAAISP_DMA_SIZE);
+
+#if defined(ENABLE_TNR)
+ /* TNR internal DMA buffer */
+ minfo->pb_tnr = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, tnr_size, 16, NULL);
+ if (IS_ERR_OR_NULL(minfo->pb_tnr)) {
+ CALL_VOID_BUFOP(minfo->pb_taaisp, free, minfo->pb_taaisp);
+ err("failed to allocate buffer for TNR DMA");
+ return -ENOMEM;
+ }
+
+ info("[RSC] TNR_DMA memory size: %08lx\n", tnr_size);
+#endif
+
+#if defined (ENABLE_DNR_IN_MCSC)
+ minfo->pb_mcsc_dnr = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, MCSC_DNR_DMA_SIZE, 16, NULL);
+ if (IS_ERR_OR_NULL(minfo->pb_mcsc_dnr)) {
+ CALL_VOID_BUFOP(minfo->pb_taaisp, free, minfo->pb_taaisp);
+#if defined(ENABLE_TNR)
+ CALL_VOID_BUFOP(minfo->pb_tnr, free, minfo->pb_tnr);
+#endif
+ err("failed to allocate buffer for MCSC DNR");
+ return -ENOMEM;
+ }
+
+ info("[RSC] TDNR_DMA memory size: %08lx\n", MCSC_DNR_DMA_SIZE);
+#endif
return 0;
}
resourcemgr->minfo.dvaddr_taaisp = CALL_BUFOP(minfo->pb_taaisp, dvaddr, minfo->pb_taaisp);
resourcemgr->minfo.kvaddr_taaisp = CALL_BUFOP(minfo->pb_taaisp, kvaddr, minfo->pb_taaisp);
+ info("[RSC] TAAISP_DMA memory kva(%#lx), dva(%#lx)\n",
+ resourcemgr->minfo.kvaddr_taaisp, resourcemgr->minfo.dvaddr_taaisp);
+
+#if defined(ENABLE_DNR_IN_MCSC)
+ resourcemgr->minfo.dvaddr_mcsc_dnr = CALL_BUFOP(minfo->pb_mcsc_dnr, dvaddr, minfo->pb_mcsc_dnr);
+ resourcemgr->minfo.kvaddr_mcsc_dnr = CALL_BUFOP(minfo->pb_mcsc_dnr, kvaddr, minfo->pb_mcsc_dnr);
+ info("[RSC] MCSC_DNR_DMA memory kva(%#lx), dva(%#lx)\n",
+ resourcemgr->minfo.kvaddr_mcsc_dnr, resourcemgr->minfo.dvaddr_mcsc_dnr);
+#else
+ resourcemgr->minfo.dvaddr_mcsc_dnr = 0;
+ resourcemgr->minfo.kvaddr_mcsc_dnr = 0;
+#endif
info("[RSC] %s done\n", __func__);
p_err:
static int fimc_is_resourcemgr_deinit_dynamic_mem(struct fimc_is_resourcemgr *resourcemgr)
{
struct fimc_is_minfo *minfo = &resourcemgr->minfo;
- int ret = 0;
+#if defined(ENABLE_TNR)
+ CALL_VOID_BUFOP(minfo->pb_tnr, free, minfo->pb_tnr);
+#endif
+
+#if defined(ENABLE_DNR_IN_MCSC)
+ CALL_VOID_BUFOP(minfo->pb_mcsc_dnr, free, minfo->pb_mcsc_dnr);
+#endif
CALL_VOID_BUFOP(minfo->pb_taaisp, free, minfo->pb_taaisp);
- return ret;
+ return 0;
}
#endif /* #ifdef ENABLE_DYNAMIC_MEM */
+#if defined(SECURE_CAMERA_FACE)
+static int fimc_is_resourcemgr_alloc_secure_mem(struct fimc_is_resourcemgr *resourcemgr)
+{
+ struct fimc_is_mem *mem = &resourcemgr->mem;
+ struct fimc_is_minfo *minfo = &resourcemgr->minfo;
+
+ /* 3aa/isp internal DMA buffer */
+ minfo->pb_taaisp_s = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, TAAISP_DMA_SIZE, 16, NULL);
+ if (IS_ERR_OR_NULL(minfo->pb_taaisp_s)) {
+ err("failed to allocate buffer for TAAISP_DMA_S");
+ return -ENOMEM;
+ }
+
+ info("[RSC] TAAISP_DMA_S memory size (aligned) : %08lx\n", TAAISP_DMA_SIZE);
+
+ return 0;
+}
+
+static int fimc_is_resourcemgr_init_secure_mem(struct fimc_is_resourcemgr *resourcemgr)
+{
+ struct fimc_is_minfo *minfo = NULL;
+ struct fimc_is_core *core;
+ int ret = 0;
+
+ core = container_of(resourcemgr, struct fimc_is_core, resourcemgr);
+ FIMC_BUG(!core);
+
+ if (core->scenario != FIMC_IS_SCENARIO_SECURE)
+ return ret;
+
+ info("fimc_is_init_secure_mem - ION\n");
+
+ ret = fimc_is_resourcemgr_alloc_secure_mem(resourcemgr);
+ if (ret) {
+ err("Couldn't alloc for FIMC-IS\n");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ minfo = &resourcemgr->minfo;
+
+ resourcemgr->minfo.dvaddr_taaisp_s = CALL_BUFOP(minfo->pb_taaisp_s, dvaddr, minfo->pb_taaisp_s);
+ resourcemgr->minfo.kvaddr_taaisp_s = CALL_BUFOP(minfo->pb_taaisp_s, kvaddr, minfo->pb_taaisp_s);
+ info("[RSC] TAAISP_DMA_S memory kva(%#lx), dva(%#lx)\n",
+ resourcemgr->minfo.kvaddr_taaisp_s, resourcemgr->minfo.dvaddr_taaisp_s);
+
+ info("[RSC] %s done\n", __func__);
+p_err:
+ return ret;
+}
+
+static int fimc_is_resourcemgr_deinit_secure_mem(struct fimc_is_resourcemgr *resourcemgr)
+{
+ struct fimc_is_minfo *minfo = &resourcemgr->minfo;
+ struct fimc_is_core *core;
+ int ret = 0;
+
+ core = container_of(resourcemgr, struct fimc_is_core, resourcemgr);
+ FIMC_BUG(!core);
+
+ if (minfo->pb_taaisp_s)
+ CALL_VOID_BUFOP(minfo->pb_taaisp_s, free, minfo->pb_taaisp_s);
+
+ minfo->pb_taaisp_s = NULL;
+ resourcemgr->minfo.dvaddr_taaisp_s = 0;
+ resourcemgr->minfo.kvaddr_taaisp_s = 0;
+
+ info("[RSC] %s done\n", __func__);
+
+ return ret;
+}
+#endif
+
static struct vm_struct fimc_is_lib_vm;
static struct vm_struct fimc_is_heap_vm;
+static struct vm_struct fimc_is_heap_rta_vm;
#if defined(RESERVED_MEM_IN_DT)
static int fimc_is_rmem_device_init(struct reserved_mem *rmem,
struct device *dev)
vm_area_add_early(&fimc_is_heap_vm);
- probe_info("fimc-is heap memory: 0x%lx\n", HEAP_START);
+ probe_info("fimc-is heap DDK memory: 0x%lx\n", HEAP_START);
+
+ fimc_is_heap_rta_vm.addr = (void *)HEAP_RTA_START;
+ fimc_is_heap_rta_vm.size = HEAP_RTA_SIZE + PAGE_SIZE;
+
+ vm_area_add_early(&fimc_is_heap_rta_vm);
+
+ probe_info("fimc-is heap RTA memory: 0x%lx\n", HEAP_RTA_START);
return 0;
}
return 0;
}
-static int __init fimc_is_heap_mem_map(struct fimc_is_resourcemgr *resourcemgr)
+static int __init fimc_is_heap_mem_map(struct fimc_is_resourcemgr *resourcemgr,
+ struct vm_struct *vm, int heap_size)
{
struct fimc_is_mem *mem = &resourcemgr->mem;
- struct fimc_is_minfo *minfo = &resourcemgr->minfo;
+ struct fimc_is_priv_buf *pb;
struct scatterlist *sg;
struct sg_table *table;
int i, j;
- int npages = fimc_is_heap_vm.size / PAGE_SIZE;
+ int npages = vm->size / PAGE_SIZE;
struct page **pages = vmalloc(sizeof(struct page *) * npages);
struct page **tmp = pages;
- minfo->pb_heap_ddk = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, HEAP_SIZE, 16);
- if (IS_ERR_OR_NULL(minfo->pb_heap_ddk)) {
- err("failed to allocate buffer for DDK HEAP");
+ pb = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, heap_size, 16, NULL);
+ if (IS_ERR_OR_NULL(pb)) {
+ err("failed to allocate buffer for HEAP");
vfree(pages);
return -ENOMEM;
}
- table = minfo->pb_heap_ddk->sgt;
+ table = pb->sgt;
for_each_sg(table->sgl, sg, table->nents, i) {
int npages_this_entry = PAGE_ALIGN(sg->length) / PAGE_SIZE;
*(tmp++) = page++;
}
- if (map_vm_area(&fimc_is_heap_vm, PAGE_KERNEL, pages)) {
+ if (map_vm_area(vm, PAGE_KERNEL, pages)) {
probe_err("failed to mapping between virt and phys for binary");
- vunmap(fimc_is_heap_vm.addr);
+ vunmap(vm->addr);
vfree(pages);
- CALL_VOID_BUFOP(minfo->pb_heap_ddk, free, minfo->pb_heap_ddk);
+ CALL_VOID_BUFOP(pb, free, pb);
return -ENOMEM;
}
};
#endif
+#if defined(CONFIG_SOC_EXYNOS9610)
+static void fimc_is_resourcemgr_c2_disable_work(struct work_struct *data)
+{
+ info("%s: call cpuidle_pause()\n", __func__);
+ cpuidle_pause();
+}
+#endif
+
int fimc_is_resourcemgr_probe(struct fimc_is_resourcemgr *resourcemgr,
void *private_data, struct platform_device *pdev)
{
goto p_err;
}
- ret = fimc_is_heap_mem_map(resourcemgr);
+ ret = fimc_is_heap_mem_map(resourcemgr, &fimc_is_heap_vm, HEAP_SIZE);
+ if (ret) {
+ probe_err("fimc_is_heap_mem_map for HEAP_DDK is fail(%d)", ret);
+ goto p_err;
+ }
+
+ ret = fimc_is_heap_mem_map(resourcemgr, &fimc_is_heap_rta_vm, HEAP_RTA_SIZE);
if (ret) {
- probe_err("fimc_is_heap_mem_map is fail(%d)", ret);
+ probe_err("fimc_is_heap_mem_map for HEAP_RTA is fail(%d)", ret);
goto p_err;
}
resourcemgr->global_param.video_mode = 0;
resourcemgr->global_param.state = 0;
+#if defined(CONFIG_SOC_EXYNOS9610)
+ INIT_WORK(&resourcemgr->c2_disable_work, fimc_is_resourcemgr_c2_disable_work);
+#endif
+
p_err:
probe_info("[RSC] %s(%d)\n", __func__, ret);
return ret;
struct fimc_is_resource *resource_ischain;
resource_ischain = GET_RESOURCE(resourcemgr, RESOURCE_TYPE_ISCHAIN);
if ((rsc_type != RESOURCE_TYPE_ISCHAIN) && rsccount == 1) {
- if (atomic_read(&resource_ischain->rsccount) == 1)
+ if (atomic_read(&resource_ischain->rsccount) == 1) {
fimc_is_kernel_log_dump(false);
+ BUG_ON(1);
+ }
}
}
#endif
#endif
/* CSIS common DMA rcount set */
atomic_set(&core->csi_dma.rcount, 0);
-#if defined(CONFIG_SECURE_CAMERA_USE) && defined(NOT_SEPERATED_SYSREG)
+#if defined(SECURE_CAMERA_FACE)
mutex_init(&core->secure_state_lock);
core->secure_state = FIMC_IS_STATE_UNSECURE;
+ core->scenario = 0;
- dbgd_resource("%s: fimc-is secure state has reset\n", __func__);
+ info("%s: fimc-is secure state has reset\n", __func__);
#endif
core->dual_info.mode = FIMC_IS_DUAL_MODE_NOTHING;
core->dual_info.pre_mode = FIMC_IS_DUAL_MODE_NOTHING;
atomic_set(&core->i2c_rsccount[i], 0);
resourcemgr->global_param.state = 0;
+ resourcemgr->shot_timeout = FIMC_IS_SHOT_TIMEOUT;
+ resourcemgr->shot_timeout_tick = 0;
#ifdef ENABLE_DYNAMIC_MEM
ret = fimc_is_resourcemgr_init_dynamic_mem(resourcemgr);
goto p_err;
}
+#if defined(SECURE_CAMERA_FACE)
+ ret = fimc_is_resourcemgr_init_secure_mem(resourcemgr);
+ if (ret) {
+ err("fimc_is_resourcemgr_init_secure_mem is fail(%d)\n", ret);
+ goto p_err;
+ }
+#endif
+
ret = fimc_is_ischain_power(&core->ischain[0], 1);
if (ret) {
err("fimc_is_ischain_power is fail(%d)", ret);
#if defined(CONFIG_SOC_EXYNOS8895) || defined(CONFIG_SOC_EXYNOS9610)
/* HACK for 8895, cpuidle on/off */
+#if defined(CONFIG_SOC_EXYNOS9610)
+ schedule_work(&resourcemgr->c2_disable_work);
+#else
info("%s: call cpuidle_pause()\n", __func__);
cpuidle_pause();
#endif
+#endif
#ifdef CONFIG_EXYNOS_BTS
info("%s: call bts_update_scen(1)\n", __func__);
info("fimc_is_load_clear() done\n");
}
#endif
+
+#if defined(SECURE_CAMERA_FACE)
+ if (rsccount == 1)
+ ret = fimc_is_secure_func(core, NULL, FIMC_IS_SECURE_CAMERA_FACE,
+ core->scenario, SMC_SECCAM_UNPREPARE);
+#endif
+
switch (rsc_type) {
case RESOURCE_TYPE_PREPROC:
#if defined(CONFIG_PM)
if (ret)
err("fimc_is_interface_close is fail(%d)", ret);
+#if defined(SECURE_CAMERA_FACE)
+ ret = fimc_is_resourcemgr_deinit_secure_mem(resourcemgr);
+ if (ret)
+ err("fimc_is_resourcemgr_deinit_secure_mem is fail(%d)", ret);
+#endif
+
ret = fimc_is_debug_close();
if (ret)
err("fimc_is_debug_close is fail(%d)", ret);
#if defined(CONFIG_SOC_EXYNOS8895) || defined(CONFIG_SOC_EXYNOS9610)
/* HACK for 8895, cpuidle on/off */
info("%s: call cpuidle_resume()\n", __func__);
+#if defined(CONFIG_SOC_EXYNOS9610)
+ flush_work(&resourcemgr->c2_disable_work);
+#endif
cpuidle_resume();
#endif
err("fimc_is_resourcemgr_deinit_dynamic_mem is fail(%d)", ret);
#endif
-
current_min = (resourcemgr->cluster0 & CLUSTER_MIN_MASK) >> CLUSTER_MIN_SHIFT;
current_max = (resourcemgr->cluster0 & CLUSTER_MAX_MASK) >> CLUSTER_MAX_SHIFT;
if (current_min) {
struct mutex rsc_lock;
/* for sysreg setting */
struct mutex sysreg_lock;
+
+ u32 shot_timeout;
+ int shot_timeout_tick;
+
+#if defined(CONFIG_SOC_EXYNOS9610)
+ struct work_struct c2_disable_work;
+#endif
};
int fimc_is_resourcemgr_probe(struct fimc_is_resourcemgr *resourcemgr, void *private_data, struct platform_device *pdev);
subdev = &ischain->ixp;
break;
case FIMC_IS_VIDEO_ME0C_NUM:
+ case FIMC_IS_VIDEO_ME1C_NUM:
subdev = &ischain->mexc;
break;
case FIMC_IS_VIDEO_D0S_NUM:
static int fimc_is_subdev_internal_alloc_buffer(struct fimc_is_subdev *subdev,
struct fimc_is_mem *mem)
{
- int ret = 0;
+ int ret;
int i;
- int buffer_size = 0;
+ int buffer_size;
struct fimc_is_frame *frame;
FIMC_BUG(!subdev);
}
for (i = 0; i < subdev->buffer_num; i++) {
- /* TODO : buffer alloc format change */
- buffer_size = ALIGN(subdev->output.width * 2, 16) * subdev->output.height;
+ buffer_size = subdev->output.width * subdev->output.height
+ * subdev->bytes_per_pixel;
if (buffer_size <= 0) {
err("wrong internal subdev buffer size(%d)", buffer_size);
return -EINVAL;
}
- subdev->pb_subdev[i] = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, buffer_size, 16);
+ subdev->pb_subdev[i] = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, buffer_size, 0, NULL);
if (IS_ERR_OR_NULL(subdev->pb_subdev[i])) {
err("failed to allocate buffer for internal subdev");
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err_allocate_pb_subdev;
}
-
- subdev->dvaddr_subdev[i] = CALL_BUFOP(subdev->pb_subdev[i], dvaddr, subdev->pb_subdev[i]);
- subdev->kvaddr_subdev[i] = CALL_BUFOP(subdev->pb_subdev[i], kvaddr, subdev->pb_subdev[i]);
}
ret = frame_manager_open(&subdev->internal_framemgr, subdev->buffer_num);
if (ret) {
err("fimc_is_frame_open is fail(%d)", ret);
- goto p_err;
+ ret = -EINVAL;
+ goto err_open_framemgr;
}
for (i = 0; i < subdev->buffer_num; i++) {
/* TODO : support multi-plane */
frame->planes = 1;
- frame->dvaddr_buffer[0] = subdev->dvaddr_subdev[i];
- frame->kvaddr_buffer[0] = subdev->kvaddr_subdev[i];
+ frame->dvaddr_buffer[0] = CALL_BUFOP(subdev->pb_subdev[i], dvaddr, subdev->pb_subdev[i]);
+ frame->kvaddr_buffer[0] = CALL_BUFOP(subdev->pb_subdev[i], kvaddr, subdev->pb_subdev[i]);
set_bit(FRAME_MEM_INIT, &frame->mem_state);
}
info("[%d] %s (subdev_id: %d, size: %d, buffernum: %d)",
subdev->instance, __func__, subdev->id, buffer_size, subdev->buffer_num);
-p_err:
+ return 0;
+
+err_open_framemgr:
+err_allocate_pb_subdev:
+ while (i-- > 0)
+ CALL_VOID_BUFOP(subdev->pb_subdev[i], free, subdev->pb_subdev[i]);
+
return ret;
};
ret = -EINVAL;
goto p_err;
}
-
- //csi->dma_subdev[i] = NULL;
}
p_err:
/* VC type dependent value setting */
switch (vci_cfg->type) {
case VC_TAILPDAF:
- subdev->pixelformat = V4L2_PIX_FMT_SBGGR16;
- subdev->buffer_num = 8;
+ subdev->buffer_num = SUBDEV_INTERNAL_BUF_MAX;
subdev->vc_buffer_offset = module->vc_buffer_offset[ch];
snprintf(subdev->data_type, sizeof(subdev->data_type), "VC_TAILPDAF");
break;
case VC_MIPISTAT:
- subdev->pixelformat = V4L2_PIX_FMT_SBGGR16;
- subdev->buffer_num = 8;
+ subdev->buffer_num = SUBDEV_INTERNAL_BUF_MAX;
subdev->vc_buffer_offset = module->vc_buffer_offset[ch];
snprintf(subdev->data_type, sizeof(subdev->data_type), "VC_MIPISTAT");
break;
case VC_EMBEDDED:
- subdev->pixelformat = V4L2_PIX_FMT_SBGGR16;
- subdev->buffer_num = 8;
+ subdev->buffer_num = SUBDEV_INTERNAL_BUF_MAX;
subdev->vc_buffer_offset = module->vc_buffer_offset[ch];
snprintf(subdev->data_type, sizeof(subdev->data_type), "VC_EMBEDDED");
break;
+ case VC_PRIVATE:
+ subdev->buffer_num = SUBDEV_INTERNAL_BUF_MAX;
+ subdev->vc_buffer_offset = module->vc_buffer_offset[ch];
+ snprintf(subdev->data_type, sizeof(subdev->data_type), "VC_PRIVATE");
+ break;
default:
err("wrong internal vc ch(%d) type(%d)", ch, vci_cfg->type);
return -EINVAL;
subdev->output.crop.w = subdev->output.width;
subdev->output.crop.h = subdev->output.height;
- /* TODO: remove this */
- //csi->dma_subdev[ch] = subdev;
+ if (vci_cfg->type == VC_TAILPDAF)
+ subdev->bytes_per_pixel = 2;
+ else
+ subdev->bytes_per_pixel = 1;
set_bit(FIMC_IS_SUBDEV_INTERNAL_S_FMT, &subdev->state);
}
struct list_head list;
/* for internal use */
- u32 pixelformat;
struct fimc_is_framemgr internal_framemgr;
u32 buffer_num;
+ u32 bytes_per_pixel;
u32 vc_buffer_offset;
struct fimc_is_priv_buf *pb_subdev[SUBDEV_INTERNAL_BUF_MAX];
- dma_addr_t dvaddr_subdev[SUBDEV_INTERNAL_BUF_MAX];
- ulong kvaddr_subdev[SUBDEV_INTERNAL_BUF_MAX];
char data_type[15];
struct fimc_is_video_ctx *vctx;
struct fimc_is_video_ctx *vctx,
void *ctl_data);
int fimc_is_subdev_close(struct fimc_is_subdev *subdev);
-int fimc_is_subdev_reqbuf(struct fimc_is_subdev *subdev);
int fimc_is_subdev_buffer_queue(struct fimc_is_subdev *subdev, struct vb2_buffer *vb);
int fimc_is_subdev_buffer_finish(struct fimc_is_subdev *subdev, struct vb2_buffer *vb);
return ret;
}
+int fimc_is_32s_video_probe(void *data)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct fimc_is_video *video;
+
+ FIMC_BUG(!data);
+
+ core = (struct fimc_is_core *)data;
+ video = &core->video_32s;
+ video->resourcemgr = &core->resourcemgr;
+
+ if (!core->pdev) {
+ probe_err("pdev is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_video_probe(video,
+ FIMC_IS_VIDEO_3XS_NAME(2),
+ FIMC_IS_VIDEO_32S_NUM,
+ VFL_DIR_M2M,
+ &core->resourcemgr.mem,
+ &core->v4l2_dev,
+ &fimc_is_3aa_video_fops,
+ &fimc_is_3aa_video_ioctl_ops);
+ if (ret)
+ dev_err(&core->pdev->dev, "%s is fail(%d)\n", __func__, ret);
+
+p_err:
+ return ret;
+}
+
/*
* =============================================================================
* Video File Opertation
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (!test_bit(FRAME_MEM_MAPPED, &frame->mem_state)) {
fimc_is_itf_map(device, GROUP_ID(device->group_3aa.id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
p_err:
minfo("[3%dS:V] %s(%d):%d\n", device, GET_3XS_ID(GET_VIDEO(vctx)), __func__, buf->index, ret);
return ret;
}
-static int fimc_is_3aa_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_3aa_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_3aa_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_3aa_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_3aa_qops = {
.queue_setup = fimc_is_3aa_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_3aa_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_3aa_buffer_queue,
.buf_finish = fimc_is_3aa_buffer_finish,
- .wait_prepare = fimc_is_3aa_wait_prepare,
- .wait_finish = fimc_is_3aa_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_3aa_start_streaming,
.stop_streaming = fimc_is_3aa_stop_streaming,
};
return ret;
}
-static int fimc_is_3xc_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_3xc_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_3xc_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_3xc_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_3xc_qops = {
.queue_setup = fimc_is_3xc_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_3xc_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_3xc_buffer_queue,
.buf_finish = fimc_is_3xc_buffer_finish,
- .wait_prepare = fimc_is_3xc_wait_prepare,
- .wait_finish = fimc_is_3xc_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_3xc_start_streaming,
.stop_streaming = fimc_is_3xc_stop_streaming,
};
return ret;
}
-static int fimc_is_3xf_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_3xf_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_3xf_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_3xf_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_3xf_qops = {
.queue_setup = fimc_is_3xf_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_3xf_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_3xf_buffer_queue,
.buf_finish = fimc_is_3xf_buffer_finish,
- .wait_prepare = fimc_is_3xf_wait_prepare,
- .wait_finish = fimc_is_3xf_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_3xf_start_streaming,
.stop_streaming = fimc_is_3xf_stop_streaming,
};
return ret;
}
-static int fimc_is_3xg_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_3xg_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_3xg_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_3xg_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_3xg_qops = {
.queue_setup = fimc_is_3xg_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_3xg_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_3xg_buffer_queue,
.buf_finish = fimc_is_3xg_buffer_finish,
- .wait_prepare = fimc_is_3xg_wait_prepare,
- .wait_finish = fimc_is_3xg_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_3xg_start_streaming,
.stop_streaming = fimc_is_3xg_stop_streaming,
};
return ret;
}
+int fimc_is_32p_video_probe(void *data)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct fimc_is_video *video;
+
+ FIMC_BUG(!data);
+
+ core = (struct fimc_is_core *)data;
+ video = &core->video_32p;
+ video->resourcemgr = &core->resourcemgr;
+
+ if (!core->pdev) {
+ probe_err("pdev is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_video_probe(video,
+ FIMC_IS_VIDEO_3XP_NAME(2),
+ FIMC_IS_VIDEO_32P_NUM,
+ VFL_DIR_RX,
+ &core->resourcemgr.mem,
+ &core->v4l2_dev,
+ &fimc_is_3xp_video_fops,
+ &fimc_is_3xp_video_ioctl_ops);
+ if (ret)
+ dev_err(&core->pdev->dev, "%s is fail(%d)\n", __func__, ret);
+
+p_err:
+ return ret;
+}
+
/*
* =============================================================================
* Video File Opertation
return ret;
}
-static int fimc_is_3xp_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_3xp_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_3xp_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_3xp_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_3xp_qops = {
.queue_setup = fimc_is_3xp_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_3xp_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_3xp_buffer_queue,
.buf_finish = fimc_is_3xp_buffer_finish,
- .wait_prepare = fimc_is_3xp_wait_prepare,
- .wait_finish = fimc_is_3xp_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_3xp_start_streaming,
.stop_streaming = fimc_is_3xp_stop_streaming,
};
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (!test_bit(FRAME_MEM_MAPPED, &frame->mem_state)) {
fimc_is_itf_map(device, GROUP_ID(device->group_dcp.id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
p_err:
minfo("[D%dS:V] %s(%d):%d\n", device, GET_DCPXS_ID(GET_VIDEO(vctx)), __func__, buf->index, ret);
return ret;
}
-static int fimc_is_dcpxs_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_dcpxs_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_dcpxs_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_dcpxs_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_dcpxs_qops = {
.queue_setup = fimc_is_dcpxs_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_dcpxs_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_dcpxs_buffer_queue,
.buf_finish = fimc_is_dcpxs_buffer_finish,
- .wait_prepare = fimc_is_dcpxs_wait_prepare,
- .wait_finish = fimc_is_dcpxs_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_dcpxs_start_streaming,
.stop_streaming = fimc_is_dcpxs_stop_streaming,
};
return ret;
}
-static int fimc_is_dcpxc_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_dcpxc_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_dcpxc_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_dcpxc_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_dcpxc_qops = {
.queue_setup = fimc_is_dcpxc_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_dcpxc_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_dcpxc_buffer_queue,
.buf_finish = fimc_is_dcpxc_buffer_finish,
- .wait_prepare = fimc_is_dcpxc_wait_prepare,
- .wait_finish = fimc_is_dcpxc_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_dcpxc_start_streaming,
.stop_streaming = fimc_is_dcpxc_stop_streaming,
};
return ret;
}
-static int fimc_is_dcp1s_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_dcp1s_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_dcp1s_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_dcp1s_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_dcp1s_qops = {
.queue_setup = fimc_is_dcp1s_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_dcp1s_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_dcp1s_buffer_queue,
.buf_finish = fimc_is_dcp1s_buffer_finish,
- .wait_prepare = fimc_is_dcp1s_wait_prepare,
- .wait_finish = fimc_is_dcp1s_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_dcp1s_start_streaming,
.stop_streaming = fimc_is_dcp1s_stop_streaming,
};
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (!test_bit(FRAME_MEM_MAPPED, &frame->mem_state)) {
fimc_is_itf_map(device, GROUP_ID(device->group_dis.id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
p_err:
minfo("[D%dS:V] %s(%d):%d\n", device, GET_DXS_ID(GET_VIDEO(vctx)), __func__, buf->index, ret);
return ret;
}
-static int fimc_is_dxs_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_dxs_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_dxs_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_dxs_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_dxs_qops = {
.queue_setup = fimc_is_dxs_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_dxs_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_dxs_buffer_queue,
.buf_finish = fimc_is_dxs_buffer_finish,
- .wait_prepare = fimc_is_dxs_wait_prepare,
- .wait_finish = fimc_is_dxs_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_dxs_start_streaming,
.stop_streaming = fimc_is_dxs_stop_streaming,
};
return ret;
}
-static int fimc_is_dxc_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_dxc_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_dxc_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_dxc_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_dxc_qops = {
.queue_setup = fimc_is_dxc_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_dxc_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_dxc_buffer_queue,
.buf_finish = fimc_is_dxc_buffer_finish,
- .wait_prepare = fimc_is_dxc_wait_prepare,
- .wait_finish = fimc_is_dxc_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_dxc_start_streaming,
.stop_streaming = fimc_is_dxc_stop_streaming,
};
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (!test_bit(FRAME_MEM_MAPPED, &frame->mem_state)) {
fimc_is_itf_map(device, GROUP_ID(device->group_isp.id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
p_err:
minfo("[I%dS:V] %s(%d):%d\n", device, GET_IXS_ID(GET_VIDEO(vctx)), __func__, buf->index, ret);
return ret;
}
-static int fimc_is_ixs_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ixs_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ixs_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ixs_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ixs_qops = {
.queue_setup = fimc_is_ixs_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ixs_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ixs_buffer_queue,
.buf_finish = fimc_is_ixs_buffer_finish,
- .wait_prepare = fimc_is_ixs_wait_prepare,
- .wait_finish = fimc_is_ixs_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ixs_start_streaming,
.stop_streaming = fimc_is_ixs_stop_streaming,
};
return ret;
}
-static int fimc_is_ixc_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ixc_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ixc_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ixc_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ixc_qops = {
.queue_setup = fimc_is_ixc_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ixc_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ixc_buffer_queue,
.buf_finish = fimc_is_ixc_buffer_finish,
- .wait_prepare = fimc_is_ixc_wait_prepare,
- .wait_finish = fimc_is_ixc_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ixc_start_streaming,
.stop_streaming = fimc_is_ixc_stop_streaming,
};
return ret;
}
-static int fimc_is_ixp_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ixp_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ixp_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ixp_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ixp_qops = {
.queue_setup = fimc_is_ixp_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ixp_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ixp_buffer_queue,
.buf_finish = fimc_is_ixp_buffer_finish,
- .wait_prepare = fimc_is_ixp_wait_prepare,
- .wait_finish = fimc_is_ixp_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ixp_start_streaming,
.stop_streaming = fimc_is_ixp_stop_streaming,
};
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (!test_bit(FRAME_MEM_MAPPED, &frame->mem_state)) {
fimc_is_itf_map(device, GROUP_ID(device->group_mcs.id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
p_err:
minfo("[M%dS:V] %s(%d):%d\n", device, GET_MXS_ID(GET_VIDEO(vctx)), __func__, buf->index, ret);
return ret;
}
-static int fimc_is_mcs_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_mcs_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_mcs_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_mcs_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_mcs_qops = {
.queue_setup = fimc_is_mcs_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_mcs_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_mcs_buffer_queue,
.buf_finish = fimc_is_mcs_buffer_finish,
- .wait_prepare = fimc_is_mcs_wait_prepare,
- .wait_finish = fimc_is_mcs_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_mcs_start_streaming,
.stop_streaming = fimc_is_mcs_stop_streaming,
};
return ret;
}
-static int fimc_is_mxp_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_mxp_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_mxp_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_mxp_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_mxp_qops = {
.queue_setup = fimc_is_mxp_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_mxp_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_mxp_buffer_queue,
.buf_finish = fimc_is_mxp_buffer_finish,
- .wait_prepare = fimc_is_mxp_wait_prepare,
- .wait_finish = fimc_is_mxp_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_mxp_start_streaming,
.stop_streaming = fimc_is_mxp_stop_streaming,
};
return ret;
}
+int fimc_is_me1c_video_probe(void *data)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct fimc_is_video *video;
+
+ FIMC_BUG(!data);
+
+ core = (struct fimc_is_core *)data;
+ video = &core->video_me1c;
+ video->resourcemgr = &core->resourcemgr;
+
+ if (!core->pdev) {
+ probe_err("pdev is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_video_probe(video,
+ FIMC_IS_VIDEO_MEXC_NAME(1),
+ FIMC_IS_VIDEO_ME1C_NUM,
+ VFL_DIR_RX,
+ &core->resourcemgr.mem,
+ &core->v4l2_dev,
+ &fimc_is_mexc_video_fops,
+ &fimc_is_mexc_video_ioctl_ops);
+ if (ret)
+ dev_err(&core->pdev->dev, "%s is fail(%d)\n", __func__, ret);
+
+p_err:
+ return ret;
+}
+
/*
* =============================================================================
* Video File Opertation
video = GET_VIDEO(vctx);
queue = GET_QUEUE(vctx);
+ set_bit(IS_QUEUE_NEED_TO_KMAP, &queue->state);
+
ret = fimc_is_queue_setup(queue,
video->alloc_ctx,
num_planes,
return ret;
}
-static int fimc_is_mexc_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_mexc_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_mexc_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_mexc_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_mexc_qops = {
.queue_setup = fimc_is_mexc_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_mexc_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_mexc_buffer_queue,
.buf_finish = fimc_is_mexc_buffer_finish,
- .wait_prepare = fimc_is_mexc_wait_prepare,
- .wait_finish = fimc_is_mexc_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_mexc_start_streaming,
.stop_streaming = fimc_is_mexc_stop_streaming,
};
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (!test_bit(FRAME_MEM_MAPPED, &frame->mem_state)) {
fimc_is_itf_map(device, GROUP_ID(device->group_3aa.id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
p_err:
minfo("[PAF%dS:V] %s(%d):%d\n", device, GET_PAFXS_ID(GET_VIDEO(vctx)), __func__, buf->index, ret);
return ret;
}
-static int fimc_is_paf_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_paf_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_paf_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_paf_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_paf_qops = {
.queue_setup = fimc_is_paf_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_paf_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_paf_buffer_queue,
.buf_finish = fimc_is_paf_buffer_finish,
- .wait_prepare = fimc_is_paf_wait_prepare,
- .wait_finish = fimc_is_paf_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_paf_start_streaming,
.stop_streaming = fimc_is_paf_stop_streaming,
};
return ret;
}
-static int fimc_is_scc_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_scc_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_scc_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
static int fimc_is_scc_start_streaming(struct vb2_queue *vbq,
unsigned int count)
const struct vb2_ops fimc_is_scc_qops = {
.queue_setup = fimc_is_scc_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_scc_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_scc_buffer_queue,
.buf_finish = fimc_is_scc_buffer_finish,
- .wait_prepare = fimc_is_scc_wait_prepare,
- .wait_finish = fimc_is_scc_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_scc_start_streaming,
.stop_streaming = fimc_is_scc_stop_streaming,
};
return ret;
}
-static int fimc_is_scp_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_scp_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_scp_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_scp_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_scp_qops = {
.queue_setup = fimc_is_scp_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_scp_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_scp_buffer_queue,
.buf_finish = fimc_is_scp_buffer_finish,
- .wait_prepare = fimc_is_scp_wait_prepare,
- .wait_finish = fimc_is_scp_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_scp_start_streaming,
.stop_streaming = fimc_is_scp_stop_streaming,
};
case V4L2_CID_IS_INTENT:
case V4L2_CID_IS_CAPTURE_EXPOSURETIME:
case V4L2_CID_IS_TRANSIENT_ACTION:
+ case V4L2_CID_IS_FACTORY_APERTURE_CONTROL:
ret = fimc_is_video_s_ctrl(file, vctx, ctrl);
if (ret) {
merr("fimc_is_video_s_ctrl is fail(%d)", device, ret);
case VENDER_G_CTRL:
/* This s_ctrl is needed to skip, when the s_ctrl id was found. */
break;
-
+ case V4L2_CID_IS_G_SENSOR_FACTORY_RESULT:
+ if (test_bit(FIMC_IS_SENSOR_S_INPUT, &device->state))
+ ctrl->value = 1;
+ else
+ ctrl->value = 0;
+ break;
default:
ret = fimc_is_sensor_g_ctrl(device, ctrl);
if (ret) {
return ret;
}
-static int fimc_is_ssx_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ssx_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ssx_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ssx_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ssx_qops = {
.queue_setup = fimc_is_ssx_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ssx_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ssx_buffer_queue,
.buf_finish = fimc_is_ssx_buffer_finish,
- .wait_prepare = fimc_is_ssx_wait_prepare,
- .wait_finish = fimc_is_ssx_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ssx_start_streaming,
.stop_streaming = fimc_is_ssx_stop_streaming,
};
return ret;
}
-static int fimc_is_ssxvc0_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ssxvc0_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ssxvc0_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ssxvc0_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ssxvc0_qops = {
.queue_setup = fimc_is_ssxvc0_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ssxvc0_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ssxvc0_buffer_queue,
.buf_finish = fimc_is_ssxvc0_buffer_finish,
- .wait_prepare = fimc_is_ssxvc0_wait_prepare,
- .wait_finish = fimc_is_ssxvc0_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ssxvc0_start_streaming,
.stop_streaming = fimc_is_ssxvc0_stop_streaming,
};
return ret;
}
-static int fimc_is_ssxvc1_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ssxvc1_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ssxvc1_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ssxvc1_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ssxvc1_qops = {
.queue_setup = fimc_is_ssxvc1_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ssxvc1_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ssxvc1_buffer_queue,
.buf_finish = fimc_is_ssxvc1_buffer_finish,
- .wait_prepare = fimc_is_ssxvc1_wait_prepare,
- .wait_finish = fimc_is_ssxvc1_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ssxvc1_start_streaming,
.stop_streaming = fimc_is_ssxvc1_stop_streaming,
};
return ret;
}
-static int fimc_is_ssxvc2_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ssxvc2_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ssxvc2_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ssxvc2_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ssxvc2_qops = {
.queue_setup = fimc_is_ssxvc2_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ssxvc2_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ssxvc2_buffer_queue,
.buf_finish = fimc_is_ssxvc2_buffer_finish,
- .wait_prepare = fimc_is_ssxvc2_wait_prepare,
- .wait_finish = fimc_is_ssxvc2_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ssxvc2_start_streaming,
.stop_streaming = fimc_is_ssxvc2_stop_streaming,
};
return ret;
}
-static int fimc_is_ssxvc3_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_ssxvc3_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_ssxvc3_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_ssxvc3_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_ssxvc3_qops = {
.queue_setup = fimc_is_ssxvc3_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_ssxvc3_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_ssxvc3_buffer_queue,
.buf_finish = fimc_is_ssxvc3_buffer_finish,
- .wait_prepare = fimc_is_ssxvc3_wait_prepare,
- .wait_finish = fimc_is_ssxvc3_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_ssxvc3_start_streaming,
.stop_streaming = fimc_is_ssxvc3_stop_streaming,
};
goto p_err;
}
+#ifdef ENABLE_IS_CORE
if (!test_bit(FRAME_MEM_MAPPED, &frame->mem_state)) {
fimc_is_itf_map(device, GROUP_ID(device->group_vra.id), frame->dvaddr_shot, frame->shot_size);
set_bit(FRAME_MEM_MAPPED, &frame->mem_state);
}
+#endif
p_err:
minfo("[VRA:V] %s(%d):%d\n", device, __func__, buf->index, ret);
struct fimc_is_video_ctx *vctx = vbq->drv_priv;
struct fimc_is_video *video;
struct fimc_is_queue *queue;
+#if defined(SECURE_CAMERA_FACE)
+ struct fimc_is_core *core =
+ (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+#endif
FIMC_BUG(!vctx);
FIMC_BUG(!vctx->video);
video = GET_VIDEO(vctx);
queue = GET_QUEUE(vctx);
+#if defined(SECURE_CAMERA_FACE)
+ if (core->scenario == FIMC_IS_SCENARIO_SECURE)
+ set_bit(IS_QUEUE_NEED_TO_REMAP, &queue->state);
+#endif
+
ret = fimc_is_queue_setup(queue,
video->alloc_ctx,
num_planes,
return ret;
}
-static int fimc_is_vra_buffer_prepare(struct vb2_buffer *vb)
-{
- return fimc_is_queue_prepare(vb);
-}
-
-static inline void fimc_is_vra_wait_prepare(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_prepare(vbq);
-}
-
-static inline void fimc_is_vra_wait_finish(struct vb2_queue *vbq)
-{
- fimc_is_queue_wait_finish(vbq);
-}
-
static int fimc_is_vra_start_streaming(struct vb2_queue *vbq,
unsigned int count)
{
const struct vb2_ops fimc_is_vra_qops = {
.queue_setup = fimc_is_vra_queue_setup,
- .buf_init = fimc_is_buffer_init,
- .buf_prepare = fimc_is_vra_buffer_prepare,
+ .buf_init = fimc_is_queue_buffer_init,
+ .buf_cleanup = fimc_is_queue_buffer_cleanup,
+ .buf_prepare = fimc_is_queue_buffer_prepare,
.buf_queue = fimc_is_vra_buffer_queue,
.buf_finish = fimc_is_vra_buffer_finish,
- .wait_prepare = fimc_is_vra_wait_prepare,
- .wait_finish = fimc_is_vra_wait_finish,
+ .wait_prepare = fimc_is_queue_wait_prepare,
+ .wait_finish = fimc_is_queue_wait_finish,
.start_streaming = fimc_is_vra_start_streaming,
.stop_streaming = fimc_is_vra_stop_streaming,
};
#include <linux/syscalls.h>
#include <linux/videodev2_exynos_media.h>
#include <linux/dma-buf.h>
-#include <linux/dma-buf-container.h>
#include <media/videobuf2-v4l2.h>
#include <media/v4l2-ctrls.h>
#include "fimc-is-mem.h"
#include "fimc-is-video.h"
-#define SPARE_PLANE 1
-#define SPARE_SIZE (32 * 1024)
+#define NUM_OF_META_PLANE 1
+#define SIZE_OF_META_PLANE SZ_32K
struct fimc_is_fmt fimc_is_formats[] = {
{
.name = "YUV 4:4:4 packed, YCbCr",
.pixelformat = V4L2_PIX_FMT_YUV444,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.mbus_code = 0, /* Not Defined */
.bitsperpixel = { 24 },
.hw_format = DMA_OUTPUT_FORMAT_YUV444,
}, {
.name = "YUV 4:2:2 packed, YCbYCr",
.pixelformat = V4L2_PIX_FMT_YUYV,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
.bitsperpixel = { 16 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
}, {
.name = "YUV 4:2:2 packed, YCbYCr",
.pixelformat = V4L2_PIX_FMT_YUYV,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
.bitsperpixel = { 16 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
}, {
.name = "YUV 4:2:2 packed, CbYCrY",
.pixelformat = V4L2_PIX_FMT_UYVY,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,
.bitsperpixel = { 16 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
}, {
.name = "YUV 4:2:2 planar, Y/CbCr",
.pixelformat = V4L2_PIX_FMT_NV16,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "YUV 4:2:2 planar, Y/CbCr",
.pixelformat = V4L2_PIX_FMT_NV61,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_CrCb,
}, {
.name = "YUV 4:2:2 non-contiguous 2-planar,, Y/CbCr",
.pixelformat = V4L2_PIX_FMT_NV16M,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "YUV 4:2:2 non-contiguous 2-planar, Y/CbCr",
.pixelformat = V4L2_PIX_FMT_NV61M,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_CrCb,
}, {
.name = "YUV 4:2:2 planar, Y/Cb/Cr",
.pixelformat = V4L2_PIX_FMT_YUV422P,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "YUV 4:2:0 planar, YCbCr",
.pixelformat = V4L2_PIX_FMT_YUV420,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 4, 4 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "YUV 4:2:0 planar, YCbCr",
.pixelformat = V4L2_PIX_FMT_YVU420,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 4, 4 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "YUV 4:2:0 planar, Y/CbCr",
.pixelformat = V4L2_PIX_FMT_NV12,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "YUV 4:2:0 planar, Y/CrCb",
.pixelformat = V4L2_PIX_FMT_NV21,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_CrCb,
}, {
.name = "YUV 4:2:0 non-contiguous 2-planar, Y/CbCr",
.pixelformat = V4L2_PIX_FMT_NV12M,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "YVU 4:2:0 non-contiguous 2-planar, Y/CrCb",
.pixelformat = V4L2_PIX_FMT_NV21M,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_CrCb,
}, {
.name = "YUV 4:2:0 non-contiguous 3-planar, Y/Cb/Cr",
.pixelformat = V4L2_PIX_FMT_YUV420M,
- .num_planes = 3 + SPARE_PLANE,
+ .num_planes = 3 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 4, 4 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "YUV 4:2:0 non-contiguous 3-planar, Y/Cr/Cb",
.pixelformat = V4L2_PIX_FMT_YVU420M,
- .num_planes = 3 + SPARE_PLANE,
+ .num_planes = 3 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 4, 4 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "BAYER 8 bit(GRBG)",
.pixelformat = V4L2_PIX_FMT_SGRBG8,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8 },
.hw_format = DMA_OUTPUT_FORMAT_BAYER,
.hw_order = DMA_OUTPUT_ORDER_GB_BG,
}, {
.name = "BAYER 8 bit(BA81)",
.pixelformat = V4L2_PIX_FMT_SBGGR8,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8 },
.hw_format = DMA_OUTPUT_FORMAT_BAYER,
.hw_order = DMA_OUTPUT_ORDER_GB_BG,
}, {
.name = "BAYER 10 bit",
.pixelformat = V4L2_PIX_FMT_SBGGR10,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 10 },
.hw_format = DMA_OUTPUT_FORMAT_BAYER_PACKED,
.hw_order = DMA_OUTPUT_ORDER_GB_BG,
}, {
.name = "BAYER 12 bit",
.pixelformat = V4L2_PIX_FMT_SBGGR12,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 12 },
.hw_format = DMA_OUTPUT_FORMAT_BAYER_PACKED,
.hw_order = DMA_OUTPUT_ORDER_GB_BG,
}, {
.name = "BAYER 16 bit",
.pixelformat = V4L2_PIX_FMT_SBGGR16,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 16 },
.hw_format = DMA_OUTPUT_FORMAT_BAYER,
.hw_order = DMA_OUTPUT_ORDER_GB_BG,
}, {
.name = "ARGB8888",
.pixelformat = V4L2_PIX_FMT_RGB32,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 32 },
.hw_format = DMA_OUTPUT_FORMAT_RGB,
.hw_order = DMA_OUTPUT_ORDER_ARGB,
}, {
.name = "Y 8bit",
.pixelformat = V4L2_PIX_FMT_GREY,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 8 },
.hw_format = DMA_OUTPUT_FORMAT_Y,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "Y 10bit",
.pixelformat = V4L2_PIX_FMT_Y10,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 16 },
.hw_format = DMA_OUTPUT_FORMAT_Y,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "Y 12bit",
.pixelformat = V4L2_PIX_FMT_Y12,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 16 },
.hw_format = DMA_OUTPUT_FORMAT_Y,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "Y Packed 10bit",
.pixelformat = V4L2_PIX_FMT_Y10BPACK,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 10 },
.hw_format = DMA_OUTPUT_FORMAT_Y,
.hw_order = DMA_OUTPUT_ORDER_NO,
}, {
.name = "P210_16B",
.pixelformat = V4L2_PIX_FMT_NV16M_P210,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 16, 16 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "P210_10B",
.pixelformat = V4L2_PIX_FMT_NV16M_P210,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 10, 10 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "P010_16B",
.pixelformat = V4L2_PIX_FMT_NV12M_P010,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 16, 16 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "P010_10B",
.pixelformat = V4L2_PIX_FMT_NV12M_P010,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 10, 10 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "YUV422 2P 10bit(8+2)",
.pixelformat = V4L2_PIX_FMT_NV16M_S10B,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV422,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "YUV420 2P 10bit(8+2)",
.pixelformat = V4L2_PIX_FMT_NV12M_S10B,
- .num_planes = 2 + SPARE_PLANE,
+ .num_planes = 2 + NUM_OF_META_PLANE,
.bitsperpixel = { 8, 8 },
.hw_format = DMA_OUTPUT_FORMAT_YUV420,
.hw_order = DMA_OUTPUT_ORDER_CbCr,
}, {
.name = "JPEG",
.pixelformat = V4L2_PIX_FMT_JPEG,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.mbus_code = MEDIA_BUS_FMT_JPEG_1X8,
.bitsperpixel = { 8 },
.hw_format = 0,
}, {
.name = "DEPTH",
.pixelformat = V4L2_PIX_FMT_Z16,
- .num_planes = 1 + SPARE_PLANE,
+ .num_planes = 1 + NUM_OF_META_PLANE,
.bitsperpixel = { 32 },
.hw_format = 0,
.hw_order = DMA_OUTPUT_ORDER_NO,
{
u32 plane;
u32 width[FIMC_IS_MAX_PLANES];
- u32 image_planes;
+ u32 image_planes = num_planes - NUM_OF_META_PLANE;
FIMC_BUG_VOID(!frame);
FIMC_BUG_VOID(!frame->format);
- image_planes = num_planes - SPARE_PLANE;
-
for (plane = 0; plane < FIMC_IS_MAX_PLANES; ++plane)
width[plane] = max(frame->width * frame->format->bitsperpixel[plane] / BITS_PER_BYTE,
frame->bytesperline[plane]);
dbg("V4L2_PIX_FMT_YUV444(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = width[0] * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_YUYV:
case V4L2_PIX_FMT_UYVY:
dbg("V4L2_PIX_FMT_YUYV(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = width[0] * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV16:
case V4L2_PIX_FMT_NV61:
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = width[0] * frame->height
+ width[1] * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV16M:
case V4L2_PIX_FMT_NV61M:
sizes[plane] = width[0] * frame->height;
sizes[plane + 1] = width[1] * frame->height;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_YUV422P:
dbg("V4L2_PIX_FMT_YUV422P(w:%d)(h:%d)\n", frame->width, frame->height);
+ width[1] * frame->height / 2
+ width[2] * frame->height / 2;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV12:
case V4L2_PIX_FMT_NV21:
sizes[plane] = width[0] * frame->height
+ width[1] * frame->height / 2;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV12M:
case V4L2_PIX_FMT_NV21M:
sizes[plane] = width[0] * frame->height;
sizes[plane + 1] = width[1] * frame->height / 2;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_YUV420:
case V4L2_PIX_FMT_YVU420:
+ width[1] * frame->height / 2
+ width[2] * frame->height / 2;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_YUV420M:
case V4L2_PIX_FMT_YVU420M:
sizes[plane + 1] = width[1] * frame->height / 2;
sizes[plane + 2] = width[2] * frame->height / 2;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_SGRBG8:
dbg("V4L2_PIX_FMT_SGRBG8(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = frame->width * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_SBGGR8:
dbg("V4L2_PIX_FMT_SBGGR8(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = frame->width * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_SBGGR10:
dbg("V4L2_PIX_FMT_SBGGR10(w:%d)(h:%d)\n", frame->width, frame->height);
}
}
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_SBGGR12:
dbg("V4L2_PIX_FMT_SBGGR12(w:%d)(h:%d)\n", frame->width, frame->height);
}
}
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_SBGGR16:
dbg("V4L2_PIX_FMT_SBGGR16(w:%d)(h:%d)\n", frame->width, frame->height);
}
}
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_RGB32:
dbg("V4L2_PIX_FMT_RGB32(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = frame->width * frame->height * 4;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_GREY:
dbg("V4L2_PIX_FMT_GREY(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = frame->width * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_Y10:
dbg("V4L2_PIX_FMT_Y10(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = width[0] * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_Y12:
dbg("V4L2_PIX_FMT_Y12(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = width[0] * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_Y10BPACK:
dbg("V4L2_PIX_FMT_Y10BPACK(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = ALIGN(width[0], 16) * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV16M_P210:
dbg("V4L2_PIX_FMT_NV16M_P210(w:%d)(h:%d)\n", frame->width, frame->height);
sizes[plane] = ALIGN(width[0], 16) * frame->height;
sizes[plane + 1] = ALIGN(width[1], 16) * frame->height;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV12M_P010:
dbg("V4L2_PIX_FMT_NV12M_P010(w:%d)(h:%d)\n", frame->width, frame->height);
sizes[plane] = ALIGN(width[0], 16) * frame->height;
sizes[plane + 1] = ALIGN(width[0], 16) * frame->height / 2;
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV16M_S10B:
dbg("V4L2_PIX_FMT_NV16M_S10B(w:%d)(h:%d)\n", frame->width, frame->height);
sizes[plane + 1] = NV16M_CBCR_SIZE(frame->width, frame->height)
+ NV16M_CBCR_2B_SIZE(frame->width, frame->height);
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_NV12M_S10B:
dbg("V4L2_PIX_FMT_NV12M_S10B(w:%d)(h:%d)\n", frame->width, frame->height);
sizes[plane + 1] = NV12M_CBCR_SIZE(frame->width, frame->height)
+ NV12M_CBCR_2B_SIZE(frame->width, frame->height);
}
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_JPEG:
dbg("V4L2_PIX_FMT_JPEG(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = width[0] * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
case V4L2_PIX_FMT_Z16:
dbg("V4L2_PIX_FMT_Z16(w:%d)(h:%d)\n", frame->width, frame->height);
for (plane = 0; plane < image_planes; plane++)
sizes[plane] = width[0] * frame->height;
- sizes[plane] = SPARE_SIZE;
+ sizes[plane] = SIZE_OF_META_PLANE;
break;
default:
err("unknown pixelformat(%c%c%c%c)\n", (char)((frame->format->pixelformat >> 0) & 0xFF),
vbq->type = type;
vbq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
vbq->drv_priv = vctx;
- vbq->buf_struct_size = sizeof(struct fimc_is_vb2_buf);
+ vbq->buf_struct_size = sizeof(struct fimc_is_vb2_buf);
vbq->ops = vctx->vb2_ops;
vbq->mem_ops = vctx->vb2_mem_ops;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
clear_bit(FIMC_IS_QUEUE_BUFFER_PREPARED, &queue->state);
clear_bit(FIMC_IS_QUEUE_BUFFER_READY, &queue->state);
clear_bit(FIMC_IS_QUEUE_STREAM_ON, &queue->state);
+ clear_bit(IS_QUEUE_NEED_TO_REMAP, &queue->state);
+ clear_bit(IS_QUEUE_NEED_TO_KMAP, &queue->state);
memset(&queue->framecfg, 0, sizeof(struct fimc_is_frame_cfg));
frame_manager_probe(&queue->framemgr, queue->id, queue->name);
clear_bit(FIMC_IS_QUEUE_BUFFER_PREPARED, &queue->state);
clear_bit(FIMC_IS_QUEUE_BUFFER_READY, &queue->state);
clear_bit(FIMC_IS_QUEUE_STREAM_ON, &queue->state);
+ clear_bit(IS_QUEUE_NEED_TO_REMAP, &queue->state);
+ clear_bit(IS_QUEUE_NEED_TO_KMAP, &queue->state);
frame_manager_close(&queue->framemgr);
return ret;
queue->framecfg.width = pix->width;
queue->framecfg.height = pix->height;
+ if (fmt->hw_format == DMA_OUTPUT_FORMAT_BAYER_PACKED)
+ queue->framecfg.hw_pixeltype = pix->flags;
+
for (plane = 0; plane < fmt->hw_plane; ++plane) {
if (pix->plane_fmt[plane].bytesperline) {
queue->framecfg.bytesperline[plane] =
int fimc_is_queue_buffer_queue(struct fimc_is_queue *queue,
struct vb2_buffer *vb)
{
- u32 ret = 0, i;
- u32 index;
- u32 ext_size;
- u32 spare;
- struct fimc_is_video *video;
- struct fimc_is_video_ctx *vctx;
- struct fimc_is_framemgr *framemgr;
- struct fimc_is_frame *frame;
+ struct fimc_is_video_ctx *vctx = container_of(queue, struct fimc_is_video_ctx, queue);
+ struct fimc_is_video *video = GET_VIDEO(vctx);
+ struct fimc_is_framemgr *framemgr = &queue->framemgr;
struct vb2_v4l2_buffer *vb2_v4l2_buf = to_vb2_v4l2_buffer(vb);
struct fimc_is_vb2_buf *vbuf = vb_to_fimc_is_vb2_buf(vb2_v4l2_buf);
- struct dma_buf *dmabuf;
- struct dma_buf *bufs[FIMC_IS_MAX_PLANES];
- int batch_size;
- int buf_i, buf_k;
- int image_planes;
- int meta_planes = 1;
- struct fimc_is_ion_ctx *ctx;
- dma_addr_t dva;
- ulong kva;
-
- index = vb->index;
- image_planes = vb->num_planes - meta_planes; /* last plane is maeta plane */
- framemgr = &queue->framemgr;
- FIMC_BUG(framemgr->id == FRAMEMGR_ID_INVALID);
- vctx = container_of(queue, struct fimc_is_video_ctx, queue);
- video = GET_VIDEO(vctx);
- FIMC_BUG(!video);
- ctx = video->alloc_ctx;
-
- /* plane address is updated for checking everytime */
- for (i = 0; i < image_planes; i++) {
- /* get dmabuf_container */
- dmabuf = dma_buf_get(vb->planes[i].m.fd);
- if (IS_ERR_OR_NULL(dmabuf)) {
- err("%s Failed to get dmabuf for fd %d\n", __func__, vb->planes[i].m.fd);
- return (u32)PTR_ERR(dmabuf);
- }
-
- /* get the buffer count in the dmabuf_container */
- batch_size = dmabuf_container_get_count(dmabuf);
- if (batch_size == 0) {
- /*
- * FIXME: exiting this function here causes leak of
- * dma-bufs. This also applies to the above return
- * statement and all 'goto exit' statements below.
- * Please fix this by the right person in charge.
- */
- err("%s Empty dmabuf-container of fd %d\n", __func__,
- vb->planes[i].m.fd);
- dma_buf_put(dmabuf);
- return (u32)-ENOMEM;
- }
+ unsigned int index = vb->index;
+ unsigned int num_i_planes = vb->num_planes - NUM_OF_META_PLANE;
+ unsigned int num_buffers, pos_meta_p;
+ struct fimc_is_frame *frame;
+ int i;
+ int ret = 0;
- if (batch_size < 0)
- batch_size = 0;
-
- if (batch_size > 0) {
- /* traverse and check the buffers in dmabuf_container */
- for (buf_i = 0; buf_i < batch_size; buf_i++) {
- buf_k = buf_i * image_planes + i; /* YYUU --> YUYU */
- bufs[buf_k] = dmabuf_container_get_buffer(dmabuf, buf_i);
- if (IS_ERR(bufs[buf_k])) {
- mverr("Fail to dmabuf_container_get_buffer",
- vctx, video);
- ret = (u32)PTR_ERR(bufs[buf_k]);
- goto exit;
- }
+ FIMC_BUG(!video);
- dva = vbuf->ops->bufcon_map(vbuf, ctx->dev, buf_k, bufs[buf_k]);
- if (!dva) {
- mverr("Fail to bufcon_map", vctx, video);
- ret = -ENOMEM;
- goto exit;
- }
- queue->buf_dva[index][buf_k] = dva;
+ /* image planes */
+ if (IS_ENABLED(CONFIG_DMA_BUF_CONTAINER) && vbuf->num_merged_dbufs) {
+ /* vbuf has been sorted by the order of buffer */
+ memcpy(queue->buf_dva[index], vbuf->dva,
+ sizeof(dma_addr_t) * vbuf->num_merged_dbufs);
- ret = dma_buf_begin_cpu_access(bufs[buf_k], DMA_TO_DEVICE);
- if (ret) {
- pr_err("%s: Failed to prepare CPU access of fd %d\n", __func__, vb->planes[i].m.fd);
- return PTR_ERR(dmabuf);
- }
- kva = (ulong)dma_buf_vmap(bufs[buf_k]);
- queue->buf_kva[index][buf_k] = kva;
+ num_buffers = vbuf->num_merged_dbufs / num_i_planes;
+ } else {
+ for (i = 0; i < num_i_planes; i++) {
+ if (test_bit(IS_QUEUE_NEED_TO_REMAP, &queue->state))
+ queue->buf_dva[index][i] = vbuf->dva[i];
+ else
+ queue->buf_dva[index][i] = vbuf->ops->plane_dvaddr(vbuf, i);
- dma_buf_put(bufs[buf_k]);
- }
- } else {
- queue->buf_dva[index][i] = vbuf->ops->plane_dvaddr(vbuf, i);
- queue->buf_kva[index][i] = vbuf->ops->plane_kvaddr(vbuf, i);
+ if (test_bit(IS_QUEUE_NEED_TO_KMAP, &queue->state))
+ queue->buf_kva[index][i] = vbuf->ops->plane_kmap(vbuf, i);
}
- dma_buf_put(dmabuf);
+ num_buffers = 1;
}
- batch_size = batch_size > 0 ? batch_size : 1;
- if (batch_size > VIDEO_MAX_PLANES) {
- mverr("batch count is invalid (%d)", vctx, video, batch_size);
- goto exit;
- }
-
- frame = &framemgr->frames[index];
- frame->num_buffers = batch_size;
- frame->planes = image_planes * batch_size;
- spare = image_planes * batch_size;
+ pos_meta_p = num_buffers * num_i_planes;
/* meta plane */
- queue->buf_kva[index][spare] = vbuf->ops->plane_kvaddr(vbuf, image_planes);
- if (!queue->buf_kva[index][spare]) {
- mverr("plane_kvaddr is fail(%s)", vctx, video, framemgr->name);
- ret = -EINVAL;
- goto exit;
+ queue->buf_kva[index][pos_meta_p]
+ = vbuf->ops->plane_kmap(vbuf, num_i_planes);
+ if (!queue->buf_kva[index][pos_meta_p]) {
+ mverr("failed to get kva for %s", vctx, video, queue->name);
+ ret = -ENOMEM;
+ goto err_get_kva_for_meta;
}
- if (framemgr->id & FRAMEMGR_ID_SHOT) {
- ext_size = sizeof(struct camera2_shot_ext) - sizeof(struct camera2_shot);
+ /* setup a frame */
+ frame = &framemgr->frames[index];
+ frame->num_buffers = num_buffers;
+ frame->planes = num_buffers * num_i_planes;
- frame->kvaddr_shot = queue->buf_kva[index][spare] + ext_size;
- frame->shot = (struct camera2_shot *)frame->kvaddr_shot;
- frame->shot_ext = (struct camera2_shot_ext *)queue->buf_kva[index][spare];
- frame->shot_size = queue->framecfg.size[spare] - ext_size;
+ if (framemgr->id & FRAMEMGR_ID_SHOT) {
+ frame->shot_ext
+ = (struct camera2_shot_ext *)queue->buf_kva[index][pos_meta_p];
+ frame->shot = (struct camera2_shot *)((unsigned long)frame->shot_ext
+ + offsetof(struct camera2_shot_ext, shot));
+ frame->shot_size = queue->framecfg.size[pos_meta_p]
+ - offsetof(struct camera2_shot_ext, shot);
#ifdef MEASURE_TIME
frame->tzone = (struct timeval *)frame->shot_ext->timeZone;
#endif
} else {
- frame->stream = (struct camera2_stream *)queue->buf_kva[index][spare];
+ frame->stream
+ = (struct camera2_stream *)queue->buf_kva[index][pos_meta_p];
/* TODO : Someday need to change the variable type of struct to ulong */
- frame->stream->address = (u32)queue->buf_kva[index][spare];
+ frame->stream->address = (u32)queue->buf_kva[index][pos_meta_p];
}
/* uninitialized frame need to get info */
for (i = 0; i < frame->planes; i++) {
if (frame->dvaddr_buffer[i] != queue->buf_dva[index][i]) {
if (video->resourcemgr->hal_version == IS_HAL_VER_3_2) {
- frame->dvaddr_buffer[i] = (u32)queue->buf_dva[index][i];
+ frame->dvaddr_buffer[i] = queue->buf_dva[index][i];
} else {
- mverr("buffer[%d][%d] is changed(%08X != %08lX)", vctx, video, index, i,
- frame->dvaddr_buffer[i], queue->buf_dva[index][i]);
+ mverr("buffer[%d][%d] is changed(%pad != %pad)",
+ vctx, video,
+ index, i,
+ &frame->dvaddr_buffer[i],
+ &queue->buf_dva[index][i]);
ret = -EINVAL;
- goto exit;
+ goto err_dva_changed;
}
}
+
if (frame->kvaddr_buffer[i] != queue->buf_kva[index][i]) {
if (video->resourcemgr->hal_version == IS_HAL_VER_3_2) {
frame->kvaddr_buffer[i] = queue->buf_kva[index][i];
} else {
- mverr("kvaddr buffer[%d][%d] is changed(%08lX != %08lX)", vctx, video, index, i,
+ mverr("kvaddr buffer[%d][%d] is changed(0x%08lx != 0x%08lx)",
+ vctx, video, index, i,
frame->kvaddr_buffer[i], queue->buf_kva[index][i]);
ret = -EINVAL;
- goto exit;
+ goto err_kva_changed;
}
}
}
- goto exit;
+ return 0;
set_info:
if (test_bit(FIMC_IS_QUEUE_BUFFER_PREPARED, &queue->state)) {
mverr("already prepared but new index(%d) is came", vctx, video, index);
ret = -EINVAL;
- goto exit;
+ goto err_queue_prepared_already;
}
for (i = 0; i < frame->planes; i++) {
- frame->dvaddr_buffer[i] = (u32)queue->buf_dva[index][i];
+ frame->dvaddr_buffer[i] = queue->buf_dva[index][i];
frame->kvaddr_buffer[i] = queue->buf_kva[index][i];
#ifdef PRINT_BUFADDR
- mvinfo("%s %d.%d %08X\n", vctx, video, framemgr->name, index, i, frame->dvaddr_buffer[i]);
+ mvinfo("%s %d.%d %pad\n", vctx, video, framemgr->name, index,
+ i, &frame->dvaddr_buffer[i]);
#endif
}
set_bit(FIMC_IS_QUEUE_BUFFER_READY, &queue->state);
if (queue->buf_maxcount == queue->buf_refcount) {
- mvinfo("batch size(%d)\n", vctx, video, batch_size);
+ if (IS_ENABLED(CONFIG_DMA_BUF_CONTAINER)
+ && vbuf->num_merged_dbufs)
+ mvinfo("%s number of merged buffers: %d\n",
+ vctx, video, queue->name, num_buffers);
set_bit(FIMC_IS_QUEUE_BUFFER_PREPARED, &queue->state);
}
-exit:
queue->buf_que++;
+
+err_queue_prepared_already:
+err_kva_changed:
+err_dva_changed:
+err_get_kva_for_meta:
+
return ret;
}
-int fimc_is_buffer_init(struct vb2_buffer *vb)
+int fimc_is_queue_buffer_init(struct vb2_buffer *vb)
{
struct vb2_v4l2_buffer *vb2_v4l2_buf = to_vb2_v4l2_buffer(vb);
struct fimc_is_vb2_buf *vbuf = vb_to_fimc_is_vb2_buf(vb2_v4l2_buf);
return 0;
}
-int fimc_is_queue_prepare(struct vb2_buffer *vb)
+void fimc_is_queue_buffer_cleanup(struct vb2_buffer *vb)
{
- struct fimc_is_video_ctx *vctx;
+ struct vb2_v4l2_buffer *vb2_v4l2_buf = to_vb2_v4l2_buffer(vb);
+ struct fimc_is_vb2_buf *vbuf = vb_to_fimc_is_vb2_buf(vb2_v4l2_buf);
+ struct fimc_is_video_ctx *vctx = vb->vb2_queue->drv_priv;
+ unsigned int pos_meta_p = vb->num_planes - NUM_OF_META_PLANE;
+ int i;
- FIMC_BUG(!vb);
- FIMC_BUG(!vb->vb2_queue);
+ /* FIXME: doesn't support dmabuf container yet */
+ if (test_bit(IS_QUEUE_NEED_TO_KMAP, &vctx->queue.state)) {
+ for (i = 0; i < vb->num_planes; i++)
+ vbuf->ops->plane_kunmap(vbuf, i);
+ } else {
+ vbuf->ops->plane_kunmap(vbuf, pos_meta_p);
+ }
+}
- vctx = vb->vb2_queue->drv_priv;
- if (!vctx) {
- err("vctx is NULL");
- return -EINVAL;
+
+int fimc_is_queue_buffer_prepare(struct vb2_buffer *vb)
+{
+ struct vb2_v4l2_buffer *vb2_v4l2_buf = to_vb2_v4l2_buffer(vb);
+ struct fimc_is_vb2_buf *vbuf = vb_to_fimc_is_vb2_buf(vb2_v4l2_buf);
+ struct fimc_is_video_ctx *vctx = vb->vb2_queue->drv_priv;
+ struct fimc_is_video *video = GET_VIDEO(vctx);
+ struct fimc_is_ion_ctx *ctx = video->alloc_ctx;
+ unsigned int num_i_planes = vb->num_planes - NUM_OF_META_PLANE;
+ int ret;
+
+ if (IS_ENABLED(CONFIG_DMA_BUF_CONTAINER)) {
+ ret = vbuf->ops->dbufcon_prepare(vbuf,
+ num_i_planes, ctx->dev);
+ if (ret) {
+ err("failed to prepare dmabuf-container: %d", vb->index);
+ return ret;
+ }
+
+ if (vbuf->num_merged_dbufs) {
+ ret = vbuf->ops->dbufcon_map(vbuf);
+ if (ret) {
+ err("failed to map dmabuf-container: %d", vb->index);
+ vbuf->ops->dbufcon_finish(vbuf);
+ return ret;
+ }
+ }
+ }
+
+ if (test_bit(IS_QUEUE_NEED_TO_REMAP, &vctx->queue.state)) {
+ ret = vbuf->ops->remap_attr(vbuf, 0);
+ if (ret) {
+ err("failed to remap dmabuf: %d", vb->index);
+ return ret;
+ }
}
vctx->queue.buf_pre++;
return 0;
}
+void fimc_is_queue_buffer_finish(struct vb2_buffer *vb)
+{
+ struct vb2_v4l2_buffer *vb2_v4l2_buf = to_vb2_v4l2_buffer(vb);
+ struct fimc_is_vb2_buf *vbuf = vb_to_fimc_is_vb2_buf(vb2_v4l2_buf);
+ struct fimc_is_video_ctx *vctx = vb->vb2_queue->drv_priv;
+
+ if (IS_ENABLED(CONFIG_DMA_BUF_CONTAINER) &&
+ (vbuf->num_merged_dbufs)) {
+ vbuf->ops->dbufcon_unmap(vbuf);
+ vbuf->ops->dbufcon_finish(vbuf);
+ }
+
+ if (test_bit(IS_QUEUE_NEED_TO_REMAP, &vctx->queue.state))
+ vbuf->ops->unremap_attr(vbuf, 0);
+}
+
void fimc_is_queue_wait_prepare(struct vb2_queue *vbq)
{
struct fimc_is_video_ctx *vctx;
return ret;
}
-void fimc_is_queue_buffer_finish(struct vb2_buffer *vb)
-{
- u32 i;
- struct vb2_v4l2_buffer *vb2_v4l2_buf = to_vb2_v4l2_buffer(vb);
- struct fimc_is_vb2_buf *vbuf = vb_to_fimc_is_vb2_buf(vb2_v4l2_buf);
-
- for (i = 0; i < FIMC_IS_MAX_PLANES; i++) {
- if (!vbuf->bufs[i])
- break;
-
- vbuf->ops->bufcon_unmap(vbuf, i);
- }
-
- return;
-}
-
int fimc_is_video_probe(struct fimc_is_video *video,
char *video_name,
u32 video_number,
goto p_err;
}
+ if (!V4L2_TYPE_IS_MULTIPLANAR(buf->type)) {
+ mverr("the type of passed buffer is not multi-planar",
+ vctx, video);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (!buf->m.planes) {
+ mverr("planes array not provided", vctx, video);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (buf->length > FIMC_IS_MAX_PLANES) {
+ mverr("incorrect planes array length", vctx, video);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
/* Destination */
memcpy(&pipe->buf[PIPE_SLOT_DST][index], buf, sizeof(struct v4l2_buffer));
memcpy(pipe->planes[PIPE_SLOT_DST][index], buf->m.planes, sizeof(struct v4l2_plane) * buf->length);
}
break;
case V4L2_CID_IS_SET_SETFILE:
+ {
+ u32 scenario;
+ struct fimc_is_core *core;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+
if (test_bit(FIMC_IS_ISCHAIN_START, &device->state)) {
mverr("device is already started, setfile applying is fail", vctx, video);
ret = -EINVAL;
}
device->setfile = ctrl->value;
- minfo(" setfile(%d), scenario(%d) at s_ctrl\n", device,
- device->setfile & FIMC_IS_SETFILE_MASK,
- (device->setfile & FIMC_IS_SCENARIO_MASK) >> FIMC_IS_SCENARIO_SHIFT);
+ scenario = (device->setfile & FIMC_IS_SCENARIO_MASK) >> FIMC_IS_SCENARIO_SHIFT;
+ mvinfo(" setfile(%d), scenario(%d) at s_ctrl\n", device, video,
+ device->setfile & FIMC_IS_SETFILE_MASK, scenario);
+
+ if (core && scenario == FIMC_IS_SCENARIO_SECURE) {
+ mvinfo(" SECURE scenario(%d) was detected\n", device, video, scenario);
+ core->scenario = scenario;
+ }
break;
+ }
case V4L2_CID_IS_HAL_VERSION:
if (ctrl->value < 0 || ctrl->value >= IS_HAL_VER_MAX) {
mverr("hal version(%d) is invalid", vctx, video, ctrl->value);
FIMC_IS_VIDEO_I1C_NUM,
FIMC_IS_VIDEO_I1P_NUM,
FIMC_IS_VIDEO_ME0C_NUM = 48,
+ FIMC_IS_VIDEO_ME1C_NUM = 49,
FIMC_IS_VIDEO_DCP0S_NUM = 50, /* Master */
FIMC_IS_VIDEO_DCP0C_NUM, /* Master Main Capture */
FIMC_IS_VIDEO_DCP1S_NUM, /* Slave */
FIMC_IS_VIDEO_SS5VC3_NUM,
FIMC_IS_VIDEO_PAF0S_NUM = 140,
FIMC_IS_VIDEO_PAF1S_NUM,
+ FIMC_IS_VIDEO_32S_NUM = 150,
+ FIMC_IS_VIDEO_32P_NUM,
FIMC_IS_VIDEO_MAX_NUM
};
enum fimc_is_queue_state {
FIMC_IS_QUEUE_BUFFER_PREPARED,
FIMC_IS_QUEUE_BUFFER_READY,
- FIMC_IS_QUEUE_STREAM_ON
+ FIMC_IS_QUEUE_STREAM_ON,
+ IS_QUEUE_NEED_TO_REMAP, /* need remapped DVA with specific attribute */
+ IS_QUEUE_NEED_TO_KMAP, /* need permanent KVA for image planes */
};
struct fimc_is_frame_cfg {
ulong flip;
u32 width;
u32 height;
+ u32 hw_pixeltype;
u32 size[FIMC_IS_MAX_PLANES];
u32 bytesperline[FIMC_IS_MAX_PLANES];
};
u32 buf_maxcount;
u32 buf_rdycount;
u32 buf_refcount;
- ulong buf_dva[FIMC_IS_MAX_BUFS][FIMC_IS_MAX_PLANES];
+ dma_addr_t buf_dva[FIMC_IS_MAX_BUFS][FIMC_IS_MAX_PLANES];
ulong buf_kva[FIMC_IS_MAX_BUFS][FIMC_IS_MAX_PLANES];
/* for debugging */
struct device *alloc_devs[]);
int fimc_is_queue_buffer_queue(struct fimc_is_queue *queue,
struct vb2_buffer *vb);
-int fimc_is_buffer_init(struct vb2_buffer *vb);
-int fimc_is_queue_prepare(struct vb2_buffer *vb);
+int fimc_is_queue_buffer_init(struct vb2_buffer *vb);
+void fimc_is_queue_buffer_cleanup(struct vb2_buffer *vb);
+int fimc_is_queue_buffer_prepare(struct vb2_buffer *vb);
void fimc_is_queue_wait_prepare(struct vb2_queue *vbq);
void fimc_is_queue_wait_finish(struct vb2_queue *vbq);
int fimc_is_queue_start_streaming(struct fimc_is_queue *queue,
extern int fimc_is_31p_video_probe(void *data);
extern int fimc_is_31f_video_probe(void *data);
extern int fimc_is_31g_video_probe(void *data);
+extern int fimc_is_32s_video_probe(void *data);
+extern int fimc_is_32p_video_probe(void *data);
extern int fimc_is_i0s_video_probe(void *data);
extern int fimc_is_i0c_video_probe(void *data);
extern int fimc_is_i0p_video_probe(void *data);
extern int fimc_is_i1c_video_probe(void *data);
extern int fimc_is_i1p_video_probe(void *data);
extern int fimc_is_me0c_video_probe(void *data);
+extern int fimc_is_me1c_video_probe(void *data);
extern int fimc_is_d0s_video_probe(void *data);
extern int fimc_is_d0c_video_probe(void *data);
extern int fimc_is_d1s_video_probe(void *data);
#define RATIO_X3_8 2796203
#define RATIO_X2_8 4194304
-#define MCSC_SETFILE_VERSION 0x14027431
-
enum mcsc_wdma_priority {
MCSC_WDMA_OUTPUT0_Y = 0,
MCSC_WDMA_OUTPUT0_U = 1,
void fimc_is_scaler_get_wdma_format(void __iomem *base_addr, u32 output_id, u32 *dma_out_format);
void fimc_is_scaler_set_swap_mode(void __iomem *base_addr, u32 output_id, u32 swap);
void fimc_is_scaler_set_flip_mode(void __iomem *base_addr, u32 output_id, u32 flip);
+void fimc_is_scaler_get_flip_mode(void __iomem *base_addr, u32 output_id, u32 *flip);
void fimc_is_scaler_set_rdma_size(void __iomem *base_addr, u32 width, u32 height);
void fimc_is_scaler_get_rdma_size(void __iomem *base_addr, u32 *width, u32 *height);
void fimc_is_scaler_set_wdma_size(void __iomem *base_addr, u32 output_id, u32 width, u32 height);
void fimc_is_scaler_set_djag_init_phase_offset(void __iomem *base_addr, u32 h_offset, u32 v_offset);
void fimc_is_scaler_set_djag_round_mode(void __iomem *base_addr, u32 round_enable);
void fimc_is_scaler_set_djag_tunning_param(void __iomem *base_addr, const struct djag_setfile_contents *djag_tune);
-void fimc_is_scaler_set_djag_wb_thres(void __iomem *base_addr, struct djag_wb_thres_cfg *djag_wb);
+void fimc_is_scaler_set_djag_dither_wb(void __iomem *base_addr, struct djag_wb_thres_cfg *djag_wb, u32 wht, u32 blk);
/* cac */
void fimc_is_scaler_set_cac_enable(void __iomem *base_addr, u32 en);
void fimc_is_scaler_set_ds_init_phase_offset(void __iomem *base_addr, u32 h_offset, u32 v_offset);
void fimc_is_scaler_set_ds_gamma_table_enable(void __iomem *base_addr, u32 ds_gamma_enable);
+/* FRO */
+void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 hw_id, u32 lfro_enable, u32 lfro_total_fnum);
+u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr, u32 hw_id);
+
void fimc_is_scaler_clear_intr_src(void __iomem *base_addr, u32 hw_id, u32 status);
u32 fimc_is_scaler_get_intr_mask(void __iomem *base_addr, u32 hw_id);
u32 fimc_is_scaler_get_intr_status(void __iomem *base_addr, u32 hw_id);
}
}
+void fimc_is_scaler_get_flip_mode(void __iomem *base_addr, u32 output_id, u32 *flip)
+{
+ switch (output_id) {
+ case MCSC_OUTPUT0:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA0_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA0_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT1:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA1_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA1_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT2:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA2_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA2_FLIP_CONTROL]);
+ break;
+ default:
+ break;
+ }
+}
+
void fimc_is_scaler_set_rdma_size(void __iomem *base_addr, u32 width, u32 height)
{
u32 reg_value = 0;
/* not support */
}
-void fimc_is_scaler_set_djag_wb_thres(void __iomem *base_addr, struct djag_wb_thres_cfg *djag_wb)
+void fimc_is_scaler_set_djag_dither_wb(void __iomem *base_addr, struct djag_wb_thres_cfg *djag_wb, u32 wht, u32 blk)
{
/* not supported */
}
}
/* LFRO : Less Fast Read Out */
-void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 lfro_enable, u32 lfro_total_fnum)
+void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 hw_id, u32 lfro_enable, u32 lfro_total_fnum)
{
u32 reg_value = 0;
fimc_is_hw_set_reg(base_addr, &mcsc_regs[MCSC_R_SCALER_FAST_MODE_CTRL], reg_value);
}
-u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr)
+u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr, u32 hw_id)
{
u32 ret = 0;
u32 fcnt = 0;
}
}
+void fimc_is_scaler_get_flip_mode(void __iomem *base_addr, u32 output_id, u32 *flip)
+{
+ switch (output_id) {
+ case MCSC_OUTPUT0:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA0_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA0_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT1:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA1_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA1_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT2:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA2_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA2_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT3:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA3_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA3_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT4:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA4_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA4_FLIP_CONTROL]);
+ break;
+ default:
+ break;
+ }
+}
+
void fimc_is_scaler_set_rdma_size(void __iomem *base_addr, u32 width, u32 height)
{
u32 reg_value = 0;
*/
/* LFRO : Less Fast Read Out */
-void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 lfro_enable, u32 lfro_total_fnum)
+void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 hw_id, u32 lfro_enable, u32 lfro_total_fnum)
{
/* not supported */
}
-u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr)
+u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr, u32 hw_id)
{
/* not supported */
return 0;
u32 h_coef = 0, v_coef = 0;
/* this value equals 0 - scale-down operation */
u32 h_phase_offset = 0, v_phase_offset = 0;
-#if defined(LHM_ENABLE_EVT0)
+#if !defined(USE_UVSP_CAC)
bool adjust_coef = false;
/* M/M dev team guided, x7/8 ~ x5/8 => x8/8 ~ x7/8
/* this value equals 0 - scale-down operation */
u32 h_phase_offset = 0, v_phase_offset = 0;
-#if defined(LHM_ENABLE_EVT0)
+#if !defined(USE_UVSP_CAC)
h_coef = get_scaler_coef_ver1(hratio, false);
v_coef = get_scaler_coef_ver1(vratio, false);
#else
}
}
+void fimc_is_scaler_get_flip_mode(void __iomem *base_addr, u32 output_id, u32 *flip)
+{
+ switch (output_id) {
+ case MCSC_OUTPUT0:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA0_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA0_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT1:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA1_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA1_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT2:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA2_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA2_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT3:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA3_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA3_FLIP_CONTROL]);
+ break;
+ case MCSC_OUTPUT4:
+ *flip = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_WDMA4_FLIP_CONTROL],
+ &mcsc_fields[MCSC_F_WDMA4_FLIP_CONTROL]);
+ break;
+ default:
+ break;
+ }
+}
+
void fimc_is_scaler_set_rdma_size(void __iomem *base_addr, u32 width, u32 height)
{
u32 reg_val = 0;
}
}
-u32 g_addr[8] = {0, };
-u32 *get_wdma_addr_arr(u32 output_id)
+void get_wdma_addr_arr(u32 output_id, u32 *addr)
{
switch (output_id) {
case MCSC_OUTPUT0:
- g_addr[0] = MCSC_R_WDMA0_BASE_ADDR_0;
- g_addr[1] = MCSC_R_WDMA0_BASE_ADDR_0_IDX1;
- g_addr[2] = MCSC_R_WDMA0_BASE_ADDR_0_IDX2;
- g_addr[3] = MCSC_R_WDMA0_BASE_ADDR_0_IDX3;
- g_addr[4] = MCSC_R_WDMA0_BASE_ADDR_0_IDX4;
- g_addr[5] = MCSC_R_WDMA0_BASE_ADDR_0_IDX5;
- g_addr[6] = MCSC_R_WDMA0_BASE_ADDR_0_IDX6;
- g_addr[7] = MCSC_R_WDMA0_BASE_ADDR_0_IDX7;
+ addr[0] = MCSC_R_WDMA0_BASE_ADDR_0;
+ addr[1] = MCSC_R_WDMA0_BASE_ADDR_0_IDX1;
+ addr[2] = MCSC_R_WDMA0_BASE_ADDR_0_IDX2;
+ addr[3] = MCSC_R_WDMA0_BASE_ADDR_0_IDX3;
+ addr[4] = MCSC_R_WDMA0_BASE_ADDR_0_IDX4;
+ addr[5] = MCSC_R_WDMA0_BASE_ADDR_0_IDX5;
+ addr[6] = MCSC_R_WDMA0_BASE_ADDR_0_IDX6;
+ addr[7] = MCSC_R_WDMA0_BASE_ADDR_0_IDX7;
break;
case MCSC_OUTPUT1:
- g_addr[0] = MCSC_R_WDMA1_BASE_ADDR_0;
- g_addr[1] = MCSC_R_WDMA1_BASE_ADDR_0_IDX1;
- g_addr[2] = MCSC_R_WDMA1_BASE_ADDR_0_IDX2;
- g_addr[3] = MCSC_R_WDMA1_BASE_ADDR_0_IDX3;
- g_addr[4] = MCSC_R_WDMA1_BASE_ADDR_0_IDX4;
- g_addr[5] = MCSC_R_WDMA1_BASE_ADDR_0_IDX5;
- g_addr[6] = MCSC_R_WDMA1_BASE_ADDR_0_IDX6;
- g_addr[7] = MCSC_R_WDMA1_BASE_ADDR_0_IDX7;
+ addr[0] = MCSC_R_WDMA1_BASE_ADDR_0;
+ addr[1] = MCSC_R_WDMA1_BASE_ADDR_0_IDX1;
+ addr[2] = MCSC_R_WDMA1_BASE_ADDR_0_IDX2;
+ addr[3] = MCSC_R_WDMA1_BASE_ADDR_0_IDX3;
+ addr[4] = MCSC_R_WDMA1_BASE_ADDR_0_IDX4;
+ addr[5] = MCSC_R_WDMA1_BASE_ADDR_0_IDX5;
+ addr[6] = MCSC_R_WDMA1_BASE_ADDR_0_IDX6;
+ addr[7] = MCSC_R_WDMA1_BASE_ADDR_0_IDX7;
break;
case MCSC_OUTPUT2:
- g_addr[0] = MCSC_R_WDMA2_BASE_ADDR_0;
- g_addr[1] = MCSC_R_WDMA2_BASE_ADDR_0_IDX1;
- g_addr[2] = MCSC_R_WDMA2_BASE_ADDR_0_IDX2;
- g_addr[3] = MCSC_R_WDMA2_BASE_ADDR_0_IDX3;
- g_addr[4] = MCSC_R_WDMA2_BASE_ADDR_0_IDX4;
- g_addr[5] = MCSC_R_WDMA2_BASE_ADDR_0_IDX5;
- g_addr[6] = MCSC_R_WDMA2_BASE_ADDR_0_IDX6;
- g_addr[7] = MCSC_R_WDMA2_BASE_ADDR_0_IDX7;
+ addr[0] = MCSC_R_WDMA2_BASE_ADDR_0;
+ addr[1] = MCSC_R_WDMA2_BASE_ADDR_0_IDX1;
+ addr[2] = MCSC_R_WDMA2_BASE_ADDR_0_IDX2;
+ addr[3] = MCSC_R_WDMA2_BASE_ADDR_0_IDX3;
+ addr[4] = MCSC_R_WDMA2_BASE_ADDR_0_IDX4;
+ addr[5] = MCSC_R_WDMA2_BASE_ADDR_0_IDX5;
+ addr[6] = MCSC_R_WDMA2_BASE_ADDR_0_IDX6;
+ addr[7] = MCSC_R_WDMA2_BASE_ADDR_0_IDX7;
break;
case MCSC_OUTPUT3:
- g_addr[0] = MCSC_R_WDMA3_BASE_ADDR_0;
- g_addr[1] = MCSC_R_WDMA3_BASE_ADDR_0_IDX1;
- g_addr[2] = MCSC_R_WDMA3_BASE_ADDR_0_IDX2;
- g_addr[3] = MCSC_R_WDMA3_BASE_ADDR_0_IDX3;
- g_addr[4] = MCSC_R_WDMA3_BASE_ADDR_0_IDX4;
- g_addr[5] = MCSC_R_WDMA3_BASE_ADDR_0_IDX5;
- g_addr[6] = MCSC_R_WDMA3_BASE_ADDR_0_IDX6;
- g_addr[7] = MCSC_R_WDMA3_BASE_ADDR_0_IDX7;
+ addr[0] = MCSC_R_WDMA3_BASE_ADDR_0;
+ addr[1] = MCSC_R_WDMA3_BASE_ADDR_0_IDX1;
+ addr[2] = MCSC_R_WDMA3_BASE_ADDR_0_IDX2;
+ addr[3] = MCSC_R_WDMA3_BASE_ADDR_0_IDX3;
+ addr[4] = MCSC_R_WDMA3_BASE_ADDR_0_IDX4;
+ addr[5] = MCSC_R_WDMA3_BASE_ADDR_0_IDX5;
+ addr[6] = MCSC_R_WDMA3_BASE_ADDR_0_IDX6;
+ addr[7] = MCSC_R_WDMA3_BASE_ADDR_0_IDX7;
break;
case MCSC_OUTPUT4:
- g_addr[0] = MCSC_R_WDMA4_BASE_ADDR_0;
- g_addr[1] = MCSC_R_WDMA4_BASE_ADDR_0_IDX1;
- g_addr[2] = MCSC_R_WDMA4_BASE_ADDR_0_IDX2;
- g_addr[3] = MCSC_R_WDMA4_BASE_ADDR_0_IDX3;
- g_addr[4] = MCSC_R_WDMA4_BASE_ADDR_0_IDX4;
- g_addr[5] = MCSC_R_WDMA4_BASE_ADDR_0_IDX5;
- g_addr[6] = MCSC_R_WDMA4_BASE_ADDR_0_IDX6;
- g_addr[7] = MCSC_R_WDMA4_BASE_ADDR_0_IDX7;
+ addr[0] = MCSC_R_WDMA4_BASE_ADDR_0;
+ addr[1] = MCSC_R_WDMA4_BASE_ADDR_0_IDX1;
+ addr[2] = MCSC_R_WDMA4_BASE_ADDR_0_IDX2;
+ addr[3] = MCSC_R_WDMA4_BASE_ADDR_0_IDX3;
+ addr[4] = MCSC_R_WDMA4_BASE_ADDR_0_IDX4;
+ addr[5] = MCSC_R_WDMA4_BASE_ADDR_0_IDX5;
+ addr[6] = MCSC_R_WDMA4_BASE_ADDR_0_IDX6;
+ addr[7] = MCSC_R_WDMA4_BASE_ADDR_0_IDX7;
break;
case MCSC_OUTPUT_DS:
- g_addr[0] = MCSC_R_WDMADS_BASE_ADDR_0;
- g_addr[1] = MCSC_R_WDMADS_BASE_ADDR_0_IDX1;
- g_addr[2] = MCSC_R_WDMADS_BASE_ADDR_0_IDX2;
- g_addr[3] = MCSC_R_WDMADS_BASE_ADDR_0_IDX3;
- g_addr[4] = MCSC_R_WDMADS_BASE_ADDR_0_IDX4;
- g_addr[5] = MCSC_R_WDMADS_BASE_ADDR_0_IDX5;
- g_addr[6] = MCSC_R_WDMADS_BASE_ADDR_0_IDX6;
- g_addr[7] = MCSC_R_WDMADS_BASE_ADDR_0_IDX7;
+ addr[0] = MCSC_R_WDMADS_BASE_ADDR_0;
+ addr[1] = MCSC_R_WDMADS_BASE_ADDR_0_IDX1;
+ addr[2] = MCSC_R_WDMADS_BASE_ADDR_0_IDX2;
+ addr[3] = MCSC_R_WDMADS_BASE_ADDR_0_IDX3;
+ addr[4] = MCSC_R_WDMADS_BASE_ADDR_0_IDX4;
+ addr[5] = MCSC_R_WDMADS_BASE_ADDR_0_IDX5;
+ addr[6] = MCSC_R_WDMADS_BASE_ADDR_0_IDX6;
+ addr[7] = MCSC_R_WDMADS_BASE_ADDR_0_IDX7;
break;
default:
- g_addr[0] = 0;
+ panic("invalid output_id(%d)", output_id);
break;
}
- return g_addr;
+ return;
}
void fimc_is_scaler_set_wdma_addr(void __iomem *base_addr, u32 output_id,
u32 y_addr, u32 cb_addr, u32 cr_addr, int buf_index)
{
- u32 *addr;
+ u32 addr[8] = {0, };
- addr = get_wdma_addr_arr(output_id);
+ get_wdma_addr_arr(output_id, addr);
if (!addr[0])
return;
void fimc_is_scaler_set_wdma_2bit_addr(void __iomem *base_addr, u32 output_id,
u32 y_2bit_addr, u32 cbcr_2bit_addr, int buf_index)
{
- u32 *addr;
+ u32 addr[8] = {0, };
/* WDMADS can not support 10bit format */
if (output_id == MCSC_OUTPUT_DS)
return;
- addr = get_wdma_addr_arr(output_id);
+ get_wdma_addr_arr(output_id, addr);
if (!addr[0])
return;
void fimc_is_scaler_get_wdma_addr(void __iomem *base_addr, u32 output_id,
u32 *y_addr, u32 *cb_addr, u32 *cr_addr, int buf_index)
{
- u32 *addr;
+ u32 addr[8] = {0, };
- addr = get_wdma_addr_arr(output_id);
+ get_wdma_addr_arr(output_id, addr);
if (!addr[0])
return;
void fimc_is_scaler_clear_wdma_addr(void __iomem *base_addr, u32 output_id)
{
- u32 *addr;
+ u32 addr[8] = {0, };
- addr = get_wdma_addr_arr(output_id);
+ get_wdma_addr_arr(output_id, addr);
if (!addr[0])
return;
fimc_is_hw_set_reg(base_addr, &mcsc_regs[MCSC_R_DJAG_CP_ARBI], reg_val);
}
-void fimc_is_scaler_set_djag_wb_thres(void __iomem *base_addr, struct djag_wb_thres_cfg *djag_wb)
+void fimc_is_scaler_set_djag_dither_wb(void __iomem *base_addr, struct djag_wb_thres_cfg *djag_wb, u32 wht, u32 blk)
{
u32 reg_val = 0;
if (!djag_wb)
return;
+ reg_val = fimc_is_hw_get_reg(base_addr, &mcsc_regs[MCSC_R_DJAG_DITHER_THRES]);
+
+ reg_val = fimc_is_hw_set_field_value(reg_val, &mcsc_fields[MCSC_F_DJAG_DITHER_WHITE_LEVEL], wht);
+ reg_val = fimc_is_hw_set_field_value(reg_val, &mcsc_fields[MCSC_F_DJAG_DITHER_BLACK_LEVEL], blk);
reg_val = fimc_is_hw_set_field_value(reg_val, &mcsc_fields[MCSC_F_DJAG_DITHER_WB_THRES],
djag_wb->dither_wb_thres);
fimc_is_hw_set_reg(base_addr, &mcsc_regs[MCSC_R_DJAG_DITHER_THRES], reg_val);
*/
/* LFRO : Less Fast Read Out */
-void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 lfro_enable, u32 lfro_total_fnum)
+void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 hw_id, u32 lfro_enable, u32 lfro_total_fnum)
{
- /* not supported */
+ u32 reg_value = 0;
+
+ switch (hw_id) {
+ case DEV_HW_MCSC0:
+ reg_value = fimc_is_hw_set_field_value(reg_value, &mcsc_fields[MCSC_F_FAST_MODE_NUM_MINUS1_0],
+ lfro_total_fnum - 1);
+ reg_value = fimc_is_hw_set_field_value(reg_value, &mcsc_fields[MCSC_F_FAST_MODE_EN_0],
+ lfro_enable);
+ fimc_is_hw_set_reg(base_addr, &mcsc_regs[MCSC_R_SCALER_FAST_MODE_CTRL_0], reg_value);
+ break;
+ case DEV_HW_MCSC1:
+ reg_value = fimc_is_hw_set_field_value(reg_value, &mcsc_fields[MCSC_F_FAST_MODE_NUM_MINUS1_1],
+ lfro_total_fnum - 1);
+ reg_value = fimc_is_hw_set_field_value(reg_value, &mcsc_fields[MCSC_F_FAST_MODE_EN_1],
+ lfro_enable);
+ fimc_is_hw_set_reg(base_addr, &mcsc_regs[MCSC_R_SCALER_FAST_MODE_CTRL_1], reg_value);
+ break;
+ default:
+ warn_hw("invalid hw_id(%d) for MCSC api\n", hw_id);
+ break;
+ }
}
-u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr)
+u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr, u32 hw_id)
{
- /* not supported */
- return 0;
+ u32 ret = 0;
+ u32 fcnt = 0;
+
+ switch (hw_id) {
+ case DEV_HW_MCSC0:
+ fcnt = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_SCALER_FAST_MODE_STATUS_0],
+ &mcsc_fields[MCSC_F_FAST_MODE_FRAME_CNT_0]);
+ ret = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_SCALER_FAST_MODE_STATUS_0],
+ &mcsc_fields[MCSC_F_FAST_MODE_ERROR_STATUS_0]);
+ break;
+ case DEV_HW_MCSC1:
+ fcnt = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_SCALER_FAST_MODE_STATUS_1],
+ &mcsc_fields[MCSC_F_FAST_MODE_FRAME_CNT_1]);
+ ret = fimc_is_hw_get_field(base_addr, &mcsc_regs[MCSC_R_SCALER_FAST_MODE_STATUS_1],
+ &mcsc_fields[MCSC_F_FAST_MODE_ERROR_STATUS_1]);
+ break;
+ default:
+ warn_hw("invalid hw_id(%d) for MCSC api\n", hw_id);
+ break;
+ }
+
+ if (ret)
+ warn_hw("[FRO:%d]frame status: (0x%x)\n", fcnt, ret);
+
+ return ret;
}
static void fimc_is_scaler0_clear_intr_src(void __iomem *base_addr, u32 status)
u32 i = 0;
u32 reg_val = 0;
- info_hw("MCSC ver 4.0");
+ info_hw("MCSC ver 5.0");
for (i = 0; i < MCSC_REG_CNT; i++) {
reg_val = readl(base_addr + mcsc_regs[i].sfr_offset);
err_chain_create:
err_lib_func:
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
err_alloc:
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
fimc_is_lib_isp_chain_destroy(hw_ip, &hw_3aa->lib[instance], instance);
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
struct fimc_is_frame *frame = NULL;
struct fimc_is_framemgr *framemgr;
struct camera2_shot *shot = NULL;
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+ struct fimc_is_device_sensor *sensor;
+#endif
if (!test_bit_variables(hw_ip->id, &hw_map))
return 0;
} else {
mswarn_hw("enable (frame:NULL)(%d)", instance, hw_ip,
framemgr->queued_count[FS_HW_CONFIGURE]);
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+ sensor = hw_ip->group[instance]->device->sensor;
+ if (sensor && sensor->mode_chg_frame) {
+ frame = sensor->mode_chg_frame;
+ shot = frame->shot;
+ msinfo_hw("[F:%d]mode_chg_frame used for REMOSAIC\n",
+ instance, hw_ip, frame->fcount);
+ }
+#endif
}
FIMC_BUG(!hw_ip->priv_info);
u32 lindex, hindex;
u32 input_w, input_h, crop_x, crop_y, output_w = 0, output_h = 0;
bool frame_done = false;
+ struct is_param_region *param_region;
FIMC_BUG(!hw_ip);
FIMC_BUG(!frame);
fimc_is_hw_g_ctrl(hw_ip, hw_ip->id, HW_G_CTRL_FRM_DONE_WITH_DMA, (void *)&frame_done);
if ((!frame_done)
|| (!test_bit(ENTRY_3AC, &frame->out_flag) && !test_bit(ENTRY_3AP, &frame->out_flag)
- && !test_bit(ENTRY_3AF, &frame->out_flag) && !test_bit(ENTRY_3AG, &frame->out_flag)))
+ && !test_bit(ENTRY_3AF, &frame->out_flag) && !test_bit(ENTRY_3AG, &frame->out_flag)
+ && !test_bit(ENTRY_MEXC, &frame->out_flag)))
set_bit(hw_ip->id, &frame->core_flag);
FIMC_BUG(!hw_ip->priv_info);
param = ®ion->parameter.taa;
+ param_region = (struct is_param_region *)frame->shot->ctl.vendor_entry.parameter;
if (frame->type == SHOT_TYPE_INTERNAL) {
/* OTF INPUT case */
param_set->dma_output_before_bds.cmd = DMA_OUTPUT_COMMAND_DISABLE;
hindex |= HIGHBIT_OF(PARAM_3AA_VDMA2_OUTPUT);
hindex |= HIGHBIT_OF(PARAM_3AA_FDDMA_OUTPUT);
hindex |= HIGHBIT_OF(PARAM_3AA_MRGDMA_OUTPUT);
+ param_region = ®ion->parameter;
}
}
fimc_is_hw_3aa_update_param(hw_ip,
- region, param_set,
+ param_region, param_set,
lindex, hindex, frame->instance);
/* DMA settings */
crop_y = param_set->otf_input.bayer_crop_offset_y;
if (param_set->dma_input.cmd != DMA_INPUT_COMMAND_DISABLE) {
for (i = 0; i < frame->planes; i++) {
- param_set->input_dva[i] = frame->dvaddr_buffer[i];
+ param_set->input_dva[i] =
+ (typeof(*param_set->input_dva))frame->dvaddr_buffer[i];
if (frame->dvaddr_buffer[i] == 0) {
msinfo_hw("[F:%d]dvaddr_buffer[%d] is zero\n",
frame->instance, hw_ip, frame->fcount, i);
frame->instance, hw_ip);
}
- fimc_is_lib_isp_shot(hw_ip, &hw_3aa->lib[frame->instance], param_set, frame->shot);
+ ret = fimc_is_lib_isp_shot(hw_ip, &hw_3aa->lib[frame->instance], param_set, frame->shot);
set_bit(HW_CONFIG, &hw_ip->state);
hw_ip->lindex[instance] = lindex;
hw_ip->hindex[instance] = hindex;
- fimc_is_hw_3aa_update_param(hw_ip, region, param_set, lindex, hindex, instance);
+ fimc_is_hw_3aa_update_param(hw_ip, ®ion->parameter, param_set, lindex, hindex, instance);
ret = fimc_is_lib_isp_set_param(hw_ip, &hw_3aa->lib[instance], param_set);
if (ret)
return ret;
}
-void fimc_is_hw_3aa_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *region,
+void fimc_is_hw_3aa_update_param(struct fimc_is_hw_ip *hw_ip, struct is_param_region *param_region,
struct taa_param_set *param_set, u32 lindex, u32 hindex, u32 instance)
{
struct taa_param *param;
- FIMC_BUG_VOID(!region);
+ FIMC_BUG_VOID(!param_region);
FIMC_BUG_VOID(!param_set);
- param = ®ion->parameter.taa;
+ param = ¶m_region->taa;
param_set->instance_id = instance;
if (lindex & LOWBIT_OF(PARAM_SENSOR_CONFIG)) {
- memcpy(¶m_set->sensor_config, ®ion->parameter.sensor.config,
+ memcpy(¶m_set->sensor_config, ¶m_region->sensor.config,
sizeof(struct param_sensor_config));
}
if (ret)
mserr_hw("get_meta fail", frame->instance, hw_ip);
+ if (frame->shot && frame->shot_ext) {
+ msdbg_hw(2, "get_meta[F:%d]: ni(%d,%d,%d) binning_r(%d,%d), crop_taa(%d,%d), bds(%d,%d)\n",
+ frame->instance, hw_ip, frame->fcount,
+ frame->shot->udm.ni.currentFrameNoiseIndex,
+ frame->shot->udm.ni.nextFrameNoiseIndex,
+ frame->shot->udm.ni.nextNextFrameNoiseIndex,
+ frame->shot_ext->binning_ratio_x, frame->shot_ext->binning_ratio_y,
+ frame->shot_ext->crop_taa_x, frame->shot_ext->crop_taa_y,
+ frame->shot_ext->bds_ratio_x, frame->shot_ext->bds_ratio_y);
+ }
+
return ret;
}
static int fimc_is_hw_3aa_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
u32 instance, enum ShotErrorType done_type)
{
- int wq_id_3xc, wq_id_3xp, wq_id_3xf, wq_id_3xg;
+ int wq_id_3xc, wq_id_3xp, wq_id_3xf, wq_id_3xg, wq_id_mexc;
int output_id;
int ret = 0;
wq_id_3xp = WORK_30P_FDONE;
wq_id_3xf = WORK_30F_FDONE;
wq_id_3xg = WORK_30G_FDONE;
+ wq_id_mexc = WORK_ME0C_FDONE;
break;
case DEV_HW_3AA1:
wq_id_3xc = WORK_31C_FDONE;
wq_id_3xp = WORK_31P_FDONE;
wq_id_3xf = WORK_31F_FDONE;
wq_id_3xg = WORK_31G_FDONE;
+ wq_id_mexc = WORK_ME1C_FDONE;
+ break;
+ case DEV_HW_VPP:
+ wq_id_3xc = WORK_MAX_MAP;
+ wq_id_3xp = WORK_32P_FDONE;
+ wq_id_3xf = WORK_MAX_MAP;
+ wq_id_3xg = WORK_MAX_MAP;
+ wq_id_mexc = WORK_MAX_MAP;
break;
default:
mserr_hw("[F:%d]invalid hw(%d)", instance, hw_ip, frame->fcount, hw_ip->id);
output_id = ENTRY_MEXC;
if (test_bit(output_id, &frame->out_flag)) {
- ret = fimc_is_hardware_frame_done(hw_ip, frame, WORK_ME0C_FDONE,
+ ret = fimc_is_hardware_frame_done(hw_ip, frame, wq_id_mexc,
output_id, done_type, false);
}
FIMC_BUG(!hw_ip);
- /* skip */
- if ((hw_ip->id == DEV_HW_3AA0) && test_bit(DEV_HW_3AA1, &hw_map))
- return 0;
- else if ((hw_ip->id == DEV_HW_3AA1) && test_bit(DEV_HW_3AA0, &hw_map))
- return 0;
-
if (!test_bit_variables(hw_ip->id, &hw_map)) {
msdbg_hw(2, "%s: hw_map(0x%lx)\n", instance, hw_ip, __func__, hw_map);
return 0;
FIMC_BUG(!hw_ip);
- /* skip */
- if ((hw_ip->id == DEV_HW_3AA0) && test_bit(DEV_HW_3AA1, &hw_map))
- return 0;
- else if ((hw_ip->id == DEV_HW_3AA1) && test_bit(DEV_HW_3AA0, &hw_map))
- return 0;
-
if (!test_bit_variables(hw_ip->id, &hw_map)) {
msdbg_hw(2, "%s: hw_map(0x%lx)\n", instance, hw_ip, __func__, hw_map);
return 0;
hw_3aa = (struct fimc_is_hw_3aa *)hw_ip->priv_info;
ret = fimc_is_lib_isp_apply_tune_set(&hw_3aa->lib[instance], setfile_index, instance);
+ if (ret)
+ return ret;
- if (sensor_position == SENSOR_POSITION_REAR || sensor_position == SENSOR_POSITION_REAR2)
- cal_addr = hw_3aa->lib_support->minfo->kvaddr_rear_cal;
-#if !defined(CONFIG_CAMERA_OTPROM_SUPPORT_FRONT)
- else if (sensor_position == SENSOR_POSITION_FRONT)
- cal_addr = hw_3aa->lib_support->minfo->kvaddr_front_cal;
-#endif
- else
+ if ((sensor_position == SENSOR_POSITION_REAR) &&
+ IS_ENABLED(CONFIG_CAMERA_OTPROM_SUPPORT_REAR)) {
+ return 0;
+ } else if (sensor_position == SENSOR_POSITION_FRONT &&
+ IS_ENABLED(CONFIG_CAMERA_OTPROM_SUPPORT_FRONT)) {
return 0;
+ } else if (sensor_position < SENSOR_POSITION_MAX) {
+ cal_addr = hw_3aa->lib_support->minfo->kvaddr_cal[sensor_position];
- msinfo_hw("load cal data, position: %d, addr: 0x%lx \n", instance, hw_ip,
+ msinfo_hw("load cal data, position: %d, addr: 0x%lx\n", instance, hw_ip,
sensor_position, cal_addr);
- ret = fimc_is_lib_isp_load_cal_data(&hw_3aa->lib[instance], instance, cal_addr);
- ret = fimc_is_lib_isp_get_cal_data(&hw_3aa->lib[instance], instance,
- &hw_ip->hardware->cal_info[sensor_position], CAL_TYPE_LSC_UVSP);
+ ret = fimc_is_lib_isp_load_cal_data(&hw_3aa->lib[instance], instance, cal_addr);
+ ret = fimc_is_lib_isp_get_cal_data(&hw_3aa->lib[instance], instance,
+ &hw_ip->hardware->cal_info[sensor_position], CAL_TYPE_LSC_UVSP);
+ } else {
+ return 0;
+ }
return ret;
}
FIMC_BUG(!hw_ip);
- /* skip */
- if ((hw_ip->id == DEV_HW_3AA0) && test_bit(DEV_HW_3AA1, &hw_map))
- return 0;
- else if ((hw_ip->id == DEV_HW_3AA1) && test_bit(DEV_HW_3AA0, &hw_map))
- return 0;
-
if (!test_bit_variables(hw_ip->id, &hw_map)) {
msdbg_hw(2, "%s: hw_map(0x%lx)\n", instance, hw_ip, __func__, hw_map);
return 0;
int fimc_is_hw_3aa_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface *itf,
struct fimc_is_interface_ischain *itfc, int id, const char *name);
int fimc_is_hw_3aa_mode_change(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_map);
-void fimc_is_hw_3aa_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *region,
+void fimc_is_hw_3aa_update_param(struct fimc_is_hw_ip *hw_ip, struct is_param_region *region,
struct taa_param_set *param_set, u32 lindex, u32 hindex, u32 instance);
-int fimc_is_hw_3aa_reset(struct fimc_is_hw_ip *hw_ip);
void fimc_is_hw_3aa_dump(void);
#endif
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 32, 4,
hw_ip->regs, reg_size, false);
#else
- if (flag_print_log) {
- if (hw_ip->id != DEV_HW_3AA1 || hw_ip->id != DEV_HW_VRA)
- print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 32, 4,
- hw_ip->regs, reg_size, false);
- }
+ if (flag_print_log)
+ print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 32, 4,
+ hw_ip->regs, reg_size, false);
#endif
if (IS_ERR_OR_NULL(hw_ip->sfr_b_dump))
return;
if (done_type == IS_SHOT_TIMEOUT) {
mserr_hw("[F:%d]hardware is timeout", frame->instance, hw_ip, frame->fcount);
fimc_is_hardware_size_dump(hw_ip);
+ fimc_is_lib_logdump();
}
ret = fimc_is_hardware_frame_ndone(hw_ip, frame, atomic_read(&hw_ip->instance), done_type);
case DEV_HW_3AA1:
group_id = GROUP_ID_3AA1;
break;
+ case DEV_HW_VPP:
+ group_id = GROUP_ID_3AA2;
+ break;
case DEV_HW_ISP0:
group_id = GROUP_ID_ISP0;
break;
case GROUP_ID_3AA1:
hw_id = DEV_HW_3AA1;
break;
+ case GROUP_ID_3AA2:
+ hw_id = DEV_HW_VPP;
+ break;
case GROUP_ID_ISP0:
hw_id = DEV_HW_ISP0;
break;
{
hw_frame->groupmgr = frame->groupmgr;
hw_frame->group = frame->group;
- hw_frame->shot = frame->shot;
hw_frame->shot_ext = frame->shot_ext;
- hw_frame->kvaddr_shot = frame->kvaddr_shot;
- hw_frame->dvaddr_shot = frame->dvaddr_shot;
+ hw_frame->shot = frame->shot;
hw_frame->shot_size = frame->shot_size;
hw_frame->fcount = frame->fcount;
hw_frame->rcount = frame->rcount;
}
#endif
+#if (defined(SOC_32S) && !defined(SOC_3AAISP))
+ hw_id = DEV_HW_VPP;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_hw("invalid slot (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+ ret = fimc_is_hw_3aa_probe(&(hardware->hw_ip[hw_slot]), itf, itfc, hw_id, "3AA1");
+ if (ret) {
+ err_hw("probe fail (%d,%d)", hw_id, hw_slot);
+ return ret;
+ }
+#endif
+
#if (defined(SOC_I0S) && !defined(SOC_3AAISP))
hw_id = DEV_HW_ISP0;
hw_slot = fimc_is_hw_slot_id(hw_id);
hardware->sensor_position[i] = 0;
}
- for (i = 0; i < SENSOR_POSITION_END; i++)
+ for (i = 0; i < SENSOR_POSITION_MAX; i++)
atomic_set(&hardware->streaming[i], 0);
atomic_set(&hardware->rsccount, 0);
child = group->tail;
+ if ((group->id == GROUP_ID_3AA0 || group->id == GROUP_ID_3AA1)
+ && !test_bit(FIMC_IS_GROUP_OTF_INPUT, &group->state))
+ fimc_is_hw_mcsc_set_size_for_uvsp(hardware, frame, hw_map);
+
while (child && (child->device_type == FIMC_IS_DEVICE_ISCHAIN)) {
hw_maxnum = fimc_is_get_hw_list(child->id, hw_list);
for (hw_index = hw_maxnum - 1; hw_index >= 0; hw_index--) {
if (!valid_hw_slot_id(hw_slot)) {
merr_hw("invalid slot (%d,%d)", instance,
hw_id, hw_slot);
- return -EINVAL;
+ ret = -EINVAL;
+ goto shot_err_cancel;
}
hw_ip = &hardware->hw_ip[hw_slot];
hw_ip->debug_index[0] = frame->fcount;
hw_ip->debug_info[index].cpuid[DEBUG_POINT_HW_SHOT] = raw_smp_processor_id();
hw_ip->debug_info[index].time[DEBUG_POINT_HW_SHOT] = local_clock();
+
ret = CALL_HW_OPS(hw_ip, shot, frame, hw_map);
if (ret) {
mserr_hw("shot fail (%d)[F:%d]", instance, hw_ip,
hw_slot, frame->fcount);
- return -EINVAL;
+ goto shot_err_cancel;
}
}
child = child->parent;
frame->bak_flag, frame->out_flag, frame->core_flag, framenum);
#endif
+ return ret;
+
+shot_err_cancel:
+ mwarn_hw("[F:%d] Canceled by hardware shot err", instance, hw_ip, frame->fcount);
+
+ framemgr_e_barrier_common(framemgr, 0, flags);
+ trans_frame(framemgr, frame, FS_HW_FREE);
+ framemgr_x_barrier_common(framemgr, 0, flags);
+
+ if (child && child->tail) {
+ struct fimc_is_group *restore_grp = child->tail;
+
+ while (restore_grp && (restore_grp->id != child->id)) {
+ fimc_is_hardware_restore_by_group(hardware, restore_grp, instance);
+ restore_grp = restore_grp->parent;
+ }
+ }
+
return ret;
}
mserr_hw("[F:%d] get_meta fail", instance, hw_ip, frame->fcount);
return 0;
}
+ if (hw_ip->id == DEV_HW_3AA0 || hw_ip->id == DEV_HW_3AA1)
+ fimc_is_hw_mcsc_set_ni(hw_ip->hardware, frame, instance);
+
break;
case DEV_HW_TPU0:
case DEV_HW_TPU1:
struct fimc_is_group *group, struct fimc_is_frame *frame, ulong hw_map)
{
int ret = 0;
- int i, hw_slot = -1;
+ int hw_slot = -1;
struct fimc_is_hw_ip *hw_ip = NULL;
enum fimc_is_hardware_id hw_id = DEV_HW_END;
struct fimc_is_frame *hw_frame;
struct fimc_is_framemgr *framemgr;
struct fimc_is_group *head;
ulong flags = 0;
+ u32 shot_timeout = 0;
+#if defined(MULTI_SHOT_KTHREAD) || defined(MULTI_SHOT_TASKLET)
+ int i;
+#endif
FIMC_BUG(!hardware);
FIMC_BUG(!frame);
#endif
if (!atomic_read(&hardware->streaming[hardware->sensor_position[instance]]))
- msinfo_hw("grp_shot [F:%d][G:0x%x][B:0x%lx][O:0x%lx][IN:0x%x]\n",
+ msinfo_hw("grp_shot [F:%d][G:0x%x][B:0x%lx][O:0x%lx][dva:%pad]\n",
instance, hw_ip,
frame->fcount, GROUP_ID(head->id),
- frame->bak_flag, frame->out_flag, frame->dvaddr_buffer[0]);
+ frame->bak_flag, frame->out_flag, &frame->dvaddr_buffer[0]);
framemgr = hw_ip->framemgr;
framemgr_e_barrier_irqs(framemgr, 0, flags);
/* for NI (noise index) */
hw_frame->noise_idx = frame->noise_idx;
+ /* shot timer set */
+ shot_timeout = head->device->resourcemgr->shot_timeout;
+
if (test_bit(FIMC_IS_GROUP_OTF_INPUT, &head->state)) {
if (!atomic_read(&hw_ip->status.otf_start)) {
atomic_set(&hw_ip->status.otf_start, 1);
put_frame(framemgr, hw_frame, FS_HW_REQUEST);
framemgr_x_barrier_irqr(framemgr, 0, flags);
- mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(FIMC_IS_SHOT_TIMEOUT));
+ mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(shot_timeout));
return ret;
}
return -EINVAL;
}
#endif
- mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(FIMC_IS_SHOT_TIMEOUT));
+ mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(shot_timeout));
}
framemgr_x_barrier_irqr(framemgr, 0, flags);
int ret = 0;
int i = 0;
struct fimc_is_frame *frame;
+ u32 shot_timeout;
FIMC_BUG(!hw_ip);
FIMC_BUG(!framemgr);
}
frame->groupmgr = NULL;
frame->group = NULL;
- frame->shot = NULL;
frame->shot_ext = NULL;
- frame->kvaddr_shot = 0;
- frame->dvaddr_shot = 0;
+ frame->shot = NULL;
frame->shot_size = 0;
frame->fcount = fcount;
frame->rcount = 0;
frame->instance = instance;
*in_frame = frame;
- mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(FIMC_IS_SHOT_TIMEOUT));
+ shot_timeout = hw_ip->group[instance]->device->resourcemgr->shot_timeout;
+ mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(shot_timeout));
return ret;
}
int hw_slot = -1;
struct fimc_is_hw_ip *hw_ip;
enum fimc_is_hardware_id hw_id = DEV_HW_END;
+ u32 shot_timeout = 0;
FIMC_BUG(!hardware);
return -EINVAL;
}
- if (atomic_read(&hw_ip->status.otf_start))
- mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(FIMC_IS_SHOT_TIMEOUT));
+ if (atomic_read(&hw_ip->status.otf_start)) {
+ shot_timeout = hw_ip->group[instance]->device->resourcemgr->shot_timeout;
+ mod_timer(&hw_ip->shot_timer, jiffies + msecs_to_jiffies(shot_timeout));
+ }
atomic_set(&hardware->streaming[hardware->sensor_position[instance]], 1);
atomic_set(&hardware->bug_count, 0);
}
memset(hw_ip->debug_info, 0x00, sizeof(struct hw_debug_info) * DEBUG_FRAME_COUNT);
- memset(hw_ip->setfile, 0x00, sizeof(struct fimc_is_hw_ip_setfile) * SENSOR_POSITION_END);
+ memset(hw_ip->setfile, 0x00, sizeof(struct fimc_is_hw_ip_setfile) * SENSOR_POSITION_MAX);
hw_ip->applied_scenario = -1;
hw_ip->debug_index[0] = 0;
hw_ip->debug_index[1] = 0;
/* Force flush the old H/W frames with DONE state */
framemgr_e_barrier_common(framemgr, 0, flags);
if (framemgr->queued_count[FS_HW_WAIT_DONE] > 0) {
+ struct fimc_is_frame *temp;
u32 fcount = frame->fcount;
-
- frame = peek_frame(framemgr, FS_HW_WAIT_DONE);
- while (frame && frame->fcount < fcount) {
- msinfo_hw("[F%d]force flush\n",
- frame->instance, hw_ip, frame->fcount);
- trans_frame(framemgr, frame, FS_HW_FREE);
- atomic_set(&frame->shot_done_flag, 0);
- frame = peek_frame(framemgr, FS_HW_WAIT_DONE);
+ u32 instance = frame->instance;
+
+ list_for_each_entry_safe(frame, temp, &framemgr->queued_list[FS_HW_WAIT_DONE], list) {
+ if (frame && frame->instance == instance && frame->fcount < fcount) {
+ msinfo_hw("[F%d]force flush\n",
+ frame->instance, hw_ip, frame->fcount);
+ trans_frame(framemgr, frame, FS_HW_FREE);
+ atomic_set(&frame->shot_done_flag, 0);
+ }
}
}
framemgr_x_barrier_common(framemgr, 0, flags);
}
if (done_type == IS_SHOT_TIMEOUT)
- _fimc_is_hardware_sfr_dump(hw_ip, true);
+ _fimc_is_hardware_sfr_dump(hw_ip, false);
}
head = head->child;
}
enum fimc_is_hardware_id {
DEV_HW_3AA0 = 1,
DEV_HW_3AA1,
+ DEV_HW_VPP, /* 3AA2 */
DEV_HW_ISP0,
DEV_HW_ISP1,
- DEV_HW_DRC, /* = 5 */
+ DEV_HW_DRC,
DEV_HW_SCC,
DEV_HW_DIS,
DEV_HW_3DNR,
DEV_HW_TPU0,
- DEV_HW_TPU1, /* = 10 */
+ DEV_HW_TPU1,
DEV_HW_SCP,
DEV_HW_MCSC0,
DEV_HW_MCSC1,
DEV_HW_FD,
- DEV_HW_VRA, /* = 15 */
+ DEV_HW_VRA,
DEV_HW_DCP,
DEV_HW_PAF0, /* PAF RDMA */
DEV_HW_PAF1,
HW_MCS_YSUM_CFG,
HW_MCS_DS_CFG,
HW_OVERFLOW_RECOVERY,
+ HW_PAFSTAT_RDMA_CFG,
HW_END
};
struct fimc_is_interface *itf;
/* control interface */
struct fimc_is_interface_ischain *itfc;
- struct fimc_is_hw_ip_setfile setfile[SENSOR_POSITION_END];
+ struct fimc_is_hw_ip_setfile setfile[SENSOR_POSITION_MAX];
u32 applied_scenario;
/* for dump sfr */
u8 *sfr_dump;
struct kthread_worker mshot_worker;
struct kthread_work mshot_work;
#endif
+
+ /* currently used for subblock inside MCSC */
+ u32 subblk_ctrl;
};
#define CALL_HW_OPS(hw, op, args...) \
/* for access mcuctl regs */
void __iomem *base_addr_mcuctl;
- struct cal_info cal_info[SENSOR_POSITION_END];
- atomic_t streaming[SENSOR_POSITION_END];
+ struct cal_info cal_info[SENSOR_POSITION_MAX];
+ atomic_t streaming[SENSOR_POSITION_MAX];
atomic_t bug_count;
atomic_t log_count;
err_chain_create:
err_lib_func:
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
err_alloc:
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
return ret;
}
-int fimc_is_hw_dcp_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
+static int fimc_is_hw_dcp_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
{
int ret = 0;
struct fimc_is_hw_dcp *hw_dcp;
fimc_is_lib_isp_chain_destroy(hw_ip, &hw_dcp->lib[instance], instance);
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
return ret;
}
-int fimc_is_hw_dcp_enable(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_map)
+static int fimc_is_hw_dcp_enable(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_map)
{
int ret = 0;
return ret;
}
-int fimc_is_hw_dcp_disable(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_map)
+static int fimc_is_hw_dcp_disable(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_map)
{
int ret = 0;
long timetowait;
}
}
-int fimc_is_hw_dcp_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
+static void fimc_is_hw_dcp_update_param(struct dcp_param *param,
+ struct dcp_param_set *param_set, u32 lindex, u32 hindex, u32 instance)
+{
+ param_set->instance_id = instance;
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_CONTROL))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_CONTROL))) {
+ memcpy(¶m_set->control, ¶m->control,
+ sizeof(struct param_control));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_MASTER))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_MASTER))) {
+ memcpy(¶m_set->dma_input_m, ¶m->dma_input_m,
+ sizeof(struct param_dma_input));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_SLAVE))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_SLAVE))) {
+ memcpy(¶m_set->dma_input_s, ¶m->dma_input_s,
+ sizeof(struct param_dma_input));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_MASTER))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_MASTER))) {
+ memcpy(¶m_set->dma_output_m, ¶m->dma_output_m,
+ sizeof(struct param_dma_output));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_SLAVE))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_SLAVE))) {
+ memcpy(¶m_set->dma_output_s, ¶m->dma_output_s,
+ sizeof(struct param_dma_output));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_MASTER_DS))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_MASTER_DS))) {
+ memcpy(¶m_set->dma_output_m_ds, ¶m->dma_output_m_ds,
+ sizeof(struct param_dma_output));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_SLAVE_DS))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_SLAVE_DS))) {
+ memcpy(¶m_set->dma_output_s_ds, ¶m->dma_output_s_ds,
+ sizeof(struct param_dma_output));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_INPIT_DISPARITY))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_INPIT_DISPARITY))) {
+ memcpy(¶m_set->dma_input_disparity, ¶m->dma_input_disparity,
+ sizeof(struct param_dma_output));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))
+ || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))) {
+ memcpy(¶m_set->dma_output_disparity, ¶m->dma_output_disparity,
+ sizeof(struct param_dma_output));
+ }
+}
+
+static int fimc_is_hw_dcp_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
ulong hw_map)
{
int ret = 0;
if (param_set->dma_input_m.cmd == DMA_INPUT_COMMAND_ENABLE) {
for (i = 0; i < plane; i++) {
param_set->input_dva[DCP_DMA_IN_GDC_MASTER][i] =
- frame->dvaddr_buffer[i];
+ (typeof(**param_set->input_dva))frame->dvaddr_buffer[i];
if (param_set->input_dva[DCP_DMA_IN_GDC_MASTER][i] == 0) {
mserr_hw("[F:%d]DCP_DMA_IN_GDC_MASTER plane[%d] dva is zero",
frame->instance, hw_ip, frame->fcount, i);
return ret;
}
-int fimc_is_hw_dcp_set_param(struct fimc_is_hw_ip *hw_ip, struct is_region *region,
+static int fimc_is_hw_dcp_set_param(struct fimc_is_hw_ip *hw_ip, struct is_region *region,
u32 lindex, u32 hindex, u32 instance, ulong hw_map)
{
int ret = 0;
return ret;
}
-void fimc_is_hw_dcp_update_param(struct dcp_param *param,
- struct dcp_param_set *param_set, u32 lindex, u32 hindex, u32 instance)
-{
- param_set->instance_id = instance;
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_CONTROL))
- || (hindex & HIGHBIT_OF(PARAM_DCP_CONTROL))) {
- memcpy(¶m_set->control, ¶m->control,
- sizeof(struct param_control));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_MASTER))
- || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_MASTER))) {
- memcpy(¶m_set->dma_input_m, ¶m->dma_input_m,
- sizeof(struct param_dma_input));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_SLAVE))
- || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_SLAVE))) {
- memcpy(¶m_set->dma_input_s, ¶m->dma_input_s,
- sizeof(struct param_dma_input));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_MASTER))
- || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_MASTER))) {
- memcpy(¶m_set->dma_output_m, ¶m->dma_output_m,
- sizeof(struct param_dma_output));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_SLAVE))
- || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_SLAVE))) {
- memcpy(¶m_set->dma_output_s, ¶m->dma_output_s,
- sizeof(struct param_dma_output));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_MASTER_DS))
- || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_MASTER_DS))) {
- memcpy(¶m_set->dma_output_m_ds, ¶m->dma_output_m_ds,
- sizeof(struct param_dma_output));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_SLAVE_DS))
- || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_SLAVE_DS))) {
- memcpy(¶m_set->dma_output_s_ds, ¶m->dma_output_s_ds,
- sizeof(struct param_dma_output));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_INPIT_DISPARITY))
- || (hindex & HIGHBIT_OF(PARAM_DCP_INPIT_DISPARITY))) {
- memcpy(¶m_set->dma_input_disparity, ¶m->dma_input_disparity,
- sizeof(struct param_dma_output));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))
- || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))) {
- memcpy(¶m_set->dma_output_disparity, ¶m->dma_output_disparity,
- sizeof(struct param_dma_output));
- }
-}
-
-int fimc_is_hw_dcp_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
+static int fimc_is_hw_dcp_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
ulong hw_map)
{
int ret = 0;
return ret;
}
-int fimc_is_hw_dcp_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
+static int fimc_is_hw_dcp_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
u32 instance, enum ShotErrorType done_type)
{
int ret = 0;
return ret;
}
-int fimc_is_hw_dcp_load_setfile(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_map)
+static int fimc_is_hw_dcp_load_setfile(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_map)
{
int ret = 0;
return ret;
}
-int fimc_is_hw_dcp_apply_setfile(struct fimc_is_hw_ip *hw_ip, u32 scenario,
+static int fimc_is_hw_dcp_apply_setfile(struct fimc_is_hw_ip *hw_ip, u32 scenario,
u32 instance, ulong hw_map)
{
u32 setfile_index = 0;
return ret;
}
-int fimc_is_hw_dcp_delete_setfile(struct fimc_is_hw_ip *hw_ip, u32 instance,
+static int fimc_is_hw_dcp_delete_setfile(struct fimc_is_hw_ip *hw_ip, u32 instance,
ulong hw_map)
{
int ret = 0;
return ret;
}
-void fimc_is_hw_dcp_size_dump(struct fimc_is_hw_ip *hw_ip)
+static void fimc_is_hw_dcp_size_dump(struct fimc_is_hw_ip *hw_ip)
{
return;
}
int fimc_is_hw_dcp_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface *itf,
struct fimc_is_interface_ischain *itfc, int id, const char *name);
-void fimc_is_hw_dcp_update_param(struct dcp_param *param,
- struct dcp_param_set *param_set, u32 lindex, u32 hindex, u32 instance);
#endif
u32 scale_index = MCSC_DJAG_PRESCALE_INDEX_1, backup_in;
enum exynos_sensor_position sensor_position;
int output_id = 0;
+#if defined(USE_YUV_RANGE_BY_ISP)
+ u32 yuv = 0;
+#endif
+ u32 white = 1023, black = 0;
+ bool djag_en = true;
FIMC_BUG(!hw_ip);
FIMC_BUG(!hw_ip->priv_info);
backup_in = hw_mcsc->djag_in;
if (hw_ip->hardware->video_mode)
- hw_mcsc->djag_in = DEV_HW_MCSC0;
+ hw_mcsc->djag_in = MCSC_DJAG_IN_VIDEO_MODE;
else
- hw_mcsc->djag_in = DEV_HW_MCSC1;
+ hw_mcsc->djag_in = MCSC_DJAG_IN_CAPTURE_MODE;
+
+ /* The force means that sysfs control has higher priority than scenario. */
+ fimc_is_hw_mcsc_get_force_block_control(hw_ip, SUBBLK_IP_DJAG, cap->max_djag,
+ &hw_mcsc->djag_in, &djag_en);
if (backup_in != hw_mcsc->djag_in)
sdbg_hw(0, "djag input_source changed %d-> %d\n", hw_ip,
if (hw_mcsc->djag_in != hw_ip->id)
return ret;
+ if (djag_en == false) {
+ fimc_is_scaler_set_djag_enable(hw_ip->regs, djag_en);
+ sinfo_hw("DJAG off forcely\n", hw_ip);
+ return ret;
+ }
+
sensor_position = hw_ip->hardware->sensor_position[instance];
djag_tuneset = &init_djag_cfgs;
out_width = param->output[output_id].width;
out_height = param->output[output_id].height;
}
+#if defined(USE_YUV_RANGE_BY_ISP)
+ if (yuv != param->output[output_id].yuv_range)
+ sdbg_hw(2, "[OUT:%d] yuv: %s -> %s\n", hw_ip, output_id,
+ yuv ? "N" : "W", param->output[output_id].yuv_range ? "N" : "W");
+ yuv = param->output[output_id].yuv_range;
+#endif
}
}
#endif
#endif
fimc_is_scaler_set_djag_tunning_param(hw_ip->regs, djag_tuneset);
- fimc_is_scaler_set_djag_wb_thres(hw_ip->regs, djag_wb);
+#if defined(USE_YUV_RANGE_BY_ISP)
+ if (yuv == SCALER_OUTPUT_YUV_RANGE_FULL) {
+ white = 1023;
+ black = 0;
+ } else {
+ white = 940;
+ black = 64;
+ }
+#endif
+ fimc_is_scaler_set_djag_dither_wb(hw_ip->regs, djag_wb, white, black);
fimc_is_scaler_set_djag_enable(hw_ip->regs, 1);
{
if (uctl->lensUd.posSize != 0)
DUP_SHOT_UCTL_UDM(lens);
- else
- memset(&udm->lens, 0x00, sizeof(camera2_lens_udm_t));
-
}
#define CPY_MODE_UDM(item) CPY_SHOT_UCTL_UDM(isMode, item)
err_chain_create:
err_lib_func:
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
err_alloc:
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
fimc_is_lib_isp_chain_destroy(hw_ip, &hw_isp->lib[instance], instance);
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
int hw_slot = 0;
int yuv_range = 0; /* 0: FULL, 1: NARROW */
+#if !defined(USE_YUV_RANGE_BY_ISP)
+ return 0;
+#endif
if (test_bit(DEV_HW_MCSC0, &hw_map))
hw_id = DEV_HW_MCSC0;
else if (test_bit(DEV_HW_MCSC1, &hw_map))
return ret;
}
+static void fimc_is_hw_isp_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *region,
+ struct isp_param_set *param_set, u32 lindex, u32 hindex, u32 instance)
+{
+ struct isp_param *param;
+
+ FIMC_BUG_VOID(!region);
+ FIMC_BUG_VOID(!param_set);
+
+ param = ®ion->parameter.isp;
+ param_set->instance_id = instance;
+
+ /* check input */
+ if (lindex & LOWBIT_OF(PARAM_ISP_OTF_INPUT)) {
+ memcpy(¶m_set->otf_input, ¶m->otf_input,
+ sizeof(struct param_otf_input));
+ }
+
+ if (lindex & LOWBIT_OF(PARAM_ISP_VDMA1_INPUT)) {
+ memcpy(¶m_set->dma_input, ¶m->vdma1_input,
+ sizeof(struct param_dma_input));
+ }
+
+ /* check output*/
+ if (lindex & LOWBIT_OF(PARAM_ISP_OTF_OUTPUT)) {
+ memcpy(¶m_set->otf_output, ¶m->otf_output,
+ sizeof(struct param_otf_output));
+ }
+
+ if (lindex & LOWBIT_OF(PARAM_ISP_VDMA4_OUTPUT)) {
+ memcpy(¶m_set->dma_output_chunk, ¶m->vdma4_output,
+ sizeof(struct param_dma_output));
+ }
+
+ if (lindex & LOWBIT_OF(PARAM_ISP_VDMA5_OUTPUT)) {
+ memcpy(¶m_set->dma_output_yuv, ¶m->vdma5_output,
+ sizeof(struct param_dma_output));
+ }
+}
+
static int fimc_is_hw_isp_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
ulong hw_map)
{
/* DMA settings */
if (param_set->dma_input.cmd != DMA_INPUT_COMMAND_DISABLE) {
for (i = 0; i < frame->num_buffers; i++) {
- param_set->input_dva[i] = frame->dvaddr_buffer[frame->cur_buf_index + i];
+ param_set->input_dva[i] = (typeof(*param_set->input_dva))
+ frame->dvaddr_buffer[frame->cur_buf_index + i];
if (frame->dvaddr_buffer[i] == 0) {
msinfo_hw("[F:%d]dvaddr_buffer[%d] is zero",
frame->instance, hw_ip, frame->fcount, i);
This is because DDK calculates the position of the cropped image
from the 3AA size. */
fimc_is_hw_3aa_update_param(hw_ip,
- region, param_set->taa_param,
+ ®ion->parameter, param_set->taa_param,
lindex, hindex, frame->instance);
}
}
ret = fimc_is_hw_isp_set_yuv_range(hw_ip, param_set, frame->fcount, hw_map);
- fimc_is_lib_isp_shot(hw_ip, &hw_isp->lib[frame->instance], param_set, frame->shot);
+ ret |= fimc_is_lib_isp_shot(hw_ip, &hw_isp->lib[frame->instance], param_set, frame->shot);
set_bit(HW_CONFIG, &hw_ip->state);
return ret;
}
-void fimc_is_hw_isp_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *region,
- struct isp_param_set *param_set, u32 lindex, u32 hindex, u32 instance)
-{
- struct isp_param *param;
-
- FIMC_BUG_VOID(!region);
- FIMC_BUG_VOID(!param_set);
-
- param = ®ion->parameter.isp;
- param_set->instance_id = instance;
-
- /* check input */
- if (lindex & LOWBIT_OF(PARAM_ISP_OTF_INPUT)) {
- memcpy(¶m_set->otf_input, ¶m->otf_input,
- sizeof(struct param_otf_input));
- }
-
- if (lindex & LOWBIT_OF(PARAM_ISP_VDMA1_INPUT)) {
- memcpy(¶m_set->dma_input, ¶m->vdma1_input,
- sizeof(struct param_dma_input));
- }
-
- /* check output*/
- if (lindex & LOWBIT_OF(PARAM_ISP_OTF_OUTPUT)) {
- memcpy(¶m_set->otf_output, ¶m->otf_output,
- sizeof(struct param_otf_output));
- }
-
- if (lindex & LOWBIT_OF(PARAM_ISP_VDMA4_OUTPUT)) {
- memcpy(¶m_set->dma_output_chunk, ¶m->vdma4_output,
- sizeof(struct param_dma_output));
- }
-
- if (lindex & LOWBIT_OF(PARAM_ISP_VDMA5_OUTPUT)) {
- memcpy(¶m_set->dma_output_yuv, ¶m->vdma5_output,
- sizeof(struct param_dma_output));
- }
-}
-
static int fimc_is_hw_isp_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
ulong hw_map)
{
if (ret)
mserr_hw("get_meta fail", frame->instance, hw_ip);
+ if (frame->shot) {
+ msdbg_hw(2, "%s: [F:%d], %d,%d,%d\n", frame->instance, hw_ip, __func__,
+ frame->fcount,
+ frame->shot->udm.ni.currentFrameNoiseIndex,
+ frame->shot->udm.ni.nextFrameNoiseIndex,
+ frame->shot->udm.ni.nextNextFrameNoiseIndex);
+ }
+
return ret;
}
u32 instance, enum ShotErrorType done_type)
{
int ret = 0;
- int wq_id_ixc, wq_id_ixp, output_id;
+ int wq_id_ixc, wq_id_ixp, wq_id_mexc, output_id;
FIMC_BUG(!hw_ip);
FIMC_BUG(!frame);
case DEV_HW_ISP0:
wq_id_ixc = WORK_I0C_FDONE;
wq_id_ixp = WORK_I0P_FDONE;
+ wq_id_mexc = WORK_ME0C_FDONE;
break;
case DEV_HW_ISP1:
wq_id_ixc = WORK_I1C_FDONE;
wq_id_ixp = WORK_I1P_FDONE;
+ wq_id_mexc = WORK_ME1C_FDONE;
break;
default:
mserr_hw("[F:%d]invalid hw(%d)", instance, hw_ip, frame->fcount, hw_ip->id);
output_id = ENTRY_MEXC;
if (test_bit(output_id, &frame->out_flag)) {
- ret = fimc_is_hardware_frame_done(hw_ip, frame, WORK_ME0C_FDONE,
+ ret = fimc_is_hardware_frame_done(hw_ip, frame, wq_id_mexc,
output_id, done_type, false);
}
int fimc_is_hw_isp_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface *itf,
struct fimc_is_interface_ischain *itfc, int id, const char *name);
-void fimc_is_hw_isp_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *region,
- struct isp_param_set *param_set, u32 lindex, u32 hindex, u32 instance);
-int fimc_is_hw_isp_reset(struct fimc_is_hw_ip *hw_ip);
#endif
return 0;
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
clear_bit(HW_OPEN, &hw_ip->state);
#include "fimc-is-err.h"
#include <linux/videodev2_exynos_media.h>
+int debug_subblk_ctrl;
+module_param(debug_subblk_ctrl, int, 0644);
+
spinlock_t mcsc_out_slock;
static ulong mcsc_out_st = 0xFFFF; /* To check shared output state */
#define MCSC_RST_CHK (MCSC_OUTPUT_MAX)
/* print hw info */
fimc_is_hw_mcsc_hw_info(hw_ip, cap);
+ hw_ip->subblk_ctrl = debug_subblk_ctrl;
hw_ip->mframe = NULL;
atomic_set(&hw_ip->status.Vvalid, V_BLANK);
set_bit(HW_OPEN, &hw_ip->state);
msdbg_hw(2, "open: [G:0x%x], framemgr[%s]", instance, hw_ip,
GROUP_ID(group->id), hw_ip->framemgr->name);
- for (i = 0; i < SENSOR_POSITION_END; i++) {
+ for (i = 0; i < SENSOR_POSITION_MAX; i++)
hw_mcsc->cur_setfile[i] = NULL;
- }
if (check_sc_core_running(hw_ip, cap))
return 0;
err_query_cap:
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
err_alloc:
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
return 0;
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
plane = input->plane;
for (i = 0; i < plane; i++)
- rdma_addr[i] = frame->dvaddr_buffer[plane * frame->cur_buf_index + i];
+ rdma_addr[i] = (typeof(*rdma_addr))
+ frame->dvaddr_buffer[plane * frame->cur_buf_index + i];
/* DMA in */
msdbg_hw(2, "[F:%d]rdma_cfg [addr: %x]\n",
addr = frame->sc5TargetAddress;
break;
default:
- err_hw("[F:%d] invalid output id(%d)\n", frame->fcount, out_id);
- addr = frame->sc0TargetAddress;
+ panic("[F:%d] invalid output id(%d)", frame->fcount, out_id);
break;
}
addr[0], addr[1], addr[2], buf_idx);
}
+static void fimc_is_hw_mcsc_wdma_clear(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
+ struct mcs_param *param, u32 out_id, struct fimc_is_hw_mcsc_cap *cap)
+{
+ u32 wdma_enable = 0;
+ ulong flag;
+
+ wdma_enable = fimc_is_scaler_get_dma_out_enable(hw_ip->regs, out_id);
+
+ spin_lock_irqsave(&mcsc_out_slock, flag);
+ if (wdma_enable && !check_shared_out_running(cap, out_id)) {
+ fimc_is_scaler_set_dma_out_enable(hw_ip->regs, out_id, false);
+ fimc_is_scaler_clear_wdma_addr(hw_ip->regs, out_id);
+ msdbg_hw(2, "[OUT:%d]shot: dma_out disabled\n",
+ frame->instance, hw_ip, out_id);
+
+ if (out_id == MCSC_OUTPUT_DS) {
+ fimc_is_scaler_set_ds_enable(hw_ip->regs, false);
+ msdbg_hw(2, "DS off\n", frame->instance, hw_ip);
+ }
+ }
+ spin_unlock_irqrestore(&mcsc_out_slock, flag);
+ msdbg_hw(2, "[OUT:%d]mcsc_wdma_clear: en(%d)[F:%d][T:%d][cmd:%d][addr:0x0]\n",
+ frame->instance, hw_ip, out_id, wdma_enable, frame->fcount, frame->type,
+ param->output[out_id].dma_cmd);
+}
+
static void fimc_is_hw_mcsc_wdma_cfg(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame)
{
struct mcs_param *param;
struct fimc_is_hw_mcsc_cap *cap = GET_MCSC_HW_CAP(hw_ip);
struct fimc_is_hw_mcsc *hw_mcsc;
- u32 wdma_addr[MCSC_OUTPUT_MAX][4] = {{0} }, *wdma_base;
+ u32 wdma_addr[MCSC_OUTPUT_MAX][4] = {{0} }, *wdma_base = NULL;
u32 plane, buf_idx, out_id, i;
ulong flag;
param = &hw_ip->region[frame->instance]->parameter.mcs;
hw_mcsc = (struct fimc_is_hw_mcsc *)hw_ip->priv_info;
- if (frame->type == SHOT_TYPE_INTERNAL)
- goto skip_addr;
-
- for (buf_idx = 0; buf_idx < frame->num_buffers; buf_idx++) {
- for (out_id = MCSC_OUTPUT0; out_id <= MCSC_OUTPUT5; out_id++) {
- plane = param->output[out_id].plane;
- for (i = 0; i < plane; i++) {
- wdma_base = hw_mcsc_get_target_addr(out_id, frame);
- wdma_addr[out_id][i] = wdma_base[plane * buf_idx + i];
- dbg_hw(2, "M%dP(P:%d)(A:0x%X)\n", out_id, i, wdma_addr[out_id][i]);
- }
- }
-
- /* DMA out */
- for (out_id = MCSC_OUTPUT0; out_id < cap->max_output; out_id++) {
- if ((cap->out_dma[out_id] != MCSC_CAP_SUPPORT)
- || !test_bit(out_id, &hw_mcsc->out_en))
- continue;
+ for (out_id = MCSC_OUTPUT0; out_id < cap->max_output; out_id++) {
+ if ((cap->out_dma[out_id] != MCSC_CAP_SUPPORT)
+ || !test_bit(out_id, &hw_mcsc->out_en))
+ continue;
- msdbg_hw(2, "[F:%d]wdma_cfg [T:%d][addr%d: %x]\n", frame->instance, hw_ip,
- frame->fcount, frame->type, out_id, wdma_addr[out_id][0]);
+ wdma_base = hw_mcsc_get_target_addr(out_id, frame);
+ msdbg_hw(2, "[F:%d]wdma_cfg [T:%d][addr%d: %x]\n", frame->instance, hw_ip,
+ frame->fcount, frame->type, out_id, wdma_base[0]);
- if (param->output[out_id].dma_cmd != DMA_OUTPUT_COMMAND_DISABLE
- && wdma_addr[out_id][0]) {
+ if (param->output[out_id].dma_cmd != DMA_OUTPUT_COMMAND_DISABLE
+ && wdma_base && wdma_base[0]
+ && frame->type != SHOT_TYPE_INTERNAL) {
- spin_lock_irqsave(&mcsc_out_slock, flag);
- if (check_shared_out_running(cap, out_id)
- && frame->type != SHOT_TYPE_MULTI) {
- mswarn_hw("[OUT:%d]DMA_OUTPUT in running state[F:%d]",
- frame->instance, hw_ip, out_id, frame->fcount);
- spin_unlock_irqrestore(&mcsc_out_slock, flag);
- return;
- }
- set_bit(out_id, &mcsc_out_st);
+ spin_lock_irqsave(&mcsc_out_slock, flag);
+ if (check_shared_out_running(cap, out_id) && frame->type != SHOT_TYPE_MULTI) {
+ mswarn_hw("[OUT:%d]DMA_OUTPUT in running state[F:%d]",
+ frame->instance, hw_ip, out_id, frame->fcount);
spin_unlock_irqrestore(&mcsc_out_slock, flag);
-
- msdbg_hw(2, "[OUT:%d]dma_out enabled\n", frame->instance, hw_ip, out_id);
- if (out_id != MCSC_OUTPUT_DS)
- fimc_is_scaler_set_dma_out_enable(hw_ip->regs, out_id, true);
-
- /* use only one buffer (per-frame) */
- fimc_is_scaler_set_wdma_frame_seq(hw_ip->regs, out_id,
- 0x1 << USE_DMA_BUFFER_INDEX);
-
- plane = param->output[out_id].plane;
- hw_mcsc_set_wdma_addr(hw_ip, wdma_addr[out_id], out_id, plane, buf_idx);
+ continue;
}
- }
- }
+ set_bit(out_id, &mcsc_out_st);
+ spin_unlock_irqrestore(&mcsc_out_slock, flag);
-skip_addr:
- for (out_id = MCSC_OUTPUT0; out_id < cap->max_output; out_id++) {
- if ((cap->out_dma[out_id] != MCSC_CAP_SUPPORT)
- || !test_bit(out_id, &hw_mcsc->out_en))
- continue;
+ msdbg_hw(2, "[OUT:%d]dma_out enabled\n", frame->instance, hw_ip, out_id);
+ if (out_id != MCSC_OUTPUT_DS)
+ fimc_is_scaler_set_dma_out_enable(hw_ip->regs, out_id, true);
- if ((param->output[out_id].dma_cmd == DMA_OUTPUT_COMMAND_DISABLE)
- || (!wdma_addr[out_id][0])
- || (frame->type == SHOT_TYPE_INTERNAL)) {
- u32 wdma_enable = 0;
+ /* use only one buffer (per-frame) */
+ fimc_is_scaler_set_wdma_frame_seq(hw_ip->regs, out_id,
+ 0x1 << USE_DMA_BUFFER_INDEX);
- wdma_enable = fimc_is_scaler_get_dma_out_enable(hw_ip->regs, out_id);
- spin_lock_irqsave(&mcsc_out_slock, flag);
- if (wdma_enable && !check_shared_out_running(cap, out_id)) {
- fimc_is_scaler_set_dma_out_enable(hw_ip->regs, out_id, false);
- fimc_is_scaler_clear_wdma_addr(hw_ip->regs, out_id);
- msdbg_hw(2, "[OUT:%d]shot: dma_out disabled\n",
- frame->instance, hw_ip, out_id);
-
- if (out_id == MCSC_OUTPUT_DS) {
- fimc_is_scaler_set_ds_enable(hw_ip->regs, false);
- msdbg_hw(2, "DS off\n", frame->instance, hw_ip);
+ plane = param->output[out_id].plane;
+ for (buf_idx = 0; buf_idx < frame->num_buffers; buf_idx++) {
+ for (i = 0; i < plane; i++) {
+ /*
+ * If the number of buffers is not same between leader and subdev,
+ * wdma addresses are forcibly set as the same address of first buffer.
+ */
+ wdma_addr[out_id][i] = wdma_base[plane * buf_idx + i] ?
+ wdma_base[plane * buf_idx + i] : wdma_base[i];
+ dbg_hw(2, "M%dP(P:%d)(A:0x%X)\n", out_id, i, wdma_addr[out_id][i]);
}
+ hw_mcsc_set_wdma_addr(hw_ip, wdma_addr[out_id], out_id, plane, buf_idx);
}
- spin_unlock_irqrestore(&mcsc_out_slock, flag);
- msdbg_hw(2, "[OUT:%d]mcsc_wdma_cfg:wmda_enable(%d)[F:%d][T:%d][cmd:%d][addr:0x%x]\n",
- frame->instance, hw_ip, out_id, wdma_enable, frame->fcount, frame->type,
- param->output[out_id].dma_cmd, wdma_addr[out_id][0]);
+
+ } else {
+ fimc_is_hw_mcsc_wdma_clear(hw_ip, frame, param, out_id, cap);
}
}
}
/* WDMA cfg */
fimc_is_hw_mcsc_wdma_cfg(hw_ip, frame);
- fimc_is_scaler_set_lfro_mode_enable(hw_ip->regs, hardware->hw_fro_en, frame->num_buffers);
+ fimc_is_scaler_set_lfro_mode_enable(hw_ip->regs, hw_ip->id, hardware->hw_fro_en, frame->num_buffers);
ret_internal = fimc_is_hw_mcsc_update_dsvra_register(hw_ip, head, mcs_param, instance, frame->shot);
ret_internal = fimc_is_hw_mcsc_update_tdnr_register(hw_ip, frame, param, start_flag);
return;
}
+void fimc_is_hw_mcsc_set_size_for_uvsp(struct fimc_is_hardware *hardware,
+ struct fimc_is_frame *frame, ulong hw_map)
+{
+ u32 hw_id;
+ int hw_slot = -1;
+ struct fimc_is_hw_ip *hw_ip;
+ struct fimc_is_hw_mcsc *hw_mcsc;
+ struct is_region *region;
+ struct taa_param *param;
+ struct camera2_shot_ext *shot_ext;
+ u32 input_w, input_h, crop_x, crop_y, output_w = 0, output_h = 0;
+
+ FIMC_BUG_VOID(!frame);
+
+ hw_id = DEV_HW_MCSC0;
+ if (test_bit_variables(hw_id, &hw_map))
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+
+ hw_id = DEV_HW_MCSC1;
+ if (!valid_hw_slot_id(hw_slot) && test_bit_variables(hw_id, &hw_map))
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_hw("[%d]Can't find proper hw_slot for MCSC", frame->instance);
+ return;
+ }
+
+ hw_ip = &hardware->hw_ip[hw_slot];
+ FIMC_BUG_VOID(!hw_ip->priv_info);
+ hw_mcsc = (struct fimc_is_hw_mcsc *)hw_ip->priv_info;
+ region = hw_ip->region[frame->instance];
+ FIMC_BUG_VOID(!region);
+
+ shot_ext = frame->shot_ext;
+ if (!frame->shot_ext) {
+ sdbg_hw(2, "[F:%d] shot_ext(NULL)\n", hw_ip, frame->fcount);
+ return;
+ }
+
+ msdbg_hw(2, "[F:%d]: set_size_for_uvsp: binning_r(%d,%d), crop_taa(%d,%d), bds(%d,%d)\n",
+ frame->instance, hw_ip, frame->fcount,
+ shot_ext->binning_ratio_x, shot_ext->binning_ratio_y,
+ shot_ext->crop_taa_x, shot_ext->crop_taa_y,
+ shot_ext->bds_ratio_x, shot_ext->bds_ratio_y);
+
+ param = ®ion->parameter.taa;
+
+ input_w = param->otf_input.bayer_crop_width;
+ input_h = param->otf_input.bayer_crop_height;
+ crop_x = param->otf_input.bayer_crop_offset_x;
+ crop_y = param->otf_input.bayer_crop_offset_y;
+ if (param->vdma1_input.cmd != DMA_INPUT_COMMAND_DISABLE) {
+ input_w = param->vdma1_input.bayer_crop_width;
+ input_h = param->vdma1_input.bayer_crop_height;
+ if (param->otf_output.crop_enable) {
+ crop_x = param->otf_output.crop_offset_x;
+ crop_y = param->otf_output.crop_offset_y;
+ } else {
+ crop_x = param->vdma1_input.bayer_crop_offset_x;
+ crop_y = param->vdma1_input.bayer_crop_offset_y;
+ }
+ }
+ if (param->vdma2_output.cmd != DMA_OUTPUT_COMMAND_DISABLE) {
+ output_w = param->vdma2_output.width;
+ output_h = param->vdma2_output.height;
+ } else {
+ output_w = param->vdma1_input.bayer_crop_width;
+ output_h = param->vdma1_input.bayer_crop_height;
+ }
+ frame->shot_ext->binning_ratio_x = (u16)region->parameter.sensor.config.sensor_binning_ratio_x;
+ frame->shot_ext->binning_ratio_y = (u16)region->parameter.sensor.config.sensor_binning_ratio_y;
+ frame->shot_ext->crop_taa_x = crop_x;
+ frame->shot_ext->crop_taa_y = crop_y;
+ if (output_w && output_h) {
+ frame->shot_ext->bds_ratio_x = (input_w / output_w);
+ frame->shot_ext->bds_ratio_y = (input_h / output_h);
+ } else {
+ frame->shot_ext->bds_ratio_x = 1;
+ frame->shot_ext->bds_ratio_y = 1;
+ }
+
+ msdbg_hw(2, "[F:%d]: set_size_for_uvsp: in(%d,%d, %dx%d), out(%dx%d), bin_r(%d,%d), crop(%d,%d), bds(%d,%d)\n",
+ frame->instance, hw_ip, frame->fcount,
+ crop_x, crop_y, input_w, input_h, output_w, output_h,
+ shot_ext->binning_ratio_x, shot_ext->binning_ratio_y,
+ shot_ext->crop_taa_x, shot_ext->crop_taa_y,
+ shot_ext->bds_ratio_x, shot_ext->bds_ratio_y);
+}
+
+void fimc_is_hw_mcsc_set_ni(struct fimc_is_hardware *hardware, struct fimc_is_frame *frame,
+ u32 instance)
+{
+ u32 hw_id, index;
+ int hw_slot = -1;
+ struct fimc_is_hw_ip *hw_ip;
+ struct fimc_is_hw_mcsc *hw_mcsc;
+
+ FIMC_BUG_VOID(!frame);
+
+ index = frame->fcount % NI_BACKUP_MAX;
+ hw_id = DEV_HW_MCSC0;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (valid_hw_slot_id(hw_slot)) {
+ hw_ip = &hardware->hw_ip[hw_slot];
+ hw_mcsc = (struct fimc_is_hw_mcsc *)hw_ip->priv_info;
+ if (hw_mcsc && frame->shot) {
+ hw_mcsc->ni_udm[index] = frame->shot->udm.ni;
+ msdbg_hw(2, "set_ni: [F:%d], %d,%d,%d -> %d,%d,%d\n", instance, hw_ip, frame->fcount,
+ frame->shot->udm.ni.currentFrameNoiseIndex,
+ frame->shot->udm.ni.nextFrameNoiseIndex,
+ frame->shot->udm.ni.nextNextFrameNoiseIndex,
+ hw_mcsc->ni_udm[index].currentFrameNoiseIndex,
+ hw_mcsc->ni_udm[index].nextFrameNoiseIndex,
+ hw_mcsc->ni_udm[index].nextNextFrameNoiseIndex);
+ }
+ }
+
+ hw_id = DEV_HW_MCSC1;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (valid_hw_slot_id(hw_slot)) {
+ hw_ip = &hardware->hw_ip[hw_slot];
+ hw_mcsc = (struct fimc_is_hw_mcsc *)hw_ip->priv_info;
+ if (hw_mcsc && frame->shot) {
+ hw_mcsc->ni_udm[index] = frame->shot->udm.ni;
+ msdbg_hw(2, "set_ni: [F:%d], %d,%d,%d -> %d,%d,%d\n", instance, hw_ip, frame->fcount,
+ frame->shot->udm.ni.currentFrameNoiseIndex,
+ frame->shot->udm.ni.nextFrameNoiseIndex,
+ frame->shot->udm.ni.nextNextFrameNoiseIndex,
+ hw_mcsc->ni_udm[index].currentFrameNoiseIndex,
+ hw_mcsc->ni_udm[index].nextFrameNoiseIndex,
+ hw_mcsc->ni_udm[index].nextNextFrameNoiseIndex);
+ }
+ }
+}
+
static int fimc_is_hw_mcsc_get_meta(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_frame *frame, unsigned long hw_map)
{
int ret = 0;
struct fimc_is_hw_mcsc *hw_mcsc;
+ struct fimc_is_hw_mcsc_cap *cap;
+ int i;
if (unlikely(!frame)) {
mserr_hw("get_meta: frame is null", atomic_read(&hw_ip->instance), hw_ip);
return -EINVAL;
}
+ cap = GET_MCSC_HW_CAP(hw_ip);
+ if (!cap) {
+ err_hw("failed to get hw_mcsc_cap(%p)", cap);
+ return -EINVAL;
+ }
+
fimc_is_scaler_get_ysum_result(hw_ip->regs,
&frame->shot->udm.scaler.ysumdata.higher_ysum_value,
&frame->shot->udm.scaler.ysumdata.lower_ysum_value);
+ for (i = MCSC_OUTPUT0; i < cap->max_output; i++)
+ fimc_is_scaler_get_flip_mode(hw_ip->regs, i,
+ &frame->shot_ext->mcsc_flip_result[i]);
+
return ret;
}
return ret;
}
+
+void fimc_is_hw_mcsc_get_force_block_control(struct fimc_is_hw_ip *hw_ip, u32 ip_offset, u32 num_of_block,
+ u32 *input_sel, bool *en)
+{
+ u32 value = hw_ip->subblk_ctrl;
+
+ if (!GET_SUBBLK_CTRL_BIT(value, ip_offset, SUBBLK_CTRL_SYSFS))
+ return;
+
+ switch (num_of_block) {
+ case 1:
+ *input_sel = GET_SUBBLK_CTRL_BIT(value, ip_offset, SUBBLK_CTRL_INPUT) + DEV_HW_MCSC0;
+ *en = GET_SUBBLK_CTRL_BIT(value, ip_offset, SUBBLK_CTRL_EN);
+ sinfo_hw("force control single sub block: value(0x%08X), ip(%u) input_sel(%u), en(%u)\n",
+ hw_ip, value, ip_offset, *input_sel, *en);
+ break;
+ case 2:
+ *en = GET_SUBBLK_CTRL_BIT(value, ip_offset,
+ SUBBLK_CTRL_EN + GET_CORE_NUM(hw_ip->id));
+ sinfo_hw("force control dual sub block: value(0x%08X), ip(%u), en(%u)\n",
+ hw_ip, value, ip_offset, *en);
+ break;
+ default:
+ serr_hw("num_of_block(%u) of ip(%u) is wrong\n", hw_ip, num_of_block, ip_offset);
+ break;
+ }
+}
(output_id + ENTRY_M0P)
#define GET_DJAG_ZOOM_RATIO(in, out) (u32)(((in * 1000 / out) << MCSC_PRECISION) / 1000)
+/*
+ * [0:3]: DJAG
+ * [4:7]: CAC
+ * [8:11]: UVSP
+ * [12:31]: Reserved
+ */
+#define SUBBLK_IP_DJAG (0) /* [0:3] */
+#define SUBBLK_IP_CAC (4) /* [4:7] */
+#define SUBBLK_IP_UVSP (8) /* [8:11] */
+
+#define SUBBLK_CTRL_SYSFS (0)
+#define SUBBLK_CTRL_EN (1)
+#define SUBBLK_CTRL_INPUT (3)
+
+#define GET_SUBBLK_CTRL_BIT(value, IP_OFFSET, CTRL_OFFSET) \
+ (((value) >> ((IP_OFFSET) + (CTRL_OFFSET))) & 0x1)
+
+#define GET_CORE_NUM(id) ((id) - DEV_HW_MCSC0)
+
enum mcsc_img_format {
MCSC_YUV422_1P_YUYV = 0,
MCSC_YUV422_1P_YVYU,
struct fimc_is_hw_mcsc_cap {
u32 hw_ver;
u32 max_output;
+ u32 max_djag;
+ u32 max_cac;
+ u32 max_uvsp;
enum mcsc_cap_enum in_otf;
enum mcsc_cap_enum in_dma;
enum mcsc_cap_enum hwfc;
enum mcsc_cap_enum ds_vra;
};
+#define SUBBLK_TDNR (0)
+#define SUBBLK_CAC (1)
+#define SUBBLK_UVSP (2)
+#define SUBBLK_MAX (3)
struct fimc_is_hw_mcsc {
- struct hw_mcsc_setfile setfile[SENSOR_POSITION_END][FIMC_IS_MAX_SETFILE];
- struct hw_mcsc_setfile *cur_setfile[SENSOR_POSITION_END];
+ struct hw_mcsc_setfile setfile[SENSOR_POSITION_MAX][FIMC_IS_MAX_SETFILE];
+ struct hw_mcsc_setfile *cur_setfile[SENSOR_POSITION_MAX];
struct fimc_is_hw_mcsc_cap cap;
u32 in_img_format;
ulong out_en; /* This flag save whether the capture video node of MCSC is opened or not. */
u32 prev_hwfc_output_ids;
/* noise_index also needs to use in TDNR, CAC, DJAG */
- u32 cur_ni;
+ u32 cur_ni[SUBBLK_MAX];
+ struct camera2_ni_udm ni_udm[NI_BACKUP_MAX];
/* for tdnr use */
enum mcsc_output_index tdnr_output;
int fimc_is_hw_mcsc_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface *itf,
struct fimc_is_interface_ischain *itfc, int id, const char *name);
+void fimc_is_hw_mcsc_get_force_block_control(struct fimc_is_hw_ip *hw_ip, u32 ip_offset, u32 num_of_block,
+ u32 *input_sel, bool *en);
int fimc_is_hw_mcsc_update_param(struct fimc_is_hw_ip *hw_ip,
struct mcs_param *param, u32 lindex, u32 hindex, u32 instance);
int fimc_is_hw_mcsc_recovery_tdnr_register(struct fimc_is_hw_ip *hw_ip,
struct is_param_region *param, u32 instance);
-
+void fimc_is_hw_mcsc_set_size_for_uvsp(struct fimc_is_hardware *hardware,
+ struct fimc_is_frame *frame, ulong hw_map);
+void fimc_is_hw_mcsc_set_ni(struct fimc_is_hardware *hardware, struct fimc_is_frame *frame,
+ u32 instance);
void fimc_is_hw_mcsc_adjust_size_with_djag(struct fimc_is_hw_ip *hw_ip, struct param_mcs_input *input,
struct fimc_is_hw_mcsc_cap *cap, u32 *x, u32 *y, u32 *width, u32 *height);
int fimc_is_hw_mcsc_update_djag_register(struct fimc_is_hw_ip *hw_ip,
int fimc_is_hw_mcsc_update_dsvra_register(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_group *head, struct mcs_param *mcs_param,
u32 instance, struct camera2_shot *shot);
-void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 lfro_enable, u32 lfro_total_fnum);
-u32 fimc_is_scaler_get_lfro_mode_status(void __iomem *base_addr);
#ifdef DEBUG_HW_SIZE
#define hw_mcsc_check_size(hw_ip, param, instance, output_id) \
struct fimc_is_hardware *hardware;
struct fimc_is_hw_ip *hw_ip = NULL;
struct fimc_is_hw_paf *hw_paf = NULL;
+ u32 hw_fcount, instance;
+#if defined(CONFIG_CAMERA_PAFSTAT)
void __iomem *paf_ctx_addr;
+ void __iomem *paf_rdma_addr;
u32 irq_src, irq_mask, status;
- u32 hw_fcount, instance;
+#endif
hw_ip = (struct fimc_is_hw_ip *)context;
hardware = hw_ip->hardware;
hw_fcount = atomic_read(&hw_ip->fcount);
instance = atomic_read(&hw_ip->instance);
- if (!test_bit(HW_INIT, &hw_ip->state))
+ if (!test_bit(HW_PAFSTAT_RDMA_CFG, &hw_ip->state))
return IRQ_NONE;
FIMC_BUG(!hw_ip->priv_info);
hw_paf = (struct fimc_is_hw_paf *)hw_ip->priv_info;
+
+#if defined(CONFIG_CAMERA_PAFSTAT)
paf_ctx_addr = (hw_ip->id == DEV_HW_PAF1) ? hw_paf->paf_ctx1_regs : hw_paf->paf_ctx0_regs;
+ paf_rdma_addr = (hw_ip->id == DEV_HW_PAF1) ? hw_paf->paf_rdma1_regs : hw_paf->paf_rdma0_regs;
irq_src = pafstat_hw_g_irq_src(paf_ctx_addr);
irq_mask = pafstat_hw_g_irq_mask(paf_ctx_addr);
if (status & (1 << PAFSTAT_INT_FRAME_START)) {
msdbg_hw(2, "PAF: F.S[F:%d]", instance, hw_ip, hw_fcount);
fimc_is_hardware_frame_start(hw_ip, instance);
+ /* pafstat_rdma is operated by oneshot */
+ fimc_is_hw_paf_rdma_enable(hw_paf->paf_rdma_core_regs, paf_rdma_addr, 0);
}
if (status & (1 << PAFSTAT_INT_TOTAL_FRAME_END)) {
msdbg_hw(2, "PAF: F.E[F:%d]", instance, hw_ip, hw_fcount);
fimc_is_hardware_frame_done(hw_ip, NULL, -1, FIMC_IS_HW_CORE_END,
IS_SHOT_SUCCESS, true);
+ clear_bit(HW_PAFSTAT_RDMA_CFG, &hw_ip->state);
atomic_set(&hw_ip->status.Vvalid, V_BLANK);
wake_up(&hw_ip->status.wait_queue);
CALL_HW_OPS(hw_ip, clk_gate, instance, false, false);
}
+#endif
return 0;
}
hw_paf = (struct fimc_is_hw_paf *)hw_ip->priv_info;
+#if defined(CONFIG_CAMERA_PAFSTAT)
/* set baseaddress for context */
hw_paf->paf_core_regs = hw_ip->regs_b;
hw_paf->paf_ctx0_regs = hw_paf->paf_core_regs + PAF_CONTEXT0_OFFSET;
hw_paf->paf_rdma_core_regs = hw_ip->regs;
hw_paf->paf_rdma0_regs = hw_paf->paf_rdma_core_regs + PAF_RDMA0_OFFSET;
hw_paf->paf_rdma1_regs = hw_paf->paf_rdma_core_regs + PAF_RDMA1_OFFSET;
+#endif
set_bit(HW_OPEN, &hw_ip->state);
msdbg_hw(2, "open: [G:0x%x], framemgr[%s]", instance, hw_ip,
{
int ret = 0;
struct fimc_is_hw_paf *hw_paf;
+#if defined(CONFIG_CAMERA_PAFSTAT)
void __iomem *paf_rdma_addr;
+#endif
FIMC_BUG(!hw_ip);
return 0;
FIMC_BUG(!hw_ip->priv_info);
- hw_paf = (struct fimc_is_hw_paf *)hw_ip->priv_info;
hw_paf = (struct fimc_is_hw_paf *)hw_ip->priv_info;
+
+#if defined(CONFIG_CAMERA_PAFSTAT)
paf_rdma_addr = (hw_ip->id == DEV_HW_PAF1) ? hw_paf->paf_rdma1_regs : hw_paf->paf_rdma0_regs;
fimc_is_hw_paf_rdma_enable(hw_paf->paf_rdma_core_regs, paf_rdma_addr, 0);
+#endif
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
clear_bit(HW_RUN, &hw_ip->state);
clear_bit(HW_CONFIG, &hw_ip->state);
+ clear_bit(HW_PAFSTAT_RDMA_CFG, &hw_ip->state);
return ret;
}
struct is_region *region;
struct paf_rdma_param *param;
u32 lindex, hindex;
+#if defined(CONFIG_CAMERA_PAFSTAT)
void __iomem *paf_rdma_addr;
void __iomem *paf_ctx_addr;
+#endif
FIMC_BUG(!hw_ip);
FIMC_BUG(!frame);
if (frame->num_buffers)
hw_ip->num_buffers = frame->num_buffers;
+#if defined(CONFIG_CAMERA_PAFSTAT)
paf_ctx_addr = (hw_ip->id == DEV_HW_PAF1) ? hw_paf->paf_ctx1_regs : hw_paf->paf_ctx0_regs;
paf_rdma_addr = (hw_ip->id == DEV_HW_PAF1) ? hw_paf->paf_rdma1_regs : hw_paf->paf_rdma0_regs;
region, param,
lindex, hindex, frame->instance);
+ set_bit(HW_PAFSTAT_RDMA_CFG, &hw_ip->state);
+
fimc_is_hw_paf_rdma_enable(hw_paf->paf_rdma_core_regs, paf_rdma_addr, 1);
- fimc_is_hw_paf_oneshot_enable(paf_ctx_addr, 1);
+ fimc_is_hw_paf_oneshot_enable(paf_ctx_addr);
+#endif
set_bit(hw_ip->id, &frame->core_flag);
set_bit(HW_CONFIG, &hw_ip->state);
struct fimc_is_hw_paf *hw_paf;
u32 hw_format, bitwidth;
u32 width, height;
+#if defined(CONFIG_CAMERA_PAFSTAT)
u32 paf_ch;
void __iomem *paf_ctx_addr;
void __iomem *paf_rdma_addr;
+#endif
FIMC_BUG(!hw_ip);
FIMC_BUG(!region);
width = param->dma_input.width;
height = param->dma_input.height;
+#if defined(CONFIG_CAMERA_PAFSTAT)
paf_ch = (hw_ip->id == DEV_HW_PAF1) ? 1 : 0;
paf_ctx_addr = (hw_ip->id == DEV_HW_PAF1) ? hw_paf->paf_ctx1_regs : hw_paf->paf_ctx0_regs;
paf_rdma_addr = (hw_ip->id == DEV_HW_PAF1) ? hw_paf->paf_rdma1_regs : hw_paf->paf_rdma0_regs;
fimc_is_hw_paf_common_config(hw_paf->paf_core_regs, paf_ctx_addr, paf_ch, width, height);
fimc_is_hw_paf_rdma_set_addr(paf_rdma_addr, hw_paf->input_dva[0]);
fimc_is_hw_paf_rdma_config(paf_rdma_addr, hw_format, bitwidth, width, height);
+#endif
return ret;
}
if (test_bit_variables(hw_ip->id, &frame->core_flag))
ret = fimc_is_hardware_frame_done(hw_ip, frame, -1,
output_id, done_type, false);
+ clear_bit(HW_PAFSTAT_RDMA_CFG, &hw_ip->state);
return ret;
}
clear_bit(HW_CONFIG, &hw_ip->state);
clear_bit(HW_RUN, &hw_ip->state);
clear_bit(HW_TUNESET, &hw_ip->state);
+ clear_bit(HW_PAFSTAT_RDMA_CFG, &hw_ip->state);
sinfo_hw("probe done\n", hw_ip);
#define FIMC_IS_HW_PAFRDMA_H
#include "fimc-is-hw-control.h"
+#include "fimc-is-interface-ddk.h"
#include "fimc-is-param.h"
struct fimc_is_hw_paf {
#ifdef MCSC_DNR_USE_TUNING
instance = atomic_read(&hw_ip->instance);
sensor_position = hw_ip->hardware->sensor_position[instance];
- tdnr_tuneset = &hw_mcsc->setfile[sensor_position]->tdnr_contents;
+ tdnr_tuneset = &hw_mcsc->cur_setfile[sensor_position]->tdnr_contents;
use_tdnr_tuning = true;
#endif
noise_index = frame->noise_idx; /* get applying NI from frame */
#endif
- if (!start_flag && hw_mcsc->cur_ni == noise_index)
+ if (!start_flag && hw_mcsc->cur_ni[SUBBLK_TDNR] == noise_index)
goto exit;
/* find ref NI arry index for re-configure NI depended settings */
tdnr_cfgs.spatial_dep_cfg, tdnr_cfgs.spatial_indep_cfg);
exit:
- hw_mcsc->cur_ni = noise_index;
+ hw_mcsc->cur_ni[SUBBLK_TDNR] = noise_index;
return ret;
}
tdnr_mode = fimc_is_hw_mcsc_check_tdnr_mode_pre(hw_ip, head,
frame, tpu_param, mcs_param, hw_mcsc->cur_tdnr_mode);
+#if !defined(USE_DNR_YIC_MODE_ALWAYS)
if (test_bit(FIMC_IS_GROUP_OTF_INPUT, &head->state))
hw_mcsc->yic_en = TDNR_YIC_DISABLE;
else
hw_mcsc->yic_en = TDNR_YIC_ENABLE;
+#endif
fimc_is_scaler_set_tdnr_yic_ctrl(hw_ip->regs, hw_mcsc->yic_en);
fimc_is_scaler_set_tdnr_image_size(hw_ip->regs,
}
}
+static void fimc_is_hw_tpu_update_param(struct tpu_param *param,
+ struct tpu_param_set *param_set, u32 lindex, u32 hindex)
+{
+ if ((lindex & LOWBIT_OF(PARAM_TPU_CONTROL))
+ || (hindex & HIGHBIT_OF(PARAM_TPU_CONTROL))) {
+ memcpy(¶m_set->control, ¶m->control,
+ sizeof(struct param_control));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_TPU_CONFIG))
+ || (hindex & HIGHBIT_OF(PARAM_TPU_CONFIG))) {
+ memcpy(¶m_set->config, ¶m->config,
+ sizeof(struct param_tpu_config));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_INPUT))
+ || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_INPUT))) {
+ memcpy(¶m_set->otf_input, ¶m->otf_input,
+ sizeof(struct param_otf_input));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_INPUT))
+ || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_INPUT))) {
+ memcpy(¶m_set->dma_input, ¶m->dma_input,
+ sizeof(struct param_dma_input));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_OUTPUT))
+ || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_OUTPUT))) {
+ memcpy(¶m_set->otf_output, ¶m->otf_output,
+ sizeof(struct param_otf_output));
+ }
+
+ if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_OUTPUT))
+ || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_OUTPUT))) {
+ memcpy(¶m_set->dma_output, ¶m->dma_output,
+ sizeof(struct param_dma_output));
+ }
+}
+
static int fimc_is_hw_tpu_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
ulong hw_map)
{
/* DMA settings */
if (param_set->dma_input.cmd != DMA_INPUT_COMMAND_DISABLE) {
for (i = 0; i < frame->num_buffers; i++) {
- param_set->input_dva[i] = frame->dvaddr_buffer[frame->cur_buf_index + i];
+ param_set->input_dva[i] = (typeof(*param_set->input_dva))
+ frame->dvaddr_buffer[frame->cur_buf_index + i];
if (!frame->dvaddr_buffer[i]) {
mserr_hw("[F:%d]dvaddr_buffer[%d] is zero",
frame->instance, hw_ip, frame->fcount, i);
return ret;
}
-void fimc_is_hw_tpu_update_param(struct tpu_param *param,
- struct tpu_param_set *param_set, u32 lindex, u32 hindex)
-{
- if ((lindex & LOWBIT_OF(PARAM_TPU_CONTROL))
- || (hindex & HIGHBIT_OF(PARAM_TPU_CONTROL))) {
- memcpy(¶m_set->control, ¶m->control,
- sizeof(struct param_control));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_TPU_CONFIG))
- || (hindex & HIGHBIT_OF(PARAM_TPU_CONFIG))) {
- memcpy(¶m_set->config, ¶m->config,
- sizeof(struct param_tpu_config));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_INPUT))
- || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_INPUT))) {
- memcpy(¶m_set->otf_input, ¶m->otf_input,
- sizeof(struct param_otf_input));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_INPUT))
- || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_INPUT))) {
- memcpy(¶m_set->dma_input, ¶m->dma_input,
- sizeof(struct param_dma_input));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_OUTPUT))
- || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_OUTPUT))) {
- memcpy(¶m_set->otf_output, ¶m->otf_output,
- sizeof(struct param_otf_output));
- }
-
- if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_OUTPUT))
- || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_OUTPUT))) {
- memcpy(¶m_set->dma_output, ¶m->dma_output,
- sizeof(struct param_dma_output));
- }
-}
-
static int fimc_is_hw_tpu_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
ulong hw_map)
{
int fimc_is_hw_tpu_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface *itf,
struct fimc_is_interface_ischain *itfc, int id, const char *name);
-void fimc_is_hw_tpu_update_param(struct tpu_param *param,
- struct tpu_param_set *param_set, u32 lindex, u32 hindex);
#endif
hw_ip, GET_LNR_INTRPL(11, 20, 1, 10, 3));
sdbg_hw(2, "[CAC] find_ni_idx: cur_ni(%d), ni[%d, %d], idx[%d, %d]\n", hw_ip,
- cac->ni_vals[ret_idx.min], cac->ni_vals[ret_idx.max],
+ cur_ni, cac->ni_vals[ret_idx.min], cac->ni_vals[ret_idx.max],
ret_idx.min, ret_idx.max);
return ret_idx;
struct fimc_is_hw_mcsc *hw_mcsc;
struct fimc_is_hw_mcsc_cap *cap;
struct hw_mcsc_setfile *setfile;
- enum exynos_sensor_position sensor_position;
- u32 ni, backup_in;
-
#if defined(USE_UVSP_CAC)
struct cac_setfile_contents *cac;
#endif
- BUG_ON(!hw_ip);
- BUG_ON(!hw_ip->priv_info);
+ enum exynos_sensor_position sensor_position;
+ u32 ni, backup_in;
+ bool cac_en = true;
+
+ FIMC_BUG(!hw_ip->priv_info);
hw_mcsc = (struct fimc_is_hw_mcsc *)hw_ip->priv_info;
cap = GET_MCSC_HW_CAP(hw_ip);
if (cap->cac != MCSC_CAP_SUPPORT)
return ret;
-#ifdef LHM_ENABLE_EVT0
- return ret;
-#endif
-
backup_in = hw_mcsc->cac_in;
if (hw_ip->hardware->video_mode)
- hw_mcsc->cac_in = DEV_HW_MCSC0;
+ hw_mcsc->cac_in = MCSC_CAC_IN_VIDEO_MODE;
else
- hw_mcsc->cac_in = DEV_HW_MCSC1;
+ hw_mcsc->cac_in = MCSC_CAC_IN_CAPTURE_MODE;
+
+ /* The force means that sysfs control has higher priority than scenario. */
+ fimc_is_hw_mcsc_get_force_block_control(hw_ip, SUBBLK_IP_CAC, cap->max_cac,
+ &hw_mcsc->cac_in, &cac_en);
if (backup_in != hw_mcsc->cac_in)
sdbg_hw(0, "cac input_source changed %d-> %d\n", hw_ip,
if (hw_mcsc->cac_in != hw_ip->id)
return ret;
+ if (cac_en == false) {
+ fimc_is_scaler_set_cac_enable(hw_ip->regs, cac_en);
+ sinfo_hw("CAC off forcely\n", hw_ip);
+ return ret;
+ }
+
sensor_position = hw_ip->hardware->sensor_position[instance];
setfile = hw_mcsc->cur_setfile[sensor_position];
#ifdef FIXED_TDNR_NOISE_INDEX
ni = FIXED_TDNR_NOISE_INDEX_VALUE;
#else
- ni = frame->noise_idx;
+ ni = hw_mcsc->ni_udm[frame->fcount % NI_BACKUP_MAX].currentFrameNoiseIndex;
#endif
- if (hw_mcsc->cur_ni == ni)
+ if (hw_mcsc->cur_ni[SUBBLK_CAC] == ni)
goto exit;
#if defined(USE_UVSP_CAC)
cac = &setfile->cac;
hw_mcsc_calc_cac_param_by_ni(hw_ip, cac, ni);
#endif
+ msdbg_hw(2, "[CAC][F:%d]: ni(%d)\n",
+ instance, hw_ip, frame->fcount, ni);
- sdbg_hw(2, "[CAC][F:%d]: ni(%d)\n",
- hw_ip, __func__, frame->fcount, ni);
exit:
- hw_mcsc->cur_ni = ni;
+ hw_mcsc->cur_ni[SUBBLK_CAC] = ni;
return 0;
}
ni_idx_range.min = MULTIPLIED_10(uvsp->ni_vals[ni_idx]);
ni_idx_range.max = MULTIPLIED_10(uvsp->ni_vals[ni_idx + 1]);
+ sdbg_hw(2, "[UVSP] search: cur_ni(%d), ni[%d, %d], idx[%d, %d]\n", hw_ip,
+ cur_ni, uvsp->ni_vals[ni_idx], uvsp->ni_vals[ni_idx + 1],
+ ni_idx, ni_idx + 1);
if (ni_idx_range.min < cur_ni && cur_ni < ni_idx_range.max) {
ret_idx.min = ni_idx;
ret_idx.max = ni_idx + 1;
}
sdbg_hw(2, "[UVSP] find_ni_idx: cur_ni(%d), ni[%d, %d], idx[%d, %d]\n", hw_ip,
- uvsp->ni_vals[ret_idx.min], uvsp->ni_vals[ret_idx.max],
+ cur_ni, uvsp->ni_vals[ret_idx.min], uvsp->ni_vals[ret_idx.max],
ret_idx.min, ret_idx.max);
return ret_idx;
lsc_center_y = cal_info->data[1];
uvsp_ctrl->biquad_a = cal_info->data[2];
uvsp_ctrl->biquad_b = cal_info->data[3];
- sdbg_hw(2, "[UVSP][F:%d]: lsc_center_x,y(%d,%d), uvsp_ctrl->biquad_a,b(%d,%d)\n",
- hw_ip, __func__, frame->fcount, lsc_center_x, lsc_center_y,
+ msdbg_hw(2, "[UVSP][F:%d]: lsc_center_x,y(%d,%d), uvsp_ctrl->biquad_a,b(%d,%d)\n",
+ instance, hw_ip, frame->fcount, lsc_center_x, lsc_center_y,
uvsp_ctrl->biquad_a, uvsp_ctrl->biquad_b);
shot_ext = frame->shot_ext;
if (!frame->shot_ext) {
- sdbg_hw(2, "___carrotsm:[F:%d] shot_ext(NULL)\n", hw_ip, __func__);
+ sdbg_hw(2, "[F:%d] shot_ext(NULL)\n", hw_ip, frame->fcount);
fimc_is_scaler_set_uvsp_enable(hw_ip->regs, hw_ip->id, 0);
return;
}
- sdbg_hw(2, "[UVSP][F:%d]: shot >> binning_r(%d,%d), crop_taa(%d,%d), bds(%d,%d)\n",
- hw_ip, __func__, frame->fcount,
+ msdbg_hw(2, "[UVSP][F:%d]: shot >> binning_r(%d,%d), crop_taa(%d,%d), bds(%d,%d)\n",
+ instance, hw_ip, frame->fcount,
shot_ext->binning_ratio_x, shot_ext->binning_ratio_y,
shot_ext->crop_taa_x, shot_ext->crop_taa_y,
shot_ext->bds_ratio_x, shot_ext->bds_ratio_y);
uvsp_ctrl->radial_center_y = (u32)((lsc_center_y - shot_ext->crop_taa_y) / shot_ext->bds_ratio_y);
fimc_is_scaler_set_uvsp_radial_ctrl(hw_ip->regs, hw_ip->id, uvsp_ctrl);
- sdbg_hw(2, "[UVSP][F:%d]: uvsp_ctrl >> binning(%d,%d), r_center(%d,%d), biquad(%d,%d)\n",
- hw_ip, __func__, frame->fcount, uvsp_ctrl->binning_x, uvsp_ctrl->binning_y,
+ msdbg_hw(2, "[UVSP][F:%d]: uvsp_ctrl >> binning(%d,%d), r_center(%d,%d), biquad(%d,%d)\n",
+ instance, hw_ip, frame->fcount, uvsp_ctrl->binning_x, uvsp_ctrl->binning_y,
uvsp_ctrl->radial_center_x, uvsp_ctrl->radial_center_y,
uvsp_ctrl->biquad_a, uvsp_ctrl->biquad_b);
}
struct cal_info *cal_info;
enum exynos_sensor_position sensor_position;
u32 ni;
+ bool uvsp_en = true;
+
+ FIMC_BUG(!hw_ip->priv_info);
hw_mcsc = (struct fimc_is_hw_mcsc *)hw_ip->priv_info;
cap = GET_MCSC_HW_CAP(hw_ip);
sdbg_hw(10, "TEST: get_lnr_intprl(11, 20, 1, 1, 3) = %d\n",
hw_ip, GET_LNR_INTRPL(11, 20, 1, 1, 3));
-#ifdef LHM_ENABLE_EVT0
- return ret;
-#endif
/* calculate cac parameters */
#ifdef FIXED_TDNR_NOISE_INDEX
ni = FIXED_TDNR_NOISE_INDEX_VALUE;
#else
- ni = frame->noise_idx;
+ ni = hw_mcsc->ni_udm[frame->fcount % NI_BACKUP_MAX].currentFrameNoiseIndex;
#endif
- if (hw_mcsc->cur_ni == ni)
+ if (hw_mcsc->cur_ni[SUBBLK_UVSP] == ni)
goto exit;
+ /* The force means that sysfs control has higher priority than scenario. */
+ fimc_is_hw_mcsc_get_force_block_control(hw_ip, SUBBLK_IP_UVSP, cap->max_uvsp,
+ NULL, &uvsp_en);
+
+ if (uvsp_en == false) {
+ fimc_is_scaler_set_uvsp_enable(hw_ip->regs, hw_ip->id, uvsp_en);
+ sinfo_hw("UVSP off forcely\n", hw_ip);
+ return ret;
+ }
+
hw_mcsc_calc_uvsp_radial_ctrl(hw_ip, hw_mcsc, frame, cal_info, instance);
#if defined(USE_UVSP_CAC)
uvsp = &setfile->uvsp;
hw_mcsc_calc_uvsp_param_by_ni(hw_ip, uvsp, ni);
#endif
- sdbg_hw(2, "[UVSP][F:%d]: ni(%d)\n",
- hw_ip, __func__, frame->fcount, ni);
+ msdbg_hw(2, "[UVSP][F:%d]: ni(%d)\n",
+ instance, hw_ip, frame->fcount, ni);
exit:
- hw_mcsc->cur_ni = ni;
+ hw_mcsc->cur_ni[SUBBLK_UVSP] = ni;
return 0;
}
fimc_is_hw_vra_save_debug_info(hw_ip, lib_vra, DEBUG_POINT_FRAME_START);
atomic_set(&hw_ip->status.Vvalid, V_VALID);
clear_bit(HW_CONFIG, &hw_ip->state);
-#ifdef ENABLE_REPROCESSING_FD
+#ifdef ENABLE_VRA_FDONE_WITH_CALLBACK
clear_bit(instance, &lib_vra->done_vra_callback_out_ready);
clear_bit(instance, &lib_vra->done_vra_hw_intr);
#endif
unsigned char *buffer_dva = NULL;
mframe->cur_buf_index = hw_ip->cur_s_int;
/* TODO: It is required to support other YUV format */
- buffer_kva = (unsigned char *)(mframe->kvaddr_buffer \
- [mframe->cur_buf_index * 2]); /* Y-plane index of NV21 */
- buffer_dva = (unsigned char *)(ulong)(mframe->dvaddr_buffer \
- [mframe->cur_buf_index * 2]);
+ /* Y-plane index of NV21 */
+ buffer_kva = (unsigned char *)
+ (mframe->kvaddr_buffer[mframe->cur_buf_index * 2]);
+ buffer_dva = (unsigned char *)
+ (mframe->dvaddr_buffer[mframe->cur_buf_index * 2]);
ret = fimc_is_lib_vra_new_frame(lib_vra, buffer_kva, buffer_dva, atomic_read(&hw_ip->instance));
if (ret)
mserr_hw("lib_vra_new_frame is fail (%d)",
if (hw_ip->cur_e_int >= hw_ip->num_buffers) {
atomic_set(&hw_ip->status.Vvalid, V_BLANK);
fimc_is_hw_vra_save_debug_info(hw_ip, lib_vra, DEBUG_POINT_FRAME_END);
-#ifdef ENABLE_REPROCESSING_FD
+#ifdef ENABLE_VRA_FDONE_WITH_CALLBACK
set_bit(instance, &lib_vra->done_vra_hw_intr);
- spin_lock(&lib_vra->reprocess_fd_lock);
+ spin_lock(&lib_vra->fdone_cb_lock);
if (test_bit(instance, &lib_vra->done_vra_hw_intr)
&& test_bit(instance, &lib_vra->done_vra_callback_out_ready)) {
clear_bit(instance, &lib_vra->done_vra_callback_out_ready);
clear_bit(instance, &lib_vra->done_vra_hw_intr);
- spin_unlock(&lib_vra->reprocess_fd_lock);
+ spin_unlock(&lib_vra->fdone_cb_lock);
fimc_is_hardware_frame_done(hw_ip, NULL, -1,
FIMC_IS_HW_CORE_END, IS_SHOT_SUCCESS, true);
} else {
- spin_unlock(&lib_vra->reprocess_fd_lock);
+ spin_unlock(&lib_vra->fdone_cb_lock);
}
#else
fimc_is_hardware_frame_done(hw_ip, NULL, -1,
return ret;
}
+static void fimc_is_hw_vra_reset(struct fimc_is_hw_ip *hw_ip)
+{
+ u32 all_intr;
+ bool has_vra_ch1_only = false;
+ int ret = 0;
+
+ /* Interrupt clear */
+ ret = fimc_is_hw_g_ctrl(NULL, 0, HW_G_CTRL_HAS_VRA_CH1_ONLY, (void *)&has_vra_ch1_only);
+ if (!has_vra_ch1_only) {
+ all_intr = fimc_is_vra_chain0_get_all_intr(hw_ip->regs);
+ fimc_is_vra_chain0_set_clear_intr(hw_ip->regs, all_intr);
+ }
+
+ all_intr = fimc_is_vra_chain1_get_all_intr(hw_ip->regs);
+ fimc_is_vra_chain1_set_clear_intr(hw_ip->regs, all_intr);
+}
+
static int __nocfi fimc_is_hw_vra_open(struct fimc_is_hw_ip *hw_ip, u32 instance,
struct fimc_is_group *group)
{
mserr_hw("failed to init. task(%d)", instance, hw_ip, ret);
goto err_vra_init_task;
}
-#ifdef ENABLE_REPROCESSING_FD
+#ifdef ENABLE_VRA_FDONE_WITH_CALLBACK
hw_vra->lib_vra.hw_ip = hw_ip;
#endif
mserr_hw("lib_vra_free_memory is fail (%d)", instance, hw_ip, ret_err);
err_vra_alloc_memory:
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
err_alloc:
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
}
vfree(hw_ip->priv_info);
+ hw_ip->priv_info = NULL;
frame_manager_close(hw_ip->framemgr);
frame_manager_close(hw_ip->framemgr_late);
return 0;
}
+static int fimc_is_hw_vra_update_param(struct fimc_is_hw_ip *hw_ip,
+ struct vra_param *param, u32 lindex, u32 hindex, u32 instance, u32 fcount)
+{
+ int ret = 0;
+ struct fimc_is_hw_vra *hw_vra;
+ struct fimc_is_lib_vra *lib_vra;
+
+ hw_vra = (struct fimc_is_hw_vra *)hw_ip->priv_info;
+
+ FIMC_BUG(!hw_ip);
+ FIMC_BUG(!param);
+
+ lib_vra = &hw_vra->lib_vra;
+
+#ifdef VRA_DMA_TEST_BY_IMAGE
+ ret = fimc_is_lib_vra_test_input(lib_vra, instance);
+ if (ret) {
+ mserr_hw("test_input is fail (%d)", instance, hw_ip, ret);
+ return ret;
+ }
+ return 0;
+#endif
+
+ if (param->otf_input.cmd == OTF_INPUT_COMMAND_ENABLE) {
+ if ((lindex & LOWBIT_OF(PARAM_FD_OTF_INPUT))
+ || (hindex & HIGHBIT_OF(PARAM_FD_OTF_INPUT))) {
+ ret = fimc_is_lib_vra_otf_input(lib_vra, param, instance, fcount);
+ if (ret) {
+ mserr_hw("otf_input is fail (%d)", instance, hw_ip, ret);
+ return ret;
+ }
+ }
+ } else if (param->dma_input.cmd == DMA_INPUT_COMMAND_ENABLE) {
+ if ((lindex & LOWBIT_OF(PARAM_FD_DMA_INPUT))
+ || (hindex & HIGHBIT_OF(PARAM_FD_DMA_INPUT))) {
+ ret = fimc_is_lib_vra_dma_input(lib_vra, param, instance, fcount);
+ if (ret) {
+ mserr_hw("dma_input is fail (%d)", instance, hw_ip, ret);
+ return ret;
+ }
+ }
+ } else {
+ mserr_hw("param setting is wrong! otf_input.cmd(%d), dma_input.cmd(%d)",
+ instance, hw_ip, param->otf_input.cmd, param->dma_input.cmd);
+ return -EINVAL;
+ }
+
+ return ret;
+}
+
+
static int fimc_is_hw_vra_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame,
ulong hw_map)
{
/* Add for CH1 DMA input */
if (lib_vra->fr_work_init.dram_input) {
/* TODO: It is required to support other YUV format */
- buffer_kva = (unsigned char *)(frame->kvaddr_buffer[frame->cur_buf_index * 2]); /* Y-plane index of NV21 */
- buffer_dva = (unsigned char *)(u64)(frame->dvaddr_buffer[frame->cur_buf_index * 2]);
+ /* Y-plane index of NV21 */
+ buffer_kva = (unsigned char *)
+ (frame->kvaddr_buffer[frame->cur_buf_index * 2]);
+ buffer_dva = (unsigned char *)
+ (frame->dvaddr_buffer[frame->cur_buf_index * 2]);
hw_ip->mframe = frame;
}
msdbg_hw(2, "[F:%d]lib_vra_new_frame\n", instance, hw_ip, frame->fcount);
+ lib_vra->fr_index = frame->fcount;
ret = fimc_is_lib_vra_new_frame(lib_vra, buffer_kva, buffer_dva, instance);
if (ret) {
mserr_hw("lib_vra_new_frame is fail (%d)", instance, hw_ip, ret);
return ret;
}
-int fimc_is_hw_vra_update_param(struct fimc_is_hw_ip *hw_ip,
- struct vra_param *param, u32 lindex, u32 hindex, u32 instance, u32 fcount)
-{
- int ret = 0;
- struct fimc_is_hw_vra *hw_vra;
- struct fimc_is_lib_vra *lib_vra;
-
- hw_vra = (struct fimc_is_hw_vra *)hw_ip->priv_info;
-
- FIMC_BUG(!hw_ip);
- FIMC_BUG(!param);
-
- lib_vra = &hw_vra->lib_vra;
-
-#ifdef VRA_DMA_TEST_BY_IMAGE
- ret = fimc_is_lib_vra_test_input(lib_vra, instance);
- if (ret) {
- mserr_hw("test_input is fail (%d)", instance, hw_ip, ret);
- return ret;
- }
- return 0;
-#endif
-
- if (param->otf_input.cmd == OTF_INPUT_COMMAND_ENABLE) {
- if ((lindex & LOWBIT_OF(PARAM_FD_OTF_INPUT))
- || (hindex & HIGHBIT_OF(PARAM_FD_OTF_INPUT))) {
- ret = fimc_is_lib_vra_otf_input(lib_vra, param, instance, fcount);
- if (ret) {
- mserr_hw("otf_input is fail (%d)", instance, hw_ip, ret);
- return ret;
- }
- }
- } else if (param->dma_input.cmd == DMA_INPUT_COMMAND_ENABLE) {
- if ((lindex & LOWBIT_OF(PARAM_FD_DMA_INPUT))
- || (hindex & HIGHBIT_OF(PARAM_FD_DMA_INPUT))) {
- ret = fimc_is_lib_vra_dma_input(lib_vra, param, instance, fcount);
- if (ret) {
- mserr_hw("dma_input is fail (%d)", instance, hw_ip, ret);
- return ret;
- }
- }
- } else {
- mserr_hw("param setting is wrong! otf_input.cmd(%d), dma_input.cmd(%d)",
- instance, hw_ip, param->otf_input.cmd, param->dma_input.cmd);
- return -EINVAL;
- }
-
- return ret;
-}
-
static int fimc_is_hw_vra_frame_ndone(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_frame *frame, u32 instance, enum ShotErrorType done_type)
{
return 0;
}
-void fimc_is_hw_vra_reset(struct fimc_is_hw_ip *hw_ip)
-{
- u32 all_intr;
- bool has_vra_ch1_only = false;
- int ret = 0;
-
- /* Interrupt clear */
- ret = fimc_is_hw_g_ctrl(NULL, 0, HW_G_CTRL_HAS_VRA_CH1_ONLY, (void *)&has_vra_ch1_only);
- if(!has_vra_ch1_only) {
- all_intr = fimc_is_vra_chain0_get_all_intr(hw_ip->regs);
- fimc_is_vra_chain0_set_clear_intr(hw_ip->regs, all_intr);
- }
-
- all_intr = fimc_is_vra_chain1_get_all_intr(hw_ip->regs);
- fimc_is_vra_chain1_set_clear_intr(hw_ip->regs, all_intr);
-}
-
static int fimc_is_hw_vra_get_meta(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_frame *frame, unsigned long hw_map)
{
int fimc_is_hw_vra_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface *itf,
struct fimc_is_interface_ischain *itfc, int id, const char *name);
-int fimc_is_hw_vra_update_param(struct fimc_is_hw_ip *hw_ip,
- struct vra_param *param, u32 lindex, u32 hindex, u32 instance, u32 fcount);
-void fimc_is_hw_vra_reset(struct fimc_is_hw_ip *hw_ip);
#endif
u32 ois_product_name;
u32 ois_i2c_addr;
u32 ois_i2c_ch;
+ u32 mcu_product_name;
+ u32 mcu_i2c_addr;
+ u32 mcu_i2c_ch;
+ u32 rom_id;
+ u32 rom_type;
+ u32 rom_cal_index;
u32 preprocessor_product_name;
u32 preprocessor_spi_channel;
u32 preprocessor_i2c_addr;
u32 preprocessor_i2c_ch;
u32 preprocessor_dma_channel;
+ u32 eeprom_product_name;
+ u32 eeprom_i2c_ch;
+ u32 eeprom_i2c_addr;
bool power_seq_dt;
u32 internal_vc[CSI_VIRTUAL_CH_MAX];
u32 vc_buffer_offset[CSI_VIRTUAL_CH_MAX];
};
enum exynos_sensor_position {
- SENSOR_POSITION_REAR = SP_REAR,
- SENSOR_POSITION_FRONT = SP_FRONT,
- SENSOR_POSITION_REAR2 = SP_REAR2,
- SENSOR_POSITION_SECURE = SP_SECURE,
- SENSOR_POSITION_FRONT2 = SP_FRONT2,
- SENSOR_POSITION_REAR3 = SP_REAR3,
-#ifdef CONFIG_VENDER_PSV
- SENSOR_POSITION_VIRTUAL = SP_VIRTUAL,
-#endif
- SENSOR_POSITION_END
+ /* for the position of real sensors */
+ SENSOR_POSITION_REAR = SP_REAR,
+ SENSOR_POSITION_FRONT = SP_FRONT,
+ SENSOR_POSITION_REAR2 = SP_REAR2,
+ SENSOR_POSITION_FRONT2 = SP_FRONT2,
+ SENSOR_POSITION_REAR3 = SP_REAR3,
+ SENSOR_POSITION_FRONT3 = SP_FRONT3,
+ SENSOR_POSITION_REAR4 = SP_REAR4,
+ SENSOR_POSITION_FRONT4 = SP_FRONT4,
+ SENSOR_POSITION_REAR_TOF = SP_REAR_TOF,
+ SENSOR_POSITION_FRONT_TOF = SP_FRONT_TOF,
+ SENSOR_POSITION_MAX,
+
+ /* to characterize the sensor */
+ SENSOR_POSITION_SECURE = SP_SECURE,
+ SENSOR_POSITION_VIRTUAL = SP_VIRTUAL,
};
enum exynos_sensor_id {
SENSOR_NAME_S5K4H5YC_FF = 34,
SENSOR_NAME_S5K2L7 = 35,
SENSOR_NAME_SAK2L3 = 36,
+ SENSOR_NAME_SAK2L4 = 37,
+ SENSOR_NAME_S5K3J1 = 38,
+ SENSOR_NAME_S5K4HA = 39,
+ SENSOR_NAME_S5K3P9 = 40,
+ SENSOR_NAME_S5K5E9 = 41,
+ SENSOR_NAME_S5K2X5SP = 42,
+ SENSOR_NAME_S5KGM1SP = 43,
SENSOR_NAME_S5K3P8SP = 44,
SENSOR_NAME_S5K2P7SX = 45,
SENSOR_NAME_S5KRPB = 46,
SENSOR_NAME_IMX333 = 112,
SENSOR_NAME_IMX241 = 113,
SENSOR_NAME_IMX345 = 114,
+ SENSOR_NAME_IMX576 = 115,
/* 201~255: Other vendor sensors */
SENSOR_NAME_SR261 = 201,
SENSOR_NAME_DSIM = 205,
SENSOR_NAME_SR259 = 206,
SENSOR_NAME_VIRTUAL = 207,
+ SENSOR_NAME_OV12A10 = 208,
+ SENSOR_NAME_OV12A10FF = 209,
+ SENSOR_NAME_OV16885C = 210,
/* 256~: currently not used */
SENSOR_NAME_CUSTOM = 301,
ACTUATOR_NAME_AK737X = 18,
ACTUATOR_NAME_DW9780 = 19,
ACTUATOR_NAME_LC898217 = 20,
+ ACTUATOR_NAME_ZC569 = 21,
+ ACTUATOR_NAME_DW9823 = 22,
+ ACTUATOR_NAME_DW9839 = 23,
ACTUATOR_NAME_END,
ACTUATOR_NAME_NOTHING = 100,
};
FLADRV_NAME_DRV_FLASH_GPIO = 11, /* Common Gpio type(Flash mode, Movie/torch mode) */
FLADRV_NAME_LM3644 = 12,
FLADRV_NAME_DRV_FLASH_I2C = 13, /* Common I2C type */
+ FLADRV_NAME_S2MU106 = 14,
FLADRV_NAME_END,
FLADRV_NAME_NOTHING = 100,
};
enum ois_name {
OIS_NAME_RUMBA_S4 = 1,
OIS_NAME_RUMBA_S6 = 2,
+ OIS_NAME_ROHM_BU24218GWL= 3,
OIS_NAME_END,
OIS_NAME_NOTHING = 100,
};
+enum mcu_name {
+ MCU_NAME_STM32 = 1,
+ MCU_NAME_END,
+ MCU_NAME_NOTHING = 100,
+};
+
enum aperture_name {
APERTURE_NAME_AK7372 = 1,
APERTURE_NAME_END,
APERTURE_NAME_NOTHING = 100,
};
+enum eeprom_name {
+ EEPROM_NAME_GM1 = 1,
+ EEPROM_NAME_5E9 = 2,
+ EEPROM_NAME_12A10 = 3,
+ EEPROM_NAME_12A10FF = 4,
+ EEPROM_NAME_16885C = 5,
+ EEPROM_NAME_END,
+ EEPROM_NAME_NOTHING = 100,
+};
+
enum sensor_peri_type {
SE_NULL = 0,
SE_I2C = 1,
struct sensor_protocol2 preprocessor_con;
struct sensor_protocol1 ois_con;
struct sensor_protocol1 aperture_con;
+ struct sensor_protocol1 mcu_con;
+ struct sensor_protocol1 eeprom_con;
u32 mclk;
u32 mipi_lane_num;
u32 mipi_speed;
/* Use sensor retention mode */
u32 use_retention_mode;
- struct sensor_protocol1 reserved[4];
+ struct sensor_protocol1 reserved[3];
};
struct exynos_platform_fimc_is_sensor {
u32 flite_ch;
u32 is_bns;
unsigned long internal_state;
+ u32 csi_mux;
+ u32 multi_ch;
+ u32 camif_mux_val;
};
int exynos_fimc_is_sensor_iclk_cfg(struct device *dev,
#include "fimc-is-config.h"
-#if defined(CONFIG_VENDER_PSV)
-#define FIMC_IS_FW_PATH "/system/vendor/firmware/"
-#define FIMC_IS_FW_DUMP_PATH "/data/"
-#define FIMC_IS_SETFILE_SDCARD_PATH "/data/"
-#define FIMC_IS_FW_SDCARD "/data/fimc_is_fw2.bin"
-#define FIMC_IS_FW "fimc_is_fw2.bin"
-#define FIMC_IS_ISP_LIB_SDCARD_PATH "/root/stream/data/"
-
-#else
#ifdef VENDER_PATH
#define FIMC_IS_FW_PATH "/system/vendor/firmware/"
#define FIMC_IS_FW_DUMP_PATH "/data/camera/"
#define FIMC_IS_REAR_CAL_SDCARD_PATH "/data/"
#define FIMC_IS_FRONT_CAL_SDCARD_PATH "/data/"
#endif
-#endif /* defined(CONFIG_VENDER_PSV) */
#ifdef USE_ONE_BINARY
#define FIMC_IS_ISP_LIB "fimc_is_lib.bin"
#define FD_SW_BIN_NAME "fimc_is_fd.bin"
#define FD_SW_SDCARD "/data/fimc_is_fd.bin"
+#define FIMC_IS_LED_CAL_DATA_PATH "/mnt/vendor/persist/camera/ledcal/rear"
+
#ifdef ENABLE_IS_CORE
#define FW_MEM_SIZE 0x02000000
#define FW_BACKUP_SIZE 0x02000000
/* reserved memory for FIMC-IS */
#define SETFILE_SIZE (0x0032C000)
-#define REAR_CALDATA_SIZE (0x00010000)
-#define FRONT_CALDATA_SIZE (0x00010000)
+#define CAL_DATA_SIZE (0x00010000)
+#define LED_CAL_DATA_SIZE (0x00000400)
+#define TOTAL_CAL_DATA_SIZE (CAL_DATA_SIZE + LED_CAL_DATA_SIZE)
#define DEBUG_REGION_SIZE (0x0007D000)
#define EVENT_REGION_SIZE (0x0007D000)
#define FSHARED_REGION_SIZE (0x00010000)
#define DATA_REGION_SIZE (0x00010000)
#define PARAM_REGION_SIZE (0x00005000) /* 20KB * instance(4) */
-#define RESERVE_LIB_SIZE (FIMC_IS_RESERVE_LIB_SIZE) /* 2MB */
+#define HEAP_RTA_START (HEAP_START + SZ_64M) /* HEAP_SIZE(for DDK) should be smaller than 64MB */
+#define HEAP_RTA_SIZE (FIMC_IS_RESERVE_LIB_SIZE) /* 6MB ~ */
#define TAAISP_DMA_SIZE (FIMC_IS_TAAISP_SIZE) /* 512KB */
#define LHFD_MAP_SIZE (0x009F0000) /* 9.9375MB */
#define VRA_DMA_SIZE (FIMC_IS_VRA_SIZE) /* 8MB */
ISS_SUB_SCENARIO_FRONT_COLOR_IRIS_PREVIEW = 43, /* 43: front camera Color Iris preview */
ISS_SUB_SCENARIO_LIVE_OUTFOCUS_PREVIEW = 44, /* 44 ~ 52: Bokeh (HDR off/auto/on) */
ISS_SUB_SCENARIO_LIVE_OUTFOCUS_CAPTURE = 45,
- ISS_SUB_SCENARIO_FHD_480FPS = 47,
ISS_SUB_SCENARIO_LIVE_OUTFOCUS_PREVIEW_WDR_AUTO = 47,
ISS_SUB_SCENARIO_LIVE_OUTFOCUS_PREVIEW_WDR_ON = 48,
ISS_SUB_SCENARIO_LIVE_OUTFOCUS_CAPTURE_WDR_AUTO = 49,
ISS_SUB_SCENARIO_LIVE_OUTFOCUS_CAPTURE_WDR_ON = 50,
+ ISS_SUB_SCENARIO_STILL_PREVIEW_3RD_PARTY_WDR_AUTO = 51,
+ ISS_SUB_SCENARIO_VIDEO_3RD_PARTY_WDR_AUTO = 52,
+ ISS_SUB_SCENARIO_MERGED_STILL_CAPTURE_MFHDR = 53,
+ ISS_SUB_SCENARIO_MERGED_STILL_CAPTURE_LLHDR = 54,
ISS_SUB_SCENARIO_FRONT_VT1 = 31, /* 31: front camera VT1 */
ISS_SUB_SCENARIO_FRONT_VT2 = 32, /* 32: front camera VT2 */
FIMC_IS_SCENARIO_AUTO_DUAL = 3,
FIMC_IS_SCENARIO_FULL_SIZE = 4,
FIMC_IS_SCENARIO_HIGH_SPEED_DUALFPS = 5, /* FPS is changed from normal to high speed */
+ FIMC_IS_SCENARIO_SECURE = 6,
};
enum is_system_control_id {
CAMERA_PIXEL_SIZE_10BIT,
CAMERA_PIXEL_SIZE_PACKED_10BIT,
CAMERA_PIXEL_SIZE_8_2BIT,
+ CAMERA_PIXEL_SIZE_12BIT_COMP
};
#endif
u16 addr, u8 *val);
int fimc_is_sensor_read16(struct i2c_client *client,
u16 addr, u16 *val);
+int fimc_is_sensor_read8_size(struct i2c_client *client,
+ void *buf, u16 addr, size_t size);
int fimc_is_sensor_write(struct i2c_client *client,
u8 *buf, u32 size);
int fimc_is_sensor_addr8_write8(struct i2c_client *client,
int csi_hw_s_dma_irq_msk(u32 __iomem *base_reg, bool on);
int csi_hw_g_dma_irq_src(u32 __iomem *base_reg, struct csis_irq_src *src, bool clear);
int csi_hw_g_dma_irq_src_vc(u32 __iomem *base_reg, struct csis_irq_src *src, u32 vc_abs, bool clear);
-int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 hwformat);
+int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 actual_vc, u32 hwformat);
int csi_hw_s_phy_default_value(u32 __iomem *base_reg, u32 instance);
int csi_hw_s_phy_config(u32 __iomem *base_reg,
AA_CAPTURE_INTENT_STILL_CAPTURE_DEBLUR_DYNAMIC_SHOT,
AA_CAPTURE_INTENT_STILL_CAPTURE_OIS_DYNAMIC_SHOT,
AA_CAPTURE_INTENT_STILL_CAPTURE_EXPOSURE_DYNAMIC_SHOT,
- AA_CAPTURE_INTENT_STILL_CAPTURE_HDR_DYNAMIC_SHOT,
+ AA_CAPTURE_INTENT_STILL_CAPTURE_MFHDR_DYNAMIC_SHOT,
+ AA_CAPTURE_INTENT_STILL_CAPTURE_LLHDR_DYNAMIC_SHOT,
AA_CAPTURE_INTENT_STILL_CAPTURE_CANCEL,
AA_CAPTURE_INTENT_STILL_CAPTURE_NORMAL_FLASH,
};
AA_SCENE_MODE_HYPERLAPSE,
AA_SCENE_MODE_FACTORY_LN2,
AA_SCENE_MODE_FACTORY_LN4,
+ AA_SCENE_MODE_LABS,
+ AA_SCENE_MODE_REMOSAIC_PURE_BAYER_ONLY,
+ AA_SCENE_MODE_REMOSAIC_MFHDR_PURE_BAYER_ONLY,
};
enum aa_effect_mode {
uint32_t vendor_captureCount;
uint32_t vendor_captureExposureTime;
float vendor_objectDistanceCm;
- uint32_t vendor_reserved[9];
+ int32_t vendor_colorTempKelvin;
+ int32_t vendor_enableDynamicShotDm;
+ uint32_t vendor_reserved[8];
};
struct camera2_aa_dm {
uint32_t vendor_captureCount;
uint32_t vendor_captureExposureTime;
float vendor_objectDistanceCm;
+ int32_t vendor_colorTempKelvin;
// For dual
uint32_t vendor_wideTeleConvEv;
uint32_t vendor_teleSync;
uint32_t vendor_fusionCaptureAeInfo;
uint32_t vendor_fusionCaptureAfInfo;
-
- uint32_t vendor_reserved[9];
+ uint32_t vendor_colorTempIndex;
+ uint32_t vendor_luxIndex;
+ float vendor_luxStandard;
+ uint32_t vendor_reserved[6];
};
struct camera2_aa_sm {
uint32_t maxCaptureStall;
};
+struct camera2_faceBeauty_ctl
+{
+ int32_t strength;
+};
+
+struct camera2_faceBeauty_dm
+{
+ int32_t strength;
+};
/* android.depth */
struct camera2_blacklevel_ctl blacklevel;
struct camera2_sync_ctl sync;
struct camera2_reprocess_ctl reprocess;
+ struct camera2_faceBeauty_ctl facebeauty;
/* vendor feature */
struct camera2_entry_ctl vendor_entry;
struct camera2_blacklevel_dm blacklevel;
struct camera2_sync_dm sync;
struct camera2_reprocess_dm reprocess;
+ struct camera2_faceBeauty_dm facebeauty;
/* vendor feature */
struct camera2_entry_dm vendor_entry;
uint32_t digitalGain;
uint64_t longExposureTime; /* For supporting WDR */
uint64_t shortExposureTime;
+ uint64_t middleExposureTime;
uint32_t longAnalogGain;
uint32_t shortAnalogGain;
+ uint32_t middleAnalogGain;
uint32_t longDigitalGain;
uint32_t shortDigitalGain;
+ uint32_t middleDigitalGain;
uint64_t exposureTime;
uint32_t frameDuration;
uint32_t digitalGain;
uint64_t longExposureTime;
uint64_t shortExposureTime;
+ uint64_t middleExposureTime;
uint32_t longAnalogGain;
uint32_t shortAnalogGain;
+ uint32_t middleAnalogGain;
uint32_t longDigitalGain;
uint32_t shortDigitalGain;
+ uint32_t middleDigitalGain;
uint64_t timeStampBoot;
uint32_t multiLuminances[9];
};
enum aa_fallback fallback;
uint32_t frame_id;
enum camera2_scene_index scene_index;
- uint32_t reserved[10];
+ uint32_t flicker_detect;
+ uint32_t reserved[9];
};
struct camera2_shot {
uint32_t hw_rot_mirror[CAMERA2_MAX_FACES];
};
+enum camera_flip_mode {
+ CAM_FLIP_MODE_NORMAL = 0,
+ CAM_FLIP_MODE_HORIZONTAL,
+ CAM_FLIP_MODE_VERTICAL,
+ CAM_FLIP_MODE_HORIZONTAL_VERTICAL,
+ CAM_FLIP_MODE_MAX,
+};
+
+enum camera_thermal_mode {
+ CAM_THERMAL_NORMAL = 0,
+ CAM_THERMAL_THROTTLING,
+ CAM_THERMAL_TRIPPING,
+ CAM_THERMAL_MAX,
+};
+
+enum camera_crc_index {
+ CAMERA_CRC_INDEX_DUAL = 0,
+ CAMERA_CRC_INDEX_PDAF,
+ CAMERA_CRC_INDEX_AWB,
+ CAMERA_CRC_INDEX_AF,
+ CAMERA_CRC_INDEX_MNF,
+ CAMERA_CRC_INDEX_MAX,
+};
+
+enum sensor_gyro_info_state {
+ SENSOR_GYRO_INFO_STATE_BASE = 0,
+ SENSOR_GYRO_INFO_STATE_SUCCESS,
+ SENSOR_GYRO_INFO_STATE_FAIL,
+ SENSOR_GYRO_INFO_STATE_MAX,
+};
+
+struct facial_score {
+ int32_t left_eye;
+ int32_t right_eye;
+ int32_t mouth;
+ int32_t smile;
+ int32_t left_blink;
+ int32_t right_blink;
+};
+
+struct facial_angle {
+ uint32_t yaw;
+ uint32_t roll;
+};
+
+struct vra_ext_meta {
+ struct facial_score facialScore[CAMERA2_MAX_FACES];
+ struct facial_angle facialAngle[CAMERA2_MAX_FACES];
+ uint32_t reserved[10];
+};
+
+struct ddk_setfile_ver
+{
+ uint32_t header1; // 0xF85A20B4
+ uint32_t header2; // 0xCA539ADF
+ char ddk_version[128];
+ char setfile_version[128];
+};
+
+struct sensor_gyro_info {
+ int32_t x;
+ int32_t y;
+ int32_t z;
+ enum sensor_gyro_info_state state;
+};
+
+struct camera2_shot_ext_user {
+ int crc_result[CAMERA_CRC_INDEX_MAX];
+ int focus_actual_pos;
+ int focus_target_pos;
+
+ struct ddk_setfile_ver ddk_version;
+
+ struct sensor_gyro_info gyro_info;
+};
+
/** \brief
stream structure for scaler.
*/
uint32_t crop_taa_y;
uint32_t bds_ratio_x;
uint32_t bds_ratio_y;
+ uint32_t remosaic_rotation;
+
+ enum camera_flip_mode mcsc_flip[MCSC_PORT_MAX];
+ enum camera_flip_mode mcsc_flip_result[MCSC_PORT_MAX];
+
+ struct vra_ext_meta vra_ext;
+
+ enum camera_thermal_mode thermal;
+
+ /* Use user vendor */
+ struct camera2_shot_ext_user user;
/* reserved for future */
- uint32_t reserved[8];
+ uint32_t reserved[7];
/** \brief
processing time debugging
typedef struct camera2_fd_udm camera2_fd_udm_t;
typedef struct camera2_sensor_uctl camera2_sensor_uctl_t;
+typedef struct camera2_sensor_udm camera2_sensor_udm_t;
typedef struct camera2_aa_uctl camera2_aa_uctl_t;
typedef struct camera2_aa_udm camera2_aa_udm_t;
#include "exynos-fimc-is-sensor.h"
#include "fimc-is-device-csi.h"
+#include "fimc-is-device-sensor.h"
#define FIMC_IS_PATH_LEN 100
#define VENDER_S_CTRL 0
struct fimc_is_vender {
char fw_path[FIMC_IS_PATH_LEN];
char request_fw_path[FIMC_IS_PATH_LEN];
- char setfile_path[SENSOR_POSITION_END][FIMC_IS_PATH_LEN];
- char request_setfile_path[SENSOR_POSITION_END][FIMC_IS_PATH_LEN];
+ char setfile_path[SENSOR_POSITION_MAX][FIMC_IS_PATH_LEN];
+ char request_setfile_path[SENSOR_POSITION_MAX][FIMC_IS_PATH_LEN];
void *private_data;
int companion_crc_error;
};
FW_FAIL,
};
+enum fimc_is_rom_id {
+ ROM_ID_REAR = 0,
+ ROM_ID_FRONT = 1,
+ ROM_ID_REAR2 = 2,
+ ROM_ID_FRONT2 = 3,
+ ROM_ID_REAR3 = 4,
+ ROM_ID_FRONT3 = 5,
+ ROM_ID_MAX,
+ ROM_ID_NOTHING = 100
+};
+
+enum fimc_is_rom_type {
+ ROM_TYPE_NONE = 0,
+ ROM_TYPE_FROM = 1,
+ ROM_TYPE_EEPROM = 2,
+ ROM_TYPE_OTPROM = 3,
+ ROM_TYPE_MAX,
+};
+
+enum fimc_is_rom_cal_index {
+ ROM_CAL_MASTER = 0,
+ ROM_CAL_SLAVE0 = 1,
+ ROM_CAL_SLAVE1 = 2,
+ ROM_CAL_MAX,
+};
+
bool fimc_is_sec_is_valid_moduleid(char *moduleid);
void fimc_is_vendor_csi_stream_on(struct fimc_is_device_csi *csi);
int fimc_is_vender_probe(struct fimc_is_vender *vender);
int fimc_is_vender_dt(struct device_node *np);
+int fimc_is_vendor_rom_parse_dt(struct device_node *dnode, int rom_id);
int fimc_is_vender_fw_prepare(struct fimc_is_vender *vender);
int fimc_is_vender_fw_filp_open(struct fimc_is_vender *vender, struct file **fp, int bin_type);
int fimc_is_vender_preproc_fw_load(struct fimc_is_vender *vender);
int fimc_is_vender_s_ctrl(struct fimc_is_vender *vender);
-int fimc_is_vender_cal_load(struct fimc_is_vender *vender, void *module_data);
+int fimc_is_vender_cal_load(struct fimc_is_device_sensor *sensor, struct fimc_is_vender *vender, void *module_data);
int fimc_is_vender_module_sel(struct fimc_is_vender *vender, void *module_data);
int fimc_is_vender_module_del(struct fimc_is_vender *vender, void *module_data);
int fimc_is_vender_fw_sel(struct fimc_is_vender *vender);
void fimc_is_vender_resource_get(struct fimc_is_vender *vender);
void fimc_is_vender_resource_put(struct fimc_is_vender *vender);
int fimc_is_vender_remove_dump_fw_file(void);
+int fimc_is_vendor_get_module_from_position(int position, struct fimc_is_module_enum ** module);
+int fimc_is_vendor_get_rom_id_from_position(int position);
+int fimc_is_vendor_get_rom_cal_index_from_position(int position);
+bool fimc_is_vendor_check_camera_running(int position);
#endif
bool check_dma_done(struct fimc_is_hw_ip *hw_ip, u32 instance_id, u32 fcount)
{
bool ret = false;
- int expected_fcount;
struct fimc_is_frame *frame;
struct fimc_is_frame *list_frame;
struct fimc_is_framemgr *framemgr;
}
/*
- * The expected_fcount in which num_buffers is considered.
- * It would be matched with frame->fcount which has "HW_WAIT_DONE" state.
- * ex. frame->fcount : 1, num_buffer : 4, fcount : 4 => expected_fcount : 1
+ * fcount: This value should be same value that is notified by host at shot time.
+ * In case of FRO or batch mode, this value also should be same between start and end.
*/
- expected_fcount = fcount - (frame->num_buffers - 1);
-
- msdbg_hw(1, "check_dma [ddk:%d,exp:%d,hw:%d] frame(F:%d,idx:%d,num_buffers:%d)\n",
+ msdbg_hw(1, "check_dma [ddk:%d,hw:%d] frame(F:%d,idx:%d,num_buffers:%d)\n",
instance_id, hw_ip,
- fcount, expected_fcount, hw_fcount,
+ fcount, hw_fcount,
frame->fcount, frame->cur_buf_index, frame->num_buffers);
- if (((frame->num_buffers > 1) && (expected_fcount != frame->fcount))
- || ((frame->num_buffers == 1) && (expected_fcount != (frame->fcount + frame->cur_buf_index)))) {
+ if (((frame->num_buffers > 1) && (fcount != frame->fcount))
+ || ((frame->num_buffers == 1) && (fcount != (frame->fcount + frame->cur_buf_index)))) {
framemgr_e_barrier_common(framemgr, 0, flags);
list_frame = find_frame(framemgr, FS_HW_WAIT_DONE, frame_fcount,
- (void *)(ulong)expected_fcount);
+ (void *)(ulong)fcount);
framemgr_x_barrier_common(framemgr, 0, flags);
if (list_frame == NULL) {
- mswarn_hw("queued_count(%d) [ddk:%d,exp:%d,hw:%d] invalid frame(F:%d,idx:%d)",
+ mswarn_hw("queued_count(%d) [ddk:%d,hw:%d] invalid frame(F:%d,idx:%d)",
instance_id, hw_ip,
framemgr->queued_count[FS_HW_WAIT_DONE],
- fcount, expected_fcount, hw_fcount,
+ fcount, hw_fcount,
frame->fcount, frame->cur_buf_index);
flush_wait_done_frame:
framemgr_e_barrier_common(framemgr, 0, flags);
frame = peek_frame(framemgr, FS_HW_WAIT_DONE);
if (frame) {
- if (unlikely(frame->fcount < expected_fcount)) {
+ if (unlikely(frame->fcount < fcount)) {
framemgr_x_barrier_common(framemgr, 0, flags);
fimc_is_hardware_frame_ndone(hw_ip, frame, frame->instance, IS_SHOT_INVALID_FRAMENUMBER);
goto flush_wait_done_frame;
- } else if (unlikely(frame->fcount > expected_fcount)) {
+ } else if (unlikely(frame->fcount > fcount)) {
mswarn_hw("%s:[F%d] Too early frame. Skip it.",
instance_id, hw_ip,
__func__, frame->fcount);
output_id2 = ENTRY_3AF;
wq_id3 = WORK_31G_FDONE; /* mrg output */
output_id3 = ENTRY_3AG;
- /* TODO: Added MEXC for 3AA1 */
+ wq_id4 = WORK_ME1C_FDONE; /* me output */
+ output_id4 = ENTRY_MEXC;
break;
case DEV_HW_ISP0:
wq_id0 = WORK_I0P_FDONE; /* chunk output */
output_id0 = ENTRY_IXP;
wq_id1 = WORK_I1C_FDONE;
output_id1 = ENTRY_IXC;
+ wq_id2 = WORK_ME1C_FDONE; /* me output */
+ output_id2 = ENTRY_MEXC;
break;
case DEV_HW_TPU0:
wq_id1 = WORK_D0C_FDONE;
return 0;
}
-void __nocfi fimc_is_lib_isp_shot(struct fimc_is_hw_ip *hw_ip,
+int __nocfi fimc_is_lib_isp_shot(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_lib_isp *this, void *param_set, struct camera2_shot *shot)
{
int ret = 0;
- FIMC_BUG_VOID(!hw_ip);
- FIMC_BUG_VOID(!this);
- FIMC_BUG_VOID(!param_set);
- FIMC_BUG_VOID(!this->func);
- FIMC_BUG_VOID(!this->object);
+ FIMC_BUG(!hw_ip);
+ FIMC_BUG(!this);
+ FIMC_BUG(!param_set);
+ FIMC_BUG(!this->func);
+ FIMC_BUG(!this->object);
switch (hw_ip->id) {
case DEV_HW_3AA0:
err_lib("invalid hw (%d)", hw_ip->id);
break;
}
+
+ return ret;
}
int __nocfi fimc_is_lib_isp_get_meta(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_lib_isp *this, void *param);
int fimc_is_lib_isp_set_ctrl(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_lib_isp *this, struct fimc_is_frame *frame);
-void fimc_is_lib_isp_shot(struct fimc_is_hw_ip *hw_ip,
+int fimc_is_lib_isp_shot(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_lib_isp *this, void *param_set, struct camera2_shot *shot);
int fimc_is_lib_isp_get_meta(struct fimc_is_hw_ip *hw_ip,
struct fimc_is_lib_isp *this, struct fimc_is_frame *frame);
extern struct fimc_is_sysfs_debug sysfs_debug;
extern struct fimc_is_lib_support gPtr_lib_support;
-int fimc_is_interface_ischain_probe(struct fimc_is_interface_ischain *this,
- struct fimc_is_hardware *hardware, struct fimc_is_resourcemgr *resourcemgr,
- struct platform_device *pdev, ulong core_regs)
+#if defined(SOC_PAF0) || defined(SOC_PAF1)
+static int fimc_is_interface_paf_probe(struct fimc_is_interface_ischain *itfc,
+ int hw_id, struct platform_device *pdev)
{
- enum fimc_is_hardware_id hw_id = DEV_HW_END;
+ struct fimc_is_interface_hwip *itf_paf = NULL;
int ret = 0;
int hw_slot = -1;
- FIMC_BUG(!this);
- FIMC_BUG(!resourcemgr);
-
- this->state = 0;
- /* this->regs_mcuctl = fimc_is_hw_get_sysreg(core_regs); *//* deprecated */
- this->minfo = &resourcemgr->minfo;
-
-#if defined(SOC_PAF0)
- hw_id = DEV_HW_PAF0;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d) ", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- ret = fimc_is_interface_paf_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if defined(SOC_PAF1)
- hw_id = DEV_HW_PAF1;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d) ", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- ret = fimc_is_interface_paf_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if defined(SOC_30S)
- hw_id = DEV_HW_3AA0;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d) ", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- ret = fimc_is_interface_3aa_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if defined(SOC_31S)
- hw_id = DEV_HW_3AA1;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d) ", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- ret = fimc_is_interface_3aa_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if (defined(SOC_I0S) && !defined(SOC_3AAISP))
- hw_id = DEV_HW_ISP0;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d) ", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- ret = fimc_is_interface_isp_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
+ FIMC_BUG(!itfc);
+ FIMC_BUG(!pdev);
-#if (defined(SOC_I1S) && !defined(SOC_3AAISP))
- hw_id = DEV_HW_ISP1;
hw_slot = fimc_is_hw_slot_id(hw_id);
if (!valid_hw_slot_id(hw_slot)) {
err_itfc("invalid hw_slot (%d) ", hw_slot);
return -EINVAL;
}
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- ret = fimc_is_interface_isp_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if defined(SOC_DIS) || defined(SOC_D0S)
- hw_id = DEV_HW_TPU0;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
-
- ret = fimc_is_interface_tpu_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if defined(SOC_D1S)
- hw_id = DEV_HW_TPU1;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
-
- ret = fimc_is_interface_tpu_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if (defined(SOC_SCP) && !defined(MCS_USE_SCP_PARAM))
- hw_id = DEV_HW_SCP;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
-
- ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if (defined(SOC_SCP) && defined(MCS_USE_SCP_PARAM))
- hw_id = DEV_HW_MCSC0;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
-
- ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if (defined(SOC_MCS) && defined(SOC_MCS0))
- hw_id = DEV_HW_MCSC0;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
- return -EINVAL;
- }
-
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+ itf_paf = &itfc->itf_ip[hw_slot];
+ itf_paf->id = hw_id;
+ itf_paf->state = 0;
- ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
+ ret = fimc_is_hw_get_address(itf_paf, pdev, hw_id);
if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if (defined(SOC_MCS) && defined(SOC_MCS1))
- hw_id = DEV_HW_MCSC1;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
+ err_itfc("[ID:%2d] hw_get_address failed (%d)", hw_id, ret);
return -EINVAL;
}
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
-
- ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
+ ret = fimc_is_hw_get_irq(itf_paf, pdev, hw_id);
if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if defined(SOC_VRA) && defined(ENABLE_VRA)
- hw_id = DEV_HW_VRA;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
+ err_itfc("[ID:%2d] hw_get_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
-
- ret = fimc_is_interface_vra_probe(this, hw_id, pdev);
+ ret = fimc_is_hw_request_irq(itf_paf, hw_id);
if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
-
-#if defined(SOC_DCP) && defined(CONFIG_DCP_V1_0)
- hw_id = DEV_HW_DCP;
- hw_slot = fimc_is_hw_slot_id(hw_id);
- if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d)", hw_slot);
+ err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
- this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
-
- ret = fimc_is_interface_dcp_probe(this, hw_id, pdev);
- if (ret) {
- err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
- return -EINVAL;
- }
-#endif
+ set_bit(IS_CHAIN_IF_STATE_INIT, &itf_paf->state);
- set_bit(IS_CHAIN_IF_STATE_INIT, &this->state);
- dbg_itfc("interface ishchain probe done (%d,%d,%d)(%d)", hw_id, hw_slot, hw_slot, ret);
+ dbg_itfc("[ID:%2d] probe done\n", hw_id);
return ret;
}
+#endif
-int fimc_is_interface_3aa_probe(struct fimc_is_interface_ischain *itfc,
+#if defined(SOC_30S) || defined(SOC_31S)
+static int fimc_is_interface_3aa_probe(struct fimc_is_interface_ischain *itfc,
int hw_id, struct platform_device *pdev)
{
struct fimc_is_interface_hwip *itf_3aa = NULL;
case DEV_HW_3AA1:
handler_id = ID_3AA_1;
break;
+ case DEV_HW_VPP:
+ handler_id = ID_VPP;
+ break;
default:
err_itfc("invalid hw_id(%d)", hw_id);
return -EINVAL;
return -EINVAL;
}
-#ifndef CONFIG_VENDER_PSV
ret = fimc_is_hw_request_irq(itf_3aa, hw_id);
if (ret) {
err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
-#endif
for (i = 0; i < INTR_HWIP_MAX; i++) {
itf_3aa->handler[i].valid = false;
return ret;
}
+#endif
-int fimc_is_interface_isp_probe(struct fimc_is_interface_ischain *itfc,
+#if (defined(SOC_I0S) || defined(SOC_I1S)) && !defined(SOC_3AAISP)
+static int fimc_is_interface_isp_probe(struct fimc_is_interface_ischain *itfc,
int hw_id, struct platform_device *pdev)
{
struct fimc_is_interface_hwip *itf_isp = NULL;
return -EINVAL;
}
-#ifndef CONFIG_VENDER_PSV
ret = fimc_is_hw_request_irq(itf_isp, hw_id);
if (ret) {
err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
-#endif
for (i = 0; i < INTR_HWIP_MAX; i++) {
itf_isp->handler[i].valid = false;
return ret;
}
+#endif
-int fimc_is_interface_tpu_probe(struct fimc_is_interface_ischain *itfc,
+#if defined(SOC_DIS) || defined(SOC_D0S) || defined(SOC_D1S)
+static int fimc_is_interface_tpu_probe(struct fimc_is_interface_ischain *itfc,
int hw_id, struct platform_device *pdev)
{
struct fimc_is_interface_hwip *itf_tpu = NULL;
return -EINVAL;
}
-#ifndef CONFIG_VENDER_PSV
ret = fimc_is_hw_request_irq(itf_tpu, hw_id);
if (ret) {
err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
-#endif
for (i = 0; i < INTR_HWIP_MAX; i++) {
itf_tpu->handler[i].valid = false;
return ret;
}
+#endif
-int fimc_is_interface_scaler_probe(struct fimc_is_interface_ischain *itfc,
+#if defined(SOC_SCP) || (defined(SOC_MCS) && (defined(SOC_MCS0) || defined(SOC_MCS1)))
+static int fimc_is_interface_scaler_probe(struct fimc_is_interface_ischain *itfc,
int hw_id, struct platform_device *pdev)
{
struct fimc_is_interface_hwip *itf_scaler = NULL;
return -EINVAL;
}
-#ifndef CONFIG_VENDER_PSV
ret = fimc_is_hw_request_irq(itf_scaler, hw_id);
if (ret) {
err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
-#endif
set_bit(IS_CHAIN_IF_STATE_INIT, &itf_scaler->state);
return ret;
}
+#endif
-int fimc_is_interface_vra_probe(struct fimc_is_interface_ischain *itfc,
+#if defined(SOC_VRA) && defined(ENABLE_VRA)
+static int fimc_is_interface_vra_probe(struct fimc_is_interface_ischain *itfc,
int hw_id, struct platform_device *pdev)
{
struct fimc_is_interface_hwip *itf_vra = NULL;
return -EINVAL;
}
-#ifndef CONFIG_VENDER_PSV
ret = fimc_is_hw_request_irq(itf_vra, hw_id);
if (ret) {
err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
-#endif
/* library data settings */
if (!gPtr_lib_support.minfo) {
return ret;
}
+#endif
-int fimc_is_interface_dcp_probe(struct fimc_is_interface_ischain *itfc,
+#if defined(SOC_DCP) && defined(CONFIG_DCP_V1_0)
+static int fimc_is_interface_dcp_probe(struct fimc_is_interface_ischain *itfc,
int hw_id, struct platform_device *pdev)
{
struct fimc_is_interface_hwip *itf_dcp = NULL;
return -EINVAL;
}
-#ifndef CONFIG_VENDER_PSV
ret = fimc_is_hw_request_irq(itf_dcp, hw_id);
if (ret) {
err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
return -EINVAL;
}
-#endif
for (i = 0; i < INTR_HWIP_MAX; i++) {
itf_dcp->handler[i].valid = false;
return ret;
}
+#endif
-int fimc_is_interface_srdz_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev)
+int fimc_is_interface_ischain_probe(struct fimc_is_interface_ischain *this,
+ struct fimc_is_hardware *hardware, struct fimc_is_resourcemgr *resourcemgr,
+ struct platform_device *pdev, ulong core_regs)
{
- struct fimc_is_interface_hwip *itf_srdz = NULL;
+ enum fimc_is_hardware_id hw_id = DEV_HW_END;
int ret = 0;
int hw_slot = -1;
- FIMC_BUG(!itfc);
- FIMC_BUG(!pdev);
+ FIMC_BUG(!this);
+ FIMC_BUG(!resourcemgr);
+ this->state = 0;
+ /* this->regs_mcuctl = fimc_is_hw_get_sysreg(core_regs); *//* deprecated */
+ this->minfo = &resourcemgr->minfo;
+
+#if defined(SOC_PAF0)
+ hw_id = DEV_HW_PAF0;
hw_slot = fimc_is_hw_slot_id(hw_id);
if (!valid_hw_slot_id(hw_slot)) {
err_itfc("invalid hw_slot (%d) ", hw_slot);
return -EINVAL;
}
- itf_srdz = &itfc->itf_ip[hw_slot];
- itf_srdz->id = hw_id;
- itf_srdz->state = 0;
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+ ret = fimc_is_interface_paf_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+#if defined(SOC_PAF1)
+ hw_id = DEV_HW_PAF1;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d) ", hw_slot);
+ return -EINVAL;
+ }
- ret = fimc_is_hw_get_address(itf_srdz, pdev, hw_id);
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+ ret = fimc_is_interface_paf_probe(this, hw_id, pdev);
if (ret) {
- err_itfc("[ID:%2d] hw_get_address failed (%d)", hw_id, ret);
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+#if defined(SOC_30S)
+ hw_id = DEV_HW_3AA0;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d) ", hw_slot);
return -EINVAL;
}
- ret = fimc_is_hw_get_irq(itf_srdz, pdev, hw_id);
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+ ret = fimc_is_interface_3aa_probe(this, hw_id, pdev);
if (ret) {
- err_itfc("[ID:%2d] hw_get_irq failed (%d)", hw_id, ret);
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+#if defined(SOC_31S)
+ hw_id = DEV_HW_3AA1;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d) ", hw_slot);
return -EINVAL;
}
-#ifndef CONFIG_VENDER_PSV
- ret = fimc_is_hw_request_irq(itf_srdz, hw_id);
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+ ret = fimc_is_interface_3aa_probe(this, hw_id, pdev);
if (ret) {
- err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+#if (defined(SOC_I0S) && !defined(SOC_3AAISP))
+ hw_id = DEV_HW_ISP0;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d) ", hw_slot);
+ return -EINVAL;
+ }
+
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+ ret = fimc_is_interface_isp_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
return -EINVAL;
}
#endif
- set_bit(IS_CHAIN_IF_STATE_INIT, &itf_srdz->state);
+#if (defined(SOC_I1S) && !defined(SOC_3AAISP))
+ hw_id = DEV_HW_ISP1;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d) ", hw_slot);
+ return -EINVAL;
+ }
- dbg_itfc("[ID:%2d] probe done\n", hw_id);
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+ ret = fimc_is_interface_isp_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
- return ret;
-}
+#if defined(SOC_DIS) || defined(SOC_D0S)
+ hw_id = DEV_HW_TPU0;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d)", hw_slot);
+ return -EINVAL;
+ }
-int fimc_is_interface_paf_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev)
-{
- struct fimc_is_interface_hwip *itf_paf = NULL;
- int ret = 0;
- int hw_slot = -1;
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- FIMC_BUG(!itfc);
- FIMC_BUG(!pdev);
+ ret = fimc_is_interface_tpu_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+#if defined(SOC_D1S)
+ hw_id = DEV_HW_TPU1;
hw_slot = fimc_is_hw_slot_id(hw_id);
if (!valid_hw_slot_id(hw_slot)) {
- err_itfc("invalid hw_slot (%d) ", hw_slot);
+ err_itfc("invalid hw_slot (%d)", hw_slot);
return -EINVAL;
}
- itf_paf = &itfc->itf_ip[hw_slot];
- itf_paf->id = hw_id;
- itf_paf->state = 0;
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
- ret = fimc_is_hw_get_address(itf_paf, pdev, hw_id);
+ ret = fimc_is_interface_tpu_probe(this, hw_id, pdev);
if (ret) {
- err_itfc("[ID:%2d] hw_get_address failed (%d)", hw_id, ret);
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
return -EINVAL;
}
+#endif
- ret = fimc_is_hw_get_irq(itf_paf, pdev, hw_id);
+#if (defined(SOC_SCP) && !defined(MCS_USE_SCP_PARAM))
+ hw_id = DEV_HW_SCP;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d)", hw_slot);
+ return -EINVAL;
+ }
+
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+
+ ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
if (ret) {
- err_itfc("[ID:%2d] hw_get_irq failed (%d)", hw_id, ret);
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
return -EINVAL;
}
+#endif
- ret = fimc_is_hw_request_irq(itf_paf, hw_id);
+#if (defined(SOC_SCP) && defined(MCS_USE_SCP_PARAM))
+ hw_id = DEV_HW_MCSC0;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d)", hw_slot);
+ return -EINVAL;
+ }
+
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+
+ ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
if (ret) {
- err_itfc("[ID:%2d] hw_request_irq failed (%d)", hw_id, ret);
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
return -EINVAL;
}
+#endif
- set_bit(IS_CHAIN_IF_STATE_INIT, &itf_paf->state);
+#if (defined(SOC_MCS) && defined(SOC_MCS0))
+ hw_id = DEV_HW_MCSC0;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d)", hw_slot);
+ return -EINVAL;
+ }
- dbg_itfc("[ID:%2d] probe done\n", hw_id);
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+
+ ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+#if (defined(SOC_MCS) && defined(SOC_MCS1))
+ hw_id = DEV_HW_MCSC1;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d)", hw_slot);
+ return -EINVAL;
+ }
+
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+
+ ret = fimc_is_interface_scaler_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+#if defined(SOC_VRA) && defined(ENABLE_VRA)
+ hw_id = DEV_HW_VRA;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d)", hw_slot);
+ return -EINVAL;
+ }
+
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+
+ ret = fimc_is_interface_vra_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+#if defined(SOC_DCP) && defined(CONFIG_DCP_V1_0)
+ hw_id = DEV_HW_DCP;
+ hw_slot = fimc_is_hw_slot_id(hw_id);
+ if (!valid_hw_slot_id(hw_slot)) {
+ err_itfc("invalid hw_slot (%d)", hw_slot);
+ return -EINVAL;
+ }
+
+ this->itf_ip[hw_slot].hw_ip = &(hardware->hw_ip[hw_slot]);
+
+ ret = fimc_is_interface_dcp_probe(this, hw_id, pdev);
+ if (ret) {
+ err_itfc("interface probe fail (%d,%d)", hw_id, hw_slot);
+ return -EINVAL;
+ }
+#endif
+
+ set_bit(IS_CHAIN_IF_STATE_INIT, &this->state);
+ dbg_itfc("interface ishchain probe done (%d,%d,%d)(%d)", hw_id, hw_slot, hw_slot, ret);
return ret;
}
framemgr_x_barrier_irqr(framemgr, FMGR_IDX_4, flags);
}
-static void wq_func_30c(struct work_struct *data)
+static void wq_func_3xc(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_30C_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_30C_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_30C_FDONE], work);
- get_req_work(&itf->work_list[WORK_30C_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
-static void wq_func_30p(struct work_struct *data)
+static void wq_func_30c(struct work_struct *data)
+{
+ wq_func_3xc(data, WORK_30C_FDONE);
+}
+
+static void wq_func_31c(struct work_struct *data)
+{
+ wq_func_3xc(data, WORK_31C_FDONE);
+}
+
+static void wq_func_3xp(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_30P_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_30P_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_30P_FDONE], work);
- get_req_work(&itf->work_list[WORK_30P_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
-static void wq_func_30f(struct work_struct *data)
+static void wq_func_30p(struct work_struct *data)
+{
+ wq_func_3xp(data, WORK_30P_FDONE);
+}
+
+static void wq_func_31p(struct work_struct *data)
+{
+ wq_func_3xp(data, WORK_31P_FDONE);
+}
+
+static void wq_func_32p(struct work_struct *data)
+{
+ wq_func_3xp(data, WORK_32P_FDONE);
+}
+
+static void wq_func_3xf(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_30F_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_30F_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_30F_FDONE], work);
- get_req_work(&itf->work_list[WORK_30F_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
-static void wq_func_30g(struct work_struct *data)
+static void wq_func_30f(struct work_struct *data)
{
- u32 instance, fcount, rcount, status;
- struct fimc_is_interface *itf;
- struct fimc_is_device_ischain *device;
- struct fimc_is_subdev *leader, *subdev;
- struct fimc_is_work *work;
- struct fimc_is_msg *msg;
-
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_30G_FDONE]);
-
- get_req_work(&itf->work_list[WORK_30G_FDONE], &work);
- while (work) {
- msg = &work->msg;
- instance = msg->instance;
- fcount = msg->param1;
- rcount = msg->param2;
- status = msg->param3;
-
- if (instance >= FIMC_IS_STREAM_COUNT) {
- err("instance is invalid(%d)", instance);
- goto p_err;
- }
-
- device = &((struct fimc_is_core *)itf->core)->ischain[instance];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &device->state)) {
- merr("device is not open", device);
- goto p_err;
- }
-
- subdev = &device->txg;
- if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
- merr("subdev is not start", device);
- goto p_err;
- }
-
- leader = subdev->leader;
- if (!leader) {
- merr("leader is NULL", device);
- goto p_err;
- }
-
- wq_func_frame(leader, subdev, fcount, rcount, status);
-
-p_err:
- set_free_work(&itf->work_list[WORK_30G_FDONE], work);
- get_req_work(&itf->work_list[WORK_30G_FDONE], &work);
- }
+ wq_func_3xf(data, WORK_30F_FDONE);
}
-static void wq_func_31c(struct work_struct *data)
+static void wq_func_31f(struct work_struct *data)
{
- u32 instance, fcount, rcount, status;
- struct fimc_is_interface *itf;
- struct fimc_is_device_ischain *device;
- struct fimc_is_subdev *leader, *subdev;
- struct fimc_is_work *work;
- struct fimc_is_msg *msg;
-
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_31C_FDONE]);
-
- get_req_work(&itf->work_list[WORK_31C_FDONE], &work);
- while (work) {
- msg = &work->msg;
- instance = msg->instance;
- fcount = msg->param1;
- rcount = msg->param2;
- status = msg->param3;
-
- if (instance >= FIMC_IS_STREAM_COUNT) {
- err("instance is invalid(%d)", instance);
- goto p_err;
- }
-
- device = &((struct fimc_is_core *)itf->core)->ischain[instance];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &device->state)) {
- merr("device is not open", device);
- goto p_err;
- }
-
- subdev = &device->txc;
- if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
- merr("subdev is not start", device);
- goto p_err;
- }
-
- leader = subdev->leader;
- if (!leader) {
- merr("leader is NULL", device);
- goto p_err;
- }
-
- wq_func_frame(leader, subdev, fcount, rcount, status);
-
-p_err:
- set_free_work(&itf->work_list[WORK_31C_FDONE], work);
- get_req_work(&itf->work_list[WORK_31C_FDONE], &work);
- }
+ wq_func_3xf(data, WORK_31F_FDONE);
}
-static void wq_func_31p(struct work_struct *data)
+static void wq_func_3xg(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_31P_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_31P_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
goto p_err;
}
- subdev = &device->txp;
+ subdev = &device->txg;
if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
merr("subdev is not start", device);
goto p_err;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_31P_FDONE], work);
- get_req_work(&itf->work_list[WORK_31P_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
-static void wq_func_31f(struct work_struct *data)
+static void wq_func_30g(struct work_struct *data)
{
- u32 instance, fcount, rcount, status;
- struct fimc_is_interface *itf;
- struct fimc_is_device_ischain *device;
- struct fimc_is_subdev *leader, *subdev;
- struct fimc_is_work *work;
- struct fimc_is_msg *msg;
-
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_31F_FDONE]);
-
- get_req_work(&itf->work_list[WORK_31F_FDONE], &work);
- while (work) {
- msg = &work->msg;
- instance = msg->instance;
- fcount = msg->param1;
- rcount = msg->param2;
- status = msg->param3;
-
- if (instance >= FIMC_IS_STREAM_COUNT) {
- err("instance is invalid(%d)", instance);
- goto p_err;
- }
-
- device = &((struct fimc_is_core *)itf->core)->ischain[instance];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &device->state)) {
- merr("device is not open", device);
- goto p_err;
- }
-
- subdev = &device->txf;
- if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
- merr("subdev is not start", device);
- goto p_err;
- }
-
- leader = subdev->leader;
- if (!leader) {
- merr("leader is NULL", device);
- goto p_err;
- }
-
- wq_func_frame(leader, subdev, fcount, rcount, status);
-
-p_err:
- set_free_work(&itf->work_list[WORK_31F_FDONE], work);
- get_req_work(&itf->work_list[WORK_31F_FDONE], &work);
- }
+ wq_func_3xg(data, WORK_30G_FDONE);
}
static void wq_func_31g(struct work_struct *data)
+{
+ wq_func_3xg(data, WORK_31G_FDONE);
+}
+
+static void wq_func_ixc(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_31G_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_31G_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
goto p_err;
}
- subdev = &device->txg;
+ subdev = &device->ixc;
if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
merr("subdev is not start", device);
goto p_err;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_31G_FDONE], work);
- get_req_work(&itf->work_list[WORK_31G_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
static void wq_func_i0c(struct work_struct *data)
{
- u32 instance, fcount, rcount, status;
- struct fimc_is_interface *itf;
- struct fimc_is_device_ischain *device;
- struct fimc_is_subdev *leader, *subdev;
- struct fimc_is_work *work;
- struct fimc_is_msg *msg;
-
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_I0C_FDONE]);
-
- get_req_work(&itf->work_list[WORK_I0C_FDONE], &work);
- while (work) {
- msg = &work->msg;
- instance = msg->instance;
- fcount = msg->param1;
- rcount = msg->param2;
- status = msg->param3;
-
- if (instance >= FIMC_IS_STREAM_COUNT) {
- err("instance is invalid(%d)", instance);
- goto p_err;
- }
-
- device = &((struct fimc_is_core *)itf->core)->ischain[instance];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &device->state)) {
- merr("device is not open", device);
- goto p_err;
- }
-
- subdev = &device->ixc;
- if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
- merr("subdev is not start", device);
- goto p_err;
- }
-
- leader = subdev->leader;
- if (!leader) {
- merr("leader is NULL", device);
- goto p_err;
- }
-
- wq_func_frame(leader, subdev, fcount, rcount, status);
+ wq_func_ixc(data, WORK_I0C_FDONE);
+}
-p_err:
- set_free_work(&itf->work_list[WORK_I0C_FDONE], work);
- get_req_work(&itf->work_list[WORK_I0C_FDONE], &work);
- }
+static void wq_func_i1c(struct work_struct *data)
+{
+ wq_func_ixc(data, WORK_I1C_FDONE);
}
-static void wq_func_i0p(struct work_struct *data)
+static void wq_func_ixp(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_I0P_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_I0P_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_I0P_FDONE], work);
- get_req_work(&itf->work_list[WORK_I0P_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
-static void wq_func_i1c(struct work_struct *data)
+static void wq_func_i0p(struct work_struct *data)
{
- u32 instance, fcount, rcount, status;
- struct fimc_is_interface *itf;
- struct fimc_is_device_ischain *device;
- struct fimc_is_subdev *leader, *subdev;
- struct fimc_is_work *work;
- struct fimc_is_msg *msg;
-
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_I1C_FDONE]);
-
- get_req_work(&itf->work_list[WORK_I1C_FDONE], &work);
- while (work) {
- msg = &work->msg;
- instance = msg->instance;
- fcount = msg->param1;
- rcount = msg->param2;
- status = msg->param3;
-
- if (instance >= FIMC_IS_STREAM_COUNT) {
- err("instance is invalid(%d)", instance);
- goto p_err;
- }
-
- device = &((struct fimc_is_core *)itf->core)->ischain[instance];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &device->state)) {
- merr("device is not open", device);
- goto p_err;
- }
-
- subdev = &device->ixc;
- if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
- merr("subdev is not start", device);
- goto p_err;
- }
-
- leader = subdev->leader;
- if (!leader) {
- merr("leader is NULL", device);
- goto p_err;
- }
-
- wq_func_frame(leader, subdev, fcount, rcount, status);
-
-p_err:
- set_free_work(&itf->work_list[WORK_I1C_FDONE], work);
- get_req_work(&itf->work_list[WORK_I1C_FDONE], &work);
- }
+ wq_func_ixp(data, WORK_I0P_FDONE);
}
static void wq_func_i1p(struct work_struct *data)
+{
+ wq_func_ixp(data, WORK_I1P_FDONE);
+}
+
+static void wq_func_mexc(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_I1P_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_I1P_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
goto p_err;
}
- subdev = &device->ixp;
+ subdev = &device->mexc;
if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
merr("subdev is not start", device);
goto p_err;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_I1P_FDONE], work);
- get_req_work(&itf->work_list[WORK_I1P_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
static void wq_func_me0c(struct work_struct *data)
{
- u32 instance, fcount, rcount, status;
- struct fimc_is_interface *itf;
- struct fimc_is_device_ischain *device;
- struct fimc_is_subdev *leader, *subdev;
- struct fimc_is_work *work;
- struct fimc_is_msg *msg;
-
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_ME0C_FDONE]);
-
- get_req_work(&itf->work_list[WORK_ME0C_FDONE], &work);
- while (work) {
- msg = &work->msg;
- instance = msg->instance;
- fcount = msg->param1;
- rcount = msg->param2;
- status = msg->param3;
-
- if (instance >= FIMC_IS_STREAM_COUNT) {
- err("instance is invalid(%d)", instance);
- goto p_err;
- }
-
- device = &((struct fimc_is_core *)itf->core)->ischain[instance];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &device->state)) {
- merr("device is not open", device);
- goto p_err;
- }
-
- subdev = &device->mexc;
- if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
- merr("subdev is not start", device);
- goto p_err;
- }
-
- leader = subdev->leader;
- if (!leader) {
- merr("leader is NULL", device);
- goto p_err;
- }
-
- wq_func_frame(leader, subdev, fcount, rcount, status);
+ wq_func_mexc(data, WORK_ME0C_FDONE);
+}
-p_err:
- set_free_work(&itf->work_list[WORK_ME0C_FDONE], work);
- get_req_work(&itf->work_list[WORK_ME0C_FDONE], &work);
- }
+static void wq_func_me1c(struct work_struct *data)
+{
+ wq_func_mexc(data, WORK_ME1C_FDONE);
}
-static void wq_func_d0c(struct work_struct *data)
+static void wq_func_dxc(struct work_struct *data, u32 wq_id)
{
u32 instance, fcount, rcount, status;
struct fimc_is_interface *itf;
struct fimc_is_work *work;
struct fimc_is_msg *msg;
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_D0C_FDONE]);
+ itf = container_of(data, struct fimc_is_interface, work_wq[wq_id]);
- get_req_work(&itf->work_list[WORK_D0C_FDONE], &work);
+ get_req_work(&itf->work_list[wq_id], &work);
while (work) {
msg = &work->msg;
instance = msg->instance;
wq_func_frame(leader, subdev, fcount, rcount, status);
p_err:
- set_free_work(&itf->work_list[WORK_D0C_FDONE], work);
- get_req_work(&itf->work_list[WORK_D0C_FDONE], &work);
+ set_free_work(&itf->work_list[wq_id], work);
+ get_req_work(&itf->work_list[wq_id], &work);
}
}
-static void wq_func_d1c(struct work_struct *data)
+static void wq_func_d0c(struct work_struct *data)
{
- u32 instance, fcount, rcount, status;
- struct fimc_is_interface *itf;
- struct fimc_is_device_ischain *device;
- struct fimc_is_subdev *leader, *subdev;
- struct fimc_is_work *work;
- struct fimc_is_msg *msg;
-
- itf = container_of(data, struct fimc_is_interface, work_wq[WORK_D1C_FDONE]);
-
- get_req_work(&itf->work_list[WORK_D1C_FDONE], &work);
- while (work) {
- msg = &work->msg;
- instance = msg->instance;
- fcount = msg->param1;
- rcount = msg->param2;
- status = msg->param3;
-
- if (instance >= FIMC_IS_STREAM_COUNT) {
- err("instance is invalid(%d)", instance);
- goto p_err;
- }
-
- device = &((struct fimc_is_core *)itf->core)->ischain[instance];
- if (!test_bit(FIMC_IS_ISCHAIN_OPEN, &device->state)) {
- merr("device is not open", device);
- goto p_err;
- }
-
- subdev = &device->dxc;
- if (!test_bit(FIMC_IS_SUBDEV_START, &subdev->state)) {
- merr("subdev is not start", device);
- goto p_err;
- }
-
- leader = subdev->leader;
- if (!leader) {
- merr("leader is NULL", device);
- goto p_err;
- }
-
- wq_func_frame(leader, subdev, fcount, rcount, status);
+ wq_func_dxc(data, WORK_D0C_FDONE);
+}
-p_err:
- set_free_work(&itf->work_list[WORK_D1C_FDONE], work);
- get_req_work(&itf->work_list[WORK_D1C_FDONE], &work);
- }
+static void wq_func_d1c(struct work_struct *data)
+{
+ wq_func_dxc(data, WORK_D1C_FDONE);
}
static void wq_func_dc1s(struct work_struct *data)
INIT_WORK(&this->work_wq[WORK_31P_FDONE], wq_func_31p);
INIT_WORK(&this->work_wq[WORK_31F_FDONE], wq_func_31f);
INIT_WORK(&this->work_wq[WORK_31G_FDONE], wq_func_31g);
+ INIT_WORK(&this->work_wq[WORK_32P_FDONE], wq_func_32p);
INIT_WORK(&this->work_wq[WORK_I0C_FDONE], wq_func_i0c);
INIT_WORK(&this->work_wq[WORK_I0P_FDONE], wq_func_i0p);
INIT_WORK(&this->work_wq[WORK_I1C_FDONE], wq_func_i1c);
INIT_WORK(&this->work_wq[WORK_I1P_FDONE], wq_func_i1p);
INIT_WORK(&this->work_wq[WORK_ME0C_FDONE], wq_func_me0c);
+ INIT_WORK(&this->work_wq[WORK_ME1C_FDONE], wq_func_me1c);
INIT_WORK(&this->work_wq[WORK_D0C_FDONE], wq_func_d0c);
INIT_WORK(&this->work_wq[WORK_D1C_FDONE], wq_func_d1c);
init_work_list(&this->work_list[WORK_31P_FDONE], TRACE_WORK_ID_31P, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_31F_FDONE], TRACE_WORK_ID_31F, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_31G_FDONE], TRACE_WORK_ID_31G, MAX_WORK_COUNT);
+ init_work_list(&this->work_list[WORK_32P_FDONE], TRACE_WORK_ID_32P, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_I0C_FDONE], TRACE_WORK_ID_I0C, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_I0P_FDONE], TRACE_WORK_ID_I0P, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_I1C_FDONE], TRACE_WORK_ID_I1C, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_I1P_FDONE], TRACE_WORK_ID_I1P, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_ME0C_FDONE], TRACE_WORK_ID_ME0C, MAX_WORK_COUNT);
+ init_work_list(&this->work_list[WORK_ME1C_FDONE], TRACE_WORK_ID_ME1C, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_D0C_FDONE], TRACE_WORK_ID_D0C, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_D1C_FDONE], TRACE_WORK_ID_D1C, MAX_WORK_COUNT);
init_work_list(&this->work_list[WORK_DC1S_FDONE], TRACE_WORK_ID_DC1S, MAX_WORK_COUNT);
int fimc_is_interface_ischain_probe(struct fimc_is_interface_ischain *this,
struct fimc_is_hardware *hardware, struct fimc_is_resourcemgr *resourcemgr,
struct platform_device *pdev, ulong core_regs);
-int fimc_is_interface_paf_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
-int fimc_is_interface_3aa_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
-int fimc_is_interface_isp_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
-int fimc_is_interface_tpu_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
-int fimc_is_interface_scaler_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
-int fimc_is_interface_vra_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
-int fimc_is_interface_dcp_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
-int fimc_is_interface_srdz_probe(struct fimc_is_interface_ischain *itfc,
- int hw_id, struct platform_device *pdev);
#endif
spin_unlock_irqrestore(&mblk->lock, flag);
}
-void *fimc_is_alloc_heap(u32 size)
+void *fimc_is_alloc_dma_taaisp(u32 size)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
- return alloc_from_mblk(&lib->mb_heap_rta, size);
+ return alloc_from_mblk(&lib->mb_dma_taaisp, size);
}
-void fimc_is_free_heap(void *kva)
+void fimc_is_free_dma_taaisp(void *kva)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
- return free_to_mblk(&lib->mb_heap_rta, kva);
+ return free_to_mblk(&lib->mb_dma_taaisp, kva);
}
-void *fimc_is_alloc_dma(u32 size)
+void *fimc_is_alloc_dma_tnr(u32 size)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
- return alloc_from_mblk(&lib->mb_dma, size);
+ return alloc_from_mblk(&lib->mb_dma_tnr, size);
}
-void fimc_is_free_dma(void *kva)
+void fimc_is_free_dma_tnr(void *kva)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
- return free_to_mblk(&lib->mb_dma, kva);
+ return free_to_mblk(&lib->mb_dma_tnr, kva);
}
void *fimc_is_alloc_vra(u32 size)
return NULL;
}
- pb = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, size, 0);
+ pb = CALL_PTR_MEMOP(mem, alloc, mem->default_ctx, size, 0, NULL);
if (IS_ERR_OR_NULL(pb)) {
err_lib("failed to allocate a private buffer");
kfree(buf);
return 0;
}
-int fimc_is_dva_dma(ulong kva, u32 *dva)
+int fimc_is_dva_dma_taaisp(ulong kva, u32 *dva)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
- return mblk_dva(&lib->mb_dma, kva, dva);
+ return mblk_dva(&lib->mb_dma_taaisp, kva, dva);
+}
+
+int fimc_is_dva_dma_tnr(ulong kva, u32 *dva)
+{
+ struct fimc_is_lib_support *lib = &gPtr_lib_support;
+
+ return mblk_dva(&lib->mb_dma_tnr, kva, dva);
}
int fimc_is_dva_vra(ulong kva, u32 *dva)
return mblk_dva(&lib->mb_vra, kva, dva);
}
-int fimc_is_kva_dma(u32 dva, ulong *kva)
+int fimc_is_kva_dma_taaisp(u32 dva, ulong *kva)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
- return mblk_kva(&lib->mb_dma, dva, kva);
+ return mblk_kva(&lib->mb_dma_taaisp, dva, kva);
+}
+
+int fimc_is_kva_dma_tnr(u32 dva, ulong *kva)
+{
+ struct fimc_is_lib_support *lib = &gPtr_lib_support;
+
+ return mblk_kva(&lib->mb_dma_tnr, dva, kva);
}
int fimc_is_kva_vra(u32 dva, ulong *kva)
DMA_TO_DEVICE);
}
-void fimc_is_inv_dma(ulong kva, u32 size)
+void fimc_is_inv_dma_taaisp(ulong kva, u32 size)
+{
+ struct fimc_is_lib_support *lib = &gPtr_lib_support;
+
+ return mblk_inv(&lib->mb_dma_taaisp, kva, size);
+}
+
+void fimc_is_inv_dma_tnr(ulong kva, u32 size)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
- return mblk_inv(&lib->mb_dma, kva, size);
+ return mblk_inv(&lib->mb_dma_tnr, kva, size);
}
void fimc_is_inv_vra(ulong kva, u32 size)
#define IRQ_ID_TPU0(x) (x - (INTR_ID_BASE_OFFSET * 4))
#define IRQ_ID_TPU1(x) (x - (INTR_ID_BASE_OFFSET * 5))
#define IRQ_ID_DCP(x) (x - (INTR_ID_BASE_OFFSET * 6))
+#define IRQ_ID_VPP(x) (x - (INTR_ID_BASE_OFFSET * 7))
#define valid_3aaisp_intr_index(intr_index) \
(0 <= intr_index && intr_index < INTR_HWIP_MAX)
case ID_DCP:
intr_index = IRQ_ID_DCP(info.id);
break;
+ case ID_VPP:
+ intr_index = IRQ_ID_VPP(info.id);
+ break;
default:
err_lib("invalid chaind_id(%d)", info.chain_id);
return -EINVAL;
case ID_DCP:
intr_index = IRQ_ID_DCP(intr_id);
break;
+ case ID_VPP:
+ intr_index = IRQ_ID_VPP(intr_id);
+ break;
default:
err_lib("invalid chaind_id(%d)", chain_id);
return 0;
return IRQ_HANDLED;
}
-int fimc_is_register_general_interrupt(struct general_intr_handler info)
+static int fimc_is_register_general_interrupt(struct general_intr_handler info)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
int ret = 0;
return ret;
}
-int fimc_is_unregister_general_interrupt(struct general_intr_handler info)
+static int fimc_is_unregister_general_interrupt(struct general_intr_handler info)
{
struct fimc_is_lib_support *lib = &gPtr_lib_support;
case ID_DCP:
hw_id = DEV_HW_DCP;
break;
+ case ID_VPP:
+ hw_id = DEV_HW_VPP;
+ break;
default:
warn_lib("get_reg_addr: invalid id(%d)\n", id);
return 0;
{
funcs[0] = (os_system_func_t)fimc_is_log_write_console;
- funcs[1] = (os_system_func_t)fimc_is_alloc_heap;
- funcs[2] = (os_system_func_t)fimc_is_free_heap;
+ funcs[1] = NULL;
+ funcs[2] = NULL;
funcs[3] = (os_system_func_t)fimc_is_assert;
funcs[28] = (os_system_func_t)fimc_is_get_usec;
funcs[29] = (os_system_func_t)fimc_is_log_write;
- funcs[30] = (os_system_func_t)fimc_is_dva_dma;
- funcs[31] = (os_system_func_t)fimc_is_kva_dma;
+ funcs[30] = (os_system_func_t)fimc_is_dva_dma_taaisp;
+ funcs[31] = (os_system_func_t)fimc_is_kva_dma_taaisp;
funcs[32] = (os_system_func_t)fimc_is_sleep;
- funcs[33] = (os_system_func_t)fimc_is_inv_dma;
- funcs[34] = (os_system_func_t)fimc_is_alloc_dma;
- funcs[35] = (os_system_func_t)fimc_is_free_dma;
+ funcs[33] = (os_system_func_t)fimc_is_inv_dma_taaisp;
+ funcs[34] = (os_system_func_t)fimc_is_alloc_dma_taaisp;
+ funcs[35] = (os_system_func_t)fimc_is_free_dma_taaisp;
funcs[36] = (os_system_func_t)fimc_is_spin_lock_init;
funcs[37] = (os_system_func_t)fimc_is_spin_lock_finish;
funcs[41] = (os_system_func_t)fimc_is_spin_unlock_irq;
funcs[42] = (os_system_func_t)fimc_is_spin_lock_irqsave;
funcs[43] = (os_system_func_t)fimc_is_spin_unlock_irqrestore;
- funcs[44] = (os_system_func_t)fimc_is_alloc_heap;
- funcs[45] = (os_system_func_t)fimc_is_free_heap;
+ funcs[44] = NULL;
+ funcs[45] = NULL;
funcs[46] = (os_system_func_t)get_reg_addr;
funcs[47] = (os_system_func_t)fimc_is_lib_in_interrupt;
funcs[49] = (os_system_func_t)fimc_is_get_fd_data; /* for FDAE/FDAF */
funcs[50] = (os_system_func_t)fimc_is_get_hybrid_fd_data; /* for FDAE/FDAF */
+ funcs[60] = (os_system_func_t)fimc_is_dva_dma_tnr;
+ funcs[61] = (os_system_func_t)fimc_is_kva_dma_tnr;
+ funcs[62] = (os_system_func_t)fimc_is_inv_dma_tnr;
+ funcs[63] = (os_system_func_t)fimc_is_alloc_dma_tnr;
+ funcs[64] = (os_system_func_t)fimc_is_free_dma_tnr;
+
/* TODO: re-odering function table */
funcs[99] = (os_system_func_t)fimc_is_event_write;
}
#endif
/* Index 10 => memory : alloc/free */
- funcs[10] = (os_system_func_t)fimc_is_alloc_heap;
- funcs[11] = (os_system_func_t)fimc_is_free_heap;
+ funcs[10] = NULL;
+ funcs[11] = NULL;
/* Index 20 => memory : misc */
{
int ret = 0;
struct fimc_is_lib_support *lib = &gPtr_lib_support;
+ struct fimc_is_core *core;
+
+ core = (struct fimc_is_core *)platform_get_drvdata(lib->pdev);
info_lib("binary load start\n");
lib->binary_load_flg = true;
- mblk_init(&lib->mb_heap_rta, lib->minfo->pb_heap_rta, MT_TYPE_MB_HEAP, "HEAP");
- mblk_init(&lib->mb_dma, lib->minfo->pb_taaisp, MT_TYPE_MB_DMA, "DMA");
+#if defined(SECURE_CAMERA_FACE)
+ if (core && core->scenario == FIMC_IS_SCENARIO_SECURE)
+ mblk_init(&lib->mb_dma_taaisp, lib->minfo->pb_taaisp_s,
+ MT_TYPE_MB_DMA_TAAISP, "DMA_TAAISP_S");
+ else
+#endif
+ mblk_init(&lib->mb_dma_taaisp, lib->minfo->pb_taaisp,
+ MT_TYPE_MB_DMA_TAAISP, "DMA_TAAISP");
+
+#if defined(ENABLE_TNR)
+ mblk_init(&lib->mb_dma_tnr, lib->minfo->pb_tnr, MT_TYPE_MB_DMA_TNR, "DMA_TNR");
+#endif
mblk_init(&lib->mb_vra, lib->minfo->pb_vra, MT_TYPE_MB_VRA, "VRA");
spin_lock_init(&lib->slock_nmb);
#define TASK_AF_AFFINITY (1)
#define TASK_ISP_DMA_AFFINITY (2)
#define TASK_3AA_DMA_AFFINITY (TASK_ISP_DMA_AFFINITY)
-#define TASK_AA_AFFINITY (TASK_AF_AFFINITY)
+#define TASK_AA_AFFINITY (TASK_OTF_AFFINITY)
/* #define TASK_RTA_AFFINITY (1) */ /* There is no need to set of cpu affinity for RTA task */
#define TASK_VRA_AFFINITY (2)
/* memory block */
MT_TYPE_MB_HEAP = 0x10,
- MT_TYPE_MB_DMA,
+ MT_TYPE_MB_DMA_TAAISP,
+ MT_TYPE_MB_DMA_TNR,
MT_TYPE_MB_VRA = 0x20,
/* memory blocks */
struct lib_mem_block mb_heap_rta;
- struct lib_mem_block mb_dma;
+ struct lib_mem_block mb_dma_taaisp;
+ struct lib_mem_block mb_dma_tnr;
struct lib_mem_block mb_vra;
/* non-memory block */
spinlock_t slock_nmb;
void fimc_is_load_ctrl_lock(void);
void fimc_is_load_ctrl_init(void);
int fimc_is_set_fw_names(char *fw_name, char *rta_fw_name);
-int fimc_is_register_general_interrupt(struct general_intr_handler info);
-
#endif
}
#endif
-#ifdef ENABLE_REPROCESSING_FD
- spin_lock_irqsave(&lib_vra->reprocess_fd_lock, lib_vra->reprocess_fd_flag);
+#ifdef ENABLE_VRA_FDONE_WITH_CALLBACK
+ spin_lock_irqsave(&lib_vra->fdone_cb_lock, lib_vra->fdone_cb_flag);
set_bit(instance, &lib_vra->done_vra_callback_out_ready);
if (test_bit(instance, &lib_vra->done_vra_hw_intr)
&& test_bit(instance, &lib_vra->done_vra_callback_out_ready)) {
clear_bit(instance, &lib_vra->done_vra_callback_out_ready);
clear_bit(instance, &lib_vra->done_vra_hw_intr);
- spin_unlock_irqrestore(&lib_vra->reprocess_fd_lock, lib_vra->reprocess_fd_flag);
+ spin_unlock_irqrestore(&lib_vra->fdone_cb_lock, lib_vra->fdone_cb_flag);
fimc_is_hardware_frame_done(lib_vra->hw_ip, NULL, -1,
FIMC_IS_HW_CORE_END, IS_SHOT_SUCCESS, true);
} else {
- spin_unlock_irqrestore(&lib_vra->reprocess_fd_lock, lib_vra->reprocess_fd_flag);
+ spin_unlock_irqrestore(&lib_vra->fdone_cb_lock, lib_vra->fdone_cb_flag);
}
#endif
}
spin_lock_init(&lib_vra->ctl_lock);
spin_lock_init(&lib_vra->algs_lock);
spin_lock_init(&lib_vra->intr_lock);
-#ifdef ENABLE_REPROCESSING_FD
- spin_lock_init(&lib_vra->reprocess_fd_lock);
+#ifdef ENABLE_VRA_FDONE_WITH_CALLBACK
+ spin_lock_init(&lib_vra->fdone_cb_lock);
#endif
for (i = 0; i < VRA_TOTAL_SENSORS; i++) {
spin_lock_init(&lib_vra->af_fd_slock[i]);
{
enum api_vra_type status = VRA_NO_ERROR;
unsigned char *input_dma_buf_kva = NULL;
- ulong input_dma_buf_dva;
+ dma_addr_t input_dma_buf_dva;
if (unlikely(!lib_vra)) {
err_lib("lib_vra is NULL");
fimc_is_dva_vra((ulong)lib_vra->test_input_buffer, (u32 *)&input_dma_buf_dva);
#else
input_dma_buf_kva = buffer_kva;
- input_dma_buf_dva = (ulong)buffer_dva;
+ input_dma_buf_dva = (dma_addr_t)buffer_dva;
#endif
status = CALL_VRAOP(lib_vra, on_new_frame,
}
static int fimc_is_lib_vra_update_dm(struct fimc_is_lib_vra *lib_vra, u32 instance,
- struct camera2_stats_dm *dm)
+ struct camera2_stats_dm *dm, struct vra_ext_meta *vra_ext)
{
int face_num;
struct api_vra_face_base_str *base;
dm->faceLandmarks[face_num][3],
dm->faceLandmarks[face_num][4],
dm->faceLandmarks[face_num][5]);
+
+ vra_ext->facialScore[face_num].left_eye = facial->scores[VRA_FF_SCORE_LEFT_EYE];
+ vra_ext->facialScore[face_num].right_eye = facial->scores[VRA_FF_SCORE_RIGHT_EYE];
+ vra_ext->facialScore[face_num].mouth = facial->scores[VRA_FF_SCORE_MOUTH];
+ vra_ext->facialScore[face_num].smile = facial->scores[VRA_FF_SCORE_SMILE];
+ vra_ext->facialScore[face_num].left_blink = facial->scores[VRA_FF_SCORE_BLINK_LEFT];
+ vra_ext->facialScore[face_num].right_blink = facial->scores[VRA_FF_SCORE_BLINK_RIGHT];
+
+ dbg_lib(3, "lib_vra_update_dm: facial score(eye l:%d,r:%d mouth:%d smile:%d blink l:%d,r:%d)\n",
+ facial->scores[VRA_FF_SCORE_LEFT_EYE],
+ facial->scores[VRA_FF_SCORE_RIGHT_EYE],
+ facial->scores[VRA_FF_SCORE_MOUTH],
+ facial->scores[VRA_FF_SCORE_SMILE],
+ facial->scores[VRA_FF_SCORE_BLINK_LEFT],
+ facial->scores[VRA_FF_SCORE_BLINK_RIGHT]);
+
+ /* facial angle meta
+ * Yaw: Front: 0, Semi-Profile: 45/315, Profile: 90/270
+ * Roll: Front: 0~330 (unit:30), Semi-Profile/Profile: 0~270 (unit:90)
+ */
+ vra_ext->facialAngle[face_num].yaw = base->yaw;
+ vra_ext->facialAngle[face_num].roll = base->rotation;
+
+ dbg_lib(3, "lib_vra_update_dm: facial angle(yaw:%d,roll:%d)\n",
+ base->yaw, base->rotation);
+
}
/* ToDo: Add error handler for detected face range */
int ret = 0;
struct camera2_stats_ctl *stats_ctl;
struct camera2_stats_dm *stats_dm;
+ struct vra_ext_meta *vra_ext;
if (unlikely(!lib_vra)) {
err_lib("lib_vra is NULL");
return -EINVAL;
}
+ if (unlikely(!frame->shot_ext)) {
+ err_lib("frame->shot_ext is NULL");
+ return -EINVAL;
+ }
+
stats_ctl = &frame->shot->ctl.stats;
stats_dm = &frame->shot->dm.stats;
+ vra_ext = &frame->shot_ext->vra_ext;
if (stats_ctl->faceDetectMode == FACEDETECT_MODE_OFF) {
stats_dm->faceDetectMode = FACEDETECT_MODE_OFF;
}
#endif
ret = fimc_is_lib_vra_update_dm(lib_vra, frame->instance,
- stats_dm);
+ stats_dm, vra_ext);
if (ret) {
err_lib("lib_vra_update_dm is fail (%#x)", ret);
return -EINVAL;
void *test_input_buffer;
bool image_load;
#endif
-#ifdef ENABLE_REPROCESSING_FD
+#ifdef ENABLE_VRA_FDONE_WITH_CALLBACK
struct fimc_is_hw_ip *hw_ip;
unsigned long done_vra_callback_out_ready;
unsigned long done_vra_hw_intr;
- spinlock_t reprocess_fd_lock;
- ulong reprocess_fd_flag;
+ spinlock_t fdone_cb_lock;
+ ulong fdone_cb_flag;
#endif
#ifdef ENABLE_VRA_CHANGE_SETFILE_PARSING
ulong tune_count;
goto p_err;
}
-#if defined(CONFIG_VENDER_PSV)
- /* ISP */
- fimc_is_enable(dev, "gate_isp_sysmmu");
- fimc_is_enable(dev, "gate_isp_ppmu");
- fimc_is_enable(dev, "gate_isp_bts");
- fimc_is_enable(dev, "gate_isp_cam");
- fimc_is_enable(dev, "gate_isp_isp");
- fimc_is_enable(dev, "gate_isp_vra");
- fimc_is_enable(dev, "pxmxdx_isp_isp");
- fimc_is_enable(dev, "pxmxdx_isp_cam");
- fimc_is_enable(dev, "pxmxdx_isp_vra");
-#endif
-
p_err:
return ret;
}
/* CSI */
exynos7880_fimc_is_csi_gate(dev, channel, true);
-#if defined(CONFIG_VENDER_PSV)
- /* ISP */
- fimc_is_disable(dev, "gate_isp_sysmmu");
- fimc_is_disable(dev, "gate_isp_ppmu");
- fimc_is_disable(dev, "gate_isp_bts");
- fimc_is_disable(dev, "gate_isp_cam");
- fimc_is_disable(dev, "gate_isp_isp");
- fimc_is_disable(dev, "gate_isp_vra");
- fimc_is_disable(dev, "pxmxdx_isp_isp");
- fimc_is_disable(dev, "pxmxdx_isp_cam");
- fimc_is_disable(dev, "pxmxdx_isp_vra");
-#endif
-
return ret;
}
/* #define ENABLE_DNR_IN_TPU */
/*#define ENABLE_DNR_IN_MCSC */
#define ENABLE_TNR
+#define NUM_OF_TNR_BUF 4 /* dual(2) & double buffering(2) */
#define ENABLE_10BIT_MCSC
#define ENABLE_DJAG_IN_MCSC
#define ENABLE_VRA
#define MULTI_SHOT_TASKLET
/* #define ENABLE_EARLY_SHOT */
-#if defined(USE_I2C_LOCK) && !defined(CONFIG_VENDER_PSV)
+#if defined(USE_I2C_LOCK)
#define I2C_MUTEX_LOCK(lock) mutex_lock(lock)
#define I2C_MUTEX_UNLOCK(lock) mutex_unlock(lock)
#else
#define MCSC_OUTPUT_SSB (0xF) /* This number has no special meaning. */
#define MCSC_USE_DEJAG_TUNING_PARAM (true)
+#define MCSC_SETFILE_VERSION (0x14027431)
+#define MCSC_DJAG_IN_VIDEO_MODE (DEV_HW_MCSC0)
+#define MCSC_DJAG_IN_CAPTURE_MODE (DEV_HW_MCSC1)
+#define MCSC_CAC_IN_VIDEO_MODE (DEV_HW_MCSC0)
+#define MCSC_CAC_IN_CAPTURE_MODE (DEV_HW_MCSC1)
enum mc_scaler_interrupt_map {
INTR_MC_SCALER_FRAME_END = 0,
/* #define ENABLE_DIS */
/* #define ENABLE_DNR_IN_TPU */
#define ENABLE_DNR_IN_MCSC
+#define USE_DNR_YIC_MODE_ALWAYS
#define ENABLE_10BIT_MCSC
/* #define ENABLE_DJAG_IN_MCSC */
#define ENABLE_VRA
-/* #define ENABLE_REPROCESSING_FD */
+#define ENABLE_VRA_FDONE_WITH_CALLBACK
#define ENABLE_VRA_CHANGE_SETFILE_PARSING
#define ENABLE_HYBRID_FD
+#define ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
#define USE_ONE_BINARY
#define USE_RTA_BINARY
/* #define ENABLE_FULLCHAIN_OVERFLOW_RECOVERY */
+#undef OVERFLOW_PANIC_ENABLE_CSIS
+
#if defined(ENABLE_FULLCHAIN_OVERFLOW_RECOVERY)
#undef OVERFLOW_PANIC_ENABLE_ISCHAIN
#endif
#define USE_3AA_CROP_AFTER_BDS
/* #define ENABLE_ULTRA_FAST_SHOT */
+#define ENABLE_FAST_AF_TRIGGER
#define ENABLE_HWFC
/* #define FW_SUSPEND_RESUME */
/* #define TPU_COMPRESSOR */
#define USE_I2C_LOCK
#undef ENABLE_FULL_BYPASS
#define SENSOR_REQUEST_DELAY 2
-#define ENABLE_REMOSAIC_CAPTURE
#define ENABLE_SENSOR_VC_FUNCTION
#ifdef ENABLE_IRQ_MULTI_TARGET
#define MULTI_SHOT_TASKLET
/* #define ENABLE_EARLY_SHOT */
-#if defined(USE_I2C_LOCK) && !defined(CONFIG_VENDER_PSV)
+#if defined(USE_I2C_LOCK)
#define I2C_MUTEX_LOCK(lock) mutex_lock(lock)
#define I2C_MUTEX_UNLOCK(lock) mutex_unlock(lock)
#else
/* HACK */
#define DISABLE_CHECK_PERFRAME_FMT_SIZE
-/* #define BDS_DVFS */
+#define BDS_DVFS
#define ENABLE_HW_FAST_READ_OUT
#define FULL_OTF_TAIL_GROUP_ID GROUP_ID_MCS0
#define INIT_AWB_COUNT_REAR (3)
#define INIT_AWB_COUNT_FRONT (7)
+/* sensor module use_work option */
+#define USE_OIS_INIT_WORK
+#define USE_PRE_FLASH_FIRE_WORK
+
+#define FLASH_CAL_DATA_ENABLE
+
#endif
* [1] I_PAFSTAT_CORE0_IN_CSIS1_EN
* [0] I_PAFSTAT_CORE0_IN_CSIS0_EN
*/
-#define MUX_SET_VAL_DEFAULT (0x00402077)
+#define MUX_SET_VAL_DEFAULT (0x005820FF)
#define MUX_CLR_VAL_DEFAULT (0x007FFFFF)
/* Define default subdev ops if there are not used subdev IP */
case GROUP_ID_ISP1:
case GROUP_ID_MCS0:
case GROUP_ID_MCS1:
- leader->constraints_width = 5376;
+ leader->constraints_width = 5760;
leader->constraints_height = 4320;
break;
case GROUP_ID_VRA0:
int fimc_is_hw_camif_cfg(void *sensor_data)
{
int ret = 0;
- int i;
unsigned long value = 0;
struct fimc_is_core *core;
struct fimc_is_device_sensor *sensor;
struct fimc_is_device_csi *csi;
struct fimc_is_device_ischain *ischain;
+ struct exynos_platform_fimc_is_sensor *pdata;
u32 paf_ch = 0;
u32 csi_ch = 0;
u32 mux_set_val = MUX_SET_VAL_DEFAULT;
u32 mux_clr_val = MUX_CLR_VAL_DEFAULT;
- u32 position;
unsigned long mux_backup_val = 0;
+ u32 multi_ch;
+ int i;
FIMC_BUG(!sensor_data);
- core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
- if (!core)
+ sensor = (struct fimc_is_device_sensor *)sensor_data;
+
+ pdata = sensor->pdata;
+ if (!pdata)
goto p_err;
- sensor = (struct fimc_is_device_sensor *)sensor_data;
+ core = sensor->private_data;
+ if (!core)
+ goto p_err;
ischain = sensor->ischain;
if (!ischain)
}
csi_ch = csi->instance;
- if (csi_ch > CSI_ID_MAX) {
+ if (csi_ch >= CSI_ID_MAX) {
merr("CSI channel is invalid(%d)\n", sensor, csi_ch);
ret = -ERANGE;
goto p_err;
}
+ /* default PIP set by DT */
+ multi_ch = pdata->multi_ch;
+ if (pdata->camif_mux_val)
+ mux_set_val = pdata->camif_mux_val;
+
+ for (i = 0; i < FIMC_IS_SENSOR_COUNT; i++) {
+ if (test_bit(FIMC_IS_SENSOR_OPEN, &(core->sensor[i].state))
+ && core->sensor[i].instance != sensor->instance) {
+ csi = (struct fimc_is_device_csi *)v4l2_get_subdevdata(core->sensor[i].subdev_csi);
+ if (!csi) {
+ merr("csi is null\n", sensor);
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ multi_ch = csi->instance;
+ if (multi_ch >= CSI_ID_MAX) {
+ merr("CSI channel is invalid(%d)\n", sensor, multi_ch);
+ ret = -ERANGE;
+ goto p_err;
+ }
+ break;
+ }
+ }
+ minfo("csi_ch(%d), multi_ch(%d) will be set\n", sensor, csi_ch, multi_ch);
+
mutex_lock(&ischain->resourcemgr->sysreg_lock);
/* read previous value */
case 0:
mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
&sysreg_cam_fields[SYSREG_CAM_F_MUX_3AA0_VAL], csi_ch);
-
- for (i = 0; i < FIMC_IS_SENSOR_COUNT; i++) {
- if (test_bit(FIMC_IS_SENSOR_OPEN, &(core->sensor[i].state))) {
- position = core->sensor[i].position;
-
- if (position == SENSOR_POSITION_REAR2) {
- mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
- &sysreg_cam_fields[SYSREG_CAM_F_MUX_3AA1_VAL], ((csi_ch == 0) ? 2 : 0));
- break;
- } else if (position == SENSOR_POSITION_FRONT) {
- mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
- &sysreg_cam_fields[SYSREG_CAM_F_MUX_3AA1_VAL], ((csi_ch == 0) ? 1 : 0));
- break;
- }
- }
- }
+ mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
+ &sysreg_cam_fields[SYSREG_CAM_F_MUX_3AA1_VAL], multi_ch);
break;
case 1:
mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
- &sysreg_cam_fields[SYSREG_CAM_F_MUX_3AA0_VAL], ((csi_ch == 0) ? 1 : 0));
+ &sysreg_cam_fields[SYSREG_CAM_F_MUX_3AA0_VAL], multi_ch);
mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
&sysreg_cam_fields[SYSREG_CAM_F_MUX_3AA1_VAL], csi_ch);
break;
ret = -ERANGE;
goto p_err_lock;
}
+
+ /* DPHY to CSIS MUX */
+ mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
+ &sysreg_cam_fields[SYSREG_CAM_F_CSIS0_DPHY_S_MUXSEL], (pdata->csi_mux >> 0) & 0x1);
+ mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
+ &sysreg_cam_fields[SYSREG_CAM_F_CSIS1_DPHY_S_MUXSEL], (pdata->csi_mux >> 1) & 0x1);
+ mux_set_val = fimc_is_hw_set_field_value(mux_set_val,
+ &sysreg_cam_fields[SYSREG_CAM_F_CSIS2_DPHY_S_MUXSEL], (pdata->csi_mux >> 2) & 0x1);
+
minfo("CSI(%d) --> PAFSTAT(%d), mux(0x%08X), backup(0x%08lX)\n",
sensor, csi_ch, paf_ch, mux_set_val, mux_backup_val);
int fimc_is_hw_ischain_cfg(void *ischain_data)
{
int ret = 0;
- /* TBD */
+ void __iomem *isp_axi2acel_reg;
+
+ isp_axi2acel_reg = ioremap_nocache(ISP_AXI2ACEL_EXT_ISP_CTRL_ADDR, SZ_4);
+
+ /* SYSREG_ISP - AXI2ACEL_EXT_ISP_CTRL
+ * [5] : AXI2ACEL_ISO1_I_EXT_WLU_EN
+ * [4:3]: AXI2ACEL_ISO1_I_EXT_DOMAIN
+ * [2] : AXI2ACEL_ISO0_I_EXT_WLU_EN
+ * [1:0]: AXI2ACEL_ISO0_I_EXT_DOMAIN
+ */
+ writel(0x5, isp_axi2acel_reg);
+
+ iounmap(isp_axi2acel_reg);
return ret;
}
unsigned int get_dma(struct fimc_is_device_sensor *device, u32 *dma_ch)
{
struct fimc_is_core *core;
+ struct fimc_is_device_csi *csi;
u32 open_sensor_count = 0;
u32 position;
int i;
for (i = 0; i < FIMC_IS_SENSOR_COUNT; i++) {
if (test_bit(FIMC_IS_SENSOR_OPEN, &(core->sensor[i].state))) {
open_sensor_count++;
- position = device->position;
+ position = core->sensor[i].position;
+
+ csi = (struct fimc_is_device_csi *)v4l2_get_subdevdata(core->sensor[i].subdev_csi);
+ if (!csi) {
+ merr("csi is null\n", device);
+ ret = -ENODEV;
+ goto p_err;
+ }
+ if (csi->instance > CSI_ID_MAX) {
+ merr("CSI channel is invalid(%d)\n", device, csi->instance);
+ ret = -ERANGE;
+ goto p_err;
+ }
+
switch (position) {
case SENSOR_POSITION_REAR:
- *dma_ch |= 1 << 0;
- *dma_ch |= 1 << 4;
- break;
case SENSOR_POSITION_FRONT:
- *dma_ch |= 1 << 1;
- break;
case SENSOR_POSITION_REAR2:
- *dma_ch |= 1 << 2;
+ case SENSOR_POSITION_REAR3:
+ *dma_ch |= 1 << csi->instance;
break;
case SENSOR_POSITION_SECURE:
- *dma_ch |= 1 << 3;
- break;
default:
err("invalid sensor(%d)", position);
ret = -EINVAL;
#define IORESOURCE_PAF_CORE 7
#define IORESOURCE_PAF_RDMA 8
-#define FIMC_IS_RESERVE_LIB_SIZE (0x01100000) /* 17MB */
+#define FIMC_IS_RESERVE_LIB_SIZE (0x00010000) /* 64KB, not used */
#define FIMC_IS_TAAISP_SIZE (0x00500000) /* 5MB */
#define FIMC_IS_VRA_SIZE (0x00800000) /* 8MB */
#define SYSREG_CAM_BASE_ADDR 0x14510000
#define SYSREG_ISP_BASE_ADDR 0x14710000
#define SYSREG_ISP_LHM_ATB_GLUE_ADDR 0x14710900
+#define ISP_AXI2ACEL_EXT_ISP_CTRL_ADDR (SYSREG_ISP_BASE_ADDR + 0x0700)
#define CSIS0_QCH_EN_ADDR 0x14400004
#define CSIS1_QCH_EN_ADDR 0x14410004
ID_TPU_0 = 4,
ID_TPU_1 = 5,
ID_DCP = 6,
+ ID_VPP = 7, /* ID_3AA_2 */
ID_3AAISP_MAX
};
#define MCSC_INTR_MASK (0x0030007C)
#define USE_DMA_BUFFER_INDEX (0) /* 0 ~ 7 */
#define MCSC_PRECISION (20)
-#define MCSC_POLY_RATIO_UP (10)
+#define MCSC_POLY_RATIO_UP (16)
#define MCSC_POLY_RATIO_DOWN (16)
#define MCSC_POST_RATIO_DOWN (16)
/* #define MCSC_POST_WA */
#define MAX_MCSC_DNR_HEIGHT (4320)
#define MAX_MCSC_DNR_NUM_BUFFER (2)
+#ifdef USE_DNR_YIC_MODE_ALWAYS
+#define MCSC_DNR_WIDTH (((((MAX_MCSC_DNR_WIDTH) * 2 + 32) / 32) + ((MAX_MCSC_DNR_WIDTH) / 2)) * 2)
+#define MCSC_DNR_HEIGHT (MAX_MCSC_DNR_HEIGHT / 2)
+#else
#define MCSC_DNR_WIDTH (MAX_MCSC_DNR_WIDTH)
#define MCSC_DNR_HEIGHT (MAX_MCSC_DNR_HEIGHT)
+#endif
+
#define FIMC_IS_MCSC_DNR_SIZE ALIGN(MCSC_DNR_WIDTH * MCSC_DNR_HEIGHT * 2 \
* MAX_MCSC_DNR_NUM_BUFFER, 16)
#define MCSC_DNR_USE_INTERNAL_BUF (true)
#define MCSC_DNR_OUTPUT_INDEX (0)
#define MCSC_DNR_USE_TUNING (true)
+#define MCSC_SETFILE_VERSION (0x14027431)
+#define MCSC_DJAG_IN_VIDEO_MODE (DEV_HW_MCSC0)
+#define MCSC_DJAG_IN_CAPTURE_MODE (DEV_HW_MCSC1)
+#define MCSC_CAC_IN_VIDEO_MODE (DEV_HW_MCSC0)
+#define MCSC_CAC_IN_CAPTURE_MODE (DEV_HW_MCSC1)
enum mc_scaler_interrupt_map {
INTR_MC_SCALER_FRAME_END = 0,
DECLARE_DVFS_DT(FIMC_IS_SN_END,
{"default_", FIMC_IS_SN_DEFAULT},
{"secure_front_", FIMC_IS_SN_SECURE_FRONT},
- {"front_preview_", FIMC_IS_SN_FRONT_PREVIEW},
{"front_preview_full_", FIMC_IS_SN_FRONT_PREVIEW_FULL},
+ {"front_preview_uhd_", FIMC_IS_SN_FRONT_PREVIEW_UHD},
+ {"front_preview_", FIMC_IS_SN_FRONT_PREVIEW},
{"front_capture_", FIMC_IS_SN_FRONT_CAPTURE},
{"front_video_", FIMC_IS_SN_FRONT_CAMCORDING},
{"front_video_capture_", FIMC_IS_SN_FRONT_CAMCORDING_CAPTURE},
{"front_vt1_", FIMC_IS_SN_FRONT_VT1},
{"front_vt2_", FIMC_IS_SN_FRONT_VT2},
{"front_vt4_", FIMC_IS_SN_FRONT_VT4},
+ {"front_video_high_speed_60fps_", FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_60FPS},
+ {"front_video_high_speed_120fps_", FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_120FPS},
+ {"front_video_high_speed_240fps_", FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_240FPS},
{"rear2_preview_fhd_", FIMC_IS_SN_REAR2_PREVIEW_FHD},
{"rear2_capture_", FIMC_IS_SN_REAR2_CAPTURE},
{"rear2_video_fhd_", FIMC_IS_SN_REAR2_CAMCORDING_FHD},
{"rear2_video_fhd_capture_", FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE},
+ {"rear3_preview_", FIMC_IS_SN_REAR3_PREVIEW},
+ {"rear3_capture_", FIMC_IS_SN_REAR3_CAPTURE},
+ {"rear3_video_", FIMC_IS_SN_REAR3_CAMCORDING},
+ {"rear3_video_high_speed_60fps_", FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS},
+ {"rear3_video_high_speed_120fps_", FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS},
+ {"rear3_video_fhd_capture_", FIMC_IS_SN_REAR3_CAMCORDING_FHD_CAPTURE},
+ {"rear3_video_hd_capture_", FIMC_IS_SN_REAR3_CAMCORDING_HD_CAPTURE},
{"rear_preview_full_", FIMC_IS_SN_REAR_PREVIEW_FULL},
{"rear_preview_fhd_", FIMC_IS_SN_REAR_PREVIEW_FHD},
{"rear_preview_hd_", FIMC_IS_SN_REAR_PREVIEW_HD},
{"rear_video_fhd_capture_", FIMC_IS_SN_REAR_CAMCORDING_FHD_CAPTURE},
{"rear_video_hd_capture_", FIMC_IS_SN_REAR_CAMCORDING_HD_CAPTURE},
{"rear_video_uhd_capture_", FIMC_IS_SN_REAR_CAMCORDING_UHD_CAPTURE},
+ {"rear_video_high_speed_60fps_", FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS},
+ {"rear_video_high_speed_120fps_", FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS},
+ {"rear_video_high_speed_240fps_", FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_240FPS},
{"dual_preview_", FIMC_IS_SN_DUAL_PREVIEW},
{"dual_capture_", FIMC_IS_SN_DUAL_CAPTURE},
{"dual_video_fhd_", FIMC_IS_SN_DUAL_FHD_CAMCORDING},
{"pip_preview_", FIMC_IS_SN_PIP_PREVIEW},
{"pip_capture_", FIMC_IS_SN_PIP_CAPTURE},
{"preview_high_speed_fps_", FIMC_IS_SN_PREVIEW_HIGH_SPEED_FPS},
- {"video_high_speed_60fps_", FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS},
- {"video_high_speed_120fps_", FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS},
{"video_high_speed_480fps_", FIMC_IS_SN_VIDEO_HIGH_SPEED_480FPS},
{"video_high_speed_60fps_capture_", FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS_CAPTURE},
{"ext_rear_", FIMC_IS_SN_EXT_REAR},
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_SECURE_FRONT);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW_FULL);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW_UHD);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_CAPTURE);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_CAMCORDING);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VT1);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VT2);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VT4);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_60FPS);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_120FPS);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_240FPS);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_PREVIEW_FHD);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAPTURE);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAMCORDING_FHD);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_PREVIEW);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAPTURE);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAMCORDING);
+
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_PREVIEW_FULL);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_PREVIEW_FHD);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_PREVIEW_HD);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_CAMCORDING_FHD_CAPTURE);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_CAMCORDING_HD_CAPTURE);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_CAMCORDING_UHD_CAPTURE);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS);
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_240FPS);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_PREVIEW);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_CAPTURE);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_PIP_CAPTURE);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_PREVIEW_HIGH_SPEED_FPS);
-DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS);
-DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_480FPS);
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS_CAPTURE);
}, {
.scenario_id = FIMC_IS_SN_SECURE_FRONT,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_SECURE_FRONT),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_SECURE_FRONT),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_SECURE_FRONT),
+ }, {
+ .scenario_id = FIMC_IS_SN_DUAL_SYNC_FHD_CAMCORDING,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_FHD_CAMCORDING),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_FHD_CAMCORDING),
+ }, {
+ .scenario_id = FIMC_IS_SN_DUAL_SYNC_UHD_CAMCORDING,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_UHD_CAMCORDING),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_UHD_CAMCORDING),
+ }, {
+ .scenario_id = FIMC_IS_SN_DUAL_SYNC_PREVIEW,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_PREVIEW),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_PREVIEW),
+ }, {
+ .scenario_id = FIMC_IS_SN_DUAL_SYNC_PREVIEW_WHD,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_PREVIEW_WHD),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_PREVIEW_WHD),
+ }, {
+ .scenario_id = FIMC_IS_SN_DUAL_FHD_CAMCORDING,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_FHD_CAMCORDING),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_FHD_CAMCORDING),
+ }, {
+ .scenario_id = FIMC_IS_SN_DUAL_UHD_CAMCORDING,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_UHD_CAMCORDING),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_UHD_CAMCORDING),
+ }, {
+ .scenario_id = FIMC_IS_SN_DUAL_PREVIEW,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_PREVIEW),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_PREVIEW),
+ }, {
+ .scenario_id = FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS),
}, {
- .scenario_id = FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS),
+ .scenario_id = FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS),
}, {
- .scenario_id = FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS),
+ .scenario_id = FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_240FPS,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_240FPS),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_240FPS),
}, {
.scenario_id = FIMC_IS_SN_VIDEO_HIGH_SPEED_480FPS,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_VIDEO_HIGH_SPEED_480FPS),
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR2_PREVIEW_FHD),
.check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_PREVIEW_FHD),
}, {
- .scenario_id = FIMC_IS_SN_DUAL_SYNC_FHD_CAMCORDING,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_FHD_CAMCORDING),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_FHD_CAMCORDING),
- }, {
- .scenario_id = FIMC_IS_SN_DUAL_SYNC_UHD_CAMCORDING,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_UHD_CAMCORDING),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_UHD_CAMCORDING),
- }, {
- .scenario_id = FIMC_IS_SN_DUAL_SYNC_PREVIEW,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_PREVIEW),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_PREVIEW),
- }, {
- .scenario_id = FIMC_IS_SN_DUAL_SYNC_PREVIEW_WHD,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_SYNC_PREVIEW_WHD),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_SYNC_PREVIEW_WHD),
- }, {
- .scenario_id = FIMC_IS_SN_DUAL_FHD_CAMCORDING,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_FHD_CAMCORDING),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_FHD_CAMCORDING),
+ .scenario_id = FIMC_IS_SN_REAR3_PREVIEW,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR3_PREVIEW),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_PREVIEW),
}, {
- .scenario_id = FIMC_IS_SN_DUAL_UHD_CAMCORDING,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_UHD_CAMCORDING),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_UHD_CAMCORDING),
- }, {
- .scenario_id = FIMC_IS_SN_DUAL_PREVIEW,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_DUAL_PREVIEW),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_DUAL_PREVIEW),
+ .scenario_id = FIMC_IS_SN_REAR3_CAMCORDING,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR3_CAMCORDING),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAMCORDING),
}, {
.scenario_id = FIMC_IS_SN_PIP_PREVIEW,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_PIP_PREVIEW),
.scenario_id = FIMC_IS_SN_FRONT_VT4,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_VT4),
.check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VT4),
+ }, {
+ .scenario_id = FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_60FPS,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_60FPS),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_60FPS),
+ }, {
+ .scenario_id = FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_120FPS,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_120FPS),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_120FPS),
+ }, {
+ .scenario_id = FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_240FPS,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_240FPS),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_240FPS),
}, {
.scenario_id = FIMC_IS_SN_FRONT_CAMCORDING,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_CAMCORDING),
.check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_CAMCORDING),
}, {
- .scenario_id = FIMC_IS_SN_FRONT_PREVIEW_FULL,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_PREVIEW_FULL),
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW_FULL),
+ .scenario_id = FIMC_IS_SN_FRONT_PREVIEW_UHD,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_PREVIEW_UHD),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW_UHD),
}, {
.scenario_id = FIMC_IS_SN_FRONT_PREVIEW,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_PREVIEW),
.check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW),
+ }, {
+ .scenario_id = FIMC_IS_SN_FRONT_PREVIEW_FULL,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_PREVIEW_FULL),
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW_FULL),
}, {
.scenario_id = FIMC_IS_SN_FRONT_WIDE_SELFIE,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_WIDE_SELFIE),
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_PIP_CAPTURE),
.keep_frame_tick = FIMC_IS_DVFS_DUAL_CAPTURE_TICK,
.check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_PIP_CAPTURE),
+ }, {
+ .scenario_id = FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE),
+ .keep_frame_tick = FIMC_IS_DVFS_CAPTURE_TICK,
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE),
+ }, {
+ .scenario_id = FIMC_IS_SN_REAR2_CAPTURE,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR2_CAPTURE),
+ .keep_frame_tick = FIMC_IS_DVFS_CAPTURE_TICK,
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAPTURE),
+ }, {
+ .scenario_id = FIMC_IS_SN_REAR3_CAPTURE,
+ .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR3_CAPTURE),
+ .keep_frame_tick = FIMC_IS_DVFS_CAPTURE_TICK,
+ .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAPTURE),
}, {
.scenario_id = FIMC_IS_SN_REAR_CAMCORDING_HD_CAPTURE,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR_CAMCORDING_HD_CAPTURE),
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_CAMCORDING_CAPTURE),
.keep_frame_tick = FIMC_IS_DVFS_CAPTURE_TICK,
.check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_CAMCORDING_CAPTURE),
- }, {
- .scenario_id = FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE),
- .keep_frame_tick = FIMC_IS_DVFS_CAPTURE_TICK,
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE),
- }, {
- .scenario_id = FIMC_IS_SN_REAR2_CAPTURE,
- .scenario_nm = DVFS_SN_STR(FIMC_IS_SN_REAR2_CAPTURE),
- .keep_frame_tick = FIMC_IS_DVFS_CAPTURE_TICK,
- .check_func = GET_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAPTURE),
}, {
.scenario_id = FIMC_IS_SN_FRONT_CAPTURE,
.scenario_nm = DVFS_SN_STR(FIMC_IS_SN_FRONT_CAPTURE),
return 0;
}
-/* 60fps recording */
-DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS)
+/* rear 60fps recording */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS)
{
u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
bool setfile_flag = (mask == ISS_SUB_SCENARIO_FHD_60FPS);
- if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2) &&
+ if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2 || position == SENSOR_POSITION_REAR3) &&
(fps >= 60) &&
(fps < 120) && setfile_flag)
return 1;
return 0;
}
-/* 120fps recording */
-DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS)
+/* rear 120fps recording */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS)
{
u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
bool setfile_flag = (mask == ISS_SUB_SCENARIO_VIDEO_HIGH_SPEED);
- if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2) &&
+ if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2 || position == SENSOR_POSITION_REAR3) &&
+ (fps > 60) &&
+ (fps <= 120) &&
+ setfile_flag)
+ return 1;
+ else
+ return 0;
+}
+
+/* rear 240fps recording */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_240FPS)
+{
+ u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
+ bool setfile_flag = (mask == ISS_SUB_SCENARIO_FHD_240FPS);
+
+ if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2 || position == SENSOR_POSITION_REAR3) &&
+ (fps >= 240) &&
+ setfile_flag)
+ return 1;
+ else
+ return 0;
+}
+
+/* front 60fps recording */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_60FPS)
+{
+ u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
+ bool setfile_flag = (mask == ISS_SUB_SCENARIO_FHD_60FPS);
+
+ if ((position == SENSOR_POSITION_FRONT) &&
+ (fps >= 60) &&
+ (fps < 120) && setfile_flag)
+ return 1;
+ else
+ return 0;
+}
+
+/* front 120fps recording */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_120FPS)
+{
+ u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
+ bool setfile_flag = (mask == ISS_SUB_SCENARIO_VIDEO_HIGH_SPEED);
+
+ if ((position == SENSOR_POSITION_FRONT) &&
(fps > 60) &&
(fps <= 120) &&
setfile_flag)
return 0;
}
+/* front 240fps recording */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_240FPS)
+{
+ u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
+ bool setfile_flag = (mask == ISS_SUB_SCENARIO_FHD_240FPS);
+
+ if ((position == SENSOR_POSITION_FRONT) &&
+ (fps >= 240) &&
+ setfile_flag)
+ return 1;
+ else
+ return 0;
+}
+
/* 480fps recording */
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_480FPS)
{
u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
bool setfile_flag = (mask == ISS_SUB_SCENARIO_FHD_240FPS);
- if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2) &&
+ if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2 || position == SENSOR_POSITION_REAR3) &&
(fps >= 480) && setfile_flag)
return 1;
else
return 0;
}
-/* front vt1 */
-DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VT1)
-{
- if ((position == SENSOR_POSITION_FRONT) &&
- ((device->setfile & FIMC_IS_SETFILE_MASK) \
- == ISS_SUB_SCENARIO_FRONT_VT1))
- return 1;
- else
- return 0;
-}
-
/* rear2 preview FHD */
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_PREVIEW_FHD)
{
return 0;
}
+/* REAR3 preview */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_PREVIEW)
+{
+ u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
+ bool setfile_flag = ((mask == ISS_SUB_SCENARIO_VIDEO) ||
+ (mask == ISS_SUB_SCENARIO_VIDEO_WDR_ON) ||
+ (mask == ISS_SUB_SCENARIO_VIDEO_WDR_AUTO));
+
+ if ((position == SENSOR_POSITION_REAR3) &&
+ (fps <= 30) &&
+ (!setfile_flag))
+
+ return 1;
+ else
+ return 0;
+}
+
+/* REAR3 capture */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAPTURE)
+{
+ if ((position == SENSOR_POSITION_REAR3) &&
+ test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)
+ )
+ return 1;
+ else
+ return 0;
+}
+
+/* REAR3 camcording*/
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAMCORDING)
+{
+ u32 mask = (device->setfile & FIMC_IS_SETFILE_MASK);
+ bool setfile_flag = ((mask == ISS_SUB_SCENARIO_VIDEO) ||
+ (mask == ISS_SUB_SCENARIO_VIDEO_WDR_ON) ||
+ (mask == ISS_SUB_SCENARIO_VIDEO_WDR_AUTO));
+
+ if ((position == SENSOR_POSITION_REAR3) &&
+ (fps <= 30) &&
+ setfile_flag)
+ return 1;
+ else
+ return 0;
+}
+
+/* REAR3 camcording capture */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAMCORDING_HD_CAPTURE)
+{
+ struct fimc_is_dvfs_scenario_ctrl *static_ctrl = device->resourcemgr->dvfs_ctrl.static_ctrl;
+
+ if ((position == SENSOR_POSITION_REAR3) &&
+ test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state) &&
+ (static_ctrl->cur_scenario_id == FIMC_IS_SN_REAR3_CAMCORDING)
+ )
+ return 1;
+ else
+ return 0;
+}
+
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR3_CAMCORDING_FHD_CAPTURE)
+{
+ struct fimc_is_dvfs_scenario_ctrl *static_ctrl = device->resourcemgr->dvfs_ctrl.static_ctrl;
+
+ if ((position == SENSOR_POSITION_REAR3) &&
+ test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state) &&
+ (static_ctrl->cur_scenario_id == FIMC_IS_SN_REAR3_CAMCORDING)
+ )
+ return 1;
+ else
+ return 0;
+}
+
+
+/* front vt1 */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VT1)
+{
+ if ((position == SENSOR_POSITION_FRONT) &&
+ ((device->setfile & FIMC_IS_SETFILE_MASK) \
+ == ISS_SUB_SCENARIO_FRONT_VT1))
+ return 1;
+ else
+ return 0;
+}
+
/* front vt2 */
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_VT2)
{
return 0;
}
+/* front preview UHD */
+DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW_UHD)
+{
+ if ((position == SENSOR_POSITION_FRONT) && (resol >= SIZE_12MP_UHD_BDS))
+ return 1;
+ else
+ return 0;
+}
+
/* front preview */
DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW)
{
- if (position == SENSOR_POSITION_FRONT)
+ if ((position == SENSOR_POSITION_FRONT) && (resol < SIZE_12MP_UHD_BDS))
return 1;
else
return 0;
{
struct fimc_is_dvfs_scenario_ctrl *static_ctrl = device->resourcemgr->dvfs_ctrl.static_ctrl;
- if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2) &&
+ if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2 || position == SENSOR_POSITION_REAR3) &&
test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state) &&
(static_ctrl->cur_scenario_id == FIMC_IS_SN_REAR_CAMCORDING_HD)
)
{
struct fimc_is_dvfs_scenario_ctrl *static_ctrl = device->resourcemgr->dvfs_ctrl.static_ctrl;
- if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2) &&
+ if ((position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2 || position == SENSOR_POSITION_REAR3) &&
test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state) &&
(static_ctrl->cur_scenario_id == FIMC_IS_SN_REAR_CAMCORDING_UHD)
)
if ((position == SENSOR_POSITION_REAR) &&
test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state) &&
- (static_ctrl->cur_scenario_id == FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS)
+ (static_ctrl->cur_scenario_id == FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS)
)
return 1;
else
DECLARE_EXT_DVFS_CHK_FUNC(FIMC_IS_SN_EXT_REAR)
{
- if (position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2)
+ if (position == SENSOR_POSITION_REAR || position == SENSOR_POSITION_REAR2 || position == SENSOR_POSITION_REAR3)
return 1;
else
return 0;
/* dvfs table idx ex.different dvfa table pure bayer or dynamic bayer */
#define FIMC_IS_DVFS_TABLE_IDX_MAX 3
-#define FIMC_IS_DVFS_CAPTURE_TICK (KEEP_FRAME_TICK_DEFAULT + 3)
+#define FIMC_IS_DVFS_CAPTURE_TICK (KEEP_FRAME_TICK_DEFAULT + 10)
#define FIMC_IS_DVFS_DUAL_CAPTURE_TICK (2 * FIMC_IS_DVFS_CAPTURE_TICK)
/* FIMC-IS DVFS SCENARIO enum */
enum FIMC_IS_SCENARIO_ID {
FIMC_IS_SN_DEFAULT,
FIMC_IS_SN_SECURE_FRONT,
- FIMC_IS_SN_FRONT_PREVIEW,
FIMC_IS_SN_FRONT_PREVIEW_FULL,
+ FIMC_IS_SN_FRONT_PREVIEW_UHD,
+ FIMC_IS_SN_FRONT_PREVIEW,
FIMC_IS_SN_FRONT_CAPTURE,
FIMC_IS_SN_FRONT_CAMCORDING,
FIMC_IS_SN_FRONT_CAMCORDING_CAPTURE,
FIMC_IS_SN_FRONT_VT1,
FIMC_IS_SN_FRONT_VT2,
FIMC_IS_SN_FRONT_VT4,
+ FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_60FPS,
+ FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_120FPS,
+ FIMC_IS_SN_FRONT_VIDEO_HIGH_SPEED_240FPS,
FIMC_IS_SN_REAR2_PREVIEW_FHD,
FIMC_IS_SN_REAR2_CAPTURE,
FIMC_IS_SN_REAR2_CAMCORDING_FHD,
FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE,
+ FIMC_IS_SN_REAR3_PREVIEW,
+ FIMC_IS_SN_REAR3_CAPTURE,
+ FIMC_IS_SN_REAR3_CAMCORDING,
+ FIMC_IS_SN_REAR3_CAMCORDING_FHD_CAPTURE,
+ FIMC_IS_SN_REAR3_CAMCORDING_HD_CAPTURE,
FIMC_IS_SN_REAR_PREVIEW_FHD,
FIMC_IS_SN_REAR_PREVIEW_HD,
FIMC_IS_SN_REAR_PREVIEW_UHD,
FIMC_IS_SN_REAR_CAMCORDING_FHD_CAPTURE,
FIMC_IS_SN_REAR_CAMCORDING_HD_CAPTURE,
FIMC_IS_SN_REAR_CAMCORDING_UHD_CAPTURE,
+ FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_60FPS,
+ FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_120FPS,
+ FIMC_IS_SN_REAR_VIDEO_HIGH_SPEED_240FPS,
FIMC_IS_SN_DUAL_PREVIEW,
FIMC_IS_SN_DUAL_CAPTURE,
FIMC_IS_SN_DUAL_FHD_CAMCORDING,
FIMC_IS_SN_PIP_CAMCORDING,
FIMC_IS_SN_PIP_CAMCORDING_CAPTURE,
FIMC_IS_SN_PREVIEW_HIGH_SPEED_FPS,
- FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS,
- FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS,
FIMC_IS_SN_VIDEO_HIGH_SPEED_480FPS,
FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS_CAPTURE,
FIMC_IS_SN_EXT_REAR,
DMA_INPUT_ERROR_NO = 0 /* DMA input setting is done */
};
+enum dma_input_orientation {
+ DMA_INPUT_ORIENTATION_NORMAL = 0,
+ DMA_INPUT_ORIENTATION_CCW = 1,
+ DMA_INPUT_ORIENTATION_CW = 2
+};
+
/* ---------------------- Output ----------------------------------- */
enum otf_output_crop {
OTF_OUTPUT_CROP_DISABLE = 0,
u32 msb; /* last bit of data in memory size */
u32 v_otf_enable;
u32 v_otf_token_line;
- u32 reserved[PARAMETER_MAX_MEMBER-19];
+ u32 orientation; /* 0: normal, 1: ccw: 2: cw */
+ u32 reserved[PARAMETER_MAX_MEMBER-20];
u32 err;
};
#endif
dma_input->bayer_crop_width = incrop->w;
dma_input->bayer_crop_height = incrop->h;
+ dma_input->orientation = DMA_INPUT_ORIENTATION_NORMAL;
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+ /* if rotation remosaic frame reprocessing is doing, set "CCW(1)" as default,
+ * TODO: get orientation value through interface if needed
+ */
+ if (test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)
+ && (frame && CHK_REMOSAIC_SCN(frame->shot->ctl.aa.sceneMode))) {
+ if (frame->shot_ext->remosaic_rotation)
+ dma_input->orientation = DMA_INPUT_ORIENTATION_CCW;
+ else
+ dma_input->orientation = DMA_INPUT_ORIENTATION_NORMAL;
+ msrinfo("DMA rotate(%d) for REMOSAIC\n", device, leader, frame, dma_input->orientation);
+ }
+#endif
*lindex |= LOWBIT_OF(PARAM_3AA_VDMA1_INPUT);
*hindex |= HIGHBIT_OF(PARAM_3AA_VDMA1_INPUT);
(*indexes)++;
if (!COMPARE_CROP(incrop, &inparm) ||
!COMPARE_CROP(otcrop, &otparm) ||
+ !atomic_read(&group->head->scount) ||
test_bit(FIMC_IS_SUBDEV_FORCE_SET, &leader->state)) {
ret = fimc_is_ischain_3aa_cfg(subdev,
device,
dma_input->bayer_crop_offset_y = 0;
dma_input->bayer_crop_width = width;
dma_input->bayer_crop_height = height;
+ dma_input->orientation = DMA_INPUT_ORIENTATION_NORMAL;
+#ifdef ENABLE_REMOSAIC_CAPTURE_WITH_ROTATION
+ /* if rotation remosaic frame reprocessing is doing, set "CCW(1)" as default,
+ * TODO: get orientation value through interface if needed
+ */
+ if (test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state)
+ && (frame && CHK_REMOSAIC_SCN(frame->shot->ctl.aa.sceneMode))) {
+ if (frame->shot_ext->remosaic_rotation)
+ dma_input->orientation = DMA_INPUT_ORIENTATION_CCW;
+ else
+ dma_input->orientation = DMA_INPUT_ORIENTATION_NORMAL;
+ msrinfo("DMA rotate(%d) for REMOSAIC\n", device, leader, frame, dma_input->orientation);
+ }
+#endif
*lindex |= LOWBIT_OF(PARAM_ISP_VDMA1_INPUT);
*hindex |= HIGHBIT_OF(PARAM_ISP_VDMA1_INPUT);
(*indexes)++;
*incrop = inparm;
if (!COMPARE_CROP(incrop, &inparm) ||
+ !atomic_read(&group->head->scount) ||
test_bit(FIMC_IS_SUBDEV_FORCE_SET, &leader->state)) {
ret = fimc_is_ischain_isp_cfg(subdev,
device,
return ret;
}
-#define MXP_RATIO_UP (10)
+#define MXP_RATIO_UP (16)
#define MXP_RATIO_DOWN (32)
static int fimc_is_ischain_mxp_adjust_crop(struct fimc_is_device_ischain *device,
queue->framecfg.bytesperline[1]), 16);
mcs_output->yuv_range = crange;
- mcs_output->flip = (u32)queue->framecfg.flip >> 1; /* Caution: change from bitwise to enum */
+
+ if (frame->shot_ext->mcsc_flip[index - PARAM_MCS_OUTPUT0] != mcs_output->flip) {
+ mdbg_pframe("flip is changed(%d->%d)\n",
+ device, subdev, frame,
+ mcs_output->flip,
+ frame->shot_ext->mcsc_flip[index - PARAM_MCS_OUTPUT0]);
+ mcs_output->flip = frame->shot_ext->mcsc_flip[index - PARAM_MCS_OUTPUT0];
+ }
#ifdef ENABLE_HWFC
if (test_bit(FIMC_IS_ISCHAIN_REPROCESSING, &device->state))
u32 pixelformat = 0;
u32 *target_addr;
bool change_pixelformat = false;
+ bool change_flip = false;
device = (struct fimc_is_device_ischain *)device_data;
pixelformat = node->pixelformat;
}
+ if (ldr_frame->shot_ext->mcsc_flip[index - PARAM_MCS_OUTPUT0] != mcs_output->flip)
+ change_flip = true;
+
inparm.x = mcs_output->crop_offset_x;
inparm.y = mcs_output->crop_offset_y;
inparm.w = mcs_output->crop_width;
if (!COMPARE_CROP(incrop, &inparm) ||
!COMPARE_CROP(otcrop, &otparm) ||
change_pixelformat ||
+ change_flip ||
!test_bit(FIMC_IS_SUBDEV_RUN, &subdev->state) ||
test_bit(FIMC_IS_SUBDEV_FORCE_SET, &leader->state)) {
ret = fimc_is_ischain_mxp_start(device,
otcrop->x, otcrop->y, otcrop->w, otcrop->h);
}
+ /* buf_tag should be set by unit of stride */
ret = fimc_is_ischain_buf_tag(device,
subdev,
ldr_frame,
pixelformat,
- otcrop->w,
+ mcs_output->dma_stride_y,
otcrop->h,
target_addr);
if (ret) {
source "drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pdp/Kconfig"
source "drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pafstat/Kconfig"
source "drivers/media/platform/exynos/fimc-is2/sensor/module_framework/aperture/Kconfig"
+source "drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/Kconfig"
endmenu
obj-$(CONFIG_CAMERA_FPGA_DPHY) += module_framework/dphy/
obj-y += module_framework/ois/
+obj-y += module_framework/eeprom/
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2/include
}
if (image->format.pixelformat == V4L2_PIX_FMT_SBGGR10 ||
- image->format.pixelformat == V4L2_PIX_FMT_SBGGR12)
+ image->format.pixelformat == V4L2_PIX_FMT_SBGGR12 ||
+ image->format.pixelformat == V4L2_PIX_FMT_PRIV_MAGIC)
dma_pack12 = CSIS_REG_DMA_PACK12;
else
dma_pack12 = CSIS_REG_DMA_NORMAL;
}
if (cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR10 ||
- cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR12)
+ cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR12 ||
+ cfg->format->pixelformat == V4L2_PIX_FMT_PRIV_MAGIC)
+
#else
if (image->format.pixelformat == V4L2_PIX_FMT_SBGGR10 ||
- image->format.pixelformat == V4L2_PIX_FMT_SBGGR12)
+ image->format.pixelformat == V4L2_PIX_FMT_SBGGR12 ||
+ image->format.pixelformat == V4L2_PIX_FMT_PRIV_MAGIC)
#endif
dma_pack12 = CSIS_REG_DMA_PACK12;
else
#include "fimc-is-hw-api-common.h"
#include "fimc-is-config.h"
+#include "fimc-is-core.h"
#include "fimc-is-type.h"
#include "fimc-is-regs.h"
#include "fimc-is-device-csi.h"
#include "fimc-is-hw.h"
#include "fimc-is-hw-csi-v5_1.h"
#include "fimc-is-device-sensor.h"
+#include <linux/clk.h>
void csi_hw_phy_otp_config(u32 __iomem *base_reg, u32 instance)
{
#endif
}
+int csi_set_ppc_mode(u32 width, u32 height, u32 frame_rate, u32 mipi_speed,
+ u32 lanes, const char *conid, u32 *pixel_mode)
+{
+ struct clk *target;
+ u32 target_clk;
+ u32 need_clk_by_rate;
+ u32 need_clk_by_speed;
+ int ret = 0;
+
+ target = clk_get(fimc_is_dev, conid);
+ if (IS_ERR_OR_NULL(target)) {
+ err("%s: can not get target: %s\n", __func__, conid);
+ return -EINVAL;
+ }
+
+ target_clk = clk_get_rate(target);
+ if (!target_clk) {
+ err("%s: clk value is zero: %s\n", __func__, conid);
+ return -EINVAL;
+ }
+
+ need_clk_by_rate = width * height * frame_rate;
+ need_clk_by_speed = mipi_speed * lanes / 10; /* TODO: only RAW10 format case */
+ info("need_clk (rate: %d)(speed: %d)\n", need_clk_by_rate, need_clk_by_speed);
+
+ /* 2ppc boundary check */
+ if (target_clk * 2 > need_clk_by_rate && target_clk * 2 > need_clk_by_speed) {
+ info("csi pixel mode is set 2ppc\n");
+ *pixel_mode = CSIS_PIXEL_MODE_DUAL;
+ } else {
+ info("csi pixel mode is set 4ppc, can not use wdma\n");
+ *pixel_mode = CSIS_PIXEL_MODE_QUAD;
+ }
+
+ return ret;
+}
+
int csi_hw_reset(u32 __iomem *base_reg)
{
int ret = 0;
return 0;
}
-#if !defined(CONFIG_VENDER_PSV)
int csi_hw_s_config(u32 __iomem *base_reg,
u32 vc, struct fimc_is_vci_config *config, u32 width, u32 height)
{
}
#if defined(CONFIG_SOC_EXYNOS9610)
- if (sensor_cfg->mipi_speed > 2000) {
- pixel_mode = CSIS_PIXEL_MODE_QUAD;
- info("%s: mipi_speed(%d), pixel_mode(%d)\n", __func__, sensor_cfg->mipi_speed, pixel_mode);
+ ret = csi_set_ppc_mode(sensor_cfg->width, sensor_cfg->height, sensor_cfg->framerate,
+ sensor_cfg->mipi_speed, sensor_cfg->lanes, "UMUX_CLKCMU_CAM_BUS", &pixel_mode);
+ if (ret) {
+ err("invalid set_ppc_mode\n");
+ goto p_err;
}
#endif
}
if (cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR10 ||
- cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR12)
+ cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR12 ||
+ cfg->format->pixelformat == V4L2_PIX_FMT_PRIV_MAGIC)
#else
if (image->format.pixelformat == V4L2_PIX_FMT_SBGGR10 ||
- image->format.pixelformat == V4L2_PIX_FMT_SBGGR12)
+ image->format.pixelformat == V4L2_PIX_FMT_SBGGR12 ||
+ image->format.pixelformat == V4L2_PIX_FMT_PRIV_MAGIC)
#endif
dma_pack12 = CSIS_REG_DMA_PACK12;
else
p_err:
return ret;
}
-#else /* CONFIG_VENDER_PSV: not operate function, just return */
-int csi_hw_s_config(u32 __iomem *base_reg,
- u32 vc, struct fimc_is_vci_config *config, u32 width, u32 height) { return 0; }
-int csi_hw_s_config_dma(u32 __iomem *base_reg,
- u32 vc, struct fimc_is_frame_cfg *cfg, u32 hwformat) { return 0; }
-#endif
int csi_hw_s_irq_msk(u32 __iomem *base_reg, bool on)
{
return frame_ptr;
}
-#if !defined(CONFIG_VENDER_PSV)
void csi_hw_s_dma_addr(u32 __iomem *base_reg, u32 vc, u32 number, u32 addr)
{
u32 i = 0;
val = fimc_is_hw_set_field_value(val, &csi_vcdma_fields[CSIS_F_DMA_N_UPDT_PTR_EN], enable);
fimc_is_hw_set_reg(base_reg, &csi_vcdma_regs[CSIS_R_DMA0_CTRL], val);
}
-#else /* CONFIG_VENDER_PSV */
-void csi_hw_s_dma_addr(u32 __iomem *base_reg, u32 vc, u32 number, u32 addr) { return; }
-void csi_hw_s_multibuf_dma_addr(u32 __iomem *base_reg, u32 vc, u32 number, u32 addr) { return; }
-void csi_hw_s_output_dma(u32 __iomem *base_reg, u32 vc, bool enable) { return; }
-#endif
bool csi_hw_g_output_dma_enable(u32 __iomem *base_reg, u32 vc)
{
return 0;
}
-#if !defined(CONFIG_VENDER_PSV)
#define GET_DMA_CH(x, y) ((x) & (1 << (y)))
int csi_hw_s_dma_common_dynamic(u32 __iomem *base_reg, size_t size, unsigned int dma_ch)
{
u32 sram0_split;
u32 sram1_split;
u32 max;
+ u32 matrix_num;
+ u32 dma_pri_0;
+ u32 dma_pri_1;
if (!base_reg)
return 0;
- /* Common DMA Arbitration Priority register */
- /* CSIS_DMA_F_DMA_ARB_PRI_1 : 1 = CSIS2 DMA has a high priority */
- /* CSIS_DMA_F_DMA_ARB_PRI_1 : 2 = CSIS3 DMA has a high priority */
- /* CSIS_DMA_F_DMA_ARB_PRI_0 : 1 = CSIS0 DMA has a high priority */
- /* CSIS_DMA_F_DMA_ARB_PRI_0 : 2 = CSIS1 DMA has a high priority */
- val = fimc_is_hw_get_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_ARB_PRI]);
- val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_ARB_PRI_1], 0x1);
- val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_ARB_PRI_0], 0x2);
- fimc_is_hw_set_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_ARB_PRI], val);
-
/* Common DMA Control register */
/* CSIS_DMA_F_IP_PROCESSING : 1 = Q-channel clock enable */
/* CSIS_DMA_F_IP_PROCESSING : 0 = Q-channel clock disable */
val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_IP_PROCESSING], 0x1);
fimc_is_hw_set_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_CTRL], val);
- /* Common DMA SRAM split register */
- /* CSIS_DMA_F_DMA_SRAM1_SPLIT : internal SRAM1 is 10KB (640 * 16 bytes) */
- /* CSIS_DMA_F_DMA_SRAM0_SPLIT : internal SRAM0 is 10KB (640 * 16 bytes) */
- /* This register can be set between 0 to 640 */
max = size / 16;
sram0_split = max / 2;
sram1_split = max / 2;
+ matrix_num = 0;
+ dma_pri_0 = 2;
+ dma_pri_1 = 1;
+#if defined(CONFIG_SOC_EXYNOS9810)
if (GET_DMA_CH(dma_ch, 0) && !GET_DMA_CH(dma_ch, 1))
sram0_split = max;
else if (!GET_DMA_CH(dma_ch, 0) && GET_DMA_CH(dma_ch, 1))
if (GET_DMA_CH(dma_ch, 4))
sram0_split = max;
+#elif defined(CONFIG_SOC_EXYNOS9610)
+ dma_pri_0 = 1;
+ dma_pri_1 = 1;
+
+ if (GET_DMA_CH(dma_ch, 0) && GET_DMA_CH(dma_ch, 1)) {
+ matrix_num = 0;
+ sram0_split = max;
+ sram1_split = max;
+ } else if (GET_DMA_CH(dma_ch, 0) && GET_DMA_CH(dma_ch, 2)) {
+ matrix_num = 0;
+ sram0_split = max;
+ sram1_split = max;
+ } else if (GET_DMA_CH(dma_ch, 0)) {
+ matrix_num = 0;
+ sram0_split = max;
+ sram1_split = max; /* Due to PAFSTAT stat DMA limitation, set DMA2 split to max */
+ } else if (GET_DMA_CH(dma_ch, 1)) {
+ dma_pri_0 = 2;
+ matrix_num = 2;
+ sram1_split = max;
+ } else if (GET_DMA_CH(dma_ch, 2)) {
+ matrix_num = 2;
+ sram1_split = 4; /* Rear2 uses a DMA3 as image out */
+ dma_pri_1 = 2;
+ } else if (GET_DMA_CH(dma_ch, 3)) {
+ dma_pri_1 = 2;
+ matrix_num = 17;
+ sram0_split = max;
+ } else {
+ warn("invalid dma_ch: can not split(%x)\n", dma_ch);
+ matrix_num = 0;
+ }
+#endif
+ /* Common DMA SRAM split register */
+ /* CSIS_DMA_F_DMA_SRAM1_SPLIT : internal SRAM1 is 10KB (640 * 16 bytes) */
+ /* CSIS_DMA_F_DMA_SRAM0_SPLIT : internal SRAM0 is 10KB (640 * 16 bytes) */
+ /* This register can be set between 0 to 640 */
+ info("selected sram_matrix: %d, sram0_split: %d, sram1_split: %d\n", matrix_num, sram0_split, sram1_split);
val = fimc_is_hw_get_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_SRAM_SPLIT]);
val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_SRAM1_SPLIT], sram1_split);
val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_SRAM0_SPLIT], sram0_split);
fimc_is_hw_set_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_SRAM_SPLIT], val);
+ /* Common DMA Arbitration Priority register */
+ /* CSIS_DMA_F_DMA_ARB_PRI_1 : 1 = CSIS2 DMA has a high priority */
+ /* CSIS_DMA_F_DMA_ARB_PRI_1 : 2 = CSIS3 DMA has a high priority */
+ /* CSIS_DMA_F_DMA_ARB_PRI_0 : 1 = CSIS0 DMA has a high priority */
+ /* CSIS_DMA_F_DMA_ARB_PRI_0 : 2 = CSIS1 DMA has a high priority */
+ info("DMA0_priority: %d, DMA1_priorty: %d", dma_pri_0, dma_pri_1);
+ val = fimc_is_hw_get_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_ARB_PRI]);
+ val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_ARB_PRI_0], dma_pri_0);
+ val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_ARB_PRI_1], dma_pri_1);
+ fimc_is_hw_set_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_ARB_PRI], val);
+
/* Common DMA Martix register */
/* CSIS_DMA_F_DMA_MATRIX : Under Table see */
/* CSIS0 CSIS1 CSIS2 CSIS3 */
- /* 0 : SRAM0_0 SRAM0_0 SRAM1_0 SRAM1_1 */
+ /* 0 : SRAM0_0 SRAM0_1 SRAM1_0 SRAM1_1 */
/* 2 : SRAM0_0 SRAM1_0 SRAM0_1 SRAM1_1 */
/* 5 : SRAM0_0 SRAM1_1 SRAM1_0 SRAM0_1 */
/* 14 : SRAM1_0 SRAM0_1 SRAM0_0 SRAM1_1 */
/* 22 : SRAM1_1 SRAM1_0 SRAM0_0 SRAM0_1 */
/* 23 : SRAM1_1 SRAM1_0 SRAM0_1 SRAM0_0 */
val = fimc_is_hw_get_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_MATRIX]);
- val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_MATRIX], 0x0);
+ val = fimc_is_hw_set_field_value(val, &csi_dma_fields[CSIS_DMA_F_DMA_MATRIX], matrix_num);
fimc_is_hw_set_reg(base_reg, &csi_dma_regs[CSIS_DMA_R_COMMON_DMA_MATRIX], val);
return 0;
return 0;
}
-#else /* CONFIG_VENDER_PSV */
-int csi_hw_s_dma_common(u32 __iomem *base_reg) { return 0; }
-#endif
int csi_hw_s_dma_common_pattern_enable(u32 __iomem *base_reg,
u32 width, u32 height, u32 fps, u32 clk)
return 0;
}
-#if !defined(CONFIG_VENDER_PSV)
-int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 hwformat)
+int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 actual_vc, u32 hwformat)
{
int ret = 0;
u32 val;
goto p_err;
}
-#if !defined(CONFIG_SOC_EXYNOS9610)
- if (vc == CSI_VIRTUAL_CH_0) {
-#endif
- switch (hwformat) {
- case HW_FORMAT_RAW10:
- case HW_FORMAT_RAW6_DA:
- case HW_FORMAT_RAW7_DS:
- case HW_FORMAT_RAW8_DS:
- otf_format = 0;
- dma_input_path = CSIS_REG_DMA_INPUT_OTF;
- break;
- case HW_FORMAT_RAW12:
- otf_format = 1;
- dma_input_path = CSIS_REG_DMA_INPUT_OTF;
- break;
- case HW_FORMAT_RAW14:
- case HW_FORMAT_RAW10_DA:
- otf_format = 2;
- dma_input_path = CSIS_REG_DMA_INPUT_OTF;
- break;
- case HW_FORMAT_RAW8:
- case HW_FORMAT_USER:
- otf_format = 3;
- dma_input_path = CSIS_REG_DMA_INPUT_PRL;
- break;
- default:
- err("invalid data format (%02X)", hwformat);
- ret = -EINVAL;
- goto p_err;
- }
+ switch (hwformat) {
+ case HW_FORMAT_RAW10:
+ case HW_FORMAT_RAW6_DA:
+ case HW_FORMAT_RAW7_DS:
+ case HW_FORMAT_RAW8_DS:
+ otf_format = 0;
+ dma_input_path = CSIS_REG_DMA_INPUT_OTF;
+ break;
+ case HW_FORMAT_RAW12:
+ otf_format = 1;
+ dma_input_path = CSIS_REG_DMA_INPUT_OTF;
+ break;
+ case HW_FORMAT_RAW14:
+ case HW_FORMAT_RAW10_DA:
+ otf_format = 2;
+ dma_input_path = CSIS_REG_DMA_INPUT_OTF;
+ break;
+ case HW_FORMAT_RAW8:
+ case HW_FORMAT_USER:
+ case HW_FORMAT_EMBEDDED_8BIT:
+ case HW_FORMAT_YUV420_8BIT:
+ case HW_FORMAT_YUV420_10BIT:
+ case HW_FORMAT_YUV422_8BIT:
+ case HW_FORMAT_YUV422_10BIT:
+ case HW_FORMAT_RGB565:
+ case HW_FORMAT_RGB666:
+ case HW_FORMAT_RGB888:
+ case HW_FORMAT_RAW6:
+ case HW_FORMAT_RAW7:
+ otf_format = 3;
+ dma_input_path = CSIS_REG_DMA_INPUT_PRL;
+ break;
+ default:
+ err("invalid data format (%02X)", hwformat);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ if (vc == CSI_VIRTUAL_CH_0) {
val = fimc_is_hw_get_reg(base_reg, &csi_vcdma_cmn_regs[CSIS_R_OTF_FORMAT]);
val = fimc_is_hw_set_field_value(val, &csi_vcdma_cmn_fields[CSIS_F_OTF_FORMAT], otf_format);
fimc_is_hw_set_reg(base_reg, &csi_vcdma_cmn_regs[CSIS_R_OTF_FORMAT], val);
+ }
+ if (actual_vc == CSI_VIRTUAL_CH_0 || actual_vc == CSI_VIRTUAL_CH_1) {
val = fimc_is_hw_get_reg(base_reg, &csi_vcdma_cmn_regs[CSIS_R_DMA_DATA_CTRL]);
- val = fimc_is_hw_set_field_value(val, &csi_vcdma_cmn_fields[CSIS_F_DMA_INPUT_PATH_CH0],
- dma_input_path);
-#if defined(CONFIG_SOC_EXYNOS9610)
- val = fimc_is_hw_set_field_value(val, &csi_vcdma_cmn_fields[CSIS_F_DMA_INPUT_PATH_CH1],
+ val = fimc_is_hw_set_field_value(val, &csi_vcdma_cmn_fields[CSIS_F_DMA_INPUT_PATH_CH0 + actual_vc],
dma_input_path);
-#endif
+
fimc_is_hw_set_reg(base_reg, &csi_vcdma_cmn_regs[CSIS_R_DMA_DATA_CTRL], val);
-#if !defined(CONFIG_SOC_EXYNOS9610)
}
-#endif
-
p_err:
return ret;
}
-#else
-int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 hwformat) { return 0; }
-#endif
#ifdef USE_SENSOR_IF_DPHY
#define PHY_REF_SPEED (1500)
}
if (cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR10 ||
- cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR12)
+ cfg->format->pixelformat == V4L2_PIX_FMT_SBGGR12 ||
+ cfg->format->pixelformat == V4L2_PIX_FMT_PRIV_MAGIC)
#else
if (image->format.pixelformat == V4L2_PIX_FMT_SBGGR10 ||
- image->format.pixelformat == V4L2_PIX_FMT_SBGGR12)
+ image->format.pixelformat == V4L2_PIX_FMT_SBGGR12 ||
+ image->format.pixelformat == V4L2_PIX_FMT_PRIV_MAGIC)
#endif
dma_pack12 = CSIS_REG_DMA_PACK12;
else
return 0;
}
-int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 hwformat)
+int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 actual_vc, u32 hwformat)
{
int ret = 0;
u32 val;
return ret;
}
+int fimc_is_sensor_read8_size(struct i2c_client *client, void *buf,
+ u16 addr, size_t size)
+{
+ int ret = 0;
+ const u32 addr_size = 2;
+ u8 addr_buf[addr_size];
+
+ if (!client->adapter) {
+ pr_err("Could not find adapter!\n");
+ ret = -ENODEV;
+ return ret;
+ }
+
+ /* Send addr */
+ addr_buf[0] = ((u16)addr) >> 8;
+ addr_buf[1] = (u8)addr;
+
+ ret = i2c_master_send(client, addr_buf, addr_size);
+ if (addr_size != ret) {
+ pr_err("%s: failed to i2c send(%d)\n", __func__, ret);
+ return ret;
+ }
+
+ /* Receive data */
+ ret = i2c_master_recv(client, buf, size);
+ if (ret != size) {
+ pr_err("%s: failed to i2c receive ret(%d), size(%d)\n", __func__, ret, size);
+ return ret;
+ }
+
+ return ret;
+}
+
int fimc_is_sensor_write(struct i2c_client *client,
u8 *buf, u32 size)
{
help
Use to build DW9807 driver.
+config CAMERA_ACT_DW9823_OBJ
+ bool "Use actuator DW9823"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_ACT_SELECT
+ default n
+ help
+ Use to build DW9823 driver.
+
+config CAMERA_ACT_DW9839_OBJ
+ bool "Use actuator DW9839"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_ACT_SELECT
+ default n
+ help
+ Use to build DW9839 driver.
+
config CAMERA_ACT_AK7372_OBJ
bool "Use actuator AK7372"
depends on USE_DIRECT_IS_CONTROL
default n
help
Use to build ZC533 driver.
+
+config CAMERA_ACT_ZC569_OBJ
+ bool "Use actuator ZC569"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_ACT_SELECT
+ default n
+ help
+ Use to build ZC569 driver.
obj-$(CONFIG_CAMERA_ACT_DW9780_OBJ) += fimc-is-actuator-dw9780.o
obj-$(CONFIG_CAMERA_ACT_DW9804_OBJ) += fimc-is-actuator-dw9804.o
obj-$(CONFIG_CAMERA_ACT_DW9807_OBJ) += fimc-is-actuator-dw9807.o
+obj-$(CONFIG_CAMERA_ACT_DW9823_OBJ) += fimc-is-actuator-dw9823.o
+obj-$(CONFIG_CAMERA_ACT_DW9839_OBJ) += fimc-is-actuator-dw9839.o
obj-$(CONFIG_CAMERA_ACT_LC898217_OBJ) += fimc-is-actuator-lc898217.o
obj-$(CONFIG_CAMERA_ACT_ZC533_OBJ) += fimc-is-actuator-zc533.o
+obj-$(CONFIG_CAMERA_ACT_ZC569_OBJ) += fimc-is-actuator-zc569.o
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2/include
/* EEPROM AF calData address */
if (gPtr_lib_support.binary_load_flg) {
/* get pan_focus */
- cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_addr = gPtr_lib_support.minfo->kvaddr_cal[SENSOR_POSITION_REAR] + EEPROM_OEM_BASE;
memcpy((void *)&cal_data, (void *)cal_addr, sizeof(cal_data));
if (cal_data > 0)
/* EEPROM AF calData address */
if (gPtr_lib_support.binary_load_flg) {
/* get pan_focus */
- cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_addr = gPtr_lib_support.minfo->kvaddr_cal[SENSOR_POSITION_REAR] + EEPROM_OEM_BASE;
memcpy((void *)&cal_data, (void *)cal_addr, sizeof(cal_data));
if (cal_data > 0)
}
/* EEPROM AF calData address */
- cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_addr = gPtr_lib_support.minfo->kvaddr_cal[SENSOR_POSITION_REAR] + EEPROM_OEM_BASE;
cal_data = (struct fimc_is_caldata_list_dw9780 *)(cal_addr);
/* Read into EEPROM data or default setting */
}
/* EEPROM AF calData address */
- cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_addr = gPtr_lib_support.minfo->kvaddr_cal[SENSOR_POSITION_REAR] + EEPROM_OEM_BASE;
cal_data = (struct fimc_is_caldata_list_dw9804 *)(cal_addr);
/* Read into EEPROM data or default setting */
}
/* EEPROM AF calData address */
- cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_addr = gPtr_lib_support.minfo->kvaddr_cal[SENSOR_POSITION_REAR] + EEPROM_OEM_BASE;
cal_data = (struct fimc_is_caldata_list_dw9807 *)(cal_addr);
/* Read into EEPROM data or default setting */
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Actuator driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
+
+#include "fimc-is-actuator-dw9823.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+#include "fimc-is-helper-actuator-i2c.h"
+
+#include "interface/fimc-is-interface-library.h"
+
+#define ACTUATOR_NAME "DW9823"
+
+#define REG_CONTROL 0x02 // Default: 0x00, R/W, [1] = RING, [0] = PD(Power Down mode)
+#define REG_VCM_MSB 0x03 // Default: 0x00, R/W, [1:0] = Pos[9:8]
+#define REG_VCM_LSB 0x04 // Default: 0x00, R/W, [7:0] = Pos[7:0]
+#define REG_STATUS 0x05 // Default: 0x00, R, [1] = MBUSY(eFlash busy), [0] = VBUSY(VCM busy)
+#define REG_RESONANCE 0x07 // Default: 0x60, R/W, [5:0] = SACT
+#define REG_PRESET 0x0A // Default: 0x60, R/W, [5:0] = SACT
+#define REG_NRC_EN 0x0B // Default: 0x60, R/W, [5:0] = SACT
+#define REG_NRC_STEP 0x0C // Default: 0x60, R/W, [5:0] = SACT
+#define REG_MPK 0x10 // Default: 0x60, R/W, [5:0] = SACT
+#define REG_MODE 0x02 // Default: 0x40, R/W. [6:5] = STANDBY, SLEEP
+#define REG_TARGET 0x00 // Default: 0x00, R/W, [9:0] = TARGET
+
+#define DEF_DW9823_FIRST_POSITION 100
+#define DEF_DW9823_SECOND_POSITION 180
+#define DEF_DW9823_FIRST_DELAY 20
+#define DEF_DW9823_SECOND_DELAY 10
+
+#define DEF_DW9823_OFFSET_POSITION_MAX 60
+#define DEF_DW9823_AF_PAN 450
+#define DEF_DW9823_PRESET_MAX 255
+
+extern struct fimc_is_lib_support gPtr_lib_support;
+extern struct fimc_is_sysfs_actuator sysfs_actuator;
+
+int sensor_dw9823_init(struct i2c_client *client, struct fimc_is_caldata_list_dw9823 *cal_data)
+{
+ int ret = 0;
+ u8 i2c_data[2];
+ u32 pre_scale, sac_time;
+
+ if (!cal_data) {
+ u8 val = 0;
+
+ usleep_range(PWR_ON_DELAY, PWR_ON_DELAY);
+ ret = fimc_is_sensor_addr8_read8(client, REG_MODE, &val);
+ if (ret < 0)
+ goto p_err;
+ sac_time = val;
+
+ /* Set ACTIVE Mode */
+ i2c_data[0] = REG_MODE;
+ i2c_data[1] = val & 0x9F;
+ ret = fimc_is_sensor_addr8_write8(client, i2c_data[0], i2c_data[1]);
+ if (ret < 0)
+ goto p_err;
+
+ usleep_range(PWR_ON_DELAY, PWR_ON_DELAY);
+ ret = fimc_is_sensor_addr8_read8(client, REG_MODE, &val);
+ if (ret < 0)
+ goto p_err;
+
+ } else {
+
+ /* PD(Power Down) mode enable */
+ i2c_data[0] = REG_CONTROL;
+ i2c_data[1] = 0x01;
+ ret = fimc_is_sensor_addr8_write8(client, i2c_data[0], i2c_data[1]);
+ if (ret < 0)
+ goto p_err;
+
+ /* PD disable(normal operation) */
+ i2c_data[0] = REG_CONTROL;
+ i2c_data[1] = 0x00;
+ ret = fimc_is_sensor_addr8_write8(client, i2c_data[0], i2c_data[1]);
+ if (ret < 0)
+ goto p_err;
+
+ /* wait 5ms after power-on for DW9823 */
+ usleep_range(PWR_ON_DELAY, PWR_ON_DELAY);
+
+ /* Ring mode enable */
+ i2c_data[0] = REG_CONTROL;
+ i2c_data[1] = (0x01 << 1);
+ ret = fimc_is_sensor_addr8_write8(client, i2c_data[0], i2c_data[1]);
+ if (ret < 0)
+ goto p_err;
+
+ /*
+ * SAC[7:5] and PRESC[2:0] mode setting
+ * 000: SAC1, 001: SAC2, 010: SAC2.5, 011: SAC3, 101: SAC4
+ * 000: Tvibx2, 001: Tvibx1, 010: Tvibx1/2, 011: Tvibx1/4, 100: Tvibx8, 101: Tvibx4
+ */
+ pre_scale = cal_data->prescale;
+
+ i2c_data[0] = REG_MODE;
+ i2c_data[1] = (cal_data->control_mode << 5) | pre_scale;
+ ret = fimc_is_sensor_addr8_write8(client, i2c_data[0], i2c_data[1]);
+ if (ret < 0)
+ goto p_err;
+
+ /*
+ * SACT[5:0]
+ * SACT period = 6.3ms + SACT[5:0] * 0.1ms
+ */
+ sac_time = cal_data->resonance;
+
+ i2c_data[0] = REG_RESONANCE;
+ i2c_data[1] = sac_time;
+ ret = fimc_is_sensor_addr8_write8(client, i2c_data[0], i2c_data[1]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+p_err:
+ return ret;
+}
+
+static int sensor_dw9823_write_position(struct i2c_client *client, u32 val)
+{
+ int ret = 0;
+ u8 val_high = 0, val_low = 0;
+
+ BUG_ON(!client);
+
+ if (!client->adapter) {
+ err("Could not find adapter!\n");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ if (val > DW9823_POS_MAX_SIZE) {
+ err("Invalid af position(position : %d, Max : %d).\n",
+ val, DW9823_POS_MAX_SIZE);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /*
+ * val_high is position VCM_MSB[9:2],
+ * val_low is position VCM_LSB[1:0]
+ */
+
+ val_low = (val & 0x3);
+ val_high = (val & 0x03FC) >> 2;
+
+ ret = fimc_is_sensor_addr_data_write16(client, REG_TARGET, val_high, val_low);
+
+p_err:
+ return ret;
+}
+
+static int sensor_dw9823_valid_check(struct i2c_client *client)
+{
+ int i;
+
+ BUG_ON(!client);
+
+ if (sysfs_actuator.init_step > 0) {
+ for (i = 0; i < sysfs_actuator.init_step; i++) {
+ if (sysfs_actuator.init_positions[i] < 0) {
+ warn("invalid position value, default setting to position");
+ return 0;
+ } else if (sysfs_actuator.init_delays[i] < 0) {
+ warn("invalid delay value, default setting to delay");
+ return 0;
+ }
+ }
+ } else
+ return 0;
+
+ return sysfs_actuator.init_step;
+}
+
+static void sensor_dw9823_print_log(int step)
+{
+ int i;
+
+ if (step > 0) {
+ dbg_actuator("initial position ");
+ for (i = 0; i < step; i++)
+ dbg_actuator(" %d", sysfs_actuator.init_positions[i]);
+ dbg_actuator(" setting");
+ }
+}
+
+static int sensor_dw9823_init_position(struct i2c_client *client,
+ struct fimc_is_actuator *actuator)
+{
+ int i;
+ int ret = 0;
+ int init_step = 0;
+
+ init_step = sensor_dw9823_valid_check(client);
+
+ if (init_step > 0) {
+ for (i = 0; i < init_step; i++) {
+ ret = sensor_dw9823_write_position(client, sysfs_actuator.init_positions[i]);
+ if (ret < 0)
+ goto p_err;
+
+ msleep(sysfs_actuator.init_delays[i]);
+ }
+
+ actuator->position = sysfs_actuator.init_positions[i];
+
+ sensor_dw9823_print_log(init_step);
+
+ } else {
+ ret = sensor_dw9823_write_position(client, DEF_DW9823_FIRST_POSITION);
+ if (ret < 0)
+ goto p_err;
+
+ msleep(DEF_DW9823_FIRST_DELAY);
+
+ ret = sensor_dw9823_write_position(client, DEF_DW9823_SECOND_POSITION);
+ if (ret < 0)
+ goto p_err;
+
+ msleep(DEF_DW9823_SECOND_DELAY);
+
+ actuator->position = DEF_DW9823_SECOND_POSITION;
+
+ dbg_actuator("initial position %d, %d setting\n",
+ DEF_DW9823_FIRST_POSITION, DEF_DW9823_SECOND_POSITION);
+ }
+
+p_err:
+ return ret;
+}
+
+int sensor_dw9823_actuator_init(struct v4l2_subdev *subdev, u32 val)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct fimc_is_caldata_list_dw9823 *cal_data = NULL;
+ struct i2c_client *client = NULL;
+ long cal_addr;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ BUG_ON(!subdev);
+
+ dbg_actuator("%s\n", __func__);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ if (!actuator) {
+ err("actuator is not detect!\n");
+ goto p_err;
+ }
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* EEPROM AF calData address */
+ cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_data = (struct fimc_is_caldata_list_dw9823 *)(cal_addr);
+
+ /* Read into EEPROM data or default setting */
+ ret = sensor_dw9823_init(client, cal_data);
+ if (ret < 0)
+ goto p_err;
+
+ ret = sensor_dw9823_init_position(client, actuator);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+ info("%s: ret[%d]\n", __func__, ret);
+ return 0;
+p_err:
+ err("ret[%d]\n", ret);
+ return ret;
+}
+
+int sensor_dw9823_actuator_get_status(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ u8 val = 0;
+ struct fimc_is_actuator *actuator = NULL;
+ struct i2c_client *client = NULL;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ dbg_actuator("%s\n", __func__);
+
+ BUG_ON(!subdev);
+ BUG_ON(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ BUG_ON(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* If you need check the position value, use this */
+#if 0
+ /* Read VCM_MSB(0x03) pos[9:8] and VCM_LSB(0x04) pos[7:0] */
+ ret = fimc_is_sensor_addr8_read8(client, REG_VCM_MSB, &val);
+ data = (val & 0x0300);
+ ret = fimc_is_sensor_addr8_read8(client, REG_VCM_LSB, &val);
+ data |= (val & 0x00ff);
+#endif
+
+ ret = fimc_is_sensor_addr8_read8(client, REG_STATUS, &val);
+ if (ret < 0)
+ return ret;
+
+ /* If data is 1 of 0x1 and 0x2 bit, will have to actuator not move */
+ *info = ((val & 0x3) == 0) ? ACTUATOR_STATUS_NO_BUSY : ACTUATOR_STATUS_BUSY;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_dw9823_actuator_set_position(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client;
+ u32 position = 0;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ BUG_ON(!subdev);
+ BUG_ON(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ BUG_ON(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ position = *info;
+ if (position > DW9823_POS_MAX_SIZE) {
+ err("Invalid af position(position : %d, Max : %d).\n",
+ position, DW9823_POS_MAX_SIZE);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* debug option : fixed position testing */
+ if (sysfs_actuator.enable_fixed)
+ position = sysfs_actuator.fixed_position;
+
+ /* position Set */
+ ret = sensor_dw9823_write_position(client, position);
+ if (ret < 0)
+ goto p_err;
+ actuator->position = position;
+
+ dbg_actuator("%s: position(%d)\n", __func__, position);
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+p_err:
+ return ret;
+}
+
+static int sensor_dw9823_actuator_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
+{
+ int ret = 0;
+ u32 val = 0;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ACTUATOR_GET_STATUS:
+ ret = sensor_dw9823_actuator_get_status(subdev, &val);
+ if (ret < 0) {
+ err("err!!! ret(%d), actuator status(%d)", ret, val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
+ default:
+ err("err!!! Unknown CID(%#x)", ctrl->id);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ctrl->value = val;
+
+p_err:
+ return ret;
+}
+
+static int sensor_dw9823_actuator_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
+{
+ int ret = 0;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ACTUATOR_SET_POSITION:
+ ret = sensor_dw9823_actuator_set_position(subdev, &ctrl->value);
+ if (ret) {
+ err("failed to actuator set position: %d, (%d)\n", ctrl->value, ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
+ default:
+ err("err!!! Unknown CID(%#x)", ctrl->id);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+p_err:
+ return ret;
+}
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_dw9823_actuator_init,
+ .g_ctrl = sensor_dw9823_actuator_g_ctrl,
+ .s_ctrl = sensor_dw9823_actuator_s_ctrl,
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+};
+
+int sensor_dw9823_actuator_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_actuator = NULL;
+ struct fimc_is_actuator *actuator = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ u32 sensor_id[FIMC_IS_STREAM_COUNT] = {0, };
+ u32 place = 0;
+ struct device *dev;
+ struct device_node *dnode;
+ const u32 *sensor_id_spec;
+ u32 sensor_id_len;
+ int i = 0;
+
+ BUG_ON(!fimc_is_dev);
+ BUG_ON(!client);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core device is not yet probed");
+ ret = -EPROBE_DEFER;
+ goto p_err;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ sensor_id_spec = of_get_property(dnode, "id", &sensor_id_len);
+ if (!sensor_id_spec) {
+ err("sensor_id num read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ sensor_id_len /= sizeof(*sensor_id_spec);
+
+ ret = of_property_read_u32_array(dnode, "id", sensor_id, sensor_id_len);
+ if (ret) {
+ err("sensor_id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ for (i = 0; i < sensor_id_len; i++) {
+ ret = of_property_read_u32(dnode, "place", &place);
+ if (ret) {
+ err("place read is fail(%d)", ret);
+ place = 0;
+ }
+ probe_info("%s sensor_id(%d) actuator_place(%d)\n", __func__, sensor_id[i], place);
+
+ device = &core->sensor[sensor_id[i]];
+
+ actuator = kzalloc(sizeof(struct fimc_is_actuator), GFP_KERNEL);
+
+ if (!actuator) {
+ err("actuator is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_actuator = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_actuator) {
+ err("subdev_actuator is NULL");
+ ret = -ENOMEM;
+ kfree(actuator);
+ goto p_err;
+ }
+
+ /* This name must is match to sensor_open_extended actuator name */
+ actuator->id = ACTUATOR_NAME_DW9823;
+ actuator->subdev = subdev_actuator;
+ actuator->device = sensor_id[i];
+ actuator->client = client;
+ actuator->position = 0;
+ actuator->max_position = DW9823_POS_MAX_SIZE;
+ actuator->pos_size_bit = DW9823_POS_SIZE_BIT;
+ actuator->pos_direction = DW9823_POS_DIRECTION;
+ actuator->i2c_lock = NULL;
+
+ device->subdev_actuator[place] = subdev_actuator;
+ device->actuator[place] = actuator;
+
+ v4l2_i2c_subdev_init(subdev_actuator, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_actuator, actuator);
+ v4l2_set_subdev_hostdata(subdev_actuator, device);
+
+ snprintf(subdev_actuator->name, V4L2_SUBDEV_NAME_SIZE, "actuator-subdev.%d", actuator->id);
+ }
+
+p_err:
+ probe_info("%s done ret[%d]\n", __func__, ret);
+ return ret;
+}
+
+static int sensor_dw9823_actuator_remove(struct i2c_client *client)
+{
+ int ret = 0;
+
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_dw9823_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-actuator-dw9823",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_dw9823_match);
+
+static const struct i2c_device_id actuator_dw9823_idt[] = {
+ { ACTUATOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver actuator_dw9823_driver = {
+ .driver = {
+ .name = ACTUATOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_dw9823_match
+ },
+ .probe = sensor_dw9823_actuator_probe,
+ .remove = sensor_dw9823_actuator_remove,
+ .id_table = actuator_dw9823_idt
+};
+module_i2c_driver(actuator_dw9823_driver);
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Actuator driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_DEVICE_DW9823_H
+#define FIMC_IS_DEVICE_DW9823_H
+
+#define DW9823_POS_SIZE_BIT ACTUATOR_POS_SIZE_10BIT
+#define DW9823_POS_MAX_SIZE ((1 << DW9823_POS_SIZE_BIT) - 1)
+#define DW9823_POS_DIRECTION ACTUATOR_RANGE_INF_TO_MAC
+#define RINGING_CONTROL 0x2F /* 11ms */
+#define PRESCALER 0x01 /* Tvib x 1 */
+
+#define PWR_ON_DELAY 5000 /* DW9823 need delay for 5msec after power-on */
+
+struct fimc_is_caldata_list_dw9823 {
+ u32 af_position_type;
+ u32 af_position_worst;
+ u32 af_macro_position_type;
+ u32 af_macro_position_worst;
+ u32 af_default_position;
+ u8 reserved0[12];
+
+ u16 info_position;
+ u16 mac_position;
+ u32 equipment_info1;
+ u32 equipment_info2;
+ u32 equipment_info3;
+ u8 control_mode;
+ u8 prescale;
+ u8 resonance;
+ u8 reserved1[13];
+ u8 reserved2[16];
+
+ u8 core_version;
+ u8 pixel_number[2];
+ u8 is_pid;
+ u8 sensor_maker;
+ u8 year;
+ u8 month;
+ u16 release_number;
+ u8 manufacturer_id;
+ u8 module_version;
+ u8 reserved3[161];
+ u32 check_sum;
+};
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos9 SoC series Actuator driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+
+#include "fimc-is-actuator-dw9839.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+#include "fimc-is-helper-actuator-i2c.h"
+
+#include "interface/fimc-is-interface-library.h"
+
+#define ACTUATOR_NAME "DW9839"
+
+#define REG_TARGET_MSB 0x00 /* [D7:D0] - TARGET[9:2] */
+#define REG_TARGET_LSB 0x01 /* [D7:D6] - TARGET[1:0] */
+#define REG_ACTIVE_EN 0x03 /* [D4] - ACTIVE, [D0] - EN */
+#define REG_ACT_MODE 0x04 /* [D2:D0] - ACT_MODE, b'000: Active, b'010: FRA, b'100: Hall Calibration */
+#define REG_SW_RESET 0x05 /* [D0] - S/W reset */
+#define REG_M_STATUS 0x0F /* [D0] - M_BUSY */
+#define REG_PCAL_ADJ 0x47 /* [D7:D0] - PCAL ADJ */
+#define REG_NCAL_ADJ 0x48 /* [D7:D0] - NCAL ADJ */
+#define REG_CAL_FLAG 0x5A /* [D1:D0] - CAL_FLAG, b'00: No calibration, b'01: pass, b'1x: fail */
+#define REG_PCAL_MSB 0x5B /* [D1:D0] - PCAL[9:8] */
+#define REG_PCAL_LSB 0x5C /* [D7:D0] - PCAL[7:0] */
+#define REG_NCAL_MSB 0x5D /* [D1:D0] - NCAL[9:8] */
+#define REG_NCAL_LSB 0x5E /* [D7:D0] - NCAL[7:0] */
+#define REG_INIT_POS 0x61 /* [D7:D0] - INIT_POSITION[7:0] */
+#define REG_ADC_R_EN 0x12 /* [D0] - ADC READ */
+#define REG_ADC_R_MSB 0x50 /* [D1:D0] - CUR POS[9:8] */
+#define REG_ADC_R_LSB 0x51 /* [D7:D0] - CUR POS[7:0] */
+
+#define DEF_DW9839_INIT_POSITION 300
+
+/* #define MANUAL_PID_CAL_SETTING */
+
+extern struct fimc_is_sysfs_actuator sysfs_actuator;
+
+static int sensor_dw9839_init(struct fimc_is_actuator *actuator)
+{
+ int ret = 0;
+ struct i2c_client *client = NULL;
+ struct dw9839_actuator_info *actuator_info;
+ u8 ncal_msb, ncal_lsb, pcal_msb, pcal_lsb;
+
+ FIMC_BUG(!actuator->priv_info);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ /* delay after power on */
+ usleep_range(4000, 4010);
+
+ if (actuator->init_cal_setting)
+ goto skip_cal;
+#ifdef MANUAL_PID_CAL_SETTING
+ /* ============= PID initial code ===================*/
+ ret = fimc_is_sensor_addr8_write8(client, 0x40, 0xf1);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x41, 0x31);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x42, 0x2B);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x47, 0x00); /* PCAL_ADJ */
+ ret |= fimc_is_sensor_addr8_write8(client, 0x48, 0x00); /* NCAL_ADJ */
+ ret |= fimc_is_sensor_addr8_write8(client, 0x49, 0x0A); /* PGAIN */
+ ret |= fimc_is_sensor_addr8_write8(client, 0x4A, 0xF0);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x4B, 0x00); /* IGAIN */
+ ret |= fimc_is_sensor_addr8_write8(client, 0x4C, 0x21);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x4D, 0x07); /* DGAIN */
+ ret |= fimc_is_sensor_addr8_write8(client, 0x4E, 0x3A);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x4F, 0x23); /* DLPF */
+ ret |= fimc_is_sensor_addr8_write8(client, 0x52, 0x80);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x53, 0x00);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x54, 0x00);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x55, 0x01);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x57, 0x8F);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x58, 0x80);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x59, 0x05);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x5F, 0x00);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x60, 0x00);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x62, 0x0D);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x63, 0x85);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x64, 0x02);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x65, 0x7A);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x66, 0x00);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x67, 0x00);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x68, 0x80);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x69, 0x80);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x6A, 0x80);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x6B, 0x00);
+ /* ============= Calibration ===================*/
+ ret |= fimc_is_sensor_addr8_write8(client, 0x03, 0x01);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x04, 0x04);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x03, 0x11);
+ msleep(500);
+ /* =========== data store ===================*/
+ ret |= fimc_is_sensor_addr8_write8(client, 0x03, 0x01);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x78, 0x01);
+ msleep(400);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x05, 0x01);
+
+ /* goto standby mode */
+ usleep_range(1500, 1510);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x03, 0x01);
+ ret |= fimc_is_sensor_addr8_write8(client, 0x04, 0x00);
+
+ actuator->init_cal_setting = true;
+#endif
+
+skip_cal:
+ /* set Active Mode */
+ ret = fimc_is_sensor_addr8_write8(client, REG_ACTIVE_EN, 0x00);
+ ret = fimc_is_sensor_addr8_write8(client, REG_ACTIVE_EN, 0x01);
+ usleep_range(5000, 5010);
+ ret = fimc_is_sensor_addr8_write8(client, REG_ACTIVE_EN, 0x11);
+ if (ret < 0)
+ goto p_err;
+
+ /* delay after active mode */
+ usleep_range(5000, 5010);
+ ret = fimc_is_sensor_addr8_write8(client, REG_ACT_MODE, 0x00);
+ if (ret < 0)
+ goto p_err;
+ /* read pcal, ncal */
+ actuator_info = (struct dw9839_actuator_info *)actuator->priv_info;
+ ret = fimc_is_sensor_addr8_read8(client, REG_PCAL_MSB, &pcal_msb);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_addr8_read8(client, REG_PCAL_LSB, &pcal_lsb);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_addr8_read8(client, REG_NCAL_MSB, &ncal_msb);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_addr8_read8(client, REG_NCAL_LSB, &ncal_lsb);
+ if (ret < 0)
+ goto p_err;
+
+ actuator_info->pcal = (pcal_msb << 8) | pcal_lsb;
+ actuator_info->ncal = (ncal_msb << 8) | ncal_lsb;
+
+ info("%s done\n", __func__);
+p_err:
+ return ret;
+}
+
+static int sensor_dw9839_write_position(struct i2c_client *client, u32 val)
+{
+ int ret = 0;
+ u8 val_msb, val_lsb;
+
+ FIMC_BUG(!client);
+
+ if (!client->adapter) {
+ err("Could not find adapter!\n");
+ return -ENODEV;
+ }
+
+ if (val > DW9839_POS_MAX_SIZE) {
+ err("Invalid af position(position : %d, Max : %d).\n",
+ val, DW9839_POS_MAX_SIZE);
+ return -EINVAL;
+ }
+
+ val_msb = (val >> 2) & 0x00FF;
+ val_lsb = (val & 0x3) << 6;
+
+ ret = fimc_is_sensor_addr8_write8(client, REG_TARGET_MSB, val_msb);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_addr8_write8(client, REG_TARGET_LSB, val_lsb);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ return ret;
+}
+
+static int sensor_dw9839_valid_check(struct i2c_client *client)
+{
+ int i;
+
+ FIMC_BUG(!client);
+
+ if (sysfs_actuator.init_step > 0) {
+ for (i = 0; i < sysfs_actuator.init_step; i++) {
+ if (sysfs_actuator.init_positions[i] < 0) {
+ warn("invalid position value, default setting to position");
+ return 0;
+ } else if (sysfs_actuator.init_delays[i] < 0) {
+ warn("invalid delay value, default setting to delay");
+ return 0;
+ }
+ }
+ } else
+ return 0;
+
+ return sysfs_actuator.init_step;
+}
+
+static void sensor_dw9839_print_log(int step)
+{
+ int i;
+
+ if (step > 0) {
+ dbg_actuator("initial position ");
+ for (i = 0; i < step; i++)
+ dbg_actuator(" %d", sysfs_actuator.init_positions[i]);
+ dbg_actuator(" setting");
+ }
+}
+
+static int sensor_dw9839_init_position(struct i2c_client *client,
+ struct fimc_is_actuator *actuator)
+{
+ int i;
+ int ret = 0;
+ int init_step = 0;
+
+ init_step = sensor_dw9839_valid_check(client);
+
+ if (init_step > 0) {
+ for (i = 0; i < init_step; i++) {
+ ret = sensor_dw9839_write_position(client, sysfs_actuator.init_positions[i]);
+ if (ret < 0)
+ goto p_err;
+
+ msleep(sysfs_actuator.init_delays[i]);
+ }
+
+ actuator->position = sysfs_actuator.init_positions[i];
+
+ sensor_dw9839_print_log(init_step);
+
+ } else {
+ /* REG_INIT_POS range is 0 ~ 255 (1/4 of 0 ~ 1023 position) */
+ ret = fimc_is_sensor_addr8_write8(client, REG_INIT_POS, DEF_DW9839_INIT_POSITION >> 2);
+ if (ret < 0)
+ goto p_err;
+
+ actuator->position = DEF_DW9839_INIT_POSITION;
+
+ dbg_actuator("initial position %d setting\n", DEF_DW9839_INIT_POSITION);
+ }
+
+p_err:
+ return ret;
+}
+
+int sensor_dw9839_actuator_init(struct v4l2_subdev *subdev, u32 val)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client = NULL;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ dbg_actuator("%s\n", __func__);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ if (!actuator) {
+ err("actuator is not detect!\n");
+ return -ENODEV;
+ }
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(actuator->i2c_lock);
+
+ ret = sensor_dw9839_init(actuator);
+ if (ret < 0)
+ goto p_err;
+
+ ret = sensor_dw9839_init_position(client, actuator);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ /* dw9839 actuator do not use af cal */
+ actuator->actuator_data.actuator_init = false;
+p_err:
+ I2C_MUTEX_UNLOCK(actuator->i2c_lock);
+
+ return ret;
+}
+
+int sensor_dw9839_actuator_get_status(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ u32 status = 0;
+ struct fimc_is_actuator *actuator = NULL;
+ struct i2c_client *client = NULL;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ dbg_actuator("%s\n", __func__);
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /*
+ * The info is busy flag.
+ * But, this module can't get busy flag.
+ */
+ status = ACTUATOR_STATUS_NO_BUSY;
+ *info = status;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_dw9839_actuator_set_position(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client;
+ u32 position = 0;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ position = *info;
+ if (position > DW9839_POS_MAX_SIZE) {
+ err("Invalid af position(position : %d, Max : %d).\n",
+ position, DW9839_POS_MAX_SIZE);
+ return -EINVAL;
+ }
+
+ /* debug option : fixed position testing */
+ if (sysfs_actuator.enable_fixed)
+ position = sysfs_actuator.fixed_position;
+
+ I2C_MUTEX_LOCK(actuator->i2c_lock);
+
+ /* position Set */
+ ret = sensor_dw9839_write_position(client, position);
+ if (ret < 0)
+ goto p_err;
+ actuator->position = position;
+
+ dbg_actuator("%s: position(%d)\n", __func__, position);
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+p_err:
+ I2C_MUTEX_UNLOCK(actuator->i2c_lock);
+
+ return ret;
+}
+
+int sensor_dw9839_actuator_get_actual_position(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client;
+ struct dw9839_actuator_info *actuator_info;
+ u8 pos_msb = 0, pos_lsb = 0;
+ u32 adc_pos;
+ u64 temp;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ FIMC_BUG(!actuator->priv_info);
+ actuator_info = (struct dw9839_actuator_info *)actuator->priv_info;
+
+ I2C_MUTEX_LOCK(actuator->i2c_lock);
+
+ ret = fimc_is_sensor_addr8_write8(client, REG_ADC_R_EN, 1);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_addr8_read8(client, REG_ADC_R_MSB, &pos_msb);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_addr8_read8(client, REG_ADC_R_LSB, &pos_lsb);
+ if (ret < 0)
+ goto p_err;
+
+ /* pos_msb uses [1:0] bit */
+ adc_pos = ((pos_msb & 0x3) << 8) | pos_lsb;
+
+ /* convert adc_pos to 10bit position
+ * ncal <= adc_pos <= pcal ------> 0 <= 10bit_pos <= 1023
+ */
+ temp = (u64)(adc_pos - actuator_info->ncal) << ACTUATOR_POS_SIZE_10BIT;
+ *info = (u32)(temp / (u64)(actuator_info->pcal - actuator_info->ncal));
+
+ if (*info > 1023)
+ *info = 1023;
+
+ dbg_actuator("%s: cal(p:%d, n:%d), adc_pos(msb:%d, lsb:%d, sum:%d) -> target_pos(%d) actual pos(%d)\n",
+ __func__, actuator_info->pcal, actuator_info->ncal, pos_msb & 0x3, pos_lsb, adc_pos,
+ actuator->position, *info);
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(actuator->i2c_lock);
+
+ return ret;
+}
+
+static int sensor_dw9839_actuator_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
+{
+ int ret = 0;
+ u32 val = 0;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ACTUATOR_GET_STATUS:
+ ret = sensor_dw9839_actuator_get_status(subdev, &val);
+ if (ret < 0) {
+ err("err!!! ret(%d), actuator status(%d)", ret, val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
+ case V4L2_CID_ACTUATOR_GET_ACTUAL_POSITION:
+ ret = sensor_dw9839_actuator_get_actual_position(subdev, &val);
+ if (ret < 0) {
+ err("sensor_dw9839_get_actual_position failed(%d)", ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
+ default:
+ err("err!!! Unknown CID(%#x)", ctrl->id);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ctrl->value = val;
+
+p_err:
+ return ret;
+}
+
+static int sensor_dw9839_actuator_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
+{
+ int ret = 0;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ACTUATOR_SET_POSITION:
+ ret = sensor_dw9839_actuator_set_position(subdev, &ctrl->value);
+ if (ret) {
+ err("failed to actuator set position: %d, (%d)\n", ctrl->value, ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
+ default:
+ err("err!!! Unknown CID(%#x)", ctrl->id);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+p_err:
+ return ret;
+}
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_dw9839_actuator_init,
+ .g_ctrl = sensor_dw9839_actuator_g_ctrl,
+ .s_ctrl = sensor_dw9839_actuator_s_ctrl,
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+};
+
+static int sensor_dw9839_actuator_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_actuator = NULL;
+ struct fimc_is_actuator *actuator = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ u32 place = 0;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!fimc_is_dev);
+ FIMC_BUG(!client);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core device is not yet probed");
+ ret = -EPROBE_DEFER;
+ goto p_err;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ ret = of_property_read_u32(dnode, "place", &place);
+ if (ret) {
+ pr_info("place read is fail(%d)", ret);
+ place = 0;
+ }
+ probe_info("%s sensor_id(%d) actuator_place(%d)\n", __func__, sensor_id, place);
+
+ device = &core->sensor[sensor_id];
+ if (!test_bit(FIMC_IS_SENSOR_PROBE, &device->state)) {
+ err("sensor device is not yet probed");
+ ret = -EPROBE_DEFER;
+ goto p_err;
+ }
+
+ sensor_peri = find_peri_by_act_id(device, ACTUATOR_NAME_DW9839);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ actuator = kzalloc(sizeof(struct fimc_is_actuator), GFP_KERNEL);
+ if (!actuator) {
+ err("acuator is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_actuator = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_actuator) {
+ err("subdev_actuator is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_actuator = subdev_actuator;
+
+ /* This name must is match to sensor_open_extended actuator name */
+ actuator->id = ACTUATOR_NAME_DW9839;
+ actuator->subdev = subdev_actuator;
+ actuator->device = sensor_id;
+ actuator->client = client;
+ actuator->position = 0;
+ actuator->max_position = DW9839_POS_MAX_SIZE;
+ actuator->pos_size_bit = DW9839_POS_SIZE_BIT;
+ actuator->pos_direction = DW9839_POS_DIRECTION;
+ actuator->init_cal_setting = false;
+ actuator->actual_pos_support = true;
+
+ actuator->priv_info = vzalloc(sizeof(struct dw9839_actuator_info));
+ if (!actuator->priv_info) {
+ err("actuator->priv_info alloc fail");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ device->subdev_actuator[sensor_id] = subdev_actuator;
+ device->actuator[sensor_id] = actuator;
+
+ v4l2_i2c_subdev_init(subdev_actuator, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_actuator, actuator);
+ v4l2_set_subdev_hostdata(subdev_actuator, device);
+
+ set_bit(FIMC_IS_SENSOR_ACTUATOR_AVAILABLE, &sensor_peri->peri_state);
+
+ snprintf(subdev_actuator->name, V4L2_SUBDEV_NAME_SIZE, "actuator-subdev.%d", actuator->id);
+p_err:
+ probe_info("%s done\n", __func__);
+ return ret;
+}
+
+static const struct of_device_id sensor_actuator_dw9839_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-actuator-dw9839",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_actuator_dw9839_match);
+
+static const struct i2c_device_id sensor_actuator_dw9839_idt[] = {
+ { ACTUATOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_actuator_dw9839_driver = {
+ .probe = sensor_dw9839_actuator_probe,
+ .driver = {
+ .name = ACTUATOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_actuator_dw9839_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_actuator_dw9839_idt,
+};
+
+static int __init sensor_actuator_dw9839_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_actuator_dw9839_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_actuator_dw9839_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_actuator_dw9839_init);
--- /dev/null
+/*
+ * Samsung Exynos9 SoC series Actuator driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_DEVICE_DW9839_H
+#define FIMC_IS_DEVICE_DW9839_H
+
+#define DW9839_POS_SIZE_BIT ACTUATOR_POS_SIZE_10BIT
+#define DW9839_POS_MAX_SIZE ((1 << DW9839_POS_SIZE_BIT) - 1)
+#define DW9839_POS_DIRECTION ACTUATOR_RANGE_INF_TO_MAC
+#define RINGING_CONTROL 0x2F /* 11ms */
+#define PRESCALER 0x01 /* Tvib x 1 */
+
+struct dw9839_actuator_info {
+ u16 pcal;
+ u16 ncal;
+};
+
+#endif
#define REG_TARGET_LOW 0x85
#define REG_SRV_STATE1 0xB0
#define REG_TGT_CNVTIM 0xB2
+#define REG_ADC_HIGH 0x0A /* actual POS[15:8] */
+#define REG_ADC_LOW 0x0B /* actual POS[7:4] */
+
extern struct fimc_is_lib_support gPtr_lib_support;
extern struct fimc_is_sysfs_actuator sysfs_actuator;
int ret = 0;
u8 val_high = 0, val_low = 0;
- BUG_ON(!client);
+ FIMC_BUG(!client);
if (!client->adapter) {
err("Could not find adapter!\n");
int sensor_lc898217_actuator_init(struct v4l2_subdev *subdev, u32 val)
{
int ret = 0;
- u8 product_id = 0;
struct fimc_is_actuator *actuator;
struct i2c_client *client = NULL;
#ifdef DEBUG_ACTUATOR_TIME
int first_position = DEF_LC898217_FIRST_POSITION;
- BUG_ON(!subdev);
+ FIMC_BUG(!subdev);
dbg_actuator("%s\n", __func__);
goto p_err;
}
+ mdelay(8);
I2C_MUTEX_LOCK(actuator->i2c_lock);
- ret = fimc_is_sensor_addr8_read8(client, 0x03, &product_id);
+ /* Initial Data Down Load */
+ ret = fimc_is_sensor_addr8_write8(client, 0xE0, 0x01);
if (ret < 0)
goto p_err_mutex;
+ mdelay(1);
#if 0
+ u8 product_id = 0;
+ ret = fimc_is_sensor_addr8_read8(client, 0x03, &product_id);
+ if (ret < 0)
+ goto p_err_mutex;
+
+
if (product_id != LC898217_PRODUCT_ID) {
err("LC898217 is not detected(%d), Slave: %d\n", product_id, client->addr);
goto p_err_mutex;
/* EEPROM AF calData address */
if (gPtr_lib_support.binary_load_flg) {
/* get pan_focus */
- cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_addr = gPtr_lib_support.minfo->kvaddr_cal[SENSOR_POSITION_REAR] + EEPROM_OEM_BASE;
memcpy((void *)&cal_data, (void *)cal_addr, sizeof(cal_data));
if (cal_data > 0)
dbg_actuator("%s\n", __func__);
- BUG_ON(!subdev);
- BUG_ON(!info);
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!info);
actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
- BUG_ON(!actuator);
+ FIMC_BUG(!actuator);
client = actuator->client;
if (unlikely(!client)) {
do_gettimeofday(&st);
#endif
- BUG_ON(!subdev);
- BUG_ON(!info);
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!info);
actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
- BUG_ON(!actuator);
+ FIMC_BUG(!actuator);
client = actuator->client;
if (unlikely(!client)) {
return ret;
}
+int sensor_lc898217_actuator_get_actual_position(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client;
+ u32 actual_pos;
+ u8 actual_high, actual_low;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(actuator->i2c_lock);
+
+ ret = fimc_is_sensor_addr8_read8(client, REG_ADC_HIGH, &actual_high);
+ ret = fimc_is_sensor_addr8_read8(client, REG_ADC_LOW, &actual_low);
+ if (ret < 0)
+ goto p_err;
+
+ actual_pos = ((actual_high << 8) | actual_low) >> 4;
+ dbg_actuator("actual_pos is: %d, actual_high is: %d, actual_low is: %d\n",actual_pos, actual_high, actual_low);
+
+ *info = actual_pos;
+
+ if (*info > 1023)
+ *info = 1023;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(actuator->i2c_lock);
+
+ return ret;
+}
+
static int sensor_lc898217_actuator_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
{
int ret = 0;
goto p_err;
}
break;
+ case V4L2_CID_ACTUATOR_GET_ACTUAL_POSITION:
+ ret = sensor_lc898217_actuator_get_actual_position(subdev, &val);
+ if (ret < 0) {
+ err("sensor_lc898217_get_actual_position failed(%d)", ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
default:
err("err!!! Unknown CID(%#x)", ctrl->id);
ret = -EINVAL;
struct v4l2_subdev *subdev_actuator = NULL;
struct fimc_is_actuator *actuator = NULL;
struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
u32 sensor_id = 0;
u32 place = 0;
struct device *dev;
struct device_node *dnode;
- BUG_ON(!fimc_is_dev);
- BUG_ON(!client);
+ FIMC_BUG(!fimc_is_dev);
+ FIMC_BUG(!client);
core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
if (!core) {
goto p_err;
}
+ sensor_peri = find_peri_by_act_id(device, ACTUATOR_NAME_LC898217);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
actuator = kzalloc(sizeof(struct fimc_is_actuator), GFP_KERNEL);
if (!actuator) {
err("actuator is NULL");
ret = -ENOMEM;
goto p_err;
}
+ sensor_peri->subdev_actuator = subdev_actuator;
/* This name must is match to sensor_open_extended actuator name */
actuator->id = ACTUATOR_NAME_LC898217;
actuator->i2c_lock = NULL;
actuator->need_softlanding = 0;
actuator->actuator_ops = NULL;
+ actuator->actual_pos_support = true;
- device->subdev_actuator[place] = subdev_actuator;
- device->actuator[place] = actuator;
+ device->subdev_actuator[sensor_id] = subdev_actuator;
+ device->actuator[sensor_id] = actuator;
v4l2_i2c_subdev_init(subdev_actuator, client, &subdev_ops);
v4l2_set_subdevdata(subdev_actuator, actuator);
v4l2_set_subdev_hostdata(subdev_actuator, device);
- snprintf(subdev_actuator->name, V4L2_SUBDEV_NAME_SIZE, "actuator-subdev.%d", actuator->id);
-
- probe_info("%s done\n", __func__);
- return ret;
+ set_bit(FIMC_IS_SENSOR_ACTUATOR_AVAILABLE, &sensor_peri->peri_state);
+ snprintf(subdev_actuator->name, V4L2_SUBDEV_NAME_SIZE, "actuator-subdev.%d", actuator->id);
p_err:
- if (actuator)
- kzfree(actuator);
-
- if (subdev_actuator)
- kzfree(subdev_actuator);
-
+ probe_info("%s done\n", __func__);
return ret;
}
}
/* EEPROM AF calData address */
- cal_addr = gPtr_lib_support.minfo->kvaddr_rear_cal + EEPROM_OEM_BASE;
+ cal_addr = gPtr_lib_support.minfo->kvaddr_cal[SENSOR_POSITION_REAR] + EEPROM_OEM_BASE;
cal_data = (struct fimc_is_caldata_list_zc533 *)(cal_addr);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Actuator driver
+ *
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+
+#include "fimc-is-actuator-zc569.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+
+#include "fimc-is-helper-i2c.h"
+
+#include "interface/fimc-is-interface-library.h"
+
+extern struct fimc_is_sysfs_actuator sysfs_actuator;
+
+#define ZC569_DEFAULT_FIRST_POSITION 120
+#define ZC569_DEFAULT_FIRST_DELAY 2000
+
+static int sensor_zc569_write_position(struct i2c_client *client, u32 val)
+{
+ int ret = 0;
+ u8 val_high = 0, val_low = 0;
+
+ WARN_ON(!client);
+
+ if (!client->adapter) {
+ err("Could not find adapter!\n");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ if (val > ZC569_POS_MAX_SIZE) {
+ err("Invalid af position(position : %d, Max : %d).\n",
+ val, ZC569_POS_MAX_SIZE);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ val_high = (val & 0x01FF) >> 1;
+ val_low = (val & 0x0001) << 7;
+
+ ret = fimc_is_sensor_addr8_write8(client, ZC569_REG_POS_HIGH, val_high);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_addr8_write8(client, ZC569_REG_POS_LOW, val_low);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ return ret;
+}
+
+static int sensor_zc569_valid_check(struct i2c_client *client)
+{
+ int i;
+
+ WARN_ON(!client);
+
+ if (sysfs_actuator.init_step > 0) {
+ for (i = 0; i < sysfs_actuator.init_step; i++) {
+ if (sysfs_actuator.init_positions[i] < 0) {
+ warn("invalid position value, default setting to position");
+ return 0;
+ } else if (sysfs_actuator.init_delays[i] < 0) {
+ warn("invalid delay value, default setting to delay");
+ return 0;
+ }
+ }
+ } else
+ return 0;
+
+ return sysfs_actuator.init_step;
+}
+
+static void sensor_zc569_print_log(int step)
+{
+ int i;
+
+ if (step > 0) {
+ dbg_actuator("initial position ");
+ for (i = 0; i < step; i++)
+ dbg_actuator(" %d", sysfs_actuator.init_positions[i]);
+ dbg_actuator(" setting");
+ }
+}
+
+static int sensor_zc569_init_position(struct i2c_client *client,
+ struct fimc_is_actuator *actuator)
+{
+ int i;
+ int ret = 0;
+ int init_step = 0;
+
+ init_step = sensor_zc569_valid_check(client);
+
+ if (init_step > 0) {
+ for (i = 0; i < init_step; i++) {
+ ret = sensor_zc569_write_position(client, sysfs_actuator.init_positions[i]);
+ if (ret < 0)
+ goto p_err;
+
+ mdelay(sysfs_actuator.init_delays[i]);
+ }
+
+ actuator->position = sysfs_actuator.init_positions[i];
+
+ sensor_zc569_print_log(init_step);
+
+ } else {
+ /* wide, tele camera uses previous position at initial time */
+ if (actuator->device == 1 || actuator->position == 0)
+ actuator->position = actuator->vendor_first_pos;
+
+ ret = sensor_zc569_write_position(client, actuator->position);
+ if (ret < 0)
+ goto p_err;
+
+ usleep_range(actuator->vendor_first_delay, actuator->vendor_first_delay + 10);
+
+ dbg_actuator("initial position %d setting\n", actuator->vendor_first_pos);
+ }
+
+p_err:
+ return ret;
+}
+
+int sensor_zc569_actuator_init(struct v4l2_subdev *subdev, u32 val)
+{
+ int ret = 0;
+ int i = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client = NULL;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ u32 product_id_list[ZC569_MAX_PRODUCT_LIST] = {0, };
+ u32 product_id_len = 0;
+ u8 product_id = 0;
+ const u32 *product_id_spec;
+
+ struct device *dev;
+ struct device_node *dnode;
+
+ WARN_ON(!subdev);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ product_id_spec = of_get_property(dnode, "vendor_product_id", &product_id_len);
+ if (!product_id_spec)
+ err("vendor_product_id num read is fail(%d)", ret);
+
+ product_id_len /= (unsigned int)sizeof(*product_id_spec);
+
+ ret = of_property_read_u32_array(dnode, "vendor_product_id", product_id_list, product_id_len);
+ if (ret)
+ err("vendor_product_id read is fail(%d)", ret);
+
+ I2C_MUTEX_LOCK(actuator->i2c_lock);
+
+ if (product_id_len < 2 || (product_id_len % 2) != 0
+ || product_id_len > ZC569_MAX_PRODUCT_LIST) {
+ err("[%s] Invalid product_id in dts\n", __func__);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ for (i = 0; i < product_id_len; i += 2) {
+ ret = fimc_is_sensor_addr8_read8(client, product_id_list[i], &product_id);
+ if (ret < 0)
+ goto p_err;
+
+ pr_info("[%s][%d] dt[addr=%x,id=%x], module id=%x\n",
+ __func__, actuator->device, product_id_list[i], product_id_list[i+1], product_id);
+
+ if (product_id_list[i+1] == product_id) {
+ actuator->vendor_product_id = product_id_list[i+1];
+ break;
+ }
+ }
+
+ if (i == product_id_len) {
+ err("[%s] Invalid product_id in module\n", __func__);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* ToDo: Cal init data from FROM */
+
+ if (actuator->vendor_use_sleep_mode) {
+ /* Go sleep mode */
+ ret = fimc_is_sensor_addr8_write8(client, 0x02, 32);
+ } else {
+ ret = sensor_zc569_init_position(client, actuator);
+ if (ret < 0)
+ goto p_err;
+
+ /* Go active mode */
+ ret = fimc_is_sensor_addr8_write8(client, 0x02, 0);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* ToDo */
+ /* Wait Settling(>20ms) */
+ /* SysSleep(30/MS_PER_TICK, NULL); */
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(actuator->i2c_lock);
+ return ret;
+}
+
+int sensor_zc569_actuator_get_status(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator = NULL;
+ struct i2c_client *client = NULL;
+ enum fimc_is_actuator_status status = ACTUATOR_STATUS_NO_BUSY;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ dbg_actuator("%s\n", __func__);
+
+ WARN_ON(!subdev);
+ WARN_ON(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /*
+ * The info is busy flag.
+ * But, this module can't get busy flag.
+ */
+ status = ACTUATOR_STATUS_NO_BUSY;
+ *info = status;
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_zc569_actuator_set_position(struct v4l2_subdev *subdev, u32 *info)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client;
+ u32 position = 0;
+#ifdef DEBUG_ACTUATOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!info);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!actuator);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(actuator->i2c_lock);
+ position = *info;
+ if (position > ZC569_POS_MAX_SIZE) {
+ err("Invalid af position(position : %d, Max : %d).\n",
+ position, ZC569_POS_MAX_SIZE);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* position Set */
+ ret = sensor_zc569_write_position(client, position);
+ if (ret < 0)
+ goto p_err;
+ actuator->position = position;
+
+ dbg_actuator("%s [%d]: position(%d)\n", __func__, actuator->device, position);
+
+#ifdef DEBUG_ACTUATOR_TIME
+ do_gettimeofday(&end);
+ pr_info("[%s] time %lu us", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+p_err:
+ I2C_MUTEX_UNLOCK(actuator->i2c_lock);
+ return ret;
+}
+
+static int sensor_zc569_actuator_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
+{
+ int ret = 0;
+ u32 val = 0;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ACTUATOR_GET_STATUS:
+ ret = sensor_zc569_actuator_get_status(subdev, &val);
+ if (ret < 0) {
+ err("err!!! ret(%d), actuator status(%d)", ret, val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
+ default:
+ err("err!!! Unknown CID(%#x)", ctrl->id);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ctrl->value = val;
+
+p_err:
+ return ret;
+}
+
+static int sensor_zc569_actuator_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
+{
+ int ret = 0;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ACTUATOR_SET_POSITION:
+ ret = sensor_zc569_actuator_set_position(subdev, &ctrl->value);
+ if (ret) {
+ err("failed to actuator set position: %d, (%d)\n", ctrl->value, ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
+ default:
+ err("err!!! Unknown CID(%#x)", ctrl->id);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+p_err:
+ return ret;
+}
+
+#ifdef USE_AF_SLEEP_MODE
+static int sensor_zc569_actuator_set_active(struct v4l2_subdev *subdev, int enable)
+{
+ int ret = 0;
+ struct fimc_is_actuator *actuator;
+ struct i2c_client *client = NULL;
+ struct fimc_is_module_enum *module;
+
+ WARN_ON(!subdev);
+
+ actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!actuator);
+
+ if (!actuator->vendor_use_sleep_mode) {
+ warn("There is no 'use_af_sleep_mode' in DT");
+ return 0;
+ }
+
+ module = actuator->sensor_peri->module;
+ pr_info("%s [%d]=%d\n", __func__, actuator->device, enable);
+
+ client = actuator->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(actuator->i2c_lock);
+
+ if (enable) {
+ sensor_zc569_init_position(client, actuator);
+
+ /* Go active mode */
+ ret = fimc_is_sensor_addr8_write8(client, 0x02, 0);
+ if (ret < 0)
+ goto p_err;
+
+ } else {
+ /* Go sleep mode */
+ ret = fimc_is_sensor_addr8_write8(client, 0x02, 32);
+ if (ret < 0)
+ goto p_err;
+ }
+
+p_err:
+ I2C_MUTEX_UNLOCK(actuator->i2c_lock);
+ return ret;
+}
+#endif
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_zc569_actuator_init,
+ .g_ctrl = sensor_zc569_actuator_g_ctrl,
+ .s_ctrl = sensor_zc569_actuator_s_ctrl,
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+};
+
+static struct fimc_is_actuator_ops actuator_ops = {
+#ifdef USE_AF_SLEEP_MODE
+ .set_active = sensor_zc569_actuator_set_active,
+#endif
+};
+
+int sensor_zc569_actuator_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_actuator = NULL;
+ struct fimc_is_actuator *actuator = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ u32 sensor_id = 0;
+ u32 first_pos = 0;
+ u32 first_delay = 0;
+ bool vendor_use_sleep_mode = false;
+ struct device *dev;
+ struct device_node *dnode;
+
+ WARN_ON(!fimc_is_dev);
+ WARN_ON(!client);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core device is not yet probed");
+ ret = -EPROBE_DEFER;
+ goto p_err;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ if (of_property_read_bool(dnode, "vendor_use_sleep_mode"))
+ vendor_use_sleep_mode = true;
+
+ ret = of_property_read_u32(dnode, "vendor_first_pos", &first_pos);
+ if (ret) {
+ first_pos = ZC569_DEFAULT_FIRST_POSITION;
+ err("vendor_first_pos read is fail(%d)", ret);
+ }
+
+ ret = of_property_read_u32(dnode, "vendor_first_delay", &first_delay);
+ if (ret) {
+ first_delay = ZC569_DEFAULT_FIRST_DELAY;
+ err("vendor_first_delay read is fail(%d)", ret);
+ }
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret)
+ err("id read is fail(%d)", ret);
+
+ probe_info("%s sensor_id(%d)\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ actuator = kzalloc(sizeof(struct fimc_is_actuator), GFP_KERNEL);
+ if (!actuator) {
+ err("actuator is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_actuator = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_actuator) {
+ err("subdev_actuator is NULL");
+ ret = -ENOMEM;
+ kfree(actuator);
+ goto p_err;
+ }
+
+ actuator->id = ACTUATOR_NAME_ZC569;
+ actuator->subdev = subdev_actuator;
+ actuator->device = sensor_id;
+ actuator->client = client;
+ actuator->position = 0;
+ actuator->max_position = ZC569_POS_MAX_SIZE;
+ actuator->pos_size_bit = ZC569_POS_SIZE_BIT;
+ actuator->pos_direction = ZC569_POS_DIRECTION;
+ actuator->i2c_lock = NULL;
+ actuator->need_softlanding = 0;
+ actuator->actuator_ops = &actuator_ops;
+
+ actuator->vendor_product_id = ZC569_PRODUCT_ID; // ZC569 - initial product_id : AK7374
+ actuator->vendor_first_pos = first_pos;
+ actuator->vendor_first_delay = first_delay;
+ actuator->vendor_use_sleep_mode = vendor_use_sleep_mode;
+
+ device->subdev_actuator[sensor_id] = subdev_actuator;
+ device->actuator[sensor_id] = actuator;
+
+ v4l2_i2c_subdev_init(subdev_actuator, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_actuator, actuator);
+ v4l2_set_subdev_hostdata(subdev_actuator, device);
+
+ snprintf(subdev_actuator->name, V4L2_SUBDEV_NAME_SIZE, "actuator-subdev.%d", actuator->id);
+
+p_err:
+ probe_info("%s done\n", __func__);
+ return ret;
+}
+
+static int sensor_zc569_actuator_remove(struct i2c_client *client)
+{
+ int ret = 0;
+
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_zc569_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-actuator-zc569",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_zc569_match);
+
+static const struct i2c_device_id actuator_zc569_idt[] = {
+ { ACTUATOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver actuator_zc569_driver = {
+ .driver = {
+ .name = ACTUATOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_zc569_match
+ },
+ .probe = sensor_zc569_actuator_probe,
+ .remove = sensor_zc569_actuator_remove,
+ .id_table = actuator_zc569_idt
+};
+module_i2c_driver(actuator_zc569_driver);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Actuator driver
+ *
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_DEVICE_ZC569_H
+#define FIMC_IS_DEVICE_ZC569_H
+
+#define ACTUATOR_NAME "ZC569"
+
+#define ZC569_PRODUCT_ID 0x0E
+
+#define ZC569_POS_SIZE_BIT ACTUATOR_POS_SIZE_9BIT
+#define ZC569_POS_MAX_SIZE ((1 << ZC569_POS_SIZE_BIT) - 1)
+#define ZC569_POS_DIRECTION ACTUATOR_RANGE_INF_TO_MAC
+#define ZC569_REG_POS_HIGH 0x00
+#define ZC569_REG_POS_LOW 0x01
+
+#define ZC569_MAX_PRODUCT_LIST 2
+
+#endif
help
Use to build 3H1 camera sensor.
+config CAMERA_CIS_3J1_OBJ
+ bool "Use 3J1 camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build 3J1 camera sensor.
+
config CAMERA_CIS_4E6_OBJ
bool "Use 4E6 camera cis"
depends on USE_DIRECT_IS_CONTROL
help
Use to build 3P8 camera sensor.
+config CAMERA_CIS_3P9_OBJ
+ bool "Use 3P9 camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build 3P9 camera sensor.
+
config CAMERA_CIS_3P8SP_OBJ
bool "Use 3P8SP camera cis"
depends on USE_DIRECT_IS_CONTROL
help
Use to build 2L3 camera sensor.
+config CAMERA_CIS_2L4_OBJ
+ bool "Use 2L4 camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build 2L4 camera sensor.
+
config CAMERA_CIS_IMX260_OBJ
bool "Use IMX260 camera cis"
depends on USE_DIRECT_IS_CONTROL
help
Use to build SR259 camera sensor.
+config CAMERA_CIS_IMX576_OBJ
+ bool "Use IMX576 camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build IMX576 camera sensor.
+
+config CAMERA_CIS_5E9_OBJ
+ bool "Use S5K5E9 camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build S5K5E9 camera sensor.
+
+config CAMERA_CIS_4HA_OBJ
+ bool "Use S5K4HA camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build S5K4HA camera sensor.
+
+config CAMERA_CIS_2X5SP_OBJ
+ bool "Use 2X5SP camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build 2X5SP camera sensor.
+
+config CAMERA_CIS_GM1SP_OBJ
+ bool "Use GM1SP camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build GM1SP camera sensor.
+
+config CAMERA_CIS_12A10_OBJ
+ bool "Use 12A10 camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build 12A10 camera sensor.
+
+config CAMERA_CIS_12A10FF_OBJ
+ bool "Use 12A10FF camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build 12A10FF camera sensor.
+
+config CAMERA_CIS_16885C_OBJ
+ bool "Use 16885C camera cis"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_CIS_SELECT
+ default n
+ help
+ Use to build 16885C camera sensor.
+
config CAMERA_CIS_VIRTUAL_OBJ
bool "Use VIRTUAL camera cis"
depends on USE_DIRECT_IS_CONTROL
obj-$(CONFIG_USE_DIRECT_IS_CONTROL) += fimc-is-cis.o
obj-$(CONFIG_CAMERA_CIS_5E2_OBJ) += fimc-is-cis-5e2.o
obj-$(CONFIG_CAMERA_CIS_5E3_OBJ) += fimc-is-cis-5e3.o
+obj-$(CONFIG_CAMERA_CIS_5E9_OBJ) += fimc-is-cis-5e9.o
obj-$(CONFIG_CAMERA_CIS_4H5YC_OBJ) += fimc-is-cis-4h5yc.o
obj-$(CONFIG_CAMERA_CIS_4H5_OBJ) += fimc-is-cis-4h5.o
+obj-$(CONFIG_CAMERA_CIS_4HA_OBJ) += fimc-is-cis-4ha.o
obj-$(CONFIG_CAMERA_CIS_6B2_OBJ) += fimc-is-cis-6b2.o
obj-$(CONFIG_CAMERA_CIS_2P2_OBJ) += fimc-is-cis-2p2.o
obj-$(CONFIG_CAMERA_CIS_2P6_OBJ) += fimc-is-cis-2p6.o
obj-$(CONFIG_CAMERA_CIS_3P3_OBJ) += fimc-is-cis-3p3.o
obj-$(CONFIG_CAMERA_CIS_3L2_OBJ) += fimc-is-cis-3l2.o
obj-$(CONFIG_CAMERA_CIS_3H1_OBJ) += fimc-is-cis-3h1.o
+obj-$(CONFIG_CAMERA_CIS_3J1_OBJ) += fimc-is-cis-3j1.o
obj-$(CONFIG_CAMERA_CIS_4E6_OBJ) += fimc-is-cis-4e6.o
obj-$(CONFIG_CAMERA_CIS_3M2_OBJ) += fimc-is-cis-3m2.o
obj-$(CONFIG_CAMERA_CIS_3M3_OBJ) += fimc-is-cis-3m3.o
obj-$(CONFIG_CAMERA_CIS_2T7SX_OBJ) += fimc-is-cis-2t7sx.o
obj-$(CONFIG_CAMERA_CIS_2L2_OBJ) += fimc-is-cis-2l2.o
obj-$(CONFIG_CAMERA_CIS_2L3_OBJ) += fimc-is-cis-2l3.o
+obj-$(CONFIG_CAMERA_CIS_2L4_OBJ) += fimc-is-cis-2l4.o
obj-$(CONFIG_CAMERA_CIS_IMX260_OBJ) += fimc-is-cis-imx260.o
obj-$(CONFIG_CAMERA_CIS_2L7_OBJ) += fimc-is-cis-2l7.o
obj-$(CONFIG_CAMERA_CIS_IMX320_OBJ) += fimc-is-cis-imx320.o
obj-$(CONFIG_CAMERA_CIS_IMX219_OBJ) += fimc-is-cis-imx219.o
obj-$(CONFIG_CAMERA_CIS_IMX258_OBJ) += fimc-is-cis-imx258.o
obj-$(CONFIG_CAMERA_CIS_IMX241_OBJ) += fimc-is-cis-imx241.o
+obj-$(CONFIG_CAMERA_CIS_IMX576_OBJ) += fimc-is-cis-imx576.o
obj-$(CONFIG_CAMERA_CIS_SR259_OBJ) += fimc-is-cis-sr259.o
+obj-$(CONFIG_CAMERA_CIS_3P9_OBJ) += fimc-is-cis-3p9.o
+obj-$(CONFIG_CAMERA_CIS_2X5SP_OBJ) += fimc-is-cis-2x5sp.o
+obj-$(CONFIG_CAMERA_CIS_GM1SP_OBJ) += fimc-is-cis-gm1sp.o
+obj-$(CONFIG_CAMERA_CIS_12A10_OBJ) += fimc-is-cis-12a10.o
+obj-$(CONFIG_CAMERA_CIS_12A10FF_OBJ) += fimc-is-cis-12a10ff.o
+obj-$(CONFIG_CAMERA_CIS_16885C_OBJ) += fimc-is-cis-16885c.o
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2/include
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_12A10_SET_A_H
+#define FIMC_IS_CIS_12A10_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-12a10.h"
+
+const u32 sensor_12a10_setfile_A_Global[] = {
+ 0x0103, 0x01, 0x01,
+ 0x0300, 0x02, 0x01,
+ 0x0302, 0x58, 0x01,
+ 0x0303, 0x00, 0x01,
+ 0x0304, 0x00, 0x01,
+ 0x0305, 0x01, 0x01,
+ 0x030b, 0x02, 0x01,
+ 0x030d, 0x64, 0x01,
+ 0x030e, 0x02, 0x01,
+ 0x0313, 0x05, 0x01,
+ 0x3002, 0x21, 0x01,
+ 0x3012, 0x40, 0x01,
+ 0x3013, 0x72, 0x01,
+ 0x3016, 0x72, 0x01,
+ 0x301b, 0xd0, 0x01,
+ 0x301d, 0xf0, 0x01,
+ 0x301f, 0xd0, 0x01,
+ 0x3021, 0x03, 0x01,
+ 0x3022, 0x01, 0x01,
+ 0x3106, 0x15, 0x01,
+ 0x3107, 0x23, 0x01,
+ 0x3500, 0x00, 0x01,
+ 0x3501, 0xd0, 0x01,
+ 0x3502, 0x00, 0x01,
+ 0x3505, 0x83, 0x01,
+ 0x3508, 0x02, 0x01,
+ 0x3509, 0x00, 0x01,
+ 0x3600, 0x43, 0x01,
+ 0x3611, 0x8a, 0x01,
+ 0x3613, 0x97, 0x01,
+ 0x3620, 0x80, 0x01,
+ 0x3624, 0x2c, 0x01,
+ 0x3625, 0xa0, 0x01,
+ 0x3626, 0x00, 0x01,
+ 0x3631, 0x00, 0x01,
+ 0x3632, 0x01, 0x01,
+ 0x3641, 0x80, 0x01,
+ 0x3642, 0x12, 0x01,
+ 0x3644, 0x78, 0x01,
+ 0x3645, 0xa7, 0x01,
+ 0x364e, 0x44, 0x01,
+ 0x364f, 0x44, 0x01,
+ 0x3650, 0x11, 0x01,
+ 0x3654, 0x00, 0x01,
+ 0x3657, 0x31, 0x01,
+ 0x3659, 0x0c, 0x01,
+ 0x365f, 0x07, 0x01,
+ 0x3661, 0x17, 0x01,
+ 0x3662, 0x17, 0x01,
+ 0x3663, 0x17, 0x01,
+ 0x3664, 0x17, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3680, 0x00, 0x01,
+ 0x3714, 0x24, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x04, 0x01,
+ 0x3739, 0x12, 0x01,
+ 0x3765, 0x20, 0x01,
+ 0x3767, 0x00, 0x01,
+ 0x37a1, 0x3e, 0x01,
+ 0x37a8, 0x4d, 0x01,
+ 0x37ab, 0x2c, 0x01,
+ 0x37c2, 0x04, 0x01,
+ 0x37d8, 0x03, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e0, 0x00, 0x01,
+ 0x37e1, 0x0a, 0x01,
+ 0x37e2, 0x14, 0x01,
+ 0x37e3, 0x04, 0x01,
+ 0x37e4, 0x2a, 0x01,
+ 0x37e5, 0x03, 0x01,
+ 0x37e6, 0x04, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x0f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x10, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x0c, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380c, 0x04, 0x01,
+ 0x380d, 0x28, 0x01,
+ 0x380e, 0x0d, 0x01,
+ 0x380f, 0x12, 0x01,
+ 0x3811, 0x0a, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x01, 0x01,
+ 0x3815, 0x01, 0x01,
+ 0x3816, 0x01, 0x01,
+ 0x3817, 0x01, 0x01,
+ 0x3820, 0xa8, 0x01,
+ 0x3821, 0x00, 0x01,
+ 0x3822, 0x81, 0x01,
+ 0x3823, 0x18, 0x01,
+ 0x3826, 0x00, 0x01,
+ 0x3827, 0x00, 0x01,
+ 0x3829, 0x03, 0x01,
+ 0x3832, 0x08, 0x01,
+ 0x3833, 0x30, 0x01,
+ 0x3c80, 0x00, 0x01,
+ 0x3c87, 0x01, 0x01,
+ 0x3c8c, 0x1a, 0x01,
+ 0x3c8d, 0x68, 0x01,
+ 0x3c97, 0x02, 0x01,
+ 0x3cc0, 0x40, 0x01,
+ 0x3cc1, 0x54, 0x01,
+ 0x3cc2, 0x34, 0x01,
+ 0x3cc3, 0x04, 0x01,
+ 0x3cc4, 0x00, 0x01,
+ 0x3cc5, 0x00, 0x01,
+ 0x3cc6, 0x00, 0x01,
+ 0x3cc7, 0x00, 0x01,
+ 0x3cc8, 0x00, 0x01,
+ 0x3cc9, 0x00, 0x01,
+ 0x3d8c, 0x73, 0x01,
+ 0x3d8d, 0xc0, 0x01,
+ 0x4001, 0x2b, 0x01,
+ 0x4008, 0x02, 0x01,
+ 0x4009, 0x0f, 0x01,
+ 0x4011, 0xff, 0x01,
+ 0x4013, 0x08, 0x01,
+ 0x4014, 0x08, 0x01,
+ 0x4015, 0x08, 0x01,
+ 0x4017, 0x08, 0x01,
+ 0x401a, 0x58, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x405e, 0x20, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x4503, 0x00, 0x01,
+ 0x450a, 0x04, 0x01,
+ 0x4601, 0x30, 0x01,
+ 0x4800, 0x00, 0x01,
+ 0x481f, 0x30, 0x01,
+ 0x4837, 0x0d, 0x01,
+ 0x483c, 0x0f, 0x01,
+ 0x484b, 0x01, 0x01,
+ 0x4d00, 0x05, 0x01,
+ 0x4d01, 0x19, 0x01,
+ 0x4d02, 0xfd, 0x01,
+ 0x4d03, 0xd1, 0x01,
+ 0x4d04, 0xff, 0x01,
+ 0x4d05, 0xff, 0x01,
+ 0x5000, 0x09, 0x01,
+ 0x5001, 0x42, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x5005, 0x00, 0x01,
+ 0x5081, 0x04, 0x01,
+ 0x5180, 0x00, 0x01,
+ 0x5181, 0x10, 0x01,
+ 0x5182, 0x02, 0x01,
+ 0x5183, 0x0f, 0x01,
+ 0x5185, 0x6c, 0x01,
+ 0x5200, 0x03, 0x01,
+ 0x520b, 0x07, 0x01,
+ 0x520c, 0x0f, 0x01,
+ 0x3642, 0x12, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3714, 0x24, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x04, 0x01,
+ 0x3739, 0x12, 0x01,
+ 0x37c2, 0x04, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x04, 0x01,
+ 0x37e4, 0x2a, 0x01,
+ 0x37e6, 0x04, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x0f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x10, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x0c, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380e, 0x0d, 0x01,
+ 0x380f, 0x40, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x0a, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x01, 0x01,
+ 0x3816, 0x01, 0x01,
+ 0x3820, 0xa8, 0x01,
+ 0x4009, 0x0f, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0xd0, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+
+const u32 sensor_12a10_setfile_A_4096x3072_30fps[] = {
+ 0x3642, 0x12, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3714, 0x24, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x04, 0x01,
+ 0x3739, 0x12, 0x01,
+ 0x37c2, 0x04, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x04, 0x01,
+ 0x37e4, 0x2a, 0x01,
+ 0x37e6, 0x04, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x0f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x10, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x0c, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380e, 0x0d, 0x01,
+ 0x380f, 0x40, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x0a, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x01, 0x01,
+ 0x3816, 0x01, 0x01,
+ 0x3820, 0xa8, 0x01,
+ 0x4009, 0x0f, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0xd0, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+
+const u32 sensor_12a10_setfile_A_2048x1536_60fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x1f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x08, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x06, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380e, 0x06, 0x01,
+ 0x380f, 0xa0, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x06, 0x01,
+ 0x3813, 0x04, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x69, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+#if 0
+const u32 sensor_12a10_setfile_A_2000x1124_60fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x00, 0x01,
+ 0x366b, 0xa4, 0x01,
+ 0x366c, 0x20, 0x01,
+ 0x366d, 0xa4, 0x01,
+ 0x366e, 0x20, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x01, 0x01,
+ 0x3803, 0x9c, 0x01,
+ 0x3804, 0x0f, 0x01,
+ 0x3805, 0xff, 0x01,
+ 0x3806, 0x0a, 0x01,
+ 0x3807, 0x73, 0x01,
+ 0x3808, 0x07, 0x01,
+ 0x3809, 0xd0, 0x01,
+ 0x380a, 0x04, 0x01,
+ 0x380b, 0x64, 0x01,
+ 0x380e, 0x06, 0x01,
+ 0x380f, 0xa0, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x1c, 0x01,
+ 0x3813, 0x04, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x69, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+
+const u32 sensor_12a10_setfile_A_1920x1080_60fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x00, 0x01,
+ 0x366b, 0xa4, 0x01,
+ 0x366c, 0x20, 0x01,
+ 0x366d, 0xa4, 0x01,
+ 0x366e, 0x20, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x01, 0x01,
+ 0x3803, 0xc8, 0x01,
+ 0x3804, 0x0f, 0x01,
+ 0x3805, 0xff, 0x01,
+ 0x3806, 0x0a, 0x01,
+ 0x3807, 0x47, 0x01,
+ 0x3808, 0x07, 0x01,
+ 0x3809, 0x80, 0x01,
+ 0x380a, 0x04, 0x01,
+ 0x380b, 0x38, 0x01,
+ 0x380e, 0x06, 0x01,
+ 0x380f, 0xa0, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x44, 0x01,
+ 0x3813, 0x04, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x69, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+#endif
+const u32 sensor_12a10_setfile_A_1280x720_120fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x00, 0x01,
+ 0x366b, 0xa4, 0x01,
+ 0x366c, 0x20, 0x01,
+ 0x366d, 0xa4, 0x01,
+ 0x366e, 0x20, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x03, 0x01,
+ 0x3803, 0x28, 0x01,
+ 0x3804, 0x0f, 0x01,
+ 0x3805, 0xff, 0x01,
+ 0x3806, 0x08, 0x01,
+ 0x3807, 0xe7, 0x01,
+ 0x3808, 0x05, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x02, 0x01,
+ 0x380b, 0xd0, 0x01,
+ 0x380e, 0x03, 0x01,
+ 0x380f, 0x50, 0x01,
+ 0x3810, 0x01, 0x01,
+ 0x3811, 0x84, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x34, 0x01,
+ 0x3502, 0x40, 0x01,
+};
+
+const struct sensor_pll_info_compact sensor_12a10_pllinfo_A_4096x3072_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0D40, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+
+const struct sensor_pll_info_compact sensor_12a10_pllinfo_A_2048x1536_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x06A0, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+#if 0
+const struct sensor_pll_info_compact sensor_12a10_pllinfo_A_2000x1124_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x06A0, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+
+const struct sensor_pll_info_compact sensor_12a10_pllinfo_A_1920x1080_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x06A0, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+#endif
+const struct sensor_pll_info_compact sensor_12a10_pllinfo_A_1280x720_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0350, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+
+static const u32 *sensor_12a10_setfiles_A[] = {
+ sensor_12a10_setfile_A_4096x3072_30fps,
+ sensor_12a10_setfile_A_2048x1536_60fps,
+ /*sensor_12a10_setfile_A_2000x1124_60fps,
+ sensor_12a10_setfile_A_1920x1080_60fps,*/
+ sensor_12a10_setfile_A_1280x720_120fps,
+};
+
+static const u32 sensor_12a10_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_12a10_setfile_A_4096x3072_30fps),
+ ARRAY_SIZE(sensor_12a10_setfile_A_2048x1536_60fps),
+ /*ARRAY_SIZE(sensor_12a10_setfile_A_2000x1124_60fps),
+ ARRAY_SIZE(sensor_12a10_setfile_A_1920x1080_60fps),*/
+ ARRAY_SIZE(sensor_12a10_setfile_A_1280x720_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_12a10_pllinfos_A[] = {
+ &sensor_12a10_pllinfo_A_4096x3072_30fps,
+ &sensor_12a10_pllinfo_A_2048x1536_60fps,
+ /*&sensor_12a10_pllinfo_A_2000x1124_60fps,
+ &sensor_12a10_pllinfo_A_1920x1080_60fps,*/
+ &sensor_12a10_pllinfo_A_1280x720_120fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-12a10.h"
+#include "fimc-is-cis-12a10-setA.h"
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "OV12A10"
+/* #define DEBUG_12A10_PLL */
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_12a10_global;
+static u32 sensor_12a10_global_size;
+static const u32 **sensor_12a10_setfiles;
+static const u32 *sensor_12a10_setfile_sizes;
+static const struct sensor_pll_info_compact **sensor_12a10_pllinfos;
+static u32 sensor_12a10_max_setfile_num;
+
+static void sensor_12a10_cis_data_calculation(const struct sensor_pll_info_compact *pll_info_compact, cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, frame_valid_us = 0;
+ u64 max_fps = 0;
+
+ FIMC_BUG_VOID(!pll_info_compact);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info_compact->pclk;
+
+ dbg_sensor(1, "ext_clock(%d), mipi_datarate(%d), pclk(%d)\n",
+ pll_info_compact->ext_clk, pll_info_compact->mipi_datarate, pll_info_compact->pclk);
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info_compact->frame_length_lines(%d) * pll_info_compact->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info_compact->frame_length_lines, pll_info_compact->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = ((u64)vt_pix_clk_hz * 10) / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = (u32)max_fps;
+ cis_data->frame_length_lines = pll_info_compact->frame_length_lines;
+ cis_data->line_length_pck = pll_info_compact->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_12A10_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = cis_data->cur_width;
+ cis_data->min_coarse_integration_time = SENSOR_12A10_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_12A10_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+int sensor_12a10_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read8(client, 0x300B, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+/* CIS OPS */
+int sensor_12a10_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+ setinfo.return_value = 0;
+
+ setinfo.param = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+
+ cis->cis_data->cur_width = SENSOR_12A10_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_12A10_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_12a10_cis_data_calculation(sensor_12a10_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ return -ENODEV;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -ENODEV;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ sensor_cis_dump_registers(subdev, sensor_12a10_setfiles[0], sensor_12a10_setfile_sizes[0]);
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_12a10_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+ if (hold)
+ ret = fimc_is_sensor_write8(client, 0x3208, 0x00);
+ else
+ ret = fimc_is_sensor_write8(client, 0x3208, 0x10);
+ ret = fimc_is_sensor_write8(client, 0x320b, 0x00);
+ ret = fimc_is_sensor_write8(client, 0x3208, 0xa0);
+
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_12a10_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_12a10_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_12a10_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_12a10_global, sensor_12a10_global_size);
+
+ if (ret < 0) {
+ err("sensor_12a10_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_12a10_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ return -EINVAL;
+ }
+
+ sensor_12a10_cis_data_calculation(sensor_12a10_pllinfos[mode], cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_12a10_setfiles[mode], sensor_12a10_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_12a10_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+/* Deprecated */
+int sensor_12a10_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ return 0;
+}
+
+int sensor_12a10_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_12a10_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+ /* Sensor stream on */
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_12a10_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream off");
+
+ /* Sensor stream off */
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u8 short_coarse_val[3] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short exposure */
+ short_coarse_val[0] = (short_coarse_int & 0xF000) >> 12;
+ short_coarse_val[1] = (short_coarse_int & 0x0FF0) >> 4;
+ short_coarse_val[2] = (short_coarse_int & 0x000F) << 4;
+ ret = fimc_is_sensor_write8_array(client, 0x3500, short_coarse_val, 3);
+ if (ret < 0)
+ goto p_err;
+#if 0
+ /* Long exposure */
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x3c92, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+#endif
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d), line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, cis_data->sen_vsync_count, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x), long_coarse_int %#x, short_coarse_int %#x\n",
+ cis->id, __func__, cis_data->sen_vsync_count, cis_data->frame_length_lines,
+ long_coarse_int, short_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update here? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time,
+ frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+ u64 numerator;
+ u32 max_coarse_integration_time = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * frame_duration;
+ frame_length_lines = (u16)((numerator / line_length_pck) / (1000 * 1000));
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, cis_data->pclk, frame_duration, line_length_pck, frame_length_lines);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x380e, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+
+ max_coarse_integration_time = cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+ cis_data->max_coarse_integration_time = max_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_12a10_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+#define REG_1X_BASE_VALUE 1000
+#define REG_1X_BASE 0x0080
+#define REG_2X_BASE_VALUE 2000
+#define REG_2X_BASE 0x0100
+#define REG_4X_BASE_VALUE 4000
+#define REG_4X_BASE 0x0200
+#define REG_8X_BASE_VALUE 8000
+#define REG_8X_BASE 0x0400
+#define REG_UPPER_BOUND 15500
+
+#define REG_1X_MIN_VALUE 0x0080
+#define REG_1X_MAX_VALUE 0x00F8
+#define REG_2X_MAX_VALUE 0x01F0
+#define REG_4X_MAX_VALUE 0x03E0
+#define REG_8X_MAX_VALUE 0x07F0
+
+static u32 sensor_12a10_again_to_reg_value(u32 again)
+{
+ u32 level;
+ u32 reg_value;
+
+ /* 1x ~ 1.9375x: 0x0080 ~ 0x00F8, step = 0.0625x, 0x08 */
+ /* 2x ~ 3.875 x: 0x0100 ~ 0x01F0, step = 0.125x, 0x10 */
+ /* 4x ~ 7.75 x: 0x0200 ~ 0x03E0, step = 0.25x, 0x20 */
+ /* 8x ~ 15.5 x: 0x0400 ~ 0x07F0, step = 0.5x, 0x40 */
+ if (again < REG_2X_BASE_VALUE) {
+ level = ((again - REG_1X_BASE_VALUE) << 4) / 1000; /* step_num */
+ reg_value = REG_1X_BASE + level * 8; /* reg_val = reg_base + step_num * step */
+ } else if (again < REG_4X_BASE_VALUE) {
+ level = ((again - REG_2X_BASE_VALUE) << 3) / 1000;
+ reg_value = REG_2X_BASE + level * 16;
+ } else if (again < REG_8X_BASE_VALUE) {
+ level = ((again - REG_4X_BASE_VALUE) << 2) / 1000;
+ reg_value = REG_4X_BASE + level * 32;
+ } else if (again < REG_UPPER_BOUND) {
+ level = ((again - REG_8X_BASE_VALUE) << 1) / 1000;
+ reg_value = REG_8X_BASE + level * 64;
+ } else {
+ reg_value = REG_8X_MAX_VALUE;
+ }
+
+ return reg_value;
+}
+
+static u32 sensor_12a10_reg_value_to_again(u32 reg_value)
+{
+ u32 again;
+
+ if (reg_value <= REG_1X_MAX_VALUE) {
+ again = ((((reg_value - REG_1X_BASE) >> 3) * 1000) >> 4) + REG_1X_BASE_VALUE;
+ } else if (reg_value <= REG_2X_MAX_VALUE) {
+ again = ((((reg_value - REG_2X_BASE) >> 2) * 1000) >> 4) + REG_2X_BASE_VALUE;
+ } else if (reg_value <= REG_4X_MAX_VALUE) {
+ again = ((((reg_value - REG_4X_BASE) >> 1) * 1000) >> 4) + REG_4X_BASE_VALUE;
+ } else if (reg_value <= REG_8X_MAX_VALUE) {
+ again = ((((reg_value - REG_8X_BASE) >> 0) * 1000) >> 4) + REG_8X_BASE_VALUE;
+ } else {
+ again = REG_1X_BASE_VALUE;
+ }
+
+ return again;
+}
+
+int sensor_12a10_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_12a10_again_to_reg_value(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_12a10_reg_value_to_again(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_12a10_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+ u8 analog_val[2] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ analog_gain = (u16)sensor_12a10_again_to_reg_value(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ analog_val[0] = (analog_gain & 0xFF00) >> 8;
+ analog_val[1] = (analog_gain & 0x00FF);
+ ret = fimc_is_sensor_write8_array(client, 0x3508, analog_val, 2);
+ ret = fimc_is_sensor_write8_array(client, 0x350c, analog_val, 2);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x3508, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_12a10_reg_value_to_again(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_analog_gain[0] = REG_1X_MIN_VALUE;
+ cis_data->min_analog_gain[1] = 1000;
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_analog_gain[0] = REG_8X_MAX_VALUE;
+ cis_data->max_analog_gain[1] = 15500;
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+#define REG_1X_BASE_DGAIN_VALUE 1000
+#define REG_1X_BASE_DGAIN 0x0400
+
+u32 sensor_12a10_dgain_to_reg_value(u32 permile)
+{
+ u32 reg_dgain;
+ reg_dgain = permile * REG_1X_BASE_DGAIN / REG_1X_BASE_DGAIN_VALUE;
+
+ return reg_dgain;
+}
+
+int sensor_12a10_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u8 reg_short_gain[2] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_12a10_dgain_to_reg_value(dgain->long_val);
+ short_gain = (u16)sensor_12a10_dgain_to_reg_value(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ reg_short_gain[0] = (short_gain & 0x3FFF) >> 8;
+ reg_short_gain[1] = (short_gain & 0xFF);
+ fimc_is_sensor_write8(client, 0x350A, reg_short_gain[0]);
+ fimc_is_sensor_write8(client, 0x350B, reg_short_gain[1]);
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, dgain->long_val,
+ dgain->short_val, long_gain, short_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x350a, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_digital_gain[0] = REG_1X_BASE_DGAIN;
+ cis_data->min_digital_gain[1] = REG_1X_BASE_DGAIN_VALUE;
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_digital_gain[0] = 0x3FFF;
+ cis_data->max_digital_gain[1] = 16000;
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10_cis_wait_streamon(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u32 wait_cnt = 0, time_out_cnt = 2500;
+ u8 sensor_fcount = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (unlikely(!cis)) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ if (unlikely(!cis_data)) {
+ err("cis_data is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ /*
+ * Read sensor frame counter (sensor_fcount address = 0x483F)
+ * stream on (0x00 ~ 0xFE), stream off (0xFF)
+ */
+ while (sensor_fcount == 0x00) {
+ usleep_range(CIS_STREAM_ON_WAIT_TIME, CIS_STREAM_ON_WAIT_TIME);
+ wait_cnt++;
+
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ if (wait_cnt >= time_out_cnt) {
+ err("[MOD:D:%d] %s, Don't sensor stream on and time out, wait_limit(%d) > time_out(%d), sensor_fcount(%d)",
+ cis->id, __func__, wait_cnt, time_out_cnt, sensor_fcount);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, sensor_fcount(%d), (wait_limit(%d) < time_out(%d))\n",
+ cis->id, __func__, sensor_fcount, wait_cnt, time_out_cnt);
+ }
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ /* retention mode CRC wait calculation */
+ usleep_range(1000, 1000);
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10_cis_wait_streamoff(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u32 wait_cnt = 0, time_out_cnt = 250;
+ u8 sensor_fcount = 0;
+
+ BUG_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ cis_data = cis->cis_data;
+ client = cis->client;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ while (sensor_fcount != 0x00) {
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ usleep_range(CIS_STREAM_OFF_WAIT_TIME, CIS_STREAM_OFF_WAIT_TIME);
+ wait_cnt++;
+
+ if (wait_cnt >= time_out_cnt) {
+ err("[MOD:D:%d] %s, time out, wait_limit(%d) > time_out(%d), sensor_fcount(%d)",
+ cis->id, __func__, wait_cnt, time_out_cnt, sensor_fcount);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, sensor_fcount(%d), (wait_limit(%d) < time_out(%d))\n",
+ cis->id, __func__, sensor_fcount, wait_cnt, time_out_cnt);
+ }
+
+p_err:
+ return ret;
+}
+
+static int sensor_12a10_cis_set_dual_slave_setting(struct fimc_is_cis *cis)
+{
+ int ret = 0;
+ struct i2c_client *client;
+
+ cis_shared_data *cis_data;
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ cis_data = cis->cis_data;
+
+ /* Vsync Input Source Select */
+ fimc_is_sensor_write8(client, 0x3002, 0x21);
+ fimc_is_sensor_write8(client, 0x3643, 0x22);
+ fimc_is_sensor_write8(client, 0x3822, 0xa1);
+ fimc_is_sensor_write8(client, 0x3823, 0x78);
+ fimc_is_sensor_write8(client, 0x3824, 0x00);// frame start sync
+ fimc_is_sensor_write8(client, 0x3825, 0x20);
+ fimc_is_sensor_write8(client, 0x3826, 0x00);
+ fimc_is_sensor_write8(client, 0x3827, 0x08);
+ fimc_is_sensor_write8(client, 0x3c80, 0x08);
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10_cis_set_dual_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ switch (cis->dual_sync_mode) {
+ case DUAL_SYNC_MASTER:
+ break;
+ case DUAL_SYNC_SLAVE:
+ ret = sensor_12a10_cis_set_dual_slave_setting(cis);
+ if (ret)
+ err("12a10 dual slave setting fail");
+ break;
+ default:
+ err("invalid cis->dual_sync_mode(%d)\n", cis->dual_sync_mode);
+ ret = -EINVAL;
+ }
+
+p_err:
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_12a10_cis_init,
+ .cis_log_status = sensor_12a10_cis_log_status,
+ .cis_group_param_hold = sensor_12a10_cis_group_param_hold,
+ .cis_set_global_setting = sensor_12a10_cis_set_global_setting,
+ .cis_mode_change = sensor_12a10_cis_mode_change,
+ .cis_set_size = sensor_12a10_cis_set_size,
+ .cis_stream_on = sensor_12a10_cis_stream_on,
+ .cis_stream_off = sensor_12a10_cis_stream_off,
+ .cis_set_exposure_time = sensor_12a10_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_12a10_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_12a10_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_12a10_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_12a10_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_12a10_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_12a10_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_12a10_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_12a10_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_12a10_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_12a10_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_12a10_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_12a10_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_12a10_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_12a10_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_12a10_cis_check_rev,
+ .cis_factory_test = sensor_cis_factory_test,
+ .cis_wait_streamoff = sensor_12a10_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_12a10_cis_wait_streamon,
+ .cis_set_dual_setting = sensor_12a10_cis_set_dual_setting,
+};
+
+static int cis_12a10_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_OV12A10);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ probe_err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_OV12A10;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_BG_GR;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ if (of_property_read_bool(dnode, "dual_sync_mode")) {
+ ret = of_property_read_u32(dnode, "dual_sync_mode", &cis->dual_sync_mode);
+ if (ret)
+ warn("dual_sync_mode read is fail(%d)", ret);
+ } else {
+ cis->dual_sync_mode = DUAL_SYNC_NONE;
+ }
+
+ probe_info("%s dual_sync_mode %d\n", __func__, cis->dual_sync_mode);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_12a10_global = sensor_12a10_setfile_A_Global;
+ sensor_12a10_global_size = ARRAY_SIZE(sensor_12a10_setfile_A_Global);
+ sensor_12a10_setfiles = sensor_12a10_setfiles_A;
+ sensor_12a10_setfile_sizes = sensor_12a10_setfile_A_sizes;
+ sensor_12a10_pllinfos = sensor_12a10_pllinfos_A;
+ sensor_12a10_max_setfile_num = ARRAY_SIZE(sensor_12a10_setfiles_A);
+ }
+
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_12a10_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-12a10",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_12a10_match);
+
+static const struct i2c_device_id sensor_cis_12a10_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_12a10_driver = {
+ .probe = cis_12a10_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_12a10_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_12a10_idt
+};
+
+static int __init sensor_cis_12a10_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_12a10_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_12a10_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_12a10_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_12A10_H
+#define FIMC_IS_CIS_12A10_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_12A10_MAX_WIDTH (4096)
+#define SENSOR_12A10_MAX_HEIGHT (3072)
+
+/* TODO: Check below values are valid */
+#define SENSOR_12A10_FINE_INTEGRATION_TIME_MIN 0x0
+#define SENSOR_12A10_FINE_INTEGRATION_TIME_MAX 0x0 /* Not used */
+#define SENSOR_12A10_COARSE_INTEGRATION_TIME_MIN 0x4 /* TODO */
+#define SENSOR_12A10_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x8 /* TODO */
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_12A10FF_SET_A_H
+#define FIMC_IS_CIS_12A10FF_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-12a10ff.h"
+
+const u32 sensor_12a10ff_setfile_A_Global[] = {
+ 0x0103, 0x01, 0x01,
+ 0x0300, 0x02, 0x01,
+ 0x0302, 0x58, 0x01,
+ 0x0303, 0x00, 0x01,
+ 0x0304, 0x00, 0x01,
+ 0x0305, 0x01, 0x01,
+ 0x030b, 0x02, 0x01,
+ 0x030d, 0x64, 0x01,
+ 0x030e, 0x02, 0x01,
+ 0x0313, 0x05, 0x01,
+ 0x3002, 0x21, 0x01,
+ 0x3012, 0x40, 0x01,
+ 0x3013, 0x72, 0x01,
+ 0x3016, 0x72, 0x01,
+ 0x301b, 0xd0, 0x01,
+ 0x301d, 0xf0, 0x01,
+ 0x301f, 0xd0, 0x01,
+ 0x3021, 0x03, 0x01,
+ 0x3022, 0x01, 0x01,
+ 0x3106, 0x15, 0x01,
+ 0x3107, 0x23, 0x01,
+ 0x3500, 0x00, 0x01,
+ 0x3501, 0xd0, 0x01,
+ 0x3502, 0x00, 0x01,
+ 0x3505, 0x83, 0x01,
+ 0x3508, 0x02, 0x01,
+ 0x3509, 0x00, 0x01,
+ 0x3600, 0x43, 0x01,
+ 0x3611, 0x8a, 0x01,
+ 0x3613, 0x97, 0x01,
+ 0x3620, 0x80, 0x01,
+ 0x3624, 0x2c, 0x01,
+ 0x3625, 0xa0, 0x01,
+ 0x3626, 0x00, 0x01,
+ 0x3631, 0x00, 0x01,
+ 0x3632, 0x01, 0x01,
+ 0x3641, 0x80, 0x01,
+ 0x3642, 0x12, 0x01,
+ 0x3644, 0x78, 0x01,
+ 0x3645, 0xa7, 0x01,
+ 0x364e, 0x44, 0x01,
+ 0x364f, 0x44, 0x01,
+ 0x3650, 0x11, 0x01,
+ 0x3654, 0x00, 0x01,
+ 0x3657, 0x31, 0x01,
+ 0x3659, 0x0c, 0x01,
+ 0x365f, 0x07, 0x01,
+ 0x3661, 0x17, 0x01,
+ 0x3662, 0x17, 0x01,
+ 0x3663, 0x17, 0x01,
+ 0x3664, 0x17, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3680, 0x00, 0x01,
+ 0x3714, 0x24, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x04, 0x01,
+ 0x3739, 0x12, 0x01,
+ 0x3765, 0x20, 0x01,
+ 0x3767, 0x00, 0x01,
+ 0x37a1, 0x3e, 0x01,
+ 0x37a8, 0x4d, 0x01,
+ 0x37ab, 0x2c, 0x01,
+ 0x37c2, 0x04, 0x01,
+ 0x37d8, 0x03, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e0, 0x00, 0x01,
+ 0x37e1, 0x0a, 0x01,
+ 0x37e2, 0x14, 0x01,
+ 0x37e3, 0x04, 0x01,
+ 0x37e4, 0x2a, 0x01,
+ 0x37e5, 0x03, 0x01,
+ 0x37e6, 0x04, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x0f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x10, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x0c, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380c, 0x04, 0x01,
+ 0x380d, 0x28, 0x01,
+ 0x380e, 0x0d, 0x01,
+ 0x380f, 0x12, 0x01,
+ 0x3811, 0x0a, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x01, 0x01,
+ 0x3815, 0x01, 0x01,
+ 0x3816, 0x01, 0x01,
+ 0x3817, 0x01, 0x01,
+ 0x3820, 0xa8, 0x01,
+ 0x3821, 0x00, 0x01,
+ 0x3822, 0x81, 0x01,
+ 0x3823, 0x18, 0x01,
+ 0x3826, 0x00, 0x01,
+ 0x3827, 0x00, 0x01,
+ 0x3829, 0x03, 0x01,
+ 0x3832, 0x08, 0x01,
+ 0x3833, 0x30, 0x01,
+ 0x3c80, 0x00, 0x01,
+ 0x3c87, 0x01, 0x01,
+ 0x3c8c, 0x1a, 0x01,
+ 0x3c8d, 0x68, 0x01,
+ 0x3c97, 0x02, 0x01,
+ 0x3cc0, 0x40, 0x01,
+ 0x3cc1, 0x54, 0x01,
+ 0x3cc2, 0x34, 0x01,
+ 0x3cc3, 0x04, 0x01,
+ 0x3cc4, 0x00, 0x01,
+ 0x3cc5, 0x00, 0x01,
+ 0x3cc6, 0x00, 0x01,
+ 0x3cc7, 0x00, 0x01,
+ 0x3cc8, 0x00, 0x01,
+ 0x3cc9, 0x00, 0x01,
+ 0x3d8c, 0x73, 0x01,
+ 0x3d8d, 0xc0, 0x01,
+ 0x4001, 0x2b, 0x01,
+ 0x4008, 0x02, 0x01,
+ 0x4009, 0x0f, 0x01,
+ 0x4011, 0xff, 0x01,
+ 0x4013, 0x08, 0x01,
+ 0x4014, 0x08, 0x01,
+ 0x4015, 0x08, 0x01,
+ 0x4017, 0x08, 0x01,
+ 0x401a, 0x58, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x405e, 0x20, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x4503, 0x00, 0x01,
+ 0x450a, 0x04, 0x01,
+ 0x4601, 0x30, 0x01,
+ 0x4800, 0x00, 0x01,
+ 0x481f, 0x30, 0x01,
+ 0x4837, 0x0d, 0x01,
+ 0x483c, 0x0f, 0x01,
+ 0x484b, 0x01, 0x01,
+ 0x4d00, 0x05, 0x01,
+ 0x4d01, 0x19, 0x01,
+ 0x4d02, 0xfd, 0x01,
+ 0x4d03, 0xd1, 0x01,
+ 0x4d04, 0xff, 0x01,
+ 0x4d05, 0xff, 0x01,
+ 0x5000, 0x09, 0x01,
+ 0x5001, 0x42, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x5005, 0x00, 0x01,
+ 0x5081, 0x04, 0x01,
+ 0x5180, 0x00, 0x01,
+ 0x5181, 0x10, 0x01,
+ 0x5182, 0x02, 0x01,
+ 0x5183, 0x0f, 0x01,
+ 0x5185, 0x6c, 0x01,
+ 0x5200, 0x03, 0x01,
+ 0x520b, 0x07, 0x01,
+ 0x520c, 0x0f, 0x01,
+ 0x3642, 0x12, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3714, 0x24, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x04, 0x01,
+ 0x3739, 0x12, 0x01,
+ 0x37c2, 0x04, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x04, 0x01,
+ 0x37e4, 0x2a, 0x01,
+ 0x37e6, 0x04, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x0f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x10, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x0c, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380e, 0x0d, 0x01,
+ 0x380f, 0x40, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x0a, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x01, 0x01,
+ 0x3816, 0x01, 0x01,
+ 0x3820, 0xa8, 0x01,
+ 0x4009, 0x0f, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0xd0, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+
+const u32 sensor_12a10ff_setfile_A_4096x3072_30fps[] = {
+ 0x3642, 0x12, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3714, 0x24, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x04, 0x01,
+ 0x3739, 0x12, 0x01,
+ 0x37c2, 0x04, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x04, 0x01,
+ 0x37e4, 0x2a, 0x01,
+ 0x37e6, 0x04, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x0f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x10, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x0c, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380e, 0x0d, 0x01,
+ 0x380f, 0x40, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x0a, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x01, 0x01,
+ 0x3816, 0x01, 0x01,
+ 0x3820, 0xa8, 0x01,
+ 0x4009, 0x0f, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0xd0, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+
+const u32 sensor_12a10ff_setfile_A_2048x1536_60fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x08, 0x01,
+ 0x366b, 0x20, 0x01,
+ 0x366c, 0xa4, 0x01,
+ 0x366d, 0x20, 0x01,
+ 0x366e, 0xa4, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x00, 0x01,
+ 0x3804, 0x10, 0x01,
+ 0x3805, 0x1f, 0x01,
+ 0x3806, 0x0c, 0x01,
+ 0x3807, 0x0f, 0x01,
+ 0x3808, 0x08, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x06, 0x01,
+ 0x380b, 0x00, 0x01,
+ 0x380e, 0x06, 0x01,
+ 0x380f, 0xa0, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x06, 0x01,
+ 0x3813, 0x04, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x69, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+#if 0
+const u32 sensor_12a10ff_setfile_A_2000x1124_60fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x00, 0x01,
+ 0x366b, 0xa4, 0x01,
+ 0x366c, 0x20, 0x01,
+ 0x366d, 0xa4, 0x01,
+ 0x366e, 0x20, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x01, 0x01,
+ 0x3803, 0x9c, 0x01,
+ 0x3804, 0x0f, 0x01,
+ 0x3805, 0xff, 0x01,
+ 0x3806, 0x0a, 0x01,
+ 0x3807, 0x73, 0x01,
+ 0x3808, 0x07, 0x01,
+ 0x3809, 0xd0, 0x01,
+ 0x380a, 0x04, 0x01,
+ 0x380b, 0x64, 0x01,
+ 0x380e, 0x06, 0x01,
+ 0x380f, 0xa0, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x1c, 0x01,
+ 0x3813, 0x04, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x69, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+
+const u32 sensor_12a10ff_setfile_A_1920x1080_60fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x00, 0x01,
+ 0x366b, 0xa4, 0x01,
+ 0x366c, 0x20, 0x01,
+ 0x366d, 0xa4, 0x01,
+ 0x366e, 0x20, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x01, 0x01,
+ 0x3803, 0xc8, 0x01,
+ 0x3804, 0x0f, 0x01,
+ 0x3805, 0xff, 0x01,
+ 0x3806, 0x0a, 0x01,
+ 0x3807, 0x47, 0x01,
+ 0x3808, 0x07, 0x01,
+ 0x3809, 0x80, 0x01,
+ 0x380a, 0x04, 0x01,
+ 0x380b, 0x38, 0x01,
+ 0x380e, 0x06, 0x01,
+ 0x380f, 0xa0, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x44, 0x01,
+ 0x3813, 0x04, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x69, 0x01,
+ 0x3502, 0x00, 0x01,
+};
+#endif
+const u32 sensor_12a10ff_setfile_A_1280x720_120fps[] = {
+ 0x3642, 0x10, 0x01,
+ 0x3666, 0x00, 0x01,
+ 0x366b, 0xa4, 0x01,
+ 0x366c, 0x20, 0x01,
+ 0x366d, 0xa4, 0x01,
+ 0x366e, 0x20, 0x01,
+ 0x3714, 0x28, 0x01,
+ 0x371a, 0x3e, 0x01,
+ 0x3737, 0x08, 0x01,
+ 0x3739, 0x20, 0x01,
+ 0x37c2, 0x14, 0x01,
+ 0x37d9, 0x0c, 0x01,
+ 0x37e3, 0x08, 0x01,
+ 0x37e4, 0x36, 0x01,
+ 0x37e6, 0x08, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x03, 0x01,
+ 0x3803, 0x28, 0x01,
+ 0x3804, 0x0f, 0x01,
+ 0x3805, 0xff, 0x01,
+ 0x3806, 0x08, 0x01,
+ 0x3807, 0xe7, 0x01,
+ 0x3808, 0x05, 0x01,
+ 0x3809, 0x00, 0x01,
+ 0x380a, 0x02, 0x01,
+ 0x380b, 0xd0, 0x01,
+ 0x380e, 0x03, 0x01,
+ 0x380f, 0x50, 0x01,
+ 0x3810, 0x01, 0x01,
+ 0x3811, 0x84, 0x01,
+ 0x3813, 0x08, 0x01,
+ 0x3814, 0x03, 0x01,
+ 0x3816, 0x03, 0x01,
+ 0x3820, 0xab, 0x01,
+ 0x4009, 0x0d, 0x01,
+ 0x4050, 0x04, 0x01,
+ 0x4051, 0x0b, 0x01,
+ 0x4501, 0x00, 0x01,
+ 0x5002, 0x45, 0x01,
+ 0x3501, 0x34, 0x01,
+ 0x3502, 0x40, 0x01,
+};
+
+const struct sensor_pll_info_compact sensor_12a10ff_pllinfo_A_4096x3072_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0D40, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+
+const struct sensor_pll_info_compact sensor_12a10ff_pllinfo_A_2048x1536_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x06A0, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+#if 0
+const struct sensor_pll_info_compact sensor_12a10ff_pllinfo_A_2000x1124_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x06A0, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+
+const struct sensor_pll_info_compact sensor_12a10ff_pllinfo_A_1920x1080_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x06A0, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+#endif
+const struct sensor_pll_info_compact sensor_12a10ff_pllinfo_A_1280x720_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1144000000, /* mipi_datarate */
+ 108333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0350, /* frame_length_lines (0x380e) */
+ 0x0428, /* line_length_pck (0x380c) */
+};
+
+static const u32 *sensor_12a10ff_setfiles_A[] = {
+ sensor_12a10ff_setfile_A_4096x3072_30fps,
+ sensor_12a10ff_setfile_A_2048x1536_60fps,
+ /*sensor_12a10ff_setfile_A_2000x1124_60fps,
+ sensor_12a10ff_setfile_A_1920x1080_60fps,*/
+ sensor_12a10ff_setfile_A_1280x720_120fps,
+};
+
+static const u32 sensor_12a10ff_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_12a10ff_setfile_A_4096x3072_30fps),
+ ARRAY_SIZE(sensor_12a10ff_setfile_A_2048x1536_60fps),
+ /*ARRAY_SIZE(sensor_12a10ff_setfile_A_2000x1124_60fps),
+ ARRAY_SIZE(sensor_12a10ff_setfile_A_1920x1080_60fps),*/
+ ARRAY_SIZE(sensor_12a10ff_setfile_A_1280x720_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_12a10ff_pllinfos_A[] = {
+ &sensor_12a10ff_pllinfo_A_4096x3072_30fps,
+ &sensor_12a10ff_pllinfo_A_2048x1536_60fps,
+ /*&sensor_12a10ff_pllinfo_A_2000x1124_60fps,
+ &sensor_12a10ff_pllinfo_A_1920x1080_60fps,*/
+ &sensor_12a10ff_pllinfo_A_1280x720_120fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-12a10ff.h"
+#include "fimc-is-cis-12a10ff-setA.h"
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "OV12A10FF"
+/* #define DEBUG_12A10FF_PLL */
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_12a10ff_global;
+static u32 sensor_12a10ff_global_size;
+static const u32 **sensor_12a10ff_setfiles;
+static const u32 *sensor_12a10ff_setfile_sizes;
+static const struct sensor_pll_info_compact **sensor_12a10ff_pllinfos;
+static u32 sensor_12a10ff_max_setfile_num;
+
+static void sensor_12a10ff_cis_data_calculation(const struct sensor_pll_info_compact *pll_info_compact, cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, frame_valid_us = 0;
+ u64 max_fps = 0;
+
+ FIMC_BUG_VOID(!pll_info_compact);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info_compact->pclk;
+
+ dbg_sensor(1, "ext_clock(%d), mipi_datarate(%d), pclk(%d)\n",
+ pll_info_compact->ext_clk, pll_info_compact->mipi_datarate, pll_info_compact->pclk);
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info_compact->frame_length_lines(%d) * pll_info_compact->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info_compact->frame_length_lines, pll_info_compact->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = ((u64)vt_pix_clk_hz * 10) / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = (u32)max_fps;
+ cis_data->frame_length_lines = pll_info_compact->frame_length_lines;
+ cis_data->line_length_pck = pll_info_compact->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_12A10FF_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = cis_data->cur_width;
+ cis_data->min_coarse_integration_time = SENSOR_12A10FF_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_12A10FF_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+int sensor_12a10ff_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read8(client, 0x300B, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+/* CIS OPS */
+int sensor_12a10ff_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+ setinfo.return_value = 0;
+
+ setinfo.param = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+
+ cis->cis_data->cur_width = SENSOR_12A10FF_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_12A10FF_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_12a10ff_cis_data_calculation(sensor_12a10ff_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10ff_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ return -ENODEV;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -ENODEV;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ sensor_cis_dump_registers(subdev, sensor_12a10ff_setfiles[0], sensor_12a10ff_setfile_sizes[0]);
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_12a10ff_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+ if (hold)
+ ret = fimc_is_sensor_write8(client, 0x3208, 0x00);
+ else
+ ret = fimc_is_sensor_write8(client, 0x3208, 0x10);
+ ret = fimc_is_sensor_write8(client, 0x320b, 0x00);
+ ret = fimc_is_sensor_write8(client, 0x3208, 0xa0);
+
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_12a10ff_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_12a10ff_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_12a10ff_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_12a10ff_global, sensor_12a10ff_global_size);
+
+ if (ret < 0) {
+ err("sensor_12a10ff_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_12a10ff_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ return -EINVAL;
+ }
+
+ sensor_12a10ff_cis_data_calculation(sensor_12a10ff_pllinfos[mode], cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_12a10ff_setfiles[mode], sensor_12a10ff_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_12a10ff_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+/* Deprecated */
+int sensor_12a10ff_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ return 0;
+}
+
+int sensor_12a10ff_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+ /* Sensor stream on */
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream off");
+
+ /* Sensor stream off */
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u8 short_coarse_val[3] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short exposure */
+ short_coarse_val[0] = (short_coarse_int & 0xF000) >> 12;
+ short_coarse_val[1] = (short_coarse_int & 0x0FF0) >> 4;
+ short_coarse_val[2] = (short_coarse_int & 0x000F) << 4;
+ ret = fimc_is_sensor_write8_array(client, 0x3500, short_coarse_val, 3);
+ if (ret < 0)
+ goto p_err;
+#if 0
+ /* Long exposure */
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x3c92, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+#endif
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d), line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, cis_data->sen_vsync_count, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x), long_coarse_int %#x, short_coarse_int %#x\n",
+ cis->id, __func__, cis_data->sen_vsync_count, cis_data->frame_length_lines,
+ long_coarse_int, short_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update here? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10ff_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time,
+ frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+ u64 numerator;
+ u32 max_coarse_integration_time = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * frame_duration;
+ frame_length_lines = (u16)((numerator / line_length_pck) / (1000 * 1000));
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, cis_data->pclk, frame_duration, line_length_pck, frame_length_lines);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x380e, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+
+ max_coarse_integration_time = cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+ cis_data->max_coarse_integration_time = max_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_12a10ff_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+#define REG_1X_BASE_VALUE 1000
+#define REG_1X_BASE 0x0080
+#define REG_2X_BASE_VALUE 2000
+#define REG_2X_BASE 0x0100
+#define REG_4X_BASE_VALUE 4000
+#define REG_4X_BASE 0x0200
+#define REG_8X_BASE_VALUE 8000
+#define REG_8X_BASE 0x0400
+#define REG_UPPER_BOUND 15500
+
+#define REG_1X_MIN_VALUE 0x0080
+#define REG_1X_MAX_VALUE 0x00F8
+#define REG_2X_MAX_VALUE 0x01F0
+#define REG_4X_MAX_VALUE 0x03E0
+#define REG_8X_MAX_VALUE 0x07F0
+
+static u32 sensor_12a10ff_again_to_reg_value(u32 again)
+{
+ u32 level;
+ u32 reg_value;
+
+ /* 1x ~ 1.9375x: 0x0080 ~ 0x00F8 */
+ /* 2x ~ 3.875 x: 0x0100 ~ 0x01F0 */
+ /* 4x ~ 7.75 x: 0x0200 ~ 0x03E0 */
+ /* 8x ~ 15.5 x: 0x0400 ~ 0x07F0 */
+ if (again < REG_2X_BASE_VALUE) {
+ level = ((again - REG_1X_BASE_VALUE) << 4) / 1000;
+ reg_value = REG_1X_BASE + level * 8;
+ } else if (again < REG_4X_BASE_VALUE) {
+ level = ((again - REG_2X_BASE_VALUE) << 3) / 1000;
+ reg_value = REG_2X_BASE + level * 16;
+ } else if (again < REG_8X_BASE_VALUE) {
+ level = ((again - REG_4X_BASE_VALUE) << 2) / 1000;
+ reg_value = REG_4X_BASE + level * 32;
+ } else if (again < REG_UPPER_BOUND) {
+ level = ((again - REG_8X_BASE_VALUE) << 1) / 1000;
+ reg_value = REG_8X_BASE + level * 64;
+ } else {
+ reg_value = REG_8X_MAX_VALUE;
+ }
+
+ return reg_value;
+}
+
+static u32 sensor_12a10ff_reg_value_to_again(u32 reg_value)
+{
+ u32 again;
+
+ if (reg_value <= REG_1X_MAX_VALUE) {
+ again = ((((reg_value - REG_1X_BASE) >> 3) * 1000) >> 4) + REG_1X_BASE_VALUE;
+ } else if (reg_value <= REG_2X_MAX_VALUE) {
+ again = ((((reg_value - REG_2X_BASE) >> 2) * 1000) >> 4) + REG_2X_BASE_VALUE;
+ } else if (reg_value <= REG_4X_MAX_VALUE) {
+ again = ((((reg_value - REG_4X_BASE) >> 1) * 1000) >> 4) + REG_4X_BASE_VALUE;
+ } else if (reg_value <= REG_8X_MAX_VALUE) {
+ again = ((((reg_value - REG_8X_BASE) >> 0) * 1000) >> 4) + REG_8X_BASE_VALUE;
+ } else {
+ again = REG_1X_BASE_VALUE;
+ }
+
+ return again;
+}
+
+int sensor_12a10ff_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_12a10ff_again_to_reg_value(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_12a10ff_reg_value_to_again(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+ u8 analog_val[2] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ analog_gain = (u16)sensor_12a10ff_again_to_reg_value(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ analog_val[0] = (analog_gain & 0xFF00) >> 8;
+ analog_val[1] = (analog_gain & 0x00FF);
+ ret = fimc_is_sensor_write8_array(client, 0x3508, analog_val, 2);
+ ret = fimc_is_sensor_write8_array(client, 0x350c, analog_val, 2);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x3508, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_12a10ff_reg_value_to_again(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_analog_gain[0] = REG_1X_MIN_VALUE;
+ cis_data->min_analog_gain[1] = 1000;
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_analog_gain[0] = REG_8X_MAX_VALUE;
+ cis_data->max_analog_gain[1] = 15500;
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+#define REG_1X_BASE_DGAIN_VALUE 1000
+#define REG_1X_BASE_DGAIN 0x0400
+
+u32 sensor_12a10ff_dgain_to_reg_value(u32 permile)
+{
+ u32 reg_dgain;
+ reg_dgain = permile * REG_1X_BASE_DGAIN / REG_1X_BASE_DGAIN_VALUE;
+
+ return reg_dgain;
+}
+
+int sensor_12a10ff_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u8 reg_short_gain[2] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_12a10ff_dgain_to_reg_value(dgain->long_val);
+ short_gain = (u16)sensor_12a10ff_dgain_to_reg_value(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ reg_short_gain[0] = (short_gain & 0x3FFF) >> 8;
+ reg_short_gain[1] = (short_gain & 0xFF);
+ fimc_is_sensor_write8(client, 0x350A, reg_short_gain[0]);
+ fimc_is_sensor_write8(client, 0x350B, reg_short_gain[1]);
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, dgain->long_val,
+ dgain->short_val, long_gain, short_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x350a, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_12a10ff_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_digital_gain[0] = REG_1X_BASE_DGAIN;
+ cis_data->min_digital_gain[1] = REG_1X_BASE_DGAIN_VALUE;
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_digital_gain[0] = 0x3FFF;
+ cis_data->max_digital_gain[1] = 16000;
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_12a10ff_cis_wait_streamon(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u32 wait_cnt = 0, time_out_cnt = 2500;
+ u8 sensor_fcount = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (unlikely(!cis)) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ if (unlikely(!cis_data)) {
+ err("cis_data is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ /*
+ * Read sensor frame counter (sensor_fcount address = 0x0005)
+ * stream on (0x00 ~ 0xFE), stream off (0xFF)
+ */
+ while (sensor_fcount == 0x00) {
+ usleep_range(CIS_STREAM_ON_WAIT_TIME, CIS_STREAM_ON_WAIT_TIME);
+ wait_cnt++;
+
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ if (wait_cnt >= time_out_cnt) {
+ err("[MOD:D:%d] %s, Don't sensor stream on and time out, wait_limit(%d) > time_out(%d), sensor_fcount(%d)",
+ cis->id, __func__, wait_cnt, time_out_cnt, sensor_fcount);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, sensor_fcount(%d), (wait_limit(%d) < time_out(%d))\n",
+ cis->id, __func__, sensor_fcount, wait_cnt, time_out_cnt);
+ }
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ /* retention mode CRC wait calculation */
+ usleep_range(1000, 1000);
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_12a10ff_cis_wait_streamoff(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u32 wait_cnt = 0, time_out_cnt = 250;
+ u8 sensor_fcount = 0;
+
+ BUG_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ cis_data = cis->cis_data;
+ client = cis->client;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ while (sensor_fcount != 0x00) {
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = fimc_is_sensor_read8(client, 0x483F, &sensor_fcount);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x483F, sensor_fcount, ret);
+
+ usleep_range(CIS_STREAM_OFF_WAIT_TIME, CIS_STREAM_OFF_WAIT_TIME);
+ wait_cnt++;
+
+ if (wait_cnt >= time_out_cnt) {
+ err("[MOD:D:%d] %s, time out, wait_limit(%d) > time_out(%d), sensor_fcount(%d)",
+ cis->id, __func__, wait_cnt, time_out_cnt, sensor_fcount);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, sensor_fcount(%d), (wait_limit(%d) < time_out(%d))\n",
+ cis->id, __func__, sensor_fcount, wait_cnt, time_out_cnt);
+ }
+
+p_err:
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_12a10ff_cis_init,
+ .cis_log_status = sensor_12a10ff_cis_log_status,
+ .cis_group_param_hold = sensor_12a10ff_cis_group_param_hold,
+ .cis_set_global_setting = sensor_12a10ff_cis_set_global_setting,
+ .cis_mode_change = sensor_12a10ff_cis_mode_change,
+ .cis_set_size = sensor_12a10ff_cis_set_size,
+ .cis_stream_on = sensor_12a10ff_cis_stream_on,
+ .cis_stream_off = sensor_12a10ff_cis_stream_off,
+ .cis_set_exposure_time = sensor_12a10ff_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_12a10ff_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_12a10ff_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_12a10ff_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_12a10ff_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_12a10ff_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_12a10ff_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_12a10ff_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_12a10ff_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_12a10ff_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_12a10ff_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_12a10ff_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_12a10ff_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_12a10ff_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_12a10ff_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_12a10ff_cis_check_rev,
+ .cis_factory_test = sensor_cis_factory_test,
+ .cis_wait_streamoff = sensor_12a10ff_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_12a10ff_cis_wait_streamon,
+};
+
+static int cis_12a10ff_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_OV12A10FF);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ probe_err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_OV12A10FF;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_BG_GR;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ if (of_property_read_bool(dnode, "dual_sync_mode")) {
+ ret = of_property_read_u32(dnode, "dual_sync_mode", &cis->dual_sync_mode);
+ if (ret)
+ warn("dual_sync_mode read is fail(%d)", ret);
+ } else {
+ cis->dual_sync_mode = DUAL_SYNC_NONE;
+ }
+
+ probe_info("%s dual_sync_mode %d\n", __func__, cis->dual_sync_mode);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_12a10ff_global = sensor_12a10ff_setfile_A_Global;
+ sensor_12a10ff_global_size = ARRAY_SIZE(sensor_12a10ff_setfile_A_Global);
+ sensor_12a10ff_setfiles = sensor_12a10ff_setfiles_A;
+ sensor_12a10ff_setfile_sizes = sensor_12a10ff_setfile_A_sizes;
+ sensor_12a10ff_pllinfos = sensor_12a10ff_pllinfos_A;
+ sensor_12a10ff_max_setfile_num = ARRAY_SIZE(sensor_12a10ff_setfiles_A);
+ }
+
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_12a10ff_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-12a10ff",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_12a10ff_match);
+
+static const struct i2c_device_id sensor_cis_12a10ff_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_12a10ff_driver = {
+ .probe = cis_12a10ff_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_12a10ff_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_12a10ff_idt
+};
+
+static int __init sensor_cis_12a10ff_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_12a10ff_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_12a10ff_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_12a10ff_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_12A10FF_H
+#define FIMC_IS_CIS_12A10FF_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_12A10FF_MAX_WIDTH (4096)
+#define SENSOR_12A10FF_MAX_HEIGHT (3072)
+
+/* TODO: Check below values are valid */
+#define SENSOR_12A10FF_FINE_INTEGRATION_TIME_MIN 0x0
+#define SENSOR_12A10FF_FINE_INTEGRATION_TIME_MAX 0x0 /* Not used */
+#define SENSOR_12A10FF_COARSE_INTEGRATION_TIME_MIN 0x4 /* TODO */
+#define SENSOR_12A10FF_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x8 /* TODO */
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_16885C_SET_A_H
+#define FIMC_IS_CIS_16885C_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-16885c.h"
+
+const u32 sensor_16885c_setfile_A_Global[] = {
+ 0x0103, 0x01, 0x01,
+ 0x0102, 0x00, 0x01,
+ 0x0300, 0xf3, 0x01,
+ 0x0301, 0xa5, 0x01,
+ 0x0302, 0x10, 0x01,
+ 0x0304, 0x25, 0x01,
+ 0x0314, 0x02, 0x01,
+ 0x0316, 0x94, 0x01,
+ 0x0319, 0x00, 0x01,
+ 0x031a, 0x01, 0x01,
+ 0x031e, 0x09, 0x01,
+ 0x0320, 0x0f, 0x01,
+ 0x300d, 0x11, 0x01,
+ 0x3012, 0x41, 0x01,
+ 0x3016, 0xf0, 0x01,
+ 0x3018, 0xf0, 0x01,
+ 0x3025, 0x03, 0x01,
+ 0x301b, 0x3c, 0x01,
+ 0x3026, 0x10, 0x01,
+ 0x3027, 0x08, 0x01,
+ 0x301e, 0x98, 0x01,
+ 0x3031, 0x88, 0x01,
+ 0x3106, 0x00, 0x01,
+ 0x3400, 0x00, 0x01,
+ 0x3406, 0x08, 0x01,
+ 0x3408, 0x03, 0x01,
+ 0x3410, 0x00, 0x01,
+ 0x3412, 0x00, 0x01,
+ 0x3413, 0x00, 0x01,
+ 0x3414, 0x00, 0x01,
+ 0x3415, 0x00, 0x01,
+ 0x3500, 0x00, 0x01,
+ 0x3501, 0xec, 0x01,
+ 0x3502, 0x00, 0x01,
+ 0x3503, 0x08, 0x01,
+ 0x3505, 0x8c, 0x01,
+ 0x3507, 0x00, 0x01,
+ 0x3508, 0x02, 0x01,
+ 0x3509, 0x00, 0x01,
+ 0x350c, 0x02, 0x01,
+ 0x350d, 0x00, 0x01,
+ 0x3510, 0x00, 0x01,
+ 0x3511, 0xec, 0x01,
+ 0x3512, 0x00, 0x01,
+ 0x3600, 0x40, 0x01,
+ 0x3601, 0x00, 0x01,
+ 0x3602, 0x84, 0x01,
+ 0x3608, 0xc7, 0x01,
+ 0x3609, 0xd0, 0x01,
+ 0x360a, 0xff, 0x01,
+ 0x360b, 0x6c, 0x01,
+ 0x360c, 0x00, 0x01,
+ 0x3611, 0x00, 0x01,
+ 0x3612, 0x00, 0x01,
+ 0x3613, 0x8e, 0x01,
+ 0x3618, 0x00, 0x01,
+ 0x3619, 0x90, 0x01,
+ 0x361a, 0x00, 0x01,
+ 0x361b, 0x01, 0x01,
+ 0x361c, 0xc5, 0x01,
+ 0x3620, 0x50, 0x01,
+ 0x3621, 0x66, 0x01,
+ 0x3622, 0x88, 0x01,
+ 0x3623, 0x88, 0x01,
+ 0x3624, 0x88, 0x01,
+ 0x3625, 0x88, 0x01,
+ 0x3626, 0x03, 0x01,
+ 0x3627, 0x88, 0x01,
+ 0x3628, 0x1c, 0x01,
+ 0x3629, 0x00, 0x01,
+ 0x362a, 0x00, 0x01,
+ 0x3632, 0x00, 0x01,
+ 0x3633, 0x10, 0x01,
+ 0x3634, 0x10, 0x01,
+ 0x3635, 0x10, 0x01,
+ 0x3636, 0x10, 0x01,
+ 0x3637, 0x77, 0x01,
+ 0x3638, 0x77, 0x01,
+ 0x3639, 0x66, 0x01,
+ 0x363a, 0x66, 0x01,
+ 0x3652, 0x00, 0x01,
+ 0x3653, 0x00, 0x01,
+ 0x3654, 0x77, 0x01,
+ 0x3655, 0x77, 0x01,
+ 0x3656, 0x77, 0x01,
+ 0x3657, 0x77, 0x01,
+ 0x3658, 0x00, 0x01,
+ 0x3659, 0x84, 0x01,
+ 0x365a, 0x81, 0x01,
+ 0x365b, 0x8e, 0x01,
+ 0x365c, 0x1c, 0x01,
+ 0x3660, 0x40, 0x01,
+ 0x3661, 0x0c, 0x01,
+ 0x3662, 0x00, 0x01,
+ 0x3663, 0x40, 0x01,
+ 0x3664, 0x03, 0x01,
+ 0x3666, 0xac, 0x01,
+ 0x3668, 0xf0, 0x01,
+ 0x3669, 0x0e, 0x01,
+ 0x366a, 0x10, 0x01,
+ 0x366b, 0x42, 0x01,
+ 0x366c, 0x03, 0x01,
+ 0x366d, 0x05, 0x01,
+ 0x366e, 0x05, 0x01,
+ 0x3674, 0x04, 0x01,
+ 0x3675, 0x16, 0x01,
+ 0x3680, 0x00, 0x01,
+ 0x3681, 0x33, 0x01,
+ 0x3682, 0x33, 0x01,
+ 0x3683, 0x33, 0x01,
+ 0x368a, 0x04, 0x01,
+ 0x368b, 0x04, 0x01,
+ 0x368c, 0x04, 0x01,
+ 0x368d, 0x04, 0x01,
+ 0x368e, 0x04, 0x01,
+ 0x368f, 0x04, 0x01,
+ 0x3694, 0x10, 0x01,
+ 0x3696, 0x30, 0x01,
+ 0x3698, 0x30, 0x01,
+ 0x3699, 0x00, 0x01,
+ 0x369a, 0x44, 0x01,
+ 0x369c, 0x28, 0x01,
+ 0x369e, 0x28, 0x01,
+ 0x36a0, 0x28, 0x01,
+ 0x36a2, 0x30, 0x01,
+ 0x36a4, 0x3b, 0x01,
+ 0x36a5, 0x00, 0x01,
+ 0x36a6, 0x43, 0x01,
+ 0x36a7, 0x00, 0x01,
+ 0x36a8, 0x48, 0x01,
+ 0x36a9, 0x00, 0x01,
+ 0x36aa, 0x48, 0x01,
+ 0x36ab, 0x00, 0x01,
+ 0x36ac, 0x48, 0x01,
+ 0x36c1, 0x33, 0x01,
+ 0x36c3, 0x33, 0x01,
+ 0x36ca, 0x04, 0x01,
+ 0x36cb, 0x04, 0x01,
+ 0x36cc, 0x04, 0x01,
+ 0x36cd, 0x04, 0x01,
+ 0x36ce, 0x04, 0x01,
+ 0x36cf, 0x04, 0x01,
+ 0x3700, 0x13, 0x01,
+ 0x3701, 0x14, 0x01,
+ 0x3702, 0x12, 0x01,
+ 0x3704, 0x0e, 0x01,
+ 0x3706, 0x23, 0x01,
+ 0x3708, 0x17, 0x01,
+ 0x3709, 0x38, 0x01,
+ 0x370b, 0x63, 0x01,
+ 0x3713, 0x00, 0x01,
+ 0x3714, 0x64, 0x01,
+ 0x371d, 0x10, 0x01,
+ 0x371f, 0x05, 0x01,
+ 0x3726, 0x20, 0x01,
+ 0x3727, 0x23, 0x01,
+ 0x373b, 0x06, 0x01,
+ 0x373d, 0x07, 0x01,
+ 0x374f, 0x0d, 0x01,
+ 0x3754, 0x88, 0x01,
+ 0x375a, 0x08, 0x01,
+ 0x3764, 0x12, 0x01,
+ 0x3765, 0x0b, 0x01,
+ 0x3767, 0x0c, 0x01,
+ 0x3768, 0x18, 0x01,
+ 0x3769, 0x08, 0x01,
+ 0x376a, 0x0c, 0x01,
+ 0x376b, 0x80, 0x01,
+ 0x37a2, 0x04, 0x01,
+ 0x37b1, 0x40, 0x01,
+ 0x37d0, 0x06, 0x01,
+ 0x37d9, 0x88, 0x01,
+ 0x37f4, 0x80, 0x01,
+ 0x37fc, 0x05, 0x01,
+ 0x37fd, 0x00, 0x01,
+ 0x37fe, 0x0b, 0x01,
+ 0x37ff, 0x00, 0x01,
+ 0x3800, 0x00, 0x01,
+ 0x3801, 0x00, 0x01,
+ 0x3802, 0x00, 0x01,
+ 0x3803, 0x02, 0x01,
+ 0x3804, 0x12, 0x01,
+ 0x3805, 0x5f, 0x01,
+ 0x3806, 0x0d, 0x01,
+ 0x3807, 0xd1, 0x01,
+ 0x3808, 0x09, 0x01,
+ 0x3809, 0x20, 0x01,
+ 0x380a, 0x06, 0x01,
+ 0x380b, 0xd8, 0x01,
+ 0x380c, 0x05, 0x01,
+ 0x380d, 0x78, 0x01,
+ 0x380e, 0x0e, 0x01,
+ 0x380f, 0xe0, 0x01,
+ 0x3810, 0x00, 0x01,
+ 0x3811, 0x09, 0x01,
+ 0x3812, 0x00, 0x01,
+ 0x3813, 0x09, 0x01,
+ 0x3814, 0x11, 0x01,
+ 0x3815, 0x22, 0x01,
+ 0x3820, 0x01, 0x01,
+ 0x3821, 0x00, 0x01,
+ 0x382b, 0x08, 0x01,
+ 0x3834, 0xf5, 0x01,
+ 0x3836, 0x28, 0x01,
+ 0x383d, 0x80, 0x01,
+ 0x3841, 0x20, 0x01,
+ 0x3883, 0x02, 0x01,
+ 0x3886, 0x02, 0x01,
+ 0x3889, 0x02, 0x01,
+ 0x3891, 0x0f, 0x01,
+ 0x38a0, 0x04, 0x01,
+ 0x38a1, 0x00, 0x01,
+ 0x38a2, 0x04, 0x01,
+ 0x38a3, 0x04, 0x01,
+ 0x38b0, 0x02, 0x01,
+ 0x38b1, 0x02, 0x01,
+ 0x3b8e, 0x00, 0x01,
+ 0x3d84, 0x80, 0x01,
+ 0x3d85, 0x1b, 0x01,
+ 0x3d8c, 0x67, 0x01,
+ 0x3d8d, 0xa8, 0x01,
+ 0x3f00, 0xca, 0x01,
+ 0x3f03, 0x1a, 0x01,
+ 0x3f05, 0x66, 0x01,
+ 0x4008, 0x00, 0x01,
+ 0x4009, 0x02, 0x01,
+ 0x400e, 0x00, 0x01,
+ 0x4010, 0x29, 0x01,
+ 0x4011, 0x01, 0x01,
+ 0x4012, 0x0d, 0x01,
+ 0x4013, 0x16, 0x01,
+ 0x4014, 0x0a, 0x01,
+ 0x4015, 0x02, 0x01,
+ 0x4016, 0x15, 0x01,
+ 0x4017, 0x00, 0x01,
+ 0x4018, 0x09, 0x01,
+ 0x4019, 0x00, 0x01,
+ 0x401a, 0x40, 0x01,
+ 0x4020, 0x04, 0x01,
+ 0x4021, 0x00, 0x01,
+ 0x4022, 0x04, 0x01,
+ 0x4023, 0x00, 0x01,
+ 0x4024, 0x04, 0x01,
+ 0x4025, 0x00, 0x01,
+ 0x4026, 0x04, 0x01,
+ 0x4027, 0x00, 0x01,
+ 0x4056, 0x05, 0x01,
+ 0x4202, 0x00, 0x01,
+ 0x4500, 0x25, 0x01,
+ 0x4501, 0x04, 0x01,
+ 0x4502, 0x80, 0x01,
+ 0x4503, 0x10, 0x01,
+ 0x450c, 0x05, 0x01,
+ 0x450e, 0x16, 0x01,
+ 0x450f, 0x88, 0x01,
+ 0x4540, 0x86, 0x01,
+ 0x4541, 0x07, 0x01,
+ 0x4542, 0x04, 0x01,
+ 0x4543, 0x05, 0x01,
+ 0x4544, 0x06, 0x01,
+ 0x4545, 0x07, 0x01,
+ 0x4546, 0x04, 0x01,
+ 0x4547, 0x05, 0x01,
+ 0x4548, 0x02, 0x01,
+ 0x4549, 0x03, 0x01,
+ 0x454a, 0x00, 0x01,
+ 0x454b, 0x01, 0x01,
+ 0x454c, 0x02, 0x01,
+ 0x454d, 0x03, 0x01,
+ 0x454e, 0x00, 0x01,
+ 0x454f, 0x01, 0x01,
+ 0x4550, 0x06, 0x01,
+ 0x4551, 0x07, 0x01,
+ 0x4552, 0x04, 0x01,
+ 0x4553, 0x05, 0x01,
+ 0x4554, 0x06, 0x01,
+ 0x4555, 0x07, 0x01,
+ 0x4556, 0x04, 0x01,
+ 0x4557, 0x05, 0x01,
+ 0x4558, 0x02, 0x01,
+ 0x4559, 0x03, 0x01,
+ 0x455a, 0x00, 0x01,
+ 0x455b, 0x01, 0x01,
+ 0x455c, 0x02, 0x01,
+ 0x455d, 0x03, 0x01,
+ 0x455e, 0x00, 0x01,
+ 0x455f, 0x01, 0x01,
+ 0x4640, 0x01, 0x01,
+ 0x4641, 0x04, 0x01,
+ 0x4642, 0x02, 0x01,
+ 0x4643, 0x00, 0x01,
+ 0x4645, 0x03, 0x01,
+ 0x4800, 0x00, 0x01,
+ 0x4809, 0x2b, 0x01,
+ 0x480e, 0x02, 0x01,
+ 0x4813, 0x90, 0x01,
+ 0x4817, 0x00, 0x01,
+ 0x481f, 0x26, 0x01,
+ 0x4837, 0x14, 0x01,
+ 0x484b, 0x01, 0x01,
+ 0x4850, 0x7c, 0x01,
+ 0x4852, 0x03, 0x01,
+ 0x4853, 0x12, 0x01,
+ 0x4856, 0x58, 0x01,
+ 0x4857, 0x02, 0x01,
+ 0x4d00, 0x04, 0x01,
+ 0x4d01, 0x5a, 0x01,
+ 0x4d02, 0xb3, 0x01,
+ 0x4d03, 0xf1, 0x01,
+ 0x4d04, 0xaa, 0x01,
+ 0x4d05, 0xc9, 0x01,
+ 0x5080, 0x04, 0x01,
+ 0x5084, 0x09, 0x01,
+ 0x5085, 0x30, 0x01,
+ 0x5086, 0x06, 0x01,
+ 0x5087, 0xe6, 0x01,
+ 0x5000, 0x89, 0x01,
+ 0x5001, 0x42, 0x01,
+ 0x5002, 0x01, 0x01,
+ 0x5004, 0x81, 0x01,
+ 0x5006, 0x40, 0x01,
+ 0x5020, 0x00, 0x01,
+ 0x5021, 0x10, 0x01,
+ 0x5022, 0x12, 0x01,
+ 0x5023, 0x50, 0x01,
+ 0x5024, 0x00, 0x01,
+ 0x5025, 0x08, 0x01,
+ 0x5026, 0x0d, 0x01,
+ 0x5027, 0xb8, 0x01,
+ 0x5028, 0x00, 0x01,
+ 0x5081, 0x00, 0x01,
+ 0x5180, 0x03, 0x01,
+ 0x5181, 0xb0, 0x01,
+ 0x5184, 0x63, 0x01,
+ 0x5185, 0x17, 0x01,
+ 0x518c, 0x01, 0x01,
+ 0x518d, 0x01, 0x01,
+ 0x518e, 0x01, 0x01,
+ 0x518f, 0x01, 0x01,
+ 0x5190, 0x00, 0x01,
+ 0x5191, 0x00, 0x01,
+ 0x5192, 0x09, 0x01,
+ 0x5193, 0x2f, 0x01,
+ 0x5194, 0x00, 0x01,
+ 0x5195, 0x00, 0x01,
+ 0x5200, 0xbf, 0x01,
+ 0x5201, 0xf3, 0x01,
+ 0x5202, 0x09, 0x01,
+ 0x5203, 0x1b, 0x01,
+ 0x5204, 0xe0, 0x01,
+ 0x5205, 0x10, 0x01,
+ 0x5206, 0x3f, 0x01,
+ 0x5207, 0x3c, 0x01,
+ 0x5208, 0x24, 0x01,
+ 0x5209, 0x0f, 0x01,
+ 0x520a, 0x43, 0x01,
+ 0x520b, 0x3b, 0x01,
+ 0x520c, 0x33, 0x01,
+ 0x520d, 0x33, 0x01,
+ 0x520e, 0x63, 0x01,
+ 0x5210, 0x06, 0x01,
+ 0x5211, 0x03, 0x01,
+ 0x5212, 0x08, 0x01,
+ 0x5213, 0x08, 0x01,
+ 0x5217, 0x04, 0x01,
+ 0x5218, 0x02, 0x01,
+ 0x5219, 0x01, 0x01,
+ 0x521a, 0x04, 0x01,
+ 0x521b, 0x02, 0x01,
+ 0x521c, 0x01, 0x01,
+ 0x5297, 0x04, 0x01,
+ 0x5298, 0x02, 0x01,
+ 0x5299, 0x01, 0x01,
+ 0x529a, 0x04, 0x01,
+ 0x529b, 0x02, 0x01,
+ 0x529c, 0x01, 0x01,
+ 0x5820, 0x18, 0x01,
+ 0x5821, 0x08, 0x01,
+ 0x5822, 0x08, 0x01,
+ 0x5823, 0x18, 0x01,
+ 0x5824, 0x18, 0x01,
+ 0x5825, 0x08, 0x01,
+ 0x5826, 0x08, 0x01,
+ 0x5827, 0x18, 0x01,
+ 0x582c, 0x08, 0x01,
+ 0x582d, 0x18, 0x01,
+ 0x582e, 0x00, 0x01,
+ 0x582f, 0x00, 0x01,
+ 0x5830, 0x08, 0x01,
+ 0x5831, 0x18, 0x01,
+ 0x5836, 0x08, 0x01,
+ 0x5837, 0x18, 0x01,
+ 0x5838, 0x00, 0x01,
+ 0x5839, 0x00, 0x01,
+ 0x583a, 0x08, 0x01,
+ 0x583b, 0x18, 0x01,
+ 0x583c, 0x55, 0x01,
+ 0x583e, 0x03, 0x01,
+ 0x5860, 0x02, 0x01,
+ 0x58a1, 0x04, 0x01,
+ 0x58a2, 0x00, 0x01,
+ 0x58a3, 0x00, 0x01,
+ 0x58a4, 0x02, 0x01,
+ 0x58a5, 0x00, 0x01,
+ 0x58a6, 0x02, 0x01,
+ 0x58a7, 0x00, 0x01,
+ 0x58a8, 0x00, 0x01,
+ 0x58a9, 0x00, 0x01,
+ 0x58aa, 0x00, 0x01,
+ 0x58ab, 0x00, 0x01,
+ 0x58ac, 0x14, 0x01,
+ 0x58ad, 0x60, 0x01,
+ 0x58ae, 0x0f, 0x01,
+ 0x58af, 0x50, 0x01,
+ 0x58c4, 0x12, 0x01,
+ 0x58c5, 0x60, 0x01,
+ 0x58c6, 0x0d, 0x01,
+ 0x58c7, 0xd0, 0x01,
+};
+
+const u32 sensor_16885c_setfile_A_2336x1752_30fps[] = {
+ 0x0304, 0x25, 0x01,
+ 0x3501, 0xec, 0x01,
+ 0x3511, 0xec, 0x01,
+ 0x3600, 0x40, 0x01,
+ 0x3621, 0x66, 0x01,
+ 0x3701, 0x14, 0x01,
+ 0x3709, 0x38, 0x01,
+ 0x3726, 0x20, 0x01,
+ 0x37b1, 0x40, 0x01,
+ 0x3808, 0x09, 0x01,
+ 0x3809, 0x20, 0x01,
+ 0x380a, 0x06, 0x01,
+ 0x380b, 0xd8, 0x01,
+ 0x380d, 0x78, 0x01,
+ 0x380e, 0x07, 0x01,
+ 0x380f, 0x70, 0x01,
+ 0x3811, 0x07, 0x01,
+ 0x3812, 0x00, 0x01,
+ 0x3813, 0x07, 0x01,
+ 0x3815, 0x22, 0x01,
+ 0x3834, 0xf5, 0x01,
+ 0x3d8d, 0xa8, 0x01,
+ 0x3f03, 0x1a, 0x01,
+ 0x4500, 0x25, 0x01,
+ 0x4502, 0x80, 0x01,
+ 0x450e, 0x16, 0x01,
+ 0x481f, 0x26, 0x01,
+ 0x4837, 0x14, 0x01,
+};
+
+const u32 sensor_16885c_setfile_A_2336x1752_60fps[] = {
+ 0x0304, 0x25, 0x01,
+ 0x3501, 0xec, 0x01,
+ 0x3511, 0xec, 0x01,
+ 0x3600, 0x40, 0x01,
+ 0x3621, 0x66, 0x01,
+ 0x3701, 0x14, 0x01,
+ 0x3709, 0x38, 0x01,
+ 0x3726, 0x20, 0x01,
+ 0x37b1, 0x40, 0x01,
+ 0x3808, 0x09, 0x01,
+ 0x3809, 0x20, 0x01,
+ 0x380a, 0x06, 0x01,
+ 0x380b, 0xd8, 0x01,
+ 0x380d, 0x78, 0x01,
+ 0x380e, 0x07, 0x01,
+ 0x380f, 0x70, 0x01,
+ 0x3811, 0x07, 0x01,
+ 0x3812, 0x00, 0x01,
+ 0x3813, 0x07, 0x01,
+ 0x3815, 0x22, 0x01,
+ 0x3834, 0xf5, 0x01,
+ 0x3d8d, 0xa8, 0x01,
+ 0x3f03, 0x1a, 0x01,
+ 0x4500, 0x25, 0x01,
+ 0x4502, 0x80, 0x01,
+ 0x450e, 0x16, 0x01,
+ 0x481f, 0x26, 0x01,
+ 0x4837, 0x14, 0x01,
+};
+#if 0
+const u32 sensor_16885c_setfile_A_1920x1080_60fps[] = {
+ 0x0304, 0x46, 0x01,
+ 0x3501, 0x40, 0x01,
+ 0x3511, 0x40, 0x01,
+ 0x3600, 0x00, 0x01,
+ 0x3621, 0x88, 0x01,
+ 0x3701, 0x0e, 0x01,
+ 0x3709, 0x30, 0x01,
+ 0x3726, 0x21, 0x01,
+ 0x37b1, 0x78, 0x01,
+ 0x3808, 0x07, 0x01,
+ 0x3809, 0x80, 0x01,
+ 0x380a, 0x04, 0x01,
+ 0x380b, 0x38, 0x01,
+ 0x380d, 0x00, 0x01,
+ 0x380e, 0x08, 0x01,
+ 0x380f, 0x24, 0x01,
+ 0x3811, 0xd7, 0x01,
+ 0x3812, 0x01, 0x01,
+ 0x3813, 0x57, 0x01,
+ 0x3815, 0x44, 0x01,
+ 0x3834, 0xf1, 0x01,
+ 0x3d8d, 0xc0, 0x01,
+ 0x3f03, 0x10, 0x01,
+ 0x4500, 0x20, 0x01,
+ 0x4502, 0x40, 0x01,
+ 0x450e, 0xff, 0x01,
+ 0x481f, 0x36, 0x01,
+ 0x4837, 0x0a, 0x01,
+};
+#endif
+const u32 sensor_16885c_setfile_A_1920x1080_120fps[] = {
+ 0x0304, 0x46, 0x01,
+ 0x3501, 0x40, 0x01,
+ 0x3511, 0x40, 0x01,
+ 0x3600, 0x00, 0x01,
+ 0x3621, 0x88, 0x01,
+ 0x3701, 0x0e, 0x01,
+ 0x3709, 0x30, 0x01,
+ 0x3726, 0x21, 0x01,
+ 0x37b1, 0x78, 0x01,
+ 0x3808, 0x07, 0x01,
+ 0x3809, 0x80, 0x01,
+ 0x380a, 0x04, 0x01,
+ 0x380b, 0x38, 0x01,
+ 0x380d, 0x00, 0x01,
+ 0x380e, 0x04, 0x01,
+ 0x380f, 0x12, 0x01,
+ 0x3811, 0xd7, 0x01,
+ 0x3812, 0x01, 0x01,
+ 0x3813, 0x57, 0x01,
+ 0x3815, 0x44, 0x01,
+ 0x3834, 0xf1, 0x01,
+ 0x3d8d, 0xc0, 0x01,
+ 0x3f03, 0x10, 0x01,
+ 0x4500, 0x20, 0x01,
+ 0x4502, 0x40, 0x01,
+ 0x450e, 0xff, 0x01,
+ 0x481f, 0x36, 0x01,
+ 0x4837, 0x0a, 0x01,
+};
+
+const struct sensor_pll_info_compact sensor_16885c_pllinfo_A_2336x1752_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 769600000, /* mipi_datarate */
+ 160333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0EE0, /* frame_length_lines (0x380e) */
+ 0x0578, /* line_length_pck (0x380c) */
+};
+
+const struct sensor_pll_info_compact sensor_16885c_pllinfo_A_2336x1752_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 769600000, /* mipi_datarate */
+ 160333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0774, /* frame_length_lines (0x380e) */
+ 0x0578, /* line_length_pck (0x380c) */
+};
+#if 0
+const struct sensor_pll_info_compact sensor_16885c_pllinfo_A_1920x1080_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1456000000, /* mipi_datarate */
+ 160333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0824, /* frame_length_lines (0x380e) */
+ 0x0500, /* line_length_pck (0x380c) */
+};
+#endif
+const struct sensor_pll_info_compact sensor_16885c_pllinfo_A_1920x1080_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1456000000, /* mipi_datarate */
+ 160333333, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0412, /* frame_length_lines (0x380e) */
+ 0x0500, /* line_length_pck (0x380c) */
+};
+
+static const u32 *sensor_16885c_setfiles_A[] = {
+ sensor_16885c_setfile_A_2336x1752_30fps,
+ sensor_16885c_setfile_A_2336x1752_60fps,
+ /*sensor_16885c_setfile_A_1920x1080_60fps,*/
+ sensor_16885c_setfile_A_1920x1080_120fps,
+};
+
+static const u32 sensor_16885c_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_16885c_setfile_A_2336x1752_30fps),
+ ARRAY_SIZE(sensor_16885c_setfile_A_2336x1752_60fps),
+ /*ARRAY_SIZE(sensor_16885c_setfile_A_1920x1080_60fps),*/
+ ARRAY_SIZE(sensor_16885c_setfile_A_1920x1080_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_16885c_pllinfos_A[] = {
+ &sensor_16885c_pllinfo_A_2336x1752_30fps,
+ &sensor_16885c_pllinfo_A_2336x1752_60fps,
+ /*&sensor_16885c_pllinfo_A_1920x1080_60fps,*/
+ &sensor_16885c_pllinfo_A_1920x1080_120fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-16885c.h"
+#include "fimc-is-cis-16885c-setA.h"
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "OV16885C"
+/* #define DEBUG_16885C_PLL */
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_16885c_global;
+static u32 sensor_16885c_global_size;
+static const u32 **sensor_16885c_setfiles;
+static const u32 *sensor_16885c_setfile_sizes;
+static const struct sensor_pll_info_compact **sensor_16885c_pllinfos;
+static u32 sensor_16885c_max_setfile_num;
+
+static void sensor_16885c_cis_data_calculation(const struct sensor_pll_info_compact *pll_info_compact, cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, frame_valid_us = 0;
+ u64 max_fps = 0;
+
+ FIMC_BUG_VOID(!pll_info_compact);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info_compact->pclk;
+
+ dbg_sensor(1, "ext_clock(%d), mipi_datarate(%d), pclk(%d)\n",
+ pll_info_compact->ext_clk, pll_info_compact->mipi_datarate, pll_info_compact->pclk);
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info_compact->frame_length_lines(%d) * pll_info_compact->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info_compact->frame_length_lines, pll_info_compact->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = ((u64)vt_pix_clk_hz * 10) / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = (u32)max_fps;
+ cis_data->frame_length_lines = pll_info_compact->frame_length_lines;
+ cis_data->line_length_pck = pll_info_compact->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_16885C_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = cis_data->cur_width;
+ cis_data->min_coarse_integration_time = SENSOR_16885C_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_16885C_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+int sensor_16885c_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read8(client, 0x300B, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+/* CIS OPS */
+int sensor_16885c_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+ setinfo.return_value = 0;
+
+ setinfo.param = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+
+ cis->cis_data->cur_width = SENSOR_16885C_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_16885C_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_16885c_cis_data_calculation(sensor_16885c_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_16885c_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ return -ENODEV;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -ENODEV;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ sensor_cis_dump_registers(subdev, sensor_16885c_setfiles[0], sensor_16885c_setfile_sizes[0]);
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_16885c_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+ if (hold)
+ ret = fimc_is_sensor_write8(client, 0x3208, 0x00);
+ else
+ ret = fimc_is_sensor_write8(client, 0x3208, 0x10);
+ ret = fimc_is_sensor_write8(client, 0x320b, 0x00);
+ ret = fimc_is_sensor_write8(client, 0x3208, 0xa0);
+
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_16885c_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_16885c_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_16885c_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_16885c_global, sensor_16885c_global_size);
+
+ if (ret < 0) {
+ err("sensor_16885c_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_16885c_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ return -EINVAL;
+ }
+
+ sensor_16885c_cis_data_calculation(sensor_16885c_pllinfos[mode], cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_16885c_setfiles[mode], sensor_16885c_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_16885c_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+/* Deprecated */
+int sensor_16885c_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ return 0;
+}
+
+int sensor_16885c_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_16885c_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+ /* Sensor stream on */
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_16885c_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream off");
+
+ /* Sensor stream off */
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u8 short_coarse_val[3] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short exposure */
+ short_coarse_val[0] = (short_coarse_int & 0xF000) >> 12;
+ short_coarse_val[1] = (short_coarse_int & 0x0FF0) >> 4;
+ short_coarse_val[2] = (short_coarse_int & 0x000F) << 4;
+ ret = fimc_is_sensor_write8_array(client, 0x3500, short_coarse_val, 3);
+ if (ret < 0)
+ goto p_err;
+#if 0
+ /* Long exposure */
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x3c92, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+#endif
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d), line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, cis_data->sen_vsync_count, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x), long_coarse_int %#x, short_coarse_int %#x\n",
+ cis->id, __func__, cis_data->sen_vsync_count, cis_data->frame_length_lines,
+ long_coarse_int, short_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_16885c_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update here? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_16885c_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time,
+ frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_16885c_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+ u64 numerator;
+ u32 max_coarse_integration_time = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * frame_duration;
+ frame_length_lines = (u16)((numerator / line_length_pck) / (1000 * 1000));
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, cis_data->pclk, frame_duration, line_length_pck, frame_length_lines);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x380e, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+
+ max_coarse_integration_time = cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+ cis_data->max_coarse_integration_time = max_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_16885c_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+#define REG_1X_BASE_VALUE 1000
+#define REG_1X_BASE 0x0080
+#define REG_2X_BASE_VALUE 2000
+#define REG_2X_BASE 0x0100
+#define REG_4X_BASE_VALUE 4000
+#define REG_4X_BASE 0x0200
+#define REG_8X_BASE_VALUE 8000
+#define REG_8X_BASE 0x0400
+#define REG_UPPER_BOUND 15500
+
+#define REG_1X_MIN_VALUE 0x0080
+#define REG_1X_MAX_VALUE 0x00F8
+#define REG_2X_MAX_VALUE 0x01F0
+#define REG_4X_MAX_VALUE 0x03E0
+#define REG_8X_MAX_VALUE 0x07F0
+
+static u32 sensor_16885c_again_to_reg_value(u32 again)
+{
+ u32 level;
+ u32 reg_value;
+
+ /* 1x ~ 1.9375x: 0x0080 ~ 0x00F8, step = 0.0625x, 0x08 */
+ /* 2x ~ 3.875 x: 0x0100 ~ 0x01F0, step = 0.125x, 0x10 */
+ /* 4x ~ 7.75 x: 0x0200 ~ 0x03E0, step = 0.25x, 0x20 */
+ /* 8x ~ 15.5 x: 0x0400 ~ 0x07F0, step = 0.5x, 0x40 */
+ if (again < REG_2X_BASE_VALUE) {
+ level = ((again - REG_1X_BASE_VALUE) << 4) / 1000; /* step_num */
+ reg_value = REG_1X_BASE + level * 8; /* reg_val = reg_base + step_num * step */
+ } else if (again < REG_4X_BASE_VALUE) {
+ level = ((again - REG_2X_BASE_VALUE) << 3) / 1000;
+ reg_value = REG_2X_BASE + level * 16;
+ } else if (again < REG_8X_BASE_VALUE) {
+ level = ((again - REG_4X_BASE_VALUE) << 2) / 1000;
+ reg_value = REG_4X_BASE + level * 32;
+ } else if (again < REG_UPPER_BOUND) {
+ level = ((again - REG_8X_BASE_VALUE) << 1) / 1000;
+ reg_value = REG_8X_BASE + level * 64;
+ } else {
+ reg_value = REG_8X_MAX_VALUE;
+ }
+
+ return reg_value;
+}
+
+static u32 sensor_16885c_reg_value_to_again(u32 reg_value)
+{
+ u32 again;
+
+ if (reg_value <= REG_1X_MAX_VALUE) {
+ again = ((((reg_value - REG_1X_BASE) >> 3) * 1000) >> 4) + REG_1X_BASE_VALUE;
+ } else if (reg_value <= REG_2X_MAX_VALUE) {
+ again = ((((reg_value - REG_2X_BASE) >> 2) * 1000) >> 4) + REG_2X_BASE_VALUE;
+ } else if (reg_value <= REG_4X_MAX_VALUE) {
+ again = ((((reg_value - REG_4X_BASE) >> 1) * 1000) >> 4) + REG_4X_BASE_VALUE;
+ } else if (reg_value <= REG_8X_MAX_VALUE) {
+ again = ((((reg_value - REG_8X_BASE) >> 0) * 1000) >> 4) + REG_8X_BASE_VALUE;
+ } else {
+ again = REG_1X_BASE_VALUE;
+ }
+
+ return again;
+}
+int sensor_16885c_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_16885c_again_to_reg_value(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_16885c_reg_value_to_again(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_16885c_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+ u8 analog_val[2] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ analog_gain = (u16)sensor_16885c_again_to_reg_value(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ analog_val[0] = (analog_gain & 0xFF00) >> 8;
+ analog_val[1] = (analog_gain & 0x00FF);
+ ret = fimc_is_sensor_write8_array(client, 0x3508, analog_val, 2);
+ ret = fimc_is_sensor_write8_array(client, 0x350c, analog_val, 2);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x3508, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_16885c_reg_value_to_again(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_analog_gain[0] = REG_1X_MIN_VALUE;
+ cis_data->min_analog_gain[1] = 1000;
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_16885c_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_analog_gain[0] = REG_8X_MAX_VALUE;
+ cis_data->max_analog_gain[1] = 15500;
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+#define REG_1X_BASE_DGAIN_VALUE 1000
+#define REG_1X_BASE_DGAIN 0x0400
+
+u32 sensor_16885c_dgain_to_reg_value(u32 permile)
+{
+ u32 reg_dgain;
+ reg_dgain = permile * REG_1X_BASE_DGAIN / REG_1X_BASE_DGAIN_VALUE;
+
+ return reg_dgain;
+}
+
+int sensor_16885c_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u8 reg_short_gain[2] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_16885c_dgain_to_reg_value(dgain->long_val);
+ short_gain = (u16)sensor_16885c_dgain_to_reg_value(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ reg_short_gain[0] = (short_gain & 0x3FFF) >> 8;
+ reg_short_gain[1] = (short_gain & 0xFF);
+ fimc_is_sensor_write8(client, 0x3676, reg_short_gain[0]);
+ fimc_is_sensor_write8(client, 0x3677, reg_short_gain[1]);
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, dgain->long_val,
+ dgain->short_val, long_gain, short_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_16885c_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x350a, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_16885c_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_16885c_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_digital_gain[0] = REG_1X_BASE_DGAIN;
+ cis_data->min_digital_gain[1] = REG_1X_BASE_DGAIN_VALUE;
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_16885c_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_digital_gain[0] = 0x3FFF;
+ cis_data->max_digital_gain[1] = 16000;
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_16885c_cis_wait_streamon(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u32 wait_cnt = 0, time_out_cnt = 2500;
+ u8 sensor_fcount = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (unlikely(!cis)) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ if (unlikely(!cis_data)) {
+ err("cis_data is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read8(client, 0x485F, &sensor_fcount);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x485F, sensor_fcount, ret);
+
+ /*
+ * Read sensor frame counter (sensor_fcount address = 0x485F)
+ * stream on (0x00 ~ 0xFE), stream off (0xFF)
+ */
+ while (sensor_fcount == 0x00) {
+ usleep_range(CIS_STREAM_ON_WAIT_TIME, CIS_STREAM_ON_WAIT_TIME);
+ wait_cnt++;
+
+ ret = fimc_is_sensor_read8(client, 0x485F, &sensor_fcount);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x485F, sensor_fcount, ret);
+
+ if (wait_cnt >= time_out_cnt) {
+ err("[MOD:D:%d] %s, Don't sensor stream on and time out, wait_limit(%d) > time_out(%d), sensor_fcount(%d)",
+ cis->id, __func__, wait_cnt, time_out_cnt, sensor_fcount);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, sensor_fcount(%d), (wait_limit(%d) < time_out(%d))\n",
+ cis->id, __func__, sensor_fcount, wait_cnt, time_out_cnt);
+ }
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ /* retention mode CRC wait calculation */
+ usleep_range(1000, 1000);
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_16885c_cis_wait_streamoff(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u32 wait_cnt = 0, time_out_cnt = 250;
+ u8 sensor_fcount = 0;
+
+ BUG_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ cis_data = cis->cis_data;
+ client = cis->client;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = fimc_is_sensor_read8(client, 0x485F, &sensor_fcount);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x485F, sensor_fcount, ret);
+
+ while (sensor_fcount != 0x00) {
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = fimc_is_sensor_read8(client, 0x485F, &sensor_fcount);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x485F, sensor_fcount, ret);
+
+ usleep_range(CIS_STREAM_OFF_WAIT_TIME, CIS_STREAM_OFF_WAIT_TIME);
+ wait_cnt++;
+
+ if (wait_cnt >= time_out_cnt) {
+ err("[MOD:D:%d] %s, time out, wait_limit(%d) > time_out(%d), sensor_fcount(%d)",
+ cis->id, __func__, wait_cnt, time_out_cnt, sensor_fcount);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, sensor_fcount(%d), (wait_limit(%d) < time_out(%d))\n",
+ cis->id, __func__, sensor_fcount, wait_cnt, time_out_cnt);
+ }
+
+p_err:
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_16885c_cis_init,
+ .cis_log_status = sensor_16885c_cis_log_status,
+ .cis_group_param_hold = sensor_16885c_cis_group_param_hold,
+ .cis_set_global_setting = sensor_16885c_cis_set_global_setting,
+ .cis_mode_change = sensor_16885c_cis_mode_change,
+ .cis_set_size = sensor_16885c_cis_set_size,
+ .cis_stream_on = sensor_16885c_cis_stream_on,
+ .cis_stream_off = sensor_16885c_cis_stream_off,
+ .cis_set_exposure_time = sensor_16885c_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_16885c_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_16885c_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_16885c_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_16885c_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_16885c_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_16885c_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_16885c_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_16885c_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_16885c_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_16885c_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_16885c_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_16885c_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_16885c_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_16885c_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_16885c_cis_check_rev,
+ .cis_factory_test = sensor_cis_factory_test,
+ .cis_wait_streamoff = sensor_16885c_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_16885c_cis_wait_streamon,
+};
+
+static int cis_16885c_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_OV16885C);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ probe_err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_OV16885C;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_BG_GR;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ if (of_property_read_bool(dnode, "dual_sync_mode")) {
+ ret = of_property_read_u32(dnode, "dual_sync_mode", &cis->dual_sync_mode);
+ if (ret)
+ warn("dual_sync_mode read is fail(%d)", ret);
+ } else {
+ cis->dual_sync_mode = DUAL_SYNC_NONE;
+ }
+
+ probe_info("%s dual_sync_mode %d\n", __func__, cis->dual_sync_mode);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_16885c_global = sensor_16885c_setfile_A_Global;
+ sensor_16885c_global_size = ARRAY_SIZE(sensor_16885c_setfile_A_Global);
+ sensor_16885c_setfiles = sensor_16885c_setfiles_A;
+ sensor_16885c_setfile_sizes = sensor_16885c_setfile_A_sizes;
+ sensor_16885c_pllinfos = sensor_16885c_pllinfos_A;
+ sensor_16885c_max_setfile_num = ARRAY_SIZE(sensor_16885c_setfiles_A);
+ }
+
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_16885c_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-16885c",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_16885c_match);
+
+static const struct i2c_device_id sensor_cis_16885c_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_16885c_driver = {
+ .probe = cis_16885c_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_16885c_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_16885c_idt
+};
+
+static int __init sensor_cis_16885c_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_16885c_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_16885c_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_16885c_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_16885C_H
+#define FIMC_IS_CIS_16885C_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_16885C_MAX_WIDTH (4096)
+#define SENSOR_16885C_MAX_HEIGHT (3072)
+
+/* TODO: Check below values are valid */
+#define SENSOR_16885C_FINE_INTEGRATION_TIME_MIN 0x0
+#define SENSOR_16885C_FINE_INTEGRATION_TIME_MAX 0x0 /* Not used */
+#define SENSOR_16885C_COARSE_INTEGRATION_TIME_MIN 0x8 /* TODO */
+#define SENSOR_16885C_COARSE_INTEGRATION_TIME_MAX_MARGIN 0xC /* TODO */
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+#endif
+
.cis_wait_streamon = sensor_cis_wait_streamon,
.cis_data_calculation = sensor_2l1_cis_data_calc,
.cis_set_long_term_exposure = sensor_2l1_cis_long_term_exposure,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_2l1_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
ret = of_property_read_string(dnode, "setfile", &setfile);
if (ret) {
err("setfile index read fail(%d), take default setfile!!", ret);
.cis_wait_streamon = sensor_cis_wait_streamon,
.cis_data_calculation = sensor_2l2_cis_data_calc,
.cis_set_long_term_exposure = sensor_2l2_cis_long_term_exposure,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_2l2_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
ret = of_property_read_string(dnode, "setfile", &setfile);
if (ret) {
err("setfile index read fail(%d), take default setfile!!", ret);
/* MODE 2 Super Slow - 2016 x 1134 @60 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
/* 10_30_2_M2_FHD_Slowvideo Preview 60fps 81Àå */
-const u32 sensor_2l3_setfile_A_2016x1134_60fps_mode2_ssm[] = {
+const u32 sensor_2l3_setfile_A_2016x1134_60fps_mode2_ssm_960[] = {
0xFCFC, 0x4000, 0x02,
0x6000, 0x0005, 0x02,
0x6214, 0x79F1, 0x02,
/* MODE 2 - 1280 x 720 @60 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
/* 16_61_3_M2_HD_Slolwvideo Preview 60fps - 240fps - 960fps */
-const u32 sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm[] = {
+const u32 sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm_960[] = {
0xFCFC, 0x4000, 0x02,
0x6000, 0x0005, 0x02,
0x6214, 0x79F1, 0x02,
};
-const struct sensor_pll_info_compact sensor_2l3_pllinfo_A_2016x1134_60fps_mode2_ssm = {
+const struct sensor_pll_info_compact sensor_2l3_pllinfo_A_2016x1134_60fps_mode2_ssm_960 = {
EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
2054000000, /* mipi_datarate */
1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
0x0330, /* line_length_pck */
};
-const struct sensor_pll_info_compact sensor_2l3_pllinfo_A_1280x720_60fps_mode2_ssm = {
+const struct sensor_pll_info_compact sensor_2l3_pllinfo_A_1280x720_60fps_mode2_ssm_960 = {
EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
2054000000, /* mipi_datarate */
1010668000, /* pclk = VT pix CLK * 4(this value is different by cis) */
sensor_2l3_setfile_A_1504x1504_120fps_mode2,
sensor_2l3_setfile_A_1504x1504_30fps_mode2,
sensor_2l3_setfile_A_1008x756_120fps_mode2,
- sensor_2l3_setfile_A_2016x1134_60fps_mode2_ssm,
- sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm,
+ sensor_2l3_setfile_A_2016x1134_60fps_mode2_ssm_960,
+ sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm_960,
+ sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm_960,
sensor_2l3_setfile_A_4032x3024_30fps_mode2_dram_test_section1,
sensor_2l3_setfile_A_4032x3024_30fps_mode2_dram_test_section2,
};
ARRAY_SIZE(sensor_2l3_setfile_A_1504x1504_120fps_mode2),
ARRAY_SIZE(sensor_2l3_setfile_A_1504x1504_30fps_mode2),
ARRAY_SIZE(sensor_2l3_setfile_A_1008x756_120fps_mode2),
- ARRAY_SIZE(sensor_2l3_setfile_A_2016x1134_60fps_mode2_ssm),
- ARRAY_SIZE(sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm),
+ ARRAY_SIZE(sensor_2l3_setfile_A_2016x1134_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l3_setfile_A_1280x720_60fps_mode2_ssm_960),
ARRAY_SIZE(sensor_2l3_setfile_A_4032x3024_30fps_mode2_dram_test_section1),
ARRAY_SIZE(sensor_2l3_setfile_A_4032x3024_30fps_mode2_dram_test_section2),
};
&sensor_2l3_pllinfo_A_1504x1504_120fps_mode2,
&sensor_2l3_pllinfo_A_1504x1504_30fps_mode2,
&sensor_2l3_pllinfo_A_1008x756_120fps_mode2,
- &sensor_2l3_pllinfo_A_2016x1134_60fps_mode2_ssm,
- &sensor_2l3_pllinfo_A_1280x720_60fps_mode2_ssm,
+ &sensor_2l3_pllinfo_A_2016x1134_60fps_mode2_ssm_960,
+ &sensor_2l3_pllinfo_A_1280x720_60fps_mode2_ssm_960,
+ &sensor_2l3_pllinfo_A_1280x720_60fps_mode2_ssm_960,
&sensor_2l3_pllinfo_A_4032x3024_30fps_mode2_aeb_factory,
&sensor_2l3_pllinfo_A_4032x3024_30fps_mode2_aeb_factory_stage2,
};
#include "fimc-is-cis.h"
#include "fimc-is-cis-2l3.h"
-/* SAK2L3SX_EVT0.3_Ver_0.17_20180110_TnP_1648 */
+/* SAK2L3SX_EVT0.3_Ver_0.1_20180523_MD_Threshold_Control_TnP */
/* Reset + TnP */
const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
I2C_MODE_BURST_DATA, 0x101A, 0x02,
I2C_MODE_BURST_DATA, 0x0881, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x09BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x15BD, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0xFF6C, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF8C, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
I2C_MODE_BURST_DATA, 0xA920, 0x02,
I2C_MODE_BURST_DATA, 0x2001, 0x02,
I2C_MODE_BURST_DATA, 0x9073, 0x02,
I2C_MODE_BURST_DATA, 0x30BD, 0x02,
I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0xEC4D, 0x02,
I2C_MODE_BURST_DATA, 0xED4C, 0x02,
I2C_MODE_BURST_DATA, 0x0020, 0x02,
- I2C_MODE_BURST_DATA, 0x1C21, 0x02,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC000, 0x02,
I2C_MODE_BURST_DATA, 0x2070, 0x02,
I2C_MODE_BURST_DATA, 0x6070, 0x02,
I2C_MODE_BURST_DATA, 0xA070, 0x02,
I2C_MODE_BURST_DATA, 0x6071, 0x02,
I2C_MODE_BURST_DATA, 0xA071, 0x02,
I2C_MODE_BURST_DATA, 0x2081, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C21, 0x02,
I2C_MODE_BURST_DATA, 0x04F1, 0x02,
I2C_MODE_BURST_DATA, 0x0C00, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x71FD, 0x02,
+ I2C_MODE_BURST_DATA, 0x7AFD, 0x02,
I2C_MODE_BURST_DATA, 0x0120, 0x02,
- I2C_MODE_BURST_DATA, 0xE44D, 0x02,
I2C_MODE_BURST_DATA, 0x2083, 0x02,
I2C_MODE_BURST_DATA, 0xE084, 0x02,
I2C_MODE_BURST_DATA, 0x2878, 0x02,
I2C_MODE_BURST_DATA, 0x0121, 0x02,
I2C_MODE_BURST_DATA, 0x0020, 0x02,
I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
- I2C_MODE_BURST_DATA, 0xBDFF, 0x02,
+ I2C_MODE_BURST_DATA, 0xBBFF, 0x02,
I2C_MODE_BURST_DATA, 0xE889, 0x02,
I2C_MODE_BURST_DATA, 0x6081, 0x02,
I2C_MODE_BURST_DATA, 0x6078, 0x02,
I2C_MODE_BURST_DATA, 0x0821, 0x02,
I2C_MODE_BURST_DATA, 0x0120, 0x02,
I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
- I2C_MODE_BURST_DATA, 0xB4FF, 0x02,
+ I2C_MODE_BURST_DATA, 0xB2FF, 0x02,
I2C_MODE_BURST_DATA, 0x288A, 0x02,
I2C_MODE_BURST_DATA, 0x6081, 0x02,
I2C_MODE_BURST_DATA, 0x6178, 0x02,
I2C_MODE_BURST_DATA, 0x0844, 0x02,
I2C_MODE_BURST_DATA, 0x6081, 0x02,
I2C_MODE_BURST_DATA, 0x70BD, 0x02,
- I2C_MODE_BURST_DATA, 0xD849, 0x02,
+ I2C_MODE_BURST_DATA, 0xD749, 0x02,
I2C_MODE_BURST_DATA, 0x0880, 0x02,
I2C_MODE_BURST_DATA, 0x0028, 0x02,
I2C_MODE_BURST_DATA, 0x07D0, 0x02,
I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0xD649, 0x02,
+ I2C_MODE_BURST_DATA, 0xD549, 0x02,
I2C_MODE_BURST_DATA, 0x0880, 0x02,
I2C_MODE_BURST_DATA, 0x05D1, 0x02,
I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
I2C_MODE_BURST_DATA, 0xF6E7, 0x02,
I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0xD149, 0x02,
+ I2C_MODE_BURST_DATA, 0xD049, 0x02,
I2C_MODE_BURST_DATA, 0x0880, 0x02,
- I2C_MODE_BURST_DATA, 0xCB48, 0x02,
- I2C_MODE_BURST_DATA, 0xD14A, 0x02,
+ I2C_MODE_BURST_DATA, 0xCA48, 0x02,
+ I2C_MODE_BURST_DATA, 0xD04A, 0x02,
I2C_MODE_BURST_DATA, 0xC17B, 0x02,
I2C_MODE_BURST_DATA, 0x1180, 0x02,
- I2C_MODE_BURST_DATA, 0xD049, 0x02,
+ I2C_MODE_BURST_DATA, 0xCF49, 0x02,
I2C_MODE_BURST_DATA, 0x407F, 0x02,
I2C_MODE_BURST_DATA, 0x0880, 0x02,
I2C_MODE_BURST_DATA, 0x01F1, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF047, 0x02,
I2C_MODE_BURST_DATA, 0x0646, 0x02,
- I2C_MODE_BURST_DATA, 0xC34F, 0x02,
- I2C_MODE_BURST_DATA, 0xC548, 0x02,
+ I2C_MODE_BURST_DATA, 0xC24F, 0x02,
+ I2C_MODE_BURST_DATA, 0xC448, 0x02,
I2C_MODE_BURST_DATA, 0x0C46, 0x02,
I2C_MODE_BURST_DATA, 0xF978, 0x02,
I2C_MODE_BURST_DATA, 0x458D, 0x02,
I2C_MODE_BURST_DATA, 0xB8EE, 0x02,
I2C_MODE_BURST_DATA, 0x400A, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x24FD, 0x02,
+ I2C_MODE_BURST_DATA, 0x2EFD, 0x02,
I2C_MODE_BURST_DATA, 0xBCEE, 0x02,
I2C_MODE_BURST_DATA, 0xC00A, 0x02,
I2C_MODE_BURST_DATA, 0x10EE, 0x02,
I2C_MODE_BURST_DATA, 0xB8EE, 0x02,
I2C_MODE_BURST_DATA, 0x400A, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x17FD, 0x02,
+ I2C_MODE_BURST_DATA, 0x21FD, 0x02,
I2C_MODE_BURST_DATA, 0xBCEE, 0x02,
I2C_MODE_BURST_DATA, 0xC00A, 0x02,
I2C_MODE_BURST_DATA, 0x10EE, 0x02,
I2C_MODE_BURST_DATA, 0x5FEA, 0x02,
I2C_MODE_BURST_DATA, 0x0901, 0x02,
I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
- I2C_MODE_BURST_DATA, 0xF092, 0x02,
+ I2C_MODE_BURST_DATA, 0xEC92, 0x02,
I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
- I2C_MODE_BURST_DATA, 0xE8C2, 0x02,
+ I2C_MODE_BURST_DATA, 0xE4C2, 0x02,
I2C_MODE_BURST_DATA, 0x09F1, 0x02,
I2C_MODE_BURST_DATA, 0x060A, 0x02,
I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
I2C_MODE_BURST_DATA, 0x0052, 0x02,
I2C_MODE_BURST_DATA, 0x25D0, 0x02,
- I2C_MODE_BURST_DATA, 0xAE4B, 0x02,
+ I2C_MODE_BURST_DATA, 0xAD4B, 0x02,
I2C_MODE_BURST_DATA, 0xC6EB, 0x02,
I2C_MODE_BURST_DATA, 0xC601, 0x02,
I2C_MODE_BURST_DATA, 0x03EB, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0846, 0x02,
- I2C_MODE_BURST_DATA, 0x9849, 0x02,
+ I2C_MODE_BURST_DATA, 0x9749, 0x02,
I2C_MODE_BURST_DATA, 0x1831, 0x02,
I2C_MODE_BURST_DATA, 0x0988, 0x02,
- I2C_MODE_BURST_DATA, 0x914D, 0x02,
+ I2C_MODE_BURST_DATA, 0x904D, 0x02,
I2C_MODE_BURST_DATA, 0xCFB2, 0x02,
I2C_MODE_BURST_DATA, 0xC0EB, 0x02,
I2C_MODE_BURST_DATA, 0xC001, 0x02,
I2C_MODE_BURST_DATA, 0x0121, 0x02,
I2C_MODE_BURST_DATA, 0x00E0, 0x02,
I2C_MODE_BURST_DATA, 0x0021, 0x02,
- I2C_MODE_BURST_DATA, 0x894A, 0x02,
+ I2C_MODE_BURST_DATA, 0x884A, 0x02,
I2C_MODE_BURST_DATA, 0xAB79, 0x02,
I2C_MODE_BURST_DATA, 0x0244, 0x02,
I2C_MODE_BURST_DATA, 0x92F8, 0x02,
I2C_MODE_BURST_DATA, 0xA871, 0x02,
I2C_MODE_BURST_DATA, 0xC2E7, 0x02,
I2C_MODE_BURST_DATA, 0x70B5, 0x02,
- I2C_MODE_BURST_DATA, 0x5C4D, 0x02,
+ I2C_MODE_BURST_DATA, 0x5B4D, 0x02,
I2C_MODE_BURST_DATA, 0x0126, 0x02,
I2C_MODE_BURST_DATA, 0x0024, 0x02,
I2C_MODE_BURST_DATA, 0x95F8, 0x02,
I2C_MODE_BURST_DATA, 0x2800, 0x02,
I2C_MODE_BURST_DATA, 0x70BD, 0x02,
I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
- I2C_MODE_BURST_DATA, 0xC6FE, 0x02,
+ I2C_MODE_BURST_DATA, 0xC4FE, 0x02,
I2C_MODE_BURST_DATA, 0x85F8, 0x02,
I2C_MODE_BURST_DATA, 0x2860, 0x02,
I2C_MODE_BURST_DATA, 0x6878, 0x02,
I2C_MODE_BURST_DATA, 0xEE70, 0x02,
I2C_MODE_BURST_DATA, 0xE0E7, 0x02,
I2C_MODE_BURST_DATA, 0x70B5, 0x02,
- I2C_MODE_BURST_DATA, 0x444C, 0x02,
+ I2C_MODE_BURST_DATA, 0x434C, 0x02,
I2C_MODE_BURST_DATA, 0x0725, 0x02,
I2C_MODE_BURST_DATA, 0x2146, 0x02,
I2C_MODE_BURST_DATA, 0x2089, 0x02,
I2C_MODE_BURST_DATA, 0x70BD, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF047, 0x02,
- I2C_MODE_BURST_DATA, 0x314C, 0x02,
+ I2C_MODE_BURST_DATA, 0x304C, 0x02,
I2C_MODE_BURST_DATA, 0x0025, 0x02,
- I2C_MODE_BURST_DATA, 0x334F, 0x02,
+ I2C_MODE_BURST_DATA, 0x324F, 0x02,
I2C_MODE_BURST_DATA, 0x6078, 0x02,
I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
- I2C_MODE_BURST_DATA, 0xCC80, 0x02,
+ I2C_MODE_BURST_DATA, 0xC880, 0x02,
I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
- I2C_MODE_BURST_DATA, 0xCC90, 0x02,
+ I2C_MODE_BURST_DATA, 0xC890, 0x02,
I2C_MODE_BURST_DATA, 0x0126, 0x02,
I2C_MODE_BURST_DATA, 0x0128, 0x02,
I2C_MODE_BURST_DATA, 0x08D0, 0x02,
I2C_MODE_BURST_DATA, 0x0050, 0x02,
I2C_MODE_BURST_DATA, 0x04E7, 0x02,
I2C_MODE_BURST_DATA, 0x10B5, 0x02,
- I2C_MODE_BURST_DATA, 0x1E4C, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D4C, 0x02,
I2C_MODE_BURST_DATA, 0x94F8, 0x02,
I2C_MODE_BURST_DATA, 0x2800, 0x02,
I2C_MODE_BURST_DATA, 0x30B1, 0x02,
I2C_MODE_BURST_DATA, 0xC1E7, 0x02,
I2C_MODE_BURST_DATA, 0x10BD, 0x02,
I2C_MODE_BURST_DATA, 0x70B5, 0x02,
- I2C_MODE_BURST_DATA, 0x1C4A, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B48, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x691E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0229, 0x02,
+ I2C_MODE_BURST_DATA, 0x52D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x194A, 0x02,
I2C_MODE_BURST_DATA, 0x92F8, 0x02,
- I2C_MODE_BURST_DATA, 0x690E, 0x02,
- I2C_MODE_BURST_DATA, 0x0228, 0x02,
- I2C_MODE_BURST_DATA, 0x49D1, 0x02,
- I2C_MODE_BURST_DATA, 0x1A49, 0x02,
- I2C_MODE_BURST_DATA, 0x91F8, 0x02,
- I2C_MODE_BURST_DATA, 0x3C00, 0x02,
- I2C_MODE_BURST_DATA, 0x0028, 0x02,
- I2C_MODE_BURST_DATA, 0x44D0, 0x02,
- I2C_MODE_BURST_DATA, 0x0C48, 0x02,
- I2C_MODE_BURST_DATA, 0x0378, 0x02,
+ I2C_MODE_BURST_DATA, 0x3C10, 0x02,
+ I2C_MODE_BURST_DATA, 0x0029, 0x02,
+ I2C_MODE_BURST_DATA, 0x4DD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B49, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B78, 0x02,
I2C_MODE_BURST_DATA, 0x012B, 0x02,
- I2C_MODE_BURST_DATA, 0x2ED1, 0x02,
- I2C_MODE_BURST_DATA, 0x0B4B, 0x02,
+ I2C_MODE_BURST_DATA, 0x2FD1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A4B, 0x02,
I2C_MODE_BURST_DATA, 0x93F8, 0x02,
I2C_MODE_BURST_DATA, 0x2830, 0x02,
I2C_MODE_BURST_DATA, 0x072B, 0x02,
- I2C_MODE_BURST_DATA, 0x29D0, 0x02,
- I2C_MODE_BURST_DATA, 0xB2F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6C2E, 0x02,
- I2C_MODE_BURST_DATA, 0xC389, 0x02,
- I2C_MODE_BURST_DATA, 0x4968, 0x02,
- I2C_MODE_BURST_DATA, 0x1A44, 0x02,
- I2C_MODE_BURST_DATA, 0x038A, 0x02,
- I2C_MODE_BURST_DATA, 0x0079, 0x02,
+ I2C_MODE_BURST_DATA, 0x2AD0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6C0E, 0x02,
+ I2C_MODE_BURST_DATA, 0xCB89, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C79, 0x02,
+ I2C_MODE_BURST_DATA, 0x1844, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B8A, 0x02,
+ I2C_MODE_BURST_DATA, 0x5268, 0x02,
+ I2C_MODE_BURST_DATA, 0x2344, 0x02,
I2C_MODE_BURST_DATA, 0x1844, 0x02,
- I2C_MODE_BURST_DATA, 0x1044, 0x02,
I2C_MODE_BURST_DATA, 0x401C, 0x02,
- I2C_MODE_BURST_DATA, 0x8842, 0x02,
- I2C_MODE_BURST_DATA, 0x1DD3, 0x02,
- I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
- I2C_MODE_BURST_DATA, 0x7040, 0x02,
- I2C_MODE_BURST_DATA, 0xC3E7, 0x02,
+ I2C_MODE_BURST_DATA, 0x9042, 0x02,
+ I2C_MODE_BURST_DATA, 0x1ED3, 0x02,
+ I2C_MODE_BURST_DATA, 0x1AE0, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
I2C_MODE_BURST_DATA, 0x2001, 0x02,
I2C_MODE_BURST_DATA, 0x2C00, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0xFF40, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF60, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
I2C_MODE_BURST_DATA, 0xC290, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
I2C_MODE_BURST_DATA, 0xAA60, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
I2C_MODE_BURST_DATA, 0xBE60, 0x02,
- I2C_MODE_BURST_DATA, 0xFE48, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0xA7E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC000, 0x02,
+ I2C_MODE_BURST_DATA, 0x20B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xFE4A, 0x02,
+ I2C_MODE_BURST_DATA, 0x1080, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFD48, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0x0168, 0x02,
I2C_MODE_BURST_DATA, 0x0C0C, 0x02,
I2C_MODE_BURST_DATA, 0x2946, 0x02,
I2C_MODE_BURST_DATA, 0x2046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x8DFB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8EFB, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x90FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x91FB, 0x02,
I2C_MODE_BURST_DATA, 0x2946, 0x02,
I2C_MODE_BURST_DATA, 0x2046, 0x02,
I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
I2C_MODE_BURST_DATA, 0x7040, 0x02,
I2C_MODE_BURST_DATA, 0x0122, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x84BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x85BB, 0x02,
I2C_MODE_BURST_DATA, 0x70BD, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0546, 0x02,
- I2C_MODE_BURST_DATA, 0xF448, 0x02,
+ I2C_MODE_BURST_DATA, 0xF348, 0x02,
I2C_MODE_BURST_DATA, 0x0C46, 0x02,
I2C_MODE_BURST_DATA, 0x90F8, 0x02,
I2C_MODE_BURST_DATA, 0xB202, 0x02,
I2C_MODE_BURST_DATA, 0x58B1, 0x02,
- I2C_MODE_BURST_DATA, 0xF348, 0x02,
+ I2C_MODE_BURST_DATA, 0xF148, 0x02,
I2C_MODE_BURST_DATA, 0x90F8, 0x02,
I2C_MODE_BURST_DATA, 0x3D20, 0x02,
I2C_MODE_BURST_DATA, 0x012A, 0x02,
I2C_MODE_BURST_DATA, 0x01D0, 0x02,
I2C_MODE_BURST_DATA, 0x0B2A, 0x02,
I2C_MODE_BURST_DATA, 0x04D1, 0x02,
- I2C_MODE_BURST_DATA, 0xED49, 0x02,
+ I2C_MODE_BURST_DATA, 0xEC49, 0x02,
I2C_MODE_BURST_DATA, 0x0020, 0x02,
I2C_MODE_BURST_DATA, 0x3031, 0x02,
I2C_MODE_BURST_DATA, 0x81F8, 0x02,
I2C_MODE_BURST_DATA, 0x2800, 0x02,
- I2C_MODE_BURST_DATA, 0xEB48, 0x02,
+ I2C_MODE_BURST_DATA, 0xE948, 0x02,
I2C_MODE_BURST_DATA, 0x4268, 0x02,
I2C_MODE_BURST_DATA, 0x160C, 0x02,
I2C_MODE_BURST_DATA, 0x97B2, 0x02,
I2C_MODE_BURST_DATA, 0x3946, 0x02,
I2C_MODE_BURST_DATA, 0x3046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x66FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x67FB, 0x02,
I2C_MODE_BURST_DATA, 0x2146, 0x02,
I2C_MODE_BURST_DATA, 0x2846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x6CFB, 0x02,
+ I2C_MODE_BURST_DATA, 0x6DFB, 0x02,
I2C_MODE_BURST_DATA, 0x3946, 0x02,
I2C_MODE_BURST_DATA, 0x3046, 0x02,
I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0122, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x5BBB, 0x02,
+ I2C_MODE_BURST_DATA, 0x5CBB, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xFC47, 0x02,
I2C_MODE_BURST_DATA, 0x8846, 0x02,
I2C_MODE_BURST_DATA, 0x8146, 0x02,
- I2C_MODE_BURST_DATA, 0xE249, 0x02,
+ I2C_MODE_BURST_DATA, 0xE049, 0x02,
I2C_MODE_BURST_DATA, 0xDDE9, 0x02,
I2C_MODE_BURST_DATA, 0x0A50, 0x02,
I2C_MODE_BURST_DATA, 0x0D9C, 0x02,
I2C_MODE_BURST_DATA, 0x2946, 0x02,
I2C_MODE_BURST_DATA, 0x4846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x56FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x57FB, 0x02,
I2C_MODE_BURST_DATA, 0x04F1, 0x02,
I2C_MODE_BURST_DATA, 0x0800, 0x02,
I2C_MODE_BURST_DATA, 0xCDE9, 0x02,
I2C_MODE_BURST_DATA, 0x4146, 0x02,
I2C_MODE_BURST_DATA, 0x4846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x51FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x52FB, 0x02,
I2C_MODE_BURST_DATA, 0x6560, 0x02,
I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
I2C_MODE_BURST_DATA, 0xFC87, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0546, 0x02,
- I2C_MODE_BURST_DATA, 0xCF48, 0x02,
+ I2C_MODE_BURST_DATA, 0xCD48, 0x02,
I2C_MODE_BURST_DATA, 0x0C46, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0x8168, 0x02,
I2C_MODE_BURST_DATA, 0x3946, 0x02,
I2C_MODE_BURST_DATA, 0x3046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x2DFB, 0x02,
+ I2C_MODE_BURST_DATA, 0x2EFB, 0x02,
I2C_MODE_BURST_DATA, 0x0020, 0x02,
I2C_MODE_BURST_DATA, 0x84F8, 0x02,
I2C_MODE_BURST_DATA, 0x7802, 0x02,
I2C_MODE_BURST_DATA, 0x2146, 0x02,
I2C_MODE_BURST_DATA, 0x2846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x3CFB, 0x02,
+ I2C_MODE_BURST_DATA, 0x3DFB, 0x02,
I2C_MODE_BURST_DATA, 0x3946, 0x02,
I2C_MODE_BURST_DATA, 0x3046, 0x02,
I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0122, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x1CBB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1DBB, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xFC41, 0x02,
I2C_MODE_BURST_DATA, 0x0446, 0x02,
- I2C_MODE_BURST_DATA, 0xC048, 0x02,
+ I2C_MODE_BURST_DATA, 0xBE48, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xC168, 0x02,
I2C_MODE_BURST_DATA, 0x0D0C, 0x02,
I2C_MODE_BURST_DATA, 0x3146, 0x02,
I2C_MODE_BURST_DATA, 0x2846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x10FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x11FB, 0x02,
I2C_MODE_BURST_DATA, 0x2046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x2BFB, 0x02,
- I2C_MODE_BURST_DATA, 0xBE4A, 0x02,
+ I2C_MODE_BURST_DATA, 0x2CFB, 0x02,
+ I2C_MODE_BURST_DATA, 0xBC4A, 0x02,
I2C_MODE_BURST_DATA, 0x0024, 0x02,
I2C_MODE_BURST_DATA, 0x92F8, 0x02,
I2C_MODE_BURST_DATA, 0x0C01, 0x02,
I2C_MODE_BURST_DATA, 0x46F2, 0x02,
I2C_MODE_BURST_DATA, 0x6070, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0xFEFA, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFA, 0x02,
I2C_MODE_BURST_DATA, 0xA71E, 0x02,
I2C_MODE_BURST_DATA, 0xCDE9, 0x02,
I2C_MODE_BURST_DATA, 0x0074, 0x02,
I2C_MODE_BURST_DATA, 0x0123, 0x02,
I2C_MODE_BURST_DATA, 0x1A46, 0x02,
I2C_MODE_BURST_DATA, 0x0021, 0x02,
- I2C_MODE_BURST_DATA, 0xB448, 0x02,
+ I2C_MODE_BURST_DATA, 0xB348, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x18FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x19FB, 0x02,
I2C_MODE_BURST_DATA, 0xCDE9, 0x02,
I2C_MODE_BURST_DATA, 0x0074, 0x02,
I2C_MODE_BURST_DATA, 0x0123, 0x02,
I2C_MODE_BURST_DATA, 0x1A46, 0x02,
I2C_MODE_BURST_DATA, 0x0021, 0x02,
- I2C_MODE_BURST_DATA, 0xB148, 0x02,
+ I2C_MODE_BURST_DATA, 0xB048, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x10FB, 0x02,
- I2C_MODE_BURST_DATA, 0xB148, 0x02,
+ I2C_MODE_BURST_DATA, 0x11FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xAF48, 0x02,
I2C_MODE_BURST_DATA, 0x0480, 0x02,
- I2C_MODE_BURST_DATA, 0xB048, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE48, 0x02,
I2C_MODE_BURST_DATA, 0xEA30, 0x02,
I2C_MODE_BURST_DATA, 0x0480, 0x02,
- I2C_MODE_BURST_DATA, 0xAD48, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC48, 0x02,
I2C_MODE_BURST_DATA, 0x0094, 0x02,
I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
I2C_MODE_BURST_DATA, 0xFF33, 0x02,
I2C_MODE_BURST_DATA, 0xE830, 0x02,
I2C_MODE_BURST_DATA, 0x0194, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x01FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x02FB, 0x02,
I2C_MODE_BURST_DATA, 0x02B0, 0x02,
I2C_MODE_BURST_DATA, 0x3146, 0x02,
I2C_MODE_BURST_DATA, 0x2846, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0122, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0xD6BA, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7BA, 0x02,
I2C_MODE_BURST_DATA, 0x10B5, 0x02,
I2C_MODE_BURST_DATA, 0xD0E9, 0x02,
I2C_MODE_BURST_DATA, 0x0112, 0x02,
I2C_MODE_BURST_DATA, 0x92F8, 0x02,
I2C_MODE_BURST_DATA, 0x6E46, 0x02,
- I2C_MODE_BURST_DATA, 0xA44A, 0x02,
+ I2C_MODE_BURST_DATA, 0xA24A, 0x02,
I2C_MODE_BURST_DATA, 0x92F8, 0x02,
I2C_MODE_BURST_DATA, 0x6330, 0x02,
I2C_MODE_BURST_DATA, 0x03F0, 0x02,
I2C_MODE_BURST_DATA, 0x0102, 0x02,
I2C_MODE_BURST_DATA, 0x84EA, 0x02,
I2C_MODE_BURST_DATA, 0x4204, 0x02,
- I2C_MODE_BURST_DATA, 0xA14A, 0x02,
+ I2C_MODE_BURST_DATA, 0xA04A, 0x02,
I2C_MODE_BURST_DATA, 0xA2F8, 0x02,
I2C_MODE_BURST_DATA, 0x0643, 0x02,
I2C_MODE_BURST_DATA, 0xCC8A, 0x02,
I2C_MODE_BURST_DATA, 0x10BD, 0x02,
I2C_MODE_BURST_DATA, 0x70B5, 0x02,
I2C_MODE_BURST_DATA, 0x0646, 0x02,
- I2C_MODE_BURST_DATA, 0x8648, 0x02,
+ I2C_MODE_BURST_DATA, 0x8548, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0x0069, 0x02,
I2C_MODE_BURST_DATA, 0x84B2, 0x02,
I2C_MODE_BURST_DATA, 0x2146, 0x02,
I2C_MODE_BURST_DATA, 0x2846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x9DFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x9EFA, 0x02,
I2C_MODE_BURST_DATA, 0x3046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0xC2FA, 0x02,
- I2C_MODE_BURST_DATA, 0x8348, 0x02,
+ I2C_MODE_BURST_DATA, 0xC3FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x8248, 0x02,
I2C_MODE_BURST_DATA, 0x90F8, 0x02,
I2C_MODE_BURST_DATA, 0x7F0E, 0x02,
I2C_MODE_BURST_DATA, 0x88B9, 0x02,
I2C_MODE_BURST_DATA, 0x7040, 0x02,
I2C_MODE_BURST_DATA, 0x0122, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x7DBA, 0x02,
+ I2C_MODE_BURST_DATA, 0x7EBA, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x8046, 0x02,
- I2C_MODE_BURST_DATA, 0x7048, 0x02,
+ I2C_MODE_BURST_DATA, 0x6F48, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0x4169, 0x02,
I2C_MODE_BURST_DATA, 0x0D0C, 0x02,
I2C_MODE_BURST_DATA, 0x3146, 0x02,
I2C_MODE_BURST_DATA, 0x2846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x71FA, 0x02,
- I2C_MODE_BURST_DATA, 0x764C, 0x02,
- I2C_MODE_BURST_DATA, 0x6E4F, 0x02,
+ I2C_MODE_BURST_DATA, 0x72FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x744C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D4F, 0x02,
I2C_MODE_BURST_DATA, 0xE089, 0x02,
I2C_MODE_BURST_DATA, 0xB7F8, 0x02,
I2C_MODE_BURST_DATA, 0xE21A, 0x02,
I2C_MODE_BURST_DATA, 0xE081, 0x02,
I2C_MODE_BURST_DATA, 0x4046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x94FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x95FA, 0x02,
I2C_MODE_BURST_DATA, 0xE089, 0x02,
I2C_MODE_BURST_DATA, 0xB7F8, 0x02,
I2C_MODE_BURST_DATA, 0xE21A, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0122, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x5BBA, 0x02,
+ I2C_MODE_BURST_DATA, 0x5CBA, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF84F, 0x02,
I2C_MODE_BURST_DATA, 0x0646, 0x02,
- I2C_MODE_BURST_DATA, 0x5F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x5E48, 0x02,
I2C_MODE_BURST_DATA, 0x0D46, 0x02,
I2C_MODE_BURST_DATA, 0x8269, 0x02,
I2C_MODE_BURST_DATA, 0x140C, 0x02,
I2C_MODE_BURST_DATA, 0x3946, 0x02,
I2C_MODE_BURST_DATA, 0x2046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x4EFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FFA, 0x02,
I2C_MODE_BURST_DATA, 0x2946, 0x02,
I2C_MODE_BURST_DATA, 0x3046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x7CFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x7DFA, 0x02,
I2C_MODE_BURST_DATA, 0x0122, 0x02,
I2C_MODE_BURST_DATA, 0x3946, 0x02,
I2C_MODE_BURST_DATA, 0x2046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x45FA, 0x02,
- I2C_MODE_BURST_DATA, 0x6149, 0x02,
- I2C_MODE_BURST_DATA, 0x5948, 0x02,
+ I2C_MODE_BURST_DATA, 0x46FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x5F49, 0x02,
+ I2C_MODE_BURST_DATA, 0x5848, 0x02,
I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
I2C_MODE_BURST_DATA, 0x8052, 0x02,
I2C_MODE_BURST_DATA, 0xC97E, 0x02,
I2C_MODE_BURST_DATA, 0x5038, 0x02,
I2C_MODE_BURST_DATA, 0x0029, 0x02,
I2C_MODE_BURST_DATA, 0x7DD0, 0x02,
- I2C_MODE_BURST_DATA, 0x5549, 0x02,
- I2C_MODE_BURST_DATA, 0x5D4B, 0x02,
+ I2C_MODE_BURST_DATA, 0x5349, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C4B, 0x02,
I2C_MODE_BURST_DATA, 0xC468, 0x02,
I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
I2C_MODE_BURST_DATA, 0x4C14, 0x02,
I2C_MODE_BURST_DATA, 0x1B88, 0x02,
I2C_MODE_BURST_DATA, 0xC91A, 0x02,
- I2C_MODE_BURST_DATA, 0x5B4B, 0x02,
+ I2C_MODE_BURST_DATA, 0x5A4B, 0x02,
I2C_MODE_BURST_DATA, 0x01F2, 0x02,
I2C_MODE_BURST_DATA, 0xFF31, 0x02,
I2C_MODE_BURST_DATA, 0x93FB, 0x02,
I2C_MODE_BURST_DATA, 0x1FFA, 0x02,
I2C_MODE_BURST_DATA, 0x80F9, 0x02,
I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
- I2C_MODE_BURST_DATA, 0x1881, 0x02,
+ I2C_MODE_BURST_DATA, 0x1481, 0x02,
I2C_MODE_BURST_DATA, 0x09F1, 0x02,
I2C_MODE_BURST_DATA, 0x0C02, 0x02,
I2C_MODE_BURST_DATA, 0x1446, 0x02,
I2C_MODE_BURST_DATA, 0xA0FB, 0x02,
I2C_MODE_BURST_DATA, 0x0510, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x32FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x33FA, 0x02,
I2C_MODE_BURST_DATA, 0x8AB2, 0x02,
I2C_MODE_BURST_DATA, 0x0092, 0x02,
I2C_MODE_BURST_DATA, 0xB8F8, 0x02,
I2C_MODE_BURST_DATA, 0xA0FB, 0x02,
I2C_MODE_BURST_DATA, 0x0610, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x29FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2AFA, 0x02,
I2C_MODE_BURST_DATA, 0xB8F8, 0x02,
I2C_MODE_BURST_DATA, 0x5A00, 0x02,
I2C_MODE_BURST_DATA, 0x8A46, 0x02,
I2C_MODE_BURST_DATA, 0x0710, 0x02,
I2C_MODE_BURST_DATA, 0x2246, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x21FA, 0x02,
- I2C_MODE_BURST_DATA, 0x374A, 0x02,
+ I2C_MODE_BURST_DATA, 0x22FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x364A, 0x02,
I2C_MODE_BURST_DATA, 0xA2F8, 0x02,
I2C_MODE_BURST_DATA, 0x00B0, 0x02,
I2C_MODE_BURST_DATA, 0xB8F8, 0x02,
I2C_MODE_BURST_DATA, 0x009A, 0x02,
I2C_MODE_BURST_DATA, 0xB2FB, 0x02,
I2C_MODE_BURST_DATA, 0xFBF0, 0x02,
- I2C_MODE_BURST_DATA, 0x334A, 0x02,
+ I2C_MODE_BURST_DATA, 0x324A, 0x02,
I2C_MODE_BURST_DATA, 0x921C, 0x02,
I2C_MODE_BURST_DATA, 0x1080, 0x02,
I2C_MODE_BURST_DATA, 0x921C, 0x02,
I2C_MODE_BURST_DATA, 0xA0FB, 0x02,
I2C_MODE_BURST_DATA, 0x0510, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x06FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x07FA, 0x02,
I2C_MODE_BURST_DATA, 0xB8F8, 0x02,
I2C_MODE_BURST_DATA, 0xAE00, 0x02,
I2C_MODE_BURST_DATA, 0x1FFA, 0x02,
I2C_MODE_BURST_DATA, 0x0610, 0x02,
I2C_MODE_BURST_DATA, 0x2246, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0xFDF9, 0x02,
+ I2C_MODE_BURST_DATA, 0xFEF9, 0x02,
I2C_MODE_BURST_DATA, 0xB8F8, 0x02,
I2C_MODE_BURST_DATA, 0xB200, 0x02,
I2C_MODE_BURST_DATA, 0x0D46, 0x02,
I2C_MODE_BURST_DATA, 0x00E0, 0x02,
I2C_MODE_BURST_DATA, 0x0CE0, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0xF3F9, 0x02,
- I2C_MODE_BURST_DATA, 0x214A, 0x02,
+ I2C_MODE_BURST_DATA, 0xF4F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x204A, 0x02,
I2C_MODE_BURST_DATA, 0xA2F8, 0x02,
I2C_MODE_BURST_DATA, 0x0090, 0x02,
I2C_MODE_BURST_DATA, 0xBAFB, 0x02,
I2C_MODE_BURST_DATA, 0xF88F, 0x02,
I2C_MODE_BURST_DATA, 0x70B5, 0x02,
I2C_MODE_BURST_DATA, 0x0646, 0x02,
- I2C_MODE_BURST_DATA, 0x0A48, 0x02,
+ I2C_MODE_BURST_DATA, 0x0848, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xC169, 0x02,
I2C_MODE_BURST_DATA, 0x0C0C, 0x02,
I2C_MODE_BURST_DATA, 0x2946, 0x02,
I2C_MODE_BURST_DATA, 0x2046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0xA4F9, 0x02,
+ I2C_MODE_BURST_DATA, 0xA5F9, 0x02,
I2C_MODE_BURST_DATA, 0x3046, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0xDDF9, 0x02,
+ I2C_MODE_BURST_DATA, 0xDEF9, 0x02,
I2C_MODE_BURST_DATA, 0x96F8, 0x02,
I2C_MODE_BURST_DATA, 0x1801, 0x02,
- I2C_MODE_BURST_DATA, 0x38B3, 0x02,
- I2C_MODE_BURST_DATA, 0x0448, 0x02,
- I2C_MODE_BURST_DATA, 0xC168, 0x02,
- I2C_MODE_BURST_DATA, 0x0129, 0x02,
- I2C_MODE_BURST_DATA, 0x31D1, 0x02,
- I2C_MODE_BURST_DATA, 0x0349, 0x02,
- I2C_MODE_BURST_DATA, 0x22E0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0B3, 0x02,
+ I2C_MODE_BURST_DATA, 0x23E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB0E, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0xFF10, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF30, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
I2C_MODE_BURST_DATA, 0xB902, 0x02,
I2C_MODE_BURST_DATA, 0x4000, 0x02,
I2C_MODE_BURST_DATA, 0xBB02, 0x02,
- I2C_MODE_BURST_DATA, 0x0CE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9D48, 0x02,
+ I2C_MODE_BURST_DATA, 0xC168, 0x02,
+ I2C_MODE_BURST_DATA, 0x0129, 0x02,
+ I2C_MODE_BURST_DATA, 0x0DD1, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C49, 0x02,
I2C_MODE_BURST_DATA, 0x90F8, 0x02,
I2C_MODE_BURST_DATA, 0x2920, 0x02,
I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF047, 0x02,
I2C_MODE_BURST_DATA, 0x8146, 0x02,
- I2C_MODE_BURST_DATA, 0x8F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x9148, 0x02,
I2C_MODE_BURST_DATA, 0x1546, 0x02,
I2C_MODE_BURST_DATA, 0x8846, 0x02,
I2C_MODE_BURST_DATA, 0x006A, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0x8DF9, 0x02,
I2C_MODE_BURST_DATA, 0x874C, 0x02,
- I2C_MODE_BURST_DATA, 0x884B, 0x02,
+ I2C_MODE_BURST_DATA, 0x894B, 0x02,
I2C_MODE_BURST_DATA, 0x94F8, 0x02,
I2C_MODE_BURST_DATA, 0x680E, 0x02,
I2C_MODE_BURST_DATA, 0x80B1, 0x02,
I2C_MODE_BURST_DATA, 0x187F, 0x02,
I2C_MODE_BURST_DATA, 0x0128, 0x02,
I2C_MODE_BURST_DATA, 0x0DD1, 0x02,
- I2C_MODE_BURST_DATA, 0x8548, 0x02,
+ I2C_MODE_BURST_DATA, 0x8248, 0x02,
I2C_MODE_BURST_DATA, 0x8649, 0x02,
I2C_MODE_BURST_DATA, 0x90F8, 0x02,
I2C_MODE_BURST_DATA, 0x3D20, 0x02,
I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
I2C_MODE_BURST_DATA, 0xF041, 0x02,
I2C_MODE_BURST_DATA, 0x0646, 0x02,
- I2C_MODE_BURST_DATA, 0x6048, 0x02,
+ I2C_MODE_BURST_DATA, 0x6248, 0x02,
I2C_MODE_BURST_DATA, 0x0C46, 0x02,
I2C_MODE_BURST_DATA, 0x426A, 0x02,
I2C_MODE_BURST_DATA, 0x150C, 0x02,
I2C_MODE_BURST_DATA, 0x2846, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xF5F8, 0x02,
- I2C_MODE_BURST_DATA, 0x5D48, 0x02,
+ I2C_MODE_BURST_DATA, 0x5E48, 0x02,
I2C_MODE_BURST_DATA, 0x407F, 0x02,
I2C_MODE_BURST_DATA, 0x0128, 0x02,
I2C_MODE_BURST_DATA, 0x10D1, 0x02,
I2C_MODE_BURST_DATA, 0x7047, 0x02,
I2C_MODE_BURST_DATA, 0x70B5, 0x02,
I2C_MODE_BURST_DATA, 0x0546, 0x02,
- I2C_MODE_BURST_DATA, 0x4548, 0x02,
+ I2C_MODE_BURST_DATA, 0x4748, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xC16A, 0x02,
I2C_MODE_BURST_DATA, 0x0C0C, 0x02,
I2C_MODE_BURST_DATA, 0x10B5, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x5361, 0x02,
+ I2C_MODE_BURST_DATA, 0x6761, 0x02,
I2C_MODE_BURST_DATA, 0x3F48, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0x00F9, 0x02,
- I2C_MODE_BURST_DATA, 0x334C, 0x02,
+ I2C_MODE_BURST_DATA, 0x354C, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0xC151, 0x02,
+ I2C_MODE_BURST_DATA, 0xC351, 0x02,
I2C_MODE_BURST_DATA, 0x2060, 0x02,
I2C_MODE_BURST_DATA, 0x3C48, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xF8F8, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x7D51, 0x02,
+ I2C_MODE_BURST_DATA, 0x7F51, 0x02,
I2C_MODE_BURST_DATA, 0x6060, 0x02,
I2C_MODE_BURST_DATA, 0x3948, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xA1F8, 0x02,
I2C_MODE_BURST_DATA, 0x4000, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x5F51, 0x02,
+ I2C_MODE_BURST_DATA, 0x6151, 0x02,
I2C_MODE_BURST_DATA, 0x3448, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xE0F8, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x2F51, 0x02,
+ I2C_MODE_BURST_DATA, 0x3151, 0x02,
I2C_MODE_BURST_DATA, 0xA060, 0x02,
I2C_MODE_BURST_DATA, 0x3148, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0xB341, 0x02,
+ I2C_MODE_BURST_DATA, 0xB541, 0x02,
I2C_MODE_BURST_DATA, 0xE060, 0x02,
I2C_MODE_BURST_DATA, 0x2F48, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xD2F8, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x6341, 0x02,
+ I2C_MODE_BURST_DATA, 0x6541, 0x02,
I2C_MODE_BURST_DATA, 0x2D48, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xCCF8, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x1941, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B41, 0x02,
I2C_MODE_BURST_DATA, 0x2061, 0x02,
I2C_MODE_BURST_DATA, 0x2A48, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xC5F8, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0xE531, 0x02,
+ I2C_MODE_BURST_DATA, 0xE731, 0x02,
I2C_MODE_BURST_DATA, 0x6061, 0x02,
I2C_MODE_BURST_DATA, 0x2848, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0xBEF8, 0x02,
I2C_MODE_BURST_DATA, 0x0022, 0x02,
I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x9921, 0x02,
+ I2C_MODE_BURST_DATA, 0x9B21, 0x02,
I2C_MODE_BURST_DATA, 0xA061, 0x02,
I2C_MODE_BURST_DATA, 0x2548, 0x02,
I2C_MODE_BURST_DATA, 0x00F0, 0x02,
I2C_MODE_BURST_DATA, 0x10BD, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0xFF10, 0x02,
+ I2C_MODE_BURST_DATA, 0xBE60, 0x02,
I2C_MODE_BURST_DATA, 0x2000, 0x02,
I2C_MODE_BURST_DATA, 0xAA60, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF30, 0x02,
I2C_MODE_BURST_DATA, 0x2001, 0x02,
I2C_MODE_BURST_DATA, 0x2C00, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0xBE60, 0x02,
I2C_MODE_BURST_DATA, 0x4000, 0x02,
I2C_MODE_BURST_DATA, 0x6B9A, 0x02,
I2C_MODE_BURST_DATA, 0x3F66, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
I2C_MODE_BURST_DATA, 0x20C3, 0x02,
I2C_MODE_BURST_DATA, 0x0000, 0x02,
I2C_MODE_BURST_DATA, 0x0080, 0x02,
0xFCFC, 0x2001, 0x02,
0x2C1A, 0xB701, 0x02,
0xFCFC, 0x2000, 0x02,
- 0x8B64, 0x0800, 0x02,
- 0x8BBC, 0x0800, 0x02,
+ 0x8B64, 0x0900, 0x02,
+ 0x8BBC, 0x0900, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
};
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 (NON-Seamless) - 4032 x 2268 @60 MIPI lane: 4, MIPI data rate(Mbps/lane): 2148, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 (Seamless) - 4032 x 2268 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 (Seamless) - 4032 x 1960 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE3 - 3: 3024 x 3024 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 (non-seamless) - 2016 x 1512 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 (non-seamless) - 2016 x 1134 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 (non-seamless) - 1504 x 1504 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 - 4032 x 3024 @24 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 - 4032 x 2268 @24 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 - 4032 x 1960 @24 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 3 - 3024 x 3024 @24 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 4032 x 2268 @60 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 2016 x 1512 @120 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 2016 x 1512 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 2016 x 1134 @240 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 2016 x 1134 @120 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 2016 x 1134 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 1504 x 1504 @120 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 1504 x 1504 @30 MIPI lane: 4, MIPI data rate(Mbps/lane): 1352, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 1008 x 756 @120 MIPI lane: 4, MIPI data rate(Mbps/lane): 2058, MIPI Mclk(Mhz): 26 */
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 Super Slow - 2016 x 1134 @60 MIPI lane: 4, MIPI data rate(Mbps/lane): 2054, MIPI Mclk(Mhz): 26 */
/* 10_30_2_M2_FHD_Slowvideo Preview 60fps 81Àå */
-const u32 sensor_2l3_setfile_B_2016x1134_60fps_mode2_ssm[] = {
+const u32 sensor_2l3_setfile_B_2016x1134_60fps_mode2_ssm_960[] = {
0xFCFC, 0x4000, 0x02,
0x6000, 0x0005, 0x02,
0x6214, 0x79F1, 0x02,
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
/* MODE 2 - 1280 x 720 @60 MIPI lane: 4, MIPI data rate(Mbps/lane): 2058, MIPI Mclk(Mhz): 26 */
/* 16_61_3_M2_HD_Slolwvideo 960fps / 240fps / 60fps */
-const u32 sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm[] = {
+const u32 sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm_960[] = {
0xFCFC, 0x4000, 0x02,
0x6000, 0x0005, 0x02,
0x6214, 0x79F1, 0x02,
0x10B6, 0x0000, 0x02,
0xFCFC, 0x4000, 0x02,
0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
+};
+
+/* MODE 2 - 1280 x 720 @60 MIPI lane: 4, MIPI data rate(Mbps/lane): 2058, MIPI Mclk(Mhz): 26 */
+/* 16_61_6_M2_HD_Slolwvideo 480fps / 240fps / 60fps */
+const u32 sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm_480[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1074, 0x1B64, 0x02,
+ 0x1076, 0x3658, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x303E, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10A2, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30F4, 0x0100, 0x02,
+ 0x30F8, 0x0078, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6700, 0x0001, 0x02,
+ 0x66D0, 0x0101, 0x02,
+ 0x66D0, 0x0101, 0x02,
+ 0x66E0, 0x8000, 0x02,
+ 0x66D2, 0x0100, 0x02,
+ 0x66E4, 0x0100, 0x02,
+ 0x66F0, 0x0102, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0342, 0x047C, 0x02,
+ 0x0340, 0x0E50, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x447C, 0x023E, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0344, 0x03F8, 0x02,
+ 0x0346, 0x0300, 0x02,
+ 0x0348, 0x1BF7, 0x02,
+ 0x034A, 0x08BF, 0x02,
+ 0x034C, 0x0500, 0x02,
+ 0x034E, 0x02D0, 0x02,
+ 0x0BC8, 0x0000, 0x02,
+ 0x0BCA, 0x00F0, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x8A6E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30DE, 0x0000, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0009, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x8A70, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x307E, 0x0701, 0x02,
+ 0x3080, 0x0002, 0x02,
+ 0x30A2, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F64, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3038, 0x0001, 0x02,
+ 0x3066, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10E2, 0x0001, 0x02,
+ 0x5D9C, 0x0001, 0x02,
+ 0x1070, 0x0000, 0x02,
+ 0x1050, 0x1D97, 0x02,
+ 0x1052, 0x1D97, 0x02,
+ 0x1054, 0x20C0, 0x02,
+ 0x1056, 0x20C0, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x9966, 0x0002, 0x02,
+ 0x9948, 0x4000, 0x02,
+ 0x994A, 0x0000, 0x02,
+ 0x9952, 0x0001, 0x02,
+ 0x9950, 0x0100, 0x02,
+ 0x9950, 0x0100, 0x02,
+ 0x9922, 0x011E, 0x02,
+ 0x9080, 0x0000, 0x02,
+ 0x9082, 0x000F, 0x02,
+ 0x907C, 0x0000, 0x02,
+ 0x907E, 0x000F, 0x02,
+ 0x97F8, 0x0000, 0x02,
+ 0x97FA, 0x000F, 0x02,
+ 0x97F4, 0x0000, 0x02,
+ 0x97F6, 0x000F, 0x02,
+ 0x9088, 0x0000, 0x02,
+ 0x908A, 0x0800, 0x02,
+ 0x9090, 0x0000, 0x02,
+ 0x9092, 0x0600, 0x02,
+ 0x90C4, 0x0000, 0x02,
+ 0x90C6, 0x000F, 0x02,
+ 0x90C0, 0x0000, 0x02,
+ 0x90C2, 0x000F, 0x02,
+ 0x9808, 0x0000, 0x02,
+ 0x980A, 0x000F, 0x02,
+ 0x9804, 0x0000, 0x02,
+ 0x9806, 0x000F, 0x02,
+ 0x90CC, 0x0000, 0x02,
+ 0x90CE, 0x0084, 0x02,
+ 0x90D4, 0x0000, 0x02,
+ 0x90D6, 0x0084, 0x02,
+ 0x91F8, 0x0000, 0x02,
+ 0x91FA, 0x0084, 0x02,
+ 0x91FC, 0x0000, 0x02,
+ 0x91FE, 0x0084, 0x02,
+ 0x9814, 0x0084, 0x02,
+ 0x9816, 0x0084, 0x02,
+ 0x90E4, 0x0000, 0x02,
+ 0x90E6, 0x0005, 0x02,
+ 0x90DC, 0x0000, 0x02,
+ 0x90DE, 0x0005, 0x02,
+ 0x920C, 0x0000, 0x02,
+ 0x920E, 0x0005, 0x02,
+ 0x9210, 0x0000, 0x02,
+ 0x9212, 0x0005, 0x02,
+ 0x9204, 0x0000, 0x02,
+ 0x9206, 0x0005, 0x02,
+ 0x9208, 0x0000, 0x02,
+ 0x920A, 0x0005, 0x02,
+ 0x9820, 0x0000, 0x02,
+ 0x9822, 0x0005, 0x02,
+ 0x9818, 0x0000, 0x02,
+ 0x981A, 0x0005, 0x02,
+ 0x90E8, 0x0000, 0x02,
+ 0x90EA, 0x0360, 0x02,
+ 0x9218, 0x0000, 0x02,
+ 0x921A, 0x0360, 0x02,
+ 0x9544, 0x0000, 0x02,
+ 0x9546, 0x0360, 0x02,
+ 0x97E4, 0x0000, 0x02,
+ 0x97E6, 0x0360, 0x02,
+ 0x9824, 0x0000, 0x02,
+ 0x9826, 0x0360, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x8EB0, 0x08C0, 0x02,
+ 0x8EB2, 0x1863, 0x02,
+ 0x8EA8, 0x0000, 0x02,
+ 0x8EAA, 0x0000, 0x02,
+ 0x8B14, 0x0000, 0x02,
+ 0x8B16, 0x0000, 0x02,
+ 0x8B18, 0x0000, 0x02,
+ 0x8B1A, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF628, 0x0800, 0x02,
+ 0xF626, 0x0800, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x60E2, 0x07FF, 0x02,
+ 0x60E4, 0x03FF, 0x02,
+ 0x60E6, 0x03FF, 0x02,
+ 0x60EC, 0x03FF, 0x02,
+ 0x62AE, 0x049E, 0x02,
+ 0x5F26, 0x0100, 0x02,
+ 0x5F26, 0x0100, 0x02,
+ 0x5EC2, 0x0400, 0x02,
+ 0x5EAC, 0x0059, 0x02,
+ 0x5EE2, 0x0038, 0x02,
+ 0x5EE4, 0x0038, 0x02,
+ 0x5EE6, 0x0039, 0x02,
+ 0x5EE8, 0x0039, 0x02,
+ 0x5DFA, 0x0804, 0x02,
+ 0x5E02, 0x0808, 0x02,
+ 0x5E0C, 0x0804, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF47C, 0x0005, 0x02,
+ 0xF47E, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x5E30, 0x0101, 0x02,
+ 0x5E38, 0x0701, 0x02,
+ 0x5E54, 0x0301, 0x02,
+ 0x5E5C, 0x0403, 0x02,
+ 0x5E42, 0x0E05, 0x02,
+ 0x5E4A, 0x0710, 0x02,
+ 0x5DD2, 0x0001, 0x02,
+ 0x5DDE, 0x0001, 0x02,
+ 0x1D90, 0x003E, 0x02,
+ 0x1E56, 0x0006, 0x02,
+ 0x1E68, 0x0005, 0x02,
+ 0x1EC2, 0x005A, 0x02,
+ 0x1ED4, 0x0055, 0x02,
+ 0x2A14, 0x0028, 0x02,
+ 0x2A26, 0x00D5, 0x02,
+ 0x1E32, 0x0000, 0x02,
+ 0x281C, 0x0115, 0x02,
+ 0x282E, 0x0113, 0x02,
+ 0x2840, 0x010B, 0x02,
+ 0x2852, 0x0109, 0x02,
+ 0x2864, 0x0101, 0x02,
+ 0x2876, 0x00FF, 0x02,
+ 0x2888, 0x00F7, 0x02,
+ 0x289A, 0x00F5, 0x02,
+ 0x28AC, 0x00ED, 0x02,
+ 0x28BE, 0x00EB, 0x02,
+ 0x28D0, 0x00E3, 0x02,
+ 0x28E2, 0x00E1, 0x02,
+ 0x6730, 0x0102, 0x02,
+ 0x6736, 0x0003, 0x02,
+ 0x1C50, 0x0120, 0x02,
+ 0x6748, 0x1FFF, 0x02,
+ 0x5D8E, 0x0006, 0x02,
+ 0x222C, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF488, 0x0004, 0x02,
+ 0xF48A, 0x0004, 0x02,
+ 0xF480, 0x0004, 0x02,
+ 0xF482, 0x0004, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x70B4, 0x001C, 0x02,
+ 0x70B6, 0x0015, 0x02,
+ 0x70B8, 0x001B, 0x02,
+ 0x70BA, 0x001A, 0x02,
+ 0x70BC, 0x001C, 0x02,
+ 0x70BE, 0x0015, 0x02,
+ 0x70C0, 0x001B, 0x02,
+ 0x70C2, 0x001A, 0x02,
+ 0x7406, 0x0000, 0x02,
+ 0x7CCE, 0x0000, 0x02,
+ 0x7462, 0x0000, 0x02,
+ 0x7D2A, 0x0000, 0x02,
+ 0x7494, 0x0000, 0x02,
+ 0x7D5C, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF46E, 0x001A, 0x02,
+ 0xF470, 0x0027, 0x02,
+ 0xF600, 0x0001, 0x02,
+ 0xF602, 0x0001, 0x02,
+ 0xF60E, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F80, 0x0000, 0x02,
+ 0x0F8E, 0xF46E, 0x02,
+ 0x0F92, 0x0012, 0x02,
+ 0x0F94, 0xF470, 0x02,
+ 0x6AF2, 0x0000, 0x02,
+ 0x2234, 0x000E, 0x02,
+ 0x2246, 0x002F, 0x02,
+ 0x1C4C, 0xFFFF, 0x02,
+ 0x1C2E, 0x0001, 0x02,
+ 0x5EA8, 0xFFFB, 0x02,
+ 0x10A6, 0x0050, 0x02,
+ 0x1D12, 0x001F, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF52A, 0x0018, 0x02,
+ 0xF49A, 0x0000, 0x02,
+ 0xF492, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x5F1A, 0xA962, 0x02,
+ 0x5F1E, 0x4050, 0x02,
+ 0x4482, 0x0206, 0x02,
+ 0x2222, 0x000C, 0x02,
+ 0x3782, 0xFFFB, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x2C00, 0x0100, 0x02,
+ 0x2C02, 0x0001, 0x02,
+ 0x2C04, 0x0026, 0x02,
+ 0x2C06, 0x1100, 0x02,
+ 0x2C08, 0x0F00, 0x02,
+ 0x2C0A, 0x0100, 0x02,
+ 0x2C0C, 0x0100, 0x02,
+ 0x2C0E, 0x00C0, 0x02,
+ 0x2C10, 0x0060, 0x02,
+ 0x2C12, 0x0A0A, 0x02,
+ 0x2C14, 0x0A02, 0x02,
+ 0x2C16, 0xFFFF, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0101, 0x02,
+ 0x0A58, 0x0180, 0x02,
+ 0x0A5A, 0x0020, 0x02,
+ 0x0A5C, 0x0000, 0x02,
+ 0x0A5E, 0x3940, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x0A54, 0x0008, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x30C6, 0x0001, 0x02,
+ 0x0A60, 0x00BC, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x9860, 0x0000, 0x02,
+ 0x9862, 0x0700, 0x02,
+ 0x9864, 0x0000, 0x02,
+ 0x9866, 0x0700, 0x02,
+ 0x9868, 0x0000, 0x02,
+ 0x986A, 0x0700, 0x02,
+ 0x986C, 0x0000, 0x02,
+ 0x986E, 0x0700, 0x02,
+ 0x9870, 0x000A, 0x02,
+ 0x9872, 0xA000, 0x02,
+ 0x9874, 0x000A, 0x02,
+ 0x9876, 0xA000, 0x02,
+ 0x9878, 0x000A, 0x02,
+ 0x987A, 0xA000, 0x02,
+ 0x987C, 0x000A, 0x02,
+ 0x987E, 0xA000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30DA, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x998E, 0x0000, 0x02,
+ 0x9990, 0x0000, 0x02,
+ 0x99C2, 0x0000, 0x02,
+ 0x99C4, 0x0000, 0x02,
+ 0x9A18, 0x0000, 0x02,
+ 0x9A1A, 0x0000, 0x02,
+ 0x6738, 0x0000, 0x02,
+ 0x6794, 0x0028, 0x02,
+ 0x6796, 0x03C0, 0x02,
+ 0x6798, 0x00C8, 0x02,
+ 0x678C, 0x0000, 0x02,
+ 0x678E, 0x04E1, 0x02,
+ 0x10E2, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10EC, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xF464, 0x0006, 0x02,
+ 0xF466, 0x0008, 0x02,
+ 0xF49C, 0x0001, 0x02,
+ 0xF496, 0x0034, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x2C18, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E4, 0x0000, 0x02,
+ 0x30E6, 0x0000, 0x02,
+ 0x30E8, 0x0000, 0x02,
+ 0x30EA, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x8D82, 0x0020, 0x02,
+ 0x8D90, 0x0014, 0x02,
+ 0x9FA4, 0x0000, 0x02,
+ 0x9E94, 0x0000, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x2C1C, 0x0000, 0x02,
+ 0x2C1E, 0x0000, 0x02,
+ 0x2C20, 0x0000, 0x02,
+ 0x2C22, 0x0000, 0x02,
+ 0x2C24, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x991A, 0x0000, 0x02,
+ 0x10E4, 0x0001, 0x02,
+ 0x994C, 0x0000, 0x02,
+ 0x1C2A, 0x0118, 0x02,
+ 0x10B4, 0x0000, 0x02,
+ 0x10B6, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
const u32 sensor_2l3_setfile_B_dram_test_Global[] = {
0x0340, 0x31D8, 0x02,
0x30E4, 0x0054, 0x02,
0x30E6, 0x0500, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
const u32 sensor_2l3_setfile_B_4032x2268_30fps_load_sram[] = {
0x0340, 0x2640, 0x02,
0x30E4, 0x0054, 0x02,
0x30E6, 0x0500, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
const u32 sensor_2l3_setfile_B_4032x3024_24fps_load_sram[] = {
0x0340, 0x3E4E, 0x02,
0x30E4, 0x0075, 0x02,
0x30E6, 0xA500, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
const u32 sensor_2l3_setfile_B_4032x2268_24fps_load_sram[] = {
0x0340, 0x2FD0, 0x02,
0x30E4, 0x0075, 0x02,
0x30E6, 0xA500, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
const u32 sensor_2l3_setfile_B_4032x2268_60fps_load_sram[] = {
0x6F12, 0x2001, 0x02,
0x6F12, 0x2D00, 0x02,
0x0340, 0x099E, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
const u32 sensor_2l3_setfile_B_1008x756_120fps_load_sram[] = {
0x6F12, 0x2001, 0x02,
0x6F12, 0x3300, 0x02,
0x0340, 0x0F30, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xA950, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x6300, 0x02,
};
#endif
0x0870, /* line_length_pck */
};
-const struct sensor_pll_info_compact sensor_2l3_pllinfo_B_2016x1134_60fps_mode2_ssm = {
+const struct sensor_pll_info_compact sensor_2l3_pllinfo_B_2016x1134_60fps_mode2_ssm_960 = {
EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
2054000000, /* mipi_datarate */
1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
0x0330, /* line_length_pck */
};
-const struct sensor_pll_info_compact sensor_2l3_pllinfo_B_1280x720_60fps_mode2_ssm = {
+const struct sensor_pll_info_compact sensor_2l3_pllinfo_B_1280x720_60fps_mode2_ssm_960 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1010668000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3940, /* frame_length_lines */
+ 0x047C, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l3_pllinfo_B_1280x720_60fps_mode2_ssm_480 = {
EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
2054000000, /* mipi_datarate */
1010668000, /* pclk = VT pix CLK * 4(this value is different by cis) */
sensor_2l3_setfile_B_1504x1504_120fps_mode2,
sensor_2l3_setfile_B_1504x1504_30fps_mode2,
sensor_2l3_setfile_B_1008x756_120fps_mode2,
- sensor_2l3_setfile_B_2016x1134_60fps_mode2_ssm,
- sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm,
+ sensor_2l3_setfile_B_2016x1134_60fps_mode2_ssm_960,
+ sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm_960,
+ sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm_480,
sensor_2l3_setfile_B_4032x3024_30fps_mode2_dram_test_section1,
sensor_2l3_setfile_B_4032x3024_30fps_mode2_dram_test_section2,
};
ARRAY_SIZE(sensor_2l3_setfile_B_1504x1504_120fps_mode2),
ARRAY_SIZE(sensor_2l3_setfile_B_1504x1504_30fps_mode2),
ARRAY_SIZE(sensor_2l3_setfile_B_1008x756_120fps_mode2),
- ARRAY_SIZE(sensor_2l3_setfile_B_2016x1134_60fps_mode2_ssm),
- ARRAY_SIZE(sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm),
+ ARRAY_SIZE(sensor_2l3_setfile_B_2016x1134_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm_480),
ARRAY_SIZE(sensor_2l3_setfile_B_4032x3024_30fps_mode2_dram_test_section1),
ARRAY_SIZE(sensor_2l3_setfile_B_4032x3024_30fps_mode2_dram_test_section2),
};
&sensor_2l3_pllinfo_B_1504x1504_120fps_mode2,
&sensor_2l3_pllinfo_B_1504x1504_30fps_mode2,
&sensor_2l3_pllinfo_B_1008x756_120fps_mode2,
- &sensor_2l3_pllinfo_B_2016x1134_60fps_mode2_ssm,
- &sensor_2l3_pllinfo_B_1280x720_60fps_mode2_ssm,
+ &sensor_2l3_pllinfo_B_2016x1134_60fps_mode2_ssm_960,
+ &sensor_2l3_pllinfo_B_1280x720_60fps_mode2_ssm_960,
+ &sensor_2l3_pllinfo_B_1280x720_60fps_mode2_ssm_480,
&sensor_2l3_pllinfo_B_4032x3024_30fps_mode2_aeb_factory,
&sensor_2l3_pllinfo_B_4032x3024_30fps_mode2_aeb_factory_stage2,
};
case SENSOR_2L3_2016X1134_30FPS_MODE2:
case SENSOR_2L3_1504X1504_120FPS_MODE2:
case SENSOR_2L3_1504X1504_30FPS_MODE2:
- case SENSOR_2L3_2016X1134_60FPS_MODE2_SSM:
- case SENSOR_2L3_1280X720_60FPS_MODE2_SSM:
+ case SENSOR_2L3_2016X1134_60FPS_MODE2_SSM_960:
+ case SENSOR_2L3_1280X720_60FPS_MODE2_SSM_960:
+ case SENSOR_2L3_1280X720_60FPS_MODE2_SSM_480:
case SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1:
case SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2:
cis_data->max_margin_coarse_integration_time = SENSOR_2L3_COARSE_INTEGRATION_TIME_MAX_MARGIN;
void sensor_2l3_cis_data_calc(struct v4l2_subdev *subdev, u32 mode)
{
- int ret = 0;
struct fimc_is_cis *cis = NULL;
WARN_ON(!subdev);
return;
}
+#if 0
/* If check_rev fail when cis_init, one more check_rev in mode_change */
if (cis->rev_flag == true) {
cis->rev_flag = false;
return;
}
}
+#endif
if (cis->cis_data->stream_on) {
info("[%s] call mode change in stream on state\n", __func__);
u8 rev = 0;
struct i2c_client *client;
struct fimc_is_cis *cis = NULL;
- struct fimc_is_module_enum *module;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct sensor_open_extended *ext_info;
WARN_ON(!subdev);
return ret;
}
- sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
- module = sensor_peri->module;
- ext_info = &module->ext;
- WARN_ON(!ext_info);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
I2C_MUTEX_LOCK(cis->i2c_lock);
+
ret = fimc_is_sensor_read8(client, 0x0002, &rev);
if (ret < 0) {
- err("fimc_is_sensor_read8 fail, (ret %d)", ret);
- goto p_err;
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Default version 2l3 sensor. Rev. 0x%X\n", __func__, rev);
}
- cis->cis_data->cis_rev = rev;
- pr_info("%s : Default version 2l3 sensor. Rev. 0x%X\n", __func__, rev);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l3_cis_select_setfile(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ rev = cis->cis_data->cis_rev;
switch (rev) {
case 0xA0:
break;
}
-p_err:
- I2C_MUTEX_UNLOCK(cis->i2c_lock);
return ret;
}
struct fimc_is_cis *cis;
u32 setfile_index = 0;
cis_setting_info setinfo;
- int retry_cnt = 3;
setinfo.param = NULL;
setinfo.return_value = 0;
}
WARN_ON(!cis->cis_data);
- memset(cis->cis_data, 0, sizeof(cis_shared_data));
- cis->rev_flag = false;
-retry:
- ret = sensor_2l3_cis_check_rev(subdev);
- if (ret < 0) {
- if (retry_cnt-- > 0) {
- err("sensor_2l3_check_rev is fail. retry %d", retry_cnt);
- usleep_range(10000, 10000);
- goto retry;
- } else {
- warn("sensor_2l3_check_rev is fail when cis init, ret(%d)", ret);
- cis->rev_flag = true;
- goto p_err;
- }
- }
+ sensor_2l3_cis_select_setfile(subdev);
need_cancel_retention_mode = false;
case SENSOR_2L3_2016X1134_120FPS_MODE2:
case SENSOR_2L3_1504X1504_120FPS_MODE2:
case SENSOR_2L3_1008X756_120FPS_MODE2:
- case SENSOR_2L3_2016X1134_60FPS_MODE2_SSM:
- case SENSOR_2L3_1280X720_60FPS_MODE2_SSM:
+ case SENSOR_2L3_2016X1134_60FPS_MODE2_SSM_960:
+ case SENSOR_2L3_1280X720_60FPS_MODE2_SSM_960:
+ case SENSOR_2L3_1280X720_60FPS_MODE2_SSM_480:
break;
default:
/* Sensor stream on */
ext_info = &module->ext;
WARN_ON(!ext_info);
+#if 0
/* If check_rev fail when cis_init, one more check_rev in mode_change */
if (cis->rev_flag == true) {
cis->rev_flag = false;
goto p_err;
}
}
+#endif
#if 0 /* cis_data_calculation is called in module_s_format */
sensor_2l3_cis_data_calculation(sensor_2l3_pllinfos[mode], cis->cis_data);
int ret = 0;
struct fimc_is_cis *cis = NULL;
unsigned int mode = 0;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info = NULL;
WARN_ON(!subdev);
WARN_ON(!cis);
WARN_ON(!cis->cis_data);
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+ WARN_ON(!ext_info);
+
mode = cis->cis_data->sens_config_index_cur;
if (!sensor_2l3_cis_get_lownoise_supported(cis->cis_data)) {
dbg_common(i2c_log_enable, "%s : i2c_write", " (0x30E6, 0x0500)\n", __func__);
#endif
break;
+ case FIMC_IS_CIS_LN2_PEDESTAL128:
+ dbg_sensor(1, "[%s] FIMC_IS_CIS_LN2_PEDESTAL128\n", __func__);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0B30, 0x0200);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0BC0, 0x0080); /* pedestal 128 */
+
+#ifdef CAMERA_REAR2
+ ret |= fimc_is_sensor_write16(cis->client, 0x30E4, 0x0000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30E6, 0x0500);
+#endif
+ ext_info->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+ break;
+ case FIMC_IS_CIS_LN4_PEDESTAL128:
+ dbg_sensor(1, "[%s] FIMC_IS_CIS_LN4_PEDESTAL128\n", __func__);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0B30, 0x0300);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0BC0, 0x0080); /* pedestal 128 */
+
+#ifdef CAMERA_REAR2
+ ret |= fimc_is_sensor_write16(cis->client, 0x30E4, 0x0000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30E6, 0x0500);
+#endif
+ ext_info->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+ break;
default:
dbg_sensor(1, "[%s] not support lownoise mode(%d)\n",
__func__, cis->cis_data->cur_lownoise_mode);
{
int ret = 0;
struct fimc_is_cis *cis = NULL;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info = NULL;
WARN_ON(!subdev);
WARN_ON(!cis);
WARN_ON(!cis->cis_data);
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+ WARN_ON(!ext_info);
+
switch (command) {
case FRS_SSM_START:
pr_info("[%s] SUPER_SLOW_MOTION_START\n", __func__);
ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0000); /* before_q_frames = 0 */
dbg_common(i2c_log_enable, "%s : i2c_write", " (0x0A5A, 0x0000)\n", __func__);
break;
+ case FRS_SSM_MODE_FACTORY_TEST:
+ pr_info("[%s] SUPER_SLOW_MOTION_MODE_FACTORY_TEST\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A50, 0x01); /* Enable Manual Q Only */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A58, 0x0000); /* q_mask_frames */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0010); /* before_q_frames = 16 */
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A52, 0x01); /* start_user_record */
+ ret |= fimc_is_sensor_write16(cis->client, 0xF408, 0x0009); /* test */
+ ret |= fimc_is_sensor_write16(cis->client, 0xF404, 0xFFF3); /* test */
+
+ ext_info->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+ break;
case FRS_DRAM_TEST_SECTION2:
if (sensor_2l3_max_setfile_num > SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2) {
/* stream off > set dram stage2 > stream on*/
return ret;
}
+int sensor_2l3_cis_set_super_slow_motion_threshold(struct v4l2_subdev *subdev, u32 threshold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ u8 final_threshold = (u8)threshold;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ ret |= fimc_is_sensor_write16(cis->client, 0x6028, 0x2001);
+ ret |= fimc_is_sensor_write16(cis->client, 0x602A, 0x2CC0);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6F12, final_threshold);
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ if (ret < 0) {
+ pr_err("ERR[%s]: super slow roi setting fail\n", __func__);
+ }
+
+ pr_info("[%s] : super slow threshold(%d)\n", __func__, threshold);
+
+ return ret;
+}
+
+int sensor_2l3_cis_get_super_slow_motion_threshold(struct v4l2_subdev *subdev, u32 *threshold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ u8 final_threshold = 0;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ ret |= fimc_is_sensor_write16(cis->client, 0x602C, 0x2000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x602E, 0xFF75);
+ ret |= fimc_is_sensor_read8(cis->client, 0x6F12, &final_threshold);
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ if (ret < 0) {
+ pr_err("ERR[%s]: super slow roi setting fail\n", __func__);
+ *threshold = 0;
+ return ret;
+ }
+
+ *threshold = final_threshold;
+
+ pr_info("[%s] : super slow threshold(%d)\n", __func__, *threshold);
+
+ return ret;
+}
+
static struct fimc_is_cis_ops cis_ops_2l3 = {
.cis_init = sensor_2l3_cis_init,
.cis_log_status = sensor_2l3_cis_log_status,
.cis_set_long_term_exposure = sensor_2l3_cis_long_term_exposure,
.cis_set_frs_control = sensor_2l3_cis_set_frs_control,
.cis_set_super_slow_motion_roi = sensor_2l3_cis_set_super_slow_motion_roi,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_2l3_cis_check_rev,
+ .cis_set_super_slow_motion_threshold = sensor_2l3_cis_set_super_slow_motion_threshold,
+ .cis_get_super_slow_motion_threshold = sensor_2l3_cis_get_super_slow_motion_threshold,
};
static int cis_2l3_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
ret = of_property_read_string(dnode, "setfile", &setfile);
if (ret) {
err("setfile index read fail(%d), take default setfile!!", ret);
SENSOR_2L3_1504X1504_30FPS_MODE2 = 19,
SENSOR_2L3_1008X756_120FPS_MODE2 = 20,
/* MODE 2 SSM */
- SENSOR_2L3_2016X1134_60FPS_MODE2_SSM = 21,
- SENSOR_2L3_1280X720_60FPS_MODE2_SSM = 22,
+ SENSOR_2L3_2016X1134_60FPS_MODE2_SSM_960 = 21,
+ SENSOR_2L3_1280X720_60FPS_MODE2_SSM_960 = 22,
+ SENSOR_2L3_1280X720_60FPS_MODE2_SSM_480 = 23,
/* MODE 2 DRAM TEST */
- SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1 = 23,
- SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2 = 24,
+ SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1 = 24,
+ SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2 = 25,
SENSOR_2L3_MODE_MAX,
};
false, //SENSOR_2L3_1504X1504_30FPS_MODE2 = 19,
false, //SENSOR_2L3_1008X756_120FPS_MODE2 = 20,
/* MODE 2 SSM */
- false, //SENSOR_2L3_2016X1134_60FPS_MODE2_SSM = 21,
- false, //SENSOR_2L3_1280X720_60FPS_MODE2_SSM = 22,
+ false, //SENSOR_2L3_2016X1134_60FPS_MODE2_SSM_960 = 21,
+ false, //SENSOR_2L3_1280X720_60FPS_MODE2_SSM_960 = 22,
+ false, //SENSOR_2L3_1280X720_60FPS_MODE2_SSM_480 = 23,
/* MODE 2 DRAM TEST */
- false, //SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1 = 23,
- false, //SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2 = 24,
+ false, //SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1 = 24,
+ false, //SENSOR_2L3_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2 = 25,
};
enum sensor_2l3_load_sram_mode {
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_2L4_SET_A_H
+#define FIMC_IS_CIS_2L4_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-2l4.h"
+
+/* SAK2L4SX_EVT0.0_Ver_0.0_20180604_2stack_System_bring-up */
+
+/* Reset + TnP */
+const u32 sensor_2l4_setfile_A_Reset_TnP[] = {};
+
+/* Global */
+const u32 sensor_2l4_setfile_A_Global[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0xA9F4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x64FE, 0x0000, 0x02,
+ 0x6010, 0x0001, 0x02,
+ I2C_MODE_DELAY, 5000, 0x00,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0x109C, 0x0000, 0x02,
+ 0x1D22, 0x0658, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0400, 0x0004, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xAC52, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0832, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1018, 0x0901, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xD7DE, 0x0101, 0x02,
+ 0xD7E0, 0x0101, 0x02,
+ 0xD7E2, 0x0100, 0x02,
+ 0xB664, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0x3014, 0x0101, 0x02,
+ 0x3016, 0x0000, 0x02,
+ 0x3018, 0x0000, 0x02,
+ 0x301A, 0x0001, 0x02,
+ 0x301C, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1AC4, 0x0000, 0x02,
+ 0x1AC6, 0x0000, 0x02,
+ 0x10AC, 0x0001, 0x02,
+ 0x10B4, 0x0000, 0x02,
+ 0x10DE, 0x0000, 0x02,
+ 0x10E6, 0x0202, 0x02,
+ 0x1122, 0x0000, 0x02,
+ 0x1134, 0x0000, 0x02,
+ 0x1136, 0x0000, 0x02,
+ 0x114E, 0x0004, 0x02,
+ 0x115A, 0x0000, 0x02,
+ 0x10AE, 0x0203, 0x02,
+ 0x10B4, 0x0000, 0x02,
+ 0x10E0, 0x0000, 0x02,
+ 0x10E6, 0x0202, 0x02,
+ 0x1124, 0x0000, 0x02,
+ 0x1138, 0x0000, 0x02,
+ 0x113A, 0x0000, 0x02,
+ 0x1150, 0x0004, 0x02,
+ 0x115C, 0x0103, 0x02,
+ 0x10B0, 0x0401, 0x02,
+ 0x10B6, 0x0000, 0x02,
+ 0x10E2, 0x0000, 0x02,
+ 0x10E8, 0x0202, 0x02,
+ 0x1128, 0x0000, 0x02,
+ 0x1140, 0x0000, 0x02,
+ 0x1142, 0x0000, 0x02,
+ 0x1154, 0x0004, 0x02,
+ 0x115E, 0x0201, 0x02,
+ 0xB062, 0x06F9, 0x02,
+ 0xB064, 0x0530, 0x02,
+ 0xB066, 0x076C, 0x02,
+ 0xB06C, 0x06A0, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0xAE24, 0x0400, 0x02,
+ 0xAE0C, 0x03FA, 0x02,
+ 0xAD9C, 0x0709, 0x02,
+ 0xADAC, 0x0709, 0x02,
+ 0xAE7C, 0x8562, 0x02,
+ 0xAE7E, 0x0380, 0x02,
+ 0xAE80, 0x4050, 0x02,
+ 0xAC7A, 0x0504, 0x02,
+ 0xAC8A, 0x0504, 0x02,
+ 0xAC9A, 0x0504, 0x02,
+ 0xAD68, 0x0002, 0x02,
+ 0xAD6A, 0x1848, 0x02,
+ 0xAD3E, 0x0042, 0x02,
+ 0xAE1A, 0x0012, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF44A, 0x000A, 0x02,
+ 0xF44C, 0x000A, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE16, 0x0018, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF450, 0x0018, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x3CEA, 0xFF86, 0x02,
+ 0x10EE, 0x00D8, 0x02,
+ 0xADA0, 0x0709, 0x02,
+ 0xADB0, 0x0709, 0x02,
+ 0xAC7E, 0x0504, 0x02,
+ 0xAC8E, 0x0504, 0x02,
+ 0xAC9E, 0x0504, 0x02,
+ 0xAD78, 0x0002, 0x02,
+ 0xAD7A, 0x1848, 0x02,
+ 0xAD46, 0x0042, 0x02,
+ 0x3CF2, 0xFEF8, 0x02,
+ 0x3D12, 0x0226, 0x02,
+ 0x2BD2, 0x0007, 0x02,
+ 0x3A72, 0x0021, 0x02,
+ 0x3A92, 0x001F, 0x02,
+ 0x3AB2, 0x0015, 0x02,
+ 0x3AD2, 0x0013, 0x02,
+ 0x3AF2, 0x0009, 0x02,
+ 0x3B92, 0x0025, 0x02,
+ 0x3BB2, 0x0023, 0x02,
+ 0x3BD2, 0x0019, 0x02,
+ 0x3BF2, 0x0017, 0x02,
+ 0x3C12, 0x000D, 0x02,
+ 0x3C32, 0x000B, 0x02,
+ 0x3C52, 0x0001, 0x02,
+ 0x3C72, 0xFFFF, 0x02,
+ 0x3C92, 0xFFF5, 0x02,
+ 0x10F0, 0x0140, 0x02,
+ 0xADA4, 0x0709, 0x02,
+ 0xADB4, 0x0709, 0x02,
+ 0xAC82, 0x0504, 0x02,
+ 0xAC92, 0x0504, 0x02,
+ 0xACA2, 0x0504, 0x02,
+ 0xAD88, 0x0002, 0x02,
+ 0xAD8A, 0x1848, 0x02,
+ 0xAD4E, 0x0042, 0x02,
+ 0x3CFA, 0xFE40, 0x02,
+ 0x3D1A, 0x04B0, 0x02,
+ 0x217A, 0x0008, 0x02,
+ 0x2BDA, 0x0007, 0x02,
+ 0x3A7A, 0x0021, 0x02,
+ 0x3A9A, 0x001F, 0x02,
+ 0x3ABA, 0x0015, 0x02,
+ 0x3ADA, 0x0013, 0x02,
+ 0x3AFA, 0x0009, 0x02,
+ 0x3B9A, 0x0025, 0x02,
+ 0x3BBA, 0x0023, 0x02,
+ 0x3BDA, 0x0019, 0x02,
+ 0x3BFA, 0x0017, 0x02,
+ 0x3C1A, 0x000D, 0x02,
+ 0x3C3A, 0x000B, 0x02,
+ 0x3C5A, 0x0001, 0x02,
+ 0x3C7A, 0xFFFF, 0x02,
+ 0x3C9A, 0xFFF5, 0x02,
+ 0x10F4, 0x0226, 0x02,
+ 0xADB8, 0x0606, 0x02,
+ 0xADC8, 0x0606, 0x02,
+ 0xAD98, 0x0707, 0x02,
+ 0xADA8, 0x0707, 0x02,
+ 0xAC76, 0x0A0A, 0x02,
+ 0xAC86, 0x0A0A, 0x02,
+ 0xAC96, 0x0A0A, 0x02,
+ 0xAD36, 0x0042, 0x02,
+ 0x3CE2, 0xFF66, 0x02,
+ 0xAC5E, 0x00F0, 0x02,
+ 0xADB8, 0x0606, 0x02,
+ 0xADC8, 0x0606, 0x02,
+ 0xAD98, 0x0707, 0x02,
+ 0xADA8, 0x0707, 0x02,
+ 0xAC76, 0x0A0A, 0x02,
+ 0xAC86, 0x0A0A, 0x02,
+ 0xAC96, 0x0A0A, 0x02,
+ 0xAD38, 0x0042, 0x02,
+ 0x1EC4, 0x0006, 0x02,
+ 0x1EE4, 0x0028, 0x02,
+ 0x1F04, 0x0028, 0x02,
+ 0x1F24, 0x0028, 0x02,
+ 0x1F44, 0x0028, 0x02,
+ 0x2104, 0xFFD8, 0x02,
+ 0x2124, 0xFFD8, 0x02,
+ 0x2164, 0x0036, 0x02,
+ 0x2184, 0x0030, 0x02,
+ 0x2204, 0x00C1, 0x02,
+ 0x2224, 0x00BB, 0x02,
+ 0x28C4, 0x0004, 0x02,
+ 0x28E4, 0x0011, 0x02,
+ 0x2904, 0x0032, 0x02,
+ 0x2A84, 0x0008, 0x02,
+ 0x2AA4, 0x0006, 0x02,
+ 0x2D44, 0x0002, 0x02,
+ 0x2D64, 0x0006, 0x02,
+ 0x2DA4, 0x003B, 0x02,
+ 0x2DC4, 0x002B, 0x02,
+ 0x2DE4, 0x0043, 0x02,
+ 0x2E04, 0x0033, 0x02,
+ 0x2E24, 0x0043, 0x02,
+ 0x2E44, 0x0014, 0x02,
+ 0x2E64, 0x0007, 0x02,
+ 0x2F64, 0x0007, 0x02,
+ 0x3144, 0x0007, 0x02,
+ 0x3164, 0x0004, 0x02,
+ 0x3244, 0x0007, 0x02,
+ 0x3264, 0x0004, 0x02,
+ 0x3464, 0x0007, 0x02,
+ 0x34A4, 0x0006, 0x02,
+ 0x3764, 0x0006, 0x02,
+ 0x37E4, 0x0007, 0x02,
+ 0x3844, 0x0020, 0x02,
+ 0x3CA4, 0x0007, 0x02,
+ 0x3CE4, 0xFF9C, 0x02,
+ 0x3D24, 0x0002, 0x02,
+ 0x3D44, 0x0013, 0x02,
+ 0x3DA4, 0x0040, 0x02,
+ 0x3DC4, 0x0040, 0x02,
+ 0x3DE4, 0x00A0, 0x02,
+ 0x3E04, 0x00A0, 0x02,
+ 0x3E24, 0x00A0, 0x02,
+ 0x3E44, 0x00A0, 0x02,
+ 0x5764, 0x0010, 0x02,
+ 0x57C4, 0x0009, 0x02,
+ 0x57E4, 0x000B, 0x02,
+ 0x5804, 0x0007, 0x02,
+ 0xADBA, 0x0206, 0x02,
+ 0xADCA, 0x0206, 0x02,
+ 0xAD9A, 0x0907, 0x02,
+ 0xADAA, 0x0907, 0x02,
+ 0xAC78, 0x080A, 0x02,
+ 0xAC88, 0x080A, 0x02,
+ 0xAC98, 0x080A, 0x02,
+ 0xAD3C, 0x0042, 0x02,
+ 0x1162, 0xFCFC, 0x02,
+ 0x1164, 0x1050, 0x02,
+ 0x128E, 0x2000, 0x02,
+ 0x1290, 0x1770, 0x02,
+ 0x13BA, 0x2000, 0x02,
+ 0x13BC, 0x0000, 0x02,
+ 0x14E6, 0x2000, 0x02,
+ 0x14E8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_A_4032x3024_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x2C80, 0x02,
+ 0x0340, 0x0C58, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0x1D26, 0x0BE0, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x0BD0, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0005, 0x02,
+ 0x040A, 0x0007, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0FC0, 0x02,
+ 0xD7DA, 0x0BD0, 0x02,
+ 0xD7D4, 0x0004, 0x02,
+ 0xD7D8, 0x0007, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0xDD10, 0x0100, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0xB6B0, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD14, 0x3F80, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0000, 0x02,
+ 0x0316, 0x0000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0101, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10BA, 0x0100, 0x02,
+ 0x10D2, 0x2C80, 0x02,
+ 0x10FA, 0x0101, 0x02,
+ 0x1108, 0x3F80, 0x02,
+ 0x110A, 0x0000, 0x02,
+ 0x10BC, 0x0001, 0x02,
+ 0x10D4, 0x2C80, 0x02,
+ 0x10FC, 0x0100, 0x02,
+ 0x110C, 0x3F80, 0x02,
+ 0x110E, 0x0000, 0x02,
+ 0x10BE, 0x0001, 0x02,
+ 0x10D8, 0x2C80, 0x02,
+ 0x10FE, 0x0100, 0x02,
+ 0x1114, 0x3F80, 0x02,
+ 0x1116, 0x0000, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0xAC54, 0x0400, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_A_4032x2268_60fps[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x2C80, 0x02,
+ 0x0340, 0x0C58, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0x1D26, 0x0BE0, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0160, 0x02,
+ 0x034A, 0x0A57, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x08DC, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0005, 0x02,
+ 0x040A, 0x0007, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0FC0, 0x02,
+ 0xD7DA, 0x08DC, 0x02,
+ 0xD7D4, 0x0004, 0x02,
+ 0xD7D8, 0x0007, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0xDD10, 0x0100, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0xB6B0, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD14, 0x3F80, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0000, 0x02,
+ 0x0316, 0x0000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0101, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10BA, 0x0100, 0x02,
+ 0x10D2, 0x2C80, 0x02,
+ 0x10FA, 0x0101, 0x02,
+ 0x1108, 0x3F80, 0x02,
+ 0x110A, 0x0000, 0x02,
+ 0x10BC, 0x0001, 0x02,
+ 0x10D4, 0x2C80, 0x02,
+ 0x10FC, 0x0100, 0x02,
+ 0x110C, 0x3F80, 0x02,
+ 0x110E, 0x0000, 0x02,
+ 0x10BE, 0x0001, 0x02,
+ 0x10D8, 0x2C80, 0x02,
+ 0x10FE, 0x0100, 0x02,
+ 0x1114, 0x3F80, 0x02,
+ 0x1116, 0x0000, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0xAC54, 0x0400, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_A_4032x1960_30fps[] = {};
+
+const u32 sensor_2l4_setfile_A_3024x3024_30fps[] = {};
+
+const u32 sensor_2l4_setfile_A_2016x1512_30fps[] = {};
+
+const u32 sensor_2l4_setfile_A_2016x1134_30fps[] = {};
+
+const u32 sensor_2l4_setfile_A_1504x1504_30fps[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x3024_24fps[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_24fps[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x1960_24fps[] = {};
+
+const u32 sensor_2l4_setfile_A_3024x3024_24fps[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_60fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_2016x1512_120fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_2016x1512_30fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_2016x1134_240fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_2016x1134_120fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_2016x1134_30fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_1504x1504_120fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_1504x1504_30fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_A_1008x756_120fps_mode2[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0DC0, 0x02,
+ 0x0340, 0x09FC, 0x02,
+ 0x303C, 0x0002, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0000, 0x02,
+ 0x1D26, 0x0BE0, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0344, 0x0018, 0x02,
+ 0x0348, 0x1FD6, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x03F0, 0x02,
+ 0x034E, 0x02F4, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0003, 0x02,
+ 0x040A, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x303E, 0x0120, 0x02,
+ 0x303C, 0x0002, 0x02,
+ 0x3072, 0x0701, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0xDD10, 0x0100, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD14, 0x3F80, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0000, 0x02,
+ 0x0316, 0x0000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10BA, 0x0100, 0x02,
+ 0x10D2, 0x2C80, 0x02,
+ 0x10FA, 0x0101, 0x02,
+ 0x1108, 0x3F80, 0x02,
+ 0x110A, 0x0000, 0x02,
+ 0x10BC, 0x0001, 0x02,
+ 0x10D4, 0x2C80, 0x02,
+ 0x10FC, 0x0100, 0x02,
+ 0x110C, 0x3F80, 0x02,
+ 0x110E, 0x0000, 0x02,
+ 0x10BE, 0x0001, 0x02,
+ 0x10D8, 0x2C80, 0x02,
+ 0x10FE, 0x0100, 0x02,
+ 0x1114, 0x3F80, 0x02,
+ 0x1116, 0x0000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0xFFFF, 0x02,
+ 0xAC54, 0x0400, 0x02,
+ 0xB22E, 0x049E, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xAE0E, 0x0159, 0x02,
+ 0xAC60, 0x0010, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_A_2016x1134_60fps_mode2_ssm_960[] = {};
+
+const u32 sensor_2l4_setfile_A_1280x720_60fps_mode2_ssm_960[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x3024_30fps_mode2_dram_test_section1[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x3024_30fps_mode2_dram_test_section2[] = {};
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+const u32 sensor_2l4_setfile_A_Global_retention[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x3024_30fps_retention[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_30fps_retention[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_60fps_retention[] = {};
+
+const u32 sensor_2l4_setfile_A_1008x756_120fps_retention[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x3024_30fps_load_sram[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_30fps_load_sram[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x3024_24fps_load_sram[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_24fps_load_sram[] = {};
+
+const u32 sensor_2l4_setfile_A_4032x2268_60fps_load_sram[] = {};
+
+const u32 sensor_2l4_setfile_A_1008x756_120fps_load_sram[] = {};
+#endif
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x3024_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x0C58, /* frame_length_lines */
+ 0x2C80, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x2268_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2177500000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x133C, /* frame_length_lines */
+ 0x0D58, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x2268_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x0C58, /* frame_length_lines */
+ 0x2C80, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x1960_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x2140, /* frame_length_lines */
+ 0x0F50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_3024x3024_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x31C0, /* frame_length_lines */
+ 0x0A50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1512_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x6370, /* frame_length_lines */
+ 0x0528, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1134_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x6370, /* frame_length_lines */
+ 0x0528, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_1504x1504_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x6370, /* frame_length_lines */
+ 0x0528, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x3024_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3E4E, /* frame_length_lines */
+ 0x0A50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x2268_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x2FD0, /* frame_length_lines */
+ 0x0D70, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x1960_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x29F8, /* frame_length_lines */
+ 0x0F50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_3024x3024_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3E4E, /* frame_length_lines */
+ 0x0A50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x2268_60fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27D0, /* frame_length_lines */
+ 0x0670, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1512_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1404000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27C0, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1512_30fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x9F00, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1134_240fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x13E0, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1134_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27C0, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1134_30fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x9F00, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_1504x1504_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27C0, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_1504x1504_30fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x9F00, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_1008x756_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x09FC, /* frame_length_lines */
+ 0x0DC0, /* line_length_pck */
+};
+
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_2016x1134_60fps_mode2_ssm_960 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x2840, /* frame_length_lines */
+ 0x0330, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_1280x720_60fps_mode2_ssm_960 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1010668000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x0E50, /* frame_length_lines */
+ 0x047C, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x3024_30fps_mode2_aeb_factory = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3080, /* frame_length_lines */
+ 0x0A80, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_A_4032x3024_30fps_mode2_aeb_factory_stage2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3080, /* frame_length_lines */
+ 0x0A80, /* line_length_pck */
+};
+
+static const u32 *sensor_2l4_setfiles_A[] = {
+ sensor_2l4_setfile_A_4032x3024_30fps,
+ sensor_2l4_setfile_A_4032x2268_60fps,
+ sensor_2l4_setfile_A_4032x2268_30fps,
+ sensor_2l4_setfile_A_4032x1960_30fps,
+ sensor_2l4_setfile_A_3024x3024_30fps,
+ sensor_2l4_setfile_A_2016x1512_30fps,
+ sensor_2l4_setfile_A_2016x1134_30fps,
+ sensor_2l4_setfile_A_1504x1504_30fps,
+ sensor_2l4_setfile_A_4032x3024_24fps,
+ sensor_2l4_setfile_A_4032x2268_24fps,
+ sensor_2l4_setfile_A_4032x1960_24fps,
+ sensor_2l4_setfile_A_3024x3024_24fps,
+ sensor_2l4_setfile_A_4032x2268_60fps_mode2,
+ sensor_2l4_setfile_A_2016x1512_120fps_mode2,
+ sensor_2l4_setfile_A_2016x1512_30fps_mode2,
+ sensor_2l4_setfile_A_2016x1134_240fps_mode2,
+ sensor_2l4_setfile_A_2016x1134_120fps_mode2,
+ sensor_2l4_setfile_A_2016x1134_30fps_mode2,
+ sensor_2l4_setfile_A_1504x1504_120fps_mode2,
+ sensor_2l4_setfile_A_1504x1504_30fps_mode2,
+ sensor_2l4_setfile_A_1008x756_120fps_mode2,
+ sensor_2l4_setfile_A_2016x1134_60fps_mode2_ssm_960,
+ sensor_2l4_setfile_A_2016x1134_60fps_mode2_ssm_960,
+ sensor_2l4_setfile_A_1280x720_60fps_mode2_ssm_960,
+ sensor_2l4_setfile_A_1280x720_60fps_mode2_ssm_960,
+ sensor_2l4_setfile_A_4032x3024_30fps_mode2_dram_test_section1,
+ sensor_2l4_setfile_A_4032x3024_30fps_mode2_dram_test_section2,
+};
+
+static const u32 sensor_2l4_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x3024_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_60fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x1960_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_3024x3024_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1512_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1134_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1504x1504_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x3024_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x1960_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_3024x3024_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_60fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1512_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1512_30fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1134_240fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1134_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1134_30fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1504x1504_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1504x1504_30fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1008x756_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1134_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l4_setfile_A_2016x1134_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1280x720_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1280x720_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x3024_30fps_mode2_dram_test_section1),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x3024_30fps_mode2_dram_test_section2),
+};
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+static const u32 *sensor_2l4_setfiles_A_retention[] = {
+ sensor_2l4_setfile_A_4032x3024_30fps_retention,
+ sensor_2l4_setfile_A_4032x2268_30fps_retention,
+ sensor_2l4_setfile_A_4032x2268_60fps_retention,
+ sensor_2l4_setfile_A_1008x756_120fps_retention,
+};
+
+static const u32 sensor_2l4_setfile_A_sizes_retention[] = {
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x3024_30fps_retention),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_30fps_retention),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_60fps_retention),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1008x756_120fps_retention),
+};
+
+static const u32 *sensor_2l4_setfile_A_load_sram[] = {
+ sensor_2l4_setfile_A_4032x3024_30fps_load_sram,
+ sensor_2l4_setfile_A_4032x2268_30fps_load_sram,
+ sensor_2l4_setfile_A_4032x3024_24fps_load_sram,
+ sensor_2l4_setfile_A_4032x2268_24fps_load_sram,
+ sensor_2l4_setfile_A_4032x2268_60fps_load_sram,
+ sensor_2l4_setfile_A_1008x756_120fps_load_sram,
+};
+
+static const u32 sensor_2l4_setfile_A_sizes_load_sram[] = {
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x3024_30fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_30fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x3024_24fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_24fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_A_4032x2268_60fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_A_1008x756_120fps_load_sram),
+};
+#endif
+
+static const struct sensor_pll_info_compact *sensor_2l4_pllinfos_A[] = {
+ &sensor_2l4_pllinfo_A_4032x3024_30fps,
+ &sensor_2l4_pllinfo_A_4032x2268_60fps,
+ &sensor_2l4_pllinfo_A_4032x2268_30fps,
+ &sensor_2l4_pllinfo_A_4032x1960_30fps,
+ &sensor_2l4_pllinfo_A_3024x3024_30fps,
+ &sensor_2l4_pllinfo_A_2016x1512_30fps,
+ &sensor_2l4_pllinfo_A_2016x1134_30fps,
+ &sensor_2l4_pllinfo_A_1504x1504_30fps,
+ &sensor_2l4_pllinfo_A_4032x3024_24fps,
+ &sensor_2l4_pllinfo_A_4032x2268_24fps,
+ &sensor_2l4_pllinfo_A_4032x1960_24fps,
+ &sensor_2l4_pllinfo_A_3024x3024_24fps,
+ &sensor_2l4_pllinfo_A_4032x2268_60fps_mode2,
+ &sensor_2l4_pllinfo_A_2016x1512_120fps_mode2,
+ &sensor_2l4_pllinfo_A_2016x1512_30fps_mode2,
+ &sensor_2l4_pllinfo_A_2016x1134_240fps_mode2,
+ &sensor_2l4_pllinfo_A_2016x1134_120fps_mode2,
+ &sensor_2l4_pllinfo_A_2016x1134_30fps_mode2,
+ &sensor_2l4_pllinfo_A_1504x1504_120fps_mode2,
+ &sensor_2l4_pllinfo_A_1504x1504_30fps_mode2,
+ &sensor_2l4_pllinfo_A_1008x756_120fps_mode2,
+ &sensor_2l4_pllinfo_A_2016x1134_60fps_mode2_ssm_960,
+ &sensor_2l4_pllinfo_A_2016x1134_60fps_mode2_ssm_960,
+ &sensor_2l4_pllinfo_A_1280x720_60fps_mode2_ssm_960,
+ &sensor_2l4_pllinfo_A_1280x720_60fps_mode2_ssm_960,
+ &sensor_2l4_pllinfo_A_4032x3024_30fps_mode2_aeb_factory,
+ &sensor_2l4_pllinfo_A_4032x3024_30fps_mode2_aeb_factory_stage2,
+};
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_2L4_SET_B_H
+#define FIMC_IS_CIS_2L4_SET_B_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-2l4.h"
+
+/* SAK2L4SX_EVT0.0_Ver_0.03b_20180704_3stack_FHD_slowmotion */
+
+/* Reset + TnP */
+const u32 sensor_2l4_setfile_B_Reset_TnP[] = {
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0xA9F4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x64FE, 0x0000, 0x02,
+ 0x6010, 0x0001, 0x02,
+ I2C_MODE_DELAY, 5000, 0x00,
+ 0x6004, 0x0001, 0x02,
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0x2F54, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0449, 0x02,
+ I2C_MODE_BURST_DATA, 0x0348, 0x02,
+ I2C_MODE_BURST_DATA, 0x044A, 0x02,
+ I2C_MODE_BURST_DATA, 0x4860, 0x02,
+ I2C_MODE_BURST_DATA, 0x101A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0881, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xC5BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3948, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF5F, 0x02,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFC93, 0x02,
+ I2C_MODE_BURST_DATA, 0x0024, 0x02,
+ I2C_MODE_BURST_DATA, 0x0546, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1782, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1872, 0x02,
+ I2C_MODE_BURST_DATA, 0x2646, 0x02,
+ I2C_MODE_BURST_DATA, 0xFC48, 0x02,
+ I2C_MODE_BURST_DATA, 0x2246, 0x02,
+ I2C_MODE_BURST_DATA, 0x0068, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0x104B, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x8246, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x42FC, 0x02,
+ I2C_MODE_BURST_DATA, 0xF74A, 0x02,
+ I2C_MODE_BURST_DATA, 0x37B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x012F, 0x02,
+ I2C_MODE_BURST_DATA, 0x22D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x022F, 0x02,
+ I2C_MODE_BURST_DATA, 0x25D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x032F, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5FE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0124, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2072, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C32, 0x02,
+ I2C_MODE_BURST_DATA, 0x0021, 0x02,
+ I2C_MODE_BURST_DATA, 0xA446, 0x02,
+ I2C_MODE_BURST_DATA, 0x0CFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x10EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x080F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0069, 0x02,
+ I2C_MODE_BURST_DATA, 0x9842, 0x02,
+ I2C_MODE_BURST_DATA, 0x06D9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB842, 0x02,
+ I2C_MODE_BURST_DATA, 0x04D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x55F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0440, 0x02,
+ I2C_MODE_BURST_DATA, 0x761C, 0x02,
+ I2C_MODE_BURST_DATA, 0xF6B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x491C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0429, 0x02,
+ I2C_MODE_BURST_DATA, 0xEBD3, 0x02,
+ I2C_MODE_BURST_DATA, 0xA6BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0024, 0x02,
+ I2C_MODE_BURST_DATA, 0x41E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1DFC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x3CE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0021, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2072, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C62, 0x02,
+ I2C_MODE_BURST_DATA, 0x0846, 0x02,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8003, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B69, 0x02,
+ I2C_MODE_BURST_DATA, 0xB342, 0x02,
+ I2C_MODE_BURST_DATA, 0x05D9, 0x02,
+ I2C_MODE_BURST_DATA, 0xBB42, 0x02,
+ I2C_MODE_BURST_DATA, 0x03D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x55F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2030, 0x02,
+ I2C_MODE_BURST_DATA, 0x1944, 0x02,
+ I2C_MODE_BURST_DATA, 0xC9B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0428, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x0329, 0x02,
+ I2C_MODE_BURST_DATA, 0x25D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x25E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x0093, 0x02,
+ I2C_MODE_BURST_DATA, 0x0193, 0x02,
+ I2C_MODE_BURST_DATA, 0x0293, 0x02,
+ I2C_MODE_BURST_DATA, 0x0393, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2072, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C62, 0x02,
+ I2C_MODE_BURST_DATA, 0x1946, 0x02,
+ I2C_MODE_BURST_DATA, 0xEC46, 0x02,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0069, 0x02,
+ I2C_MODE_BURST_DATA, 0xB042, 0x02,
+ I2C_MODE_BURST_DATA, 0x07D9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB842, 0x02,
+ I2C_MODE_BURST_DATA, 0x05D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x55F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2100, 0x02,
+ I2C_MODE_BURST_DATA, 0x4CF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2100, 0x02,
+ I2C_MODE_BURST_DATA, 0x02E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0DE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4CF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2130, 0x02,
+ I2C_MODE_BURST_DATA, 0x491C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0429, 0x02,
+ I2C_MODE_BURST_DATA, 0xEDD3, 0x02,
+ I2C_MODE_BURST_DATA, 0x0098, 0x02,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0398, 0x02,
+ I2C_MODE_BURST_DATA, 0x18B9, 0x02,
+ I2C_MODE_BURST_DATA, 0x0198, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0298, 0x02,
+ I2C_MODE_BURST_DATA, 0x00B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0124, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x5146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD4FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x04B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF09F, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF41, 0x02,
+ I2C_MODE_BURST_DATA, 0x0025, 0x02,
+ I2C_MODE_BURST_DATA, 0xBB4E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0095, 0x02,
+ I2C_MODE_BURST_DATA, 0x0195, 0x02,
+ I2C_MODE_BURST_DATA, 0x0295, 0x02,
+ I2C_MODE_BURST_DATA, 0x0395, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8402, 0x02,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0xE882, 0x02,
+ I2C_MODE_BURST_DATA, 0xB84C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0127, 0x02,
+ I2C_MODE_BURST_DATA, 0xB8B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0xD8F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0420, 0x02,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4001, 0x02,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4101, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8632, 0x02,
+ I2C_MODE_BURST_DATA, 0x9342, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AD1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8822, 0x02,
+ I2C_MODE_BURST_DATA, 0x022A, 0x02,
+ I2C_MODE_BURST_DATA, 0x36D1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A12, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7810, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0x2EE0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x6B46, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x04EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8001, 0x02,
+ I2C_MODE_BURST_DATA, 0xD1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xCC20, 0x02,
+ I2C_MODE_BURST_DATA, 0xD1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xBC10, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A42, 0x02,
+ I2C_MODE_BURST_DATA, 0x02D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x43F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2050, 0x02,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x43F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2070, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0428, 0x02,
+ I2C_MODE_BURST_DATA, 0xEFD3, 0x02,
+ I2C_MODE_BURST_DATA, 0x1846, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x37FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x30B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6802, 0x02,
+ I2C_MODE_BURST_DATA, 0x0128, 0x02,
+ I2C_MODE_BURST_DATA, 0x06D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0228, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0CE0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0x28B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x401E, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7850, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8010, 0x02,
+ I2C_MODE_BURST_DATA, 0x8842, 0x02,
+ I2C_MODE_BURST_DATA, 0x3CD9, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8402, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0xD8F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0420, 0x02,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4001, 0x02,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4101, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8632, 0x02,
+ I2C_MODE_BURST_DATA, 0x9342, 0x02,
+ I2C_MODE_BURST_DATA, 0x0AD1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8822, 0x02,
+ I2C_MODE_BURST_DATA, 0x032A, 0x02,
+ I2C_MODE_BURST_DATA, 0x06D1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A12, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A10, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8210, 0x02,
+ I2C_MODE_BURST_DATA, 0x8842, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FD9, 0x02,
+ I2C_MODE_BURST_DATA, 0x8248, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x687F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0088, 0x02,
+ I2C_MODE_BURST_DATA, 0xA077, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x57FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF30, 0x02,
+ I2C_MODE_BURST_DATA, 0xA060, 0x02,
+ I2C_MODE_BURST_DATA, 0xA582, 0x02,
+ I2C_MODE_BURST_DATA, 0x0720, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC401, 0x02,
+ I2C_MODE_BURST_DATA, 0x683C, 0x02,
+ I2C_MODE_BURST_DATA, 0x07E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7602, 0x02,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7C50, 0x02,
+ I2C_MODE_BURST_DATA, 0x0620, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2C02, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x745F, 0x02,
+ I2C_MODE_BURST_DATA, 0x6580, 0x02,
+ I2C_MODE_BURST_DATA, 0xA580, 0x02,
+ I2C_MODE_BURST_DATA, 0xE580, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF81, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF84F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x6E48, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E46, 0x02,
+ I2C_MODE_BURST_DATA, 0x9246, 0x02,
+ I2C_MODE_BURST_DATA, 0x8068, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F46, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0x1049, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x8046, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A9D, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x4846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x23FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x3B46, 0x02,
+ I2C_MODE_BURST_DATA, 0x5246, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x0095, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2BFB, 0x02,
+ I2C_MODE_BURST_DATA, 0x644D, 0x02,
+ I2C_MODE_BURST_DATA, 0x26BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x6648, 0x02,
+ I2C_MODE_BURST_DATA, 0x0021, 0x02,
+ I2C_MODE_BURST_DATA, 0x8279, 0x02,
+ I2C_MODE_BURST_DATA, 0x05EB, 0x02,
+ I2C_MODE_BURST_DATA, 0xC100, 0x02,
+ I2C_MODE_BURST_DATA, 0x038E, 0x02,
+ I2C_MODE_BURST_DATA, 0x478E, 0x02,
+ I2C_MODE_BURST_DATA, 0x5343, 0x02,
+ I2C_MODE_BURST_DATA, 0x9EB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x5743, 0x02,
+ I2C_MODE_BURST_DATA, 0xBBB2, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1278, 0x02,
+ I2C_MODE_BURST_DATA, 0xB742, 0x02,
+ I2C_MODE_BURST_DATA, 0x04D2, 0x02,
+ I2C_MODE_BURST_DATA, 0xF61B, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF2F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0026, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1678, 0x02,
+ I2C_MODE_BURST_DATA, 0x9F42, 0x02,
+ I2C_MODE_BURST_DATA, 0x04D2, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB1B, 0x02,
+ I2C_MODE_BURST_DATA, 0xB3FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF2F3, 0x02,
+ I2C_MODE_BURST_DATA, 0x9BB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x491C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0686, 0x02,
+ I2C_MODE_BURST_DATA, 0xC9B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x4386, 0x02,
+ I2C_MODE_BURST_DATA, 0x0429, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD3, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x4846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0228, 0x02,
+ I2C_MODE_BURST_DATA, 0x0AD8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5049, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x2867, 0x02,
+ I2C_MODE_BURST_DATA, 0x81F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7003, 0x02,
+ I2C_MODE_BURST_DATA, 0x85F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A00, 0x02,
+ I2C_MODE_BURST_DATA, 0xE872, 0x02,
+ I2C_MODE_BURST_DATA, 0xA872, 0x02,
+ I2C_MODE_BURST_DATA, 0x85F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6400, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF88F, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x1646, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5143, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5242, 0x02,
+ I2C_MODE_BURST_DATA, 0x9942, 0x02,
+ I2C_MODE_BURST_DATA, 0x01D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9142, 0x02,
+ I2C_MODE_BURST_DATA, 0x05D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4148, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D00, 0x02,
+ I2C_MODE_BURST_DATA, 0xC01E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0728, 0x02,
+ I2C_MODE_BURST_DATA, 0x30D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x9942, 0x02,
+ I2C_MODE_BURST_DATA, 0x02D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4148, 0x02,
+ I2C_MODE_BURST_DATA, 0x851F, 0x02,
+ I2C_MODE_BURST_DATA, 0x07E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9142, 0x02,
+ I2C_MODE_BURST_DATA, 0x03D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x3E48, 0x02,
+ I2C_MODE_BURST_DATA, 0x1230, 0x02,
+ I2C_MODE_BURST_DATA, 0x851F, 0x02,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D48, 0x02,
+ I2C_MODE_BURST_DATA, 0x851F, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x8041, 0x02,
+ I2C_MODE_BURST_DATA, 0x4A89, 0x02,
+ I2C_MODE_BURST_DATA, 0x2280, 0x02,
+ I2C_MODE_BURST_DATA, 0x8989, 0x02,
+ I2C_MODE_BURST_DATA, 0x3B4A, 0x02,
+ I2C_MODE_BURST_DATA, 0x2181, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC71C, 0x02,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6439, 0x02,
+ I2C_MODE_BURST_DATA, 0x5943, 0x02,
+ I2C_MODE_BURST_DATA, 0x6160, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFA25, 0x02,
+ I2C_MODE_BURST_DATA, 0x4AB1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4908, 0x02,
+ I2C_MODE_BURST_DATA, 0x6160, 0x02,
+ I2C_MODE_BURST_DATA, 0xE160, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x3246, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0800, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBBFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x02E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x6081, 0x02,
+ I2C_MODE_BURST_DATA, 0xE060, 0x02,
+ I2C_MODE_BURST_DATA, 0x3246, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0BA, 0x02,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x8041, 0x02,
+ I2C_MODE_BURST_DATA, 0x87B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x0880, 0x02,
+ I2C_MODE_BURST_DATA, 0x2248, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A28, 0x02,
+ I2C_MODE_BURST_DATA, 0x23D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x2348, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A46, 0x02,
+ I2C_MODE_BURST_DATA, 0x2549, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C38, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA3FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x244C, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5145, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2268, 0x02,
+ I2C_MODE_BURST_DATA, 0x0198, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x6846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9CFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D49, 0x02,
+ I2C_MODE_BURST_DATA, 0x1A48, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x1031, 0x02,
+ I2C_MODE_BURST_DATA, 0x801D, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x90FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2268, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5244, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x0498, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x92FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x03A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x8AFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x07B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x30BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x0948, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x4169, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D0C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8EB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5FFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x7FFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF506, 0x02,
+ I2C_MODE_BURST_DATA, 0xD0B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x19E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3920, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0DC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x08D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D10, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB632, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB60C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF50, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xFE48, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A10, 0x02,
+ I2C_MODE_BURST_DATA, 0xFD48, 0x02,
+ I2C_MODE_BURST_DATA, 0x29B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xD816, 0x02,
+ I2C_MODE_BURST_DATA, 0x4900, 0x02,
+ I2C_MODE_BURST_DATA, 0x41EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4221, 0x02,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF71, 0x02,
+ I2C_MODE_BURST_DATA, 0x01EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4221, 0x02,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8211, 0x02,
+ I2C_MODE_BURST_DATA, 0xF748, 0x02,
+ I2C_MODE_BURST_DATA, 0xF849, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4E00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0880, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x20BA, 0x02,
+ I2C_MODE_BURST_DATA, 0xFCB5, 0x02,
+ I2C_MODE_BURST_DATA, 0xF34A, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFA35, 0x02,
+ I2C_MODE_BURST_DATA, 0x012B, 0x02,
+ I2C_MODE_BURST_DATA, 0x2CD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0025, 0x02,
+ I2C_MODE_BURST_DATA, 0x028A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0092, 0x02,
+ I2C_MODE_BURST_DATA, 0x808D, 0x02,
+ I2C_MODE_BURST_DATA, 0x0190, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x6E46, 0x02,
+ I2C_MODE_BURST_DATA, 0x8027, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F02, 0x02,
+ I2C_MODE_BURST_DATA, 0x25FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x02F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x02F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0x56F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2240, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A18, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFC31, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B02, 0x02,
+ I2C_MODE_BURST_DATA, 0xA3F5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0043, 0x02,
+ I2C_MODE_BURST_DATA, 0x6343, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0xE37C, 0x02,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C53, 0x02,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x2353, 0x02,
+ I2C_MODE_BURST_DATA, 0x82F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFC31, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C32, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B02, 0x02,
+ I2C_MODE_BURST_DATA, 0x6343, 0x02,
+ I2C_MODE_BURST_DATA, 0xDC17, 0x02,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1453, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B15, 0x02,
+ I2C_MODE_BURST_DATA, 0x82F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C32, 0x02,
+ I2C_MODE_BURST_DATA, 0x1028, 0x02,
+ I2C_MODE_BURST_DATA, 0xDBD3, 0x02,
+ I2C_MODE_BURST_DATA, 0xFCBD, 0x02,
+ I2C_MODE_BURST_DATA, 0xD2F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C5C, 0x02,
+ I2C_MODE_BURST_DATA, 0xD0E7, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF34F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0xD848, 0x02,
+ I2C_MODE_BURST_DATA, 0x8FB0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x8169, 0x02,
+ I2C_MODE_BURST_DATA, 0x88B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0x114B, 0x02,
+ I2C_MODE_BURST_DATA, 0x8246, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xDBF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x1099, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF9, 0x02,
+ I2C_MODE_BURST_DATA, 0xD148, 0x02,
+ I2C_MODE_BURST_DATA, 0x0079, 0x02,
+ I2C_MODE_BURST_DATA, 0x0128, 0x02,
+ I2C_MODE_BURST_DATA, 0x7BD1, 0x02,
+ I2C_MODE_BURST_DATA, 0xCD4F, 0x02,
+ I2C_MODE_BURST_DATA, 0xCF4E, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A07, 0x02,
+ I2C_MODE_BURST_DATA, 0xA6F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4005, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6100, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x1BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0xCA4C, 0x02,
+ I2C_MODE_BURST_DATA, 0xCB49, 0x02,
+ I2C_MODE_BURST_DATA, 0xCB48, 0x02,
+ I2C_MODE_BURST_DATA, 0x626C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8846, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E90, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xEBF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x9AFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x606C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE7F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x606C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE8F9, 0x02,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C93, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x06E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE2E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4010, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE0F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A07, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6100, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x17D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0xB949, 0x02,
+ I2C_MODE_BURST_DATA, 0xE26C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E98, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xC2F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x71FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0xE06C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBEF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0xE06C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBFF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x06E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4810, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB9F9, 0x02,
+ I2C_MODE_BURST_DATA, 0xA54E, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A17, 0x02,
+ I2C_MODE_BURST_DATA, 0x8036, 0x02,
+ I2C_MODE_BURST_DATA, 0xA6F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4005, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6200, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0xB846, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x19D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0xA449, 0x02,
+ I2C_MODE_BURST_DATA, 0xA26D, 0x02,
+ I2C_MODE_BURST_DATA, 0x0F46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E98, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x45FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0xA06D, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0xA06D, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x93F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x4F46, 0x02,
+ I2C_MODE_BURST_DATA, 0x18B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x07E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE4E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5410, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x8BF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x98F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A17, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6200, 0x02,
+ I2C_MODE_BURST_DATA, 0x98F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x17D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x9049, 0x02,
+ I2C_MODE_BURST_DATA, 0x226E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E98, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x6DF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x1CFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x206E, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x69F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x206E, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x6AF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x06E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C10, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x64F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x11B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x20B9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x7348, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xC069, 0x02,
+ I2C_MODE_BURST_DATA, 0x87B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x050C, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x14F9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xDC06, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3310, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7266, 0x02,
+ I2C_MODE_BURST_DATA, 0x4843, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7206, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x49F9, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7266, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xB801, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xD111, 0x02,
+ I2C_MODE_BURST_DATA, 0xC008, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C49, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8410, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0x6949, 0x02,
+ I2C_MODE_BURST_DATA, 0x0880, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF081, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0646, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C48, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x006A, 0x02,
+ I2C_MODE_BURST_DATA, 0x84B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x050C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE7F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2AF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x5748, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x7E43, 0x02,
+ I2C_MODE_BURST_DATA, 0xC188, 0x02,
+ I2C_MODE_BURST_DATA, 0x0129, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4201, 0x02,
+ I2C_MODE_BURST_DATA, 0x521C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E89, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
+ I2C_MODE_BURST_DATA, 0x8041, 0x02,
+ I2C_MODE_BURST_DATA, 0xCE52, 0x02,
+ I2C_MODE_BURST_DATA, 0x9B1C, 0x02,
+ I2C_MODE_BURST_DATA, 0x9BB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x082A, 0x02,
+ I2C_MODE_BURST_DATA, 0xF4D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xCBB8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0746, 0x02,
+ I2C_MODE_BURST_DATA, 0x4848, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x406A, 0x02,
+ I2C_MODE_BURST_DATA, 0x85B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x060C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBEF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x3846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x05F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x4C49, 0x02,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x30B9, 0x02,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9803, 0x02,
+ I2C_MODE_BURST_DATA, 0x0228, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FD1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xA003, 0x02,
+ I2C_MODE_BURST_DATA, 0x60B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C06, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4610, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C06, 0x02,
+ I2C_MODE_BURST_DATA, 0xA16C, 0x02,
+ I2C_MODE_BURST_DATA, 0xD4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xA006, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0xC4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xA006, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9BB8, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x6F61, 0x02,
+ I2C_MODE_BURST_DATA, 0x3C48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2E4C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x4951, 0x02,
+ I2C_MODE_BURST_DATA, 0x6060, 0x02,
+ I2C_MODE_BURST_DATA, 0x3948, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xDCF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x9B71, 0x02,
+ I2C_MODE_BURST_DATA, 0xA060, 0x02,
+ I2C_MODE_BURST_DATA, 0x3648, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD5F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x364D, 0x02,
+ I2C_MODE_BURST_DATA, 0x2060, 0x02,
+ I2C_MODE_BURST_DATA, 0x4BF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0810, 0x02,
+ I2C_MODE_BURST_DATA, 0x298F, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD3F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x288F, 0x02,
+ I2C_MODE_BURST_DATA, 0x334A, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBF11, 0x02,
+ I2C_MODE_BURST_DATA, 0x42F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2010, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2887, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xD341, 0x02,
+ I2C_MODE_BURST_DATA, 0x2F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x5941, 0x02,
+ I2C_MODE_BURST_DATA, 0xE060, 0x02,
+ I2C_MODE_BURST_DATA, 0x2C48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xEF41, 0x02,
+ I2C_MODE_BURST_DATA, 0x2061, 0x02,
+ I2C_MODE_BURST_DATA, 0x2848, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x1341, 0x02,
+ I2C_MODE_BURST_DATA, 0xE060, 0x02,
+ I2C_MODE_BURST_DATA, 0x2648, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xABF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x2331, 0x02,
+ I2C_MODE_BURST_DATA, 0x6061, 0x02,
+ I2C_MODE_BURST_DATA, 0x2448, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x9B11, 0x02,
+ I2C_MODE_BURST_DATA, 0xA061, 0x02,
+ I2C_MODE_BURST_DATA, 0x2148, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9DF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x4F11, 0x02,
+ I2C_MODE_BURST_DATA, 0xE061, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D11, 0x02,
+ I2C_MODE_BURST_DATA, 0x2062, 0x02,
+ I2C_MODE_BURST_DATA, 0x38E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D20, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xADC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF40A, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3920, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3900, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x2458, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEE10, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x198C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF770, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x14E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C30, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1ED4, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x2178, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF646, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x01A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x91EF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xADA1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x9079, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0AD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C0F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C9F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xF9ED, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x7D39, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD51, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFD8B, 0x02,
+ I2C_MODE_BURST_DATA, 0x0248, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x55F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6062, 0x02,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x22CB, 0x02,
+ I2C_MODE_BURST_DATA, 0x49F2, 0x02,
+ I2C_MODE_BURST_DATA, 0xED7C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x49F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x790C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x48F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xE97C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xA15C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB3C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x5D4C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x6F4C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xED1C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x395C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x46F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D2C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xF55C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x077C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x46F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x3F3C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4DF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x515C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x8B5C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x42F2, 0x02,
+ I2C_MODE_BURST_DATA, 0xCB2C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xBF1C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x2F1C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x20C4, 0x02,
+ I2C_MODE_BURST_DATA, 0x016F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1E8E, 0x02,
+};
+
+/* Global */
+const u32 sensor_2l4_setfile_B_Global[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0400, 0x0004, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC52, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0832, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1018, 0x0901, 0x02,
+ 0xB664, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0x3014, 0x0101, 0x02,
+ 0x3016, 0x0000, 0x02,
+ 0x3018, 0x0000, 0x02,
+ 0x301A, 0x0001, 0x02,
+ 0x301C, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1AC4, 0x0000, 0x02,
+ 0x1AC6, 0x0000, 0x02,
+ 0x10AC, 0x0001, 0x02,
+ 0x10B4, 0x0000, 0x02,
+ 0x10DE, 0x0000, 0x02,
+ 0x10E6, 0x0202, 0x02,
+ 0x115A, 0x0000, 0x02,
+ 0x10AE, 0x0203, 0x02,
+ 0x10B4, 0x0000, 0x02,
+ 0x10E0, 0x0000, 0x02,
+ 0x10E6, 0x0202, 0x02,
+ 0x115C, 0x0103, 0x02,
+ 0x10B0, 0x0401, 0x02,
+ 0x10B6, 0x0000, 0x02,
+ 0x10E2, 0x0000, 0x02,
+ 0x10E8, 0x0202, 0x02,
+ 0x115E, 0x0201, 0x02,
+ 0xB062, 0x06F9, 0x02,
+ 0xB064, 0x0530, 0x02,
+ 0xB066, 0x076C, 0x02,
+ 0xB06C, 0x06A0, 0x02,
+ 0xAE24, 0x0400, 0x02,
+ 0xAE0C, 0x03FA, 0x02,
+ 0x1D48, 0x0040, 0x02,
+ 0xACDA, 0x0A0A, 0x02,
+ 0xACEA, 0x0A0A, 0x02,
+ 0xAD9C, 0x0707, 0x02,
+ 0xADAC, 0x0707, 0x02,
+ 0xAE7C, 0x8562, 0x02,
+ 0xAE7E, 0x0380, 0x02,
+ 0xAE80, 0x4050, 0x02,
+ 0xAC7A, 0x0505, 0x02,
+ 0xAC8A, 0x0505, 0x02,
+ 0xAC9A, 0x0505, 0x02,
+ 0xAD68, 0x0002, 0x02,
+ 0xAD6A, 0x1808, 0x02,
+ 0xAD3E, 0x0042, 0x02,
+ 0xAE1A, 0x0012, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF44A, 0x000C, 0x02,
+ 0xF44C, 0x000A, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE16, 0x0018, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF450, 0x0018, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1F6A, 0x0004, 0x02,
+ 0x218A, 0x0008, 0x02,
+ 0x220A, 0x0065, 0x02,
+ 0x222A, 0x005F, 0x02,
+ 0x3C0A, 0x001A, 0x02,
+ 0x3C2A, 0x0018, 0x02,
+ 0x3C4A, 0x000E, 0x02,
+ 0x3C6A, 0x000C, 0x02,
+ 0x3C8A, 0x0002, 0x02,
+ 0x3CEA, 0xFF6E, 0x02,
+ 0x3DEA, 0x0020, 0x02,
+ 0x3E0A, 0x0020, 0x02,
+ 0xC2C8, 0x0133, 0x02,
+ 0xCC38, 0x0133, 0x02,
+ 0xC2FA, 0x00F5, 0x02,
+ 0xCC6A, 0x00F5, 0x02,
+ 0xC32C, 0x0133, 0x02,
+ 0xCC9C, 0x0133, 0x02,
+ 0xC2BE, 0x0133, 0x02,
+ 0xCC2E, 0x0133, 0x02,
+ 0xC2F0, 0x0133, 0x02,
+ 0xCC60, 0x0133, 0x02,
+ 0xC322, 0x0133, 0x02,
+ 0xCC92, 0x0133, 0x02,
+ 0xACDA, 0x0A0A, 0x02,
+ 0xACEA, 0x0A0A, 0x02,
+ 0xAD9C, 0x0707, 0x02,
+ 0xADAC, 0x0707, 0x02,
+ 0xAC7A, 0x0505, 0x02,
+ 0xAC8A, 0x0505, 0x02,
+ 0xAC9A, 0x0505, 0x02,
+ 0xAD6C, 0x0002, 0x02,
+ 0xAD6E, 0x1808, 0x02,
+ 0xAD40, 0x0042, 0x02,
+ 0x1F6C, 0x0004, 0x02,
+ 0x218C, 0x0008, 0x02,
+ 0x220C, 0x00D5, 0x02,
+ 0x222C, 0x00CF, 0x02,
+ 0x3C0C, 0x001A, 0x02,
+ 0x3C2C, 0x0018, 0x02,
+ 0x3C4C, 0x000E, 0x02,
+ 0x3C6C, 0x000C, 0x02,
+ 0x3C8C, 0x0002, 0x02,
+ 0x3CEC, 0xFF1E, 0x02,
+ 0x3DEC, 0x0020, 0x02,
+ 0x3E0C, 0x0020, 0x02,
+ 0xACDC, 0x060E, 0x02,
+ 0xACEC, 0x060E, 0x02,
+ 0xADBE, 0x0602, 0x02,
+ 0xADCE, 0x0602, 0x02,
+ 0xAD1C, 0x0307, 0x02,
+ 0xAD2C, 0x0307, 0x02,
+ 0xAD9E, 0x0709, 0x02,
+ 0xADAE, 0x0709, 0x02,
+ 0xAC7C, 0x0504, 0x02,
+ 0xAC8C, 0x0504, 0x02,
+ 0xAC9C, 0x0504, 0x02,
+ 0xAD70, 0x0002, 0x02,
+ 0xAD72, 0x1808, 0x02,
+ 0xAD42, 0x0042, 0x02,
+ 0x1F6E, 0x0004, 0x02,
+ 0x218E, 0x0009, 0x02,
+ 0x220E, 0x0065, 0x02,
+ 0x222E, 0x005F, 0x02,
+ 0x3CEE, 0xFF6E, 0x02,
+ 0x3DEE, 0x0020, 0x02,
+ 0x3E0E, 0x0020, 0x02,
+ 0xACDE, 0x0A0E, 0x02,
+ 0xACEE, 0x0A0E, 0x02,
+ 0xADA0, 0x0709, 0x02,
+ 0xADB0, 0x0709, 0x02,
+ 0xAC7E, 0x0504, 0x02,
+ 0xAC8E, 0x0504, 0x02,
+ 0xAC9E, 0x0504, 0x02,
+ 0xAD78, 0x0002, 0x02,
+ 0xAD7A, 0x1808, 0x02,
+ 0xAD46, 0x0042, 0x02,
+ 0x1F72, 0x0004, 0x02,
+ 0x2192, 0x0009, 0x02,
+ 0x2212, 0x00C9, 0x02,
+ 0x2232, 0x00C3, 0x02,
+ 0x2BD2, 0x0007, 0x02,
+ 0x3A72, 0x0021, 0x02,
+ 0x3A92, 0x001F, 0x02,
+ 0x3AB2, 0x0015, 0x02,
+ 0x3AD2, 0x0013, 0x02,
+ 0x3AF2, 0x0009, 0x02,
+ 0x3B92, 0x0025, 0x02,
+ 0x3BB2, 0x0023, 0x02,
+ 0x3BD2, 0x0019, 0x02,
+ 0x3BF2, 0x0017, 0x02,
+ 0x3C12, 0x000D, 0x02,
+ 0x3C32, 0x000B, 0x02,
+ 0x3C52, 0x0001, 0x02,
+ 0x3C72, 0xFFFF, 0x02,
+ 0x3C92, 0xFFF5, 0x02,
+ 0x3CF2, 0xFE86, 0x02,
+ 0x3D12, 0x00F4, 0x02,
+ 0x3DF2, 0x0020, 0x02,
+ 0x3E12, 0x0020, 0x02,
+ 0xACE2, 0x0A0E, 0x02,
+ 0xACF2, 0x0A0E, 0x02,
+ 0xADA4, 0x0709, 0x02,
+ 0xADB4, 0x0709, 0x02,
+ 0xAC82, 0x0504, 0x02,
+ 0xAC92, 0x0504, 0x02,
+ 0xACA2, 0x0504, 0x02,
+ 0xAD88, 0x0002, 0x02,
+ 0xAD8A, 0x1808, 0x02,
+ 0xAD4E, 0x0042, 0x02,
+ 0x1F7A, 0x0004, 0x02,
+ 0x219A, 0x0009, 0x02,
+ 0x217A, 0x0008, 0x02,
+ 0x221A, 0x01C1, 0x02,
+ 0x223A, 0x01BB, 0x02,
+ 0x2BDA, 0x0007, 0x02,
+ 0x3A7A, 0x0021, 0x02,
+ 0x3A9A, 0x001F, 0x02,
+ 0x3ABA, 0x0015, 0x02,
+ 0x3ADA, 0x0013, 0x02,
+ 0x3AFA, 0x0009, 0x02,
+ 0x3B9A, 0x0025, 0x02,
+ 0x3BBA, 0x0023, 0x02,
+ 0x3BDA, 0x0019, 0x02,
+ 0x3BFA, 0x0017, 0x02,
+ 0x3C1A, 0x000D, 0x02,
+ 0x3C3A, 0x000B, 0x02,
+ 0x3C5A, 0x0001, 0x02,
+ 0x3C7A, 0xFFFF, 0x02,
+ 0x3C9A, 0xFFF5, 0x02,
+ 0x3CFA, 0xFCD0, 0x02,
+ 0x3D1A, 0x0314, 0x02,
+ 0x3DFA, 0x0020, 0x02,
+ 0x3E1A, 0x0020, 0x02,
+ 0xACD6, 0x0A06, 0x02,
+ 0xACE6, 0x0A06, 0x02,
+ 0xADB8, 0x0A06, 0x02,
+ 0xADC8, 0x0A06, 0x02,
+ 0xAD16, 0x0307, 0x02,
+ 0xAD26, 0x0307, 0x02,
+ 0xAD98, 0x0707, 0x02,
+ 0xADA8, 0x0707, 0x02,
+ 0xAC76, 0x0A0A, 0x02,
+ 0xAC86, 0x0A0A, 0x02,
+ 0xAC96, 0x0A0A, 0x02,
+ 0xAD36, 0x0042, 0x02,
+ 0x2162, 0x000A, 0x02,
+ 0x2202, 0x005B, 0x02,
+ 0x2222, 0x0055, 0x02,
+ 0x3CE2, 0xFF64, 0x02,
+ 0xADB8, 0x0A06, 0x02,
+ 0xADC8, 0x0A06, 0x02,
+ 0xAD98, 0x0707, 0x02,
+ 0xADA8, 0x0707, 0x02,
+ 0xAC76, 0x0A0A, 0x02,
+ 0xAC86, 0x0A0A, 0x02,
+ 0xAC96, 0x0A0A, 0x02,
+ 0xAD38, 0x0042, 0x02,
+ 0x1EC4, 0x0006, 0x02,
+ 0x1EE4, 0x0028, 0x02,
+ 0x1F04, 0x0028, 0x02,
+ 0x1F24, 0x0028, 0x02,
+ 0x1F44, 0x0028, 0x02,
+ 0x2104, 0xFFD8, 0x02,
+ 0x2124, 0xFFD8, 0x02,
+ 0x2164, 0x0036, 0x02,
+ 0x2184, 0x0030, 0x02,
+ 0x2204, 0x00C1, 0x02,
+ 0x2224, 0x00BB, 0x02,
+ 0x28C4, 0x0004, 0x02,
+ 0x28E4, 0x0011, 0x02,
+ 0x2904, 0x0032, 0x02,
+ 0x2A84, 0x0008, 0x02,
+ 0x2AA4, 0x0006, 0x02,
+ 0x2D44, 0x0002, 0x02,
+ 0x2D64, 0x0006, 0x02,
+ 0x2DA4, 0x003B, 0x02,
+ 0x2DC4, 0x002B, 0x02,
+ 0x2DE4, 0x0043, 0x02,
+ 0x2E04, 0x0033, 0x02,
+ 0x2E24, 0x0043, 0x02,
+ 0x2E44, 0x0014, 0x02,
+ 0x2E64, 0x0007, 0x02,
+ 0x2F64, 0x0007, 0x02,
+ 0x3144, 0x0007, 0x02,
+ 0x3164, 0x0004, 0x02,
+ 0x3244, 0x0007, 0x02,
+ 0x3264, 0x0004, 0x02,
+ 0x3464, 0x0007, 0x02,
+ 0x34A4, 0x0006, 0x02,
+ 0x3764, 0x0006, 0x02,
+ 0x37E4, 0x0007, 0x02,
+ 0x3844, 0x0020, 0x02,
+ 0x3CA4, 0x0007, 0x02,
+ 0x3CE4, 0xFF9C, 0x02,
+ 0x3D24, 0x0002, 0x02,
+ 0x3D44, 0x0013, 0x02,
+ 0x3DA4, 0x0040, 0x02,
+ 0x3DC4, 0x0040, 0x02,
+ 0x3DE4, 0x00A0, 0x02,
+ 0x3E04, 0x00A0, 0x02,
+ 0x3E24, 0x00A0, 0x02,
+ 0x3E44, 0x00A0, 0x02,
+ 0x5764, 0x0010, 0x02,
+ 0x57C4, 0x0009, 0x02,
+ 0x57E4, 0x000B, 0x02,
+ 0x5804, 0x0007, 0x02,
+ 0xACD8, 0x060A, 0x02,
+ 0xACE8, 0x060A, 0x02,
+ 0xADBA, 0x020A, 0x02,
+ 0xADCA, 0x020A, 0x02,
+ 0xAD18, 0x0703, 0x02,
+ 0xAD28, 0x0703, 0x02,
+ 0xAD9A, 0x0907, 0x02,
+ 0xADAA, 0x0907, 0x02,
+ 0xAC78, 0x080A, 0x02,
+ 0xAC88, 0x080A, 0x02,
+ 0xAC98, 0x080A, 0x02,
+ 0xAD3C, 0x0042, 0x02,
+ 0x2168, 0x0009, 0x02,
+ 0x3CE8, 0xFF86, 0x02,
+ 0x1162, 0xFCFC, 0x02,
+ 0x1164, 0x1050, 0x02,
+ 0x1166, 0x1030, 0x02,
+ 0x1168, 0xDD90, 0x02,
+ 0x116A, 0xDD94, 0x02,
+ 0x116C, 0xDDA4, 0x02,
+ 0x116E, 0xDD96, 0x02,
+ 0x1170, 0xDDA6, 0x02,
+ 0x1172, 0xDD98, 0x02,
+ 0x1174, 0xDDA8, 0x02,
+ 0x1176, 0xDD9A, 0x02,
+ 0x1178, 0xDDAA, 0x02,
+ 0x117A, 0xDD9C, 0x02,
+ 0x117C, 0xDDAC, 0x02,
+ 0x117E, 0xDD9E, 0x02,
+ 0x1180, 0xDDAE, 0x02,
+ 0x1182, 0xDDA0, 0x02,
+ 0x1184, 0xDDB0, 0x02,
+ 0x1186, 0xDDA2, 0x02,
+ 0x1188, 0xDDB2, 0x02,
+ 0x118A, 0xDDC0, 0x02,
+ 0x118C, 0xDDC4, 0x02,
+ 0x118E, 0xDDD4, 0x02,
+ 0x1190, 0xDDC6, 0x02,
+ 0x1192, 0xDDD6, 0x02,
+ 0x1194, 0xDDC8, 0x02,
+ 0x1196, 0xDDD8, 0x02,
+ 0x1198, 0xDDCA, 0x02,
+ 0x119A, 0xDDDA, 0x02,
+ 0x119C, 0xDDCC, 0x02,
+ 0x119E, 0xDDDC, 0x02,
+ 0x11A0, 0xDDCE, 0x02,
+ 0x11A2, 0xDDDE, 0x02,
+ 0x11A4, 0xDDD0, 0x02,
+ 0x11A6, 0xDDE0, 0x02,
+ 0x11A8, 0xDDD2, 0x02,
+ 0x11AA, 0xDDE2, 0x02,
+ 0x11AC, 0xB666, 0x02,
+ 0x11AE, 0xB668, 0x02,
+ 0x11B0, 0xB66A, 0x02,
+ 0x11B2, 0xC29E, 0x02,
+ 0x11B4, 0xCC0E, 0x02,
+ 0x128E, 0x2000, 0x02,
+ 0x1290, 0x0000, 0x02,
+ 0x1292, 0x1D97, 0x02,
+ 0x12D8, 0x0200, 0x02,
+ 0x12DA, 0x0500, 0x02,
+ 0x12DC, 0x0100, 0x02,
+ 0x12DE, 0x0000, 0x02,
+ 0x12E0, 0x0000, 0x02,
+ 0x13BA, 0x2000, 0x02,
+ 0x13BC, 0x0000, 0x02,
+ 0x13BE, 0x1D97, 0x02,
+ 0x1404, 0x0200, 0x02,
+ 0x1406, 0x0500, 0x02,
+ 0x1408, 0x0100, 0x02,
+ 0x140A, 0x0000, 0x02,
+ 0x140C, 0x0000, 0x02,
+ 0x14E6, 0x2000, 0x02,
+ 0x14E8, 0x0000, 0x02,
+ 0x14EA, 0x2217, 0x02,
+ 0x1530, 0x0041, 0x02,
+ 0x1532, 0x0000, 0x02,
+ 0x1534, 0x0000, 0x02,
+ 0x1536, 0x0100, 0x02,
+ 0x1538, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x3024_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0340, 0x3160, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x0BD0, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0005, 0x02,
+ 0x040A, 0x0007, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0FC0, 0x02,
+ 0xD7DA, 0x0BD0, 0x02,
+ 0xD7D4, 0x0004, 0x02,
+ 0xD7D8, 0x0007, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0x1292, 0x1D97, 0x02,
+ 0x13BE, 0x1D97, 0x02,
+ 0x14EA, 0x2217, 0x02,
+ 0xB6B0, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0101, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10BA, 0x0101, 0x02,
+ 0x10D2, 0x0B20, 0x02,
+ 0x10EE, 0x00CC, 0x02,
+ 0x10FA, 0x0100, 0x02,
+ 0x1108, 0x4080, 0x02,
+ 0x110A, 0x0000, 0x02,
+ 0x1122, 0x0000, 0x02,
+ 0x1134, 0x0000, 0x02,
+ 0x1136, 0x0000, 0x02,
+ 0x114E, 0x0004, 0x02,
+ 0x10C2, 0x0100, 0x02,
+ 0x10BC, 0x0101, 0x02,
+ 0x10D4, 0x1640, 0x02,
+ 0x10F0, 0x0006, 0x02,
+ 0x10FC, 0x0000, 0x02,
+ 0x110C, 0x4000, 0x02,
+ 0x110E, 0x0000, 0x02,
+ 0x1124, 0x0000, 0x02,
+ 0x1138, 0x0000, 0x02,
+ 0x113A, 0x0000, 0x02,
+ 0x1150, 0x0004, 0x02,
+ 0x10BE, 0x0101, 0x02,
+ 0x10D8, 0x2C80, 0x02,
+ 0x10F4, 0x0006, 0x02,
+ 0x10FE, 0x0000, 0x02,
+ 0x1114, 0x3F80, 0x02,
+ 0x1116, 0x0000, 0x02,
+ 0x1128, 0x0000, 0x02,
+ 0x1140, 0x0000, 0x02,
+ 0x1142, 0x0000, 0x02,
+ 0x1154, 0x0004, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x0080, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0000, 0x02,
+ 0x3908, 0x0000, 0x02,
+ 0x390A, 0x0000, 0x02,
+ 0x390C, 0x0000, 0x02,
+ 0x390E, 0x0000, 0x02,
+ 0x3910, 0x0000, 0x02,
+ 0x3912, 0x0000, 0x02,
+ 0x3914, 0x0000, 0x02,
+ 0x3916, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0x1294, 0x0001, 0x02,
+ 0x1296, 0x0000, 0x02,
+ 0x1298, 0x00B4, 0x02,
+ 0x129A, 0x024C, 0x02,
+ 0x129C, 0x0204, 0x02,
+ 0x129E, 0x0000, 0x02,
+ 0x12A0, 0x0000, 0x02,
+ 0x12A2, 0x0000, 0x02,
+ 0x12A4, 0x0000, 0x02,
+ 0x12A6, 0x0000, 0x02,
+ 0x12A8, 0x0000, 0x02,
+ 0x12AA, 0x0000, 0x02,
+ 0x12AC, 0x0000, 0x02,
+ 0x12AE, 0x0000, 0x02,
+ 0x12B0, 0x0000, 0x02,
+ 0x12B2, 0x0000, 0x02,
+ 0x12B4, 0x0000, 0x02,
+ 0x12B6, 0x0001, 0x02,
+ 0x12B8, 0x01D6, 0x02,
+ 0x12BA, 0x00AE, 0x02,
+ 0x12BC, 0x0766, 0x02,
+ 0x12BE, 0x00AE, 0x02,
+ 0x12C0, 0x0000, 0x02,
+ 0x12C2, 0x0000, 0x02,
+ 0x12C4, 0x0000, 0x02,
+ 0x12C6, 0x0000, 0x02,
+ 0x12C8, 0x0000, 0x02,
+ 0x12CA, 0x0000, 0x02,
+ 0x12CC, 0x0000, 0x02,
+ 0x12CE, 0x0000, 0x02,
+ 0x12D0, 0x0000, 0x02,
+ 0x12D2, 0x0000, 0x02,
+ 0x12D4, 0x0000, 0x02,
+ 0x12D6, 0x0000, 0x02,
+ 0x13C0, 0x0001, 0x02,
+ 0x13C2, 0x02EE, 0x02,
+ 0x13C4, 0x0146, 0x02,
+ 0x13C6, 0x08AC, 0x02,
+ 0x13C8, 0x0172, 0x02,
+ 0x13CA, 0x0000, 0x02,
+ 0x13CC, 0x0000, 0x02,
+ 0x13CE, 0x0000, 0x02,
+ 0x13D0, 0x0000, 0x02,
+ 0x13D2, 0x0000, 0x02,
+ 0x13D4, 0x0000, 0x02,
+ 0x13D6, 0x0000, 0x02,
+ 0x13D8, 0x0000, 0x02,
+ 0x13DA, 0x0000, 0x02,
+ 0x13DC, 0x0000, 0x02,
+ 0x13DE, 0x0000, 0x02,
+ 0x13E0, 0x0000, 0x02,
+ 0x13E2, 0x0001, 0x02,
+ 0x13E4, 0x0352, 0x02,
+ 0x13E6, 0x015C, 0x02,
+ 0x13E8, 0x0000, 0x02,
+ 0x13EA, 0x0000, 0x02,
+ 0x13EC, 0x0000, 0x02,
+ 0x13EE, 0x0000, 0x02,
+ 0x13F0, 0x0000, 0x02,
+ 0x13F2, 0x0000, 0x02,
+ 0x13F4, 0x0000, 0x02,
+ 0x13F6, 0x0000, 0x02,
+ 0x13F8, 0x0000, 0x02,
+ 0x13FA, 0x0000, 0x02,
+ 0x13FC, 0x0000, 0x02,
+ 0x13FE, 0x0000, 0x02,
+ 0x1400, 0x0000, 0x02,
+ 0x1402, 0x0000, 0x02,
+ 0x14EC, 0x0001, 0x02,
+ 0x14EE, 0x04F0, 0x02,
+ 0x14F0, 0x02B8, 0x02,
+ 0x14F2, 0x0000, 0x02,
+ 0x14F4, 0x0000, 0x02,
+ 0x14F6, 0x0000, 0x02,
+ 0x14F8, 0x0000, 0x02,
+ 0x14FA, 0x0000, 0x02,
+ 0x14FC, 0x0000, 0x02,
+ 0x14FE, 0x0000, 0x02,
+ 0x1500, 0x0000, 0x02,
+ 0x1502, 0x0000, 0x02,
+ 0x1504, 0x0000, 0x02,
+ 0x1506, 0x0000, 0x02,
+ 0x1508, 0x0000, 0x02,
+ 0x150A, 0x0000, 0x02,
+ 0x150C, 0x0000, 0x02,
+ 0x150E, 0x0001, 0x02,
+ 0x1510, 0x0010, 0x02,
+ 0x1512, 0x015C, 0x02,
+ 0x1514, 0x0000, 0x02,
+ 0x1516, 0x0000, 0x02,
+ 0x1518, 0x0000, 0x02,
+ 0x151A, 0x0000, 0x02,
+ 0x151C, 0x0000, 0x02,
+ 0x151E, 0x0000, 0x02,
+ 0x1520, 0x0000, 0x02,
+ 0x1522, 0x0000, 0x02,
+ 0x1524, 0x0000, 0x02,
+ 0x1526, 0x0000, 0x02,
+ 0x1528, 0x0000, 0x02,
+ 0x152A, 0x0000, 0x02,
+ 0x152C, 0x0000, 0x02,
+ 0x152E, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x2268_60fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0E88, 0x02,
+ 0x0340, 0x12E4, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0160, 0x02,
+ 0x034A, 0x0A5F, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x08DC, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0005, 0x02,
+ 0x040A, 0x0007, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0FC0, 0x02,
+ 0xD7DA, 0x08DC, 0x02,
+ 0xD7D4, 0x0004, 0x02,
+ 0xD7D8, 0x0007, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1B00, 0x02,
+ 0x1032, 0x1B00, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xB6B0, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x008E, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4000, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x014F, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0x10A0, 0x0100, 0x02,
+ 0x10A2, 0x0100, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x0080, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0000, 0x02,
+ 0x3908, 0x0000, 0x02,
+ 0x390A, 0x0000, 0x02,
+ 0x390C, 0x0000, 0x02,
+ 0x390E, 0x0000, 0x02,
+ 0x3910, 0x0000, 0x02,
+ 0x3912, 0x0000, 0x02,
+ 0x3914, 0x0000, 0x02,
+ 0x3916, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x0000, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0004, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x00DC, 0x02,
+ 0xDDA4, 0x0128, 0x02,
+ 0xDD96, 0x0334, 0x02,
+ 0xDDA6, 0x0190, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x028A, 0x02,
+ 0xDDD4, 0x0064, 0x02,
+ 0xDDC6, 0x0578, 0x02,
+ 0xDDD6, 0x00F8, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x2268_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0340, 0x25C0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0160, 0x02,
+ 0x034A, 0x0A5F, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x08DC, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0005, 0x02,
+ 0x040A, 0x0007, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0FC0, 0x02,
+ 0xD7DA, 0x08DC, 0x02,
+ 0xD7D4, 0x0004, 0x02,
+ 0xD7D8, 0x0007, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0x1292, 0x1D97, 0x02,
+ 0x13BE, 0x1D97, 0x02,
+ 0x14EA, 0x2217, 0x02,
+ 0xB6B0, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0101, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10BA, 0x0101, 0x02,
+ 0x10D2, 0x0E88, 0x02,
+ 0x10EE, 0x00DC, 0x02,
+ 0x10FA, 0x0100, 0x02,
+ 0x1108, 0x4080, 0x02,
+ 0x110A, 0x0000, 0x02,
+ 0x1122, 0x0000, 0x02,
+ 0x1134, 0x0000, 0x02,
+ 0x1136, 0x0000, 0x02,
+ 0x114E, 0x0004, 0x02,
+ 0x10C2, 0x0101, 0x02,
+ 0x10BC, 0x0101, 0x02,
+ 0x10D4, 0x1D10, 0x02,
+ 0x10F0, 0x0020, 0x02,
+ 0x10FC, 0x0000, 0x02,
+ 0x110C, 0x4000, 0x02,
+ 0x110E, 0x0000, 0x02,
+ 0x1124, 0x0000, 0x02,
+ 0x1138, 0x0000, 0x02,
+ 0x113A, 0x0000, 0x02,
+ 0x1150, 0x0004, 0x02,
+ 0x10BE, 0x0101, 0x02,
+ 0x10D8, 0x3A20, 0x02,
+ 0x10F4, 0x0006, 0x02,
+ 0x10FE, 0x0000, 0x02,
+ 0x1114, 0x3F80, 0x02,
+ 0x1116, 0x0000, 0x02,
+ 0x1128, 0x0000, 0x02,
+ 0x1140, 0x0000, 0x02,
+ 0x1142, 0x0000, 0x02,
+ 0x1154, 0x0004, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x0080, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0000, 0x02,
+ 0x3908, 0x0000, 0x02,
+ 0x390A, 0x0000, 0x02,
+ 0x390C, 0x0000, 0x02,
+ 0x390E, 0x0000, 0x02,
+ 0x3910, 0x0000, 0x02,
+ 0x3912, 0x0000, 0x02,
+ 0x3914, 0x0000, 0x02,
+ 0x3916, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0x1294, 0x0001, 0x02,
+ 0x1296, 0x014A, 0x02,
+ 0x1298, 0x00B4, 0x02,
+ 0x129A, 0x0396, 0x02,
+ 0x129C, 0x0204, 0x02,
+ 0x129E, 0x0000, 0x02,
+ 0x12A0, 0x0000, 0x02,
+ 0x12A2, 0x0000, 0x02,
+ 0x12A4, 0x0000, 0x02,
+ 0x12A6, 0x0000, 0x02,
+ 0x12A8, 0x0000, 0x02,
+ 0x12AA, 0x0000, 0x02,
+ 0x12AC, 0x0000, 0x02,
+ 0x12AE, 0x0000, 0x02,
+ 0x12B0, 0x0000, 0x02,
+ 0x12B2, 0x0000, 0x02,
+ 0x12B4, 0x0000, 0x02,
+ 0x12B6, 0x0001, 0x02,
+ 0x12B8, 0x0270, 0x02,
+ 0x12BA, 0x00AE, 0x02,
+ 0x12BC, 0x09B4, 0x02,
+ 0x12BE, 0x00AE, 0x02,
+ 0x12C0, 0x0000, 0x02,
+ 0x12C2, 0x0000, 0x02,
+ 0x12C4, 0x0000, 0x02,
+ 0x12C6, 0x0000, 0x02,
+ 0x12C8, 0x0000, 0x02,
+ 0x12CA, 0x0000, 0x02,
+ 0x12CC, 0x0000, 0x02,
+ 0x12CE, 0x0000, 0x02,
+ 0x12D0, 0x0000, 0x02,
+ 0x12D2, 0x0000, 0x02,
+ 0x12D4, 0x0000, 0x02,
+ 0x12D6, 0x0000, 0x02,
+ 0x13C0, 0x0001, 0x02,
+ 0x13C2, 0x08E0, 0x02,
+ 0x13C4, 0x02B8, 0x02,
+ 0x13C6, 0x0000, 0x02,
+ 0x13C8, 0x0000, 0x02,
+ 0x13CA, 0x0000, 0x02,
+ 0x13CC, 0x0000, 0x02,
+ 0x13CE, 0x0000, 0x02,
+ 0x13D0, 0x0000, 0x02,
+ 0x13D2, 0x0000, 0x02,
+ 0x13D4, 0x0000, 0x02,
+ 0x13D6, 0x0000, 0x02,
+ 0x13D8, 0x0000, 0x02,
+ 0x13DA, 0x0000, 0x02,
+ 0x13DC, 0x0000, 0x02,
+ 0x13DE, 0x0000, 0x02,
+ 0x13E0, 0x0000, 0x02,
+ 0x13E2, 0x0001, 0x02,
+ 0x13E4, 0x0352, 0x02,
+ 0x13E6, 0x015C, 0x02,
+ 0x13E8, 0x0000, 0x02,
+ 0x13EA, 0x0000, 0x02,
+ 0x13EC, 0x0000, 0x02,
+ 0x13EE, 0x0000, 0x02,
+ 0x13F0, 0x0000, 0x02,
+ 0x13F2, 0x0000, 0x02,
+ 0x13F4, 0x0000, 0x02,
+ 0x13F6, 0x0000, 0x02,
+ 0x13F8, 0x0000, 0x02,
+ 0x13FA, 0x0000, 0x02,
+ 0x13FC, 0x0000, 0x02,
+ 0x13FE, 0x0000, 0x02,
+ 0x1400, 0x0000, 0x02,
+ 0x1402, 0x0000, 0x02,
+ 0x14EC, 0x0001, 0x02,
+ 0x14EE, 0x0500, 0x02,
+ 0x14F0, 0x02B8, 0x02,
+ 0x14F2, 0x0000, 0x02,
+ 0x14F4, 0x0000, 0x02,
+ 0x14F6, 0x0000, 0x02,
+ 0x14F8, 0x0000, 0x02,
+ 0x14FA, 0x0000, 0x02,
+ 0x14FC, 0x0000, 0x02,
+ 0x14FE, 0x0000, 0x02,
+ 0x1500, 0x0000, 0x02,
+ 0x1502, 0x0000, 0x02,
+ 0x1504, 0x0000, 0x02,
+ 0x1506, 0x0000, 0x02,
+ 0x1508, 0x0000, 0x02,
+ 0x150A, 0x0000, 0x02,
+ 0x150C, 0x0000, 0x02,
+ 0x150E, 0x0001, 0x02,
+ 0x1510, 0x0000, 0x02,
+ 0x1512, 0x015C, 0x02,
+ 0x1514, 0x0000, 0x02,
+ 0x1516, 0x0000, 0x02,
+ 0x1518, 0x0000, 0x02,
+ 0x151A, 0x0000, 0x02,
+ 0x151C, 0x0000, 0x02,
+ 0x151E, 0x0000, 0x02,
+ 0x1520, 0x0000, 0x02,
+ 0x1522, 0x0000, 0x02,
+ 0x1524, 0x0000, 0x02,
+ 0x1526, 0x0000, 0x02,
+ 0x1528, 0x0000, 0x02,
+ 0x152A, 0x0000, 0x02,
+ 0x152C, 0x0000, 0x02,
+ 0x152E, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x1908_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0340, 0x25C0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0240, 0x02,
+ 0x034A, 0x09BF, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x0774, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0005, 0x02,
+ 0x040A, 0x000B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0FC0, 0x02,
+ 0xD7DA, 0x0774, 0x02,
+ 0xD7D4, 0x0004, 0x02,
+ 0xD7D8, 0x000B, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0x1292, 0x1D97, 0x02,
+ 0x13BE, 0x1D97, 0x02,
+ 0x14EA, 0x2217, 0x02,
+ 0xB6B0, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0101, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10BA, 0x0101, 0x02,
+ 0x10D2, 0x0E88, 0x02,
+ 0x10EE, 0x00DC, 0x02,
+ 0x10FA, 0x0100, 0x02,
+ 0x1108, 0x4080, 0x02,
+ 0x110A, 0x0000, 0x02,
+ 0x1122, 0x0000, 0x02,
+ 0x1134, 0x0000, 0x02,
+ 0x1136, 0x0000, 0x02,
+ 0x114E, 0x0004, 0x02,
+ 0x10C2, 0x0101, 0x02,
+ 0x10BC, 0x0101, 0x02,
+ 0x10D4, 0x1D10, 0x02,
+ 0x10F0, 0x0020, 0x02,
+ 0x10FC, 0x0000, 0x02,
+ 0x110C, 0x4000, 0x02,
+ 0x110E, 0x0000, 0x02,
+ 0x1124, 0x0000, 0x02,
+ 0x1138, 0x0000, 0x02,
+ 0x113A, 0x0000, 0x02,
+ 0x1150, 0x0004, 0x02,
+ 0x10BE, 0x0101, 0x02,
+ 0x10D8, 0x3A20, 0x02,
+ 0x10F4, 0x0006, 0x02,
+ 0x10FE, 0x0000, 0x02,
+ 0x1114, 0x3F80, 0x02,
+ 0x1116, 0x0000, 0x02,
+ 0x1128, 0x0000, 0x02,
+ 0x1140, 0x0000, 0x02,
+ 0x1142, 0x0000, 0x02,
+ 0x1154, 0x0004, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x0080, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0000, 0x02,
+ 0x3908, 0x0000, 0x02,
+ 0x390A, 0x0000, 0x02,
+ 0x390C, 0x0000, 0x02,
+ 0x390E, 0x0000, 0x02,
+ 0x3910, 0x0000, 0x02,
+ 0x3912, 0x0000, 0x02,
+ 0x3914, 0x0000, 0x02,
+ 0x3916, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0x1294, 0x0001, 0x02,
+ 0x1296, 0x014A, 0x02,
+ 0x1298, 0x00B4, 0x02,
+ 0x129A, 0x0396, 0x02,
+ 0x129C, 0x0204, 0x02,
+ 0x129E, 0x0000, 0x02,
+ 0x12A0, 0x0000, 0x02,
+ 0x12A2, 0x0000, 0x02,
+ 0x12A4, 0x0000, 0x02,
+ 0x12A6, 0x0000, 0x02,
+ 0x12A8, 0x0000, 0x02,
+ 0x12AA, 0x0000, 0x02,
+ 0x12AC, 0x0000, 0x02,
+ 0x12AE, 0x0000, 0x02,
+ 0x12B0, 0x0000, 0x02,
+ 0x12B2, 0x0000, 0x02,
+ 0x12B4, 0x0000, 0x02,
+ 0x12B6, 0x0001, 0x02,
+ 0x12B8, 0x0270, 0x02,
+ 0x12BA, 0x00AE, 0x02,
+ 0x12BC, 0x09B4, 0x02,
+ 0x12BE, 0x00AE, 0x02,
+ 0x12C0, 0x0000, 0x02,
+ 0x12C2, 0x0000, 0x02,
+ 0x12C4, 0x0000, 0x02,
+ 0x12C6, 0x0000, 0x02,
+ 0x12C8, 0x0000, 0x02,
+ 0x12CA, 0x0000, 0x02,
+ 0x12CC, 0x0000, 0x02,
+ 0x12CE, 0x0000, 0x02,
+ 0x12D0, 0x0000, 0x02,
+ 0x12D2, 0x0000, 0x02,
+ 0x12D4, 0x0000, 0x02,
+ 0x12D6, 0x0000, 0x02,
+ 0x13C0, 0x0001, 0x02,
+ 0x13C2, 0x08E0, 0x02,
+ 0x13C4, 0x02B8, 0x02,
+ 0x13C6, 0x0000, 0x02,
+ 0x13C8, 0x0000, 0x02,
+ 0x13CA, 0x0000, 0x02,
+ 0x13CC, 0x0000, 0x02,
+ 0x13CE, 0x0000, 0x02,
+ 0x13D0, 0x0000, 0x02,
+ 0x13D2, 0x0000, 0x02,
+ 0x13D4, 0x0000, 0x02,
+ 0x13D6, 0x0000, 0x02,
+ 0x13D8, 0x0000, 0x02,
+ 0x13DA, 0x0000, 0x02,
+ 0x13DC, 0x0000, 0x02,
+ 0x13DE, 0x0000, 0x02,
+ 0x13E0, 0x0000, 0x02,
+ 0x13E2, 0x0001, 0x02,
+ 0x13E4, 0x0352, 0x02,
+ 0x13E6, 0x015C, 0x02,
+ 0x13E8, 0x0000, 0x02,
+ 0x13EA, 0x0000, 0x02,
+ 0x13EC, 0x0000, 0x02,
+ 0x13EE, 0x0000, 0x02,
+ 0x13F0, 0x0000, 0x02,
+ 0x13F2, 0x0000, 0x02,
+ 0x13F4, 0x0000, 0x02,
+ 0x13F6, 0x0000, 0x02,
+ 0x13F8, 0x0000, 0x02,
+ 0x13FA, 0x0000, 0x02,
+ 0x13FC, 0x0000, 0x02,
+ 0x13FE, 0x0000, 0x02,
+ 0x1400, 0x0000, 0x02,
+ 0x1402, 0x0000, 0x02,
+ 0x14EC, 0x0001, 0x02,
+ 0x14EE, 0x0500, 0x02,
+ 0x14F0, 0x02B8, 0x02,
+ 0x14F2, 0x0000, 0x02,
+ 0x14F4, 0x0000, 0x02,
+ 0x14F6, 0x0000, 0x02,
+ 0x14F8, 0x0000, 0x02,
+ 0x14FA, 0x0000, 0x02,
+ 0x14FC, 0x0000, 0x02,
+ 0x14FE, 0x0000, 0x02,
+ 0x1500, 0x0000, 0x02,
+ 0x1502, 0x0000, 0x02,
+ 0x1504, 0x0000, 0x02,
+ 0x1506, 0x0000, 0x02,
+ 0x1508, 0x0000, 0x02,
+ 0x150A, 0x0000, 0x02,
+ 0x150C, 0x0000, 0x02,
+ 0x150E, 0x0001, 0x02,
+ 0x1510, 0x0000, 0x02,
+ 0x1512, 0x015C, 0x02,
+ 0x1514, 0x0000, 0x02,
+ 0x1516, 0x0000, 0x02,
+ 0x1518, 0x0000, 0x02,
+ 0x151A, 0x0000, 0x02,
+ 0x151C, 0x0000, 0x02,
+ 0x151E, 0x0000, 0x02,
+ 0x1520, 0x0000, 0x02,
+ 0x1522, 0x0000, 0x02,
+ 0x1524, 0x0000, 0x02,
+ 0x1526, 0x0000, 0x02,
+ 0x1528, 0x0000, 0x02,
+ 0x152A, 0x0000, 0x02,
+ 0x152C, 0x0000, 0x02,
+ 0x152E, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_3024x3024_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0340, 0x3160, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x0BD0, 0x02,
+ 0x034E, 0x0BD0, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x01FD, 0x02,
+ 0x040A, 0x0007, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0BD0, 0x02,
+ 0xD7DA, 0x0BD0, 0x02,
+ 0xD7D4, 0x01FC, 0x02,
+ 0xD7D8, 0x0007, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0x1292, 0x1D97, 0x02,
+ 0x13BE, 0x1D97, 0x02,
+ 0x14EA, 0x2217, 0x02,
+ 0xB6B0, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0101, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x10BA, 0x0101, 0x02,
+ 0x10D2, 0x0B20, 0x02,
+ 0x10EE, 0x00CC, 0x02,
+ 0x10FA, 0x0100, 0x02,
+ 0x1108, 0x4080, 0x02,
+ 0x110A, 0x0000, 0x02,
+ 0x1122, 0x0000, 0x02,
+ 0x1134, 0x0000, 0x02,
+ 0x1136, 0x0000, 0x02,
+ 0x114E, 0x0004, 0x02,
+ 0x10C2, 0x0100, 0x02,
+ 0x10BC, 0x0101, 0x02,
+ 0x10D4, 0x1640, 0x02,
+ 0x10F0, 0x0006, 0x02,
+ 0x10FC, 0x0000, 0x02,
+ 0x110C, 0x4000, 0x02,
+ 0x110E, 0x0000, 0x02,
+ 0x1124, 0x0000, 0x02,
+ 0x1138, 0x0000, 0x02,
+ 0x113A, 0x0000, 0x02,
+ 0x1150, 0x0004, 0x02,
+ 0x10BE, 0x0101, 0x02,
+ 0x10D8, 0x2C80, 0x02,
+ 0x10F4, 0x0006, 0x02,
+ 0x10FE, 0x0000, 0x02,
+ 0x1114, 0x3F80, 0x02,
+ 0x1116, 0x0000, 0x02,
+ 0x1128, 0x0000, 0x02,
+ 0x1140, 0x0000, 0x02,
+ 0x1142, 0x0000, 0x02,
+ 0x1154, 0x0004, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0xFFFF, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x0080, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0000, 0x02,
+ 0x3908, 0x0000, 0x02,
+ 0x390A, 0x0000, 0x02,
+ 0x390C, 0x0000, 0x02,
+ 0x390E, 0x0000, 0x02,
+ 0x3910, 0x0000, 0x02,
+ 0x3912, 0x0000, 0x02,
+ 0x3914, 0x0000, 0x02,
+ 0x3916, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0x1294, 0x0001, 0x02,
+ 0x1296, 0x0000, 0x02,
+ 0x1298, 0x00B4, 0x02,
+ 0x129A, 0x024C, 0x02,
+ 0x129C, 0x0204, 0x02,
+ 0x129E, 0x0000, 0x02,
+ 0x12A0, 0x0000, 0x02,
+ 0x12A2, 0x0000, 0x02,
+ 0x12A4, 0x0000, 0x02,
+ 0x12A6, 0x0000, 0x02,
+ 0x12A8, 0x0000, 0x02,
+ 0x12AA, 0x0000, 0x02,
+ 0x12AC, 0x0000, 0x02,
+ 0x12AE, 0x0000, 0x02,
+ 0x12B0, 0x0000, 0x02,
+ 0x12B2, 0x0000, 0x02,
+ 0x12B4, 0x0000, 0x02,
+ 0x12B6, 0x0001, 0x02,
+ 0x12B8, 0x01D6, 0x02,
+ 0x12BA, 0x00AE, 0x02,
+ 0x12BC, 0x0766, 0x02,
+ 0x12BE, 0x00AE, 0x02,
+ 0x12C0, 0x0000, 0x02,
+ 0x12C2, 0x0000, 0x02,
+ 0x12C4, 0x0000, 0x02,
+ 0x12C6, 0x0000, 0x02,
+ 0x12C8, 0x0000, 0x02,
+ 0x12CA, 0x0000, 0x02,
+ 0x12CC, 0x0000, 0x02,
+ 0x12CE, 0x0000, 0x02,
+ 0x12D0, 0x0000, 0x02,
+ 0x12D2, 0x0000, 0x02,
+ 0x12D4, 0x0000, 0x02,
+ 0x12D6, 0x0000, 0x02,
+ 0x13C0, 0x0001, 0x02,
+ 0x13C2, 0x02EE, 0x02,
+ 0x13C4, 0x0146, 0x02,
+ 0x13C6, 0x08AC, 0x02,
+ 0x13C8, 0x0172, 0x02,
+ 0x13CA, 0x0000, 0x02,
+ 0x13CC, 0x0000, 0x02,
+ 0x13CE, 0x0000, 0x02,
+ 0x13D0, 0x0000, 0x02,
+ 0x13D2, 0x0000, 0x02,
+ 0x13D4, 0x0000, 0x02,
+ 0x13D6, 0x0000, 0x02,
+ 0x13D8, 0x0000, 0x02,
+ 0x13DA, 0x0000, 0x02,
+ 0x13DC, 0x0000, 0x02,
+ 0x13DE, 0x0000, 0x02,
+ 0x13E0, 0x0000, 0x02,
+ 0x13E2, 0x0001, 0x02,
+ 0x13E4, 0x0352, 0x02,
+ 0x13E6, 0x015C, 0x02,
+ 0x13E8, 0x0000, 0x02,
+ 0x13EA, 0x0000, 0x02,
+ 0x13EC, 0x0000, 0x02,
+ 0x13EE, 0x0000, 0x02,
+ 0x13F0, 0x0000, 0x02,
+ 0x13F2, 0x0000, 0x02,
+ 0x13F4, 0x0000, 0x02,
+ 0x13F6, 0x0000, 0x02,
+ 0x13F8, 0x0000, 0x02,
+ 0x13FA, 0x0000, 0x02,
+ 0x13FC, 0x0000, 0x02,
+ 0x13FE, 0x0000, 0x02,
+ 0x1400, 0x0000, 0x02,
+ 0x1402, 0x0000, 0x02,
+ 0x14EC, 0x0001, 0x02,
+ 0x14EE, 0x04F0, 0x02,
+ 0x14F0, 0x02B8, 0x02,
+ 0x14F2, 0x0000, 0x02,
+ 0x14F4, 0x0000, 0x02,
+ 0x14F6, 0x0000, 0x02,
+ 0x14F8, 0x0000, 0x02,
+ 0x14FA, 0x0000, 0x02,
+ 0x14FC, 0x0000, 0x02,
+ 0x14FE, 0x0000, 0x02,
+ 0x1500, 0x0000, 0x02,
+ 0x1502, 0x0000, 0x02,
+ 0x1504, 0x0000, 0x02,
+ 0x1506, 0x0000, 0x02,
+ 0x1508, 0x0000, 0x02,
+ 0x150A, 0x0000, 0x02,
+ 0x150C, 0x0000, 0x02,
+ 0x150E, 0x0001, 0x02,
+ 0x1510, 0x0010, 0x02,
+ 0x1512, 0x015C, 0x02,
+ 0x1514, 0x0000, 0x02,
+ 0x1516, 0x0000, 0x02,
+ 0x1518, 0x0000, 0x02,
+ 0x151A, 0x0000, 0x02,
+ 0x151C, 0x0000, 0x02,
+ 0x151E, 0x0000, 0x02,
+ 0x1520, 0x0000, 0x02,
+ 0x1522, 0x0000, 0x02,
+ 0x1524, 0x0000, 0x02,
+ 0x1526, 0x0000, 0x02,
+ 0x1528, 0x0000, 0x02,
+ 0x152A, 0x0000, 0x02,
+ 0x152C, 0x0000, 0x02,
+ 0x152E, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_2016x1512_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0590, 0x02,
+ 0x0340, 0x62C0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0020, 0x02,
+ 0x0348, 0x1FBE, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x07E0, 0x02,
+ 0x034E, 0x05E8, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0001, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x07E0, 0x02,
+ 0xD7DA, 0x05E8, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0005, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0122, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1B00, 0x02,
+ 0x1032, 0x1B00, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0020, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4172, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x00D0, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0x10A0, 0x0102, 0x02,
+ 0x10A2, 0x0102, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0033, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0001, 0x02,
+ 0x3908, 0x0033, 0x02,
+ 0x390A, 0x0034, 0x02,
+ 0x390C, 0x00CE, 0x02,
+ 0x390E, 0x00CF, 0x02,
+ 0x3910, 0x0189, 0x02,
+ 0x3912, 0x018A, 0x02,
+ 0x3914, 0x0240, 0x02,
+ 0x3916, 0x0241, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x010F, 0x02,
+ 0xAC62, 0x0189, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x0000, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0067, 0x02,
+ 0xDD90, 0x0000, 0x02,
+ 0xDD94, 0x0012, 0x02,
+ 0xDDA4, 0x0190, 0x02,
+ 0xDD96, 0x0366, 0x02,
+ 0xDDA6, 0x0128, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0000, 0x02,
+ 0xDDC4, 0x028A, 0x02,
+ 0xDDD4, 0x0064, 0x02,
+ 0xDDC6, 0x0578, 0x02,
+ 0xDDD6, 0x00F8, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_2016x1134_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0590, 0x02,
+ 0x0340, 0x62C0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0020, 0x02,
+ 0x0348, 0x1FBE, 0x02,
+ 0x0346, 0x0160, 0x02,
+ 0x034A, 0x0A5F, 0x02,
+ 0x034C, 0x07E0, 0x02,
+ 0x034E, 0x046E, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0001, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x07E0, 0x02,
+ 0xD7DA, 0x046C, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0005, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0122, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1B00, 0x02,
+ 0x1032, 0x1B00, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0020, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x41A0, 0x02,
+ 0xDD16, 0x6666, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x00D0, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0x10A0, 0x0102, 0x02,
+ 0x10A2, 0x0102, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0033, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0001, 0x02,
+ 0x3908, 0x0033, 0x02,
+ 0x390A, 0x0034, 0x02,
+ 0x390C, 0x00CE, 0x02,
+ 0x390E, 0x00CF, 0x02,
+ 0x3910, 0x0189, 0x02,
+ 0x3912, 0x018A, 0x02,
+ 0x3914, 0x0240, 0x02,
+ 0x3916, 0x0241, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x010F, 0x02,
+ 0xAC62, 0x0189, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x0000, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x003C, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x0012, 0x02,
+ 0xDDA4, 0x0190, 0x02,
+ 0xDD96, 0x0366, 0x02,
+ 0xDDA6, 0x0128, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x028A, 0x02,
+ 0xDDD4, 0x0064, 0x02,
+ 0xDDC6, 0x0578, 0x02,
+ 0xDDD6, 0x00F8, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_1504x1504_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0590, 0x02,
+ 0x0340, 0x62C0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0020, 0x02,
+ 0x0348, 0x1FBE, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x05E0, 0x02,
+ 0x034E, 0x05E0, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0101, 0x02,
+ 0x040A, 0x0009, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x05E0, 0x02,
+ 0xD7DA, 0x05E0, 0x02,
+ 0xD7D4, 0x0100, 0x02,
+ 0xD7D8, 0x0009, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0122, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0102, 0x02,
+ 0x3096, 0x012B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0100, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1B00, 0x02,
+ 0x1032, 0x1B00, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0020, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4172, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x00D0, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0xFF01, 0x02,
+ 0x1082, 0x0060, 0x02,
+ 0x10A0, 0x0102, 0x02,
+ 0x10A2, 0x0102, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0033, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0001, 0x02,
+ 0x3908, 0x0033, 0x02,
+ 0x390A, 0x0034, 0x02,
+ 0x390C, 0x00CE, 0x02,
+ 0x390E, 0x00CF, 0x02,
+ 0x3910, 0x0189, 0x02,
+ 0x3912, 0x018A, 0x02,
+ 0x3914, 0x0240, 0x02,
+ 0x3916, 0x0241, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x010F, 0x02,
+ 0xAC62, 0x0189, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x0000, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0067, 0x02,
+ 0xDD90, 0x0000, 0x02,
+ 0xDD94, 0x0012, 0x02,
+ 0xDDA4, 0x0190, 0x02,
+ 0xDD96, 0x0366, 0x02,
+ 0xDDA6, 0x0128, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0000, 0x02,
+ 0xDDC4, 0x028A, 0x02,
+ 0xDDD4, 0x0064, 0x02,
+ 0xDDC6, 0x0578, 0x02,
+ 0xDDD6, 0x00F8, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x3024_24fps[] = {};
+
+const u32 sensor_2l4_setfile_B_4032x2268_24fps[] = {};
+
+const u32 sensor_2l4_setfile_B_4032x1908_24fps[] = {};
+
+const u32 sensor_2l4_setfile_B_3024x3024_24fps[] = {};
+
+const u32 sensor_2l4_setfile_B_4032x2268_60fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_B_2016x1512_120fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_B_2016x1512_30fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_B_2016x1134_240fps_mode2[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0370, 0x02,
+ 0x0340, 0x13F8, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0348, 0x1FCE, 0x02,
+ 0x0346, 0x0160, 0x02,
+ 0x034A, 0x0A5F, 0x02,
+ 0x034C, 0x07E0, 0x02,
+ 0x034E, 0x046E, 0x02,
+ 0x0BC2, 0x0004, 0x02,
+ 0x0BC6, 0x0004, 0x02,
+ 0x0408, 0x0001, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0008, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0701, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x001D, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4080, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0xFFFF, 0x02,
+ 0x10A0, 0x0100, 0x02,
+ 0x10A2, 0x0100, 0x02,
+ 0xB22E, 0x049E, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xAE0E, 0x0159, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0010, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1451, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0001, 0x02,
+ 0x3908, 0x0018, 0x02,
+ 0x390A, 0x0019, 0x02,
+ 0x390C, 0x0091, 0x02,
+ 0x390E, 0x0092, 0x02,
+ 0x3910, 0x011A, 0x02,
+ 0x3912, 0x011B, 0x02,
+ 0x3914, 0x0171, 0x02,
+ 0x3916, 0x0172, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x0000, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0004, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x00B1, 0x02,
+ 0xDDA4, 0x0078, 0x02,
+ 0xDD96, 0x01FC, 0x02,
+ 0xDDA6, 0x00E8, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x0000, 0x02,
+ 0xDDD4, 0x0040, 0x02,
+ 0xDDC6, 0x017C, 0x02,
+ 0xDDD6, 0x0018, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_2016x1134_120fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_B_2016x1134_30fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_B_1504x1504_120fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_B_1504x1504_30fps_mode2[] = {};
+
+const u32 sensor_2l4_setfile_B_1008x756_120fps_mode2[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0370, 0x02,
+ 0x0340, 0x27F0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0400, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0040, 0x02,
+ 0x0344, 0x0018, 0x02,
+ 0x0348, 0x1FD6, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x03F0, 0x02,
+ 0x034E, 0x02F4, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0003, 0x02,
+ 0x040A, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0004, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x303E, 0x0120, 0x02,
+ 0x303C, 0x0002, 0x02,
+ 0x3072, 0x0701, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0022, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4080, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0x0020, 0x02,
+ 0x10A0, 0x0100, 0x02,
+ 0x10A2, 0x0100, 0x02,
+ 0xB22E, 0x049E, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xAE0E, 0x0159, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0010, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1451, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0001, 0x02,
+ 0x3908, 0x0018, 0x02,
+ 0x390A, 0x0019, 0x02,
+ 0x390C, 0x0091, 0x02,
+ 0x390E, 0x0092, 0x02,
+ 0x3910, 0x011A, 0x02,
+ 0x3912, 0x011B, 0x02,
+ 0x3914, 0x0171, 0x02,
+ 0x3916, 0x0172, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x006C, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0003, 0x02,
+ 0xDD2A, 0x0004, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x0000, 0x02,
+ 0xDDA4, 0x006E, 0x02,
+ 0xDD96, 0x015E, 0x02,
+ 0xDDA6, 0x0042, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x0000, 0x02,
+ 0xDDD4, 0x002C, 0x02,
+ 0xDDC6, 0x0000, 0x02,
+ 0xDDD6, 0x0000, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1843, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+/* 30_2_2L4SX_M2_FHD Slowvideo */
+const u32 sensor_2l4_setfile_B_2016x1134_60fps_mode2_ssm_960[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0370, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0100, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0348, 0x1FCE, 0x02,
+ 0x0346, 0x0160, 0x02,
+ 0x034A, 0x0A5F, 0x02,
+ 0x034C, 0x07E0, 0x02,
+ 0x034E, 0x046E, 0x02,
+ 0x0BC2, 0x0004, 0x02,
+ 0x0BC6, 0x0004, 0x02,
+ 0x0408, 0x0001, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0008, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0701, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x2010, 0x02,
+ 0x1036, 0x2010, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0030, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4080, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0100, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0xFFFF, 0x02,
+ 0x10A0, 0x0100, 0x02,
+ 0x10A2, 0x0100, 0x02,
+ 0xB22E, 0x049E, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xAE0E, 0x0159, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0010, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1451, 0x02,
+ 0x1D98, 0x0E06, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0001, 0x02,
+ 0x3908, 0x0018, 0x02,
+ 0x390A, 0x0019, 0x02,
+ 0x390C, 0x0091, 0x02,
+ 0x390E, 0x0092, 0x02,
+ 0x3910, 0x011A, 0x02,
+ 0x3912, 0x011B, 0x02,
+ 0x3914, 0x0171, 0x02,
+ 0x3916, 0x0172, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0101, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0001, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0080, 0x02,
+ 0x1AF2, 0xF646, 0x02,
+ 0x1AF4, 0x008F, 0x02,
+ 0xDD8A, 0x04C4, 0x02,
+ 0xDD50, 0x0022, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0004, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x0000, 0x02,
+ 0xDDA4, 0x0078, 0x02,
+ 0xDD96, 0x0168, 0x02,
+ 0xDDA6, 0x0038, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x02DA, 0x02,
+ 0xDDD4, 0x002C, 0x02,
+ 0xDDC6, 0x0000, 0x02,
+ 0xDDD6, 0x0000, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1863, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0201, 0x02,
+ 0x0A58, 0x0180, 0x02,
+ 0x0A5A, 0x0020, 0x02,
+ 0x0A5C, 0x0000, 0x02,
+ 0x0A5E, 0x4FC0, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x0A54, 0x0010, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x30BA, 0x0001, 0x02,
+ 0x0A60, 0x00A0, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDDF8, 0x0000, 0x02,
+ 0xDDFA, 0x1600, 0x02,
+ 0xDDFC, 0x0019, 0x02,
+ 0xDDFE, 0x4000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x000C, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0008, 0x02,
+ 0xDEA0, 0x03F0, 0x02,
+ 0xDEA2, 0x0004, 0x02,
+ 0xDEA4, 0x0470, 0x02,
+ 0xDED2, 0x0008, 0x02,
+ 0xDED4, 0x03F0, 0x02,
+ 0xDED6, 0x0004, 0x02,
+ 0xDED8, 0x0470, 0x02,
+ 0xDF8C, 0x07E0, 0x02,
+ 0xDF90, 0x07ED, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0C08, 0x077C, 0x02,
+ 0x0C14, 0x040A, 0x02,
+ 0x0C18, 0x077C, 0x02,
+ 0x0C1C, 0x040A, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xE59C, 0x0000, 0x02,
+ 0xE59E, 0x0418, 0x02,
+ 0xE5A0, 0x1212, 0x02,
+ 0xE5A2, 0x1416, 0x02,
+ 0xE5A4, 0x0002, 0x02,
+ 0xE5A6, 0x0010, 0x02,
+ 0xE5A8, 0x0012, 0x02,
+ 0xE5AA, 0x0020, 0x02,
+ 0xE5AC, 0x0014, 0x02,
+ 0xE5AE, 0x0100, 0x02,
+ 0xE5B0, 0x0016, 0x02,
+ 0xE5B2, 0x0200, 0x02,
+ 0xE5B4, 0x0018, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+/* 30_4_2L4SX_M2_FHD Slowvideo */
+const u32 sensor_2l4_setfile_B_2016x1134_60fps_mode2_ssm_480[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x0370, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0100, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0348, 0x1FCE, 0x02,
+ 0x0346, 0x0160, 0x02,
+ 0x034A, 0x0A5F, 0x02,
+ 0x034C, 0x07E0, 0x02,
+ 0x034E, 0x046E, 0x02,
+ 0x0BC2, 0x0004, 0x02,
+ 0x0BC6, 0x0004, 0x02,
+ 0x0408, 0x0001, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0008, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0701, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x2010, 0x02,
+ 0x1036, 0x2010, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0030, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4080, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0100, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0400, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0xFFFF, 0x02,
+ 0x10A0, 0x0100, 0x02,
+ 0x10A2, 0x0100, 0x02,
+ 0xB22E, 0x049E, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xAE0E, 0x0159, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0010, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1451, 0x02,
+ 0x1D98, 0x0E06, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0001, 0x02,
+ 0x3908, 0x0018, 0x02,
+ 0x390A, 0x0019, 0x02,
+ 0x390C, 0x0091, 0x02,
+ 0x390E, 0x0092, 0x02,
+ 0x3910, 0x011A, 0x02,
+ 0x3912, 0x011B, 0x02,
+ 0x3914, 0x0171, 0x02,
+ 0x3916, 0x0172, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0101, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0001, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0080, 0x02,
+ 0x1AF2, 0xF646, 0x02,
+ 0x1AF4, 0x008F, 0x02,
+ 0xDD8A, 0x04C4, 0x02,
+ 0xDD50, 0x0022, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0004, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x0000, 0x02,
+ 0xDDA4, 0x0078, 0x02,
+ 0xDD96, 0x0168, 0x02,
+ 0xDDA6, 0x0038, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x02DA, 0x02,
+ 0xDDD4, 0x002C, 0x02,
+ 0xDDC6, 0x0000, 0x02,
+ 0xDDD6, 0x0000, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1863, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0201, 0x02,
+ 0x0A58, 0x00C0, 0x02,
+ 0x0A5A, 0x0010, 0x02,
+ 0x0A5C, 0x0000, 0x02,
+ 0x0A5E, 0x4FC0, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x0A54, 0x0008, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x30BA, 0x0001, 0x02,
+ 0x0A60, 0x00A0, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDDF8, 0x0000, 0x02,
+ 0xDDFA, 0x1600, 0x02,
+ 0xDDFC, 0x0019, 0x02,
+ 0xDDFE, 0x4000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x000C, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0008, 0x02,
+ 0xDEA0, 0x03F0, 0x02,
+ 0xDEA2, 0x0004, 0x02,
+ 0xDEA4, 0x0470, 0x02,
+ 0xDED2, 0x0008, 0x02,
+ 0xDED4, 0x03F0, 0x02,
+ 0xDED6, 0x0004, 0x02,
+ 0xDED8, 0x0470, 0x02,
+ 0xDF8C, 0x07E0, 0x02,
+ 0xDF90, 0x07ED, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0C08, 0x077C, 0x02,
+ 0x0C14, 0x040A, 0x02,
+ 0x0C18, 0x077C, 0x02,
+ 0x0C1C, 0x040A, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xE59C, 0x0000, 0x02,
+ 0xE59E, 0x0418, 0x02,
+ 0xE5A0, 0x1212, 0x02,
+ 0xE5A2, 0x1416, 0x02,
+ 0xE5A4, 0x0002, 0x02,
+ 0xE5A6, 0x0010, 0x02,
+ 0xE5A8, 0x0012, 0x02,
+ 0xE5AA, 0x0020, 0x02,
+ 0xE5AC, 0x0014, 0x02,
+ 0xE5AE, 0x0100, 0x02,
+ 0xE5B0, 0x0016, 0x02,
+ 0xE5B2, 0x0200, 0x02,
+ 0xE5B4, 0x0018, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+/* 61_3_2L4SX_M2_HD Slolwvideo */
+const u32 sensor_2l4_setfile_B_1280x720_60fps_mode2_ssm_960[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x04D0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0100, 0x02,
+ 0x0344, 0x05D8, 0x02,
+ 0x0348, 0x1A16, 0x02,
+ 0x0346, 0x0300, 0x02,
+ 0x034A, 0x08BF, 0x02,
+ 0x034C, 0x0500, 0x02,
+ 0x034E, 0x02D0, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0009, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0701, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x2010, 0x02,
+ 0x1036, 0x2010, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0010, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4000, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0100, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0410, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0xFFFF, 0x02,
+ 0x10A0, 0x0103, 0x02,
+ 0x10A2, 0x0103, 0x02,
+ 0xB22E, 0x049E, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xAE0E, 0x0159, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0010, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0000, 0x02,
+ 0x3908, 0x0000, 0x02,
+ 0x390A, 0x0000, 0x02,
+ 0x390C, 0x0000, 0x02,
+ 0x390E, 0x0000, 0x02,
+ 0x3910, 0x0000, 0x02,
+ 0x3912, 0x0000, 0x02,
+ 0x3914, 0x0000, 0x02,
+ 0x3916, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x0000, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0004, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x0020, 0x02,
+ 0xDDA4, 0x0090, 0x02,
+ 0xDD96, 0x03B6, 0x02,
+ 0xDDA6, 0x0054, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x014A, 0x02,
+ 0xDDD4, 0x0039, 0x02,
+ 0xDDC6, 0x0000, 0x02,
+ 0xDDD6, 0x0000, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1863, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0201, 0x02,
+ 0x0A58, 0x0180, 0x02,
+ 0x0A5A, 0x0020, 0x02,
+ 0x0A5C, 0x0000, 0x02,
+ 0x0A5E, 0x3900, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x0A54, 0x0010, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x30BA, 0x0001, 0x02,
+ 0x0A60, 0x0177, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDDF8, 0x0000, 0x02,
+ 0xDDFA, 0x0E80, 0x02,
+ 0xDDFC, 0x000A, 0x02,
+ 0xDDFE, 0xE000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xDF8C, 0x0510, 0x02,
+ 0xDF90, 0x050D, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0C08, 0x049C, 0x02,
+ 0x0C14, 0x026C, 0x02,
+ 0x0C18, 0x049C, 0x02,
+ 0x0C1C, 0x026C, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xE59C, 0x0000, 0x02,
+ 0xE59E, 0x0418, 0x02,
+ 0xE5A0, 0x1212, 0x02,
+ 0xE5A2, 0x1416, 0x02,
+ 0xE5A4, 0x0002, 0x02,
+ 0xE5A6, 0x0010, 0x02,
+ 0xE5A8, 0x0012, 0x02,
+ 0xE5AA, 0x0020, 0x02,
+ 0xE5AC, 0x0014, 0x02,
+ 0xE5AE, 0x0100, 0x02,
+ 0xE5B0, 0x0016, 0x02,
+ 0xE5B2, 0x0200, 0x02,
+ 0xE5B4, 0x0018, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+/* 61_6_2L4SX_M2_HD Slolwvideo */
+const u32 sensor_2l4_setfile_B_1280x720_60fps_mode2_ssm_480[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0342, 0x04D0, 0x02,
+ 0x3040, 0x0001, 0x02,
+ 0x3042, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30E0, 0x0100, 0x02,
+ 0x0344, 0x05D8, 0x02,
+ 0x0348, 0x1A16, 0x02,
+ 0x0346, 0x0300, 0x02,
+ 0x034A, 0x08BF, 0x02,
+ 0x034C, 0x0500, 0x02,
+ 0x034E, 0x02D0, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0009, 0x02,
+ 0x040A, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0701, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x2010, 0x02,
+ 0x1036, 0x2010, 0x02,
+ 0xB6B0, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0104, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x0010, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0100, 0x0003, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4000, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0100, 0x02,
+ 0xEA92, 0x0001, 0x02,
+ 0x1D2C, 0x0410, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0xFFFF, 0x02,
+ 0x10A0, 0x0103, 0x02,
+ 0x10A2, 0x0103, 0x02,
+ 0xB22E, 0x049E, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xAE0E, 0x0159, 0x02,
+ 0xAE22, 0x00B0, 0x02,
+ 0xAC60, 0x0010, 0x02,
+ 0xB666, 0x0200, 0x02,
+ 0xB668, 0x0500, 0x02,
+ 0xB66A, 0x0100, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3904, 0x0017, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0x1D98, 0x0E00, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3906, 0x0000, 0x02,
+ 0x3908, 0x0000, 0x02,
+ 0x390A, 0x0000, 0x02,
+ 0x390C, 0x0000, 0x02,
+ 0x390E, 0x0000, 0x02,
+ 0x3910, 0x0000, 0x02,
+ 0x3912, 0x0000, 0x02,
+ 0x3914, 0x0000, 0x02,
+ 0x3916, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0xAC62, 0xFFFF, 0x02,
+ 0xC29E, 0x0000, 0x02,
+ 0xCC0E, 0x0000, 0x02,
+ 0x1D9A, 0x0001, 0x02,
+ 0x1D9C, 0x0000, 0x02,
+ 0x1D9E, 0x0000, 0x02,
+ 0x1DA0, 0x0000, 0x02,
+ 0x1DA2, 0x0000, 0x02,
+ 0x1AF2, 0x0000, 0x02,
+ 0x1AF4, 0x0000, 0x02,
+ 0xDD8A, 0x0000, 0x02,
+ 0xDD50, 0x0000, 0x02,
+ 0xDD54, 0x0000, 0x02,
+ 0xDD56, 0x0000, 0x02,
+ 0xDD2A, 0x0004, 0x02,
+ 0xDD90, 0x0001, 0x02,
+ 0xDD94, 0x0020, 0x02,
+ 0xDDA4, 0x0090, 0x02,
+ 0xDD96, 0x03B6, 0x02,
+ 0xDDA6, 0x0054, 0x02,
+ 0xDD98, 0x0000, 0x02,
+ 0xDDA8, 0x0000, 0x02,
+ 0xDD9A, 0x0000, 0x02,
+ 0xDDAA, 0x0000, 0x02,
+ 0xDD9C, 0x0000, 0x02,
+ 0xDDAC, 0x0000, 0x02,
+ 0xDD9E, 0x0000, 0x02,
+ 0xDDAE, 0x0000, 0x02,
+ 0xDDA0, 0x0000, 0x02,
+ 0xDDB0, 0x0000, 0x02,
+ 0xDDA2, 0x0000, 0x02,
+ 0xDDB2, 0x0000, 0x02,
+ 0xDDC0, 0x0001, 0x02,
+ 0xDDC4, 0x014A, 0x02,
+ 0xDDD4, 0x0039, 0x02,
+ 0xDDC6, 0x0000, 0x02,
+ 0xDDD6, 0x0000, 0x02,
+ 0xDDC8, 0x0000, 0x02,
+ 0xDDD8, 0x0000, 0x02,
+ 0xDDCA, 0x0000, 0x02,
+ 0xDDDA, 0x0000, 0x02,
+ 0xDDCC, 0x0000, 0x02,
+ 0xDDDC, 0x0000, 0x02,
+ 0xDDCE, 0x0000, 0x02,
+ 0xDDDE, 0x0000, 0x02,
+ 0xDDD0, 0x0000, 0x02,
+ 0xDDE0, 0x0000, 0x02,
+ 0xDDD2, 0x0000, 0x02,
+ 0xDDE2, 0x0000, 0x02,
+ 0xDB88, 0x08C0, 0x02,
+ 0xDB8A, 0x1863, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0A50, 0x0201, 0x02,
+ 0x0A58, 0x00C0, 0x02,
+ 0x0A5A, 0x0010, 0x02,
+ 0x0A5C, 0x0000, 0x02,
+ 0x0A5E, 0x3900, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x0A54, 0x0008, 0x02,
+ 0x0A56, 0x0401, 0x02,
+ 0x30BA, 0x0001, 0x02,
+ 0x0A60, 0x0177, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDDF8, 0x0000, 0x02,
+ 0xDDFA, 0x0E80, 0x02,
+ 0xDDFC, 0x000A, 0x02,
+ 0xDDFE, 0xE000, 0x02,
+ 0xDBA8, 0x0000, 0x02,
+ 0xDBAA, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x30C6, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xDF8C, 0x0510, 0x02,
+ 0xDF90, 0x050D, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0C08, 0x049C, 0x02,
+ 0x0C14, 0x026C, 0x02,
+ 0x0C18, 0x049C, 0x02,
+ 0x0C1C, 0x026C, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xE59C, 0x0000, 0x02,
+ 0xE59E, 0x0418, 0x02,
+ 0xE5A0, 0x1212, 0x02,
+ 0xE5A2, 0x1416, 0x02,
+ 0xE5A4, 0x0002, 0x02,
+ 0xE5A6, 0x0010, 0x02,
+ 0xE5A8, 0x0012, 0x02,
+ 0xE5AA, 0x0020, 0x02,
+ 0xE5AC, 0x0014, 0x02,
+ 0xE5AE, 0x0100, 0x02,
+ 0xE5B0, 0x0016, 0x02,
+ 0xE5B2, 0x0200, 0x02,
+ 0xE5B4, 0x0018, 0x02,
+ 0xE5B8, 0x0000, 0x02,
+ 0xE6C8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_dram_test_Global[] = {
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0xA9F4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x64FE, 0x0000, 0x02,
+ 0x6010, 0x0001, 0x02,
+ I2C_MODE_DELAY, 5000, 0x00,
+ 0x6004, 0x0001, 0x02,
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0x2F54, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0449, 0x02,
+ I2C_MODE_BURST_DATA, 0x0348, 0x02,
+ I2C_MODE_BURST_DATA, 0x044A, 0x02,
+ I2C_MODE_BURST_DATA, 0x4860, 0x02,
+ I2C_MODE_BURST_DATA, 0x101A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0881, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x87BC, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF5F, 0x02,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0494, 0x02,
+ I2C_MODE_BURST_DATA, 0x0024, 0x02,
+ I2C_MODE_BURST_DATA, 0x0546, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1782, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1872, 0x02,
+ I2C_MODE_BURST_DATA, 0x2646, 0x02,
+ I2C_MODE_BURST_DATA, 0xFE48, 0x02,
+ I2C_MODE_BURST_DATA, 0x2246, 0x02,
+ I2C_MODE_BURST_DATA, 0x0068, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0x104B, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x8246, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x08FD, 0x02,
+ I2C_MODE_BURST_DATA, 0xF94A, 0x02,
+ I2C_MODE_BURST_DATA, 0x37B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x012F, 0x02,
+ I2C_MODE_BURST_DATA, 0x22D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x022F, 0x02,
+ I2C_MODE_BURST_DATA, 0x25D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x032F, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5FE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0124, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2072, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C32, 0x02,
+ I2C_MODE_BURST_DATA, 0x0021, 0x02,
+ I2C_MODE_BURST_DATA, 0xA446, 0x02,
+ I2C_MODE_BURST_DATA, 0x0CFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x10EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x080F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0069, 0x02,
+ I2C_MODE_BURST_DATA, 0x9842, 0x02,
+ I2C_MODE_BURST_DATA, 0x06D9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB842, 0x02,
+ I2C_MODE_BURST_DATA, 0x04D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x55F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0440, 0x02,
+ I2C_MODE_BURST_DATA, 0x761C, 0x02,
+ I2C_MODE_BURST_DATA, 0xF6B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x491C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0429, 0x02,
+ I2C_MODE_BURST_DATA, 0xEBD3, 0x02,
+ I2C_MODE_BURST_DATA, 0xA6BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0024, 0x02,
+ I2C_MODE_BURST_DATA, 0x41E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE3FC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x3CE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0021, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2072, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C62, 0x02,
+ I2C_MODE_BURST_DATA, 0x0846, 0x02,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8003, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B69, 0x02,
+ I2C_MODE_BURST_DATA, 0xB342, 0x02,
+ I2C_MODE_BURST_DATA, 0x05D9, 0x02,
+ I2C_MODE_BURST_DATA, 0xBB42, 0x02,
+ I2C_MODE_BURST_DATA, 0x03D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x55F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2030, 0x02,
+ I2C_MODE_BURST_DATA, 0x1944, 0x02,
+ I2C_MODE_BURST_DATA, 0xC9B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0428, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x0329, 0x02,
+ I2C_MODE_BURST_DATA, 0x25D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x25E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x0093, 0x02,
+ I2C_MODE_BURST_DATA, 0x0193, 0x02,
+ I2C_MODE_BURST_DATA, 0x0293, 0x02,
+ I2C_MODE_BURST_DATA, 0x0393, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2072, 0x02,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C62, 0x02,
+ I2C_MODE_BURST_DATA, 0x1946, 0x02,
+ I2C_MODE_BURST_DATA, 0xEC46, 0x02,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0069, 0x02,
+ I2C_MODE_BURST_DATA, 0xB042, 0x02,
+ I2C_MODE_BURST_DATA, 0x07D9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB842, 0x02,
+ I2C_MODE_BURST_DATA, 0x05D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x55F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2100, 0x02,
+ I2C_MODE_BURST_DATA, 0x4CF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2100, 0x02,
+ I2C_MODE_BURST_DATA, 0x02E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0DE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4CF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2130, 0x02,
+ I2C_MODE_BURST_DATA, 0x491C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0429, 0x02,
+ I2C_MODE_BURST_DATA, 0xEDD3, 0x02,
+ I2C_MODE_BURST_DATA, 0x0098, 0x02,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0398, 0x02,
+ I2C_MODE_BURST_DATA, 0x18B9, 0x02,
+ I2C_MODE_BURST_DATA, 0x0198, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0298, 0x02,
+ I2C_MODE_BURST_DATA, 0x00B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0124, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x5146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9AFC, 0x02,
+ I2C_MODE_BURST_DATA, 0x04B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF09F, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF41, 0x02,
+ I2C_MODE_BURST_DATA, 0x0025, 0x02,
+ I2C_MODE_BURST_DATA, 0xBD4E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0095, 0x02,
+ I2C_MODE_BURST_DATA, 0x0195, 0x02,
+ I2C_MODE_BURST_DATA, 0x0295, 0x02,
+ I2C_MODE_BURST_DATA, 0x0395, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8402, 0x02,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF082, 0x02,
+ I2C_MODE_BURST_DATA, 0xBA4C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0127, 0x02,
+ I2C_MODE_BURST_DATA, 0xB8B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0xD8F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0420, 0x02,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4001, 0x02,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4101, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8632, 0x02,
+ I2C_MODE_BURST_DATA, 0x9342, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AD1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8822, 0x02,
+ I2C_MODE_BURST_DATA, 0x022A, 0x02,
+ I2C_MODE_BURST_DATA, 0x36D1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A12, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7810, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0x2EE0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x6B46, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x04EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x8001, 0x02,
+ I2C_MODE_BURST_DATA, 0xD1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xCC20, 0x02,
+ I2C_MODE_BURST_DATA, 0xD1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xBC10, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A42, 0x02,
+ I2C_MODE_BURST_DATA, 0x02D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x43F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2050, 0x02,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x43F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2070, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0428, 0x02,
+ I2C_MODE_BURST_DATA, 0xEFD3, 0x02,
+ I2C_MODE_BURST_DATA, 0x1846, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x37FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x30B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6802, 0x02,
+ I2C_MODE_BURST_DATA, 0x0128, 0x02,
+ I2C_MODE_BURST_DATA, 0x06D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0228, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0CE0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0x28B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x401E, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7850, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7800, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8010, 0x02,
+ I2C_MODE_BURST_DATA, 0x8842, 0x02,
+ I2C_MODE_BURST_DATA, 0x3CD9, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8402, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0xD8F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0420, 0x02,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4001, 0x02,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4101, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8632, 0x02,
+ I2C_MODE_BURST_DATA, 0x9342, 0x02,
+ I2C_MODE_BURST_DATA, 0x0AD1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8822, 0x02,
+ I2C_MODE_BURST_DATA, 0x032A, 0x02,
+ I2C_MODE_BURST_DATA, 0x06D1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A12, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A10, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D02, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8210, 0x02,
+ I2C_MODE_BURST_DATA, 0x8842, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FD9, 0x02,
+ I2C_MODE_BURST_DATA, 0x8448, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x687F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0088, 0x02,
+ I2C_MODE_BURST_DATA, 0xA077, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1DFC, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF30, 0x02,
+ I2C_MODE_BURST_DATA, 0xA060, 0x02,
+ I2C_MODE_BURST_DATA, 0xA582, 0x02,
+ I2C_MODE_BURST_DATA, 0x0720, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC401, 0x02,
+ I2C_MODE_BURST_DATA, 0x683C, 0x02,
+ I2C_MODE_BURST_DATA, 0x07E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7602, 0x02,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7C50, 0x02,
+ I2C_MODE_BURST_DATA, 0x0620, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2C02, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x745F, 0x02,
+ I2C_MODE_BURST_DATA, 0x6580, 0x02,
+ I2C_MODE_BURST_DATA, 0xA580, 0x02,
+ I2C_MODE_BURST_DATA, 0xE580, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF81, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF84F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x7048, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E46, 0x02,
+ I2C_MODE_BURST_DATA, 0x9246, 0x02,
+ I2C_MODE_BURST_DATA, 0x8068, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F46, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0x1049, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x8046, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A9D, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x4846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE9FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x3B46, 0x02,
+ I2C_MODE_BURST_DATA, 0x5246, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x0095, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x664D, 0x02,
+ I2C_MODE_BURST_DATA, 0x26BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x6848, 0x02,
+ I2C_MODE_BURST_DATA, 0x0021, 0x02,
+ I2C_MODE_BURST_DATA, 0x8279, 0x02,
+ I2C_MODE_BURST_DATA, 0x05EB, 0x02,
+ I2C_MODE_BURST_DATA, 0xC100, 0x02,
+ I2C_MODE_BURST_DATA, 0x038E, 0x02,
+ I2C_MODE_BURST_DATA, 0x478E, 0x02,
+ I2C_MODE_BURST_DATA, 0x5343, 0x02,
+ I2C_MODE_BURST_DATA, 0x9EB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x5743, 0x02,
+ I2C_MODE_BURST_DATA, 0xBBB2, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1278, 0x02,
+ I2C_MODE_BURST_DATA, 0xB742, 0x02,
+ I2C_MODE_BURST_DATA, 0x04D2, 0x02,
+ I2C_MODE_BURST_DATA, 0xF61B, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF2F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0026, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1678, 0x02,
+ I2C_MODE_BURST_DATA, 0x9F42, 0x02,
+ I2C_MODE_BURST_DATA, 0x04D2, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB1B, 0x02,
+ I2C_MODE_BURST_DATA, 0xB3FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF2F3, 0x02,
+ I2C_MODE_BURST_DATA, 0x9BB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x491C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0686, 0x02,
+ I2C_MODE_BURST_DATA, 0xC9B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x4386, 0x02,
+ I2C_MODE_BURST_DATA, 0x0429, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD3, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x4846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x5148, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0228, 0x02,
+ I2C_MODE_BURST_DATA, 0x0AD8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5249, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x2867, 0x02,
+ I2C_MODE_BURST_DATA, 0x81F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7003, 0x02,
+ I2C_MODE_BURST_DATA, 0x85F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A00, 0x02,
+ I2C_MODE_BURST_DATA, 0xE872, 0x02,
+ I2C_MODE_BURST_DATA, 0xA872, 0x02,
+ I2C_MODE_BURST_DATA, 0x85F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6400, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF88F, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x1646, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5143, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5242, 0x02,
+ I2C_MODE_BURST_DATA, 0x9942, 0x02,
+ I2C_MODE_BURST_DATA, 0x01D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9142, 0x02,
+ I2C_MODE_BURST_DATA, 0x05D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4348, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D00, 0x02,
+ I2C_MODE_BURST_DATA, 0xC01E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0728, 0x02,
+ I2C_MODE_BURST_DATA, 0x30D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x9942, 0x02,
+ I2C_MODE_BURST_DATA, 0x02D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4348, 0x02,
+ I2C_MODE_BURST_DATA, 0x851F, 0x02,
+ I2C_MODE_BURST_DATA, 0x07E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9142, 0x02,
+ I2C_MODE_BURST_DATA, 0x03D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4048, 0x02,
+ I2C_MODE_BURST_DATA, 0x1230, 0x02,
+ I2C_MODE_BURST_DATA, 0x851F, 0x02,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x3F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x851F, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x8041, 0x02,
+ I2C_MODE_BURST_DATA, 0x4A89, 0x02,
+ I2C_MODE_BURST_DATA, 0x2280, 0x02,
+ I2C_MODE_BURST_DATA, 0x8989, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D4A, 0x02,
+ I2C_MODE_BURST_DATA, 0x2181, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC71C, 0x02,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6439, 0x02,
+ I2C_MODE_BURST_DATA, 0x5943, 0x02,
+ I2C_MODE_BURST_DATA, 0x6160, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFA25, 0x02,
+ I2C_MODE_BURST_DATA, 0x4AB1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4908, 0x02,
+ I2C_MODE_BURST_DATA, 0x6160, 0x02,
+ I2C_MODE_BURST_DATA, 0xE160, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x3246, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0800, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x81FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x02E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x6081, 0x02,
+ I2C_MODE_BURST_DATA, 0xE060, 0x02,
+ I2C_MODE_BURST_DATA, 0x3246, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x76BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x8041, 0x02,
+ I2C_MODE_BURST_DATA, 0x87B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x0880, 0x02,
+ I2C_MODE_BURST_DATA, 0x2448, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A28, 0x02,
+ I2C_MODE_BURST_DATA, 0x23D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x2548, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A46, 0x02,
+ I2C_MODE_BURST_DATA, 0x2749, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C38, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x69FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x264C, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5145, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2268, 0x02,
+ I2C_MODE_BURST_DATA, 0x0198, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x6846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x62FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F49, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C48, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x1031, 0x02,
+ I2C_MODE_BURST_DATA, 0x801D, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x56FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x2268, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x5244, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x0498, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x92FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x03A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x50FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x07B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x30BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B48, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x4169, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D0C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8EB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x25FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x45FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A2C, 0x02,
+ I2C_MODE_BURST_DATA, 0x02D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0F49, 0x02,
+ I2C_MODE_BURST_DATA, 0x0120, 0x02,
+ I2C_MODE_BURST_DATA, 0x4880, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x1AE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0DC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x08D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D10, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB632, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB60C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF50, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE000, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xFABA, 0x02,
+ I2C_MODE_BURST_DATA, 0x30B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x8368, 0x02,
+ I2C_MODE_BURST_DATA, 0x0024, 0x02,
+ I2C_MODE_BURST_DATA, 0x32B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xFE4A, 0x02,
+ I2C_MODE_BURST_DATA, 0x5D88, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5F20, 0x02,
+ I2C_MODE_BURST_DATA, 0xAA42, 0x02,
+ I2C_MODE_BURST_DATA, 0x00D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1446, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x8041, 0x02,
+ I2C_MODE_BURST_DATA, 0x1A88, 0x02,
+ I2C_MODE_BURST_DATA, 0x4A80, 0x02,
+ I2C_MODE_BURST_DATA, 0x5A88, 0x02,
+ I2C_MODE_BURST_DATA, 0x121B, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A80, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A88, 0x02,
+ I2C_MODE_BURST_DATA, 0xCA80, 0x02,
+ I2C_MODE_BURST_DATA, 0xDA88, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D8B, 0x02,
+ I2C_MODE_BURST_DATA, 0x2A44, 0x02,
+ I2C_MODE_BURST_DATA, 0x2244, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A81, 0x02,
+ I2C_MODE_BURST_DATA, 0xDA89, 0x02,
+ I2C_MODE_BURST_DATA, 0x4A81, 0x02,
+ I2C_MODE_BURST_DATA, 0x1A8A, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A81, 0x02,
+ I2C_MODE_BURST_DATA, 0x5A8B, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A82, 0x02,
+ I2C_MODE_BURST_DATA, 0x0279, 0x02,
+ I2C_MODE_BURST_DATA, 0x012A, 0x02,
+ I2C_MODE_BURST_DATA, 0x03D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A8B, 0x02,
+ I2C_MODE_BURST_DATA, 0x4A83, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A7F, 0x02,
+ I2C_MODE_BURST_DATA, 0x8A83, 0x02,
+ I2C_MODE_BURST_DATA, 0xDA8A, 0x02,
+ I2C_MODE_BURST_DATA, 0xCA82, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A83, 0x02,
+ I2C_MODE_BURST_DATA, 0x0268, 0x02,
+ I2C_MODE_BURST_DATA, 0x1378, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BB9, 0x02,
+ I2C_MODE_BURST_DATA, 0x5278, 0x02,
+ I2C_MODE_BURST_DATA, 0x02B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x4A82, 0x02,
+ I2C_MODE_BURST_DATA, 0x0068, 0x02,
+ I2C_MODE_BURST_DATA, 0x0088, 0x02,
+ I2C_MODE_BURST_DATA, 0x40BA, 0x02,
+ I2C_MODE_BURST_DATA, 0x8882, 0x02,
+ I2C_MODE_BURST_DATA, 0x30BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0xE548, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xC169, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D0C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8EB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB9FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xDEFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF506, 0x02,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD48, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A10, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD48, 0x02,
+ I2C_MODE_BURST_DATA, 0x29B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xD816, 0x02,
+ I2C_MODE_BURST_DATA, 0x4900, 0x02,
+ I2C_MODE_BURST_DATA, 0x41EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4221, 0x02,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF71, 0x02,
+ I2C_MODE_BURST_DATA, 0x01EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4221, 0x02,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8211, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x98BA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0xCF48, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E46, 0x02,
+ I2C_MODE_BURST_DATA, 0x026A, 0x02,
+ I2C_MODE_BURST_DATA, 0x150C, 0x02,
+ I2C_MODE_BURST_DATA, 0x97B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x8BFA, 0x02,
+ I2C_MODE_BURST_DATA, 0xCD48, 0x02,
+ I2C_MODE_BURST_DATA, 0x007E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0428, 0x02,
+ I2C_MODE_BURST_DATA, 0x01D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4E05, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xAEFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x7ABA, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0xC048, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x416A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D0C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8EB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x6FFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9EFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF506, 0x02,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xB848, 0x02,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A10, 0x02,
+ I2C_MODE_BURST_DATA, 0xB848, 0x02,
+ I2C_MODE_BURST_DATA, 0x29B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xD816, 0x02,
+ I2C_MODE_BURST_DATA, 0x4900, 0x02,
+ I2C_MODE_BURST_DATA, 0x41EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4221, 0x02,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF71, 0x02,
+ I2C_MODE_BURST_DATA, 0x01EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4221, 0x02,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8211, 0x02,
+ I2C_MODE_BURST_DATA, 0xB348, 0x02,
+ I2C_MODE_BURST_DATA, 0xB349, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4E00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0880, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x49BA, 0x02,
+ I2C_MODE_BURST_DATA, 0xFCB5, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE4A, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFA35, 0x02,
+ I2C_MODE_BURST_DATA, 0x012B, 0x02,
+ I2C_MODE_BURST_DATA, 0x2CD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0025, 0x02,
+ I2C_MODE_BURST_DATA, 0x028A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0092, 0x02,
+ I2C_MODE_BURST_DATA, 0x808D, 0x02,
+ I2C_MODE_BURST_DATA, 0x0190, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x6E46, 0x02,
+ I2C_MODE_BURST_DATA, 0x8027, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F02, 0x02,
+ I2C_MODE_BURST_DATA, 0x25FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x02F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x02F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0x56F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2240, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A18, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFC31, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B02, 0x02,
+ I2C_MODE_BURST_DATA, 0xA3F5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0043, 0x02,
+ I2C_MODE_BURST_DATA, 0x6343, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0xE37C, 0x02,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C53, 0x02,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x2353, 0x02,
+ I2C_MODE_BURST_DATA, 0x82F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xFC31, 0x02,
+ I2C_MODE_BURST_DATA, 0x92F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C32, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B02, 0x02,
+ I2C_MODE_BURST_DATA, 0x6343, 0x02,
+ I2C_MODE_BURST_DATA, 0xDC17, 0x02,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1453, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B15, 0x02,
+ I2C_MODE_BURST_DATA, 0x82F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C32, 0x02,
+ I2C_MODE_BURST_DATA, 0x1028, 0x02,
+ I2C_MODE_BURST_DATA, 0xDBD3, 0x02,
+ I2C_MODE_BURST_DATA, 0xFCBD, 0x02,
+ I2C_MODE_BURST_DATA, 0xD2F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C5C, 0x02,
+ I2C_MODE_BURST_DATA, 0xD0E7, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF34F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x8C48, 0x02,
+ I2C_MODE_BURST_DATA, 0x8FB0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x816A, 0x02,
+ I2C_MODE_BURST_DATA, 0x88B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0x114B, 0x02,
+ I2C_MODE_BURST_DATA, 0x8246, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x04FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x1099, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x37FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x8748, 0x02,
+ I2C_MODE_BURST_DATA, 0x0079, 0x02,
+ I2C_MODE_BURST_DATA, 0x0128, 0x02,
+ I2C_MODE_BURST_DATA, 0x7BD1, 0x02,
+ I2C_MODE_BURST_DATA, 0x884F, 0x02,
+ I2C_MODE_BURST_DATA, 0x894E, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A07, 0x02,
+ I2C_MODE_BURST_DATA, 0xA6F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4005, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6100, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x1BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x844C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8449, 0x02,
+ I2C_MODE_BURST_DATA, 0x8548, 0x02,
+ I2C_MODE_BURST_DATA, 0x626C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8846, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E90, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x23FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x9AFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x606C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1FFA, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x606C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x20FA, 0x02,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF091, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x06E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE2E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4010, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x18FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A07, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6100, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x17D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x7249, 0x02,
+ I2C_MODE_BURST_DATA, 0xE26C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E98, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xFAF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x71FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0xE06C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xF6F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0xE06C, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xF7F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x06E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4810, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x5E4E, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A17, 0x02,
+ I2C_MODE_BURST_DATA, 0x8036, 0x02,
+ I2C_MODE_BURST_DATA, 0xA6F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x4005, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6200, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0xB846, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x19D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x5D49, 0x02,
+ I2C_MODE_BURST_DATA, 0xA26D, 0x02,
+ I2C_MODE_BURST_DATA, 0x0F46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E98, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xCEF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x45FF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0xA06D, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xCAF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0xA06D, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xCBF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x4F46, 0x02,
+ I2C_MODE_BURST_DATA, 0x18B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x07E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE4E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5410, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xC3F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x98F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9A17, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6200, 0x02,
+ I2C_MODE_BURST_DATA, 0x98F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4406, 0x02,
+ I2C_MODE_BURST_DATA, 0x0328, 0x02,
+ I2C_MODE_BURST_DATA, 0x17D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0023, 0x02,
+ I2C_MODE_BURST_DATA, 0x4A49, 0x02,
+ I2C_MODE_BURST_DATA, 0x226E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E98, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA5F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x1098, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x1CFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x206E, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA1F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x206E, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA2F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8404, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x06E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0123, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6E7, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C10, 0x02,
+ I2C_MODE_BURST_DATA, 0x07A8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9CF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x11B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x49B9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x2748, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xC06A, 0x02,
+ I2C_MODE_BURST_DATA, 0x87B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x050C, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x3DF9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xDC06, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3310, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7266, 0x02,
+ I2C_MODE_BURST_DATA, 0x4843, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7206, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x81F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x8046, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7266, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x29F9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xB801, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xD111, 0x02,
+ I2C_MODE_BURST_DATA, 0xC008, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1649, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x8410, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0x2249, 0x02,
+ I2C_MODE_BURST_DATA, 0x0880, 0x02,
+ I2C_MODE_BURST_DATA, 0x4046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF081, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0646, 0x02,
+ I2C_MODE_BURST_DATA, 0x1048, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x006B, 0x02,
+ I2C_MODE_BURST_DATA, 0x84B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x050C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0EF9, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x60F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D48, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x7E43, 0x02,
+ I2C_MODE_BURST_DATA, 0xC188, 0x02,
+ I2C_MODE_BURST_DATA, 0x0129, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4201, 0x02,
+ I2C_MODE_BURST_DATA, 0x521C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E89, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
+ I2C_MODE_BURST_DATA, 0x8041, 0x02,
+ I2C_MODE_BURST_DATA, 0xCE52, 0x02,
+ I2C_MODE_BURST_DATA, 0x9B1C, 0x02,
+ I2C_MODE_BURST_DATA, 0x9BB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x082A, 0x02,
+ I2C_MODE_BURST_DATA, 0xF4D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x21E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1020, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D20, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AA0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xADC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF40A, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x2458, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEE10, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x198C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF770, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x14E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C30, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1ED4, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x2178, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF646, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0x7040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xCFB8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0746, 0x02,
+ I2C_MODE_BURST_DATA, 0x5348, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x406B, 0x02,
+ I2C_MODE_BURST_DATA, 0x85B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x060C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xC2F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2146, 0x02,
+ I2C_MODE_BURST_DATA, 0x3846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x18F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x4D49, 0x02,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x30B9, 0x02,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9803, 0x02,
+ I2C_MODE_BURST_DATA, 0x0228, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FD1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xA003, 0x02,
+ I2C_MODE_BURST_DATA, 0x60B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C06, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4610, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C06, 0x02,
+ I2C_MODE_BURST_DATA, 0xA16C, 0x02,
+ I2C_MODE_BURST_DATA, 0xD4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xA006, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0xC4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xA006, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9FB8, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xF371, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xF7F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x394C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xCD61, 0x02,
+ I2C_MODE_BURST_DATA, 0x6060, 0x02,
+ I2C_MODE_BURST_DATA, 0x3A48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xEFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F11, 0x02,
+ I2C_MODE_BURST_DATA, 0xA060, 0x02,
+ I2C_MODE_BURST_DATA, 0x3748, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE8F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x374D, 0x02,
+ I2C_MODE_BURST_DATA, 0x2060, 0x02,
+ I2C_MODE_BURST_DATA, 0x4BF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0810, 0x02,
+ I2C_MODE_BURST_DATA, 0x298F, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x288F, 0x02,
+ I2C_MODE_BURST_DATA, 0x344A, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBF11, 0x02,
+ I2C_MODE_BURST_DATA, 0x42F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2010, 0x02,
+ I2C_MODE_BURST_DATA, 0x401C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2887, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x5761, 0x02,
+ I2C_MODE_BURST_DATA, 0x3048, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD3F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD51, 0x02,
+ I2C_MODE_BURST_DATA, 0xE060, 0x02,
+ I2C_MODE_BURST_DATA, 0x2D48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xCCF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x7361, 0x02,
+ I2C_MODE_BURST_DATA, 0x2061, 0x02,
+ I2C_MODE_BURST_DATA, 0x2948, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xC5F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x9751, 0x02,
+ I2C_MODE_BURST_DATA, 0xE060, 0x02,
+ I2C_MODE_BURST_DATA, 0x2748, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBEF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x3B51, 0x02,
+ I2C_MODE_BURST_DATA, 0x6061, 0x02,
+ I2C_MODE_BURST_DATA, 0x2548, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB7F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB41, 0x02,
+ I2C_MODE_BURST_DATA, 0xA061, 0x02,
+ I2C_MODE_BURST_DATA, 0x2248, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x5741, 0x02,
+ I2C_MODE_BURST_DATA, 0xE061, 0x02,
+ I2C_MODE_BURST_DATA, 0x2048, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x9531, 0x02,
+ I2C_MODE_BURST_DATA, 0x6062, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x1121, 0x02,
+ I2C_MODE_BURST_DATA, 0xA062, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x9BF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xBD11, 0x02,
+ I2C_MODE_BURST_DATA, 0xE062, 0x02,
+ I2C_MODE_BURST_DATA, 0x1848, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x3911, 0x02,
+ I2C_MODE_BURST_DATA, 0x2063, 0x02,
+ I2C_MODE_BURST_DATA, 0x1648, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x8DF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xD741, 0x02,
+ I2C_MODE_BURST_DATA, 0x6063, 0x02,
+ I2C_MODE_BURST_DATA, 0x1348, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x86F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2062, 0x02,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3AC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x01A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x91EF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xADA1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x9079, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0AD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C0F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C9F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFDA1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1669, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFB9D, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xF9ED, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x7D39, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD51, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFD8B, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x22CB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x4851, 0x02,
+ I2C_MODE_BURST_DATA, 0x49F2, 0x02,
+ I2C_MODE_BURST_DATA, 0xED7C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x49F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x790C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x48F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xE97C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xA15C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB3C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x5D4C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x6F4C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xA15C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x9D3C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x44F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x510C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xED1C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x395C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x46F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x3D2C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0xF55C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x077C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x46F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x3F3C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4DF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x515C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x8B5C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x010C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x42F2, 0x02,
+ I2C_MODE_BURST_DATA, 0xCB2C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xBF1C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x2F1C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x20C4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0172, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3EAE, 0x02,
+
+
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2A, 0x0110, 0x02,
+ 0x1D22, 0x0658, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0400, 0x0004, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1030, 0x1D97, 0x02,
+ 0x1032, 0x1D97, 0x02,
+ 0x1034, 0x1D33, 0x02,
+ 0x1036, 0x1D33, 0x02,
+ 0xAC52, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0832, 0x0100, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1018, 0x0901, 0x02,
+ 0xDE9E, 0x0000, 0x02,
+ 0xDEA0, 0x0000, 0x02,
+ 0xDEA2, 0x0000, 0x02,
+ 0xDEA4, 0x0000, 0x02,
+ 0xDED2, 0x0000, 0x02,
+ 0xDED4, 0x0000, 0x02,
+ 0xDED6, 0x0000, 0x02,
+ 0xDED8, 0x0000, 0x02,
+ 0xD7DE, 0x0101, 0x02,
+ 0xD7E0, 0x0101, 0x02,
+ 0xD7E2, 0x0100, 0x02,
+ 0xB664, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0x3014, 0x0101, 0x02,
+ 0x3016, 0x0000, 0x02,
+ 0x3018, 0x0000, 0x02,
+ 0x301A, 0x0001, 0x02,
+ 0x301C, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1AC4, 0x0000, 0x02,
+ 0x1AC6, 0x0000, 0x02,
+ 0x10AC, 0x0001, 0x02,
+ 0x10B4, 0x0000, 0x02,
+ 0x10DE, 0x0000, 0x02,
+ 0x10E6, 0x0202, 0x02,
+ 0x1122, 0x0000, 0x02,
+ 0x1134, 0x0000, 0x02,
+ 0x1136, 0x0000, 0x02,
+ 0x114E, 0x0004, 0x02,
+ 0x115A, 0x0000, 0x02,
+ 0x10AE, 0x0203, 0x02,
+ 0x10B4, 0x0000, 0x02,
+ 0x10E0, 0x0000, 0x02,
+ 0x10E6, 0x0202, 0x02,
+ 0x1124, 0x0000, 0x02,
+ 0x1138, 0x0000, 0x02,
+ 0x113A, 0x0000, 0x02,
+ 0x1150, 0x0004, 0x02,
+ 0x115C, 0x0103, 0x02,
+ 0x10B0, 0x0401, 0x02,
+ 0x10B6, 0x0000, 0x02,
+ 0x10E2, 0x0000, 0x02,
+ 0x10E8, 0x0202, 0x02,
+ 0x1128, 0x0000, 0x02,
+ 0x1140, 0x0000, 0x02,
+ 0x1142, 0x0000, 0x02,
+ 0x1154, 0x0004, 0x02,
+ 0x115E, 0x0201, 0x02,
+ 0xB062, 0x06F9, 0x02,
+ 0xB064, 0x0530, 0x02,
+ 0xB066, 0x076C, 0x02,
+ 0xB06C, 0x06A0, 0x02,
+ 0xAE10, 0x1551, 0x02,
+ 0xAE24, 0x0400, 0x02,
+ 0xAE0C, 0x03FA, 0x02,
+ 0xACDA, 0x0A0E, 0x02,
+ 0xACEA, 0x0A0E, 0x02,
+ 0xAD9C, 0x0709, 0x02,
+ 0xADAC, 0x0709, 0x02,
+ 0xAE7C, 0x8562, 0x02,
+ 0xAE7E, 0x0380, 0x02,
+ 0xAE80, 0x4050, 0x02,
+ 0xAC7A, 0x0504, 0x02,
+ 0xAC8A, 0x0504, 0x02,
+ 0xAC9A, 0x0504, 0x02,
+ 0xAD68, 0x0002, 0x02,
+ 0xAD6A, 0x1848, 0x02,
+ 0xAD3E, 0x0042, 0x02,
+ 0xAE1A, 0x0012, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF44A, 0x000C, 0x02,
+ 0xF44C, 0x000A, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAE16, 0x0018, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF450, 0x0018, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x220A, 0x0065, 0x02,
+ 0x222A, 0x005F, 0x02,
+ 0x3CEA, 0xFF6E, 0x02,
+ 0x3DEA, 0x0020, 0x02,
+ 0x3E0A, 0x0020, 0x02,
+ 0xACDE, 0x0A0E, 0x02,
+ 0xACEE, 0x0A0E, 0x02,
+ 0xADA0, 0x0709, 0x02,
+ 0xADB0, 0x0709, 0x02,
+ 0xAC7E, 0x0504, 0x02,
+ 0xAC8E, 0x0504, 0x02,
+ 0xAC9E, 0x0504, 0x02,
+ 0xAD78, 0x0002, 0x02,
+ 0xAD7A, 0x1848, 0x02,
+ 0xAD46, 0x0042, 0x02,
+ 0x2212, 0x00C9, 0x02,
+ 0x2232, 0x00C3, 0x02,
+ 0x2BD2, 0x0007, 0x02,
+ 0x3A72, 0x0021, 0x02,
+ 0x3A92, 0x001F, 0x02,
+ 0x3AB2, 0x0015, 0x02,
+ 0x3AD2, 0x0013, 0x02,
+ 0x3AF2, 0x0009, 0x02,
+ 0x3B92, 0x0025, 0x02,
+ 0x3BB2, 0x0023, 0x02,
+ 0x3BD2, 0x0019, 0x02,
+ 0x3BF2, 0x0017, 0x02,
+ 0x3C12, 0x000D, 0x02,
+ 0x3C32, 0x000B, 0x02,
+ 0x3C52, 0x0001, 0x02,
+ 0x3C72, 0xFFFF, 0x02,
+ 0x3C92, 0xFFF5, 0x02,
+ 0x3CF2, 0xFE96, 0x02,
+ 0x3D12, 0x0104, 0x02,
+ 0x3DF2, 0x0020, 0x02,
+ 0x3E12, 0x0020, 0x02,
+ 0xACE2, 0x0A0E, 0x02,
+ 0xACF2, 0x0A0E, 0x02,
+ 0xADA4, 0x0709, 0x02,
+ 0xADB4, 0x0709, 0x02,
+ 0xAC82, 0x0504, 0x02,
+ 0xAC92, 0x0504, 0x02,
+ 0xACA2, 0x0504, 0x02,
+ 0xAD88, 0x0002, 0x02,
+ 0xAD8A, 0x1848, 0x02,
+ 0xAD4E, 0x0042, 0x02,
+ 0x217A, 0x0008, 0x02,
+ 0x221A, 0x01C1, 0x02,
+ 0x223A, 0x01BB, 0x02,
+ 0x2BDA, 0x0007, 0x02,
+ 0x3A7A, 0x0021, 0x02,
+ 0x3A9A, 0x001F, 0x02,
+ 0x3ABA, 0x0015, 0x02,
+ 0x3ADA, 0x0013, 0x02,
+ 0x3AFA, 0x0009, 0x02,
+ 0x3B9A, 0x0025, 0x02,
+ 0x3BBA, 0x0023, 0x02,
+ 0x3BDA, 0x0019, 0x02,
+ 0x3BFA, 0x0017, 0x02,
+ 0x3C1A, 0x000D, 0x02,
+ 0x3C3A, 0x000B, 0x02,
+ 0x3C5A, 0x0001, 0x02,
+ 0x3C7A, 0xFFFF, 0x02,
+ 0x3C9A, 0xFFF5, 0x02,
+ 0x3CFA, 0xFCE0, 0x02,
+ 0x3D1A, 0x0344, 0x02,
+ 0x3DFA, 0x0020, 0x02,
+ 0x3E1A, 0x0020, 0x02,
+ 0xADB8, 0x0606, 0x02,
+ 0xADC8, 0x0606, 0x02,
+ 0xAD98, 0x0707, 0x02,
+ 0xADA8, 0x0707, 0x02,
+ 0xAC76, 0x0A0A, 0x02,
+ 0xAC86, 0x0A0A, 0x02,
+ 0xAC96, 0x0A0A, 0x02,
+ 0xAD36, 0x0042, 0x02,
+ 0x2162, 0x0007, 0x02,
+ 0x3CE2, 0xFF66, 0x02,
+ 0xADB8, 0x0606, 0x02,
+ 0xADC8, 0x0606, 0x02,
+ 0xAD98, 0x0707, 0x02,
+ 0xADA8, 0x0707, 0x02,
+ 0xAC76, 0x0A0A, 0x02,
+ 0xAC86, 0x0A0A, 0x02,
+ 0xAC96, 0x0A0A, 0x02,
+ 0xAD38, 0x0042, 0x02,
+ 0x1EC4, 0x0006, 0x02,
+ 0x1EE4, 0x0028, 0x02,
+ 0x1F04, 0x0028, 0x02,
+ 0x1F24, 0x0028, 0x02,
+ 0x1F44, 0x0028, 0x02,
+ 0x2104, 0xFFD8, 0x02,
+ 0x2124, 0xFFD8, 0x02,
+ 0x2164, 0x0036, 0x02,
+ 0x2184, 0x0030, 0x02,
+ 0x2204, 0x00C1, 0x02,
+ 0x2224, 0x00BB, 0x02,
+ 0x28C4, 0x0004, 0x02,
+ 0x28E4, 0x0011, 0x02,
+ 0x2904, 0x0032, 0x02,
+ 0x2A84, 0x0008, 0x02,
+ 0x2AA4, 0x0006, 0x02,
+ 0x2D44, 0x0002, 0x02,
+ 0x2D64, 0x0006, 0x02,
+ 0x2DA4, 0x003B, 0x02,
+ 0x2DC4, 0x002B, 0x02,
+ 0x2DE4, 0x0043, 0x02,
+ 0x2E04, 0x0033, 0x02,
+ 0x2E24, 0x0043, 0x02,
+ 0x2E44, 0x0014, 0x02,
+ 0x2E64, 0x0007, 0x02,
+ 0x2F64, 0x0007, 0x02,
+ 0x3144, 0x0007, 0x02,
+ 0x3164, 0x0004, 0x02,
+ 0x3244, 0x0007, 0x02,
+ 0x3264, 0x0004, 0x02,
+ 0x3464, 0x0007, 0x02,
+ 0x34A4, 0x0006, 0x02,
+ 0x3764, 0x0006, 0x02,
+ 0x37E4, 0x0007, 0x02,
+ 0x3844, 0x0020, 0x02,
+ 0x3CA4, 0x0007, 0x02,
+ 0x3CE4, 0xFF9C, 0x02,
+ 0x3D24, 0x0002, 0x02,
+ 0x3D44, 0x0013, 0x02,
+ 0x3DA4, 0x0040, 0x02,
+ 0x3DC4, 0x0040, 0x02,
+ 0x3DE4, 0x00A0, 0x02,
+ 0x3E04, 0x00A0, 0x02,
+ 0x3E24, 0x00A0, 0x02,
+ 0x3E44, 0x00A0, 0x02,
+ 0x5764, 0x0010, 0x02,
+ 0x57C4, 0x0009, 0x02,
+ 0x57E4, 0x000B, 0x02,
+ 0x5804, 0x0007, 0x02,
+ 0xADBA, 0x0206, 0x02,
+ 0xADCA, 0x0206, 0x02,
+ 0xAD9A, 0x0907, 0x02,
+ 0xADAA, 0x0907, 0x02,
+ 0xAC78, 0x080A, 0x02,
+ 0xAC88, 0x080A, 0x02,
+ 0xAC98, 0x080A, 0x02,
+ 0xAD3C, 0x0042, 0x02,
+ 0x1162, 0xFCFC, 0x02,
+ 0x1164, 0x1050, 0x02,
+ 0x128E, 0x2000, 0x02,
+ 0x1290, 0x1770, 0x02,
+ 0x13BA, 0x2000, 0x02,
+ 0x13BC, 0x0000, 0x02,
+ 0x14E6, 0x2000, 0x02,
+ 0x14E8, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x3024_30fps_mode2_dram_test_section1[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3AA4, 0x00E4, 0x02,
+ 0x3AA6, 0x0000, 0x02,
+ 0x3AA8, 0x0000, 0x02,
+ 0x3AAA, 0x0000, 0x02,
+ 0x3AAC, 0x0000, 0x02,
+ 0x3AAE, 0x0000, 0x02,
+ 0x3AB0, 0x0000, 0x02,
+ 0x3AB2, 0x0000, 0x02,
+ 0x3AB4, 0x0000, 0x02,
+ 0x3AB6, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0342, 0x0B20, 0x02,
+ 0x3040, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x107E, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0344, 0x0038, 0x02,
+ 0x0348, 0x1FC6, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x034A, 0x0BDF, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x0BD0, 0x02,
+ 0x0BC2, 0x0000, 0x02,
+ 0x0BC6, 0x0000, 0x02,
+ 0x0408, 0x0004, 0x02,
+ 0x040A, 0x0008, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD7D6, 0x0000, 0x02,
+ 0xD7DA, 0x0000, 0x02,
+ 0xD7D4, 0x0000, 0x02,
+ 0xD7D8, 0x0000, 0x02,
+ 0xD72E, 0x0000, 0x02,
+ 0xD730, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0111, 0x02,
+ 0x303E, 0x0110, 0x02,
+ 0x303C, 0x0001, 0x02,
+ 0x3072, 0x0300, 0x02,
+ 0x3074, 0x0002, 0x02,
+ 0x3096, 0x002B, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0x1050, 0x0000, 0x02,
+ 0xB6B0, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3068, 0x0102, 0x02,
+ 0x0B30, 0x0100, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xAC5E, 0x00A0, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD10, 0x0000, 0x02,
+ 0xDD14, 0x4080, 0x02,
+ 0xDD16, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00BB, 0x02,
+ 0x0300, 0x0006, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x6D26, 0x0006, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3006, 0x0003, 0x02,
+ 0x0314, 0x0003, 0x02,
+ 0x0316, 0x00BB, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x013C, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x30AC, 0x0000, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xEA90, 0x0000, 0x02,
+ 0xE404, 0x0001, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x3010, 0x0001, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1D2E, 0x0001, 0x02,
+ 0x1082, 0x0080, 0x02,
+ 0x10A0, 0x0100, 0x02,
+ 0x10A2, 0x0100, 0x02,
+ 0xB22E, 0x045B, 0x02,
+ 0xAE88, 0x0101, 0x02,
+ 0xAE0E, 0x03B9, 0x02,
+ 0xAC60, 0xFFFF, 0x02,
+ 0xE5B8, 0x0200, 0x02,
+ 0xE5C0, 0x0403, 0x02,
+ 0xE5C2, 0x0123, 0x02,
+ 0xE5C4, 0x0200, 0x02,
+ 0xE5C6, 0x0040, 0x02,
+ 0xE5C8, 0x0111, 0x02,
+ 0xE5CA, 0x0C58, 0x02,
+ 0xE5CC, 0x0200, 0x02,
+ 0xE5CE, 0x0040, 0x02,
+ 0xE5D0, 0x0111, 0x02,
+ 0xE5D2, 0x0C58, 0x02,
+ 0xE5D4, 0x0200, 0x02,
+ 0xE5D6, 0x0040, 0x02,
+ 0xE5D8, 0x0111, 0x02,
+ 0xE5DA, 0x0C58, 0x02,
+ 0xE5DC, 0x0200, 0x02,
+ 0xE5DE, 0x0040, 0x02,
+ 0xE5E0, 0x0111, 0x02,
+ 0xE5E2, 0x0C58, 0x02,
+ 0xE5BC, 0x0000, 0x02,
+ 0xE5BE, 0x3160, 0x02,
+ 0xDD64, 0x6000, 0x02,
+ 0xDD66, 0x0000, 0x02,
+ 0xDD68, 0x0000, 0x02,
+ 0xDD6A, 0x5800, 0x02,
+ 0xDD6C, 0x020A, 0x02,
+ 0xDD6E, 0x8000, 0x02,
+ 0x1D50, 0x0100, 0x02,
+ 0x1D52, 0x0001, 0x02,
+ 0xAE88, 0x0100, 0x02,
+ 0xB680, 0x0101, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0BC0, 0x0000, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xB650, 0x0101, 0x02,
+ 0xD382, 0x0000, 0x02,
+ 0xB200, 0x0000, 0x02,
+ 0xB22C, 0x07FF, 0x02,
+ 0xB22E, 0x07FF, 0x02,
+ 0xB260, 0x07FF, 0x02,
+ 0xB262, 0x07FF, 0x02,
+ 0xB6B0, 0x0001, 0x02,
+ 0xB8D0, 0x0000, 0x02,
+ 0xB8D2, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0600, 0x0301, 0x02,
+ 0x061C, 0x0300, 0x02,
+ 0x0602, 0x02AA, 0x02,
+ 0x0604, 0x02AA, 0x02,
+ 0x0606, 0x02AA, 0x02,
+ 0x0608, 0x02AA, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x0F44, 0x0000, 0x02,
+ 0xFCFC, 0x2001, 0x02,
+ 0x3AB8, 0x0473, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xD72C, 0x000F, 0x02,
+ 0xDB90, 0x0FFF, 0x02,
+ 0xDB92, 0x1020, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x3024_30fps_mode2_dram_test_section2[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0x6214, 0x79F1, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0xDD64, 0x67D6, 0x02,
+ 0xDD66, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+const u32 sensor_2l4_setfile_B_Global_retention[] = {};
+
+const u32 sensor_2l4_setfile_B_4032x3024_30fps_retention[] = {
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0x8800, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x6214, 0x02,
+ I2C_MODE_BURST_DATA, 0x79F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x6218, 0x02,
+ I2C_MODE_BURST_DATA, 0x7150, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x107E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x30E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0344, 0x02,
+ I2C_MODE_BURST_DATA, 0x0038, 0x02,
+ I2C_MODE_BURST_DATA, 0x0348, 0x02,
+ I2C_MODE_BURST_DATA, 0x1FC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0346, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x034A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BDF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0408, 0x02,
+ I2C_MODE_BURST_DATA, 0x0005, 0x02,
+ I2C_MODE_BURST_DATA, 0x0007, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FC0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7DA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0007, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD72E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0382, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0386, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0900, 0x02,
+ I2C_MODE_BURST_DATA, 0x0111, 0x02,
+ I2C_MODE_BURST_DATA, 0x303E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0110, 0x02,
+ I2C_MODE_BURST_DATA, 0x303C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3072, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x3096, 0x02,
+ I2C_MODE_BURST_DATA, 0x012B, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0F44, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1032, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1292, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x13BE, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x14EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2217, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3068, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B30, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0304, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x030C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D26, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3006, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0314, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x030E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x013C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30AC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0114, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA90, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA92, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xE404, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3010, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0x10D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B20, 0x02,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x02,
+ I2C_MODE_BURST_DATA, 0x00CC, 0x02,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1108, 0x02,
+ I2C_MODE_BURST_DATA, 0x4080, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1122, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1134, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x114E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x10C2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0x10D4, 0x02,
+ I2C_MODE_BURST_DATA, 0x1640, 0x02,
+ I2C_MODE_BURST_DATA, 0x10F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x10FC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x110C, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1124, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1138, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1150, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0x10D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2C80, 0x02,
+ I2C_MODE_BURST_DATA, 0x10F4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x10FE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1114, 0x02,
+ I2C_MODE_BURST_DATA, 0x3F80, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1128, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1140, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1154, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2E, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF01, 0x02,
+ I2C_MODE_BURST_DATA, 0x1082, 0x02,
+ I2C_MODE_BURST_DATA, 0x0080, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44C, 0x02,
+ I2C_MODE_BURST_DATA, 0x000A, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44A, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0xF450, 0x02,
+ I2C_MODE_BURST_DATA, 0x0018, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB22E, 0x02,
+ I2C_MODE_BURST_DATA, 0x045B, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE88, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x03B9, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE22, 0x02,
+ I2C_MODE_BURST_DATA, 0x0080, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC60, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3904, 0x02,
+ I2C_MODE_BURST_DATA, 0x0017, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE10, 0x02,
+ I2C_MODE_BURST_DATA, 0x1551, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D98, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0012, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3906, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0110, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC62, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1AF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD8A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0044, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1294, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x00B4, 0x02,
+ I2C_MODE_BURST_DATA, 0x024C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0204, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x01D6, 0x02,
+ I2C_MODE_BURST_DATA, 0x00AE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0766, 0x02,
+ I2C_MODE_BURST_DATA, 0x00AE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0044, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x13C0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x02EE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0x08AC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0172, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0352, 0x02,
+ I2C_MODE_BURST_DATA, 0x015C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0044, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x14EC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x02B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0010, 0x02,
+ I2C_MODE_BURST_DATA, 0x015C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB88, 0x02,
+ I2C_MODE_BURST_DATA, 0x08C0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1843, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A50, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDBA8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30C6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDE9E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDED2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE5B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6C8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1090, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x2268_30fps_retention[] = {
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0x8D00, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x6214, 0x02,
+ I2C_MODE_BURST_DATA, 0x79F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x6218, 0x02,
+ I2C_MODE_BURST_DATA, 0x7150, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x107E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x30E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0344, 0x02,
+ I2C_MODE_BURST_DATA, 0x0038, 0x02,
+ I2C_MODE_BURST_DATA, 0x0348, 0x02,
+ I2C_MODE_BURST_DATA, 0x1FC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0346, 0x02,
+ I2C_MODE_BURST_DATA, 0x0160, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x034A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A5F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x08DC, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0408, 0x02,
+ I2C_MODE_BURST_DATA, 0x0005, 0x02,
+ I2C_MODE_BURST_DATA, 0x0007, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FC0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7DA, 0x02,
+ I2C_MODE_BURST_DATA, 0x08DC, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0007, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD72E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0382, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0386, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0900, 0x02,
+ I2C_MODE_BURST_DATA, 0x0111, 0x02,
+ I2C_MODE_BURST_DATA, 0x303E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0110, 0x02,
+ I2C_MODE_BURST_DATA, 0x303C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3072, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x3096, 0x02,
+ I2C_MODE_BURST_DATA, 0x012B, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0F44, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1032, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1292, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x13BE, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x14EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x2217, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3068, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B30, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0304, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x030C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D26, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3006, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0314, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x030E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x013C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30AC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0114, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA90, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA92, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xE404, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3010, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0x10D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E88, 0x02,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x02,
+ I2C_MODE_BURST_DATA, 0x00DC, 0x02,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1108, 0x02,
+ I2C_MODE_BURST_DATA, 0x4080, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1122, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1134, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x114E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x10C2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0x10D4, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D10, 0x02,
+ I2C_MODE_BURST_DATA, 0x10F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0x10FC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x110C, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1124, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1138, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1150, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0x10D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3A20, 0x02,
+ I2C_MODE_BURST_DATA, 0x10F4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x10FE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1114, 0x02,
+ I2C_MODE_BURST_DATA, 0x3F80, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1128, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1140, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1154, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2E, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF01, 0x02,
+ I2C_MODE_BURST_DATA, 0x1082, 0x02,
+ I2C_MODE_BURST_DATA, 0x0080, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44C, 0x02,
+ I2C_MODE_BURST_DATA, 0x000A, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44A, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0xF450, 0x02,
+ I2C_MODE_BURST_DATA, 0x0018, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB22E, 0x02,
+ I2C_MODE_BURST_DATA, 0x045B, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE88, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x03B9, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE22, 0x02,
+ I2C_MODE_BURST_DATA, 0x0080, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC60, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3904, 0x02,
+ I2C_MODE_BURST_DATA, 0x0017, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE10, 0x02,
+ I2C_MODE_BURST_DATA, 0x1551, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D98, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0012, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3906, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0110, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC62, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1AF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD8A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0044, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1294, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x014A, 0x02,
+ I2C_MODE_BURST_DATA, 0x00B4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0396, 0x02,
+ I2C_MODE_BURST_DATA, 0x0204, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0270, 0x02,
+ I2C_MODE_BURST_DATA, 0x00AE, 0x02,
+ I2C_MODE_BURST_DATA, 0x09B4, 0x02,
+ I2C_MODE_BURST_DATA, 0x00AE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0044, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x13C0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x08E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x02B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0352, 0x02,
+ I2C_MODE_BURST_DATA, 0x015C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0044, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x14EC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0500, 0x02,
+ I2C_MODE_BURST_DATA, 0x02B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x015C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB88, 0x02,
+ I2C_MODE_BURST_DATA, 0x08C0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1843, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A50, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDBA8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30C6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDE9E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDED2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE5B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6C8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1090, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x2268_60fps_retention[] = {
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0x9200, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x6214, 0x02,
+ I2C_MODE_BURST_DATA, 0x79F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x6218, 0x02,
+ I2C_MODE_BURST_DATA, 0x7150, 0x02,
+ I2C_MODE_BURST_DATA, 0x0342, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E88, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x107E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x30E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0344, 0x02,
+ I2C_MODE_BURST_DATA, 0x0038, 0x02,
+ I2C_MODE_BURST_DATA, 0x0348, 0x02,
+ I2C_MODE_BURST_DATA, 0x1FC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0346, 0x02,
+ I2C_MODE_BURST_DATA, 0x0160, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x034A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A5F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x08DC, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0408, 0x02,
+ I2C_MODE_BURST_DATA, 0x0005, 0x02,
+ I2C_MODE_BURST_DATA, 0x0007, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0FC0, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7DA, 0x02,
+ I2C_MODE_BURST_DATA, 0x08DC, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0007, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD72E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0382, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0386, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0900, 0x02,
+ I2C_MODE_BURST_DATA, 0x0111, 0x02,
+ I2C_MODE_BURST_DATA, 0x303E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0110, 0x02,
+ I2C_MODE_BURST_DATA, 0x303C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3072, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x3096, 0x02,
+ I2C_MODE_BURST_DATA, 0x012B, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0F44, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x1050, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1030, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B00, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B00, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3068, 0x02,
+ I2C_MODE_BURST_DATA, 0x0102, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B30, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC5E, 0x02,
+ I2C_MODE_BURST_DATA, 0x008E, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD10, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD14, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0304, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x030C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D26, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3006, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0314, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x030E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x014F, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30AC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0114, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA90, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA92, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xE404, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3010, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2E, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF01, 0x02,
+ I2C_MODE_BURST_DATA, 0x1082, 0x02,
+ I2C_MODE_BURST_DATA, 0x0080, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44C, 0x02,
+ I2C_MODE_BURST_DATA, 0x000A, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44A, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0xF450, 0x02,
+ I2C_MODE_BURST_DATA, 0x0018, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x10A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x10A2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xB22E, 0x02,
+ I2C_MODE_BURST_DATA, 0x045B, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE88, 0x02,
+ I2C_MODE_BURST_DATA, 0x0101, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x03B9, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE22, 0x02,
+ I2C_MODE_BURST_DATA, 0x0080, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC60, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB666, 0x02,
+ I2C_MODE_BURST_DATA, 0x0200, 0x02,
+ I2C_MODE_BURST_DATA, 0x0500, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xB66A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3904, 0x02,
+ I2C_MODE_BURST_DATA, 0x0017, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE10, 0x02,
+ I2C_MODE_BURST_DATA, 0x1551, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D98, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0012, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3906, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0110, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC62, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0xC29E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xCC0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1AF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD8A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD50, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD54, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD2A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD90, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD94, 0x02,
+ I2C_MODE_BURST_DATA, 0x00DC, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0128, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD96, 0x02,
+ I2C_MODE_BURST_DATA, 0x0334, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0190, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD98, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD9A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDAA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD9C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDAC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD9E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDAE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDB0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC4, 0x02,
+ I2C_MODE_BURST_DATA, 0x028A, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0064, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0578, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD6, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDCA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDDA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDCC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDDC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDCE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDDE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDE2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB88, 0x02,
+ I2C_MODE_BURST_DATA, 0x08C0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1843, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A50, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDBA8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30C6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDE9E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDED2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE5B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6C8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1090, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_1008x756_120fps_retention[] = {
+ 0x6028, 0x2001, 0x02,
+ 0x602A, 0x9700, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x6214, 0x02,
+ I2C_MODE_BURST_DATA, 0x79F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x6218, 0x02,
+ I2C_MODE_BURST_DATA, 0x7150, 0x02,
+ I2C_MODE_BURST_DATA, 0x0342, 0x02,
+ I2C_MODE_BURST_DATA, 0x0370, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x107E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x30E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0040, 0x02,
+ I2C_MODE_BURST_DATA, 0x0344, 0x02,
+ I2C_MODE_BURST_DATA, 0x0018, 0x02,
+ I2C_MODE_BURST_DATA, 0x0348, 0x02,
+ I2C_MODE_BURST_DATA, 0x1FD6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0346, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x034A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BDF, 0x02,
+ I2C_MODE_BURST_DATA, 0x03F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x02F4, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0408, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7DA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD7D8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD72E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0382, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x0386, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x0900, 0x02,
+ I2C_MODE_BURST_DATA, 0x0242, 0x02,
+ I2C_MODE_BURST_DATA, 0x303E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0120, 0x02,
+ I2C_MODE_BURST_DATA, 0x303C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0002, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3072, 0x02,
+ I2C_MODE_BURST_DATA, 0x0701, 0x02,
+ I2C_MODE_BURST_DATA, 0x0002, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x3096, 0x02,
+ I2C_MODE_BURST_DATA, 0x002B, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0F44, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1050, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1030, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D97, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D33, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3068, 0x02,
+ I2C_MODE_BURST_DATA, 0x0104, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B30, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC5E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD10, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD14, 0x02,
+ I2C_MODE_BURST_DATA, 0x4080, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0304, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x030C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D26, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3006, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0314, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0x00BB, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0006, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x030E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x013C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30AC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0114, 0x02,
+ I2C_MODE_BURST_DATA, 0x0300, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA90, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA92, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0xE404, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3010, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x1082, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44C, 0x02,
+ I2C_MODE_BURST_DATA, 0x000A, 0x02,
+ I2C_MODE_BURST_DATA, 0xF44A, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0xF450, 0x02,
+ I2C_MODE_BURST_DATA, 0x0018, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x10A0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0x10A2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xB22E, 0x02,
+ I2C_MODE_BURST_DATA, 0x049E, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE88, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0159, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE22, 0x02,
+ I2C_MODE_BURST_DATA, 0x00B0, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC60, 0x02,
+ I2C_MODE_BURST_DATA, 0x0010, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB666, 0x02,
+ I2C_MODE_BURST_DATA, 0x0200, 0x02,
+ I2C_MODE_BURST_DATA, 0x0500, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xB66A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0100, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3904, 0x02,
+ I2C_MODE_BURST_DATA, 0x0017, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xAE10, 0x02,
+ I2C_MODE_BURST_DATA, 0x1451, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D98, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0012, 0x02,
+ I2C_MODE_BURST_DATA, 0x2001, 0x02,
+ I2C_MODE_BURST_DATA, 0x3906, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0018, 0x02,
+ I2C_MODE_BURST_DATA, 0x0019, 0x02,
+ I2C_MODE_BURST_DATA, 0x0091, 0x02,
+ I2C_MODE_BURST_DATA, 0x0092, 0x02,
+ I2C_MODE_BURST_DATA, 0x011A, 0x02,
+ I2C_MODE_BURST_DATA, 0x011B, 0x02,
+ I2C_MODE_BURST_DATA, 0x0171, 0x02,
+ I2C_MODE_BURST_DATA, 0x0172, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D2A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0110, 0x02,
+ I2C_MODE_BURST_DATA, 0xAC62, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0xC29E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xCC0E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D9C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1AF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD8A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD50, 0x02,
+ I2C_MODE_BURST_DATA, 0x006C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD54, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0003, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD2A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD90, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD94, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA4, 0x02,
+ I2C_MODE_BURST_DATA, 0x006E, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD96, 0x02,
+ I2C_MODE_BURST_DATA, 0x015E, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0042, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD98, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD9A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDAA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD9C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDAC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDD9E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDAE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDB0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDA2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD4, 0x02,
+ I2C_MODE_BURST_DATA, 0x002C, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDC8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDCA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDDA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDCC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDDC, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDCE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDDE, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDE0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDD2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDDE2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDB88, 0x02,
+ I2C_MODE_BURST_DATA, 0x08C0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1843, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A50, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDBA8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0001, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0x30C6, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDE9E, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0008, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDED2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFD, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFE, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE5B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xE6C8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1090, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x3024_30fps_load_sram[] = {
+ 0x0100, 0x0003, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x1090, 0x02,
+ 0x6F12, 0x2001, 0x02,
+ 0x6F12, 0x8800, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xFF22, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0x30D0, 0x0054, 0x02,
+ 0x30D2, 0x0500, 0x02,
+ 0x0340, 0x3160, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x2268_30fps_load_sram[] = {
+ 0x0100, 0x0003, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x1090, 0x02,
+ 0x6F12, 0x2001, 0x02,
+ 0x6F12, 0x8D00, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0xFF22, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x3012, 0x0101, 0x02,
+ 0x30D0, 0x0054, 0x02,
+ 0x30D2, 0x0500, 0x02,
+ 0x0340, 0x25C0, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_4032x3024_24fps_load_sram[] = {};
+
+const u32 sensor_2l4_setfile_B_4032x2268_24fps_load_sram[] = {};
+
+const u32 sensor_2l4_setfile_B_4032x2268_60fps_load_sram[] = {
+ 0x0100, 0x0003, 0x02,
+ 0x021E, 0x0100, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x1090, 0x02,
+ 0x6F12, 0x2001, 0x02,
+ 0x6F12, 0x9200, 0x02,
+ 0x0340, 0x12E4, 0x02,
+};
+
+const u32 sensor_2l4_setfile_B_1008x756_120fps_load_sram[] = {
+ 0x0100, 0x0003, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x1090, 0x02,
+ 0x6F12, 0x2001, 0x02,
+ 0x6F12, 0x9700, 0x02,
+ 0x0340, 0x27F0, 0x02,
+};
+#endif
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x3024_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3160, /* frame_length_lines */
+ 0x0B20, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x2268_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2177500000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x12E4, /* frame_length_lines */
+ 0x0E88, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x2268_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x25C0, /* frame_length_lines */
+ 0x0E88, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x1908_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x25C0, /* frame_length_lines */
+ 0x0E88, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_3024x3024_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3160, /* frame_length_lines */
+ 0x0B20, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1512_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x62C0, /* frame_length_lines */
+ 0x0590, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1134_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x62C0, /* frame_length_lines */
+ 0x0590, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_1504x1504_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x62C0, /* frame_length_lines */
+ 0x0590, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x3024_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3E4E, /* frame_length_lines */
+ 0x0A50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x2268_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x2FD0, /* frame_length_lines */
+ 0x0D70, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x1908_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x29F8, /* frame_length_lines */
+ 0x0F50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_3024x3024_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3E4E, /* frame_length_lines */
+ 0x0A50, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x2268_60fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27D0, /* frame_length_lines */
+ 0x0670, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1512_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1404000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27C0, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1512_30fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x9F00, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1134_240fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x13F8, /* frame_length_lines */
+ 0x0370, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1134_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27C0, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1134_30fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x9F00, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_1504x1504_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27C0, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_1504x1504_30fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1352000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x9F00, /* frame_length_lines */
+ 0x0338, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_1008x756_120fps_mode2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x27F0, /* frame_length_lines */
+ 0x0370, /* line_length_pck */
+};
+
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1134_60fps_mode2_ssm_960 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x4FC0, /* frame_length_lines */
+ 0x0370, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_2016x1134_60fps_mode2_ssm_480 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x4FC0, /* frame_length_lines */
+ 0x0370, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_1280x720_60fps_mode2_ssm_960 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3900, /* frame_length_lines */
+ 0x04D0, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_1280x720_60fps_mode2_ssm_480 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1080444000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3900, /* frame_length_lines */
+ 0x04D0, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x3024_30fps_mode2_aeb_factory = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3080, /* frame_length_lines */
+ 0x0A80, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_2l4_pllinfo_B_4032x3024_30fps_mode2_aeb_factory_stage2 = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate */
+ 1011111100, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x3080, /* frame_length_lines */
+ 0x0A80, /* line_length_pck */
+};
+
+static const u32 *sensor_2l4_setfiles_B[] = {
+ sensor_2l4_setfile_B_4032x3024_30fps,
+ sensor_2l4_setfile_B_4032x2268_60fps,
+ sensor_2l4_setfile_B_4032x2268_30fps,
+ sensor_2l4_setfile_B_4032x1908_30fps,
+ sensor_2l4_setfile_B_3024x3024_30fps,
+ sensor_2l4_setfile_B_2016x1512_30fps,
+ sensor_2l4_setfile_B_2016x1134_30fps,
+ sensor_2l4_setfile_B_1504x1504_30fps,
+ sensor_2l4_setfile_B_4032x3024_24fps,
+ sensor_2l4_setfile_B_4032x2268_24fps,
+ sensor_2l4_setfile_B_4032x1908_24fps,
+ sensor_2l4_setfile_B_3024x3024_24fps,
+ sensor_2l4_setfile_B_4032x2268_60fps_mode2,
+ sensor_2l4_setfile_B_2016x1512_120fps_mode2,
+ sensor_2l4_setfile_B_2016x1512_30fps_mode2,
+ sensor_2l4_setfile_B_2016x1134_240fps_mode2,
+ sensor_2l4_setfile_B_2016x1134_120fps_mode2,
+ sensor_2l4_setfile_B_2016x1134_30fps_mode2,
+ sensor_2l4_setfile_B_1504x1504_120fps_mode2,
+ sensor_2l4_setfile_B_1504x1504_30fps_mode2,
+ sensor_2l4_setfile_B_1008x756_120fps_mode2,
+ sensor_2l4_setfile_B_2016x1134_60fps_mode2_ssm_960,
+ sensor_2l4_setfile_B_2016x1134_60fps_mode2_ssm_480,
+ sensor_2l4_setfile_B_1280x720_60fps_mode2_ssm_960,
+ sensor_2l4_setfile_B_1280x720_60fps_mode2_ssm_480,
+ sensor_2l4_setfile_B_4032x3024_30fps_mode2_dram_test_section1,
+ sensor_2l4_setfile_B_4032x3024_30fps_mode2_dram_test_section2,
+};
+
+static const u32 sensor_2l4_setfile_B_sizes[] = {
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x3024_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_60fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x1908_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_3024x3024_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1512_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1134_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1504x1504_30fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x3024_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x1908_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_3024x3024_24fps),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_60fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1512_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1512_30fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1134_240fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1134_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1134_30fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1504x1504_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1504x1504_30fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1008x756_120fps_mode2),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1134_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l4_setfile_B_2016x1134_60fps_mode2_ssm_480),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1280x720_60fps_mode2_ssm_960),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1280x720_60fps_mode2_ssm_480),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x3024_30fps_mode2_dram_test_section1),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x3024_30fps_mode2_dram_test_section2),
+};
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+static const u32 *sensor_2l4_setfiles_B_retention[] = {
+ sensor_2l4_setfile_B_4032x3024_30fps_retention,
+ sensor_2l4_setfile_B_4032x2268_30fps_retention,
+ sensor_2l4_setfile_B_4032x2268_60fps_retention,
+ sensor_2l4_setfile_B_1008x756_120fps_retention,
+};
+
+static const u32 sensor_2l4_setfile_B_sizes_retention[] = {
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x3024_30fps_retention),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_30fps_retention),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_60fps_retention),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1008x756_120fps_retention),
+};
+
+static const u32 *sensor_2l4_setfile_B_load_sram[] = {
+ sensor_2l4_setfile_B_4032x3024_30fps_load_sram,
+ sensor_2l4_setfile_B_4032x2268_30fps_load_sram,
+ sensor_2l4_setfile_B_4032x3024_24fps_load_sram,
+ sensor_2l4_setfile_B_4032x2268_24fps_load_sram,
+ sensor_2l4_setfile_B_4032x2268_60fps_load_sram,
+ sensor_2l4_setfile_B_1008x756_120fps_load_sram,
+};
+
+static const u32 sensor_2l4_setfile_B_sizes_load_sram[] = {
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x3024_30fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_30fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x3024_24fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_24fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_B_4032x2268_60fps_load_sram),
+ ARRAY_SIZE(sensor_2l4_setfile_B_1008x756_120fps_load_sram),
+};
+#endif
+
+static const struct sensor_pll_info_compact *sensor_2l4_pllinfos_B[] = {
+ &sensor_2l4_pllinfo_B_4032x3024_30fps,
+ &sensor_2l4_pllinfo_B_4032x2268_60fps,
+ &sensor_2l4_pllinfo_B_4032x2268_30fps,
+ &sensor_2l4_pllinfo_B_4032x1908_30fps,
+ &sensor_2l4_pllinfo_B_3024x3024_30fps,
+ &sensor_2l4_pllinfo_B_2016x1512_30fps,
+ &sensor_2l4_pllinfo_B_2016x1134_30fps,
+ &sensor_2l4_pllinfo_B_1504x1504_30fps,
+ &sensor_2l4_pllinfo_B_4032x3024_24fps,
+ &sensor_2l4_pllinfo_B_4032x2268_24fps,
+ &sensor_2l4_pllinfo_B_4032x1908_24fps,
+ &sensor_2l4_pllinfo_B_3024x3024_24fps,
+ &sensor_2l4_pllinfo_B_4032x2268_60fps_mode2,
+ &sensor_2l4_pllinfo_B_2016x1512_120fps_mode2,
+ &sensor_2l4_pllinfo_B_2016x1512_30fps_mode2,
+ &sensor_2l4_pllinfo_B_2016x1134_240fps_mode2,
+ &sensor_2l4_pllinfo_B_2016x1134_120fps_mode2,
+ &sensor_2l4_pllinfo_B_2016x1134_30fps_mode2,
+ &sensor_2l4_pllinfo_B_1504x1504_120fps_mode2,
+ &sensor_2l4_pllinfo_B_1504x1504_30fps_mode2,
+ &sensor_2l4_pllinfo_B_1008x756_120fps_mode2,
+ &sensor_2l4_pllinfo_B_2016x1134_60fps_mode2_ssm_960,
+ &sensor_2l4_pllinfo_B_2016x1134_60fps_mode2_ssm_480,
+ &sensor_2l4_pllinfo_B_1280x720_60fps_mode2_ssm_960,
+ &sensor_2l4_pllinfo_B_1280x720_60fps_mode2_ssm_480,
+ &sensor_2l4_pllinfo_B_4032x3024_30fps_mode2_aeb_factory,
+ &sensor_2l4_pllinfo_B_4032x3024_30fps_mode2_aeb_factory_stage2,
+};
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-2l4.h"
+#include "fimc-is-cis-2l4-setA.h"
+#include "fimc-is-cis-2l4-setB.h"
+
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "S5K2L4"
+/* #define DEBUG_2L4_PLL */
+
+static const u32 *sensor_2l4_reset_tnp;
+static u32 sensor_2l4_reset_tnp_size;
+static const u32 *sensor_2l4_global;
+static u32 sensor_2l4_global_size;
+static const u32 *sensor_2l4_dram_test_global;
+static u32 sensor_2l4_dram_test_global_size;
+static const u32 **sensor_2l4_setfiles;
+static const u32 *sensor_2l4_setfile_sizes;
+static const struct sensor_pll_info_compact **sensor_2l4_pllinfos;
+static u32 sensor_2l4_max_setfile_num;
+#ifdef CONFIG_SENSOR_RETENTION_USE
+static const u32 *sensor_2l4_global_retention;
+static u32 sensor_2l4_global_retention_size;
+static const u32 **sensor_2l4_retention;
+static const u32 *sensor_2l4_retention_size;
+static u32 sensor_2l4_max_retention_num;
+static const u32 **sensor_2l4_load_sram;
+static const u32 *sensor_2l4_load_sram_size;
+#endif
+
+static int ln_mode_delay_count;
+static u8 ln_mode_frame_count;
+
+static bool need_cancel_retention_mode;
+
+static bool sensor_2l4_cis_is_wdr_mode_on(cis_shared_data *cis_data)
+{
+ unsigned int mode = cis_data->sens_config_index_cur;
+
+ if (!fimc_is_vender_wdr_mode_on(cis_data))
+ return false;
+
+ if (mode < 0 || mode >= SENSOR_2L4_MODE_MAX) {
+ err("invalid mode(%d)!!", mode);
+ return false;
+ }
+
+ return sensor_2l4_support_wdr[mode];
+}
+
+#ifdef USE_CAMERA_EMBEDDED_HEADER
+#define SENSOR_2L4_PAGE_LENGTH 256
+#define SENSOR_2L4_VALID_TAG 0x5A
+#define SENSOR_2L4_FRAME_ID_PAGE 1
+#define SENSOR_2L4_FRAME_ID_OFFSET 194
+#define SENSOR_2L4_FLL_MSB_PAGE 1
+#define SENSOR_2L4_FLL_MSB_OFFSET 48
+#define SENSOR_2L4_FLL_LSB_PAGE 1
+#define SENSOR_2L4_FLL_LSB_OFFSET 50
+#define SENSOR_2L4_FRAME_COUNT_PAGE 0
+#define SENSOR_2L4_FRAME_COUNT_OFFSET 16
+
+#ifdef USE_CAMERA_SSM_TEST
+static int record_status;
+#endif
+static u32 frame_id_idx = (SENSOR_2L4_PAGE_LENGTH * SENSOR_2L4_FRAME_ID_PAGE) + SENSOR_2L4_FRAME_ID_OFFSET;
+static u32 fll_msb_idx = (SENSOR_2L4_PAGE_LENGTH * SENSOR_2L4_FLL_MSB_PAGE) + SENSOR_2L4_FLL_MSB_OFFSET;
+static u32 fll_lsb_idx = (SENSOR_2L4_PAGE_LENGTH * SENSOR_2L4_FLL_LSB_PAGE) + SENSOR_2L4_FLL_LSB_OFFSET;
+static u32 llp_msb_idx = (SENSOR_2L4_PAGE_LENGTH * SENSOR_2L4_FLL_MSB_PAGE) + SENSOR_2L4_FLL_MSB_OFFSET+4;
+static u32 llp_lsb_idx = (SENSOR_2L4_PAGE_LENGTH * SENSOR_2L4_FLL_LSB_PAGE) + SENSOR_2L4_FLL_LSB_OFFSET+4;
+static u32 frame_count_idx = (SENSOR_2L4_PAGE_LENGTH * SENSOR_2L4_FRAME_COUNT_PAGE) + SENSOR_2L4_FRAME_COUNT_OFFSET;
+
+static int sensor_2l4_cis_get_frame_id(struct v4l2_subdev *subdev, u8 *embedded_buf, u16 *frame_id)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ if (embedded_buf[frame_id_idx-1] == SENSOR_2L4_VALID_TAG) {
+ *frame_id = embedded_buf[frame_id_idx];
+
+ dbg_sensor(1, "%s - frame_count(%d)", __func__, embedded_buf[frame_count_idx]);
+ dbg_sensor(1, "%s - frame_id(%d)", __func__, *frame_id);
+ dbg_sensor(1, "%s - frame length line(%x)",
+ __func__, ((embedded_buf[fll_msb_idx]<<8)|embedded_buf[fll_lsb_idx]));
+ dbg_sensor(1, "%s - line length pclk(%x)",
+ __func__, ((embedded_buf[llp_msb_idx]<<8)|embedded_buf[llp_lsb_idx]));
+
+#ifdef USE_CAMERA_SSM_TEST
+ if (embedded_buf[frame_count_idx] == 254) {
+ switch (record_status) {
+ case 0:
+ fimc_is_sensor_write8(cis->client, 0x0A52, 0x01);
+ record_status++;
+ break;
+ case 1:
+ fimc_is_sensor_write8(cis->client, 0x0A54, 0x01);
+ record_status++;
+ break;
+ case 5:
+ fimc_is_sensor_write8(cis->client, 0x0A53, 0x01);
+ record_status++;
+ break;
+ case 10:
+ record_status = 0;
+ break;
+ default:
+ record_status++;
+ break;
+ }
+ }
+#endif
+ } else {
+ err("%s : invalid valid tag(%x)", __func__, embedded_buf[frame_id_idx-1]);
+ *frame_id = 1;
+ }
+
+ return ret;
+}
+#endif
+
+static void sensor_2l4_set_integration_max_margin(u32 mode, cis_shared_data *cis_data)
+{
+ WARN_ON(!cis_data);
+
+ switch (mode) {
+ case SENSOR_2L4_4032X3024_30FPS:
+ case SENSOR_2L4_4032X2268_60FPS:
+ case SENSOR_2L4_4032X2268_30FPS:
+ case SENSOR_2L4_4032X1908_30FPS:
+ case SENSOR_2L4_3024X3024_30FPS:
+ case SENSOR_2L4_4032X3024_24FPS:
+ case SENSOR_2L4_4032X2268_24FPS:
+ case SENSOR_2L4_4032X1908_24FPS:
+ case SENSOR_2L4_3024X3024_24FPS:
+ cis_data->max_margin_coarse_integration_time = 0x10;
+ dbg_sensor(1, "max_margin_coarse_integration_time(%d)\n",
+ cis_data->max_margin_coarse_integration_time);
+ break;
+ case SENSOR_2L4_2016X1512_30FPS:
+ case SENSOR_2L4_2016X1134_30FPS:
+ case SENSOR_2L4_1504X1504_30FPS:
+ cis_data->max_margin_coarse_integration_time = 0x20;
+ dbg_sensor(1, "max_margin_coarse_integration_time(%d)\n",
+ cis_data->max_margin_coarse_integration_time);
+ break;
+ case SENSOR_2L4_4032X2268_60FPS_MODE2:
+ case SENSOR_2L4_1008X756_120FPS_MODE2:
+ cis_data->max_margin_coarse_integration_time = 0x18;
+ dbg_sensor(1, "max_margin_coarse_integration_time(%d)\n",
+ cis_data->max_margin_coarse_integration_time);
+ break;
+ case SENSOR_2L4_2016X1512_120FPS_MODE2:
+ case SENSOR_2L4_2016X1512_30FPS_MODE2:
+ case SENSOR_2L4_2016X1134_240FPS_MODE2:
+ case SENSOR_2L4_2016X1134_120FPS_MODE2:
+ case SENSOR_2L4_2016X1134_30FPS_MODE2:
+ case SENSOR_2L4_1504X1504_120FPS_MODE2:
+ case SENSOR_2L4_1504X1504_30FPS_MODE2:
+ case SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_960:
+ case SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_480:
+ case SENSOR_2L4_1280X720_60FPS_MODE2_SSM_960:
+ case SENSOR_2L4_1280X720_60FPS_MODE2_SSM_480:
+ case SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1:
+ case SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2:
+ cis_data->max_margin_coarse_integration_time = SENSOR_2L4_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+ dbg_sensor(1, "max_margin_coarse_integration_time(%d)\n",
+ cis_data->max_margin_coarse_integration_time);
+ break;
+ default:
+ err("[%s] Unsupport 2l4 sensor mode\n", __func__);
+ cis_data->max_margin_coarse_integration_time = SENSOR_2L4_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+ dbg_sensor(1, "max_margin_coarse_integration_time(%d)\n",
+ cis_data->max_margin_coarse_integration_time);
+ break;
+ }
+}
+
+static void sensor_2l4_cis_data_calculation(const struct sensor_pll_info_compact *pll_info_compact,
+ cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, max_fps = 0, frame_valid_us = 0;
+
+ WARN_ON(!pll_info_compact);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info_compact->pclk;
+
+ dbg_sensor(1, "ext_clock(%d), mipi_datarate(%d), pclk(%d)\n",
+ pll_info_compact->ext_clk, pll_info_compact->mipi_datarate, pll_info_compact->pclk);
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+#ifdef CAMERA_REAR2
+ cis_data->min_sync_frame_us_time = cis_data->min_frame_us_time;
+#endif
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info_compact->frame_length_lines(%d) * pll_info_compact->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info_compact->frame_length_lines, pll_info_compact->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = (vt_pix_clk_hz * 10) / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = max_fps;
+ cis_data->frame_length_lines = pll_info_compact->frame_length_lines;
+ cis_data->line_length_pck = pll_info_compact->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck *
+ (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height *
+ (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_2L4_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = SENSOR_2L4_FINE_INTEGRATION_TIME_MAX;
+ cis_data->min_coarse_integration_time = SENSOR_2L4_COARSE_INTEGRATION_TIME_MIN;
+}
+
+void sensor_2l4_cis_data_calc(struct v4l2_subdev *subdev, u32 mode)
+{
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ if (mode >= sensor_2l4_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ return;
+ }
+
+#if 0
+ /* If check_rev fail when cis_init, one more check_rev in mode_change */
+ if (cis->rev_flag == true) {
+ cis->rev_flag = false;
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ err("sensor_2l4_check_rev is fail: ret(%d)", ret);
+ return;
+ }
+ }
+#endif
+
+ if (cis->cis_data->stream_on) {
+ info("[%s] call mode change in stream on state\n", __func__);
+ sensor_cis_wait_streamon(subdev);
+ sensor_2l4_cis_stream_off(subdev);
+ sensor_cis_wait_streamoff(subdev);
+ info("[%s] stream off done\n", __func__);
+ } else {
+ if (need_cancel_retention_mode) {
+ info("[%s] need cancel retention mode\n", __func__);
+ fimc_is_sensor_write16(cis->client, 0x602A, 0x10B4);
+ fimc_is_sensor_write16(cis->client, 0x6F12, 0x0000);
+ fimc_is_sensor_write16(cis->client, 0x6F12, 0x0000);
+ }
+ }
+
+ sensor_2l4_cis_data_calculation(sensor_2l4_pllinfos[mode], cis->cis_data);
+}
+
+static int sensor_2l4_wait_stream_off_status(cis_shared_data *cis_data)
+{
+ int ret = 0;
+ u32 timeout = 0;
+
+ WARN_ON(!cis_data);
+
+#define STREAM_OFF_WAIT_TIME 250
+ while (timeout < STREAM_OFF_WAIT_TIME) {
+ if (cis_data->is_active_area == false &&
+ cis_data->stream_on == false) {
+ pr_debug("actual stream off\n");
+ break;
+ }
+ timeout++;
+ }
+
+ if (timeout == STREAM_OFF_WAIT_TIME) {
+ pr_err("actual stream off wait timeout\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+int sensor_2l4_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read16(client, 0x0002, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Default version 2l4 sensor. Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_select_setfile(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 rev = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+ WARN_ON(!ext_info);
+
+ rev = cis->cis_data->cis_rev;
+
+ switch (rev) {
+ case 0xA000: /* 2stack */
+ case 0xA001: /* 2stack */
+ pr_info("%s setfile_A\n", __func__);
+ sensor_2l4_reset_tnp = sensor_2l4_setfile_A_Reset_TnP;
+ sensor_2l4_reset_tnp_size = ARRAY_SIZE(sensor_2l4_setfile_A_Reset_TnP);
+ sensor_2l4_global = sensor_2l4_setfile_A_Global;
+ sensor_2l4_global_size = ARRAY_SIZE(sensor_2l4_setfile_A_Global);
+ sensor_2l4_dram_test_global = sensor_2l4_setfile_A_Reset_TnP;
+ sensor_2l4_dram_test_global_size = ARRAY_SIZE(sensor_2l4_setfile_A_Reset_TnP);
+ sensor_2l4_setfiles = sensor_2l4_setfiles_A;
+ sensor_2l4_setfile_sizes = sensor_2l4_setfile_A_sizes;
+ sensor_2l4_pllinfos = sensor_2l4_pllinfos_A;
+ sensor_2l4_max_setfile_num = ARRAY_SIZE(sensor_2l4_setfiles_A);
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ sensor_2l4_global_retention = sensor_2l4_setfile_A_Global_retention;
+ sensor_2l4_global_retention_size = ARRAY_SIZE(sensor_2l4_setfile_A_Global_retention);
+ sensor_2l4_retention = sensor_2l4_setfiles_A_retention;
+ sensor_2l4_retention_size = sensor_2l4_setfile_A_sizes_retention;
+ sensor_2l4_max_retention_num = ARRAY_SIZE(sensor_2l4_setfiles_A_retention);
+ sensor_2l4_load_sram = sensor_2l4_setfile_A_load_sram;
+ sensor_2l4_load_sram_size = sensor_2l4_setfile_A_sizes_load_sram;
+ ext_info->use_retention_mode = SENSOR_RETENTION_UNSUPPORTED;
+#endif
+ break;
+ case 0xA002: /* 3stack */
+ case 0xA102: /* 3stack SHBN */
+ pr_info("%s setfile_B for 3 stack\n", __func__);
+ sensor_2l4_reset_tnp = sensor_2l4_setfile_B_Reset_TnP;
+ sensor_2l4_reset_tnp_size = ARRAY_SIZE(sensor_2l4_setfile_B_Reset_TnP);
+ sensor_2l4_global = sensor_2l4_setfile_B_Global;
+ sensor_2l4_global_size = ARRAY_SIZE(sensor_2l4_setfile_B_Global);
+ sensor_2l4_dram_test_global = sensor_2l4_setfile_B_dram_test_Global;
+ sensor_2l4_dram_test_global_size = ARRAY_SIZE(sensor_2l4_setfile_B_dram_test_Global);
+ sensor_2l4_setfiles = sensor_2l4_setfiles_B;
+ sensor_2l4_setfile_sizes = sensor_2l4_setfile_B_sizes;
+ sensor_2l4_pllinfos = sensor_2l4_pllinfos_B;
+ sensor_2l4_max_setfile_num = ARRAY_SIZE(sensor_2l4_setfiles_B);
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ sensor_2l4_global_retention = sensor_2l4_setfile_B_Global_retention;
+ sensor_2l4_global_retention_size = ARRAY_SIZE(sensor_2l4_setfile_B_Global_retention);
+ sensor_2l4_retention = sensor_2l4_setfiles_B_retention;
+ sensor_2l4_retention_size = sensor_2l4_setfile_B_sizes_retention;
+ sensor_2l4_max_retention_num = ARRAY_SIZE(sensor_2l4_setfiles_B_retention);
+ sensor_2l4_load_sram = sensor_2l4_setfile_B_load_sram;
+ sensor_2l4_load_sram_size = sensor_2l4_setfile_B_sizes_load_sram;
+#endif
+ break;
+ default:
+ err("Unsupported 2l4 sensor revision(%#x)\n", rev);
+ break;
+ }
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_global_setting_internal(struct v4l2_subdev *subdev);
+
+/* CIS OPS */
+int sensor_2l4_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+ setinfo.param = NULL;
+ setinfo.return_value = 0;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ WARN_ON(!cis->cis_data);
+
+ sensor_2l4_cis_select_setfile(subdev);
+
+ need_cancel_retention_mode = false;
+
+ cis->cis_data->stream_on = false;
+ cis->cis_data->product_name = cis->id;
+ cis->cis_data->cur_width = SENSOR_2L4_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_2L4_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->cis_data->pre_lownoise_mode = FIMC_IS_CIS_LNOFF;
+ cis->cis_data->cur_lownoise_mode = FIMC_IS_CIS_LNOFF;
+ cis->need_mode_change = false;
+ cis->long_term_mode.sen_strm_off_on_step = 0;
+ cis->long_term_mode.sen_strm_off_on_enable = false;
+
+ sensor_2l4_cis_data_calculation(sensor_2l4_pllinfos[setfile_index], cis->cis_data);
+ sensor_2l4_set_integration_max_margin(setfile_index, cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+ /* CALL_CISOPS(cis, cis_log_status, subdev); */
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+ u64 vt_pix_clk = 0;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ pr_info("[SEN:DUMP] *******************************\n");
+
+ fimc_is_sensor_read16(client, 0x0000, &data16);
+ pr_info("[SEN:DUMP] model_id(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x0002, &data16);
+ pr_info("[SEN:DUMP] revision_number(%x)\n", data16);
+ fimc_is_sensor_read8(client, 0x0005, &data8);
+ pr_info("[SEN:DUMP] frame_count(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0100, &data8);
+ pr_info("[SEN:DUMP] mode_select(%x)\n", data8);
+
+ vt_pix_clk = (EXT_CLK_Mhz * 1000 * 1000); /* ext_clk */
+
+ fimc_is_sensor_read16(client, 0x0306, &data16);
+ pr_info("[SEN:DUMP] vt_pll_multiplier(%x)\n", data16);
+ vt_pix_clk *= data16;
+
+ fimc_is_sensor_read16(client, 0x0304, &data16);
+ pr_info("[SEN:DUMP] vt_pre_pll_clk_div(%x)\n", data16);
+ vt_pix_clk /= data16;
+
+ fimc_is_sensor_read16(client, 0x0302, &data16);
+ pr_info("[SEN:DUMP] vt_sys_clk_div(%x)\n", data16);
+ vt_pix_clk /= data16;
+
+ fimc_is_sensor_read16(client, 0x0300, &data16);
+ pr_info("[SEN:DUMP] vt_pix_clk_div(%x)\n", data16);
+ vt_pix_clk /= data16;
+
+ fimc_is_sensor_read16(client, 0x030C, &data16);
+ pr_info("[SEN:DUMP] pll_post_scalar(%x)\n", data16);
+
+ pr_info("[SEN:DUMP] vt_pix_clk(%lld)\n", vt_pix_clk);
+
+ fimc_is_sensor_read16(client, 0x0340, &data16);
+ pr_info("[SEN:DUMP] frame_length_lines(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x0342, &data16);
+ pr_info("[SEN:DUMP] ine_length_pck(%x)\n", data16);
+
+ fimc_is_sensor_read16(client, 0x0202, &data16);
+ pr_info("[SEN:DUMP] coarse_integration_time(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x1004, &data16);
+ pr_info("[SEN:DUMP] coarse_integration_time_min(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x1006, &data16);
+ pr_info("[SEN:DUMP] coarse_integration_time_max_margin(%x)\n", data16);
+
+ fimc_is_sensor_read16(client, 0x0200, &data16);
+ pr_info("[SEN:DUMP] fine_integration_time(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x1008, &data16);
+ pr_info("[SEN:DUMP] fine_integration_time_min(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x100A, &data16);
+ pr_info("[SEN:DUMP] fine_integration_time_max_margin(%x)\n", data16);
+
+ fimc_is_sensor_read16(client, 0x0084, &data16);
+ pr_info("[SEN:DUMP] analogue_gain_code_min(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x0086, &data16);
+ pr_info("[SEN:DUMP] analogue_gain_code_max(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x1084, &data16);
+ pr_info("[SEN:DUMP] digital_gain_min(%x)\n", data16);
+ fimc_is_sensor_read16(client, 0x1086, &data16);
+ pr_info("[SEN:DUMP] digital_gain_max(%x)\n", data16);
+
+ pr_info("[SEN:DUMP] *******************************\n");
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+p_err:
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_2l4_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_2l4_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_2l4_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_2l4_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_2l4_cis_set_global_setting_dramtest(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ info("[%s] sensor_2l4_dram_test_global start\n", __func__);
+ ret = sensor_cis_set_registers(subdev, sensor_2l4_dram_test_global, sensor_2l4_dram_test_global_size);
+
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err;
+ }
+
+ info("[%s] sensor_2l4_dram_test_global done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_2l4_cis_set_global_setting_internal(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ info("[%s] global setting start\n", __func__);
+ /* setfile global setting is at camera entrance */
+ ret |= sensor_cis_set_registers(subdev, sensor_2l4_reset_tnp, sensor_2l4_reset_tnp_size);
+ ret |= sensor_cis_set_registers(subdev, sensor_2l4_global, sensor_2l4_global_size);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err;
+ }
+
+ info("[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+int sensor_2l4_cis_set_global_setting_retention(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ info("[%s] global retention setting start\n", __func__);
+ /* setfile global retention setting is at camera entrance */
+ ret = sensor_cis_set_registers(subdev, sensor_2l4_global_retention, sensor_2l4_global_retention_size);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err;
+ }
+
+ info("[%s] global retention setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+#ifdef CAMERA_REAR2
+int sensor_2l4_cis_retention_crc_enable(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client;
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ switch (mode) {
+ case SENSOR_2L4_2016X1512_120FPS_MODE2:
+ case SENSOR_2L4_2016X1134_120FPS_MODE2:
+ case SENSOR_2L4_1504X1504_120FPS_MODE2:
+ case SENSOR_2L4_1008X756_120FPS_MODE2:
+ case SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_960:
+ case SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_480:
+ case SENSOR_2L4_1280X720_60FPS_MODE2_SSM_960:
+ case SENSOR_2L4_1280X720_60FPS_MODE2_SSM_480:
+ break;
+ default:
+ /* Sensor stream on */
+ fimc_is_sensor_write16(client, 0x0100, 0x0103);
+
+ /* retention mode CRC check register enable */
+ fimc_is_sensor_write8(client, 0x010E, 0x01);
+ info("[MOD:D:%d] %s : retention enable CRC check\n", cis->id, __func__);
+
+ /* Sensor stream off */
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+ break;
+ }
+
+p_err:
+ return ret;
+}
+#endif
+#endif
+
+static void sensor_2l4_cis_set_paf_stat_enable(u32 mode, cis_shared_data *cis_data)
+{
+ WARN_ON(!cis_data);
+
+ switch (mode) {
+ case SENSOR_2L4_4032X3024_30FPS:
+ case SENSOR_2L4_4032X2268_60FPS:
+ case SENSOR_2L4_4032X2268_30FPS:
+ case SENSOR_2L4_4032X1908_30FPS:
+ case SENSOR_2L4_3024X3024_30FPS:
+ case SENSOR_2L4_2016X1512_30FPS:
+ case SENSOR_2L4_2016X1134_30FPS:
+ case SENSOR_2L4_1504X1504_30FPS:
+ case SENSOR_2L4_4032X3024_24FPS:
+ case SENSOR_2L4_4032X2268_24FPS:
+ case SENSOR_2L4_4032X1908_24FPS:
+ case SENSOR_2L4_3024X3024_24FPS:
+ cis_data->is_data.paf_stat_enable = true;
+ break;
+ default:
+ cis_data->is_data.paf_stat_enable = false;
+ break;
+ }
+}
+
+bool sensor_2l4_cis_get_lownoise_supported(cis_shared_data *cis_data)
+{
+ WARN_ON(!cis_data);
+
+ if (cis_data->cis_rev >= 0xA002) { // support ln mode higher than 3 stack
+ switch (cis_data->sens_config_index_cur) {
+ case SENSOR_2L4_4032X3024_30FPS:
+ case SENSOR_2L4_4032X2268_30FPS:
+ case SENSOR_2L4_4032X1908_30FPS:
+ case SENSOR_2L4_3024X3024_30FPS:
+#if 0 // not yet
+ case SENSOR_2L4_4032X3024_24FPS:
+ case SENSOR_2L4_4032X2268_24FPS:
+ case SENSOR_2L4_4032X1908_24FPS:
+ case SENSOR_2L4_3024X3024_24FPS:
+#endif
+ return true;
+ default:
+ break;
+ }
+ }
+
+ return false;
+}
+
+int sensor_2l4_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ if (mode >= sensor_2l4_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ln_mode_delay_count = 0;
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+ WARN_ON(!ext_info);
+
+#if 0
+ /* If check_rev fail when cis_init, one more check_rev in mode_change */
+ if (cis->rev_flag == true) {
+ cis->rev_flag = false;
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ err("sensor_2l4_check_rev is fail");
+ goto p_err;
+ }
+ }
+#endif
+
+#if 0 /* cis_data_calculation is called in module_s_format */
+ sensor_2l4_cis_data_calculation(sensor_2l4_pllinfos[mode], cis->cis_data);
+#endif
+ sensor_2l4_set_integration_max_margin(mode, cis->cis_data);
+
+ if (mode == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1) {
+ sensor_2l4_cis_set_global_setting_dramtest(subdev);
+ }
+
+ sensor_2l4_cis_set_paf_stat_enable(mode, cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ /* Retention mode sensor mode select */
+ if (ext_info->use_retention_mode == SENSOR_RETENTION_ACTIVATED) {
+ need_cancel_retention_mode = true;
+ switch (mode) {
+ case SENSOR_2L4_4032X3024_30FPS:
+ info("[%s] retention mode: SENSOR_2L4_4032X3024_30FPS\n", __func__);
+ ret = sensor_cis_set_registers(subdev,
+ sensor_2l4_load_sram[SENSOR_2L4_4032x3024_30FPS_LOAD_SRAM],
+ sensor_2l4_load_sram_size[SENSOR_2L4_4032x3024_30FPS_LOAD_SRAM]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+ break;
+ case SENSOR_2L4_4032X2268_30FPS:
+ info("[%s] retention mode: SENSOR_2L4_4032X2268_30FPS\n", __func__);
+ ret = sensor_cis_set_registers(subdev,
+ sensor_2l4_load_sram[SENSOR_2L4_4032x2268_30FPS_LOAD_SRAM],
+ sensor_2l4_load_sram_size[SENSOR_2L4_4032x2268_30FPS_LOAD_SRAM]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+ break;
+ case SENSOR_2L4_4032X2268_60FPS:
+ info("[%s] retention mode: SENSOR_2L4_4032X2268_60FPS\n", __func__);
+ ret = sensor_cis_set_registers(subdev,
+ sensor_2l4_load_sram[SENSOR_2L4_4032x2268_60FPS_LOAD_SRAM],
+ sensor_2l4_load_sram_size[SENSOR_2L4_4032x2268_60FPS_LOAD_SRAM]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+ break;
+ case SENSOR_2L4_1008X756_120FPS_MODE2:
+ info("[%s] retention mode: SENSOR_2L4_1008X756_120FPS_MODE2\n", __func__);
+ ret = sensor_cis_set_registers(subdev,
+ sensor_2l4_load_sram[SENSOR_2L4_1008x756_120FPS_LOAD_SRAM],
+ sensor_2l4_load_sram_size[SENSOR_2L4_1008x756_120FPS_LOAD_SRAM]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+ break;
+ case SENSOR_2L4_4032X3024_24FPS:
+ info("[%s] retention mode: SENSOR_2L4_4032X3024_24FPS\n", __func__);
+ ret = sensor_cis_set_registers(subdev,
+ sensor_2l4_load_sram[SENSOR_2L4_4032x3024_24FPS_LOAD_SRAM],
+ sensor_2l4_load_sram_size[SENSOR_2L4_4032x3024_24FPS_LOAD_SRAM]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+ break;
+ case SENSOR_2L4_4032X2268_24FPS:
+ info("[%s] retention mode: SENSOR_2L4_4032X2268_24FPS\n", __func__);
+ ret = sensor_cis_set_registers(subdev,
+ sensor_2l4_load_sram[SENSOR_2L4_4032x2268_24FPS_LOAD_SRAM],
+ sensor_2l4_load_sram_size[SENSOR_2L4_4032x2268_24FPS_LOAD_SRAM]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+ break;
+ default:
+ info("[%s] not support retention sensor mode(%d)\n", __func__, mode);
+ need_cancel_retention_mode = false;
+ ret = sensor_cis_set_registers(subdev, sensor_2l4_setfiles[mode],
+ sensor_2l4_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+
+ if (mode == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1)
+ ext_info->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+ break;
+ }
+#if 0 /* CAMERA_REAR2 : it's not necessary on star project */
+ sensor_2l4_cis_retention_crc_enable(subdev, mode);
+#endif
+ } else
+#endif
+ {
+ info("[%s] sensor mode(%d)\n", __func__, mode);
+ ret = sensor_cis_set_registers(subdev, sensor_2l4_setfiles[mode],
+ sensor_2l4_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err_i2c_unlock;
+ }
+ }
+
+ if (sensor_2l4_cis_get_lownoise_supported(cis->cis_data)) {
+ cis->cis_data->pre_lownoise_mode = FIMC_IS_CIS_LN2;
+ cis->cis_data->cur_lownoise_mode = FIMC_IS_CIS_LN2;
+ sensor_2l4_cis_set_lownoise_mode_change(subdev);
+ } else {
+ cis->cis_data->pre_lownoise_mode = FIMC_IS_CIS_LNOFF;
+ cis->cis_data->cur_lownoise_mode = FIMC_IS_CIS_LNOFF;
+ }
+
+ info("[%s] mode changed(%d)\n", __func__, mode);
+
+p_err_i2c_unlock:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+p_err:
+ /* sensor_2l4_cis_log_status(subdev); */
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_lownoise_mode_change(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ unsigned int mode = 0;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+ WARN_ON(!ext_info);
+
+ mode = cis->cis_data->sens_config_index_cur;
+
+ if (!sensor_2l4_cis_get_lownoise_supported(cis->cis_data)) {
+ pr_info("[%s] not support mode %d evt %x\n", __func__,
+ mode, cis->cis_data->cis_rev);
+ cis->cis_data->pre_lownoise_mode = cis->cis_data->cur_lownoise_mode;
+ return ret;
+ }
+
+ fimc_is_sensor_read8(cis->client, 0x0005, &ln_mode_frame_count);
+ pr_info("[%s] lownoise mode changed(%d) cur_mode(%d) ln_mode_frame_count(0x%x)\n",
+ __func__, cis->cis_data->cur_lownoise_mode, mode, ln_mode_frame_count);
+
+ ln_mode_delay_count = 3;
+
+ ret = fimc_is_sensor_write16(cis->client, 0x0104, 0x0101);
+
+ switch (cis->cis_data->cur_lownoise_mode) {
+ case FIMC_IS_CIS_LNOFF:
+ dbg_sensor(1, "[%s] FIMC_IS_CIS_LNOFF\n", __func__);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6028, 0x2000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x602A, 0xFF22);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6F12, 0x0001);
+ ret |= fimc_is_sensor_write16(cis->client, 0x3012, 0x0101);
+
+#ifdef CAMERA_REAR2
+ switch (mode) {
+ case SENSOR_2L4_4032X3024_30FPS:
+ case SENSOR_2L4_4032X2268_30FPS:
+ case SENSOR_2L4_4032X1908_30FPS:
+ case SENSOR_2L4_3024X3024_30FPS:
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D0, 0x0054);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D2, 0x0500);
+ break;
+ case SENSOR_2L4_4032X3024_24FPS:
+ case SENSOR_2L4_4032X2268_24FPS:
+ case SENSOR_2L4_4032X1908_24FPS:
+ case SENSOR_2L4_3024X3024_24FPS:
+#if 0 // To Do
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D0, 0x0054);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D2, 0x0500);
+#endif
+ break;
+ }
+#endif
+ break;
+ case FIMC_IS_CIS_LN2:
+ dbg_sensor(1, "[%s] FIMC_IS_CIS_LN2\n", __func__);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6028, 0x2000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x602A, 0xFF22);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6F12, 0x0001);
+ ret |= fimc_is_sensor_write16(cis->client, 0x3012, 0x0201);
+
+#ifdef CAMERA_REAR2
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D0, 0x0000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D2, 0x0500);
+#endif
+ break;
+ case FIMC_IS_CIS_LN4:
+ dbg_sensor(1, "[%s] FIMC_IS_CIS_LN4\n", __func__);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6028, 0x2000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x602A, 0xFF22);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6F12, 0x0001);
+ ret |= fimc_is_sensor_write16(cis->client, 0x3012, 0x0401);
+
+#ifdef CAMERA_REAR2
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D0, 0x0000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D2, 0x0500);
+#endif
+ break;
+ case FIMC_IS_CIS_LN2_PEDESTAL128:
+ dbg_sensor(1, "[%s] FIMC_IS_CIS_LN2_PEDESTAL128\n", __func__);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0B30, 0x0200);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0BC0, 0x0080); /* pedestal 128 */
+
+#ifdef CAMERA_REAR2
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D0, 0x0000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D2, 0x0500);
+#endif
+ ext_info->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+ break;
+ case FIMC_IS_CIS_LN4_PEDESTAL128:
+ dbg_sensor(1, "[%s] FIMC_IS_CIS_LN4_PEDESTAL128\n", __func__);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0B30, 0x0300);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0BC0, 0x0080); /* pedestal 128 */
+
+#ifdef CAMERA_REAR2
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D0, 0x0000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x30D2, 0x0500);
+#endif
+ ext_info->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+ break;
+ default:
+ dbg_sensor(1, "[%s] not support lownoise mode(%d)\n",
+ __func__, cis->cis_data->cur_lownoise_mode);
+ }
+
+ ret |= fimc_is_sensor_write16(cis->client, 0x0104, 0x0001);
+
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->pre_lownoise_mode = cis->cis_data->cur_lownoise_mode;
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+ WARN_ON(!ext_info);
+
+ /* setfile global setting is at camera entrance */
+ if (ext_info->use_retention_mode == SENSOR_RETENTION_INACTIVE) {
+ sensor_2l4_cis_set_global_setting_internal(subdev);
+ sensor_2l4_cis_retention_prepare(subdev);
+ ext_info->use_retention_mode = SENSOR_RETENTION_ACTIVATED;
+ } else if (ext_info->use_retention_mode == SENSOR_RETENTION_ACTIVATED) {
+ sensor_2l4_cis_retention_crc_check(subdev);
+ } else { /* SENSOR_RETENTION_UNSUPPORTED */
+ sensor_2l4_cis_set_global_setting_internal(subdev);
+ }
+#else
+ WARN_ON(!subdev);
+ sensor_2l4_cis_set_global_setting_internal(subdev);
+#endif
+
+ return ret;
+}
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+int sensor_2l4_cis_retention_prepare(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ int i = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ for (i = 0; i < sensor_2l4_max_retention_num; i++) {
+ ret = sensor_cis_set_registers(subdev, sensor_2l4_retention[i], sensor_2l4_retention_size[i]);
+ if (ret < 0) {
+ err("sensor_2l4_set_registers fail!!");
+ goto p_err;
+ }
+ }
+
+ info("[%s] retention sensor RAM write done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_retention_crc_check(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 crc_check = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ /* retention mode CRC check */
+ fimc_is_sensor_read8(cis->client, 0x100E, &crc_check);
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ if (crc_check == 0x01) {
+ info("[%s] retention SRAM CRC check: pass!\n", __func__);
+
+ ret = sensor_2l4_cis_set_global_setting_retention(subdev);
+ if (ret < 0) {
+ err("write retention global setting failed");
+ goto p_err;
+ }
+ } else {
+ info("[%s] retention SRAM CRC check: fail!\n", __func__);
+ info("retention CRC Check register value: 0x%x\n", crc_check);
+ info("[%s] rewrite retention modes to SRAM\n", __func__);
+
+ ret = sensor_2l4_cis_set_global_setting_internal(subdev);
+ if (ret < 0) {
+ err("CRC error recover: rewrite sensor global setting failed");
+ goto p_err;
+ }
+
+ ret = sensor_2l4_cis_retention_prepare(subdev);
+ if (ret < 0) {
+ err("CRC error recover: retention prepare failed");
+ goto p_err;
+ }
+ }
+
+p_err:
+
+ return ret;
+}
+#endif
+
+/* TODO: Sensor set size sequence(sensor done, sensor stop, 3AA done in FW case */
+int sensor_2l4_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ int ret = 0;
+ bool binning = false;
+ u32 ratio_w = 0, ratio_h = 0, start_x = 0, start_y = 0, end_x = 0, end_y = 0;
+ u32 even_x = 0, odd_x = 0, even_y = 0, odd_y = 0;
+ struct i2c_client *client = NULL;
+ struct fimc_is_cis *cis = NULL;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ if (unlikely(!cis_data)) {
+ err("cis data is NULL");
+ if (unlikely(!cis->cis_data)) {
+ ret = -EINVAL;
+ goto p_err;
+ } else {
+ cis_data = cis->cis_data;
+ }
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* Wait actual stream off */
+ ret = sensor_2l4_wait_stream_off_status(cis_data);
+ if (ret) {
+ err("Must stream off\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ binning = cis_data->binning;
+ if (binning) {
+ ratio_w = (SENSOR_2L4_MAX_WIDTH / cis_data->cur_width);
+ ratio_h = (SENSOR_2L4_MAX_HEIGHT / cis_data->cur_height);
+ } else {
+ ratio_w = 1;
+ ratio_h = 1;
+ }
+
+ if (((cis_data->cur_width * ratio_w) > SENSOR_2L4_MAX_WIDTH) ||
+ ((cis_data->cur_height * ratio_h) > SENSOR_2L4_MAX_HEIGHT)) {
+ err("Config max sensor size over~!!\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* 1. page_select */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* 2. pixel address region setting */
+ start_x = ((SENSOR_2L4_MAX_WIDTH - cis_data->cur_width * ratio_w) / 2) & (~0x1);
+ start_y = ((SENSOR_2L4_MAX_HEIGHT - cis_data->cur_height * ratio_h) / 2) & (~0x1);
+ end_x = start_x + (cis_data->cur_width * ratio_w - 1);
+ end_y = start_y + (cis_data->cur_height * ratio_h - 1);
+
+ if (!(end_x & (0x1)) || !(end_y & (0x1))) {
+ err("Sensor pixel end address must odd\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0344, start_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0346, start_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0348, end_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034A, end_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 3. output address setting */
+ ret = fimc_is_sensor_write16(client, 0x034C, cis_data->cur_width);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034E, cis_data->cur_height);
+ if (ret < 0)
+ goto p_err;
+
+ /* If not use to binning, sensor image should set only crop */
+ if (!binning) {
+ dbg_sensor(1, "Sensor size set is not binning\n");
+ goto p_err;
+ }
+
+ /* 4. sub sampling setting */
+ even_x = 1; /* 1: not use to even sampling */
+ even_y = 1;
+ odd_x = (ratio_w * 2) - even_x;
+ odd_y = (ratio_h * 2) - even_y;
+
+ ret = fimc_is_sensor_write16(client, 0x0380, even_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0382, odd_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0384, even_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0386, odd_y);
+ if (ret < 0)
+ goto p_err;
+
+#if 0
+ /* 5. binnig setting */
+ ret = fimc_is_sensor_write8(client, 0x0900, binning); /* 1: binning enable, 0: disable */
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write8(client, 0x0901, (ratio_w << 4) | ratio_h);
+ if (ret < 0)
+ goto p_err;
+#endif
+
+ /* 6. scaling setting: but not use */
+ /* scaling_mode (0: No scaling, 1: Horizontal, 2: Full, 4:Separate vertical) */
+ ret = fimc_is_sensor_write16(client, 0x0400, 0x0000);
+ if (ret < 0)
+ goto p_err;
+ /* down_scale_m: 1 to 16 upwards (scale_n: 16(fixed))
+ * down scale factor = down_scale_m / down_scale_n
+ */
+ ret = fimc_is_sensor_write16(client, 0x0404, 0x0010);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n",
+ __func__, cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_2l4_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+#ifdef CAMERA_REAR2
+ u32 mode;
+#endif
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ WARN_ON(!sensor_peri);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_2l4_cis_group_param_hold_func(subdev, 0x01);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+#ifdef DEBUG_2L4_PLL
+ {
+ u16 pll;
+
+ fimc_is_sensor_read16(client, 0x0300, &pll);
+ dbg_sensor(1, "______ vt_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0302, &pll);
+ dbg_sensor(1, "______ vt_sys_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0304, &pll);
+ dbg_sensor(1, "______ vt_pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0306, &pll);
+ dbg_sensor(1, "______ vt_pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0308, &pll);
+ dbg_sensor(1, "______ op_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030a, &pll);
+ dbg_sensor(1, "______ op_sys_clk_div(%x)\n", pll);
+
+ fimc_is_sensor_read16(client, 0x030c, &pll);
+ dbg_sensor(1, "______ vt_pll_post_scaler(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030e, &pll);
+ dbg_sensor(1, "______ op_pre_pll_clk_dv(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0310, &pll);
+ dbg_sensor(1, "______ op_pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0312, &pll);
+ dbg_sensor(1, "______ op_pll_post_scalar(%x)\n", pll);
+
+ fimc_is_sensor_read16(client, 0x0314, &pll);
+ dbg_sensor(1, "______ DRAM_pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0316, &pll);
+ dbg_sensor(1, "______ DRAM_pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0318, &pll);
+ dbg_sensor(1, "______ DRAM_pll_post_scalar(%x)\n", pll);
+
+ fimc_is_sensor_read16(client, 0x0340, &pll);
+ dbg_sensor(1, "______ frame_length_lines(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0342, &pll);
+ dbg_sensor(1, "______ line_length_pck(%x)\n", pll);
+ }
+#endif
+
+ /*
+ * If a companion is used,
+ * then 8 ms waiting is needed before the StreamOn of a sensor (SAK2L4).
+ */
+ if (test_bit(FIMC_IS_SENSOR_PREPROCESSOR_AVAILABLE, &sensor_peri->peri_state))
+ mdelay(8);
+
+ /* Sensor stream on */
+ info("%s\n", __func__);
+ fimc_is_sensor_write16(client, 0x0100, 0x0103);
+
+ ret = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->stream_on = true;
+
+ need_cancel_retention_mode = false;
+
+#ifdef CAMERA_REAR2
+ mode = cis_data->sens_config_index_cur;
+ dbg_sensor(1, "[%s] sens_config_index_cur=%d\n", __func__, mode);
+
+ switch (mode) {
+ case SENSOR_2L4_4032X3024_30FPS:
+ case SENSOR_2L4_4032X2268_30FPS:
+ case SENSOR_2L4_3024X3024_30FPS:
+ case SENSOR_2L4_4032X1908_30FPS:
+ cis->cis_data->min_sync_frame_us_time = cis->cis_data->min_frame_us_time = 33333;
+ break;
+ default:
+ break;
+ }
+#endif
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u8 cur_frame_count = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream off");
+
+ /* LN Off -> LN2 -> N+2 frame -> Stream Off */
+ if (ln_mode_delay_count > 0) {
+ info("%s: ln_mode_delay_count : %d ->(%d ms)\n",
+ __func__, ln_mode_delay_count, 100 * ln_mode_delay_count);
+ msleep(100 * ln_mode_delay_count);
+ }
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ /* retention mode CRC check register enable */
+ if (cis->cis_data->cis_rev >= 0xA002) { // support retention higher than 3 stack
+ fimc_is_sensor_write8(client, 0x010E, 0x01);
+ info("[MOD:D:%d] %s : retention enable CRC check\n", cis->id, __func__);
+ }
+#endif
+
+ fimc_is_sensor_read8(client, 0x0005, &cur_frame_count);
+ info("%s: frame_count(0x%x)\n", __func__, cur_frame_count);
+
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u16 coarse_integration_time_shifter = 0;
+
+ u16 remainder_cit = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (cis->long_term_mode.sen_strm_off_on_enable == false) {
+ switch(cis_data->sens_config_index_cur) {
+ case SENSOR_2L4_2016X1512_30FPS:
+ case SENSOR_2L4_2016X1134_30FPS:
+ case SENSOR_2L4_1504X1504_30FPS:
+ if (MAX(target_exposure->long_val, target_exposure->short_val) > 85000) {
+ target_exposure->long_val = target_exposure->long_val / 2;
+ target_exposure->short_val = target_exposure->short_val / 2;
+ coarse_integration_time_shifter = 0x0101;
+ } else {
+ coarse_integration_time_shifter = 0x0;
+ }
+ break;
+ default:
+ if (MAX(target_exposure->long_val, target_exposure->short_val) > 170000) {
+ target_exposure->long_val = target_exposure->long_val / 2;
+ target_exposure->short_val = target_exposure->short_val / 2;
+ coarse_integration_time_shifter = 0x0101;
+ } else {
+ coarse_integration_time_shifter = 0x0;
+ }
+ break;
+ }
+ }
+
+ if (cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1
+ || cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2) {
+ dbg_sensor(1, "[%s] skip for dram test\n", __func__);
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ switch (cis->cis_data->cur_lownoise_mode) {
+ case FIMC_IS_CIS_LNOFF:
+ long_coarse_int = ((target_exposure->long_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ remainder_cit = long_coarse_int % 2;
+ long_coarse_int -= remainder_cit;
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+ short_coarse_int = ((target_exposure->short_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ remainder_cit = short_coarse_int % 2;
+ short_coarse_int -= remainder_cit;
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+ break;
+ case FIMC_IS_CIS_LN2:
+ long_coarse_int = ((target_exposure->long_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ remainder_cit = long_coarse_int % 4;
+ long_coarse_int -= remainder_cit;
+ if (long_coarse_int < cis_data->min_coarse_integration_time * 2) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time * 2);
+ long_coarse_int = cis_data->min_coarse_integration_time * 2;
+ }
+ short_coarse_int = ((target_exposure->short_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ remainder_cit = short_coarse_int % 4;
+ short_coarse_int -= remainder_cit;
+ if (short_coarse_int < cis_data->min_coarse_integration_time * 2) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time * 2);
+ short_coarse_int = cis_data->min_coarse_integration_time * 2;
+ }
+ break;
+ case FIMC_IS_CIS_LN4:
+ long_coarse_int = ((target_exposure->long_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ remainder_cit = long_coarse_int % 8;
+ long_coarse_int -= remainder_cit;
+ if (long_coarse_int < cis_data->min_coarse_integration_time * 4) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time * 4);
+ long_coarse_int = cis_data->min_coarse_integration_time * 4;
+ }
+ short_coarse_int = ((target_exposure->short_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ remainder_cit = short_coarse_int % 8;
+ short_coarse_int -= remainder_cit;
+ if (short_coarse_int < cis_data->min_coarse_integration_time * 4) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time * 4);
+ short_coarse_int = cis_data->min_coarse_integration_time * 4;
+ }
+ break;
+ default:
+ long_coarse_int = ((target_exposure->long_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+ short_coarse_int = ((target_exposure->short_val * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)
+ / line_length_pck;
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+ break;
+ }
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ cis_data->cur_long_exposure_coarse = long_coarse_int;
+ cis_data->cur_short_exposure_coarse = short_coarse_int;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* WDR mode */
+ if (sensor_2l4_cis_is_wdr_mode_on(cis_data)) {
+ fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ fimc_is_sensor_write16(cis->client, 0x021E, 0x0100);
+ } else {
+ fimc_is_sensor_write16(cis->client, 0x021E, 0x0000);
+ }
+
+ /* Short exposure */
+ ret = fimc_is_sensor_write16(client, 0x0202, short_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long exposure */
+ if (sensor_2l4_cis_is_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x0226, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* CIT shifter */
+ if (cis->long_term_mode.sen_strm_off_on_enable == false) {
+ ret = fimc_is_sensor_write16(client, 0x0702, coarse_integration_time_shifter);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d),"
+ KERN_CONT "line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, cis_data->sen_vsync_count, vt_pic_clk_freq_mhz/1000,
+ line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x),"
+ KERN_CONT "long_coarse_int %#x, short_coarse_int %#x coarse_integration_time_shifter %#x\n",
+ cis->id, __func__, cis_data->sen_vsync_count, cis_data->frame_length_lines,
+ long_coarse_int, short_coarse_int, coarse_integration_time_shifter);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz/1000);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = (u32)((u64)((line_length_pck * min_coarse) + min_fine) * 1000 / vt_pic_clk_freq_mhz);
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz/1000);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = (u32)((u64)((line_length_pck * max_coarse) + max_fine) * 1000 / vt_pic_clk_freq_mhz);
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update hear? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time,
+ cis_data->max_margin_fine_integration_time, cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = (u32)((((u64)(vt_pic_clk_freq_mhz) * input_exposure_time) / 1000
+ - cis_data->min_fine_integration_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (u32)(((u64)frame_length_lines * line_length_pck) * 1000 / vt_pic_clk_freq_mhz);
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count,
+ input_exposure_time, frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+ u8 frame_length_lines_shifter = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (ln_mode_delay_count > 0)
+ ln_mode_delay_count--;
+
+ if (cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1
+ || cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2) {
+ dbg_sensor(1, "[%s] skip for dram test\n", __func__);
+ goto p_err;
+ }
+
+ if (cis->long_term_mode.sen_strm_off_on_enable == false) {
+ switch(cis_data->sens_config_index_cur) {
+ case SENSOR_2L4_2016X1512_30FPS:
+ case SENSOR_2L4_2016X1134_30FPS:
+ case SENSOR_2L4_1504X1504_30FPS:
+ if (frame_duration > 85000) {
+ frame_duration = frame_duration / 2;
+ frame_length_lines_shifter = 0x1;
+ } else {
+ frame_length_lines_shifter = 0x0;
+ }
+ break;
+ default:
+ if (frame_duration > 170000) {
+ frame_duration = frame_duration / 2;
+ frame_length_lines_shifter = 0x1;
+ } else {
+ frame_length_lines_shifter = 0x0;
+ }
+ break;
+ }
+ }
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000);
+ line_length_pck = cis_data->line_length_pck;
+
+ frame_length_lines = (u16)(((u64)(vt_pic_clk_freq_mhz) * frame_duration) / (line_length_pck * 1000));
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk_freq_mhz(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x), frame_length_lines_shifter(%#x)\n",
+ cis->id, __func__, vt_pic_clk_freq_mhz/1000, frame_duration,
+ line_length_pck, frame_length_lines, frame_length_lines_shifter);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ if (cis->cis_data->cur_lownoise_mode != cis->cis_data->pre_lownoise_mode)
+ ret |= sensor_2l4_cis_set_lownoise_mode_change(subdev);
+
+ ret |= fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+
+ if (ret < 0)
+ goto p_err;
+
+ /* frame duration shifter */
+ if (cis->long_term_mode.sen_strm_off_on_enable == false) {
+ ret = fimc_is_sensor_write8(client, 0x0701, frame_length_lines_shifter);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+ cis_data->max_coarse_integration_time =
+ cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_2l4_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+#ifdef CAMERA_REAR2
+ cis_data->min_frame_us_time = MAX(frame_duration, cis_data->min_sync_frame_us_time);
+#else
+ cis_data->min_frame_us_time = frame_duration;
+#endif
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+int sensor_2l4_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (cis->cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1
+ || cis->cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2) {
+ dbg_sensor(1, "[%s] skip for dram test\n", __func__);
+ goto p_err;
+ }
+
+ analog_gain = (u16)sensor_cis_calc_again_code(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0]) {
+ info("[%s] not proper analog_gain value, reset to min_analog_gain\n", __func__);
+ analog_gain = cis->cis_data->min_analog_gain[0];
+ }
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0]) {
+ info("[%s] not proper analog_gain value, reset to max_analog_gain\n", __func__);
+ analog_gain = cis->cis_data->max_analog_gain[0];
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0204, analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_analog_gain[0] = 0x20; /* x1, gain=x/0x20 */
+ cis_data->min_analog_gain[1] = sensor_cis_calc_again_permile(cis_data->min_analog_gain[0]);
+
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_analog_gain[0],
+ cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_analog_gain[0] = 0x200; /* x16, gain=x/0x20 */
+ cis_data->max_analog_gain[1] = sensor_cis_calc_again_permile(cis_data->max_analog_gain[0]);
+
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_analog_gain[0],
+ cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1
+ || cis_data->sens_config_index_cur == SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2) {
+ dbg_sensor(1, "[%s] skip for dram test\n", __func__);
+ goto p_err;
+ }
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+
+ if (long_gain < cis_data->min_digital_gain[0]) {
+ info("[%s] not proper long_gain value, reset to min_digital_gain\n", __func__);
+ long_gain = cis_data->min_digital_gain[0];
+ }
+
+ if (long_gain > cis_data->max_digital_gain[0]) {
+ info("[%s] not proper long_gain value, reset to max_digital_gain\n", __func__);
+ long_gain = cis_data->max_digital_gain[0];
+ }
+
+ if (short_gain < cis_data->min_digital_gain[0]) {
+ info("[%s] not proper short_gain value, reset to min_digital_gain\n", __func__);
+ short_gain = cis_data->min_digital_gain[0];
+ }
+
+ if (short_gain > cis_data->max_digital_gain[0]) {
+ info("[%s] not proper short_gain value, reset to max_digital_gain\n", __func__);
+ short_gain = cis_data->max_digital_gain[0];
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us,"
+ KERN_CONT "long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count,
+ dgain->long_val, dgain->short_val, long_gain, short_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /*
+ * NOTE : In SAK2L4, digital gain is long/short seperated, should set 2 registers like below,
+ * Write same value to : 0x020E : short // GreenB
+ * Write same value to : 0x0214 : short // GreenR
+ * Write same value to : Need To find : long
+ */
+
+ /* Short digital gain */
+ ret = fimc_is_sensor_write16(client, 0x020E, short_gain);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long digital gain */
+ if (sensor_2l4_cis_is_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x0C80, long_gain);
+ if (ret < 0)
+ goto p_err;
+ }
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /*
+ * NOTE : In SAK2L4, digital gain is long/short seperated, should set 2 registers like below,
+ * Write same value to : 0x020E : short // GreenB
+ * Write same value to : 0x0214 : short // GreenR
+ * Write same value to : Need To find : long
+ */
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2l4_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2l4_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_digital_gain[0] = 0x100;
+ cis_data->min_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->min_digital_gain[0]);
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_digital_gain[0],
+ cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ WARN_ON(!subdev);
+ WARN_ON(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_digital_gain[0] = 0x8000;
+ cis_data->max_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->max_digital_gain[0]);
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_digital_gain[0],
+ cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2l4_cis_long_term_exposure(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct fimc_is_long_term_expo_mode *lte_mode;
+ unsigned char cit_lshift_val = 0;
+ unsigned char shift_count = 0;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ lte_mode = &cis->long_term_mode;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* LTE mode or normal mode set */
+ if (lte_mode->sen_strm_off_on_enable) {
+ if (lte_mode->expo[0] > 125000) {
+ cit_lshift_val = (unsigned char)(lte_mode->expo[0] / 125000);
+ while (cit_lshift_val) {
+ cit_lshift_val = cit_lshift_val / 2;
+ if (cit_lshift_val > 0)
+ shift_count++;
+ }
+ lte_mode->expo[0] = 125000;
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0701, shift_count);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0702, shift_count);
+ }
+ } else {
+ cit_lshift_val = 0;
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0701, cit_lshift_val);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0702, cit_lshift_val);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ info("%s enable(%d)", __func__, lte_mode->sen_strm_off_on_enable);
+
+ if (ret < 0) {
+ pr_err("ERR[%s]: LTE register setting fail\n", __func__);
+ return ret;
+ }
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_frs_control(struct v4l2_subdev *subdev, u32 command)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+ WARN_ON(!ext_info);
+
+ switch (command) {
+ case FRS_SSM_START:
+ pr_info("[%s] SUPER_SLOW_MOTION_START\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A52, 0x01); /* start_user_record */
+ /* ret |= fimc_is_sensor_write8(cis->client, 0x0A51, 0x01); *//* enable_preview_during_recording */
+ /* ret |= fimc_is_sensor_write8(cis->client, 0x0A55, 0x08); *//* tg_to_oif_ratio */
+ /* ret |= fimc_is_sensor_write8(cis->client, 0x0A56, 0x02); *//* tg_to_sg_ratio */
+ /* ret |= fimc_is_sensor_write16(cis->client, 0x0A58, 0x0010); *//* q_mask_frames */
+ /* ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0010); *//* before_q_frames */
+ /* ret |= fimc_is_sensor_write16(cis->client, 0x0A60, 0x0050); *//* dram_frame_num */
+ break;
+ case FRS_SSM_MANUAL_CUE_ENABLE:
+ pr_info("[%s] SUPER_SLOW_MOTION_START_MANUAL_CUE\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A54, 0x01); /* Manual Q Enable */
+ break;
+ case FRS_SSM_STOP:
+ pr_info("[%s] SUPER_SLOW_MOTION_STOP\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A53, 0x01); /* stop_user_record */
+ break;
+ case FRS_SSM_MODE_AUTO_MANUAL_CUE_16:
+ pr_info("[%s] SUPER_SLOW_MOTION_MODE_AUTO_MANUAL_CUE_16\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A50, 0x02); /* Enable Manual /Auto Q */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0010); /* before_q_frames = 16 */
+ break;
+ case FRS_SSM_MODE_AUTO_MANUAL_CUE_32:
+ pr_info("[%s] SUPER_SLOW_MOTION_MODE_AUTO_MANUAL_CUE_32\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A50, 0x02); /* Enable Manual /Auto Q */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0020); /* before_q_frames = 32 */
+ break;
+ case FRS_SSM_MODE_AUTO_MANUAL_CUE_64:
+ pr_info("[%s] SUPER_SLOW_MOTION_MODE_AUTO_MANUAL_CUE_64\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A50, 0x02); /* Enable Manual /Auto Q */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0040); /* before_q_frames = 64 */
+ break;
+ case FRS_SSM_MODE_ONLY_MANUAL_CUE:
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A50, 0x01); /* Enable Manual Q Only */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A58, 0x0000); /* q_mask_frames */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0000); /* before_q_frames = 0 */
+ break;
+ case FRS_SSM_MODE_FACTORY_TEST:
+ pr_info("[%s] SUPER_SLOW_MOTION_MODE_FACTORY_TEST\n", __func__);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A50, 0x01); /* Enable Manual Q Only */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A58, 0x0000); /* q_mask_frames */
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A5A, 0x0010); /* before_q_frames = 16 */
+ ret |= fimc_is_sensor_write8(cis->client, 0x0A52, 0x01); /* start_user_record */
+ ret |= fimc_is_sensor_write16(cis->client, 0xF40A, 0x0009); /* test */
+ ret |= fimc_is_sensor_write16(cis->client, 0xF404, 0xFFF7); /* test */
+
+ ext_info->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+ break;
+ case FRS_DRAM_TEST_SECTION2:
+ if (sensor_2l4_max_setfile_num > SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2) {
+ /* stream off > set dram stage2 > stream on*/
+ fimc_is_sensor_write8(cis->client, 0x0100, 0x00);
+ pr_info("[%s] FRS dram test section 1 stream off\n", __func__);
+
+ sensor_cis_wait_streamoff(subdev);
+ ret = sensor_cis_set_registers(subdev,
+ sensor_2l4_setfiles[SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2],
+ sensor_2l4_setfile_sizes[SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2]);
+ fimc_is_sensor_write16(cis->client, 0x0100, 0x0103);
+ pr_info("[%s] FRS dram test section 2 stream on\n", __func__);
+
+ sensor_cis_wait_streamon(subdev);
+ pr_info("[%s] FRS dram section 2 frame reached\n", __func__);
+ } else {
+ pr_info("[%s] FRS dram section 2 setting is not found\n", __func__);
+ }
+ break;
+ default:
+ pr_info("[%s] not support command(%d)\n", __func__, command);
+ }
+
+ if (ret < 0) {
+ pr_err("ERR[%s]: super slow control setting fail\n", __func__);
+ return ret;
+ }
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_super_slow_motion_roi(struct v4l2_subdev *subdev, struct v4l2_rect *ssm_roi)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ pr_info("[%s] : left(%d), width(%d), top(%d), height(%d)\n", __func__,
+ ssm_roi->left, ssm_roi->width, ssm_roi->top, ssm_roi->height);
+
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A64, ssm_roi->left);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A66, ssm_roi->width);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A68, ssm_roi->top);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0A6A, ssm_roi->height);
+ if (ret < 0) {
+ pr_err("ERR[%s]: super slow roi setting fail\n", __func__);
+ return ret;
+ }
+
+ return ret;
+}
+
+int sensor_2l4_cis_set_super_slow_motion_threshold(struct v4l2_subdev *subdev, u32 threshold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ u8 final_threshold = (u8)threshold;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ ret |= fimc_is_sensor_write16(cis->client, 0x6028, 0x2001);
+ ret |= fimc_is_sensor_write16(cis->client, 0x602A, 0x2CC0);
+ ret |= fimc_is_sensor_write16(cis->client, 0x6F12, final_threshold);
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ if (ret < 0) {
+ pr_err("ERR[%s]: super slow roi setting fail\n", __func__);
+ }
+
+ pr_info("[%s] : super slow threshold(%d)\n", __func__, threshold);
+
+ return ret;
+}
+
+int sensor_2l4_cis_get_super_slow_motion_threshold(struct v4l2_subdev *subdev, u32 *threshold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ u8 final_threshold = 0;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ ret |= fimc_is_sensor_write16(cis->client, 0x602C, 0x2000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x602E, 0xFF75);
+ ret |= fimc_is_sensor_read8(cis->client, 0x6F12, &final_threshold);
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ if (ret < 0) {
+ pr_err("ERR[%s]: super slow roi setting fail\n", __func__);
+ *threshold = 0;
+ return ret;
+ }
+
+ *threshold = final_threshold;
+
+ pr_info("[%s] : super slow threshold(%d)\n", __func__, *threshold);
+
+ return ret;
+}
+
+int sensor_2l4_cis_compensate_gain_for_extremely_br(struct v4l2_subdev *subdev, u32 expo, u32 *again, u32 *dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u16 coarse_int = 0;
+ u32 compensated_again = 0;
+ u32 remainder_cit = 0;
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ if (line_length_pck <= 0) {
+ err("[%s] invalid line_length_pck(%d)\n", __func__, line_length_pck);
+ goto p_err;
+ }
+
+ switch (cis->cis_data->cur_lownoise_mode) {
+ case FIMC_IS_CIS_LNOFF:
+ coarse_int = ((expo * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int) / line_length_pck;
+ remainder_cit = coarse_int % 2;
+ coarse_int -= remainder_cit;
+ if (coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, coarse_int, cis_data->min_coarse_integration_time);
+ coarse_int = cis_data->min_coarse_integration_time;
+ }
+ break;
+ case FIMC_IS_CIS_LN2:
+ coarse_int = ((expo * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int) / line_length_pck;
+ remainder_cit = coarse_int % 4;
+ coarse_int -= remainder_cit;
+ if (coarse_int < cis_data->min_coarse_integration_time * 2) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, coarse_int, cis_data->min_coarse_integration_time * 2);
+ coarse_int = cis_data->min_coarse_integration_time * 2;
+ }
+ break;
+ case FIMC_IS_CIS_LN4:
+ coarse_int = ((expo * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int) / line_length_pck;
+ remainder_cit = coarse_int % 8;
+ coarse_int -= remainder_cit;
+ if (coarse_int < cis_data->min_coarse_integration_time * 4) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, coarse_int, cis_data->min_coarse_integration_time * 4);
+ coarse_int = cis_data->min_coarse_integration_time * 4;
+ }
+ break;
+ default:
+ coarse_int = ((expo * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int) / line_length_pck;
+ if (coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, coarse_int, cis_data->min_coarse_integration_time);
+ coarse_int = cis_data->min_coarse_integration_time;
+ }
+ break;
+ }
+
+ if (coarse_int <= 1024) {
+ compensated_again = (*again * ((expo * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)) / (line_length_pck * coarse_int);
+
+ if (compensated_again < cis_data->min_analog_gain[1]) {
+ *again = cis_data->min_analog_gain[1];
+ } else if (*again >= cis_data->max_analog_gain[1]) {
+ *dgain = (*dgain * ((expo * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)) / (line_length_pck * coarse_int);
+ } else {
+ //*again = compensated_again;
+ *dgain = (*dgain * ((expo * (u64)(vt_pic_clk_freq_mhz)) / 1000 - min_fine_int)) / (line_length_pck * coarse_int);
+ }
+
+ dbg_sensor(1, "[%s] exp(%d), again(%d), dgain(%d), coarse_int(%d), compensated_again(%d)\n",
+ __func__, expo, *again, *dgain, coarse_int, compensated_again);
+ }
+
+p_err:
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops_2l4 = {
+ .cis_init = sensor_2l4_cis_init,
+ .cis_log_status = sensor_2l4_cis_log_status,
+ .cis_group_param_hold = sensor_2l4_cis_group_param_hold,
+ .cis_set_global_setting = sensor_2l4_cis_set_global_setting,
+ .cis_mode_change = sensor_2l4_cis_mode_change,
+ .cis_set_size = sensor_2l4_cis_set_size,
+ .cis_stream_on = sensor_2l4_cis_stream_on,
+ .cis_stream_off = sensor_2l4_cis_stream_off,
+ .cis_set_exposure_time = sensor_2l4_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_2l4_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_2l4_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_2l4_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_2l4_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_2l4_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_2l4_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_2l4_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_2l4_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_2l4_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_2l4_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_2l4_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_2l4_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_2l4_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_2l4_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_2l4_cis_compensate_gain_for_extremely_br,
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_data_calculation = sensor_2l4_cis_data_calc,
+ .cis_set_long_term_exposure = sensor_2l4_cis_long_term_exposure,
+#ifdef USE_CAMERA_EMBEDDED_HEADER
+ .cis_get_frame_id = sensor_2l4_cis_get_frame_id,
+#endif
+ .cis_set_frs_control = sensor_2l4_cis_set_frs_control,
+ .cis_set_super_slow_motion_roi = sensor_2l4_cis_set_super_slow_motion_roi,
+ .cis_check_rev = sensor_2l4_cis_check_rev,
+ .cis_set_super_slow_motion_threshold = sensor_2l4_cis_set_super_slow_motion_threshold,
+ .cis_get_super_slow_motion_threshold = sensor_2l4_cis_get_super_slow_motion_threshold,
+};
+
+static int cis_2l4_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id[FIMC_IS_STREAM_COUNT] = {0, };
+ u32 sensor_id_len;
+ const u32 *sensor_id_spec;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+ int i;
+
+ WARN_ON(!client);
+ WARN_ON(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ sensor_id_spec = of_get_property(dnode, "id", &sensor_id_len);
+ if (!sensor_id_spec) {
+ err("sensor_id num read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ sensor_id_len /= (unsigned int)sizeof(*sensor_id_spec);
+
+ probe_info("%s sensor_id_spec %d, sensor_id_len %d\n", __func__,
+ *sensor_id_spec, sensor_id_len);
+
+ ret = of_property_read_u32_array(dnode, "id", sensor_id, sensor_id_len);
+ if (ret) {
+ err("sensor_id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ for (i = 0; i < sensor_id_len; i++) {
+ probe_info("%s sensor_id %d\n", __func__, sensor_id[i]);
+ device = &core->sensor[sensor_id[i]];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_SAK2L4);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+ }
+
+ for (i = 0; i < sensor_id_len; i++) {
+ device = &core->sensor[sensor_id[i]];
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_SAK2L4);
+
+ cis = &sensor_peri->cis;
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ probe_err("subdev_cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_SAK2L4;
+ cis->subdev = subdev_cis;
+ cis->device = sensor_id[i];
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->i2c_lock = NULL;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+#ifdef USE_CAMERA_FACTORY_DRAM_TEST
+ cis->factory_dramtest_section2_fcount = SENSOR_2L4_DRAMTEST_SECTION2_FCOUNT;
+#endif
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ cis->cis_ops = &cis_ops_2l4;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_GR_BG;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F1_5;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+ }
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_2l4_reset_tnp = sensor_2l4_setfile_A_Reset_TnP;
+ sensor_2l4_reset_tnp_size = ARRAY_SIZE(sensor_2l4_setfile_A_Reset_TnP);
+ sensor_2l4_global = sensor_2l4_setfile_A_Global;
+ sensor_2l4_global_size = ARRAY_SIZE(sensor_2l4_setfile_A_Global);
+ sensor_2l4_dram_test_global = sensor_2l4_setfile_A_Reset_TnP;
+ sensor_2l4_dram_test_global_size = ARRAY_SIZE(sensor_2l4_setfile_A_Reset_TnP);
+ sensor_2l4_setfiles = sensor_2l4_setfiles_A;
+ sensor_2l4_setfile_sizes = sensor_2l4_setfile_A_sizes;
+ sensor_2l4_pllinfos = sensor_2l4_pllinfos_A;
+ sensor_2l4_max_setfile_num = ARRAY_SIZE(sensor_2l4_setfiles_A);
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ sensor_2l4_global_retention = sensor_2l4_setfile_A_Global_retention;
+ sensor_2l4_global_retention_size = ARRAY_SIZE(sensor_2l4_setfile_A_Global_retention);
+ sensor_2l4_retention = sensor_2l4_setfiles_A_retention;
+ sensor_2l4_retention_size = sensor_2l4_setfile_A_sizes_retention;
+ sensor_2l4_max_retention_num = ARRAY_SIZE(sensor_2l4_setfiles_A_retention);
+ sensor_2l4_load_sram = sensor_2l4_setfile_A_load_sram;
+ sensor_2l4_load_sram_size = sensor_2l4_setfile_A_sizes_load_sram;
+#endif
+ } else if (strcmp(setfile, "setB") == 0) {
+ probe_info("%s setfile_B\n", __func__);
+ sensor_2l4_reset_tnp = sensor_2l4_setfile_B_Reset_TnP;
+ sensor_2l4_reset_tnp_size = ARRAY_SIZE(sensor_2l4_setfile_B_Reset_TnP);
+ sensor_2l4_global = sensor_2l4_setfile_B_Global;
+ sensor_2l4_global_size = ARRAY_SIZE(sensor_2l4_setfile_B_Global);
+ sensor_2l4_dram_test_global = sensor_2l4_setfile_B_dram_test_Global;
+ sensor_2l4_dram_test_global_size = ARRAY_SIZE(sensor_2l4_setfile_B_dram_test_Global);
+ sensor_2l4_setfiles = sensor_2l4_setfiles_B;
+ sensor_2l4_setfile_sizes = sensor_2l4_setfile_B_sizes;
+ sensor_2l4_pllinfos = sensor_2l4_pllinfos_B;
+ sensor_2l4_max_setfile_num = ARRAY_SIZE(sensor_2l4_setfiles_B);
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ sensor_2l4_global_retention = sensor_2l4_setfile_B_Global_retention;
+ sensor_2l4_global_retention_size = ARRAY_SIZE(sensor_2l4_setfile_B_Global_retention);
+ sensor_2l4_retention = sensor_2l4_setfiles_B_retention;
+ sensor_2l4_retention_size = sensor_2l4_setfile_B_sizes_retention;
+ sensor_2l4_max_retention_num = ARRAY_SIZE(sensor_2l4_setfiles_B_retention);
+ sensor_2l4_load_sram = sensor_2l4_setfile_B_load_sram;
+ sensor_2l4_load_sram_size = sensor_2l4_setfile_B_sizes_load_sram;
+#endif
+ } else {
+ err("%s setfile index out of bound, take default (setfile_B)", __func__);
+ sensor_2l4_reset_tnp = sensor_2l4_setfile_B_Reset_TnP;
+ sensor_2l4_reset_tnp_size = ARRAY_SIZE(sensor_2l4_setfile_B_Reset_TnP);
+ sensor_2l4_global = sensor_2l4_setfile_B_Global;
+ sensor_2l4_global_size = ARRAY_SIZE(sensor_2l4_setfile_B_Global);
+ sensor_2l4_dram_test_global = sensor_2l4_setfile_B_dram_test_Global;
+ sensor_2l4_dram_test_global_size = ARRAY_SIZE(sensor_2l4_setfile_B_dram_test_Global);
+ sensor_2l4_setfiles = sensor_2l4_setfiles_B;
+ sensor_2l4_setfile_sizes = sensor_2l4_setfile_B_sizes;
+ sensor_2l4_pllinfos = sensor_2l4_pllinfos_B;
+ sensor_2l4_max_setfile_num = ARRAY_SIZE(sensor_2l4_setfiles_B);
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ sensor_2l4_global_retention = sensor_2l4_setfile_B_Global_retention;
+ sensor_2l4_global_retention_size = ARRAY_SIZE(sensor_2l4_setfile_B_Global_retention);
+ sensor_2l4_retention = sensor_2l4_setfiles_B_retention;
+ sensor_2l4_retention_size = sensor_2l4_setfile_B_sizes_retention;
+ sensor_2l4_max_retention_num = ARRAY_SIZE(sensor_2l4_setfiles_B_retention);
+ sensor_2l4_load_sram = sensor_2l4_setfile_B_load_sram;
+ sensor_2l4_load_sram_size = sensor_2l4_setfile_B_sizes_load_sram;
+#endif
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_2l4_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-2l4",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_2l4_match);
+
+static const struct i2c_device_id sensor_cis_2l4_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_2l4_driver = {
+ .probe = cis_2l4_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_2l4_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_2l4_idt
+};
+
+static int __init sensor_cis_2l4_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_2l4_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_2l4_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_2l4_init);
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_2L4_H
+#define FIMC_IS_CIS_2L4_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_2L4_MAX_WIDTH (4032 + 0)
+#define SENSOR_2L4_MAX_HEIGHT (3024 + 0)
+
+#define SENSOR_2L4_FINE_INTEGRATION_TIME_MIN 0x100
+#define SENSOR_2L4_FINE_INTEGRATION_TIME_MAX 0x100
+#define SENSOR_2L4_COARSE_INTEGRATION_TIME_MIN 0x10
+#define SENSOR_2L4_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x30
+
+#ifdef USE_CAMERA_FACTORY_DRAM_TEST
+#define SENSOR_2L4_DRAMTEST_SECTION2_FCOUNT (8)
+#endif
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+enum sensor_2l4_mode_enum {
+ /* MODE 3 */
+ SENSOR_2L4_4032X3024_30FPS = 0,
+ SENSOR_2L4_4032X2268_60FPS = 1,
+ SENSOR_2L4_4032X2268_30FPS = 2,
+ SENSOR_2L4_4032X1908_30FPS = 3,
+ SENSOR_2L4_3024X3024_30FPS = 4,
+ SENSOR_2L4_2016X1512_30FPS = 5,
+ SENSOR_2L4_2016X1134_30FPS = 6,
+ SENSOR_2L4_1504X1504_30FPS = 7,
+ /* MODE 3 - 24fps LIVE FOCUS */
+ SENSOR_2L4_4032X3024_24FPS = 8,
+ SENSOR_2L4_4032X2268_24FPS = 9,
+ SENSOR_2L4_4032X1908_24FPS = 10,
+ SENSOR_2L4_3024X3024_24FPS = 11,
+ /* MODE 2 */
+ SENSOR_2L4_4032X2268_60FPS_MODE2 = 12,
+ SENSOR_2L4_2016X1512_120FPS_MODE2 = 13,
+ SENSOR_2L4_2016X1512_30FPS_MODE2 = 14,
+ SENSOR_2L4_2016X1134_240FPS_MODE2 = 15,
+ SENSOR_2L4_2016X1134_120FPS_MODE2 = 16,
+ SENSOR_2L4_2016X1134_30FPS_MODE2 = 17,
+ SENSOR_2L4_1504X1504_120FPS_MODE2 = 18,
+ SENSOR_2L4_1504X1504_30FPS_MODE2 = 19,
+ SENSOR_2L4_1008X756_120FPS_MODE2 = 20,
+ /* MODE 2 SSM */
+ SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_960 = 21,
+ SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_480 = 22,
+ SENSOR_2L4_1280X720_60FPS_MODE2_SSM_960 = 23,
+ SENSOR_2L4_1280X720_60FPS_MODE2_SSM_480 = 24,
+ /* MODE 2 DRAM TEST */
+ SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1 = 25,
+ SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2 = 26,
+ SENSOR_2L4_MODE_MAX,
+};
+
+static bool sensor_2l4_support_wdr[] = {
+ /* MODE 3 */
+ true, //SENSOR_2L4_4032X3024_30FPS = 0,
+ true, //SENSOR_2L4_4032X2268_60FPS = 1,
+ true, //SENSOR_2L4_4032X2268_30FPS = 2,
+ true, //SENSOR_2L4_4032X1908_30FPS = 3,
+ true, //SENSOR_2L4_3024X3024_30FPS = 4,
+ false, //SENSOR_2L4_2016X1512_30FPS = 5,
+ false, //SENSOR_2L4_2016X1134_30FPS = 6,
+ false, //SENSOR_2L4_1504X1504_30FPS = 7,
+ /* MODE 3 - 24fps LIVE FOCUS */
+ true, //SENSOR_2L4_4032X3024_24FPS = 8,
+ true, //SENSOR_2L4_4032X2268_24FPS = 9,
+ true, //SENSOR_2L4_4032X1908_24FPS = 10,
+ true, //SENSOR_2L4_3024X3024_24FPS = 11,
+ /* MODE 2 */
+ true, //SENSOR_2L4_4032X2268_60FPS_MODE2 = 12,
+ false, //SENSOR_2L4_2016X1512_120FPS_MODE2 = 13,
+ false, //SENSOR_2L4_2016X1512_30FPS_MODE2 = 14,
+ false, //SENSOR_2L4_2016X1134_240FPS_MODE2 = 15,
+ false, //SENSOR_2L4_2016X1134_120FPS_MODE2 = 16,
+ false, //SENSOR_2L4_2016X1134_30FPS_MODE2 = 17,
+ false, //SENSOR_2L4_1504X1504_120FPS_MODE2 = 18,
+ false, //SENSOR_2L4_1504X1504_30FPS_MODE2 = 19,
+ false, //SENSOR_2L4_1008X756_120FPS_MODE2 = 20,
+ /* MODE 2 SSM */
+ false, //SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_960 = 21,
+ false, //SENSOR_2L4_2016X1134_60FPS_MODE2_SSM_480 = 22,
+ false, //SENSOR_2L4_1280X720_60FPS_MODE2_SSM_960 = 23,
+ false, //SENSOR_2L4_1280X720_60FPS_MODE2_SSM_480 = 24,
+ /* MODE 2 DRAM TEST */
+ false, //SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION1 = 25,
+ false, //SENSOR_2L4_4032X3024_30FPS_MODE2_DRAM_TEST_SECTION2 = 26,
+};
+
+enum sensor_2l4_load_sram_mode {
+ SENSOR_2L4_4032x3024_30FPS_LOAD_SRAM = 0,
+ SENSOR_2L4_4032x2268_30FPS_LOAD_SRAM,
+ SENSOR_2L4_4032x3024_24FPS_LOAD_SRAM,
+ SENSOR_2L4_4032x2268_24FPS_LOAD_SRAM,
+ SENSOR_2L4_4032x2268_60FPS_LOAD_SRAM,
+ SENSOR_2L4_1008x756_120FPS_LOAD_SRAM,
+};
+
+int sensor_2l4_cis_stream_on(struct v4l2_subdev *subdev);
+int sensor_2l4_cis_stream_off(struct v4l2_subdev *subdev);
+#ifdef CONFIG_SENSOR_RETENTION_USE
+int sensor_2l4_cis_retention_crc_check(struct v4l2_subdev *subdev);
+int sensor_2l4_cis_retention_prepare(struct v4l2_subdev *subdev);
+#endif
+int sensor_2l4_cis_set_lownoise_mode_change(struct v4l2_subdev *subdev);
+#endif
.cis_retention_prepare = sensor_2l7_cis_retention_prepare,
.cis_retention_crc_check = sensor_2l7_cis_retention_crc_check,
#endif
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_2l7_probe(struct i2c_client *client,
#endif
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int __init cis_2p2_probe(struct i2c_client *client,
sensor_2p2_max_setfile_num = sizeof(sensor_2p2_setfiles_A) / sizeof(sensor_2p2_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
int cis_2p6_probe(struct i2c_client *client,
sensor_2p6_pllinfos = sensor_2p6_pllinfos_A;
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
.cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_factory_test = sensor_cis_factory_test,
};
static int cis_2p7sq_probe(struct i2c_client *client,
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_2p7sx_probe(struct i2c_client *client,
sensor_2p7sx_max_setfile_num = ARRAY_SIZE(sensor_2p7sx_setfiles_A);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_2p8_probe(struct i2c_client *client,
sensor_2p8_max_setfile_num = sizeof(sensor_2p8_setfiles_A) / sizeof(sensor_2p8_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
.cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_factory_test = sensor_cis_factory_test,
};
static int cis_2t7sx_probe(struct i2c_client *client,
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_2X5SP_SET_A_H
+#define FIMC_IS_CIS_2X5SP_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-2x5sp.h"
+
+const u32 sensor_2x5sp_setfile_A_Global[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x0000, 0x0006, 0x2,
+ 0x0000, 0x2185, 0x2,
+ 0x6010, 0x0001, 0x2,
+
+ I2C_MODE_DELAY, 8000, 0x00,
+
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0A02, 0x00FE, 0x2,
+
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0xCA20, 0x2,
+ 0x6F12, 0x06F0, 0x2,
+ 0x6F12, 0xF1B8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2600, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0xD446, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x10B1, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x28FF, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0220, 0x2,
+ 0x6F12, 0xE074, 0x2,
+ 0x6F12, 0x48B1, 0x2,
+ 0x6F12, 0x0128, 0x2,
+ 0x6F12, 0x0ED0, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x12D1, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x1FBF, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x1DBF, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x1CBF, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x0746, 0x2,
+ 0x6F12, 0xFE48, 0x2,
+ 0x6F12, 0x0E46, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x4068, 0x2,
+ 0x6F12, 0x85B2, 0x2,
+ 0x6F12, 0x040C, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x13FF, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x3846, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x14FF, 0x2,
+ 0x6F12, 0x012E, 0x2,
+ 0x6F12, 0x10D1, 0x2,
+ 0x6F12, 0xF748, 0x2,
+ 0x6F12, 0xF74A, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x9000, 0x2,
+ 0x6F12, 0x90B1, 0x2,
+ 0x6F12, 0x02F5, 0x2,
+ 0x6F12, 0x0772, 0x2,
+ 0x6F12, 0xF548, 0x2,
+ 0x6F12, 0x1060, 0x2,
+ 0x6F12, 0x2030, 0x2,
+ 0x6F12, 0x5060, 0x2,
+ 0x6F12, 0x1038, 0x2,
+ 0x6F12, 0x9060, 0x2,
+ 0x6F12, 0x3038, 0x2,
+ 0x6F12, 0xD060, 0x2,
+ 0x6F12, 0x1030, 0x2,
+ 0x6F12, 0x1061, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xF5BE, 0x2,
+ 0x6F12, 0x02F5, 0x2,
+ 0x6F12, 0x0872, 0x2,
+ 0x6F12, 0xED48, 0x2,
+ 0x6F12, 0x1060, 0x2,
+ 0x6F12, 0xED48, 0x2,
+ 0x6F12, 0x5060, 0x2,
+ 0x6F12, 0xEA48, 0x2,
+ 0x6F12, 0x4038, 0x2,
+ 0x6F12, 0x9060, 0x2,
+ 0x6F12, 0x1030, 0x2,
+ 0x6F12, 0xD060, 0x2,
+ 0x6F12, 0xECE7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x0D46, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x90B0, 0x2,
+ 0x6F12, 0x0278, 0x2,
+ 0x6F12, 0x0A80, 0x2,
+ 0x6F12, 0x2022, 0x2,
+ 0x6F12, 0x8A82, 0x2,
+ 0x6F12, 0x0178, 0x2,
+ 0x6F12, 0x0029, 0x2,
+ 0x6F12, 0x5FD1, 0x2,
+ 0x6F12, 0x4468, 0x2,
+ 0x6F12, 0x4021, 0x2,
+ 0x6F12, 0x6846, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xE1FE, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xE4FE, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x7093, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xE846, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x78A3, 0x2,
+ 0x6F12, 0x99F8, 0x2,
+ 0x6F12, 0x07C0, 0x2,
+ 0x6F12, 0x99F8, 0x2,
+ 0x6F12, 0x0A70, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0x1146, 0x2,
+ 0x6F12, 0xBCF1, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x6F12, 0x03D0, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x01D1, 0x2,
+ 0x6F12, 0x1AF8, 0x2,
+ 0x6F12, 0x0210, 0x2,
+ 0x6F12, 0xA618, 0x2,
+ 0x6F12, 0x8B08, 0x2,
+ 0x6F12, 0x96F8, 0x2,
+ 0x6F12, 0x0061, 0x2,
+ 0x6F12, 0x8907, 0x2,
+ 0x6F12, 0x090F, 0x2,
+ 0x6F12, 0x8E40, 0x2,
+ 0x6F12, 0x58F8, 0x2,
+ 0x6F12, 0x2310, 0x2,
+ 0x6F12, 0x0E43, 0x2,
+ 0x6F12, 0x48F8, 0x2,
+ 0x6F12, 0x2360, 0x2,
+ 0x6F12, 0x521C, 0x2,
+ 0x6F12, 0x4B46, 0x2,
+ 0x6F12, 0x9742, 0x2,
+ 0x6F12, 0xE5D8, 0x2,
+ 0x6F12, 0x1622, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0xAF18, 0x2,
+ 0x6F12, 0x07F1, 0x2,
+ 0x6F12, 0x8047, 0x2,
+ 0x6F12, 0x58F8, 0x2,
+ 0x6F12, 0x2160, 0x2,
+ 0x6F12, 0x3E80, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0x921C, 0x2,
+ 0x6F12, 0x1029, 0x2,
+ 0x6F12, 0xF5D3, 0x2,
+ 0x6F12, 0x3622, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x0E0C, 0x2,
+ 0x6F12, 0xAF18, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0xDE79, 0x2,
+ 0x6F12, 0x0A46, 0x2,
+ 0x6F12, 0x1EB1, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x01D1, 0x2,
+ 0x6F12, 0x1AF8, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x0108, 0x2,
+ 0x6F12, 0x54F8, 0x2,
+ 0x6F12, 0x2160, 0x2,
+ 0x6F12, 0x98F8, 0x2,
+ 0x6F12, 0x0081, 0x2,
+ 0x6F12, 0x07EB, 0x2,
+ 0x6F12, 0x4202, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0x26FA, 0x2,
+ 0x6F12, 0x08F6, 0x2,
+ 0x6F12, 0x1680, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0x9A7A, 0x2,
+ 0x6F12, 0x8A42, 0x2,
+ 0x6F12, 0xE5D8, 0x2,
+ 0x6F12, 0xB848, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x3411, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0x0C00, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x10B0, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF087, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF35F, 0x2,
+ 0x6F12, 0x8146, 0x2,
+ 0x6F12, 0xB248, 0x2,
+ 0x6F12, 0xD0F8, 0x2,
+ 0x6F12, 0x7811, 0x2,
+ 0x6F12, 0xD0F8, 0x2,
+ 0x6F12, 0x7001, 0x2,
+ 0x6F12, 0x4143, 0x2,
+ 0x6F12, 0x0A0B, 0x2,
+ 0x6F12, 0xB049, 0x2,
+ 0x6F12, 0xA1F1, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x7EFE, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x98A2, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0x4C1B, 0x2,
+ 0x6F12, 0x0AEB, 0x2,
+ 0x6F12, 0x0401, 0x2,
+ 0x6F12, 0x5646, 0x2,
+ 0x6F12, 0x11F8, 0x2,
+ 0x6F12, 0x0B00, 0x2,
+ 0x6F12, 0x80BB, 0x2,
+ 0x6F12, 0xA948, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x6AFE, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x02D0, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x05D0, 0x2,
+ 0x6F12, 0x08E0, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8401, 0x2,
+ 0x6F12, 0xD1F8, 0x2,
+ 0x6F12, 0x2852, 0x2,
+ 0x6F12, 0x03E0, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8401, 0x2,
+ 0x6F12, 0xD1F8, 0x2,
+ 0x6F12, 0x1C52, 0x2,
+ 0x6F12, 0xC4EB, 0x2,
+ 0x6F12, 0x0411, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x4102, 0x2,
+ 0x6F12, 0x9D49, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0xC206, 0x2,
+ 0x6F12, 0x331D, 0x2,
+ 0x6F12, 0x6039, 0x2,
+ 0x6F12, 0x0128, 0x2,
+ 0x6F12, 0x0FD9, 0x2,
+ 0x6F12, 0xA1F1, 0x2,
+ 0x6F12, 0xF600, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x6F12, 0x58B1, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x0417, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x804C, 0x2,
+ 0x6F12, 0x57F8, 0x2,
+ 0x6F12, 0x2100, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x6045, 0x2,
+ 0x6F12, 0x06D2, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x09E0, 0x2,
+ 0x6F12, 0x1846, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x48FE, 0x2,
+ 0x6F12, 0x11E0, 0x2,
+ 0x6F12, 0x19E0, 0x2,
+ 0x6F12, 0xB0FA, 0x2,
+ 0x6F12, 0x80F2, 0x2,
+ 0x6F12, 0xC2F1, 0x2,
+ 0x6F12, 0x1202, 0x2,
+ 0x6F12, 0xD2B2, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x0108, 0x2,
+ 0x6F12, 0xD040, 0x2,
+ 0x6F12, 0x88F8, 0x2,
+ 0x6F12, 0x6021, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x8102, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0xC2F8, 0x2,
+ 0x6F12, 0x4001, 0x2,
+ 0x6F12, 0x0429, 0x2,
+ 0x6F12, 0xE2D3, 0x2,
+ 0x6F12, 0x8848, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC400, 0x2,
+ 0x6F12, 0xD0F8, 0x2,
+ 0x6F12, 0x8010, 0x2,
+ 0x6F12, 0x301D, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x31FE, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x032C, 0x2,
+ 0x6F12, 0xAAD3, 0x2,
+ 0x6F12, 0x4846, 0x2,
+ 0x6F12, 0x0199, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xFC5F, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x2DBE, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF05F, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0x7348, 0x2,
+ 0x6F12, 0x8B46, 0x2,
+ 0x6F12, 0x1746, 0x2,
+ 0x6F12, 0xC068, 0x2,
+ 0x6F12, 0x9A46, 0x2,
+ 0x6F12, 0x4FEA, 0x2,
+ 0x6F12, 0x1049, 0x2,
+ 0x6F12, 0x80B2, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x0146, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x4846, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xF9FD, 0x2,
+ 0x6F12, 0x7848, 0x2,
+ 0x6F12, 0x734D, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xC800, 0x2,
+ 0x6F12, 0x0128, 0x2,
+ 0x6F12, 0x04D1, 0x2,
+ 0x6F12, 0x95F8, 0x2,
+ 0x6F12, 0xC000, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x832C, 0x2,
+ 0x6F12, 0x35D1, 0x2,
+ 0x6F12, 0x98B3, 0x2,
+ 0x6F12, 0x07F1, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x40F2, 0x2,
+ 0x6F12, 0x1341, 0x2,
+ 0x6F12, 0x40F2, 0x2,
+ 0x6F12, 0x0110, 0x2,
+ 0x6F12, 0xB181, 0x2,
+ 0x6F12, 0xF081, 0x2,
+ 0x6F12, 0x3082, 0x2,
+ 0x6F12, 0x5346, 0x2,
+ 0x6F12, 0x3A46, 0x2,
+ 0x6F12, 0x5946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x03FE, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x3080, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x6849, 0x2,
+ 0x6F12, 0x5C4B, 0x2,
+ 0x6F12, 0x861E, 0x2,
+ 0x6F12, 0x19E0, 0x2,
+ 0x6F12, 0x0A88, 0x2,
+ 0x6F12, 0x5208, 0x2,
+ 0x6F12, 0x0A80, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x6072, 0x2,
+ 0x6F12, 0x042F, 0x2,
+ 0x6F12, 0x08D1, 0x2,
+ 0x6F12, 0x921E, 0x2,
+ 0x6F12, 0x02F0, 0x2,
+ 0x6F12, 0x0307, 0x2,
+ 0x6F12, 0x022F, 0x2,
+ 0x6F12, 0x02D0, 0x2,
+ 0x6F12, 0xD743, 0x2,
+ 0x6F12, 0xBF07, 0x2,
+ 0x6F12, 0x00D1, 0x2,
+ 0x6F12, 0x0A80, 0x2,
+ 0x6F12, 0x95F8, 0x2,
+ 0x6F12, 0xBF20, 0x2,
+ 0x6F12, 0x891C, 0x2,
+ 0x6F12, 0x1AB1, 0x2,
+ 0x6F12, 0x0A88, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x5202, 0x2,
+ 0x6F12, 0x0A80, 0x2,
+ 0x6F12, 0x891C, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0xA042, 0x2,
+ 0x6F12, 0xE3D3, 0x2,
+ 0x6F12, 0x07E0, 0x2,
+ 0x6F12, 0xFFE7, 0x2,
+ 0x6F12, 0x5346, 0x2,
+ 0x6F12, 0x3A46, 0x2,
+ 0x6F12, 0x5946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xD7FD, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x4146, 0x2,
+ 0x6F12, 0x4846, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xA9FD, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF09F, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xFC5F, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x4148, 0x2,
+ 0x6F12, 0x0C46, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x0169, 0x2,
+ 0x6F12, 0x080C, 0x2,
+ 0x6F12, 0x0190, 0x2,
+ 0x6F12, 0x88B2, 0x2,
+ 0x6F12, 0x0146, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0x0198, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x97FD, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xC0FD, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xA0FD, 0x2,
+ 0x6F12, 0x3A49, 0x2,
+ 0x6F12, 0xC979, 0x2,
+ 0x6F12, 0x891C, 0x2,
+ 0x6F12, 0x41F0, 0x2,
+ 0x6F12, 0x1002, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x00D3, 0x2,
+ 0x6F12, 0x1222, 0x2,
+ 0x6F12, 0x3B4B, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x440E, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x2009, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0xE413, 0x2,
+ 0x6F12, 0x42EA, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0xE523, 0x2,
+ 0x6F12, 0x394B, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x023A, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0xCE0B, 0x2,
+ 0x6F12, 0x2021, 0x2,
+ 0x6F12, 0x012A, 0x2,
+ 0x6F12, 0x02D0, 0x2,
+ 0x6F12, 0x022A, 0x2,
+ 0x6F12, 0x04D0, 0x2,
+ 0x6F12, 0x06E0, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x04D3, 0x2,
+ 0x6F12, 0x4021, 0x2,
+ 0x6F12, 0x02E0, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x00D1, 0x2,
+ 0x6F12, 0x8021, 0x2,
+ 0x6F12, 0x0BEB, 0x2,
+ 0x6F12, 0xC206, 0x2,
+ 0x6F12, 0x8CB2, 0x2,
+ 0x6F12, 0xB38E, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0x2C81, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x0A90, 0x2,
+ 0x6F12, 0x1827, 0x2,
+ 0x6F12, 0x2825, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x0EE0, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x070C, 0x2,
+ 0x6F12, 0x8C44, 0x2,
+ 0x6F12, 0x0CF1, 0x2,
+ 0x6F12, 0x804C, 0x2,
+ 0x6F12, 0xBCF8, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x0508, 0x2,
+ 0x6F12, 0x8844, 0x2,
+ 0x6F12, 0x08F1, 0x2,
+ 0x6F12, 0x8048, 0x2,
+ 0x6F12, 0xA8F8, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x6F12, 0x891C, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0xBCF1, 0x2,
+ 0x6F12, 0x560F, 0x2,
+ 0x6F12, 0xEBD9, 0x2,
+ 0x6F12, 0x1F49, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x4E01, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x4201, 0x2,
+ 0x6F12, 0xB1F8, 0x2,
+ 0x6F12, 0x4C10, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xCC80, 0x2,
+ 0x6F12, 0x36F8, 0x2,
+ 0x6F12, 0x601F, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x4C82, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x1490, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x0CA0, 0x2,
+ 0x6F12, 0xB18B, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x4C82, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x1490, 0x2,
+ 0x6F12, 0x521C, 0x2,
+ 0x6F12, 0x032A, 0x2,
+ 0x6F12, 0xB5D3, 0x2,
+ 0x6F12, 0x1448, 0x2,
+ 0x6F12, 0x1549, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x5A00, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0xDDE9, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x6F12, 0x02B0, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF05F, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x21BD, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8BA0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xEA30, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x228E, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x227E, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x223E, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x26F0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8580, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xA658, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xC43C, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x7FB0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0x8000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x31A0, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xB136, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0xFE48, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x8169, 0x2,
+ 0x6F12, 0x0C0C, 0x2,
+ 0x6F12, 0x8DB2, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xF6FC, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x26FD, 0x2,
+ 0x6F12, 0xF948, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xC010, 0x2,
+ 0x6F12, 0x09B3, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xBF00, 0x2,
+ 0x6F12, 0xF0B1, 0x2,
+ 0x6F12, 0xF74A, 0x2,
+ 0x6F12, 0x108B, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x1083, 0x2,
+ 0x6F12, 0x508B, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x5083, 0x2,
+ 0x6F12, 0x908B, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x9083, 0x2,
+ 0x6F12, 0x108C, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x1084, 0x2,
+ 0x6F12, 0xD08B, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0xD083, 0x2,
+ 0x6F12, 0x9089, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x9081, 0x2,
+ 0x6F12, 0xD089, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0xD081, 0x2,
+ 0x6F12, 0x1088, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x1080, 0x2,
+ 0x6F12, 0xD08A, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0xD082, 0x2,
+ 0x6F12, 0x108A, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x1082, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xC7BC, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0xE148, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xC169, 0x2,
+ 0x6F12, 0x0C0C, 0x2,
+ 0x6F12, 0x8DB2, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xBDFC, 0x2,
+ 0x6F12, 0xE04B, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0xC800, 0x2,
+ 0x6F12, 0x0128, 0x2,
+ 0x6F12, 0x0ED1, 0x2,
+ 0x6F12, 0xDB48, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2720, 0x2,
+ 0x6F12, 0x222A, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x6F12, 0x242A, 0x2,
+ 0x6F12, 0x07D1, 0x2,
+ 0x6F12, 0x03F5, 0x2,
+ 0x6F12, 0x3C73, 0x2,
+ 0x6F12, 0xD86C, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xD864, 0x2,
+ 0x6F12, 0x1868, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0x1860, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xDEFC, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xA0BC, 0x2,
+ 0x6F12, 0xD348, 0x2,
+ 0x6F12, 0xD249, 0x2,
+ 0x6F12, 0x4160, 0x2,
+ 0x6F12, 0xD349, 0x2,
+ 0x6F12, 0x8160, 0x2,
+ 0x6F12, 0xD349, 0x2,
+ 0x6F12, 0xC160, 0x2,
+ 0x6F12, 0xD349, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x6F12, 0xD349, 0x2,
+ 0x6F12, 0x4161, 0x2,
+ 0x6F12, 0xD349, 0x2,
+ 0x6F12, 0x8161, 0x2,
+ 0x6F12, 0xD249, 0x2,
+ 0x6F12, 0x8031, 0x2,
+ 0x6F12, 0xC161, 0x2,
+ 0x6F12, 0xD149, 0x2,
+ 0x6F12, 0x4162, 0x2,
+ 0x6F12, 0xD149, 0x2,
+ 0x6F12, 0x8162, 0x2,
+ 0x6F12, 0xD149, 0x2,
+ 0x6F12, 0xC162, 0x2,
+ 0x6F12, 0xD149, 0x2,
+ 0x6F12, 0x0163, 0x2,
+ 0x6F12, 0xD149, 0x2,
+ 0x6F12, 0x4163, 0x2,
+ 0x6F12, 0xD149, 0x2,
+ 0x6F12, 0x8163, 0x2,
+ 0x6F12, 0xD049, 0x2,
+ 0x6F12, 0x8031, 0x2,
+ 0x6F12, 0xC163, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x0124, 0x2,
+ 0x6F12, 0xE0B2, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xB5FC, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x0D2C, 0x2,
+ 0x6F12, 0xF8DD, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x4FF6, 0x2,
+ 0x6F12, 0xFF73, 0x2,
+ 0x6F12, 0x30F8, 0x2,
+ 0x6F12, 0x1120, 0x2,
+ 0x6F12, 0x1AB1, 0x2,
+ 0x6F12, 0x9A42, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x6F12, 0x90B2, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0x0229, 0x2,
+ 0x6F12, 0xF5D3, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xC3FF, 0x2,
+ 0x6F12, 0xC14C, 0x2,
+ 0x6F12, 0x94F8, 0x2,
+ 0x6F12, 0x8000, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xDEFF, 0x2,
+ 0x6F12, 0xBF48, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0x9805, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x11D0, 0x2,
+ 0x6F12, 0xA0F5, 0x2,
+ 0x6F12, 0x7F41, 0x2,
+ 0x6F12, 0xFF39, 0x2,
+ 0x6F12, 0x0DD0, 0x2,
+ 0x6F12, 0x0822, 0x2,
+ 0x6F12, 0xA11C, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x91FC, 0x2,
+ 0x6F12, 0xA01C, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xD8FF, 0x2,
+ 0x6F12, 0xAA4D, 0x2,
+ 0x6F12, 0x2884, 0x2,
+ 0x6F12, 0xA01D, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xD3FF, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0xF0B5, 0x2,
+ 0x6F12, 0x7A22, 0x2,
+ 0x6F12, 0xA54B, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0xC464, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x4105, 0x2,
+ 0x6F12, 0x0768, 0x2,
+ 0x6F12, 0x2E5B, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0x7E53, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0x921C, 0x2,
+ 0x6F12, 0x0429, 0x2,
+ 0x6F12, 0xF4DB, 0x2,
+ 0x6F12, 0xF0BD, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x0124, 0x2,
+ 0x6F12, 0xE0B2, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x72FC, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x0D2C, 0x2,
+ 0x6F12, 0xF8D9, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x0646, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xF0FF, 0x2,
+ 0x6F12, 0x954C, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8C65, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F1, 0x2,
+ 0x6F12, 0x4401, 0x2,
+ 0x6F12, 0x606A, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x65FC, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F2, 0x2,
+ 0x6F12, 0xA441, 0x2,
+ 0x6F12, 0xA06A, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x5FFC, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F6, 0x2,
+ 0x6F12, 0x0411, 0x2,
+ 0x6F12, 0xE06A, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x59FC, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F6, 0x2,
+ 0x6F12, 0x6451, 0x2,
+ 0x6F12, 0x206B, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x53FC, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0x9549, 0x2,
+ 0x6F12, 0xA06B, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x4EFC, 0x2,
+ 0x6F12, 0x9349, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0x5031, 0x2,
+ 0x6F12, 0xE06B, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x48FC, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xC7FF, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0xB0E7, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x0646, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xBEFF, 0x2,
+ 0x6F12, 0x7C4C, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8C65, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F1, 0x2,
+ 0x6F12, 0x4401, 0x2,
+ 0x6F12, 0x6068, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x33FC, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F2, 0x2,
+ 0x6F12, 0xA441, 0x2,
+ 0x6F12, 0xA068, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x2DFC, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F6, 0x2,
+ 0x6F12, 0x0411, 0x2,
+ 0x6F12, 0xE068, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x27FC, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x04F6, 0x2,
+ 0x6F12, 0x6451, 0x2,
+ 0x6F12, 0x2069, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x21FC, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x7849, 0x2,
+ 0x6F12, 0x6069, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x1CFC, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0x7949, 0x2,
+ 0x6F12, 0xA069, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x17FC, 0x2,
+ 0x6F12, 0x7749, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0x5031, 0x2,
+ 0x6F12, 0xE069, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x11FC, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x90FF, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x79E7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xFC41, 0x2,
+ 0x6F12, 0x8446, 0x2,
+ 0x6F12, 0x6D48, 0x2,
+ 0x6F12, 0x1C46, 0x2,
+ 0x6F12, 0x0F46, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0x6600, 0x2,
+ 0x6F12, 0x1546, 0x2,
+ 0x6F12, 0xDDE9, 0x2,
+ 0x6F12, 0x0831, 0x2,
+ 0x6F12, 0x0A9E, 0x2,
+ 0x6F12, 0xA0F5, 0x2,
+ 0x6F12, 0x9052, 0x2,
+ 0x6F12, 0x3D3A, 0x2,
+ 0x6F12, 0x08D0, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6F12, 0x2246, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x3846, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0xF8FB, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xFC81, 0x2,
+ 0x6F12, 0x654F, 0x2,
+ 0x6F12, 0x2068, 0x2,
+ 0x6F12, 0xA7F5, 0x2,
+ 0x6F12, 0x4B6E, 0x2,
+ 0x6F12, 0x11E0, 0x2,
+ 0x6F12, 0x0202, 0x2,
+ 0x6F12, 0x0A60, 0x2,
+ 0x6F12, 0x1868, 0x2,
+ 0x6F12, 0xBCF1, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x6F12, 0x385C, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x1EF8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0243, 0x2,
+ 0x6F12, 0x0A60, 0x2,
+ 0x6F12, 0x1868, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x1860, 0x2,
+ 0x6F12, 0x2068, 0x2,
+ 0x6F12, 0x0830, 0x2,
+ 0x6F12, 0x2060, 0x2,
+ 0x6F12, 0xA842, 0x2,
+ 0x6F12, 0x0868, 0x2,
+ 0x6F12, 0xEADB, 0x2,
+ 0x6F12, 0x2168, 0x2,
+ 0x6F12, 0x4A1B, 0x2,
+ 0x6F12, 0xD040, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0xA940, 0x2,
+ 0x6F12, 0x491E, 0x2,
+ 0x6F12, 0x0840, 0x2,
+ 0x6F12, 0x1EB1, 0x2,
+ 0x6F12, 0xC5F1, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x8840, 0x2,
+ 0x6F12, 0x0841, 0x2,
+ 0x6F12, 0x2260, 0x2,
+ 0x6F12, 0xD5E7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xFF4F, 0x2,
+ 0x6F12, 0xFDB0, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x9946, 0x2,
+ 0x6F12, 0x7596, 0x2,
+ 0x6F12, 0x7496, 0x2,
+ 0x6F12, 0x2421, 0x2,
+ 0x6F12, 0x6BA8, 0x2,
+ 0x6F12, 0x7696, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x7CFB, 0x2,
+ 0x6F12, 0x4021, 0x2,
+ 0x6F12, 0x5BA8, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x78FB, 0x2,
+ 0x6F12, 0xB021, 0x2,
+ 0x6F12, 0x03A8, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x74FB, 0x2,
+ 0x6F12, 0xB021, 0x2,
+ 0x6F12, 0x2FA8, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x70FB, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0420, 0x2,
+ 0x6F12, 0x8346, 0x2,
+ 0x6F12, 0x7D98, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x56D0, 0x2,
+ 0x6F12, 0x7E98, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x13D0, 0x2,
+ 0x6F12, 0x1630, 0x2,
+ 0x6F12, 0x7B90, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x1F30, 0x2,
+ 0x6F12, 0x8246, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x76AF, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEA78, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0x68B1, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8500, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0xB151, 0x2,
+ 0x6F12, 0x0E50, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x7061, 0x2,
+ 0x6F12, 0x4650, 0x2,
+ 0x6F12, 0x25E0, 0x2,
+ 0x6F12, 0x001D, 0x2,
+ 0x6F12, 0x7B90, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x0D30, 0x2,
+ 0x6F12, 0xEAE7, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x0176, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x1022, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x74FF, 0x2,
+ 0x6F12, 0x77A9, 0x2,
+ 0x6F12, 0x41F8, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x042C, 0x2,
+ 0x6F12, 0xEFD3, 0x2,
+ 0x6F12, 0xDDE9, 0x2,
+ 0x6F12, 0x7701, 0x2,
+ 0x6F12, 0x40EA, 0x2,
+ 0x6F12, 0x0142, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8500, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0xB151, 0x2,
+ 0x6F12, 0x0A50, 0x2,
+ 0x6F12, 0xDDE9, 0x2,
+ 0x6F12, 0x7912, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0242, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x7061, 0x2,
+ 0x6F12, 0x4250, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0x042D, 0x2,
+ 0x6F12, 0xCBDB, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x76A9, 0x2,
+ 0x6F12, 0x75A8, 0x2,
+ 0x6F12, 0x8DE8, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x1022, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x4FFF, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x4401, 0x2,
+ 0x6F12, 0x01F5, 0x2,
+ 0x6F12, 0xB451, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x042C, 0x2,
+ 0x6F12, 0xECDB, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0x2BE0, 0x2,
+ 0x6F12, 0x07E1, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8580, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x64A6, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xA000, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x334C, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xA800, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xB000, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xB800, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xC000, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xC800, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xD000, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xD800, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xE000, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xE800, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x4510, 0x2,
+ 0x6F12, 0x2006, 0x2,
+ 0x6F12, 0xF000, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x0AE0, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x4970, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x56E8, 0x2,
+ 0x6F12, 0xA8BB, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0xC500, 0x2,
+ 0x6F12, 0x6BA9, 0x2,
+ 0x6F12, 0x4618, 0x2,
+ 0x6F12, 0x2746, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEC78, 0x2,
+ 0x6F12, 0x75A9, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x0018, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x0222, 0x2,
+ 0x6F12, 0x0297, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x04FF, 0x2,
+ 0x6F12, 0x3055, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x092C, 0x2,
+ 0x6F12, 0xF1DB, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0x5D45, 0x2,
+ 0x6F12, 0xE6DB, 0x2,
+ 0x6F12, 0x0027, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x3446, 0x2,
+ 0x6F12, 0x35E0, 0x2,
+ 0x6F12, 0x0A2D, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0xC5F1, 0x2,
+ 0x6F12, 0x1300, 0x2,
+ 0x6F12, 0x072F, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x3946, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0xC7F1, 0x2,
+ 0x6F12, 0x0D01, 0x2,
+ 0x6F12, 0x0144, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0x1AF8, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x8A42, 0x2,
+ 0x6F12, 0x02DD, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x03E0, 0x2,
+ 0x6F12, 0x30E0, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x0928, 0x2,
+ 0x6F12, 0xF5DB, 0x2,
+ 0x6F12, 0x7B98, 0x2,
+ 0x6F12, 0x10F8, 0x2,
+ 0x6F12, 0x0820, 0x2,
+ 0x6F12, 0xB2B1, 0x2,
+ 0x6F12, 0x082A, 0x2,
+ 0x6F12, 0x3BD0, 0x2,
+ 0x6F12, 0x0023, 0x2,
+ 0x6F12, 0x76A9, 0x2,
+ 0x6F12, 0x75A8, 0x2,
+ 0x6F12, 0x8DE8, 0x2,
+ 0x6F12, 0x0B00, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xCEFE, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0xC402, 0x2,
+ 0x6F12, 0x6BA9, 0x2,
+ 0x6F12, 0x0A44, 0x2,
+ 0x6F12, 0x12F8, 0x2,
+ 0x6F12, 0x0810, 0x2,
+ 0x6F12, 0x01B1, 0x2,
+ 0x6F12, 0x8840, 0x2,
+ 0x6F12, 0xE100, 0x2,
+ 0x6F12, 0x8840, 0x2,
+ 0x6F12, 0x0643, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x5C45, 0x2,
+ 0x6F12, 0xC7DB, 0x2,
+ 0x6F12, 0x07EB, 0x2,
+ 0x6F12, 0x8701, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x0110, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8500, 0x2,
+ 0x6F12, 0x00F5, 0x2,
+ 0x6F12, 0x8050, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0xC0F8, 0x2,
+ 0x6F12, 0x8061, 0x2,
+ 0x6F12, 0x142D, 0x2,
+ 0x6F12, 0xB7DB, 0x2,
+ 0x6F12, 0x7F1C, 0x2,
+ 0x6F12, 0x0E2F, 0x2,
+ 0x6F12, 0xB3DB, 0x2,
+ 0x6F12, 0x7E98, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x70D1, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0xC0B1, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x3064, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x9AB3, 0x2,
+ 0x6F12, 0x012A, 0x2,
+ 0x6F12, 0x5FD0, 0x2,
+ 0x6F12, 0x022A, 0x2,
+ 0x6F12, 0x63D0, 0x2,
+ 0x6F12, 0x032A, 0x2,
+ 0x6F12, 0x70D1, 0x2,
+ 0x6F12, 0x68E0, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x76A9, 0x2,
+ 0x6F12, 0x75A8, 0x2,
+ 0x6F12, 0x8DE8, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x0822, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x91FE, 0x2,
+ 0x6F12, 0xC9E7, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x77AF, 0x2,
+ 0x6F12, 0xB046, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEC7A, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEA7B, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xB0B1, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x00B0, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x01A8, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x0422, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x7BFE, 0x2,
+ 0x6F12, 0xC001, 0x2,
+ 0x6F12, 0x47F8, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x00F5, 0x2,
+ 0x6F12, 0xE050, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0xE052, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x1051, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x84FA, 0x2,
+ 0x6F12, 0x0AE0, 0x2,
+ 0x6F12, 0x27E0, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x00B0, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x01A8, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x1022, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x64FE, 0x2,
+ 0x6F12, 0x47F8, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x042C, 0x2,
+ 0x6F12, 0xD7D3, 0x2,
+ 0x6F12, 0xDDE9, 0x2,
+ 0x6F12, 0x7701, 0x2,
+ 0x6F12, 0x40EA, 0x2,
+ 0x6F12, 0x0142, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x0610, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8500, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0xAF51, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0x0A50, 0x2,
+ 0x6F12, 0xDDE9, 0x2,
+ 0x6F12, 0x7912, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0242, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x3061, 0x2,
+ 0x6F12, 0x042D, 0x2,
+ 0x6F12, 0x4250, 0x2,
+ 0x6F12, 0xC1DB, 0x2,
+ 0x6F12, 0x761C, 0x2,
+ 0x6F12, 0x042E, 0x2,
+ 0x6F12, 0xBDDB, 0x2,
+ 0x6F12, 0x2BE0, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6F12, 0x01F5, 0x2,
+ 0x6F12, 0xB151, 0x2,
+ 0x6F12, 0x0AE0, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6F12, 0x01F5, 0x2,
+ 0x6F12, 0xB151, 0x2,
+ 0x6F12, 0x0DE0, 0x2,
+ 0x6F12, 0x6CE2, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8003, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x7061, 0x2,
+ 0x6F12, 0x1944, 0x2,
+ 0x6F12, 0x4988, 0x2,
+ 0x6F12, 0x89B2, 0x2,
+ 0x6F12, 0x06E0, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8003, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x7061, 0x2,
+ 0x6F12, 0x1944, 0x2,
+ 0x6F12, 0x0968, 0x2,
+ 0x6F12, 0x090C, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8205, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0143, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8501, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0xAF55, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x6B50, 0x2,
+ 0x6F12, 0x0B51, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x79AF, 0x2,
+ 0x6F12, 0x521C, 0x2,
+ 0x6F12, 0x042A, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x74AF, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0x80B3, 0x2,
+ 0x6F12, 0x022C, 0x2,
+ 0x6F12, 0x16D0, 0x2,
+ 0x6F12, 0x082C, 0x2,
+ 0x6F12, 0x14D0, 0x2,
+ 0x6F12, 0x0A2C, 0x2,
+ 0x6F12, 0x12D0, 0x2,
+ 0x6F12, 0x032C, 0x2,
+ 0x6F12, 0x29D0, 0x2,
+ 0x6F12, 0x062C, 0x2,
+ 0x6F12, 0x27D0, 0x2,
+ 0x6F12, 0x072C, 0x2,
+ 0x6F12, 0x25D0, 0x2,
+ 0x6F12, 0x092C, 0x2,
+ 0x6F12, 0x2ED0, 0x2,
+ 0x6F12, 0x0C2C, 0x2,
+ 0x6F12, 0x2CD0, 0x2,
+ 0x6F12, 0x0D2C, 0x2,
+ 0x6F12, 0x2AD0, 0x2,
+ 0x6F12, 0x0B2C, 0x2,
+ 0x6F12, 0x34D0, 0x2,
+ 0x6F12, 0x0E2C, 0x2,
+ 0x6F12, 0x32D0, 0x2,
+ 0x6F12, 0x0F2C, 0x2,
+ 0x6F12, 0x30D0, 0x2,
+ 0x6F12, 0x52E0, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x5BA8, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8406, 0x2,
+ 0x6F12, 0x2F46, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEC78, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEA7A, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x0187, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x0322, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xE9FD, 0x2,
+ 0x6F12, 0x7055, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0x042D, 0x2,
+ 0x6F12, 0xF1DB, 0x2,
+ 0x6F12, 0x3AE0, 0x2,
+ 0x6F12, 0x22E0, 0x2,
+ 0x6F12, 0x5BA9, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8402, 0x2,
+ 0x6F12, 0x0B18, 0x2,
+ 0x6F12, 0x1B7A, 0x2,
+ 0x6F12, 0x1354, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0xF9DB, 0x2,
+ 0x6F12, 0x2EE0, 0x2,
+ 0x6F12, 0x5BA9, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8402, 0x2,
+ 0x6F12, 0x0B18, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x2030, 0x2,
+ 0x6F12, 0x1354, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0xF8DB, 0x2,
+ 0x6F12, 0x22E0, 0x2,
+ 0x6F12, 0x5BA9, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8402, 0x2,
+ 0x6F12, 0x0B18, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x2830, 0x2,
+ 0x6F12, 0x1354, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0xF8DB, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x5BA8, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8406, 0x2,
+ 0x6F12, 0x2F46, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEC78, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0xEA7A, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x0187, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x0322, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xADFD, 0x2,
+ 0x6F12, 0x7055, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0x042D, 0x2,
+ 0x6F12, 0xF1DB, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x102C, 0x2,
+ 0x6F12, 0x8CDB, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0x5046, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x4001, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0xC800, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x7790, 0x2,
+ 0x6F12, 0x4019, 0x2,
+ 0x6F12, 0x68D0, 0x2,
+ 0x6F12, 0x0A28, 0x2,
+ 0x6F12, 0x66D0, 0x2,
+ 0x6F12, 0x4C28, 0x2,
+ 0x6F12, 0x64D0, 0x2,
+ 0x6F12, 0x4D28, 0x2,
+ 0x6F12, 0x62D0, 0x2,
+ 0x6F12, 0x5628, 0x2,
+ 0x6F12, 0x60D0, 0x2,
+ 0x6F12, 0x5728, 0x2,
+ 0x6F12, 0x5ED0, 0x2,
+ 0x6F12, 0x062D, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0xC5F1, 0x2,
+ 0x6F12, 0x0A01, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0xB8F1, 0x2,
+ 0x6F12, 0x040F, 0x2,
+ 0x6F12, 0x01DB, 0x2,
+ 0x6F12, 0xC8F1, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x0027, 0x2,
+ 0x6F12, 0x08E0, 0x2,
+ 0x6F12, 0x0528, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x0127, 0x2,
+ 0x6F12, 0x04E0, 0x2,
+ 0x6F12, 0x0728, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x0227, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0327, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0xD0B1, 0x2,
+ 0x6F12, 0xE4B3, 0x2,
+ 0x6F12, 0xE6B3, 0x2,
+ 0x6F12, 0x012C, 0x2,
+ 0x6F12, 0x72D0, 0x2,
+ 0x6F12, 0x022C, 0x2,
+ 0x6F12, 0x71D0, 0x2,
+ 0x6F12, 0x0A20, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x4001, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0xC001, 0x2,
+ 0x6F12, 0xB8F1, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x6F12, 0x03A8, 0x2,
+ 0x6F12, 0x69D0, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8100, 0x2,
+ 0x6F12, 0x50F8, 0x2,
+ 0x6F12, 0x2510, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x4600, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC602, 0x2,
+ 0x6F12, 0x2FA8, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8200, 0x2,
+ 0x6F12, 0x58E0, 0x2,
+ 0x6F12, 0x6CB3, 0x2,
+ 0x6F12, 0x012C, 0x2,
+ 0x6F12, 0x2DD0, 0x2,
+ 0x6F12, 0x022C, 0x2,
+ 0x6F12, 0x2DD0, 0x2,
+ 0x6F12, 0x0A20, 0x2,
+ 0x6F12, 0x6EB3, 0x2,
+ 0x6F12, 0x012E, 0x2,
+ 0x6F12, 0x2DD0, 0x2,
+ 0x6F12, 0x022E, 0x2,
+ 0x6F12, 0x2DD0, 0x2,
+ 0x6F12, 0x0521, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x010B, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x76A9, 0x2,
+ 0x6F12, 0x75A8, 0x2,
+ 0x6F12, 0x8DE8, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0xC25D, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x3BFD, 0x2,
+ 0x6F12, 0x5BA9, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8B01, 0x2,
+ 0x6F12, 0xB8F1, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x6F12, 0xC95D, 0x2,
+ 0x6F12, 0x00FA, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x02E0, 0x2,
+ 0x6F12, 0x40E0, 0x2,
+ 0x6F12, 0x15E0, 0x2,
+ 0x6F12, 0x50E0, 0x2,
+ 0x6F12, 0x4FEA, 0x2,
+ 0x6F12, 0xA001, 0x2,
+ 0x6F12, 0xCED1, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x4600, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC602, 0x2,
+ 0x6F12, 0x03A8, 0x2,
+ 0x6F12, 0xCDE7, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xD4E7, 0x2,
+ 0x6F12, 0x0220, 0x2,
+ 0x6F12, 0xD2E7, 0x2,
+ 0x6F12, 0x0820, 0x2,
+ 0x6F12, 0xD0E7, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0xD4E7, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0xD2E7, 0x2,
+ 0x6F12, 0x0421, 0x2,
+ 0x6F12, 0xD0E7, 0x2,
+ 0x6F12, 0x012C, 0x2,
+ 0x6F12, 0x21D0, 0x2,
+ 0x6F12, 0x022C, 0x2,
+ 0x6F12, 0x21D0, 0x2,
+ 0x6F12, 0x0A20, 0x2,
+ 0x6F12, 0x8346, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x76A9, 0x2,
+ 0x6F12, 0x75A8, 0x2,
+ 0x6F12, 0x8DE8, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0xC25D, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x08FD, 0x2,
+ 0x6F12, 0x5BA9, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8B01, 0x2,
+ 0x6F12, 0xB8F1, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x6F12, 0xC95D, 0x2,
+ 0x6F12, 0x00FA, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x4FEA, 0x2,
+ 0x6F12, 0xA001, 0x2,
+ 0x6F12, 0x0AD0, 0x2,
+ 0x6F12, 0x2FA8, 0x2,
+ 0x6F12, 0x40F8, 0x2,
+ 0x6F12, 0x2510, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0x20E0, 0x2,
+ 0x6F12, 0x21E0, 0x2,
+ 0x6F12, 0x22E0, 0x2,
+ 0x6F12, 0x0220, 0x2,
+ 0x6F12, 0xDEE7, 0x2,
+ 0x6F12, 0x0820, 0x2,
+ 0x6F12, 0xDCE7, 0x2,
+ 0x6F12, 0x03A8, 0x2,
+ 0x6F12, 0xF3E7, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x4601, 0x2,
+ 0x6F12, 0xB8F1, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0xC602, 0x2,
+ 0x6F12, 0x0DD0, 0x2,
+ 0x6F12, 0x2FA9, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8201, 0x2,
+ 0x6F12, 0x41F8, 0x2,
+ 0x6F12, 0x2500, 0x2,
+ 0x6F12, 0x761C, 0x2,
+ 0x6F12, 0x042E, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x6AAF, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0x0B2D, 0x2,
+ 0x6F12, 0x10DA, 0x2,
+ 0x6F12, 0x7798, 0x2,
+ 0x6F12, 0x3DE7, 0x2,
+ 0x6F12, 0x03A9, 0x2,
+ 0x6F12, 0xF0E7, 0x2,
+ 0x6F12, 0x0220, 0x2,
+ 0x6F12, 0x6BE7, 0x2,
+ 0x6F12, 0x0820, 0x2,
+ 0x6F12, 0x69E7, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8101, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x4602, 0x2,
+ 0x6F12, 0x51F8, 0x2,
+ 0x6F12, 0x2510, 0x2,
+ 0x6F12, 0x02EB, 0x2,
+ 0x6F12, 0xC602, 0x2,
+ 0x6F12, 0x71E7, 0x2,
+ 0x6F12, 0xB8F1, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x6F12, 0x79DD, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x7790, 0x2,
+ 0x6F12, 0x4FEA, 0x2,
+ 0x6F12, 0x4800, 0x2,
+ 0x6F12, 0x801E, 0x2,
+ 0x6F12, 0x7A90, 0x2,
+ 0x6F12, 0x7799, 0x2,
+ 0x6F12, 0x7A98, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x010B, 0x2,
+ 0x6F12, 0x7710, 0x2,
+ 0x6F12, 0x0A2E, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0xC6F1, 0x2,
+ 0x6F12, 0x1301, 0x2,
+ 0x6F12, 0x5846, 0x2,
+ 0x6F12, 0xBBF1, 0x2,
+ 0x6F12, 0x070F, 0x2,
+ 0x6F12, 0x01DB, 0x2,
+ 0x6F12, 0xCBF1, 0x2,
+ 0x6F12, 0x0D00, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0x7890, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x7990, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0xECB3, 0x2,
+ 0x6F12, 0xEDBB, 0x2,
+ 0x6F12, 0x7898, 0x2,
+ 0x6F12, 0xE0B3, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x0BDA, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x76A9, 0x2,
+ 0x6F12, 0x75A8, 0x2,
+ 0x6F12, 0x8DE8, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x6F12, 0x74AB, 0x2,
+ 0x6F12, 0x0822, 0x2,
+ 0x6F12, 0x7D99, 0x2,
+ 0x6F12, 0x8A98, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x95FC, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0x7798, 0x2,
+ 0x6F12, 0x10B1, 0x2,
+ 0x6F12, 0x0128, 0x2,
+ 0x6F12, 0x14D0, 0x2,
+ 0x6F12, 0x46E0, 0x2,
+ 0x6F12, 0xF007, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0x4500, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC501, 0x2,
+ 0x6F12, 0x03A8, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8100, 0x2,
+ 0x6F12, 0x06D0, 0x2,
+ 0x6F12, 0x50F8, 0x2,
+ 0x6F12, 0x2710, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8700, 0x2,
+ 0x6F12, 0x4068, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0x2FE0, 0x2,
+ 0x6F12, 0x50F8, 0x2,
+ 0x6F12, 0x2700, 0x2,
+ 0x6F12, 0x8246, 0x2,
+ 0x6F12, 0x32E0, 0x2,
+ 0x6F12, 0xF007, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0x4500, 0x2,
+ 0x6F12, 0x1AD0, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC501, 0x2,
+ 0x6F12, 0x03A8, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8100, 0x2,
+ 0x6F12, 0x2FAB, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x8101, 0x2,
+ 0x6F12, 0x50F8, 0x2,
+ 0x6F12, 0x2720, 0x2,
+ 0x6F12, 0x51F8, 0x2,
+ 0x6F12, 0x2730, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8700, 0x2,
+ 0x6F12, 0x1A44, 0x2,
+ 0x6F12, 0x02E0, 0x2,
+ 0x6F12, 0x19E0, 0x2,
+ 0x6F12, 0x1AE0, 0x2,
+ 0x6F12, 0x59E0, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8701, 0x2,
+ 0x6F12, 0x4068, 0x2,
+ 0x6F12, 0x4968, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0x1044, 0x2,
+ 0x6F12, 0x8010, 0x2,
+ 0x6F12, 0xDEE7, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC500, 0x2,
+ 0x6F12, 0x03A9, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6F12, 0x51F8, 0x2,
+ 0x6F12, 0x2720, 0x2,
+ 0x6F12, 0x2FA9, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8000, 0x2,
+ 0x6F12, 0x50F8, 0x2,
+ 0x6F12, 0x2700, 0x2,
+ 0x6F12, 0x1044, 0x2,
+ 0x6F12, 0x4010, 0x2,
+ 0x6F12, 0xCFE7, 0x2,
+ 0x6F12, 0x73E0, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0x7898, 0x2,
+ 0x6F12, 0xE8B3, 0x2,
+ 0x6F12, 0x7F98, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2910, 0x2,
+ 0x6F12, 0x51B1, 0x2,
+ 0x6F12, 0x0BEB, 0x2,
+ 0x6F12, 0x8B00, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8002, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8200, 0x2,
+ 0x6F12, 0x00F5, 0x2,
+ 0x6F12, 0x8050, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x8301, 0x2,
+ 0x6F12, 0x0BE0, 0x2,
+ 0x6F12, 0x0BEB, 0x2,
+ 0x6F12, 0x8B02, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x0210, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8600, 0x2,
+ 0x6F12, 0x00F5, 0x2,
+ 0x6F12, 0x8050, 0x2,
+ 0x6F12, 0xE200, 0x2,
+ 0x6F12, 0xD0F8, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6F12, 0xD040, 0x2,
+ 0x6F12, 0xC0B2, 0x2,
+ 0x6F12, 0x8A9A, 0x2,
+ 0x6F12, 0x5044, 0x2,
+ 0x6F12, 0x0AB1, 0x2,
+ 0x6F12, 0xCAF1, 0x2,
+ 0x6F12, 0xFF00, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x02E0, 0x2,
+ 0x6F12, 0xFF28, 0x2,
+ 0x6F12, 0x00DD, 0x2,
+ 0x6F12, 0xFF20, 0x2,
+ 0x6F12, 0xEA00, 0x2,
+ 0x6F12, 0x799B, 0x2,
+ 0x6F12, 0x00FA, 0x2,
+ 0x6F12, 0x02F2, 0x2,
+ 0x6F12, 0x1A43, 0x2,
+ 0x6F12, 0x7992, 0x2,
+ 0x6F12, 0x71B1, 0x2,
+ 0x6F12, 0x6DB9, 0x2,
+ 0x6F12, 0x0BEB, 0x2,
+ 0x6F12, 0x8B01, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8102, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8201, 0x2,
+ 0x6F12, 0x01F5, 0x2,
+ 0x6F12, 0x8051, 0x2,
+ 0x6F12, 0xE300, 0x2,
+ 0x6F12, 0xD1F8, 0x2,
+ 0x6F12, 0x8021, 0x2,
+ 0x6F12, 0x9840, 0x2,
+ 0x6F12, 0x0243, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x8021, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0x042D, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x59AF, 0x2,
+ 0x6F12, 0xC4EB, 0x2,
+ 0x6F12, 0xC400, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8003, 0x2,
+ 0x6F12, 0x0BEB, 0x2,
+ 0x6F12, 0x8B02, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x4310, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x0210, 0x2,
+ 0x6F12, 0x7999, 0x2,
+ 0x6F12, 0x40F8, 0x2,
+ 0x6F12, 0x2610, 0x2,
+ 0x6F12, 0x761C, 0x2,
+ 0x6F12, 0x142E, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x36AF, 0x2,
+ 0x6F12, 0x7798, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x7790, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x2BAF, 0x2,
+ 0x6F12, 0x2C22, 0x2,
+ 0x6F12, 0x2FA9, 0x2,
+ 0x6F12, 0x03A8, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xF1FF, 0x2,
+ 0x6F12, 0x2C22, 0x2,
+ 0x6F12, 0x3AA9, 0x2,
+ 0x6F12, 0x0EA8, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xECFF, 0x2,
+ 0x6F12, 0x2C22, 0x2,
+ 0x6F12, 0x45A9, 0x2,
+ 0x6F12, 0x19A8, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xE7FF, 0x2,
+ 0x6F12, 0x2C22, 0x2,
+ 0x6F12, 0x50A9, 0x2,
+ 0x6F12, 0x24A8, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xE2FF, 0x2,
+ 0x6F12, 0x08F1, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x0828, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x31AE, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x042C, 0x2,
+ 0x6F12, 0xFFF6, 0x2,
+ 0x6F12, 0x29AE, 0x2,
+ 0x6F12, 0x0DF5, 0x2,
+ 0x6F12, 0x017D, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF08F, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF84F, 0x2,
+ 0x6F12, 0x0646, 0x2,
+ 0x6F12, 0x0079, 0x2,
+ 0x6F12, 0xF84A, 0x2,
+ 0x6F12, 0x40B1, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0x6070, 0x2,
+ 0x6F12, 0x032F, 0x2,
+ 0x6F12, 0x08D1, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF84F, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x52BB, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0x3270, 0x2,
+ 0x6F12, 0x032F, 0x2,
+ 0x6F12, 0x0FD0, 0x2,
+ 0x6F12, 0xF149, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x440A, 0x2,
+ 0x6F12, 0xC0B1, 0x2,
+ 0x6F12, 0xEE4A, 0x2,
+ 0x6F12, 0x3832, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0x2A30, 0x2,
+ 0x6F12, 0x012B, 0x2,
+ 0x6F12, 0x0AD0, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF84F, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x3C20, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC0BF, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF84F, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x6BBB, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0xB1F8, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x5346, 0x2,
+ 0x6F12, 0x3946, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xDCFB, 0x2,
+ 0x6F12, 0xD9E7, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x8883, 0x2,
+ 0x6F12, 0x088C, 0x2,
+ 0x6F12, 0x08F1, 0x2,
+ 0x6F12, 0x0A08, 0x2,
+ 0x6F12, 0x8946, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x39D0, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x9346, 0x2,
+ 0x6F12, 0x32E0, 0x2,
+ 0x6F12, 0xB9F8, 0x2,
+ 0x6F12, 0x2010, 0x2,
+ 0x6F12, 0xB8F8, 0x2,
+ 0x6F12, 0x2C00, 0x2,
+ 0x6F12, 0x5346, 0x2,
+ 0x6F12, 0x04FB, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x6F12, 0x3179, 0x2,
+ 0x6F12, 0x0091, 0x2,
+ 0x6F12, 0x80B2, 0x2,
+ 0x6F12, 0x4246, 0x2,
+ 0x6F12, 0x3946, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xC2FB, 0x2,
+ 0x6F12, 0x98F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0x00B3, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x4410, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC411, 0x2,
+ 0x6F12, 0xD448, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8C62, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC105, 0x2,
+ 0x6F12, 0xD249, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x7BFF, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0x8C60, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0xD049, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x75FF, 0x2,
+ 0x6F12, 0xCE49, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0x9660, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0x5031, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x6EFF, 0x2,
+ 0x6F12, 0xCB49, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0xA060, 0x2,
+ 0x6F12, 0x0822, 0x2,
+ 0x6F12, 0xA031, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x67FF, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x9BF8, 0x2,
+ 0x6F12, 0x3400, 0x2,
+ 0x6F12, 0xA042, 0x2,
+ 0x6F12, 0xC8DC, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF88F, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF05F, 0x2,
+ 0x6F12, 0x5825, 0x2,
+ 0x6F12, 0x6C24, 0x2,
+ 0x6F12, 0x0027, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x0893, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x2DED, 0x2,
+ 0x6F12, 0x028B, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x0A0A, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x070B, 0x2,
+ 0x6F12, 0x0126, 0x2,
+ 0x6F12, 0x9FED, 0x2,
+ 0x6F12, 0xBE8A, 0x2,
+ 0x6F12, 0xB9F8, 0x2,
+ 0x6F12, 0x7C10, 0x2,
+ 0x6F12, 0xB9F8, 0x2,
+ 0x6F12, 0x8000, 0x2,
+ 0x6F12, 0x06FB, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0x761E, 0x2,
+ 0x6F12, 0x0420, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0x88EE, 0x2,
+ 0x6F12, 0x200A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x53FF, 0x2,
+ 0x6F12, 0xD8F8, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x5052, 0x2,
+ 0x6F12, 0x7F1C, 0x2,
+ 0x6F12, 0xAD1C, 0x2,
+ 0x6F12, 0x5745, 0x2,
+ 0x6F12, 0xE6DB, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x0125, 0x2,
+ 0x6F12, 0x4F46, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0xB7F8, 0x2,
+ 0x6F12, 0x7E00, 0x2,
+ 0x6F12, 0xB7F8, 0x2,
+ 0x6F12, 0x8210, 0x2,
+ 0x6F12, 0x05FB, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0x6D1E, 0x2,
+ 0x6F12, 0x0220, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0x88EE, 0x2,
+ 0x6F12, 0x200A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x36FF, 0x2,
+ 0x6F12, 0xD8F8, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x04F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x5052, 0x2,
+ 0x6F12, 0x761C, 0x2,
+ 0x6F12, 0xA41C, 0x2,
+ 0x6F12, 0x5E45, 0x2,
+ 0x6F12, 0xE6DB, 0x2,
+ 0x6F12, 0xBDEC, 0x2,
+ 0x6F12, 0x028B, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF09F, 0x2,
+ 0x6F12, 0x9F49, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0x5031, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0x8B8F, 0x2,
+ 0x6F12, 0x5386, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0xCB8F, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0x9386, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0x31F8, 0x2,
+ 0x6F12, 0x243C, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0xD386, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0x31F8, 0x2,
+ 0x6F12, 0x223C, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0x1387, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0x8B8D, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0x5387, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0xCB8D, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0x9387, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0x0B8E, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0xD387, 0x2,
+ 0x6F12, 0x4A8E, 0x2,
+ 0x6F12, 0x0168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x4020, 0x2,
+ 0x6F12, 0x8449, 0x2,
+ 0x6F12, 0x0268, 0x2,
+ 0x6F12, 0x6831, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0x0B88, 0x2,
+ 0x6F12, 0xD381, 0x2,
+ 0x6F12, 0x4A88, 0x2,
+ 0x6F12, 0x0168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x0A82, 0x2,
+ 0x6F12, 0x7AE7, 0x2,
+ 0x6F12, 0x8449, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x3422, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0x2AB1, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xFFFE, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0xB9E7, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x81F8, 0x2,
+ 0x6F12, 0x3502, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x7D48, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x016A, 0x2,
+ 0x6F12, 0x0C0C, 0x2,
+ 0x6F12, 0x8DB2, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x76FE, 0x2,
+ 0x6F12, 0x714A, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x5E40, 0x2,
+ 0x6F12, 0x143A, 0x2,
+ 0x6F12, 0x1060, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x1071, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x3A40, 0x2,
+ 0x6F12, 0x9060, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x1073, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x02FA, 0x2,
+ 0x6F12, 0x6A48, 0x2,
+ 0x6F12, 0x1438, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xD4FF, 0x2,
+ 0x6F12, 0x6848, 0x2,
+ 0x6F12, 0x0C38, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xD0FF, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x59BE, 0x2,
+ 0x6F12, 0xF0B5, 0x2,
+ 0x6F12, 0x684A, 0x2,
+ 0x6F12, 0x614C, 0x2,
+ 0x6F12, 0xD0F8, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x6C34, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0x4032, 0x2,
+ 0x6F12, 0x2588, 0x2,
+ 0x6F12, 0x0EF1, 0x2,
+ 0x6F12, 0x804E, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0x44C2, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0x4272, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0x4662, 0x2,
+ 0x6F12, 0x5B1B, 0x2,
+ 0x6F12, 0xAEF8, 0x2,
+ 0x6F12, 0x4230, 0x2,
+ 0x6F12, 0xD0F8, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x6388, 0x2,
+ 0x6F12, 0x0EF1, 0x2,
+ 0x6F12, 0x804E, 0x2,
+ 0x6F12, 0xFF1A, 0x2,
+ 0x6F12, 0xAEF8, 0x2,
+ 0x6F12, 0x4470, 0x2,
+ 0x6F12, 0x0768, 0x2,
+ 0x6F12, 0xACEB, 0x2,
+ 0x6F12, 0x0505, 0x2,
+ 0x6F12, 0x07F1, 0x2,
+ 0x6F12, 0x8047, 0x2,
+ 0x6F12, 0xA7F8, 0x2,
+ 0x6F12, 0x4650, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0xF31A, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x4830, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0xB332, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0xB252, 0x2,
+ 0x6F12, 0x1D44, 0x2,
+ 0x6F12, 0x637D, 0x2,
+ 0x6F12, 0x6C3C, 0x2,
+ 0x6F12, 0x03B9, 0x2,
+ 0x6F12, 0x6B1E, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x4A30, 0x2,
+ 0x6F12, 0x94F8, 0x2,
+ 0x6F12, 0x8230, 0x2,
+ 0x6F12, 0x03B9, 0x2,
+ 0x6F12, 0x0123, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x4C30, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0xB732, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0xB652, 0x2,
+ 0x6F12, 0x1D44, 0x2,
+ 0x6F12, 0x94F8, 0x2,
+ 0x6F12, 0x8330, 0x2,
+ 0x6F12, 0x03B9, 0x2,
+ 0x6F12, 0x6B1E, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x4E30, 0x2,
+ 0x6F12, 0x94F8, 0x2,
+ 0x6F12, 0x8430, 0x2,
+ 0x6F12, 0x03B9, 0x2,
+ 0x6F12, 0x0123, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x5030, 0x2,
+ 0x6F12, 0x3F4B, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x8062, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x5460, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x8152, 0x2,
+ 0x6F12, 0x0368, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0xA3F8, 0x2,
+ 0x6F12, 0x5650, 0x2,
+ 0x6F12, 0x0B78, 0x2,
+ 0x6F12, 0x0BB9, 0x2,
+ 0x6F12, 0x4B78, 0x2,
+ 0x6F12, 0x03B1, 0x2,
+ 0x6F12, 0x0123, 0x2,
+ 0x6F12, 0x0568, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x8230, 0x2,
+ 0x6F12, 0x0368, 0x2,
+ 0x6F12, 0x0988, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0x49BA, 0x2,
+ 0x6F12, 0xA3F8, 0x2,
+ 0x6F12, 0x8410, 0x2,
+ 0x6F12, 0x0168, 0x2,
+ 0x6F12, 0x92F8, 0x2,
+ 0x6F12, 0xB323, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x8A80, 0x2,
+ 0x6F12, 0x0168, 0x2,
+ 0x6F12, 0x7E34, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xE279, 0x2,
+ 0x6F12, 0xCA80, 0x2,
+ 0x6F12, 0x0168, 0x2,
+ 0x6F12, 0x227A, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x0A81, 0x2,
+ 0x6F12, 0x0168, 0x2,
+ 0x6F12, 0x627A, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x4A81, 0x2,
+ 0x6F12, 0x0168, 0x2,
+ 0x6F12, 0xA27A, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x8A81, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x6F12, 0x2188, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0xA0F8, 0x2,
+ 0x6F12, 0x8C10, 0x2,
+ 0x6F12, 0xF0BD, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x1648, 0x2,
+ 0x6F12, 0x0C46, 0x2,
+ 0x6F12, 0x1438, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x61FF, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0x1348, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0x0C38, 0x2,
+ 0x6F12, 0x5AE7, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x39B1, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x0E4B, 0x2,
+ 0x6F12, 0x0479, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x8910, 0x2,
+ 0x6F12, 0x94B1, 0x2,
+ 0x6F12, 0x22B9, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xF6E7, 0x2,
+ 0x6F12, 0xC907, 0x2,
+ 0x6F12, 0x00D0, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x124A, 0x2,
+ 0x6F12, 0x1180, 0x2,
+ 0x6F12, 0x114C, 0x2,
+ 0x6F12, 0x13F8, 0x2,
+ 0x6F12, 0x8A2F, 0x2,
+ 0x6F12, 0xA41D, 0x2,
+ 0x6F12, 0x2280, 0x2,
+ 0x6F12, 0x5A78, 0x2,
+ 0x6F12, 0x0E4B, 0x2,
+ 0x6F12, 0x1033, 0x2,
+ 0x6F12, 0x1A80, 0x2,
+ 0x6F12, 0x1BE0, 0x2,
+ 0x6F12, 0x0AB9, 0x2,
+ 0x6F12, 0x8907, 0x2,
+ 0x6F12, 0x17D5, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x16E0, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x334C, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x4510, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x4970, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x2AE0, 0x2,
+ 0x6F12, 0x4680, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8BA0, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xB900, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x1D46, 0x2,
+ 0x6F12, 0x1646, 0x2,
+ 0x6F12, 0x0F46, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0xDDF8, 0x2,
+ 0x6F12, 0x2090, 0x2,
+ 0x6F12, 0x07E0, 0x2,
+ 0x6F12, 0x315D, 0x2,
+ 0x6F12, 0x385D, 0x2,
+ 0x6F12, 0x4A46, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xCDFD, 0x2,
+ 0x6F12, 0x08F8, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0xAC42, 0x2,
+ 0x6F12, 0xF5D3, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF087, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x1D46, 0x2,
+ 0x6F12, 0x1646, 0x2,
+ 0x6F12, 0x0F46, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0xDDF8, 0x2,
+ 0x6F12, 0x2090, 0x2,
+ 0x6F12, 0x09E0, 0x2,
+ 0x6F12, 0x36F8, 0x2,
+ 0x6F12, 0x1410, 0x2,
+ 0x6F12, 0x37F8, 0x2,
+ 0x6F12, 0x1400, 0x2,
+ 0x6F12, 0x4A46, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xB5FD, 0x2,
+ 0x6F12, 0x28F8, 0x2,
+ 0x6F12, 0x1400, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0xB4EB, 0x2,
+ 0x6F12, 0x550F, 0x2,
+ 0x6F12, 0xF2D3, 0x2,
+ 0x6F12, 0xE5E7, 0x2,
+ 0x6F12, 0x30B5, 0x2,
+ 0x6F12, 0xFE48, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x900A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x601A, 0x2,
+ 0x6F12, 0xDFED, 0x2,
+ 0x6F12, 0xFC0A, 0x2,
+ 0x6F12, 0xFA48, 0x2,
+ 0x6F12, 0xFB4B, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0x61EE, 0x2,
+ 0x6F12, 0x201A, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x01EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0xF648, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x411A, 0x2,
+ 0x6F12, 0x001D, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x61EE, 0x2,
+ 0x6F12, 0x204A, 0x2,
+ 0x6F12, 0x01EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0xF148, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x411A, 0x2,
+ 0x6F12, 0x801D, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x21EE, 0x2,
+ 0x6F12, 0x204A, 0x2,
+ 0x6F12, 0x01EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x411A, 0x2,
+ 0x6F12, 0x61EE, 0x2,
+ 0x6F12, 0x203A, 0x2,
+ 0x6F12, 0xDFED, 0x2,
+ 0x6F12, 0xED2A, 0x2,
+ 0x6F12, 0xB7EE, 0x2,
+ 0x6F12, 0x001A, 0x2,
+ 0x6F12, 0x9FED, 0x2,
+ 0x6F12, 0xEC3A, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8C74, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x8002, 0x2,
+ 0x6F12, 0x02F5, 0x2,
+ 0x6F12, 0x8052, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x416A, 0x2,
+ 0x6F12, 0xD2F8, 0x2,
+ 0x6F12, 0xC411, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x417A, 0x2,
+ 0x6F12, 0xCDB2, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x905A, 0x2,
+ 0x6F12, 0xC1F3, 0x2,
+ 0x6F12, 0x0725, 0x2,
+ 0x6F12, 0x02EE, 0x2,
+ 0x6F12, 0x105A, 0x2,
+ 0x6F12, 0xC1F3, 0x2,
+ 0x6F12, 0x0745, 0x2,
+ 0x6F12, 0x090E, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x422A, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0xA042, 0x2,
+ 0x6F12, 0x62EE, 0x2,
+ 0x6F12, 0x225A, 0x2,
+ 0x6F12, 0x02EE, 0x2,
+ 0x6F12, 0x105A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0xA20A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x422A, 0x2,
+ 0x6F12, 0x22EE, 0x2,
+ 0x6F12, 0x225A, 0x2,
+ 0x6F12, 0x02EE, 0x2,
+ 0x6F12, 0x101A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x422A, 0x2,
+ 0x6F12, 0x22EE, 0x2,
+ 0x6F12, 0x226A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x202A, 0x2,
+ 0x6F12, 0x42EE, 0x2,
+ 0x6F12, 0x216A, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x412A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0xA12A, 0x2,
+ 0x6F12, 0xC6EE, 0x2,
+ 0x6F12, 0x820A, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x416A, 0x2,
+ 0x6F12, 0x50EE, 0x2,
+ 0x6F12, 0x826A, 0x2,
+ 0x6F12, 0x86EE, 0x2,
+ 0x6F12, 0xA12A, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x416A, 0x2,
+ 0x6F12, 0x45EE, 0x2,
+ 0x6F12, 0xA46A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0xA67A, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x416A, 0x2,
+ 0x6F12, 0x45EE, 0x2,
+ 0x6F12, 0x046A, 0x2,
+ 0x6F12, 0xC7EE, 0x2,
+ 0x6F12, 0x245A, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x417A, 0x2,
+ 0x6F12, 0x22EE, 0x2,
+ 0x6F12, 0x032A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0xA67A, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x416A, 0x2,
+ 0x6F12, 0x46EE, 0x2,
+ 0x6F12, 0x236A, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x416A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC22A, 0x2,
+ 0x6F12, 0x12EE, 0x2,
+ 0x6F12, 0x101A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0xA66A, 0x2,
+ 0x6F12, 0x87EE, 0x2,
+ 0x6F12, 0x045A, 0x2,
+ 0x6F12, 0x25EE, 0x2,
+ 0x6F12, 0x832A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC22A, 0x2,
+ 0x6F12, 0x12EE, 0x2,
+ 0x6F12, 0x105A, 0x2,
+ 0x6F12, 0xC6EE, 0x2,
+ 0x6F12, 0x230A, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0525, 0x2,
+ 0x6F12, 0x25EE, 0x2,
+ 0x6F12, 0x032A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC22A, 0x2,
+ 0x6F12, 0x12EE, 0x2,
+ 0x6F12, 0x101A, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0145, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0x830A, 0x2,
+ 0x6F12, 0xFCEE, 0x2,
+ 0x6F12, 0xE00A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x901A, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x6F12, 0xC2F8, 0x2,
+ 0x6F12, 0xC411, 0x2,
+ 0x6F12, 0x88DB, 0x2,
+ 0x6F12, 0x30BD, 0x2,
+ 0x6F12, 0xF0B5, 0x2,
+ 0x6F12, 0xAC4C, 0x2,
+ 0x6F12, 0x1020, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x2465, 0x2,
+ 0x6F12, 0xDFED, 0x2,
+ 0x6F12, 0xAD1A, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x7466, 0x2,
+ 0x6F12, 0xB7EE, 0x2,
+ 0x6F12, 0x004A, 0x2,
+ 0x6F12, 0x9FED, 0x2,
+ 0x6F12, 0xAB2A, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x8002, 0x2,
+ 0x6F12, 0x5119, 0x2,
+ 0x6F12, 0x3244, 0x2,
+ 0x6F12, 0x0B68, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x444A, 0x2,
+ 0x6F12, 0x9FB2, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x907A, 0x2,
+ 0x6F12, 0x1B0C, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0xA11A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x903A, 0x2,
+ 0x6F12, 0x1368, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x9FB2, 0x2,
+ 0x6F12, 0x1B0C, 0x2,
+ 0x6F12, 0x1428, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0xA13A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x907A, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0xA13A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x903A, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0xA12A, 0x2,
+ 0x6F12, 0x71EE, 0x2,
+ 0x6F12, 0x440A, 0x2,
+ 0x6F12, 0x40EE, 0x2,
+ 0x6F12, 0x204A, 0x2,
+ 0x6F12, 0xC4EE, 0x2,
+ 0x6F12, 0x810A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x811A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0xA33A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x833A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0xA20A, 0x2,
+ 0x6F12, 0x21EE, 0x2,
+ 0x6F12, 0x021A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0x820A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC11A, 0x2,
+ 0x6F12, 0x11EE, 0x2,
+ 0x6F12, 0x107A, 0x2,
+ 0x6F12, 0x23EE, 0x2,
+ 0x6F12, 0x821A, 0x2,
+ 0x6F12, 0xFCEE, 0x2,
+ 0x6F12, 0xE00A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC11A, 0x2,
+ 0x6F12, 0x11EE, 0x2,
+ 0x6F12, 0x103A, 0x2,
+ 0x6F12, 0x23EE, 0x2,
+ 0x6F12, 0x021A, 0x2,
+ 0x6F12, 0x47EA, 0x2,
+ 0x6F12, 0x0343, 0x2,
+ 0x6F12, 0x0B60, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC11A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x903A, 0x2,
+ 0x6F12, 0x11EE, 0x2,
+ 0x6F12, 0x101A, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0341, 0x2,
+ 0x6F12, 0x1160, 0x2,
+ 0x6F12, 0xACDB, 0x2,
+ 0x6F12, 0xF0BD, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0C46, 0x2,
+ 0x6F12, 0xB0F5, 0x2,
+ 0x6F12, 0x807F, 0x2,
+ 0x6F12, 0x19D0, 0x2,
+ 0x6F12, 0x7E48, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x3300, 0x2,
+ 0x6F12, 0x18B9, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x3B20, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x8DFC, 0x2,
+ 0x6F12, 0x2089, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0xDFED, 0x2,
+ 0x6F12, 0x780A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0x207A, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x670A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xDCFE, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x670A, 0x2,
+ 0x6F12, 0x7EE7, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x6A4E, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8C74, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8201, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0xC410, 0x2,
+ 0x6F12, 0x521C, 0x2,
+ 0x6F12, 0x4058, 0x2,
+ 0x6F12, 0x0506, 0x2,
+ 0x6F12, 0xC3B2, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0345, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0325, 0x2,
+ 0x6F12, 0x1D43, 0x2,
+ 0x6F12, 0x030A, 0x2,
+ 0x6F12, 0x4D64, 0x2,
+ 0x6F12, 0x1D06, 0x2,
+ 0x6F12, 0xC0F3, 0x2,
+ 0x6F12, 0x0723, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0345, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0325, 0x2,
+ 0x6F12, 0x1D43, 0x2,
+ 0x6F12, 0x030C, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0xA454, 0x2,
+ 0x6F12, 0x1D06, 0x2,
+ 0x6F12, 0xC0F3, 0x2,
+ 0x6F12, 0x0743, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0345, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0325, 0x2,
+ 0x6F12, 0x1D43, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x0459, 0x2,
+ 0x6F12, 0x030E, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x7F45, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0345, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0323, 0x2,
+ 0x6F12, 0x43EA, 0x2,
+ 0x6F12, 0x1060, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x640D, 0x2,
+ 0x6F12, 0xA242, 0x2,
+ 0x6F12, 0xCEDB, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x6469, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x2467, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0xB46A, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x746C, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8102, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x02EB, 0x2,
+ 0x6F12, 0x0905, 0x2,
+ 0x6F12, 0x02EB, 0x2,
+ 0x6F12, 0x0A04, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x8002, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8202, 0x2,
+ 0x6F12, 0x2B68, 0x2,
+ 0x6F12, 0xD351, 0x2,
+ 0x6F12, 0x2368, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x42F8, 0x2,
+ 0x6F12, 0x0C30, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0xF3DB, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0x0429, 0x2,
+ 0x6F12, 0xE9DB, 0x2,
+ 0x6F12, 0x64E6, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xFC47, 0x2,
+ 0x6F12, 0x0246, 0x2,
+ 0x6F12, 0x434E, 0x2,
+ 0x6F12, 0x3E48, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0xC413, 0x2,
+ 0x6F12, 0x0194, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x0308, 0x2,
+ 0x6F12, 0x96F8, 0x2,
+ 0x6F12, 0x3410, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0x2463, 0x2,
+ 0x6F12, 0x3F4D, 0x2,
+ 0x6F12, 0xC718, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8C69, 0x2,
+ 0x6F12, 0x0129, 0x2,
+ 0x6F12, 0x29D9, 0x2,
+ 0x6F12, 0x01A8, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0x0823, 0x2,
+ 0x6F12, 0x06F1, 0x2,
+ 0x6F12, 0x7000, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x16FC, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0x0198, 0x2,
+ 0x6F12, 0xF8B1, 0x2,
+ 0x6F12, 0xB0F5, 0x2,
+ 0x6F12, 0x807F, 0x2,
+ 0x6F12, 0x1BD0, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x4410, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC410, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0xC005, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0xA162, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x4B46, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x21FE, 0x2,
+ 0x6F12, 0x0198, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0x05F6, 0x2,
+ 0x6F12, 0x6812, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0x8C61, 0x2,
+ 0x6F12, 0xA823, 0x2,
+ 0x6F12, 0x3846, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x2DFE, 0x2,
+ 0x6F12, 0x86F8, 0x2,
+ 0x6F12, 0x9840, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xFC87, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x4410, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xC410, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0xC005, 0x2,
+ 0x6F12, 0x4A46, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xCAFB, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0x8C61, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0x3846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC4FB, 0x2,
+ 0x6F12, 0x1648, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0x9661, 0x2,
+ 0x6F12, 0x5022, 0x2,
+ 0x6F12, 0x5038, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xBDFB, 0x2,
+ 0x6F12, 0x05F5, 0x2,
+ 0x6F12, 0xA061, 0x2,
+ 0x6F12, 0x0822, 0x2,
+ 0x6F12, 0x1148, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xB7FB, 0x2,
+ 0x6F12, 0xDBE7, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x0079, 0x2,
+ 0x6F12, 0x0C46, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x2CD1, 0x2,
+ 0x6F12, 0x1349, 0x2,
+ 0x6F12, 0xA078, 0x2,
+ 0x6F12, 0x0A31, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0xA088, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0xE088, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x2910, 0x2,
+ 0x6F12, 0x0029, 0x2,
+ 0x6F12, 0x21D0, 0x2,
+ 0x6F12, 0x0D4E, 0x2,
+ 0x6F12, 0xA6F8, 0x2,
+ 0x6F12, 0x9A00, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x8CFF, 0x2,
+ 0x6F12, 0xD6F8, 0x2,
+ 0x6F12, 0x9C20, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x9047, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x2CE7, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x4A10, 0x2,
+ 0x6F12, 0x3900, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x334C, 0x2,
+ 0x6F12, 0x3C80, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x4280, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x3980, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x4580, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x3B80, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0xFF48, 0x2,
+ 0x6F12, 0x0F46, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xC010, 0x2,
+ 0x6F12, 0x11B9, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xBF00, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0x0126, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x35FB, 0x2,
+ 0x6F12, 0x8446, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x01D3, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x2EB9, 0x2,
+ 0x6F12, 0xF649, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0xC810, 0x2,
+ 0x6F12, 0x0129, 0x2,
+ 0x6F12, 0x00D1, 0x2,
+ 0x6F12, 0x0125, 0x2,
+ 0x6F12, 0x00B1, 0x2,
+ 0x6F12, 0x0225, 0x2,
+ 0x6F12, 0x3878, 0x2,
+ 0x6F12, 0xD0B3, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x5DFD, 0x2,
+ 0x6F12, 0x2068, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x4580, 0x2,
+ 0x6F12, 0xEE48, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0xC813, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xC503, 0x2,
+ 0x6F12, 0x0A18, 0x2,
+ 0x6F12, 0x2168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x8820, 0x2,
+ 0x6F12, 0x4100, 0x2,
+ 0x6F12, 0x2068, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0xA0F8, 0x2,
+ 0x6F12, 0x5210, 0x2,
+ 0x6F12, 0x5621, 0x2,
+ 0x6F12, 0x5522, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0xBCF1, 0x2,
+ 0x6F12, 0x020F, 0x2,
+ 0x6F12, 0x1ED0, 0x2,
+ 0x6F12, 0xBCF1, 0x2,
+ 0x6F12, 0x030F, 0x2,
+ 0x6F12, 0x1DD0, 0x2,
+ 0x6F12, 0x2168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x8A00, 0x2,
+ 0x6F12, 0x2168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x8620, 0x2,
+ 0x6F12, 0x2179, 0x2,
+ 0x6F12, 0x21B3, 0x2,
+ 0x6F12, 0x2168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x8A00, 0x2,
+ 0x6F12, 0x2168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x8620, 0x2,
+ 0x6F12, 0x022D, 0x2,
+ 0x6F12, 0x11D0, 0x2,
+ 0x6F12, 0x14E0, 0x2,
+ 0x6F12, 0xFFE7, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0xC2E7, 0x2,
+ 0x6F12, 0x0226, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0326, 0x2,
+ 0x6F12, 0x2368, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0xA3F8, 0x2,
+ 0x6F12, 0x8A60, 0x2,
+ 0x6F12, 0x2368, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0xA3F8, 0x2,
+ 0x6F12, 0x8610, 0x2,
+ 0x6F12, 0xDFE7, 0x2,
+ 0x6F12, 0x2168, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x4880, 0x2,
+ 0x6F12, 0x2079, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x04D1, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0xFEF7, 0x2,
+ 0x6F12, 0xC7BE, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF081, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0xC548, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x816A, 0x2,
+ 0x6F12, 0x0D0C, 0x2,
+ 0x6F12, 0x8EB2, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xB1FA, 0x2,
+ 0x6F12, 0xC24C, 0x2,
+ 0x6F12, 0x04F1, 0x2,
+ 0x6F12, 0xB400, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x6F12, 0x40B1, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x42B1, 0x2,
+ 0x6F12, 0xBF48, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x8900, 0x2,
+ 0x6F12, 0x8007, 0x2,
+ 0x6F12, 0x03D4, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x02E0, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xF5E7, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xBB49, 0x2,
+ 0x6F12, 0x0874, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0xBA48, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x63FF, 0x2,
+ 0x6F12, 0xB848, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0x0830, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x5EFF, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x8EBA, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0xAF48, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xC16A, 0x2,
+ 0x6F12, 0x0C0C, 0x2,
+ 0x6F12, 0x8DB2, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x84FA, 0x2,
+ 0x6F12, 0xAB49, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0xB400, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x6F12, 0x40B1, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x42B1, 0x2,
+ 0x6F12, 0xA948, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x8900, 0x2,
+ 0x6F12, 0x8007, 0x2,
+ 0x6F12, 0x03D4, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x02E0, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xF5E7, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xA548, 0x2,
+ 0x6F12, 0x0274, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x04FF, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x6AFA, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x9A48, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x8F02, 0x2,
+ 0x6F12, 0x10B1, 0x2,
+ 0x6F12, 0x9E48, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x6F12, 0x30B1, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x9D49, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x0870, 0x2,
+ 0x6F12, 0x00D0, 0x2,
+ 0x6F12, 0x0B20, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0xF7E7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x9348, 0x2,
+ 0x6F12, 0x1746, 0x2,
+ 0x6F12, 0x0C46, 0x2,
+ 0x6F12, 0x406B, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x86B2, 0x2,
+ 0x6F12, 0x050C, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x4AFA, 0x2,
+ 0x6F12, 0x3A46, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xB3FA, 0x2,
+ 0x6F12, 0x022F, 0x2,
+ 0x6F12, 0x0DD3, 0x2,
+ 0x6F12, 0xE088, 0x2,
+ 0x6F12, 0x4FF6, 0x2,
+ 0x6F12, 0xFF72, 0x2,
+ 0x6F12, 0x4108, 0x2,
+ 0x6F12, 0xE180, 0x2,
+ 0x6F12, 0xA088, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x2081, 0x2,
+ 0x6F12, 0x02EA, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x6081, 0x2,
+ 0x6F12, 0x8808, 0x2,
+ 0x6F12, 0x2082, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x2EBA, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF04F, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x2DED, 0x2,
+ 0x6F12, 0x068B, 0x2,
+ 0x6F12, 0x83B0, 0x2,
+ 0x6F12, 0x0C46, 0x2,
+ 0x6F12, 0x8248, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x7DD0, 0x2,
+ 0x6F12, 0x7A48, 0x2,
+ 0x6F12, 0x826B, 0x2,
+ 0x6F12, 0x100C, 0x2,
+ 0x6F12, 0x0190, 0x2,
+ 0x6F12, 0x90B2, 0x2,
+ 0x6F12, 0x0146, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x0198, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x18FA, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x87FA, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0xE491, 0x2,
+ 0x6F12, 0x734C, 0x2,
+ 0x6F12, 0x7949, 0x2,
+ 0x6F12, 0xB9F8, 0x2,
+ 0x6F12, 0x3430, 0x2,
+ 0x6F12, 0x2278, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x9C10, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8855, 0x2,
+ 0x6F12, 0x45EA, 0x2,
+ 0x6F12, 0x0215, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0x2943, 0x2,
+ 0x6F12, 0x09F1, 0x2,
+ 0x6F12, 0x3400, 0x2,
+ 0x6F12, 0xD982, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0xA0B1, 0x2,
+ 0x6F12, 0x038B, 0x2,
+ 0x6F12, 0x9BF8, 0x2,
+ 0x6F12, 0xB353, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0x42EA, 0x2,
+ 0x6F12, 0x0512, 0x2,
+ 0x6F12, 0x9A80, 0x2,
+ 0x6F12, 0x0589, 0x2,
+ 0x6F12, 0x438B, 0x2,
+ 0x6F12, 0x05F1, 0x2,
+ 0x6F12, 0x8045, 0x2,
+ 0x6F12, 0xE982, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0x9A80, 0x2,
+ 0x6F12, 0x038A, 0x2,
+ 0x6F12, 0xB9F8, 0x2,
+ 0x6F12, 0x5000, 0x2,
+ 0x6F12, 0x03F1, 0x2,
+ 0x6F12, 0x8043, 0x2,
+ 0x6F12, 0xD982, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x8280, 0x2,
+ 0x6F12, 0x6448, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0xFC14, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x0B05, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x6249, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x94F8, 0x2,
+ 0x6F12, 0x8C00, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0x10B1, 0x2,
+ 0x6F12, 0x5F49, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x6F12, 0x5F49, 0x2,
+ 0x6F12, 0x0888, 0x2,
+ 0x6F12, 0x20F0, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x5148, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0x5222, 0x2,
+ 0x6F12, 0x5838, 0x2,
+ 0x6F12, 0x0178, 0x2,
+ 0x6F12, 0x4D48, 0x2,
+ 0x6F12, 0x8618, 0x2,
+ 0x6F12, 0x121F, 0x2,
+ 0x6F12, 0x8518, 0x2,
+ 0x6F12, 0x921C, 0x2,
+ 0x6F12, 0x8418, 0x2,
+ 0x6F12, 0xE9BB, 0x2,
+ 0x6F12, 0x2888, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x1FED, 0x2,
+ 0x6F12, 0xBFAA, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x0A0A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x31FA, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x409A, 0x2,
+ 0x6F12, 0x9FED, 0x2,
+ 0x6F12, 0x519A, 0x2,
+ 0x6F12, 0xF6EE, 0x2,
+ 0x6F12, 0x008A, 0x2,
+ 0x6F12, 0x2088, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x680A, 0x2,
+ 0x6F12, 0x09EE, 0x2,
+ 0x6F12, 0x890A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x108A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0xB5E0, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x0A0A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x18FA, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x408A, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x680A, 0x2,
+ 0x6F12, 0x3088, 0x2,
+ 0x6F12, 0x08EE, 0x2,
+ 0x6F12, 0x090A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x107A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x0A0A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x05FA, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x680A, 0x2,
+ 0x6F12, 0x40EE, 0x2,
+ 0x6F12, 0x090A, 0x2,
+ 0x6F12, 0xFCEE, 0x2,
+ 0x6F12, 0xE00A, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x2DE0, 0x2,
+ 0x6F12, 0x394A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x900A, 0x2,
+ 0x6F12, 0xA2F8, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x6F12, 0x911C, 0x2,
+ 0x6F12, 0x0F80, 0x2,
+ 0x6F12, 0x891C, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x88EE, 0x2,
+ 0x6F12, 0x291A, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x680A, 0x2,
+ 0x6F12, 0x0023, 0x2,
+ 0x6F12, 0x1A46, 0x2,
+ 0x6F12, 0x41EE, 0x2,
+ 0x6F12, 0x090A, 0x2,
+ 0x6F12, 0xFCEE, 0x2,
+ 0x6F12, 0xE00A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x901A, 0x2,
+ 0x6F12, 0xC8EE, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0x40EE, 0x2,
+ 0x6F12, 0x898A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xE80A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x521C, 0x2,
+ 0x6F12, 0x4908, 0x2,
+ 0x6F12, 0xFF29, 0x2,
+ 0x6F12, 0xFBD8, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x5B1C, 0x2,
+ 0x6F12, 0x4008, 0x2,
+ 0x6F12, 0xFF28, 0x2,
+ 0x6F12, 0xFBD8, 0x2,
+ 0x6F12, 0x42EA, 0x2,
+ 0x6F12, 0x0312, 0x2,
+ 0x6F12, 0x254B, 0x2,
+ 0x6F12, 0x1A80, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x5880, 0x2,
+ 0x6F12, 0xBBF8, 0x2,
+ 0x6F12, 0x3812, 0x2,
+ 0x6F12, 0x4FF6, 0x2,
+ 0x6F12, 0xFF73, 0x2,
+ 0x6F12, 0x03EA, 0x2,
+ 0x6F12, 0x8103, 0x2,
+ 0x6F12, 0x2149, 0x2,
+ 0x6F12, 0xB9F8, 0x2,
+ 0x6F12, 0xE000, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x44C0, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0xB9F8, 0x2,
+ 0x6F12, 0xE820, 0x2,
+ 0x6F12, 0xBCF8, 0x2,
+ 0x6F12, 0x8E70, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x2388, 0x2,
+ 0x6F12, 0x4382, 0x2,
+ 0x6F12, 0x2388, 0x2,
+ 0x6F12, 0x8382, 0x2,
+ 0x6F12, 0x2388, 0x2,
+ 0x6F12, 0xC382, 0x2,
+ 0x6F12, 0x2B88, 0x2,
+ 0x6F12, 0x0383, 0x2,
+ 0x6F12, 0x2B88, 0x2,
+ 0x6F12, 0x4383, 0x2,
+ 0x6F12, 0x2B88, 0x2,
+ 0x6F12, 0x8383, 0x2,
+ 0x6F12, 0x3388, 0x2,
+ 0x6F12, 0xC383, 0x2,
+ 0x6F12, 0x3388, 0x2,
+ 0x6F12, 0x27E0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8580, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8BA0, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xA4F0, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2004, 0x2,
+ 0x6F12, 0x3338, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x3280, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8530, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x20E0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x7FB0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xABA0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x7A00, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x9F22, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x8700, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x9802, 0x2,
+ 0x6F12, 0x4380, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xA80A, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xA33E, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0x0384, 0x2,
+ 0x6F12, 0x3388, 0x2,
+ 0x6F12, 0x4384, 0x2,
+ 0x6F12, 0x0785, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0x1046, 0x2,
+ 0x6F12, 0x0229, 0x2,
+ 0x6F12, 0xBDD3, 0x2,
+ 0x6F12, 0x02F1, 0x2,
+ 0x6F12, 0x8042, 0x2,
+ 0x6F12, 0xA2F8, 0x2,
+ 0x6F12, 0x0AA0, 0x2,
+ 0x6F12, 0xA2F8, 0x2,
+ 0x6F12, 0x0CA0, 0x2,
+ 0x6F12, 0x1020, 0x2,
+ 0x6F12, 0xD081, 0x2,
+ 0x6F12, 0x4649, 0x2,
+ 0x6F12, 0xBCF8, 0x2,
+ 0x6F12, 0x9600, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0xDDE9, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x6F12, 0x03B0, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xBDEC, 0x2,
+ 0x6F12, 0x068B, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF04F, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xEEB8, 0x2,
+ 0x6F12, 0x03B0, 0x2,
+ 0x6F12, 0xBDEC, 0x2,
+ 0x6F12, 0x068B, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF08F, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF84F, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x3C4B, 0x2,
+ 0x6F12, 0x3D4C, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x03EB, 0x2,
+ 0x6F12, 0x8002, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x4106, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0xC606, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0x8006, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0xB78A, 0x2,
+ 0x6F12, 0x1668, 0x2,
+ 0x6F12, 0x0429, 0x2,
+ 0x6F12, 0x67F3, 0x2,
+ 0x6F12, 0x1F56, 0x2,
+ 0x6F12, 0x42F8, 0x2,
+ 0x6F12, 0x186B, 0x2,
+ 0x6F12, 0xF0D3, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x0628, 0x2,
+ 0x6F12, 0xEAD3, 0x2,
+ 0x6F12, 0x6088, 0x2,
+ 0x6F12, 0x10B1, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF88F, 0x2,
+ 0x6F12, 0x3048, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xC06B, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x80B2, 0x2,
+ 0x6F12, 0x0091, 0x2,
+ 0x6F12, 0x8346, 0x2,
+ 0x6F12, 0x0146, 0x2,
+ 0x6F12, 0x0098, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xBEF8, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x38F9, 0x2,
+ 0x6F12, 0x8246, 0x2,
+ 0x6F12, 0xA946, 0x2,
+ 0x6F12, 0x0026, 0x2,
+ 0x6F12, 0xA046, 0x2,
+ 0x6F12, 0x09EB, 0x2,
+ 0x6F12, 0x8605, 0x2,
+ 0x6F12, 0x0024, 0x2,
+ 0x6F12, 0x08EB, 0x2,
+ 0x6F12, 0xC400, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x8607, 0x2,
+ 0x6F12, 0x07F1, 0x2,
+ 0x6F12, 0x7200, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x2DF9, 0x2,
+ 0x6F12, 0xC0F3, 0x2,
+ 0x6F12, 0x1301, 0x2,
+ 0x6F12, 0x2960, 0x2,
+ 0x6F12, 0xB7F8, 0x2,
+ 0x6F12, 0x7400, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x41EA, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x45F8, 0x2,
+ 0x6F12, 0x080B, 0x2,
+ 0x6F12, 0x042C, 0x2,
+ 0x6F12, 0xEAD3, 0x2,
+ 0x6F12, 0x761C, 0x2,
+ 0x6F12, 0x022E, 0x2,
+ 0x6F12, 0xE4D3, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x5946, 0x2,
+ 0x6F12, 0x0098, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x97F8, 0x2,
+ 0x6F12, 0x5046, 0x2,
+ 0x6F12, 0xC9E7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF84F, 0x2,
+ 0x6F12, 0x8246, 0x2,
+ 0x6F12, 0x1448, 0x2,
+ 0x6F12, 0x1446, 0x2,
+ 0x6F12, 0x8946, 0x2,
+ 0x6F12, 0x006C, 0x2,
+ 0x6F12, 0x9846, 0x2,
+ 0x6F12, 0x86B2, 0x2,
+ 0x6F12, 0x050C, 0x2,
+ 0x6F12, 0x0A9F, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x85F8, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6F12, 0x4988, 0x2,
+ 0x6F12, 0x24F8, 0x2,
+ 0x6F12, 0x2010, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0xF628, 0x2,
+ 0x6F12, 0xF7D3, 0x2,
+ 0x6F12, 0x4346, 0x2,
+ 0x6F12, 0x2246, 0x2,
+ 0x6F12, 0x4946, 0x2,
+ 0x6F12, 0x5046, 0x2,
+ 0x6F12, 0x0097, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xFCF8, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF84F, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x6EB8, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x9D10, 0x2,
+ 0x6F12, 0x200B, 0x2,
+ 0x6F12, 0x8488, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x4B00, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x2448, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2800, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x03D1, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x7020, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xE7B8, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x2049, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x0420, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x3E07, 0x2,
+ 0x6F12, 0x1D48, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2800, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x12D1, 0x2,
+ 0x6F12, 0x1C4C, 0x2,
+ 0x6F12, 0x6F20, 0x2,
+ 0x6F12, 0x2178, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xD7F8, 0x2,
+ 0x6F12, 0x6178, 0x2,
+ 0x6F12, 0x7020, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xD3F8, 0x2,
+ 0x6F12, 0xA178, 0x2,
+ 0x6F12, 0x7120, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xCFF8, 0x2,
+ 0x6F12, 0xE178, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0x7220, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC9B8, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x1048, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2800, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x6A20, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0x6B00, 0x2,
+ 0x6F12, 0x0A49, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x5007, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0x5F00, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x4C07, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0x7F00, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x4807, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0x8500, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x5807, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0x3B00, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x5407, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x4730, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2512, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0xE56C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x46F6, 0x2,
+ 0x6F12, 0x594C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x46F2, 0x2,
+ 0x6F12, 0xFB4C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x46F2, 0x2,
+ 0x6F12, 0xA94C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0xAF1C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0x494C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0x256C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x020C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x40F6, 0x2,
+ 0x6F12, 0x732C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x47F2, 0x2,
+ 0x6F12, 0x715C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0xC72C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0x2B3C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0x3D2C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x43F6, 0x2,
+ 0x6F12, 0xF93C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x42F2, 0x2,
+ 0x6F12, 0xD32C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4AF2, 0x2,
+ 0x6F12, 0xC15C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x41F2, 0x2,
+ 0x6F12, 0xBB3C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x020C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF6, 0x2,
+ 0x6F12, 0x3F2C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x45F6, 0x2,
+ 0x6F12, 0x290C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF6, 0x2,
+ 0x6F12, 0x112C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0x7B4C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF6, 0x2,
+ 0x6F12, 0x977C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0xE37C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x42F2, 0x2,
+ 0x6F12, 0x792C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF6, 0x2,
+ 0x6F12, 0x1D6C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0x110C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0xF92C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x40F6, 0x2,
+ 0x6F12, 0xBD6C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x42F6, 0x2,
+ 0x6F12, 0x975C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0x597C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x020C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4AF6, 0x2,
+ 0x6F12, 0x451C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4AF2, 0x2,
+ 0x6F12, 0xD37C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x40F6, 0x2,
+ 0x6F12, 0xE91C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x45F2, 0x2,
+ 0x6F12, 0x411C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x43F6, 0x2,
+ 0x6F12, 0x8D4C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6F12, 0x0406, 0x2,
+ 0x6F12, 0x1113, 0x2,
+ 0x6F12, 0x1416, 0x2,
+ 0x6F12, 0x2022, 0x2,
+ 0x6F12, 0x2527, 0x2,
+ 0x6F12, 0x3032, 0x2,
+ 0x6F12, 0x3537, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x0507, 0x2,
+ 0x6F12, 0x1012, 0x2,
+ 0x6F12, 0x1517, 0x2,
+ 0x6F12, 0x2123, 0x2,
+ 0x6F12, 0x2426, 0x2,
+ 0x6F12, 0x3133, 0x2,
+ 0x6F12, 0x3436, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6F12, 0x0406, 0x2,
+ 0x6F12, 0x1113, 0x2,
+ 0x6F12, 0x1416, 0x2,
+ 0x6F12, 0x2022, 0x2,
+ 0x6F12, 0x2527, 0x2,
+ 0x6F12, 0x3032, 0x2,
+ 0x6F12, 0x3537, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x0507, 0x2,
+ 0x6F12, 0x1012, 0x2,
+ 0x6F12, 0x1517, 0x2,
+ 0x6F12, 0x2123, 0x2,
+ 0x6F12, 0x2426, 0x2,
+ 0x6F12, 0x3133, 0x2,
+ 0x6F12, 0x3436, 0x2,
+ 0x6F12, 0x0507, 0x2,
+ 0x6F12, 0x0507, 0x2,
+ 0x6F12, 0x0D0F, 0x2,
+ 0x6F12, 0x0D0F, 0x2,
+ 0x6F12, 0x0507, 0x2,
+ 0x6F12, 0x0507, 0x2,
+ 0x6F12, 0x0D0F, 0x2,
+ 0x6F12, 0x0D0F, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6F12, 0x090B, 0x2,
+ 0x6F12, 0x090B, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6F12, 0x090B, 0x2,
+ 0x6F12, 0x090B, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x080A, 0x2,
+ 0x6F12, 0x080A, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x080A, 0x2,
+ 0x6F12, 0x080A, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2C00, 0x2,
+ 0x6F12, 0x4BF2, 0x2,
+ 0x6F12, 0xAF73, 0x2,
+ 0x6F12, 0x1847, 0x2,
+ 0x6F12, 0x3A49, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x3848, 0x2,
+ 0x6F12, 0xC863, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3849, 0x2,
+ 0x6F12, 0x3948, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xF4FF, 0x2,
+ 0x6F12, 0x384C, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3849, 0x2,
+ 0x6F12, 0x2060, 0x2,
+ 0x6F12, 0x3848, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xEDFF, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3749, 0x2,
+ 0x6F12, 0x3748, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xE7FF, 0x2,
+ 0x6F12, 0xA060, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3649, 0x2,
+ 0x6F12, 0x3648, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xE1FF, 0x2,
+ 0x6F12, 0x6061, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3549, 0x2,
+ 0x6F12, 0x3548, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xDBFF, 0x2,
+ 0x6F12, 0xE060, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3449, 0x2,
+ 0x6F12, 0x3448, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xD5FF, 0x2,
+ 0x6F12, 0x2061, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3349, 0x2,
+ 0x6F12, 0x3348, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xCFFF, 0x2,
+ 0x6F12, 0xA061, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3249, 0x2,
+ 0x6F12, 0x3248, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xC9FF, 0x2,
+ 0x6F12, 0xE061, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3149, 0x2,
+ 0x6F12, 0x3148, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xC3FF, 0x2,
+ 0x6F12, 0x2062, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x3049, 0x2,
+ 0x6F12, 0x3048, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xBDFF, 0x2,
+ 0x6F12, 0x6062, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2F49, 0x2,
+ 0x6F12, 0x2F48, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xB7FF, 0x2,
+ 0x6F12, 0xA062, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2E49, 0x2,
+ 0x6F12, 0x2E48, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xB1FF, 0x2,
+ 0x6F12, 0x2F49, 0x2,
+ 0x6F12, 0xE062, 0x2,
+ 0x6F12, 0x2D48, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x9C00, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2D49, 0x2,
+ 0x6F12, 0x2D48, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xA7FF, 0x2,
+ 0x6F12, 0x2063, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2C49, 0x2,
+ 0x6F12, 0x2C48, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xA1FF, 0x2,
+ 0x6F12, 0x6063, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2B49, 0x2,
+ 0x6F12, 0x2B48, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x9BFF, 0x2,
+ 0x6F12, 0xA063, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2A49, 0x2,
+ 0x6F12, 0x2A48, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x95FF, 0x2,
+ 0x6F12, 0xE063, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2949, 0x2,
+ 0x6F12, 0x2948, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x8FFF, 0x2,
+ 0x6F12, 0x2064, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0xFBF7, 0x2,
+ 0x6F12, 0xBABE, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE857, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x56F0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCA31, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x6C69, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCA7D, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x1C49, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCAEB, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x8625, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCBCB, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x7C97, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCCA9, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x3BF9, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCD71, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x22D3, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCEBD, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0xA5C1, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xCF2F, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6F12, 0x13BB, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xDBBD, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0xEB6F, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xDD3D, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0xE7FD, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE347, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0xEA47, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE3A1, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0xE3A1, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE03B, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE3ED, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x9C7D, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE40D, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0EBD, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE461, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x2D97, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE6EB, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0xA945, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xE793, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x09E9, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0xEA60, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x214D, 0x2,
+ 0x6F12, 0x1F48, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xE864, 0x2,
+ 0x6F12, 0x2048, 0x2,
+ 0x6F12, 0xA862, 0x2,
+ 0x6F12, 0x2049, 0x2,
+ 0x6F12, 0x2048, 0x2,
+ 0x6F12, 0x04F0, 0x2,
+ 0x6F12, 0xC5F8, 0x2,
+ 0x6F12, 0x204C, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2049, 0x2,
+ 0x6F12, 0x2067, 0x2,
+ 0x6F12, 0x2048, 0x2,
+ 0x6F12, 0x04F0, 0x2,
+ 0x6F12, 0xBEF8, 0x2,
+ 0x6F12, 0xE066, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x1E49, 0x2,
+ 0x6F12, 0x1F48, 0x2,
+ 0x6F12, 0x04F0, 0x2,
+ 0x6F12, 0xB8F8, 0x2,
+ 0x6F12, 0xA066, 0x2,
+ 0x6F12, 0x1E48, 0x2,
+ 0x6F12, 0x2863, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x1D49, 0x2,
+ 0x6F12, 0x1E48, 0x2,
+ 0x6F12, 0x04F0, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0x6066, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x1C49, 0x2,
+ 0x6F12, 0x1D48, 0x2,
+ 0x6F12, 0x04F0, 0x2,
+ 0x6F12, 0xAAF8, 0x2,
+ 0x6F12, 0x2066, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x1B49, 0x2,
+ 0x6F12, 0x1C48, 0x2,
+ 0x6F12, 0x04F0, 0x2,
+ 0x6F12, 0xA4F8, 0x2,
+ 0x6F12, 0x1C49, 0x2,
+ 0x6F12, 0x6065, 0x2,
+ 0x6F12, 0x1A48, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x9C00, 0x2,
+ 0x6F12, 0x1C49, 0x2,
+ 0x6F12, 0x1A48, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0xDC05, 0x2,
+ 0x6F12, 0x1B49, 0x2,
+ 0x6F12, 0x081A, 0x2,
+ 0x6F12, 0x1949, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0xE005, 0x2,
+ 0x6F12, 0x42F2, 0x2,
+ 0x6F12, 0x2A20, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0xB805, 0x2,
+ 0x6F12, 0x1749, 0x2,
+ 0x6F12, 0x0968, 0x2,
+ 0x6F12, 0x4883, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xF46F, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x56F0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xF65D, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xF031, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0xDFCD, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xEFE3, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2CDD, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xEF0D, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x7D09, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xEED3, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xED25, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0xD5E5, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xEC07, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0xC36D, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xEBFD, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x44C3, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xEB41, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xF8E4, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x0AE0, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x0E46, 0x2,
+ 0x6F12, 0x2DED, 0x2,
+ 0x6F12, 0x028B, 0x2,
+ 0x6F12, 0x82B0, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0xFD4C, 0x2,
+ 0x6F12, 0xFE4D, 0x2,
+ 0x6F12, 0xB0F5, 0x2,
+ 0x6F12, 0x807F, 0x2,
+ 0x6F12, 0x02D1, 0x2,
+ 0x6F12, 0x95F8, 0x2,
+ 0x6F12, 0x6D00, 0x2,
+ 0x6F12, 0xB8B3, 0x2,
+ 0x6F12, 0x94F8, 0x2,
+ 0x6F12, 0x3300, 0x2,
+ 0x6F12, 0x18B9, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x3B20, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x03FF, 0x2,
+ 0x6F12, 0x95F8, 0x2,
+ 0x6F12, 0x6D00, 0x2,
+ 0x6F12, 0xDFED, 0x2,
+ 0x6F12, 0xF78A, 0x2,
+ 0x6F12, 0x60B3, 0x2,
+ 0x6F12, 0xF648, 0x2,
+ 0x6F12, 0xF749, 0x2,
+ 0x6F12, 0x0823, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x6F12, 0xB1F8, 0x2,
+ 0x6F12, 0x6412, 0x2,
+ 0x6F12, 0x4843, 0x2,
+ 0x6F12, 0x020B, 0x2,
+ 0x6F12, 0x01A8, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0xEF48, 0x2,
+ 0x6F12, 0x0521, 0x2,
+ 0x6F12, 0x6E30, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xFEFE, 0x2,
+ 0x6F12, 0x2844, 0x2,
+ 0x6F12, 0x10F8, 0x2,
+ 0x6F12, 0x781F, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x101A, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x9FED, 0x2,
+ 0x6F12, 0xED0A, 0x2,
+ 0x6F12, 0x4078, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x808A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x900A, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0x800A, 0x2,
+ 0x6F12, 0x9DED, 0x2,
+ 0x6F12, 0x010A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x70EE, 0x2,
+ 0x6F12, 0xC80A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x280A, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x808A, 0x2,
+ 0x6F12, 0x08E0, 0x2,
+ 0x6F12, 0x0FE0, 0x2,
+ 0x6F12, 0xFFE7, 0x2,
+ 0x6F12, 0x3089, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x288A, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x480A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x21F9, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x480A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xC5F9, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x84F8, 0x2,
+ 0x6F12, 0x3300, 0x2,
+ 0x6F12, 0x02B0, 0x2,
+ 0x6F12, 0xBDEC, 0x2,
+ 0x6F12, 0x028B, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x0746, 0x2,
+ 0x6F12, 0xD348, 0x2,
+ 0x6F12, 0xCE4C, 0x2,
+ 0x6F12, 0x0D46, 0x2,
+ 0x6F12, 0x2DED, 0x2,
+ 0x6F12, 0x028B, 0x2,
+ 0x6F12, 0x1646, 0x2,
+ 0x6F12, 0xB0F9, 0x2,
+ 0x6F12, 0xF012, 0x2,
+ 0x6F12, 0xA28A, 0x2,
+ 0x6F12, 0x9142, 0x2,
+ 0x6F12, 0x09D1, 0x2,
+ 0x6F12, 0xB0F9, 0x2,
+ 0x6F12, 0xF212, 0x2,
+ 0x6F12, 0xE28A, 0x2,
+ 0x6F12, 0x9142, 0x2,
+ 0x6F12, 0x04D1, 0x2,
+ 0x6F12, 0xB0F9, 0x2,
+ 0x6F12, 0xF412, 0x2,
+ 0x6F12, 0x228B, 0x2,
+ 0x6F12, 0x9142, 0x2,
+ 0x6F12, 0x0CD0, 0x2,
+ 0x6F12, 0x00F5, 0x2,
+ 0x6F12, 0x3C70, 0x2,
+ 0x6F12, 0xA18A, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0xE18A, 0x2,
+ 0x6F12, 0x4180, 0x2,
+ 0x6F12, 0x218B, 0x2,
+ 0x6F12, 0x8180, 0x2,
+ 0x6F12, 0x06F1, 0x2,
+ 0x6F12, 0x4001, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xCAFD, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xCBFD, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x408A, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x3846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC5FD, 0x2,
+ 0x6F12, 0xA088, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x408A, 0x2,
+ 0x6F12, 0x08B3, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x105A, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xBFFD, 0x2,
+ 0x6F12, 0xB6F8, 0x2,
+ 0x6F12, 0x8000, 0x2,
+ 0x6F12, 0x00EE, 0x2,
+ 0x6F12, 0x900A, 0x2,
+ 0x6F12, 0xF8EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x20EE, 0x2,
+ 0x6F12, 0x200A, 0x2,
+ 0x6F12, 0xDFED, 0x2,
+ 0x6F12, 0xB50A, 0x2,
+ 0x6F12, 0x01EE, 0x2,
+ 0x6F12, 0x105A, 0x2,
+ 0x6F12, 0x60EE, 0x2,
+ 0x6F12, 0x200A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x411A, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x480A, 0x2,
+ 0x6F12, 0x01EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x01EE, 0x2,
+ 0x6F12, 0x107A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x411A, 0x2,
+ 0x6F12, 0x01EE, 0x2,
+ 0x6F12, 0x200A, 0x2,
+ 0x6F12, 0x06E0, 0x2,
+ 0x6F12, 0x3246, 0x2,
+ 0x6F12, 0x3946, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x480A, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xA2FD, 0x2,
+ 0x6F12, 0xDFED, 0x2,
+ 0x6F12, 0xA90A, 0x2,
+ 0x6F12, 0x78EE, 0x2,
+ 0x6F12, 0xA00A, 0x2,
+ 0x6F12, 0xF4EE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0xF1EE, 0x2,
+ 0x6F12, 0x10FA, 0x2,
+ 0x6F12, 0x01D2, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x600A, 0x2,
+ 0x6F12, 0x9FED, 0x2,
+ 0x6F12, 0xA41A, 0x2,
+ 0x6F12, 0xB5EE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0xF1EE, 0x2,
+ 0x6F12, 0x10FA, 0x2,
+ 0x6F12, 0x02D2, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x410A, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x900A, 0x2,
+ 0x6F12, 0xB0F1, 0x2,
+ 0x6F12, 0x8B4F, 0x2,
+ 0x6F12, 0x07DA, 0x2,
+ 0x6F12, 0xB5EE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0xF1EE, 0x2,
+ 0x6F12, 0x10FA, 0x2,
+ 0x6F12, 0x04D2, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x410A, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x9FED, 0x2,
+ 0x6F12, 0x990A, 0x2,
+ 0x6F12, 0xF6EE, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0xBDEC, 0x2,
+ 0x6F12, 0x028B, 0x2,
+ 0x6F12, 0x30EE, 0x2,
+ 0x6F12, 0x200A, 0x2,
+ 0x6F12, 0xBCEE, 0x2,
+ 0x6F12, 0xC00A, 0x2,
+ 0x6F12, 0x10EE, 0x2,
+ 0x6F12, 0x100A, 0x2,
+ 0x6F12, 0x80B2, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF081, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x9148, 0x2,
+ 0x6F12, 0x0D46, 0x2,
+ 0x6F12, 0xA8B0, 0x2,
+ 0x6F12, 0x416E, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x0C0C, 0x2,
+ 0x6F12, 0x8EB2, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xBEFD, 0x2,
+ 0x6F12, 0x8448, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x0009, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0xC004, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x21D1, 0x2,
+ 0x6F12, 0x8149, 0x2,
+ 0x6F12, 0x824A, 0x2,
+ 0x6F12, 0xD1F8, 0x2,
+ 0x6F12, 0x8802, 0x2,
+ 0x6F12, 0xD1F8, 0x2,
+ 0x6F12, 0x9412, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0xAC25, 0x2,
+ 0x6F12, 0xC2B1, 0x2,
+ 0x6F12, 0xC1F3, 0x2,
+ 0x6F12, 0x5501, 0x2,
+ 0x6F12, 0x8842, 0x2,
+ 0x6F12, 0x14D9, 0x2,
+ 0x6F12, 0x7C48, 0x2,
+ 0x6F12, 0x7C49, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0x8605, 0x2,
+ 0x6F12, 0xB1F8, 0x2,
+ 0x6F12, 0x8815, 0x2,
+ 0x6F12, 0x4218, 0x2,
+ 0x6F12, 0x7749, 0x2,
+ 0x6F12, 0x01F5, 0x2,
+ 0x6F12, 0x9760, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0xB824, 0x2,
+ 0x6F12, 0x0A46, 0x2,
+ 0x6F12, 0xA2F8, 0x2,
+ 0x6F12, 0xBA94, 0x2,
+ 0x6F12, 0x7B4A, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x1080, 0x2,
+ 0x6F12, 0x901C, 0x2,
+ 0x6F12, 0xA0F8, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x39FD, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x8CFD, 0x2,
+ 0x6F12, 0xE889, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x5CD1, 0x2,
+ 0x6F12, 0xB5F9, 0x2,
+ 0x6F12, 0x0640, 0x2,
+ 0x6F12, 0xB5F9, 0x2,
+ 0x6F12, 0x0810, 0x2,
+ 0x6F12, 0x6A4A, 0x2,
+ 0x6F12, 0x0591, 0x2,
+ 0x6F12, 0x661A, 0x2,
+ 0x6F12, 0xB2F9, 0x2,
+ 0x6F12, 0xB834, 0x2,
+ 0x6F12, 0x02F5, 0x2,
+ 0x6F12, 0x9767, 0x2,
+ 0x6F12, 0x7343, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x640A, 0x2,
+ 0x6F12, 0x93FB, 0x2,
+ 0x6F12, 0xFAF2, 0x2,
+ 0x6F12, 0x6018, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0xD075, 0x2,
+ 0x6F12, 0xC2EB, 0x2,
+ 0x6F12, 0x6500, 0x2,
+ 0x6F12, 0x491C, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x1EFD, 0x2,
+ 0x6F12, 0x0790, 0x2,
+ 0x6F12, 0xB7F9, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x611E, 0x2,
+ 0x6F12, 0x7043, 0x2,
+ 0x6F12, 0x90FB, 0x2,
+ 0x6F12, 0xFAF0, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x6500, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x18FD, 0x2,
+ 0x6F12, 0x0990, 0x2,
+ 0x6F12, 0x5A48, 0x2,
+ 0x6F12, 0x0B94, 0x2,
+ 0x6F12, 0x0124, 0x2,
+ 0x6F12, 0xB0F9, 0x2,
+ 0x6F12, 0xB604, 0x2,
+ 0x6F12, 0x0690, 0x2,
+ 0x6F12, 0x5748, 0x2,
+ 0x6F12, 0x03AE, 0x2,
+ 0x6F12, 0x27AF, 0x2,
+ 0x6F12, 0xB0F9, 0x2,
+ 0x6F12, 0xBE04, 0x2,
+ 0x6F12, 0x0890, 0x2,
+ 0x6F12, 0x0A90, 0x2,
+ 0x6F12, 0x5348, 0x2,
+ 0x6F12, 0x0DF1, 0x2,
+ 0x6F12, 0x940A, 0x2,
+ 0x6F12, 0xB0F9, 0x2,
+ 0x6F12, 0xBC04, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x9490, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x9C90, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x9890, 0x2,
+ 0x6F12, 0x0C90, 0x2,
+ 0x6F12, 0x0DF1, 0x2,
+ 0x6F12, 0x9809, 0x2,
+ 0x6F12, 0x06EB, 0x2,
+ 0x6F12, 0xC402, 0x2,
+ 0x6F12, 0x56F8, 0x2,
+ 0x6F12, 0x3400, 0x2,
+ 0x6F12, 0xD2E9, 0x2,
+ 0x6F12, 0x0115, 0x2,
+ 0x6F12, 0xD368, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x0197, 0x2,
+ 0x6F12, 0x2A46, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xF3FC, 0x2,
+ 0x6F12, 0x08EB, 0x2,
+ 0x6F12, 0x4400, 0x2,
+ 0x6F12, 0x2799, 0x2,
+ 0x6F12, 0x4184, 0x2,
+ 0x6F12, 0x2599, 0x2,
+ 0x6F12, 0x4180, 0x2,
+ 0x6F12, 0x2699, 0x2,
+ 0x6F12, 0xA0F8, 0x2,
+ 0x6F12, 0x4210, 0x2,
+ 0x6F12, 0x0F2C, 0x2,
+ 0x6F12, 0x01DA, 0x2,
+ 0x6F12, 0xA0F8, 0x2,
+ 0x6F12, 0x6250, 0x2,
+ 0x6F12, 0x641C, 0x2,
+ 0x6F12, 0x042C, 0x2,
+ 0x6F12, 0xE1DB, 0x2,
+ 0x6F12, 0x3848, 0x2,
+ 0x6F12, 0x3D49, 0x2,
+ 0x6F12, 0x4289, 0x2,
+ 0x6F12, 0x012A, 0x2,
+ 0x6F12, 0x2BD0, 0x2,
+ 0x6F12, 0x0B46, 0x2,
+ 0x6F12, 0x428A, 0x2,
+ 0x6F12, 0xA3F8, 0x2,
+ 0x6F12, 0x7225, 0x2,
+ 0x6F12, 0xC289, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x1622, 0x2,
+ 0x6F12, 0x374A, 0x2,
+ 0x6F12, 0x374B, 0x2,
+ 0x6F12, 0x364C, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0x8425, 0x2,
+ 0x6F12, 0xB3F8, 0x2,
+ 0x6F12, 0x8C35, 0x2,
+ 0x6F12, 0xB4F8, 0x2,
+ 0x6F12, 0x9045, 0x2,
+ 0x6F12, 0x42EA, 0x2,
+ 0x6F12, 0x4302, 0x2,
+ 0x6F12, 0x324B, 0x2,
+ 0x6F12, 0xB3F8, 0x2,
+ 0x6F12, 0x7235, 0x2,
+ 0x6F12, 0xDB00, 0x2,
+ 0x6F12, 0x43EA, 0x2,
+ 0x6F12, 0x8403, 0x2,
+ 0x6F12, 0x1A43, 0x2,
+ 0x6F12, 0x344B, 0x2,
+ 0x6F12, 0x0C3B, 0x2,
+ 0x6F12, 0x1A80, 0x2,
+ 0x6F12, 0x2D4A, 0x2,
+ 0x6F12, 0x408B, 0x2,
+ 0x6F12, 0xA2F8, 0x2,
+ 0x6F12, 0x6604, 0x2,
+ 0x6F12, 0xB1F8, 0x2,
+ 0x6F12, 0x2C02, 0x2,
+ 0x6F12, 0x3149, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x1046, 0x2,
+ 0x6F12, 0x3049, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0xC804, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x28B0, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF087, 0x2,
+ 0x6F12, 0x254B, 0x2,
+ 0x6F12, 0x028A, 0x2,
+ 0x6F12, 0xA3F8, 0x2,
+ 0x6F12, 0x7225, 0x2,
+ 0x6F12, 0x8289, 0x2,
+ 0x6F12, 0xD2E7, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xAEFC, 0x2,
+ 0x6F12, 0x2948, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0x3E07, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0x13D1, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xABFC, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x0ED0, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x0846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xAAFC, 0x2,
+ 0x6F12, 0x2249, 0x2,
+ 0x6F12, 0x2348, 0x2,
+ 0x6F12, 0xB1F8, 0x2,
+ 0x6F12, 0x8E17, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x9FBC, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x1646, 0x2,
+ 0x6F12, 0x2DED, 0x2,
+ 0x6F12, 0x048B, 0x2,
+ 0x6F12, 0x0F46, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xDEFC, 0x2,
+ 0x6F12, 0x0D4A, 0x2,
+ 0x6F12, 0x0146, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0x6823, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0x5820, 0x2,
+ 0x6F12, 0xD518, 0x2,
+ 0x6F12, 0x1044, 0x2,
+ 0x6F12, 0x0229, 0x2,
+ 0x6F12, 0x50D3, 0x2,
+ 0x6F12, 0x90ED, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x37FD, 0x2,
+ 0x6F12, 0xF0EE, 0x2,
+ 0x6F12, 0x408A, 0x2,
+ 0x6F12, 0x21E0, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2520, 0x2,
+ 0x6F12, 0x3B80, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xA5F8, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8BA0, 0x2,
+ 0x6F12, 0x3C00, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x7A00, 0x2,
+ 0x6F12, 0x3780, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x451C, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x4580, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xA40E, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xA808, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xA692, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x200B, 0x2,
+ 0x6F12, 0x8442, 0x2,
+ 0x6F12, 0x95ED, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x0CFD, 0x2,
+ 0x6F12, 0xFF48, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x408A, 0x2,
+ 0x6F12, 0x90ED, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0xB8EE, 0x2,
+ 0x6F12, 0x400A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x03FD, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x409A, 0x2,
+ 0x6F12, 0x0C20, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x680A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x4FFC, 0x2,
+ 0x6F12, 0x2060, 0x2,
+ 0x6F12, 0x0C20, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x490A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x49FC, 0x2,
+ 0x6F12, 0x3060, 0x2,
+ 0x6F12, 0x0C20, 0x2,
+ 0x6F12, 0xB0EE, 0x2,
+ 0x6F12, 0x480A, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x43FC, 0x2,
+ 0x6F12, 0x3860, 0x2,
+ 0x6F12, 0xBDEC, 0x2,
+ 0x6F12, 0x048B, 0x2,
+ 0x6F12, 0xA5E6, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x6F12, 0x2060, 0x2,
+ 0x6F12, 0x2868, 0x2,
+ 0x6F12, 0x3860, 0x2,
+ 0x6F12, 0x2068, 0x2,
+ 0x6F12, 0x3060, 0x2,
+ 0x6F12, 0xF5E7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x0646, 0x2,
+ 0x6F12, 0xEB48, 0x2,
+ 0x6F12, 0x8846, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xC06E, 0x2,
+ 0x6F12, 0x87B2, 0x2,
+ 0x6F12, 0x050C, 0x2,
+ 0x6F12, 0x3946, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x60FC, 0x2,
+ 0x6F12, 0xE749, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0xA407, 0x2,
+ 0x6F12, 0x4146, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x28FC, 0x2,
+ 0x6F12, 0x0446, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x3946, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x52FC, 0x2,
+ 0x6F12, 0x062E, 0x2,
+ 0x6F12, 0x07D1, 0x2,
+ 0x6F12, 0x5FEA, 0x2,
+ 0x6F12, 0xC870, 0x2,
+ 0x6F12, 0x02D0, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x0054, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x8054, 0x2,
+ 0x6F12, 0x2046, 0x2,
+ 0x6F12, 0x77E6, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF04F, 0x2,
+ 0x6F12, 0xDA49, 0x2,
+ 0x6F12, 0x85B0, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x0109, 0x2,
+ 0x6F12, 0x81F8, 0x2,
+ 0x6F12, 0x3390, 0x2,
+ 0x6F12, 0xD849, 0x2,
+ 0x6F12, 0x0888, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x60A3, 0x2,
+ 0x6F12, 0x9AF8, 0x2,
+ 0x6F12, 0x6C20, 0x2,
+ 0x6F12, 0x40EA, 0x2,
+ 0x6F12, 0x8200, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0xD648, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x70B3, 0x2,
+ 0x6F12, 0x0914, 0x2,
+ 0x6F12, 0xB1FB, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x6F12, 0xC0B2, 0x2,
+ 0x6F12, 0x0490, 0x2,
+ 0x6F12, 0xD248, 0x2,
+ 0x6F12, 0x49F6, 0x2,
+ 0x6F12, 0x0A04, 0x2,
+ 0x6F12, 0x0227, 0x2,
+ 0x6F12, 0xD0E9, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x0C80, 0x2,
+ 0x6F12, 0xCDE9, 0x2,
+ 0x6F12, 0x0110, 0x2,
+ 0x6F12, 0x49F6, 0x2,
+ 0x6F12, 0x1C06, 0x2,
+ 0x6F12, 0x0AF1, 0x2,
+ 0x6F12, 0x1C05, 0x2,
+ 0x6F12, 0x0DF1, 0x2,
+ 0x6F12, 0x0C0B, 0x2,
+ 0x6F12, 0x0823, 0x2,
+ 0x6F12, 0xCDF8, 0x2,
+ 0x6F12, 0x00B0, 0x2,
+ 0x6F12, 0x0421, 0x2,
+ 0x6F12, 0x01A8, 0x2,
+ 0x6F12, 0x049A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x7CFC, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x7ED0, 0x2,
+ 0x6F12, 0x05EB, 0x2,
+ 0x6F12, 0x4001, 0x2,
+ 0x6F12, 0x35F8, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x4988, 0x2,
+ 0x6F12, 0x039A, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x6DFC, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x0853, 0x2,
+ 0x6F12, 0xE019, 0x2,
+ 0x6F12, 0x0835, 0x2,
+ 0x6F12, 0x84B2, 0x2,
+ 0x6F12, 0xB442, 0x2,
+ 0x6F12, 0xE5D9, 0x2,
+ 0x6F12, 0xBE48, 0x2,
+ 0x6F12, 0x9AF8, 0x2,
+ 0x6F12, 0x0610, 0x2,
+ 0x6F12, 0x5446, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x9AF8, 0x2,
+ 0x6F12, 0x0710, 0x2,
+ 0x6F12, 0x4186, 0x2,
+ 0x6F12, 0x4FF2, 0x2,
+ 0x6F12, 0x1800, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xCAFB, 0x2,
+ 0x6F12, 0x0546, 0x2,
+ 0x6F12, 0x4FF2, 0x2,
+ 0x6F12, 0x1C00, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC5FB, 0x2,
+ 0x6F12, 0x2188, 0x2,
+ 0x6F12, 0x6288, 0x2,
+ 0x6F12, 0x2944, 0x2,
+ 0x6F12, 0x841A, 0x2,
+ 0x6F12, 0x4FF2, 0x2,
+ 0x6F12, 0x2800, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC2FB, 0x2,
+ 0x6F12, 0x2146, 0x2,
+ 0x6F12, 0x4FF2, 0x2,
+ 0x6F12, 0x2C00, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xBDFB, 0x2,
+ 0x6F12, 0xA948, 0x2,
+ 0x6F12, 0x0225, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0xA0A2, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xF705, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x7ED0, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x9DFB, 0x2,
+ 0x6F12, 0xAB4A, 0x2,
+ 0x6F12, 0xA949, 0x2,
+ 0x6F12, 0x5068, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0xF932, 0x2,
+ 0x6F12, 0x80F8, 0x2,
+ 0x6F12, 0xD630, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0xF632, 0x2,
+ 0x6F12, 0x80F8, 0x2,
+ 0x6F12, 0xD030, 0x2,
+ 0x6F12, 0xA64B, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0xC040, 0x2,
+ 0x6F12, 0x84B1, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0xBF30, 0x2,
+ 0x6F12, 0x6BB1, 0x2,
+ 0x6F12, 0x01F5, 0x2,
+ 0x6F12, 0xB871, 0x2,
+ 0x6F12, 0x0B88, 0x2,
+ 0x6F12, 0x1B0A, 0x2,
+ 0x6F12, 0x00F8, 0x2,
+ 0x6F12, 0x763F, 0x2,
+ 0x6F12, 0x4B78, 0x2,
+ 0x6F12, 0x8370, 0x2,
+ 0x6F12, 0x4B88, 0x2,
+ 0x6F12, 0x1B0A, 0x2,
+ 0x6F12, 0x0371, 0x2,
+ 0x6F12, 0xC978, 0x2,
+ 0x6F12, 0x8171, 0x2,
+ 0x6F12, 0x7638, 0x2,
+ 0x6F12, 0xAA24, 0x2,
+ 0x6F12, 0x00F8, 0x2,
+ 0x6F12, 0xDF4F, 0x2,
+ 0x6F12, 0x0C21, 0x2,
+ 0x6F12, 0x4170, 0x2,
+ 0x6F12, 0xA523, 0x2,
+ 0x6F12, 0x8370, 0x2,
+ 0x6F12, 0x8021, 0x2,
+ 0x6F12, 0xC170, 0x2,
+ 0x6F12, 0x9549, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x4014, 0x2,
+ 0x6F12, 0x4171, 0x2,
+ 0x6F12, 0x9349, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x4114, 0x2,
+ 0x6F12, 0xC171, 0x2,
+ 0x6F12, 0x9149, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x4214, 0x2,
+ 0x6F12, 0x4172, 0x2,
+ 0x6F12, 0x8F49, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x4314, 0x2,
+ 0x6F12, 0xC172, 0x2,
+ 0x6F12, 0x8D49, 0x2,
+ 0x6F12, 0x01F2, 0x2,
+ 0x6F12, 0x4446, 0x2,
+ 0x6F12, 0xB1F8, 0x2,
+ 0x6F12, 0x4414, 0x2,
+ 0x6F12, 0x090A, 0x2,
+ 0x6F12, 0x4173, 0x2,
+ 0x6F12, 0x7178, 0x2,
+ 0x6F12, 0xC173, 0x2,
+ 0x6F12, 0x9AF8, 0x2,
+ 0x6F12, 0xBD10, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x5BE0, 0x2,
+ 0x6F12, 0x7E4E, 0x2,
+ 0x6F12, 0xC1F1, 0x2,
+ 0x6F12, 0x0C01, 0x2,
+ 0x6F12, 0x203E, 0x2,
+ 0x6F12, 0x1268, 0x2,
+ 0x6F12, 0x3768, 0x2,
+ 0x6F12, 0xCF40, 0x2,
+ 0x6F12, 0x3F0A, 0x2,
+ 0x6F12, 0x02F8, 0x2,
+ 0x6F12, 0xDC7F, 0x2,
+ 0x6F12, 0x3668, 0x2,
+ 0x6F12, 0xCE40, 0x2,
+ 0x6F12, 0x9670, 0x2,
+ 0x6F12, 0x774E, 0x2,
+ 0x6F12, 0x1C3E, 0x2,
+ 0x6F12, 0x3768, 0x2,
+ 0x6F12, 0xCF40, 0x2,
+ 0x6F12, 0x3F0A, 0x2,
+ 0x6F12, 0x1771, 0x2,
+ 0x6F12, 0x3668, 0x2,
+ 0x6F12, 0xCE40, 0x2,
+ 0x6F12, 0x9671, 0x2,
+ 0x6F12, 0x734E, 0x2,
+ 0x6F12, 0x183E, 0x2,
+ 0x6F12, 0x3768, 0x2,
+ 0x6F12, 0xCF40, 0x2,
+ 0x6F12, 0x3F0A, 0x2,
+ 0x6F12, 0x1772, 0x2,
+ 0x6F12, 0x3668, 0x2,
+ 0x6F12, 0xCE40, 0x2,
+ 0x6F12, 0x9672, 0x2,
+ 0x6F12, 0x6E4E, 0x2,
+ 0x6F12, 0x143E, 0x2,
+ 0x6F12, 0x3768, 0x2,
+ 0x6F12, 0xCF40, 0x2,
+ 0x6F12, 0x3F0A, 0x2,
+ 0x6F12, 0x1773, 0x2,
+ 0x6F12, 0x3668, 0x2,
+ 0x6F12, 0xCE40, 0x2,
+ 0x6F12, 0x9673, 0x2,
+ 0x6F12, 0x6A4A, 0x2,
+ 0x6F12, 0x103A, 0x2,
+ 0x6F12, 0x1668, 0x2,
+ 0x6F12, 0xCE40, 0x2,
+ 0x6F12, 0x360A, 0x2,
+ 0x6F12, 0x00F8, 0x2,
+ 0x6F12, 0xA76C, 0x2,
+ 0x6F12, 0x1268, 0x2,
+ 0x6F12, 0xCA40, 0x2,
+ 0x6F12, 0x00F8, 0x2,
+ 0x6F12, 0xA52C, 0x2,
+ 0x6F12, 0x644A, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x1CE0, 0x2,
+ 0x6F12, 0x0C3A, 0x2,
+ 0x6F12, 0x1668, 0x2,
+ 0x6F12, 0xCE40, 0x2,
+ 0x6F12, 0x360A, 0x2,
+ 0x6F12, 0x00F8, 0x2,
+ 0x6F12, 0xA36C, 0x2,
+ 0x6F12, 0x1268, 0x2,
+ 0x6F12, 0xCA40, 0x2,
+ 0x6F12, 0x00F8, 0x2,
+ 0x6F12, 0xA12C, 0x2,
+ 0x6F12, 0x5E4A, 0x2,
+ 0x6F12, 0x1268, 0x2,
+ 0x6F12, 0x00F8, 0x2,
+ 0x6F12, 0xA04D, 0x2,
+ 0x6F12, 0xCA40, 0x2,
+ 0x6F12, 0x4570, 0x2,
+ 0x6F12, 0x8370, 0x2,
+ 0x6F12, 0x3821, 0x2,
+ 0x6F12, 0xC170, 0x2,
+ 0x6F12, 0x5A21, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x6F12, 0x130A, 0x2,
+ 0x6F12, 0x4371, 0x2,
+ 0x6F12, 0x8171, 0x2,
+ 0x6F12, 0xC271, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x0846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x04FB, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x0846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x00FB, 0x2,
+ 0x6F12, 0x5F48, 0x2,
+ 0x6F12, 0x5E4C, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x28B1, 0x2,
+ 0x6F12, 0x2FE0, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0xE988, 0x2,
+ 0x6F12, 0x0153, 0x2,
+ 0x6F12, 0x29E7, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x3DFB, 0x2,
+ 0x6F12, 0x0746, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x0AFB, 0x2,
+ 0x6F12, 0x5A48, 0x2,
+ 0x6F12, 0x584E, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0xB188, 0x2,
+ 0x6F12, 0x401A, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x3081, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x6F12, 0x3082, 0x2,
+ 0x6F12, 0x0420, 0x2,
+ 0x6F12, 0x3070, 0x2,
+ 0x6F12, 0x7070, 0x2,
+ 0x6F12, 0xB070, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xFAFA, 0x2,
+ 0x6F12, 0x28B1, 0x2,
+ 0x6F12, 0x032F, 0x2,
+ 0x6F12, 0x06D0, 0x2,
+ 0x6F12, 0x022F, 0x2,
+ 0x6F12, 0x0AD0, 0x2,
+ 0x6F12, 0x6FB1, 0x2,
+ 0x6F12, 0x0EE0, 0x2,
+ 0x6F12, 0x0320, 0x2,
+ 0x6F12, 0x3070, 0x2,
+ 0x6F12, 0x0BE0, 0x2,
+ 0x6F12, 0x86F8, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x6F12, 0x86F8, 0x2,
+ 0x6F12, 0x0190, 0x2,
+ 0x6F12, 0xB570, 0x2,
+ 0x6F12, 0x05E0, 0x2,
+ 0x6F12, 0x86F8, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x6F12, 0x7570, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x86F8, 0x2,
+ 0x6F12, 0x0090, 0x2,
+ 0x6F12, 0x4848, 0x2,
+ 0x6F12, 0x0088, 0x2,
+ 0x6F12, 0x10BB, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x4050, 0x2,
+ 0x6F12, 0xA4F8, 0x2,
+ 0x6F12, 0x9801, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xA4F8, 0x2,
+ 0x6F12, 0x9A01, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0xA4F8, 0x2,
+ 0x6F12, 0x9C01, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0xA4F8, 0x2,
+ 0x6F12, 0x9E01, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0xA4F8, 0x2,
+ 0x6F12, 0x8201, 0x2,
+ 0x6F12, 0xB4F8, 0x2,
+ 0x6F12, 0x4200, 0x2,
+ 0x6F12, 0xB4F8, 0x2,
+ 0x6F12, 0x8210, 0x2,
+ 0x6F12, 0xB4F8, 0x2,
+ 0x6F12, 0x4221, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0xB4F8, 0x2,
+ 0x6F12, 0x0211, 0x2,
+ 0x6F12, 0x1144, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0x00F5, 0x2,
+ 0x6F12, 0x7040, 0x2,
+ 0x6F12, 0x00F5, 0x2,
+ 0x6F12, 0x2070, 0x2,
+ 0x6F12, 0xA060, 0x2,
+ 0x6F12, 0x364C, 0x2,
+ 0x6F12, 0x6088, 0x2,
+ 0x6F12, 0x98B9, 0x2,
+ 0x6F12, 0x314D, 0x2,
+ 0x6F12, 0x403D, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xBBFA, 0x2,
+ 0x6F12, 0xA884, 0x2,
+ 0x6F12, 0x2E48, 0x2,
+ 0x6F12, 0x3838, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xB6FA, 0x2,
+ 0x6F12, 0xA98C, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0xE884, 0x2,
+ 0x6F12, 0x2B48, 0x2,
+ 0x6F12, 0x3038, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xAFFA, 0x2,
+ 0x6F12, 0xE98C, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0x2885, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x8AFA, 0x2,
+ 0x6F12, 0x2948, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2E04, 0x2,
+ 0x6F12, 0x90B9, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xA6FA, 0x2,
+ 0x6F12, 0x2849, 0x2,
+ 0x6F12, 0x2648, 0x2,
+ 0x6F12, 0x284A, 0x2,
+ 0x6F12, 0x0A60, 0x2,
+ 0x6F12, 0x2849, 0x2,
+ 0x6F12, 0x0160, 0x2,
+ 0x6F12, 0x011D, 0x2,
+ 0x6F12, 0x2448, 0x2,
+ 0x6F12, 0x274A, 0x2,
+ 0x6F12, 0x001D, 0x2,
+ 0x6F12, 0x0260, 0x2,
+ 0x6F12, 0x2648, 0x2,
+ 0x6F12, 0x0860, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x96FA, 0x2,
+ 0x6F12, 0x2088, 0x2,
+ 0x6F12, 0x244A, 0x2,
+ 0x6F12, 0x98B9, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0xF010, 0x2,
+ 0x6F12, 0x34F8, 0x2,
+ 0x6F12, 0x9C3F, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x1400, 0x2,
+ 0x6F12, 0x01F1, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x1431, 0x2,
+ 0x6F12, 0x0B80, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0x6388, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0xA388, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0x35E0, 0x2,
+ 0x6F12, 0x48E0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xA618, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x9802, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2520, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8520, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xF8C0, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x83A6, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6A80, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8580, 0x2,
+ 0x6F12, 0x200B, 0x2,
+ 0x6F12, 0x8400, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x4DE0, 0x2,
+ 0x6F12, 0x200B, 0x2,
+ 0x6F12, 0x8548, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x960A, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x4DF0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x4B00, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8BA0, 0x2,
+ 0x6F12, 0x2007, 0x2,
+ 0x6F12, 0x03F8, 0x2,
+ 0x6F12, 0x2008, 0x2,
+ 0x6F12, 0x03F8, 0x2,
+ 0x6F12, 0x0FF4, 0x2,
+ 0x6F12, 0x0FF2, 0x2,
+ 0x6F12, 0x0FF8, 0x2,
+ 0x6F12, 0x0FF6, 0x2,
+ 0x6F12, 0x0FFC, 0x2,
+ 0x6F12, 0x0FFA, 0x2,
+ 0x6F12, 0x0FFF, 0x2,
+ 0x6F12, 0x0FFE, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x7FB0, 0x2,
+ 0x6F12, 0xE389, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0x238A, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0x638A, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0xA38B, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0xE38B, 0x2,
+ 0x6F12, 0x0B52, 0x2,
+ 0x6F12, 0x218C, 0x2,
+ 0x6F12, 0x9C3C, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x6088, 0x2,
+ 0x6F12, 0x78B9, 0x2,
+ 0x6F12, 0xB2F8, 0x2,
+ 0x6F12, 0xF800, 0x2,
+ 0x6F12, 0x4FF0, 0x2,
+ 0x6F12, 0x8041, 0x2,
+ 0x6F12, 0x2030, 0x2,
+ 0x6F12, 0x34F8, 0x2,
+ 0x6F12, 0xC62F, 0x2,
+ 0x6F12, 0x0A52, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0x6288, 0x2,
+ 0x6F12, 0x0A52, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x801C, 0x2,
+ 0x6F12, 0xA188, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x9AF8, 0x2,
+ 0x6F12, 0xDA10, 0x2,
+ 0x6F12, 0x5046, 0x2,
+ 0x6F12, 0x0029, 0x2,
+ 0x6F12, 0x0AD1, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x8D12, 0x2,
+ 0x6F12, 0x0029, 0x2,
+ 0x6F12, 0x06D0, 0x2,
+ 0x6F12, 0x9AF8, 0x2,
+ 0x6F12, 0x8E02, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x02D0, 0x2,
+ 0x6F12, 0x3049, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x6F12, 0x05B0, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF08F, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x2D4D, 0x2,
+ 0x6F12, 0x95F8, 0x2,
+ 0x6F12, 0xA802, 0x2,
+ 0x6F12, 0x85F8, 0x2,
+ 0x6F12, 0xBC02, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x2E04, 0x2,
+ 0x6F12, 0x80B9, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x7041, 0x2,
+ 0x6F12, 0x0A46, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0x1A40, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x04FA, 0x2,
+ 0x6F12, 0x2649, 0x2,
+ 0x6F12, 0x4FF6, 0x2,
+ 0x6F12, 0xFF70, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x0F22, 0x2,
+ 0x6F12, 0x1146, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0x1E40, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xFAF9, 0x2,
+ 0x6F12, 0x224E, 0x2,
+ 0x6F12, 0x2348, 0x2,
+ 0x6F12, 0x7488, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0x6008, 0x2,
+ 0x6F12, 0x7080, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xF6F9, 0x2,
+ 0x6F12, 0x2049, 0x2,
+ 0x6F12, 0xA0B2, 0x2,
+ 0x6F12, 0x7080, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0xB5F8, 0x2,
+ 0x6F12, 0xDE12, 0x2,
+ 0x6F12, 0xB1FB, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x6F12, 0x1C49, 0x2,
+ 0x6F12, 0x891E, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x1B4B, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0xF071, 0x2,
+ 0x6F12, 0x1888, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x4181, 0x2,
+ 0x6F12, 0x2022, 0x2,
+ 0x6F12, 0x8281, 0x2,
+ 0x6F12, 0x5888, 0x2,
+ 0x6F12, 0x00F1, 0x2,
+ 0x6F12, 0x8040, 0x2,
+ 0x6F12, 0x4181, 0x2,
+ 0x6F12, 0x8281, 0x2,
+ 0x6F12, 0x1549, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x891C, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x1448, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xDA10, 0x2,
+ 0x6F12, 0x0229, 0x2,
+ 0x6F12, 0x04D3, 0x2,
+ 0x6F12, 0x1249, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x091D, 0x2,
+ 0x6F12, 0x0CE0, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x8D12, 0x2,
+ 0x6F12, 0x0029, 0x2,
+ 0x6F12, 0x09D0, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x8E02, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x05D0, 0x2,
+ 0x6F12, 0x0349, 0x2,
+ 0x6F12, 0x0320, 0x2,
+ 0x6F12, 0x4831, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x091D, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xDE02, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8BA0, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x7C1C, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x4DE0, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2520, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x9604, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x8044, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x970C, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xBA4A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x30B5, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x1ED0, 0x2,
+ 0x6F12, 0x0023, 0x2,
+ 0x6F12, 0x9C4C, 0x2,
+ 0x6F12, 0x6288, 0x2,
+ 0x6F12, 0x6568, 0x2,
+ 0x6F12, 0xC2F1, 0x2,
+ 0x6F12, 0x1F02, 0x2,
+ 0x6F12, 0x9340, 0x2,
+ 0x6F12, 0x1D43, 0x2,
+ 0x6F12, 0x6560, 0x2,
+ 0x6F12, 0x0328, 0x2,
+ 0x6F12, 0x15D0, 0x2,
+ 0x6F12, 0x0023, 0x2,
+ 0x6F12, 0xA568, 0x2,
+ 0x6F12, 0x9340, 0x2,
+ 0x6F12, 0x1D43, 0x2,
+ 0x6F12, 0xA560, 0x2,
+ 0x6F12, 0x0428, 0x2,
+ 0x6F12, 0x0BD1, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x2369, 0x2,
+ 0x6F12, 0x9040, 0x2,
+ 0x6F12, 0x0343, 0x2,
+ 0x6F12, 0xC1F3, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x2361, 0x2,
+ 0x6F12, 0xE168, 0x2,
+ 0x6F12, 0x9040, 0x2,
+ 0x6F12, 0x0143, 0x2,
+ 0x6F12, 0xE160, 0x2,
+ 0x6F12, 0x30BD, 0x2,
+ 0x6F12, 0x0123, 0x2,
+ 0x6F12, 0xDFE7, 0x2,
+ 0x6F12, 0x0123, 0x2,
+ 0x6F12, 0xE8E7, 0x2,
+ 0x6F12, 0x8B48, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0x5C51, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x4160, 0x2,
+ 0x6F12, 0x8160, 0x2,
+ 0x6F12, 0xC160, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x4180, 0x2,
+ 0x6F12, 0x7047, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x854C, 0x2,
+ 0x6F12, 0x6FF0, 0x2,
+ 0x6F12, 0x0F01, 0x2,
+ 0x6F12, 0x6088, 0x2,
+ 0x6F12, 0x01EB, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x6F12, 0x80B2, 0x2,
+ 0x6F12, 0x40F0, 0x2,
+ 0x6F12, 0x0102, 0x2,
+ 0x6F12, 0xC90D, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0x5450, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x63F9, 0x2,
+ 0x6F12, 0x6068, 0x2,
+ 0x6F12, 0x7E4A, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x1180, 0x2,
+ 0x6F12, 0x911E, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0xA068, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x121D, 0x2,
+ 0x6F12, 0x1180, 0x2,
+ 0x6F12, 0x911E, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0xE068, 0x2,
+ 0x6F12, 0x784A, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x0C32, 0x2,
+ 0x6F12, 0x1180, 0x2,
+ 0x6F12, 0x911E, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x2069, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x121F, 0x2,
+ 0x6F12, 0x1180, 0x2,
+ 0x6F12, 0x911E, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x70B5, 0x2,
+ 0x6F12, 0x1D46, 0x2,
+ 0x6F12, 0x704C, 0x2,
+ 0x6F12, 0x1646, 0x2,
+ 0x6F12, 0x0346, 0x2,
+ 0x6F12, 0x0A46, 0x2,
+ 0x6F12, 0x2088, 0x2,
+ 0x6F12, 0x1946, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x49F9, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x97FF, 0x2,
+ 0x6F12, 0x2088, 0x2,
+ 0x6F12, 0x801D, 0x2,
+ 0x6F12, 0x2080, 0x2,
+ 0x6F12, 0x6088, 0x2,
+ 0x6F12, 0x401C, 0x2,
+ 0x6F12, 0x6080, 0x2,
+ 0x6F12, 0x70BD, 0x2,
+ 0x6F12, 0x40EA, 0x2,
+ 0x6F12, 0x0220, 0x2,
+ 0x6F12, 0x0023, 0x2,
+ 0x6F12, 0x80B2, 0x2,
+ 0x6F12, 0x0222, 0x2,
+ 0x6F12, 0xE4E7, 0x2,
+ 0x6F12, 0x0023, 0x2,
+ 0x6F12, 0x40F4, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x6F12, 0x0222, 0x2,
+ 0x6F12, 0xDFE7, 0x2,
+ 0x6F12, 0x0023, 0x2,
+ 0x6F12, 0x40F4, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x6F12, 0x0322, 0x2,
+ 0x6F12, 0x1946, 0x2,
+ 0x6F12, 0xD9E7, 0x2,
+ 0x6F12, 0x1346, 0x2,
+ 0x6F12, 0x40F4, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x6F12, 0x0422, 0x2,
+ 0x6F12, 0xD4E7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x5C4F, 0x2,
+ 0x6F12, 0x5D4B, 0x2,
+ 0x6F12, 0xD7F8, 0x2,
+ 0x6F12, 0x8800, 0x2,
+ 0x6F12, 0x20F0, 0x2,
+ 0x6F12, 0x2005, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0x0424, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0624, 0x2,
+ 0x6F12, 0x584E, 0x2,
+ 0x6F12, 0x96F8, 0x2,
+ 0x6F12, 0x9100, 0x2,
+ 0x6F12, 0x00B1, 0x2,
+ 0x6F12, 0x6400, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x2B00, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x407C, 0x2,
+ 0x6F12, 0xC0F1, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x6F12, 0x4942, 0x2,
+ 0x6F12, 0x0CEB, 0x2,
+ 0x6F12, 0x8101, 0x2,
+ 0x6F12, 0x04EB, 0x2,
+ 0x6F12, 0x8002, 0x2,
+ 0x6F12, 0xB1FB, 0x2,
+ 0x6F12, 0xF2F1, 0x2,
+ 0x6F12, 0xDFF8, 0x2,
+ 0x6F12, 0x4081, 0x2,
+ 0x6F12, 0x88F8, 0x2,
+ 0x6F12, 0x6717, 0x2,
+ 0x6F12, 0x93F8, 0x2,
+ 0x6F12, 0x2A10, 0x2,
+ 0x6F12, 0x09B1, 0x2,
+ 0x6F12, 0x88F8, 0x2,
+ 0x6F12, 0x6717, 0x2,
+ 0x6F12, 0x4C49, 0x2,
+ 0x6F12, 0x9946, 0x2,
+ 0x6F12, 0x91F8, 0x2,
+ 0x6F12, 0x6717, 0x2,
+ 0x6F12, 0x5143, 0x2,
+ 0x6F12, 0x00B9, 0x2,
+ 0x6F12, 0x091D, 0x2,
+ 0x6F12, 0xC81C, 0x2,
+ 0x6F12, 0x4FF6, 0x2,
+ 0x6F12, 0xFC72, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0x464A, 0x2,
+ 0x6F12, 0xE046, 0x2,
+ 0x6F12, 0x4145, 0x2,
+ 0x6F12, 0xA2F8, 0x2,
+ 0x6F12, 0x8A07, 0x2,
+ 0x6F12, 0x06D9, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x2C60, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x4CF9, 0x2,
+ 0x6F12, 0x4149, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x8A87, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x5DFF, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x0C20, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xA9FF, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xD7F8, 0x2,
+ 0x6F12, 0x8810, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xA4FF, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0xA0FF, 0x2,
+ 0x6F12, 0x97F8, 0x2,
+ 0x6F12, 0xAA20, 0x2,
+ 0x6F12, 0x45F0, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x93FF, 0x2,
+ 0x6F12, 0x3548, 0x2,
+ 0x6F12, 0xB0F8, 0x2,
+ 0x6F12, 0x5E07, 0x2,
+ 0x6F12, 0x40F0, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6F12, 0x1820, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x91FF, 0x2,
+ 0x6F12, 0x0021, 0x2,
+ 0x6F12, 0x0C20, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x8DFF, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x1146, 0x2,
+ 0x6F12, 0x1420, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x93FF, 0x2,
+ 0x6F12, 0x4FF4, 0x2,
+ 0x6F12, 0x0061, 0x2,
+ 0x6F12, 0x0820, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x83FF, 0x2,
+ 0x6F12, 0xA0B2, 0x2,
+ 0x6F12, 0x40F4, 0x2,
+ 0x6F12, 0x8031, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x7DFF, 0x2,
+ 0x6F12, 0x45F0, 0x2,
+ 0x6F12, 0x0201, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x78FF, 0x2,
+ 0x6F12, 0x99F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0x4F46, 0x2,
+ 0x6F12, 0x08B1, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0322, 0x2,
+ 0x6F12, 0x0221, 0x2,
+ 0x6F12, 0x1420, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x78FF, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x03E0, 0x2,
+ 0x6F12, 0x1C20, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x6DFF, 0x2,
+ 0x6F12, 0x6D1C, 0x2,
+ 0x6F12, 0xA542, 0x2,
+ 0x6F12, 0xF9D3, 0x2,
+ 0x6F12, 0x97F8, 0x2,
+ 0x6F12, 0x2900, 0x2,
+ 0x6F12, 0x60B9, 0x2,
+ 0x6F12, 0x1548, 0x2,
+ 0x6F12, 0x96F8, 0x2,
+ 0x6F12, 0x9110, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x6F12, 0x09B1, 0x2,
+ 0x6F12, 0x0621, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x0321, 0x2,
+ 0x6F12, 0x0180, 0x2,
+ 0x6F12, 0x1149, 0x2,
+ 0x6F12, 0x0220, 0x2,
+ 0x6F12, 0x1231, 0x2,
+ 0x6F12, 0x0880, 0x2,
+ 0x6F12, 0x0121, 0x2,
+ 0x6F12, 0x0C20, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x51FF, 0x2,
+ 0x6F12, 0xFFF7, 0x2,
+ 0x6F12, 0x0BFF, 0x2,
+ 0x6F12, 0x1048, 0x2,
+ 0x6F12, 0x96F8, 0x2,
+ 0x6F12, 0x9110, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0x6707, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x19B1, 0x2,
+ 0x6F12, 0x4FF6, 0x2,
+ 0x6F12, 0xFF71, 0x2,
+ 0x6F12, 0x01EA, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x97F8, 0x2,
+ 0x6F12, 0x2E10, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x40EA, 0x2,
+ 0x6F12, 0x8102, 0x2,
+ 0x6F12, 0x40F6, 0x2,
+ 0x6F12, 0xFC71, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0x2850, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x66B8, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0xF8D0, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x7D3C, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x10D0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x4730, 0x2,
+ 0x6F12, 0x2001, 0x2,
+ 0x6F12, 0x2480, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6210, 0x2,
+ 0x6F12, 0x4CF2, 0x2,
+ 0x6F12, 0x454C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4CF2, 0x2,
+ 0x6F12, 0xA31C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4CF2, 0x2,
+ 0x6F12, 0xED1C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4CF2, 0x2,
+ 0x6F12, 0x472C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF2, 0x2,
+ 0x6F12, 0xE55C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0xC37C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x47F6, 0x2,
+ 0x6F12, 0xCB7C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF2, 0x2,
+ 0x6F12, 0x855C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x49F2, 0x2,
+ 0x6F12, 0xC92C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x45F6, 0x2,
+ 0x6F12, 0x834C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF6, 0x2,
+ 0x6F12, 0x792C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0x834C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x42F6, 0x2,
+ 0x6F12, 0xDD4C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0xDB1C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0x0F2C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x43F2, 0x2,
+ 0x6F12, 0x551C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4AF6, 0x2,
+ 0x6F12, 0x4D0C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4DF6, 0x2,
+ 0x6F12, 0xB12C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x48F2, 0x2,
+ 0x6F12, 0xCB1C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x42F2, 0x2,
+ 0x6F12, 0x2D4C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x43F6, 0x2,
+ 0x6F12, 0x657C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x0004, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24E8, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x6F12, 0x002C, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x602A, 0x2504, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x24F0, 0x2,
+ 0x6F12, 0x1388, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2482, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x24B8, 0x2,
+ 0x6F12, 0x0404, 0x2,
+ 0x6F12, 0x0404, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x0406, 0x2,
+ 0x6F12, 0x000A, 0x2,
+ 0x6F12, 0x0C0E, 0x2,
+ 0x6F12, 0x0F10, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0410, 0x2,
+ 0x602A, 0x248A, 0x2,
+ 0x6F12, 0x0505, 0x2,
+ 0x6F12, 0x0402, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x6F12, 0x0707, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0504, 0x2,
+ 0x6F12, 0x0301, 0x2,
+ 0x6F12, 0x0406, 0x2,
+ 0x6F12, 0x080A, 0x2,
+ 0x6F12, 0x0C0E, 0x2,
+ 0x6F12, 0x0F10, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x6F12, 0x0707, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0504, 0x2,
+ 0x6F12, 0x0301, 0x2,
+ 0x6F12, 0x0406, 0x2,
+ 0x6F12, 0x080A, 0x2,
+ 0x6F12, 0x0C0E, 0x2,
+ 0x6F12, 0x0F10, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x602A, 0x24E6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x250A, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D10, 0x1388, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x8081, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x475A, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24E6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x5790, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D10, 0x1388, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2B0E, 0x2,
+ 0x6F12, 0x1344, 0x2,
+ 0x602A, 0x2B0C, 0x2,
+ 0x6F12, 0x18C0, 0x2,
+ 0x602A, 0x2B6C, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x0132, 0x2,
+ 0x602A, 0x2B60, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x6F12, 0x0004, 0x2,
+ 0x602A, 0x2B5C, 0x2,
+ 0x6F12, 0x0040, 0x2,
+ 0x6F12, 0x0038, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24F0, 0x2,
+ 0x6F12, 0x1388, 0x2,
+ 0x602A, 0x24B6, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x602A, 0x24B4, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x20F0, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x14CE, 0x2,
+ 0x6F12, 0x00CC, 0x2,
+ 0x602A, 0x1918, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x602A, 0x191C, 0x2,
+ 0x6F12, 0x8091, 0x2,
+ 0x602A, 0x1920, 0x2,
+ 0x6F12, 0x8093, 0x2,
+ 0x602A, 0x1924, 0x2,
+ 0x6F12, 0x80A4, 0x2,
+ 0x602A, 0x1928, 0x2,
+ 0x6F12, 0x80A6, 0x2,
+ 0x602A, 0x192C, 0x2,
+ 0x6F12, 0x80B7, 0x2,
+ 0x602A, 0x1930, 0x2,
+ 0x6F12, 0x82F8, 0x2,
+ 0x602A, 0x1934, 0x2,
+ 0x6F12, 0x8309, 0x2,
+ 0x602A, 0x1938, 0x2,
+ 0x6F12, 0x830B, 0x2,
+ 0x602A, 0x193C, 0x2,
+ 0x6F12, 0x831C, 0x2,
+ 0x602A, 0x1940, 0x2,
+ 0x6F12, 0x831E, 0x2,
+ 0x602A, 0x1944, 0x2,
+ 0x6F12, 0x832F, 0x2,
+ 0x602A, 0x1476, 0x2,
+ 0x6F12, 0x0316, 0x2,
+ 0x602A, 0x1F18, 0x2,
+ 0x6F12, 0x00AE, 0x2,
+ 0x602A, 0x224A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1C28, 0x2,
+ 0x6F12, 0x090F, 0x2,
+ 0x602A, 0x15EA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1C3A, 0x2,
+ 0x6F12, 0x1FE9, 0x2,
+ 0x602A, 0x1C34, 0x2,
+ 0x6F12, 0x4408, 0x2,
+ 0x602A, 0x138A, 0x2,
+ 0x6F12, 0x0046, 0x2,
+ 0x602A, 0x139A, 0x2,
+ 0x6F12, 0x003A, 0x2,
+ 0x602A, 0x13EE, 0x2,
+ 0x6F12, 0x003F, 0x2,
+ 0x602A, 0x1C30, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0280, 0x2,
+ 0x602A, 0x1C2A, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF474, 0x0000, 0x2,
+ 0xF472, 0x0000, 0x2,
+ 0xF41A, 0x0010, 0x2,
+ 0xF446, 0x000E, 0x2,
+ 0xF448, 0x001B, 0x2,
+ 0xF44A, 0x0010, 0x2,
+ 0xF450, 0x0011, 0x2,
+ 0xF452, 0x000E, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0110, 0x1002, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11A4, 0x2,
+ 0x6F12, 0x28C0, 0x2,
+ 0x602A, 0x1118, 0x2,
+ 0x6F12, 0x0040, 0x2,
+ 0x6F12, 0x2140, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0000, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x250E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x5790, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x119E, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FEA, 0x2240, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2676, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x602A, 0x203C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x25A0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2480, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x253C, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x003C, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x003C, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x003C, 0x2,
+ 0x6F12, 0x003C, 0x2,
+ 0x6F12, 0x00C8, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x00C8, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x0032, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x6F12, 0x0019, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x003C, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x6F12, 0x0050, 0x2,
+ 0x6F12, 0x003C, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x6F12, 0x00C8, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x6F12, 0x0032, 0x2,
+ 0x6F12, 0x00C8, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x6F12, 0x0032, 0x2,
+ 0x602A, 0x2526, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0128, 0x2,
+ 0x602A, 0x253A, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x252A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x3662, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x375E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3796, 0x2,
+ 0x6F12, 0x00AD, 0x2,
+ 0x602A, 0x379A, 0x2,
+ 0x6F12, 0x00AD, 0x2,
+ 0x602A, 0x37AA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37AE, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37B2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37B6, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37BA, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37BE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37C2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37C6, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37CA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37CE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37D2, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37D6, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37DA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37DE, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37E2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37E6, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37EA, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37EE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37F2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37F6, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37FA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37FE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3802, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3806, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3816, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x381A, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x381E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3822, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3826, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x382A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x382E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3832, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3836, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x383A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x383E, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3842, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3846, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x384A, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x384E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3852, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3856, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x385A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x385E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3862, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3866, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x386A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x386E, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3872, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x11B4, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x10EA, 0x2,
+ 0x6F12, 0x58C5, 0x2,
+ 0x602A, 0x11F0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x258E, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x4030, 0x2,
+ 0x6F12, 0x2820, 0x2,
+ 0x6F12, 0x1016, 0x2,
+};
+
+/*
+ * [Mode Information]
+ * 0: [MCLK:26,Width:2880,Height:2160,Format:MIPI_RAW10,mipi_lane:4,mipi_datarate:1200,pvi_pclk_inverse:0]
+ */
+const u32 sensor_2x5sp_setfile_A_2880x2160_30fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x1687, 0x2,
+ 0x034A, 0x10E7, 0x2,
+ 0x034C, 0x0B40, 0x2,
+ 0x034E, 0x0870, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x13C8, 0x2,
+ 0x0342, 0x189A, 0x2,
+ 0x0900, 0x0122, 0x2,
+ 0x0902, 0x0001, 0x2,
+ 0x0380, 0x0002, 0x2,
+ 0x0382, 0x0002, 0x2,
+ 0x0384, 0x0002, 0x2,
+ 0x0386, 0x0002, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0400, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0171, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x10B6, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x1C38, 0x2,
+ 0x6F12, 0x004B, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2DF6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2DFA, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x0B08, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x20F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FE0, 0x0000, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x0202, 0x0500, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B00, 0x0038, 0x2,
+ 0x0FE8, 0x28C0, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24FE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x2508, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2500, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x2502, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2516, 0x2,
+ 0x6F12, 0x0311, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x250C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2534, 0x2,
+ 0x6F12, 0x07D0, 0x2,
+ 0x6F12, 0x0BB5, 0x2,
+ 0x6F12, 0x0D47, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11B0, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0xE702, 0x2,
+ 0x602A, 0x11EE, 0x2,
+ 0x6F12, 0xE402, 0x2,
+ 0x602A, 0x10E0, 0x2,
+ 0x6F12, 0x2ED7, 0x2,
+ 0x6F12, 0x2DB4, 0x2,
+ 0x602A, 0x11A0, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x122A, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0002, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1186, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11B2, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11B6, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11BA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF466, 0x07FB, 0x2,
+ 0xF468, 0x2000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE9F0, 0x2,
+};
+
+const u32 sensor_2x5sp_setfiles_A_otp_initial[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0171, 0x2,
+};
+
+const struct sensor_pll_info_compact sensor_2x5sp_pllinfo_A_2880x2160_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1200000000, /* mipi_datarate */
+ 957670000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x13C8, /* frame_length_lines (0x0340) */
+ 0x189A, /* line_length_pck (0x0342) */
+};
+
+static const u32 *sensor_2x5sp_setfiles_A[] = {
+ sensor_2x5sp_setfile_A_2880x2160_30fps,
+};
+
+static const u32 sensor_2x5sp_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_2x5sp_setfile_A_2880x2160_30fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_2x5sp_pllinfos_A[] = {
+ &sensor_2x5sp_pllinfo_A_2880x2160_30fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_2X5SP_SET_B_H
+#define FIMC_IS_CIS_2X5SP_SET_B_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-2x5sp.h"
+
+const u32 sensor_2x5sp_setfile_B_Global[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x0000, 0x0014, 0x2,
+ 0x0000, 0x2185, 0x2,
+ 0x6010, 0x0001, 0x2,
+
+ I2C_MODE_DELAY, 8000, 0x00,
+
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0A02, 0x00FE, 0x2,
+
+ 0x6004, 0x0001, 0x2, /* burst mode indirect */
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2CA8, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D48, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA7FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x2063, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C48, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x6063, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x2B49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2B48, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x9BFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xA063, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A48, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x95FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xE063, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x2949, 0x2,
+ I2C_MODE_BURST_DATA, 0x2948, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x8FFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x2064, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1040, 0x2,
+ I2C_MODE_BURST_DATA, 0xFBF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xBABE, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE857, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x56F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA31, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6C69, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2400, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA7D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCAEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x8625, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCBCB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x7C97, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCCA9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x3BF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCD71, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x22D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCEBD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5C1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xCF2F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0002, 0x2,
+ I2C_MODE_BURST_DATA, 0x13BB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xDBBD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0xEB6F, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xDD3D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0xE7FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE347, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0xEA47, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE3A1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE3A1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE03B, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2480, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE3ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C7D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE40D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0EBD, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE461, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D97, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE6EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0xA945, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xE793, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x09E9, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0xEA60, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF047, 0x2,
+ I2C_MODE_BURST_DATA, 0x3E4F, 0x2,
+ I2C_MODE_BURST_DATA, 0x3D48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xF864, 0x2,
+ I2C_MODE_BURST_DATA, 0x3D48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB862, 0x2,
+ I2C_MODE_BURST_DATA, 0x3D49, 0x2,
+ I2C_MODE_BURST_DATA, 0x3E48, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3D4C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x3D49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2067, 0x2,
+ I2C_MODE_BURST_DATA, 0x3D48, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE066, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C49, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C48, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB7F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C49, 0x2,
+ I2C_MODE_BURST_DATA, 0xA066, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0109, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB495, 0x2,
+ I2C_MODE_BURST_DATA, 0x0025, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A46, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB255, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB055, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAE55, 0x2,
+ I2C_MODE_BURST_DATA, 0x3548, 0x2,
+ I2C_MODE_BURST_DATA, 0x3863, 0x2,
+ I2C_MODE_BURST_DATA, 0x3549, 0x2,
+ I2C_MODE_BURST_DATA, 0x3648, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6066, 0x2,
+ I2C_MODE_BURST_DATA, 0x3148, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x3449, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC55, 0x2,
+ I2C_MODE_BURST_DATA, 0x3348, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x3249, 0x2,
+ I2C_MODE_BURST_DATA, 0x3248, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x93F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x3149, 0x2,
+ I2C_MODE_BURST_DATA, 0x3148, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE065, 0x2,
+ I2C_MODE_BURST_DATA, 0x3048, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xE456, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE485, 0x2,
+ I2C_MODE_BURST_DATA, 0x0620, 0x2,
+ I2C_MODE_BURST_DATA, 0x3080, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E48, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x80F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6065, 0x2,
+ I2C_MODE_BURST_DATA, 0x0320, 0x2,
+ I2C_MODE_BURST_DATA, 0x3080, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x2B49, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C48, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x78F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6061, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C49, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0080, 0x2,
+ I2C_MODE_BURST_DATA, 0x2948, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C00, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A48, 0x2,
+ I2C_MODE_BURST_DATA, 0x2249, 0x2,
+ I2C_MODE_BURST_DATA, 0xB864, 0x2,
+ I2C_MODE_BURST_DATA, 0x2948, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDC05, 0x2,
+ I2C_MODE_BURST_DATA, 0x2949, 0x2,
+ I2C_MODE_BURST_DATA, 0x081A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1F49, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE005, 0x2,
+ I2C_MODE_BURST_DATA, 0x42F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xEB20, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB805, 0x2,
+ I2C_MODE_BURST_DATA, 0x2549, 0x2,
+ I2C_MODE_BURST_DATA, 0x0968, 0x2,
+ I2C_MODE_BURST_DATA, 0x4883, 0x2,
+ I2C_MODE_BURST_DATA, 0x1048, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE255, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE455, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE655, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE895, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF087, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF57, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x56F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x017D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF9B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFCD, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2400, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2CDD, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2CD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x7D09, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8C3, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF3A7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0xD5E5, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF10D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x770F, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xEF39, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x7589, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xEDA7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0xC9D9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6210, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xED9D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x44C3, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xECD5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x7C97, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xEBE1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2480, 0x2,
+ I2C_MODE_BURST_DATA, 0x2005, 0x2,
+ I2C_MODE_BURST_DATA, 0x4C63, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0494, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2400, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x30B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0x83B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0889, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE4C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x807F, 0x2,
+ I2C_MODE_BURST_DATA, 0x03D1, 0x2,
+ I2C_MODE_BURST_DATA, 0xFD48, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1505, 0x2,
+ I2C_MODE_BURST_DATA, 0xC8B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3300, 0x2,
+ I2C_MODE_BURST_DATA, 0x18B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x3B20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3FE, 0x2,
+ I2C_MODE_BURST_DATA, 0xF848, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1505, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFED, 0x2,
+ I2C_MODE_BURST_DATA, 0xF78A, 0x2,
+ I2C_MODE_BURST_DATA, 0x68B3, 0x2,
+ I2C_MODE_BURST_DATA, 0xF748, 0x2,
+ I2C_MODE_BURST_DATA, 0xF749, 0x2,
+ I2C_MODE_BURST_DATA, 0x0823, 0x2,
+ I2C_MODE_BURST_DATA, 0x0068, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6412, 0x2,
+ I2C_MODE_BURST_DATA, 0x4843, 0x2,
+ I2C_MODE_BURST_DATA, 0x020B, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x0521, 0x2,
+ I2C_MODE_BURST_DATA, 0xF348, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xAEFE, 0x2,
+ I2C_MODE_BURST_DATA, 0xEE49, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2015, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0xEF0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2105, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x808A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x010A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x30EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x480A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA80A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x208A, 0x2,
+ I2C_MODE_BURST_DATA, 0x08E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0FE0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x2889, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x288A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x480A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xCFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x480A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x73F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x84F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3300, 0x2,
+ I2C_MODE_BURST_DATA, 0x03B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEC, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0x30BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x1800, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DFB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0446, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C00, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x28FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xCD4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1188, 0x2,
+ I2C_MODE_BURST_DATA, 0x5288, 0x2,
+ I2C_MODE_BURST_DATA, 0x2144, 0x2,
+ I2C_MODE_BURST_DATA, 0x841A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2800, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x24FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2146, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1040, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C00, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1DBB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF35F, 0x2,
+ I2C_MODE_BURST_DATA, 0x8146, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xE1FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x18A3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x41F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x4C1B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0401, 0x2,
+ I2C_MODE_BURST_DATA, 0x5646, 0x2,
+ I2C_MODE_BURST_DATA, 0x11F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B00, 0x2,
+ I2C_MODE_BURST_DATA, 0x78BB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC348, 0x2,
+ I2C_MODE_BURST_DATA, 0x0568, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xEFFD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0228, 0x2,
+ I2C_MODE_BURST_DATA, 0x02D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x05D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x08E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8401, 0x2,
+ I2C_MODE_BURST_DATA, 0xD1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2852, 0x2,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8401, 0x2,
+ I2C_MODE_BURST_DATA, 0xD1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C52, 0x2,
+ I2C_MODE_BURST_DATA, 0xC4EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0411, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4102, 0x2,
+ I2C_MODE_BURST_DATA, 0x09EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC206, 0x2,
+ I2C_MODE_BURST_DATA, 0x331D, 0x2,
+ I2C_MODE_BURST_DATA, 0xB349, 0x2,
+ I2C_MODE_BURST_DATA, 0x0128, 0x2,
+ I2C_MODE_BURST_DATA, 0x0FD9, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F1, 0x2,
+ I2C_MODE_BURST_DATA, 0xF600, 0x2,
+ I2C_MODE_BURST_DATA, 0x0078, 0x2,
+ I2C_MODE_BURST_DATA, 0x58B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0417, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x804C, 0x2,
+ I2C_MODE_BURST_DATA, 0x57F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2100, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6045, 0x2,
+ I2C_MODE_BURST_DATA, 0x06D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x09E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1846, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xCEFD, 0x2,
+ I2C_MODE_BURST_DATA, 0x11E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x19E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x80F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xC2F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1202, 0x2,
+ I2C_MODE_BURST_DATA, 0xD2B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0108, 0x2,
+ I2C_MODE_BURST_DATA, 0xD040, 0x2,
+ I2C_MODE_BURST_DATA, 0x88F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6021, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8102, 0x2,
+ I2C_MODE_BURST_DATA, 0x491C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0429, 0x2,
+ I2C_MODE_BURST_DATA, 0xE2D3, 0x2,
+ I2C_MODE_BURST_DATA, 0xA348, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC400, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8010, 0x2,
+ I2C_MODE_BURST_DATA, 0x301D, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xB7FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x032C, 0x2,
+ I2C_MODE_BURST_DATA, 0xABD3, 0x2,
+ I2C_MODE_BURST_DATA, 0x4846, 0x2,
+ I2C_MODE_BURST_DATA, 0x0199, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xFC5F, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x7047, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF043, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6092, 0x2,
+ I2C_MODE_BURST_DATA, 0x87B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C46, 0x2,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x79D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8F48, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE808, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x74D1, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3082, 0x2,
+ I2C_MODE_BURST_DATA, 0x09F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0406, 0x2,
+ I2C_MODE_BURST_DATA, 0x08F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x1975, 0x2,
+ I2C_MODE_BURST_DATA, 0x3768, 0x2,
+ I2C_MODE_BURST_DATA, 0xE86A, 0x2,
+ I2C_MODE_BURST_DATA, 0x3060, 0x2,
+ I2C_MODE_BURST_DATA, 0x4946, 0x2,
+ I2C_MODE_BURST_DATA, 0x6846, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x8549, 0x2,
+ I2C_MODE_BURST_DATA, 0x6869, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D88, 0x2,
+ I2C_MODE_BURST_DATA, 0x0968, 0x2,
+ I2C_MODE_BURST_DATA, 0x4843, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4543, 0x2,
+ I2C_MODE_BURST_DATA, 0x7F48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9E05, 0x2,
+ I2C_MODE_BURST_DATA, 0x48B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x06F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xB672, 0x2,
+ I2C_MODE_BURST_DATA, 0xD8F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x7C02, 0x2,
+ I2C_MODE_BURST_DATA, 0x1268, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6652, 0x2,
+ I2C_MODE_BURST_DATA, 0x5043, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4543, 0x2,
+ I2C_MODE_BURST_DATA, 0x07B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F46, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x105A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x107A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xC4FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x7148, 0x2,
+ I2C_MODE_BURST_DATA, 0xF7EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2605, 0x2,
+ I2C_MODE_BURST_DATA, 0x30EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFED, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D1A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF77, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x210A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF6EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x001A, 0x2,
+ I2C_MODE_BURST_DATA, 0xEC46, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4003, 0x2,
+ I2C_MODE_BURST_DATA, 0xDA88, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x102A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x610A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1FFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x81F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3946, 0x2,
+ I2C_MODE_BURST_DATA, 0x8845, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CD2, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x102A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x610A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0xD980, 0x2,
+ I2C_MODE_BURST_DATA, 0x0828, 0x2,
+ I2C_MODE_BURST_DATA, 0xDADB, 0x2,
+ I2C_MODE_BURST_DATA, 0x5A48, 0x2,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0010, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4425, 0x2,
+ I2C_MODE_BURST_DATA, 0x6046, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3BFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3560, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3CFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x5A20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x46FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x42FD, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4881, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x48C1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF79, 0x2,
+ I2C_MODE_BURST_DATA, 0xD007, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x6546, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4546, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xD270, 0x2,
+ I2C_MODE_BURST_DATA, 0x4110, 0x2,
+ I2C_MODE_BURST_DATA, 0x09EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x4117, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x8100, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4211, 0x2,
+ I2C_MODE_BURST_DATA, 0x04EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4103, 0x2,
+ I2C_MODE_BURST_DATA, 0x03F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x0403, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0xDE88, 0x2,
+ I2C_MODE_BURST_DATA, 0x25F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1160, 0x2,
+ I2C_MODE_BURST_DATA, 0x05EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4101, 0x2,
+ I2C_MODE_BURST_DATA, 0x9E88, 0x2,
+ I2C_MODE_BURST_DATA, 0x4E80, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E88, 0x2,
+ I2C_MODE_BURST_DATA, 0x8E80, 0x2,
+ I2C_MODE_BURST_DATA, 0x1B88, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0xCB80, 0x2,
+ I2C_MODE_BURST_DATA, 0x0828, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x521C, 0x2,
+ I2C_MODE_BURST_DATA, 0x202A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDADB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x5A20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x12FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0EFD, 0x2,
+ I2C_MODE_BURST_DATA, 0x07B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF043, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFAB9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF047, 0x2,
+ I2C_MODE_BURST_DATA, 0x0646, 0x2,
+ I2C_MODE_BURST_DATA, 0x3648, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F46, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0x1546, 0x2,
+ I2C_MODE_BURST_DATA, 0x806C, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C46, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x1049, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x8046, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x4846, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFFC, 0x2,
+ I2C_MODE_BURST_DATA, 0x2346, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x3946, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xE6F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2348, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x7412, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6C02, 0x2,
+ I2C_MODE_BURST_DATA, 0x4143, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A0B, 0x2,
+ I2C_MODE_BURST_DATA, 0x1DB1, 0x2,
+ I2C_MODE_BURST_DATA, 0x6A43, 0x2,
+ I2C_MODE_BURST_DATA, 0x02F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0062, 0x2,
+ I2C_MODE_BURST_DATA, 0x120B, 0x2,
+ I2C_MODE_BURST_DATA, 0x06F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xABFC, 0x2,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x7CD0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0FC, 0x2,
+ I2C_MODE_BURST_DATA, 0x0228, 0x2,
+ I2C_MODE_BURST_DATA, 0x78D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0026, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x9BFC, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x53D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xCAF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x050A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x85F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0929, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0921, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0939, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2005, 0x2,
+ I2C_MODE_BURST_DATA, 0x092D, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0925, 0x2,
+ I2C_MODE_BURST_DATA, 0x093D, 0x2,
+ I2C_MODE_BURST_DATA, 0x074F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8106, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC001, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0011, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4101, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4601, 0x2,
+ I2C_MODE_BURST_DATA, 0x19E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2480, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x3B80, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8BA0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A36, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C00, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xC43C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7FB0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA498, 0x2,
+ I2C_MODE_BURST_DATA, 0x2008, 0x2,
+ I2C_MODE_BURST_DATA, 0xE000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2008, 0x2,
+ I2C_MODE_BURST_DATA, 0xE800, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2400, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4501, 0x2,
+ I2C_MODE_BURST_DATA, 0x54F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2020, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xEE13, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8003, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A43, 0x2,
+ I2C_MODE_BURST_DATA, 0x120B, 0x2,
+ I2C_MODE_BURST_DATA, 0xC3F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC825, 0x2,
+ I2C_MODE_BURST_DATA, 0x04EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x1369, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B43, 0x2,
+ I2C_MODE_BURST_DATA, 0x190B, 0x2,
+ I2C_MODE_BURST_DATA, 0x1161, 0x2,
+ I2C_MODE_BURST_DATA, 0x0428, 0x2,
+ I2C_MODE_BURST_DATA, 0xC7D3, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x48FC, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x21D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3EE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x76F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFED, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE8A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x288A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x71F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0xF80A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x105A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x5FF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x060A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8EE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x33E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC001, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0011, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4101, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4601, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4501, 0x2,
+ I2C_MODE_BURST_DATA, 0x54F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2020, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2613, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8003, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A43, 0x2,
+ I2C_MODE_BURST_DATA, 0x120B, 0x2,
+ I2C_MODE_BURST_DATA, 0xC3F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB825, 0x2,
+ I2C_MODE_BURST_DATA, 0x04EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x136A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B43, 0x2,
+ I2C_MODE_BURST_DATA, 0x190B, 0x2,
+ I2C_MODE_BURST_DATA, 0x1162, 0x2,
+ I2C_MODE_BURST_DATA, 0x0428, 0x2,
+ I2C_MODE_BURST_DATA, 0xE2D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC001, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0011, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4101, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4601, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4501, 0x2,
+ I2C_MODE_BURST_DATA, 0x54F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2020, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E12, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A43, 0x2,
+ I2C_MODE_BURST_DATA, 0x110B, 0x2,
+ I2C_MODE_BURST_DATA, 0x44F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2010, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0428, 0x2,
+ I2C_MODE_BURST_DATA, 0xEAD3, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEC, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0x4146, 0x2,
+ I2C_MODE_BURST_DATA, 0x4846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF047, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xD8BB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF74F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0446, 0x2,
+ I2C_MODE_BURST_DATA, 0xD348, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0x86B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC06C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDE9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0401, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0x0598, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xC6FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2946, 0x2,
+ I2C_MODE_BURST_DATA, 0x2046, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A9A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x95F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6501, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x7DD0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xCAFB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0228, 0x2,
+ I2C_MODE_BURST_DATA, 0x79D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0026, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xC5FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x30D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xF4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x050A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2003, 0x2,
+ I2C_MODE_BURST_DATA, 0x092B, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0923, 0x2,
+ I2C_MODE_BURST_DATA, 0x093B, 0x2,
+ I2C_MODE_BURST_DATA, 0xDE40, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x85F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x06F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF0C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0928, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0920, 0x2,
+ I2C_MODE_BURST_DATA, 0x0938, 0x2,
+ I2C_MODE_BURST_DATA, 0xC540, 0x2,
+ I2C_MODE_BURST_DATA, 0x05F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDCB2, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDC92, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0xEE46, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8005, 0x2,
+ I2C_MODE_BURST_DATA, 0xA345, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DD1, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC100, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0112, 0x2,
+ I2C_MODE_BURST_DATA, 0x09EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4200, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4500, 0x2,
+ I2C_MODE_BURST_DATA, 0x871D, 0x2,
+ I2C_MODE_BURST_DATA, 0x1030, 0x2,
+ I2C_MODE_BURST_DATA, 0xAF4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x41F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x5826, 0x2,
+ I2C_MODE_BURST_DATA, 0x38E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC3F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFED, 0x2,
+ I2C_MODE_BURST_DATA, 0xA58A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x288A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBEF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x9F0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x105A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xACF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x060A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x9E48, 0x2,
+ I2C_MODE_BURST_DATA, 0xA042, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC100, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0112, 0x2,
+ I2C_MODE_BURST_DATA, 0x09EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4200, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4500, 0x2,
+ I2C_MODE_BURST_DATA, 0x07D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xCB77, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xD070, 0x2,
+ I2C_MODE_BURST_DATA, 0x954A, 0x2,
+ I2C_MODE_BURST_DATA, 0x41F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x6826, 0x2,
+ I2C_MODE_BURST_DATA, 0x05E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE07, 0x2,
+ I2C_MODE_BURST_DATA, 0x924A, 0x2,
+ I2C_MODE_BURST_DATA, 0xD830, 0x2,
+ I2C_MODE_BURST_DATA, 0x41F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x7826, 0x2,
+ I2C_MODE_BURST_DATA, 0x9259, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E1C, 0x2,
+ I2C_MODE_BURST_DATA, 0x37F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x1680, 0x2,
+ I2C_MODE_BURST_DATA, 0x37F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x1370, 0x2,
+ I2C_MODE_BURST_DATA, 0xA8EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0708, 0x2,
+ I2C_MODE_BURST_DATA, 0x08FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3AE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x30F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x1660, 0x2,
+ I2C_MODE_BURST_DATA, 0x30F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x1300, 0x2,
+ I2C_MODE_BURST_DATA, 0x08F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8008, 0x2,
+ I2C_MODE_BURST_DATA, 0x361A, 0x2,
+ I2C_MODE_BURST_DATA, 0x06FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x8036, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2827, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2620, 0x2,
+ I2C_MODE_BURST_DATA, 0xC01B, 0x2,
+ I2C_MODE_BURST_DATA, 0x00FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8030, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2020, 0x2,
+ I2C_MODE_BURST_DATA, 0x4EF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2100, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A9F, 0x2,
+ I2C_MODE_BURST_DATA, 0xB840, 0x2,
+ I2C_MODE_BURST_DATA, 0x4EF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2100, 0x2,
+ I2C_MODE_BURST_DATA, 0x491C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0329, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DD9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0098, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x8074, 0x2,
+ I2C_MODE_BURST_DATA, 0x0003, 0x2,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2168, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0x2060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0198, 0x2,
+ I2C_MODE_BURST_DATA, 0x6168, 0x2,
+ I2C_MODE_BURST_DATA, 0x0003, 0x2,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0x6060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0298, 0x2,
+ I2C_MODE_BURST_DATA, 0xA168, 0x2,
+ I2C_MODE_BURST_DATA, 0x0003, 0x2,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0xA060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0398, 0x2,
+ I2C_MODE_BURST_DATA, 0xE168, 0x2,
+ I2C_MODE_BURST_DATA, 0x0003, 0x2,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0xE060, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDE9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0410, 0x2,
+ I2C_MODE_BURST_DATA, 0x06B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEC, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0x03B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x1646, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x048B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F46, 0x2,
+ I2C_MODE_BURST_DATA, 0x0446, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xFEFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x634A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0x41F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x6823, 0x2,
+ I2C_MODE_BURST_DATA, 0x41F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x5820, 0x2,
+ I2C_MODE_BURST_DATA, 0xD518, 0x2,
+ I2C_MODE_BURST_DATA, 0x1044, 0x2,
+ I2C_MODE_BURST_DATA, 0x0229, 0x2,
+ I2C_MODE_BURST_DATA, 0x52D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x90ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x57FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x408A, 0x2,
+ I2C_MODE_BURST_DATA, 0x95ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FFB, 0x2,
+ I2C_MODE_BURST_DATA, 0x5948, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x408A, 0x2,
+ I2C_MODE_BURST_DATA, 0x90ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x46FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x409A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x480A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x18F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2060, 0x2,
+ I2C_MODE_BURST_DATA, 0x4D48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5205, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB405, 0x2,
+ I2C_MODE_BURST_DATA, 0xD8B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x4948, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB205, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x4748, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5A05, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x480A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4348, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C05, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x888A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x089A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x490A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xEEFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x3060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x680A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x3860, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEC, 0x2,
+ I2C_MODE_BURST_DATA, 0x048B, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF081, 0x2,
+ I2C_MODE_BURST_DATA, 0x0068, 0x2,
+ I2C_MODE_BURST_DATA, 0x2060, 0x2,
+ I2C_MODE_BURST_DATA, 0x2868, 0x2,
+ I2C_MODE_BURST_DATA, 0x3860, 0x2,
+ I2C_MODE_BURST_DATA, 0x2068, 0x2,
+ I2C_MODE_BURST_DATA, 0x3060, 0x2,
+ I2C_MODE_BURST_DATA, 0xF4E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x2,
+ I2C_MODE_BURST_DATA, 0x8346, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x068B, 0x2,
+ I2C_MODE_BURST_DATA, 0xABB0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C46, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xD7FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xF7FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x408A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x408A, 0x2,
+ I2C_MODE_BURST_DATA, 0x29AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2AA9, 0x2,
+ I2C_MODE_BURST_DATA, 0x28A8, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x79FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x290A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2048, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0x406E, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x87B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x060C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x819A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x3946, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x80AA, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x56FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x1648, 0x2,
+ I2C_MODE_BURST_DATA, 0x0025, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC004, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x19D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1748, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC05, 0x2,
+ I2C_MODE_BURST_DATA, 0x40B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x160A, 0x2,
+ I2C_MODE_BURST_DATA, 0x28EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE80A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x03D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB804, 0x2,
+ I2C_MODE_BURST_DATA, 0x40B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B48, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB854, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA54, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0580, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0580, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8C05, 0x2,
+ I2C_MODE_BURST_DATA, 0x17E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3780, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4380, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2400, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0DC, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8BA0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1FC, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA618, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A80, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x2,
+ I2C_MODE_BURST_DATA, 0x3F34, 0x2,
+ I2C_MODE_BURST_DATA, 0xFDF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA40E, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x009A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0128, 0x2,
+ I2C_MODE_BURST_DATA, 0x29D1, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0188, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x68EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x490A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA90A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x11FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x80F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x805F, 0x2,
+ I2C_MODE_BURST_DATA, 0x01DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF70, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C00, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E10, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C21, 0x2,
+ I2C_MODE_BURST_DATA, 0x6846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x54FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xF049, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C00, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1200, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x2146, 0x2,
+ I2C_MODE_BURST_DATA, 0x5846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x48FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x3946, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xE3F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x28EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0820, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x408A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xE248, 0x2,
+ I2C_MODE_BURST_DATA, 0x68EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xE24E, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C05, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0109, 0x2,
+ I2C_MODE_BURST_DATA, 0x20B3, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0052, 0x2,
+ I2C_MODE_BURST_DATA, 0xDF4B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4001, 0x2,
+ I2C_MODE_BURST_DATA, 0x4988, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4001, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x490A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x102A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0222, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0428, 0x2,
+ I2C_MODE_BURST_DATA, 0xE7DB, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1492, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1892, 0x2,
+ I2C_MODE_BURST_DATA, 0xD148, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A02, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1602, 0x2,
+ I2C_MODE_BURST_DATA, 0xE089, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x5BD1, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0670, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0810, 0x2,
+ I2C_MODE_BURST_DATA, 0xCC48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0591, 0x2,
+ I2C_MODE_BURST_DATA, 0xA7EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0108, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xB834, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x976A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x08F3, 0x2,
+ I2C_MODE_BURST_DATA, 0x6420, 0x2,
+ I2C_MODE_BURST_DATA, 0x93FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A18, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xD274, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x6400, 0x2,
+ I2C_MODE_BURST_DATA, 0x491C, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xF5FE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0790, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0010, 0x2,
+ I2C_MODE_BURST_DATA, 0x6420, 0x2,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x08F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x91FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x6400, 0x2,
+ I2C_MODE_BURST_DATA, 0x791E, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xEDFE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0990, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B97, 0x2,
+ I2C_MODE_BURST_DATA, 0x0124, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xB604, 0x2,
+ I2C_MODE_BURST_DATA, 0x0690, 0x2,
+ I2C_MODE_BURST_DATA, 0xB748, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DF1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DF1, 0x2,
+ I2C_MODE_BURST_DATA, 0x9808, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xBE04, 0x2,
+ I2C_MODE_BURST_DATA, 0x0890, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A90, 0x2,
+ I2C_MODE_BURST_DATA, 0xB348, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xBC04, 0x2,
+ I2C_MODE_BURST_DATA, 0x2595, 0x2,
+ I2C_MODE_BURST_DATA, 0x2795, 0x2,
+ I2C_MODE_BURST_DATA, 0x2695, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C90, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AEB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC402, 0x2,
+ I2C_MODE_BURST_DATA, 0x5AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3400, 0x2,
+ I2C_MODE_BURST_DATA, 0xD2E9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0117, 0x2,
+ I2C_MODE_BURST_DATA, 0xD368, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DF1, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C0C, 0x2,
+ I2C_MODE_BURST_DATA, 0x25AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DE8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0411, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xCCFE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0BEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4400, 0x2,
+ I2C_MODE_BURST_DATA, 0x2799, 0x2,
+ I2C_MODE_BURST_DATA, 0x4184, 0x2,
+ I2C_MODE_BURST_DATA, 0x2599, 0x2,
+ I2C_MODE_BURST_DATA, 0x4180, 0x2,
+ I2C_MODE_BURST_DATA, 0x2699, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4210, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F2C, 0x2,
+ I2C_MODE_BURST_DATA, 0x01DA, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6270, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x042C, 0x2,
+ I2C_MODE_BURST_DATA, 0xE0DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB814, 0x2,
+ I2C_MODE_BURST_DATA, 0x9E48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0129, 0x2,
+ I2C_MODE_BURST_DATA, 0x9949, 0x2,
+ I2C_MODE_BURST_DATA, 0x7CD0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0246, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC014, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x7215, 0x2,
+ I2C_MODE_BURST_DATA, 0x9649, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBC14, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1612, 0x2,
+ I2C_MODE_BURST_DATA, 0x9748, 0x2,
+ I2C_MODE_BURST_DATA, 0x9749, 0x2,
+ I2C_MODE_BURST_DATA, 0x964A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8405, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8C15, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9025, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x4100, 0x2,
+ I2C_MODE_BURST_DATA, 0x9249, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x7215, 0x2,
+ I2C_MODE_BURST_DATA, 0xC900, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x8201, 0x2,
+ I2C_MODE_BURST_DATA, 0x0843, 0x2,
+ I2C_MODE_BURST_DATA, 0x8849, 0x2,
+ I2C_MODE_BURST_DATA, 0x1039, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x8948, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4805, 0x2,
+ I2C_MODE_BURST_DATA, 0x68B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x8748, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A51, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A25, 0x2,
+ I2C_MODE_BURST_DATA, 0x8248, 0x2,
+ I2C_MODE_BURST_DATA, 0x001F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0280, 0x2,
+ I2C_MODE_BURST_DATA, 0x8348, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x4C52, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4C35, 0x2,
+ I2C_MODE_BURST_DATA, 0x7E48, 0x2,
+ I2C_MODE_BURST_DATA, 0x801E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0380, 0x2,
+ I2C_MODE_BURST_DATA, 0x7F48, 0x2,
+ I2C_MODE_BURST_DATA, 0x7C4C, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x4E53, 0x2,
+ I2C_MODE_BURST_DATA, 0x083C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4E05, 0x2,
+ I2C_MODE_BURST_DATA, 0x2080, 0x2,
+ I2C_MODE_BURST_DATA, 0x7B48, 0x2,
+ I2C_MODE_BURST_DATA, 0x784F, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA64, 0x2,
+ I2C_MODE_BURST_DATA, 0xBF1F, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5005, 0x2,
+ I2C_MODE_BURST_DATA, 0x3880, 0x2,
+ I2C_MODE_BURST_DATA, 0x1888, 0x2,
+ I2C_MODE_BURST_DATA, 0x794B, 0x2,
+ I2C_MODE_BURST_DATA, 0xA3F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB404, 0x2,
+ I2C_MODE_BURST_DATA, 0x2088, 0x2,
+ I2C_MODE_BURST_DATA, 0xA3F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB604, 0x2,
+ I2C_MODE_BURST_DATA, 0x0888, 0x2,
+ I2C_MODE_BURST_DATA, 0x1946, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB804, 0x2,
+ I2C_MODE_BURST_DATA, 0x1088, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA04, 0x2,
+ I2C_MODE_BURST_DATA, 0x7048, 0x2,
+ I2C_MODE_BURST_DATA, 0x7349, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC204, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6604, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D48, 0x2,
+ I2C_MODE_BURST_DATA, 0x6C49, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3005, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA815, 0x2,
+ I2C_MODE_BURST_DATA, 0xE1B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x6E48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0088, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x6C8A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x080A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x54F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x5FED, 0x2,
+ I2C_MODE_BURST_DATA, 0xAB8A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x490A, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x87B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x6348, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0088, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x6CE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x080A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x3CF9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x490A, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x84B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x5848, 0x2,
+ I2C_MODE_BURST_DATA, 0x001D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0088, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x080A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x28F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x289A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC90A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x10E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4401, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0x4749, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3015, 0x2,
+ I2C_MODE_BURST_DATA, 0x6143, 0x2,
+ I2C_MODE_BURST_DATA, 0x8900, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4449, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xEC05, 0x2,
+ I2C_MODE_BURST_DATA, 0x4949, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x4548, 0x2,
+ I2C_MODE_BURST_DATA, 0x4849, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC804, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x3E48, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C49, 0x2,
+ I2C_MODE_BURST_DATA, 0x0831, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3E05, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x3B48, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A05, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x3948, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3605, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x3648, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3205, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x3448, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4005, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x3148, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C05, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F48, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3805, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C48, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3405, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xDBFD, 0x2,
+ I2C_MODE_BURST_DATA, 0x3149, 0x2,
+ I2C_MODE_BURST_DATA, 0x9239, 0x2,
+ I2C_MODE_BURST_DATA, 0x60B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x2B48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6404, 0x2,
+ I2C_MODE_BURST_DATA, 0x68B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2948, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB404, 0x2,
+ I2C_MODE_BURST_DATA, 0x48B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x38E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x274A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBE14, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x7215, 0x2,
+ I2C_MODE_BURST_DATA, 0x2049, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA14, 0x2,
+ I2C_MODE_BURST_DATA, 0x13E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x214B, 0x2,
+ I2C_MODE_BURST_DATA, 0x234A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1A32, 0x2,
+ I2C_MODE_BURST_DATA, 0x9879, 0x2,
+ I2C_MODE_BURST_DATA, 0x1268, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C00, 0x2,
+ I2C_MODE_BURST_DATA, 0xC240, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6402, 0x2,
+ I2C_MODE_BURST_DATA, 0x5043, 0x2,
+ I2C_MODE_BURST_DATA, 0x194A, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4225, 0x2,
+ I2C_MODE_BURST_DATA, 0x8242, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AD8, 0x2,
+ I2C_MODE_BURST_DATA, 0x164A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC25, 0x2,
+ I2C_MODE_BURST_DATA, 0x32B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1448, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC55, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0053, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D80, 0x2,
+ I2C_MODE_BURST_DATA, 0x0FE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x104A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4425, 0x2,
+ I2C_MODE_BURST_DATA, 0x8242, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AD3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC05, 0x2,
+ I2C_MODE_BURST_DATA, 0x30B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C4A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC95, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0093, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6404, 0x2,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0093, 0x2,
+ I2C_MODE_BURST_DATA, 0x0548, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4605, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x15E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA412, 0x2,
+ I2C_MODE_BURST_DATA, 0x42C8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4E30, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8BA0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A00, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x3B80, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA808, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA692, 0x2,
+ I2C_MODE_BURST_DATA, 0x2BB0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEC, 0x2,
+ I2C_MODE_BURST_DATA, 0x068B, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF08F, 0x2,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x73FD, 0x2,
+ I2C_MODE_BURST_DATA, 0xF648, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3E07, 0x2,
+ I2C_MODE_BURST_DATA, 0x0428, 0x2,
+ I2C_MODE_BURST_DATA, 0x13D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x70FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0228, 0x2,
+ I2C_MODE_BURST_DATA, 0x0ED0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x6FFD, 0x2,
+ I2C_MODE_BURST_DATA, 0xEF49, 0x2,
+ I2C_MODE_BURST_DATA, 0xF048, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8E17, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1040, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x64BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x0646, 0x2,
+ I2C_MODE_BURST_DATA, 0xEA48, 0x2,
+ I2C_MODE_BURST_DATA, 0x8846, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xC06E, 0x2,
+ I2C_MODE_BURST_DATA, 0x87B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x050C, 0x2,
+ I2C_MODE_BURST_DATA, 0x3946, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0xFEF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xD3FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xE349, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA407, 0x2,
+ I2C_MODE_BURST_DATA, 0x4146, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x53FD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0446, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x3946, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0xFEF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xC5FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x062E, 0x2,
+ I2C_MODE_BURST_DATA, 0x07D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x5FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0xC870, 0x2,
+ I2C_MODE_BURST_DATA, 0x02D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x0054, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x8054, 0x2,
+ I2C_MODE_BURST_DATA, 0x2046, 0x2,
+ I2C_MODE_BURST_DATA, 0x24E5, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFB5, 0x2,
+ I2C_MODE_BURST_DATA, 0xD84E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x8047, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D46, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBC33, 0x2,
+ I2C_MODE_BURST_DATA, 0x13B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x51F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2230, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xD44B, 0x2,
+ I2C_MODE_BURST_DATA, 0x1B68, 0x2,
+ I2C_MODE_BURST_DATA, 0x5B00, 0x2,
+ I2C_MODE_BURST_DATA, 0xBB42, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x04E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x83F4, 0x2,
+ I2C_MODE_BURST_DATA, 0xC4F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1204, 0x2,
+ I2C_MODE_BURST_DATA, 0xE4B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2240, 0x2,
+ I2C_MODE_BURST_DATA, 0xE340, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4204, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8044, 0x2,
+ I2C_MODE_BURST_DATA, 0xA4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA30, 0x2,
+ I2C_MODE_BURST_DATA, 0x521C, 0x2,
+ I2C_MODE_BURST_DATA, 0x042A, 0x2,
+ I2C_MODE_BURST_DATA, 0xE1D3, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDE9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0012, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0211, 0x2,
+ I2C_MODE_BURST_DATA, 0x029A, 0x2,
+ I2C_MODE_BURST_DATA, 0x039B, 0x2,
+ I2C_MODE_BURST_DATA, 0x1202, 0x2,
+ I2C_MODE_BURST_DATA, 0x42EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0332, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x1143, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB610, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFBD, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xECA2, 0x2,
+ I2C_MODE_BURST_DATA, 0x87B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC102, 0x2,
+ I2C_MODE_BURST_DATA, 0x20B3, 0x2,
+ I2C_MODE_BURST_DATA, 0xBD48, 0x2,
+ I2C_MODE_BURST_DATA, 0xBD49, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB005, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB205, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5215, 0x2,
+ I2C_MODE_BURST_DATA, 0x0029, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0xB74A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB015, 0x2,
+ I2C_MODE_BURST_DATA, 0x02D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0xB34A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAE15, 0x2,
+ I2C_MODE_BURST_DATA, 0x0BD0, 0x2,
+ I2C_MODE_BURST_DATA, 0x50B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x6640, 0x2,
+ I2C_MODE_BURST_DATA, 0x02F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xB761, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x6540, 0x2,
+ I2C_MODE_BURST_DATA, 0xAD49, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xAD4C, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x02F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E55, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE000, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE870, 0x2,
+ I2C_MODE_BURST_DATA, 0xAB1E, 0x2,
+ I2C_MODE_BURST_DATA, 0x9A1E, 0x2,
+ I2C_MODE_BURST_DATA, 0xA54E, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A65, 0x2,
+ I2C_MODE_BURST_DATA, 0x4682, 0x2,
+ I2C_MODE_BURST_DATA, 0x1688, 0x2,
+ I2C_MODE_BURST_DATA, 0x8682, 0x2,
+ I2C_MODE_BURST_DATA, 0x1688, 0x2,
+ I2C_MODE_BURST_DATA, 0xC682, 0x2,
+ I2C_MODE_BURST_DATA, 0xA04E, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C65, 0x2,
+ I2C_MODE_BURST_DATA, 0x0683, 0x2,
+ I2C_MODE_BURST_DATA, 0x1E88, 0x2,
+ I2C_MODE_BURST_DATA, 0x4683, 0x2,
+ I2C_MODE_BURST_DATA, 0x1E88, 0x2,
+ I2C_MODE_BURST_DATA, 0x8683, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C4E, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E65, 0x2,
+ I2C_MODE_BURST_DATA, 0xC683, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E88, 0x2,
+ I2C_MODE_BURST_DATA, 0x0684, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E88, 0x2,
+ I2C_MODE_BURST_DATA, 0x4684, 0x2,
+ I2C_MODE_BURST_DATA, 0x984E, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2865, 0x2,
+ I2C_MODE_BURST_DATA, 0x0682, 0x2,
+ I2C_MODE_BURST_DATA, 0x491C, 0x2,
+ I2C_MODE_BURST_DATA, 0x3846, 0x2,
+ I2C_MODE_BURST_DATA, 0x0229, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDD3, 0x2,
+ I2C_MODE_BURST_DATA, 0x9749, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x010B, 0x2,
+ I2C_MODE_BURST_DATA, 0x81F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x33B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9649, 0x2,
+ I2C_MODE_BURST_DATA, 0x0888, 0x2,
+ I2C_MODE_BURST_DATA, 0x914A, 0x2,
+ I2C_MODE_BURST_DATA, 0x92F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1425, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x8200, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x9348, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0009, 0x2,
+ I2C_MODE_BURST_DATA, 0x0088, 0x2,
+ I2C_MODE_BURST_DATA, 0x68B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0914, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0490, 0x2,
+ I2C_MODE_BURST_DATA, 0x8F48, 0x2,
+ I2C_MODE_BURST_DATA, 0x8F4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x49F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A05, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0E9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0010, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C90, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDE9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0110, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0208, 0x2,
+ I2C_MODE_BURST_DATA, 0x49F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C07, 0x2,
+ I2C_MODE_BURST_DATA, 0x03A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x0823, 0x2,
+ I2C_MODE_BURST_DATA, 0x0421, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x049A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFEF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x68FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x7ED0, 0x2,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4001, 0x2,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4988, 0x2,
+ I2C_MODE_BURST_DATA, 0x039A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFEF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x59FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x4853, 0x2,
+ I2C_MODE_BURST_DATA, 0x05EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0800, 0x2,
+ I2C_MODE_BURST_DATA, 0x0836, 0x2,
+ I2C_MODE_BURST_DATA, 0x85B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xBD42, 0x2,
+ I2C_MODE_BURST_DATA, 0xE4D9, 0x2,
+ I2C_MODE_BURST_DATA, 0x7448, 0x2,
+ I2C_MODE_BURST_DATA, 0x7C49, 0x2,
+ I2C_MODE_BURST_DATA, 0x0279, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A80, 0x2,
+ I2C_MODE_BURST_DATA, 0x4079, 0x2,
+ I2C_MODE_BURST_DATA, 0x4886, 0x2,
+ I2C_MODE_BURST_DATA, 0x6C48, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0208, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF705, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x7ED0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x5EFC, 0x2,
+ I2C_MODE_BURST_DATA, 0x764A, 0x2,
+ I2C_MODE_BURST_DATA, 0x7449, 0x2,
+ I2C_MODE_BURST_DATA, 0x5068, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF932, 0x2,
+ I2C_MODE_BURST_DATA, 0x80F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD630, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF632, 0x2,
+ I2C_MODE_BURST_DATA, 0x80F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD030, 0x2,
+ I2C_MODE_BURST_DATA, 0x714B, 0x2,
+ I2C_MODE_BURST_DATA, 0x93F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC050, 0x2,
+ I2C_MODE_BURST_DATA, 0x85B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x93F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBF30, 0x2,
+ I2C_MODE_BURST_DATA, 0x6BB1, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xB871, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B88, 0x2,
+ I2C_MODE_BURST_DATA, 0x1B0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x763F, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B78, 0x2,
+ I2C_MODE_BURST_DATA, 0x8370, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B88, 0x2,
+ I2C_MODE_BURST_DATA, 0x1B0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0371, 0x2,
+ I2C_MODE_BURST_DATA, 0xC978, 0x2,
+ I2C_MODE_BURST_DATA, 0x8171, 0x2,
+ I2C_MODE_BURST_DATA, 0x7638, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA25, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDF5F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C21, 0x2,
+ I2C_MODE_BURST_DATA, 0x4170, 0x2,
+ I2C_MODE_BURST_DATA, 0xA523, 0x2,
+ I2C_MODE_BURST_DATA, 0x8370, 0x2,
+ I2C_MODE_BURST_DATA, 0x8021, 0x2,
+ I2C_MODE_BURST_DATA, 0xC170, 0x2,
+ I2C_MODE_BURST_DATA, 0x6049, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4014, 0x2,
+ I2C_MODE_BURST_DATA, 0x4171, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E49, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4114, 0x2,
+ I2C_MODE_BURST_DATA, 0xC171, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C49, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4214, 0x2,
+ I2C_MODE_BURST_DATA, 0x4172, 0x2,
+ I2C_MODE_BURST_DATA, 0x5A49, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4314, 0x2,
+ I2C_MODE_BURST_DATA, 0xC172, 0x2,
+ I2C_MODE_BURST_DATA, 0x5849, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x4446, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4414, 0x2,
+ I2C_MODE_BURST_DATA, 0x090A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4173, 0x2,
+ I2C_MODE_BURST_DATA, 0x7178, 0x2,
+ I2C_MODE_BURST_DATA, 0xC173, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x9AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBD10, 0x2,
+ I2C_MODE_BURST_DATA, 0x1268, 0x2,
+ I2C_MODE_BURST_DATA, 0x3768, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C01, 0x2,
+ I2C_MODE_BURST_DATA, 0xCF40, 0x2,
+ I2C_MODE_BURST_DATA, 0x3F0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x02F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDC7F, 0x2,
+ I2C_MODE_BURST_DATA, 0x3668, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE40, 0x2,
+ I2C_MODE_BURST_DATA, 0x9670, 0x2,
+ I2C_MODE_BURST_DATA, 0x434E, 0x2,
+ I2C_MODE_BURST_DATA, 0x361D, 0x2,
+ I2C_MODE_BURST_DATA, 0x3768, 0x2,
+ I2C_MODE_BURST_DATA, 0xCF40, 0x2,
+ I2C_MODE_BURST_DATA, 0x3F0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1771, 0x2,
+ I2C_MODE_BURST_DATA, 0x3668, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE40, 0x2,
+ I2C_MODE_BURST_DATA, 0x9671, 0x2,
+ I2C_MODE_BURST_DATA, 0x3E4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0836, 0x2,
+ I2C_MODE_BURST_DATA, 0x3768, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x45E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xCF40, 0x2,
+ I2C_MODE_BURST_DATA, 0x3F0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1772, 0x2,
+ I2C_MODE_BURST_DATA, 0x3668, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE40, 0x2,
+ I2C_MODE_BURST_DATA, 0x9672, 0x2,
+ I2C_MODE_BURST_DATA, 0x394E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C36, 0x2,
+ I2C_MODE_BURST_DATA, 0x3768, 0x2,
+ I2C_MODE_BURST_DATA, 0xCF40, 0x2,
+ I2C_MODE_BURST_DATA, 0x3F0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1773, 0x2,
+ I2C_MODE_BURST_DATA, 0x3668, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE40, 0x2,
+ I2C_MODE_BURST_DATA, 0x9673, 0x2,
+ I2C_MODE_BURST_DATA, 0x344A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1032, 0x2,
+ I2C_MODE_BURST_DATA, 0x1668, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE40, 0x2,
+ I2C_MODE_BURST_DATA, 0x360A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA76C, 0x2,
+ I2C_MODE_BURST_DATA, 0x1268, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA40, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA52C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1432, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1DE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1668, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE40, 0x2,
+ I2C_MODE_BURST_DATA, 0x360A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA36C, 0x2,
+ I2C_MODE_BURST_DATA, 0x1268, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA40, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA12C, 0x2,
+ I2C_MODE_BURST_DATA, 0x284A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2032, 0x2,
+ I2C_MODE_BURST_DATA, 0x1268, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA05D, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA40, 0x2,
+ I2C_MODE_BURST_DATA, 0x80F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x8370, 0x2,
+ I2C_MODE_BURST_DATA, 0x3821, 0x2,
+ I2C_MODE_BURST_DATA, 0xC170, 0x2,
+ I2C_MODE_BURST_DATA, 0x5A21, 0x2,
+ I2C_MODE_BURST_DATA, 0x0171, 0x2,
+ I2C_MODE_BURST_DATA, 0x130A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4371, 0x2,
+ I2C_MODE_BURST_DATA, 0x8171, 0x2,
+ I2C_MODE_BURST_DATA, 0xC271, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC4FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2948, 0x2,
+ I2C_MODE_BURST_DATA, 0x184D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0088, 0x2,
+ I2C_MODE_BURST_DATA, 0x423D, 0x2,
+ I2C_MODE_BURST_DATA, 0x28B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x5AE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0xF188, 0x2,
+ I2C_MODE_BURST_DATA, 0x4153, 0x2,
+ I2C_MODE_BURST_DATA, 0x3FE7, 0x2,
+ I2C_MODE_BURST_DATA, 0xFEF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x3FFE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0746, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAFB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2348, 0x2,
+ I2C_MODE_BURST_DATA, 0x214E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0088, 0x2,
+ I2C_MODE_BURST_DATA, 0xB188, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x3081, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x0060, 0x2,
+ I2C_MODE_BURST_DATA, 0x3082, 0x2,
+ I2C_MODE_BURST_DATA, 0x0420, 0x2,
+ I2C_MODE_BURST_DATA, 0x3070, 0x2,
+ I2C_MODE_BURST_DATA, 0x7070, 0x2,
+ I2C_MODE_BURST_DATA, 0xB070, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xAAFB, 0x2,
+ I2C_MODE_BURST_DATA, 0x28B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x032F, 0x2,
+ I2C_MODE_BURST_DATA, 0x06D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x022F, 0x2,
+ I2C_MODE_BURST_DATA, 0x34D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x97B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x39E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0320, 0x2,
+ I2C_MODE_BURST_DATA, 0x3070, 0x2,
+ I2C_MODE_BURST_DATA, 0x36E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x01B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0280, 0x2,
+ I2C_MODE_BURST_DATA, 0x2FE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6210, 0x2,
+ I2C_MODE_BURST_DATA, 0x200B, 0x2,
+ I2C_MODE_BURST_DATA, 0x8442, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2400, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x26F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2AE8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7FB0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2480, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x9802, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0470, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x29E4, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x83A6, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6A80, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8580, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x200B, 0x2,
+ I2C_MODE_BURST_DATA, 0x8548, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x960A, 0x2,
+ I2C_MODE_BURST_DATA, 0x04E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x86F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC94F, 0x2,
+ I2C_MODE_BURST_DATA, 0x3888, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x4050, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9801, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9A01, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x1040, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C01, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x4040, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9E01, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x7040, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8201, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4200, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8210, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4221, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0211, 0x2,
+ I2C_MODE_BURST_DATA, 0x1144, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x7040, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x2070, 0x2,
+ I2C_MODE_BURST_DATA, 0xA860, 0x2,
+ I2C_MODE_BURST_DATA, 0xB74E, 0x2,
+ I2C_MODE_BURST_DATA, 0x7088, 0x2,
+ I2C_MODE_BURST_DATA, 0x90B9, 0x2,
+ I2C_MODE_BURST_DATA, 0xB74D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x41FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xA884, 0x2,
+ I2C_MODE_BURST_DATA, 0xB448, 0x2,
+ I2C_MODE_BURST_DATA, 0x0830, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3CFB, 0x2,
+ I2C_MODE_BURST_DATA, 0xA98C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0xE884, 0x2,
+ I2C_MODE_BURST_DATA, 0xB148, 0x2,
+ I2C_MODE_BURST_DATA, 0x1030, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x35FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xE98C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0x2885, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1FFB, 0x2,
+ I2C_MODE_BURST_DATA, 0x3088, 0x2,
+ I2C_MODE_BURST_DATA, 0x30BB, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF010, 0x2,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C2F, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1400, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x1431, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A80, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x7288, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB288, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0xF289, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x328A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x728A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB28B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0xF28B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x318C, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C3E, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x7088, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B9, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF800, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x2030, 0x2,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC62F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x7288, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A52, 0x2,
+ I2C_MODE_BURST_DATA, 0xB188, 0x2,
+ I2C_MODE_BURST_DATA, 0xC63E, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x9AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDA10, 0x2,
+ I2C_MODE_BURST_DATA, 0x5046, 0x2,
+ I2C_MODE_BURST_DATA, 0x41B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8D12, 0x2,
+ I2C_MODE_BURST_DATA, 0x29B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8E12, 0x2,
+ I2C_MODE_BURST_DATA, 0x11B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x894A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x9AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC102, 0x2,
+ I2C_MODE_BURST_DATA, 0xD046, 0x2,
+ I2C_MODE_BURST_DATA, 0x28B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8748, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB205, 0x2,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x44F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x10F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x3888, 0x2,
+ I2C_MODE_BURST_DATA, 0x844D, 0x2,
+ I2C_MODE_BURST_DATA, 0x78B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x8448, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E23, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDE22, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDC12, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xD2FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0211, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xD2FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3088, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BB, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDC02, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1400, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDE02, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1600, 0x2,
+ I2C_MODE_BURST_DATA, 0xB788, 0x2,
+ I2C_MODE_BURST_DATA, 0x05AA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB11D, 0x2,
+ I2C_MODE_BURST_DATA, 0x02A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC7FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x02A9, 0x2,
+ I2C_MODE_BURST_DATA, 0x6846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC8FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF000, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x0785, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0010, 0x2,
+ I2C_MODE_BURST_DATA, 0x4185, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0210, 0x2,
+ I2C_MODE_BURST_DATA, 0x8185, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0410, 0x2,
+ I2C_MODE_BURST_DATA, 0xC185, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0610, 0x2,
+ I2C_MODE_BURST_DATA, 0x0186, 0x2,
+ I2C_MODE_BURST_DATA, 0x7088, 0x2,
+ I2C_MODE_BURST_DATA, 0x3146, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BB, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xEE02, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1400, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF002, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1600, 0x2,
+ I2C_MODE_BURST_DATA, 0x8F88, 0x2,
+ I2C_MODE_BURST_DATA, 0x05AA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB11D, 0x2,
+ I2C_MODE_BURST_DATA, 0x02A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x02A9, 0x2,
+ I2C_MODE_BURST_DATA, 0x6846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF800, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x0785, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0010, 0x2,
+ I2C_MODE_BURST_DATA, 0x4185, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0210, 0x2,
+ I2C_MODE_BURST_DATA, 0x8185, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0410, 0x2,
+ I2C_MODE_BURST_DATA, 0xC185, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0610, 0x2,
+ I2C_MODE_BURST_DATA, 0x0186, 0x2,
+ I2C_MODE_BURST_DATA, 0x584F, 0x2,
+ I2C_MODE_BURST_DATA, 0x5448, 0x2,
+ I2C_MODE_BURST_DATA, 0x7E88, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB604, 0x2,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x7008, 0x2,
+ I2C_MODE_BURST_DATA, 0x7880, 0x2,
+ I2C_MODE_BURST_DATA, 0x3888, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DF1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D02, 0x2,
+ I2C_MODE_BURST_DATA, 0x03A9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0320, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x86FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x05F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x3775, 0x2,
+ I2C_MODE_BURST_DATA, 0x6946, 0x2,
+ I2C_MODE_BURST_DATA, 0x6B88, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A88, 0x2,
+ I2C_MODE_BURST_DATA, 0x03A8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x83FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0011, 0x2,
+ I2C_MODE_BURST_DATA, 0x6846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x83FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A49, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x7880, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x6988, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A20, 0x2,
+ I2C_MODE_BURST_DATA, 0x891A, 0x2,
+ I2C_MODE_BURST_DATA, 0x91FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0428, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0420, 0x2,
+ I2C_MODE_BURST_DATA, 0x4449, 0x2,
+ I2C_MODE_BURST_DATA, 0x891E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x98F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC102, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x04D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x07B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x2,
+ I2C_MODE_BURST_DATA, 0x44F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9CBA, 0x2,
+ I2C_MODE_BURST_DATA, 0x07B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3E4, 0x2,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x3948, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA812, 0x2,
+ I2C_MODE_BURST_DATA, 0x80F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBC12, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E04, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x7041, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x1A40, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x5DFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3649, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF70, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F22, 0x2,
+ I2C_MODE_BURST_DATA, 0x1146, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x1E40, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x53FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x56FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x44F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x7CFE, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC45, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x53FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0546, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x55FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2549, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD805, 0x2,
+ I2C_MODE_BURST_DATA, 0x44F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x6EFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x49FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2049, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDC05, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x45FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x1D49, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDA05, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xCFFE, 0x2,
+ I2C_MODE_BURST_DATA, 0x204A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0xF071, 0x2,
+ I2C_MODE_BURST_DATA, 0x1088, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x4181, 0x2,
+ I2C_MODE_BURST_DATA, 0x2023, 0x2,
+ I2C_MODE_BURST_DATA, 0x8381, 0x2,
+ I2C_MODE_BURST_DATA, 0x5088, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x4181, 0x2,
+ I2C_MODE_BURST_DATA, 0x8381, 0x2,
+ I2C_MODE_BURST_DATA, 0x1A48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0480, 0x2,
+ I2C_MODE_BURST_DATA, 0x801C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0480, 0x2,
+ I2C_MODE_BURST_DATA, 0x1948, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDA10, 0x2,
+ I2C_MODE_BURST_DATA, 0x0229, 0x2,
+ I2C_MODE_BURST_DATA, 0x04D3, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x0000, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x1749, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x091D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8D12, 0x2,
+ I2C_MODE_BURST_DATA, 0x41B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8E02, 0x2,
+ I2C_MODE_BURST_DATA, 0x28B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0849, 0x2,
+ I2C_MODE_BURST_DATA, 0x0320, 0x2,
+ I2C_MODE_BURST_DATA, 0x4831, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x091D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x1049, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0x8874, 0x2,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B00, 0x2,
+ I2C_MODE_BURST_DATA, 0x200B, 0x2,
+ I2C_MODE_BURST_DATA, 0x8508, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xDE02, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8BA0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x82C2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x9604, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7C1C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8044, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x970C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6210, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6180, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x30B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0228, 0x2,
+ I2C_MODE_BURST_DATA, 0x1ED0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0023, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C4C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6288, 0x2,
+ I2C_MODE_BURST_DATA, 0x6568, 0x2,
+ I2C_MODE_BURST_DATA, 0xC2F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1F02, 0x2,
+ I2C_MODE_BURST_DATA, 0x9340, 0x2,
+ I2C_MODE_BURST_DATA, 0x1D43, 0x2,
+ I2C_MODE_BURST_DATA, 0x6560, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x15D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0023, 0x2,
+ I2C_MODE_BURST_DATA, 0xA568, 0x2,
+ I2C_MODE_BURST_DATA, 0x9340, 0x2,
+ I2C_MODE_BURST_DATA, 0x1D43, 0x2,
+ I2C_MODE_BURST_DATA, 0xA560, 0x2,
+ I2C_MODE_BURST_DATA, 0x0428, 0x2,
+ I2C_MODE_BURST_DATA, 0x0BD1, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ I2C_MODE_BURST_DATA, 0x2369, 0x2,
+ I2C_MODE_BURST_DATA, 0x9040, 0x2,
+ I2C_MODE_BURST_DATA, 0x0343, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F3, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2361, 0x2,
+ I2C_MODE_BURST_DATA, 0xE168, 0x2,
+ I2C_MODE_BURST_DATA, 0x9040, 0x2,
+ I2C_MODE_BURST_DATA, 0x0143, 0x2,
+ I2C_MODE_BURST_DATA, 0xE160, 0x2,
+ I2C_MODE_BURST_DATA, 0x30BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0123, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0123, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x8B48, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C51, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x4160, 0x2,
+ I2C_MODE_BURST_DATA, 0x8160, 0x2,
+ I2C_MODE_BURST_DATA, 0xC160, 0x2,
+ I2C_MODE_BURST_DATA, 0x0161, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x4180, 0x2,
+ I2C_MODE_BURST_DATA, 0x7047, 0x2,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x854C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F01, 0x2,
+ I2C_MODE_BURST_DATA, 0x6088, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0010, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0102, 0x2,
+ I2C_MODE_BURST_DATA, 0xC90D, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x5450, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x6068, 0x2,
+ I2C_MODE_BURST_DATA, 0x7E4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x1180, 0x2,
+ I2C_MODE_BURST_DATA, 0x911E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0xA068, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x121D, 0x2,
+ I2C_MODE_BURST_DATA, 0x1180, 0x2,
+ I2C_MODE_BURST_DATA, 0x911E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0xE068, 0x2,
+ I2C_MODE_BURST_DATA, 0x784A, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C32, 0x2,
+ I2C_MODE_BURST_DATA, 0x1180, 0x2,
+ I2C_MODE_BURST_DATA, 0x911E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x2069, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x121F, 0x2,
+ I2C_MODE_BURST_DATA, 0x1180, 0x2,
+ I2C_MODE_BURST_DATA, 0x911E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x1D46, 0x2,
+ I2C_MODE_BURST_DATA, 0x704C, 0x2,
+ I2C_MODE_BURST_DATA, 0x1646, 0x2,
+ I2C_MODE_BURST_DATA, 0x0346, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x2088, 0x2,
+ I2C_MODE_BURST_DATA, 0x1946, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x94F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2946, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x97FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x2088, 0x2,
+ I2C_MODE_BURST_DATA, 0x801D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2080, 0x2,
+ I2C_MODE_BURST_DATA, 0x6088, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6080, 0x2,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0x0023, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0222, 0x2,
+ I2C_MODE_BURST_DATA, 0xE4E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0023, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F4, 0x2,
+ I2C_MODE_BURST_DATA, 0x0060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0222, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0023, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F4, 0x2,
+ I2C_MODE_BURST_DATA, 0x0060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0322, 0x2,
+ I2C_MODE_BURST_DATA, 0x1946, 0x2,
+ I2C_MODE_BURST_DATA, 0xD9E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x1346, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F4, 0x2,
+ I2C_MODE_BURST_DATA, 0x0060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0422, 0x2,
+ I2C_MODE_BURST_DATA, 0xD4E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF047, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C4F, 0x2,
+ I2C_MODE_BURST_DATA, 0x5D4B, 0x2,
+ I2C_MODE_BURST_DATA, 0xD7F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8800, 0x2,
+ I2C_MODE_BURST_DATA, 0x20F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2005, 0x2,
+ I2C_MODE_BURST_DATA, 0x93F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2900, 0x2,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0424, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0624, 0x2,
+ I2C_MODE_BURST_DATA, 0x584E, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9100, 0x2,
+ I2C_MODE_BURST_DATA, 0x00B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x6400, 0x2,
+ I2C_MODE_BURST_DATA, 0x93F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2B00, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x407C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x4942, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8101, 0x2,
+ I2C_MODE_BURST_DATA, 0x04EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2F1, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4081, 0x2,
+ I2C_MODE_BURST_DATA, 0x88F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6717, 0x2,
+ I2C_MODE_BURST_DATA, 0x93F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A10, 0x2,
+ I2C_MODE_BURST_DATA, 0x09B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x88F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6717, 0x2,
+ I2C_MODE_BURST_DATA, 0x4C49, 0x2,
+ I2C_MODE_BURST_DATA, 0x9946, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6717, 0x2,
+ I2C_MODE_BURST_DATA, 0x5143, 0x2,
+ I2C_MODE_BURST_DATA, 0x00B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x091D, 0x2,
+ I2C_MODE_BURST_DATA, 0xC81C, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFC72, 0x2,
+ I2C_MODE_BURST_DATA, 0x1040, 0x2,
+ I2C_MODE_BURST_DATA, 0x464A, 0x2,
+ I2C_MODE_BURST_DATA, 0xE046, 0x2,
+ I2C_MODE_BURST_DATA, 0x4145, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A07, 0x2,
+ I2C_MODE_BURST_DATA, 0x06D9, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C60, 0x2,
+ I2C_MODE_BURST_DATA, 0xFEF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCFB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4149, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A87, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x5DFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA9FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xD7F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8810, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA4FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x2020, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA20, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x93FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x3548, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E07, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0x1820, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x91FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x1146, 0x2,
+ I2C_MODE_BURST_DATA, 0x1420, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x93FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x0061, 0x2,
+ I2C_MODE_BURST_DATA, 0x0820, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x83FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F4, 0x2,
+ I2C_MODE_BURST_DATA, 0x8031, 0x2,
+ I2C_MODE_BURST_DATA, 0x2020, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x7DFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0201, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x78FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x99F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2900, 0x2,
+ I2C_MODE_BURST_DATA, 0x4F46, 0x2,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0322, 0x2,
+ I2C_MODE_BURST_DATA, 0x0221, 0x2,
+ I2C_MODE_BURST_DATA, 0x1420, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x78FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0025, 0x2,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x6DFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D1C, 0x2,
+ I2C_MODE_BURST_DATA, 0xA542, 0x2,
+ I2C_MODE_BURST_DATA, 0xF9D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2900, 0x2,
+ I2C_MODE_BURST_DATA, 0x60B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x1548, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9110, 0x2,
+ I2C_MODE_BURST_DATA, 0x1430, 0x2,
+ I2C_MODE_BURST_DATA, 0x09B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0621, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0321, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x1149, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0x1231, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x51FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0BFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x1048, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9110, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6707, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x19B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF71, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E10, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x8102, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFC71, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x2850, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2B8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0480, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7D3C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x10D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4730, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2480, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6210, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xDB1C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F2C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xF54C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x215C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x895C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x656C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D6C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F7C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x834C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x756C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x550C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xE55C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xC37C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xCB7C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x855C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D7C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x49F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xC92C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x834C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x792C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x42F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xDD4C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x43F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x551C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x4D0C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xE15C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x657C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x050C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x49F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xC16C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x832C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xB14C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x255C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xCB1C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x42F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D4C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x616C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x874C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x020C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x7F6C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x43F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x657C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0004, 0x2,
+ I2C_MODE_BURST_DATA, 0x0008, 0x2,
+ I2C_MODE_BURST_DATA, 0x0010, 0x2,
+ 0x6028, 0x2005, 0x2,
+ 0x602A, 0x4000, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0246, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x8840, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE12A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8043, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x021A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF6EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x210A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x1080, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9842, 0x2,
+ I2C_MODE_BURST_DATA, 0x02DD, 0x2,
+ I2C_MODE_BURST_DATA, 0x1088, 0x2,
+ I2C_MODE_BURST_DATA, 0x0828, 0x2,
+ I2C_MODE_BURST_DATA, 0xF4D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x8CF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BD, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x85B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xB455, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB445, 0x2,
+ I2C_MODE_BURST_DATA, 0x03AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x04A9, 0x2,
+ I2C_MODE_BURST_DATA, 0x6846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBBF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x34F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0xFA4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x2880, 0x2,
+ I2C_MODE_BURST_DATA, 0xFA4D, 0x2,
+ I2C_MODE_BURST_DATA, 0x3088, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8BB, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0440, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0840, 0x2,
+ I2C_MODE_BURST_DATA, 0xA236, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB088, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B21, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x040A, 0x2,
+ I2C_MODE_BURST_DATA, 0x02A8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF010, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8042, 0x2,
+ I2C_MODE_BURST_DATA, 0x0831, 0x2,
+ I2C_MODE_BURST_DATA, 0x5052, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0x5052, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x708A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B21, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x030A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x95FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xE04B, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF010, 0x2,
+ I2C_MODE_BURST_DATA, 0x5852, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8043, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1002, 0x2,
+ I2C_MODE_BURST_DATA, 0x9852, 0x2,
+ I2C_MODE_BURST_DATA, 0xDB4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x12E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x121D, 0x2,
+ I2C_MODE_BURST_DATA, 0x5052, 0x2,
+ I2C_MODE_BURST_DATA, 0xF089, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0820, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0430, 0x2,
+ I2C_MODE_BURST_DATA, 0x1044, 0x2,
+ I2C_MODE_BURST_DATA, 0x727F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x1A44, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0x3288, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x1043, 0x2,
+ I2C_MODE_BURST_DATA, 0x2631, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0xD14F, 0x2,
+ I2C_MODE_BURST_DATA, 0x3888, 0x2,
+ I2C_MODE_BURST_DATA, 0x18BB, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0440, 0x2,
+ I2C_MODE_BURST_DATA, 0x7988, 0x2,
+ I2C_MODE_BURST_DATA, 0x388B, 0x2,
+ I2C_MODE_BURST_DATA, 0xCF4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0129, 0x2,
+ I2C_MODE_BURST_DATA, 0x02D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0229, 0x2,
+ I2C_MODE_BURST_DATA, 0x7DD0, 0x2,
+ I2C_MODE_BURST_DATA, 0x12E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B21, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x040A, 0x2,
+ I2C_MODE_BURST_DATA, 0x82E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0211, 0x2,
+ I2C_MODE_BURST_DATA, 0x3180, 0x2,
+ I2C_MODE_BURST_DATA, 0xC249, 0x2,
+ I2C_MODE_BURST_DATA, 0x0839, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0xC048, 0x2,
+ I2C_MODE_BURST_DATA, 0x0088, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x63D1, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0440, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0840, 0x2,
+ I2C_MODE_BURST_DATA, 0xB648, 0x2,
+ I2C_MODE_BURST_DATA, 0xB549, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A05, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E15, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0xB049, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x040A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C15, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0x84B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x104A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A21, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x2BFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x35F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE01F, 0x2,
+ I2C_MODE_BURST_DATA, 0x4308, 0x2,
+ I2C_MODE_BURST_DATA, 0x1631, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8042, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x5352, 0x2,
+ I2C_MODE_BURST_DATA, 0x891D, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x8008, 0x2,
+ I2C_MODE_BURST_DATA, 0x5052, 0x2,
+ I2C_MODE_BURST_DATA, 0x891D, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A21, 0x2,
+ I2C_MODE_BURST_DATA, 0x02A8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x030A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x104A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A88, 0x2,
+ I2C_MODE_BURST_DATA, 0x4408, 0x2,
+ I2C_MODE_BURST_DATA, 0x02F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1401, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8043, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C52, 0x2,
+ I2C_MODE_BURST_DATA, 0x891D, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x8008, 0x2,
+ I2C_MODE_BURST_DATA, 0x5852, 0x2,
+ I2C_MODE_BURST_DATA, 0x891D, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0400, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0810, 0x2,
+ I2C_MODE_BURST_DATA, 0x0002, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0110, 0x2,
+ I2C_MODE_BURST_DATA, 0x8B49, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2815, 0x2,
+ I2C_MODE_BURST_DATA, 0x081A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1032, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x05E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x91B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8041, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x05B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B21, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x030A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01A8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xD5FE, 0x2,
+ I2C_MODE_BURST_DATA, 0xB98C, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0420, 0x2,
+ I2C_MODE_BURST_DATA, 0x1144, 0x2,
+ I2C_MODE_BURST_DATA, 0x0904, 0x2,
+ I2C_MODE_BURST_DATA, 0x090C, 0x2,
+ I2C_MODE_BURST_DATA, 0x3FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x73AF, 0x2,
+ I2C_MODE_BURST_DATA, 0x6FE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF05F, 0x2,
+ I2C_MODE_BURST_DATA, 0x1E46, 0x2,
+ I2C_MODE_BURST_DATA, 0x1546, 0x2,
+ I2C_MODE_BURST_DATA, 0x8246, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x7D0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xF7EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x002A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x002A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A4A, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A4B, 0x2,
+ I2C_MODE_BURST_DATA, 0x03F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xC87C, 0x2,
+ I2C_MODE_BURST_DATA, 0x03F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x4877, 0x2,
+ I2C_MODE_BURST_DATA, 0x03F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x9664, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A88, 0x2,
+ I2C_MODE_BURST_DATA, 0x72EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A88, 0x2,
+ I2C_MODE_BURST_DATA, 0xE046, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA01A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x611A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x820A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA146, 0x2,
+ I2C_MODE_BURST_DATA, 0x21EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x213A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x801A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A88, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA03A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x633A, 0x2,
+ I2C_MODE_BURST_DATA, 0x30EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x040A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA33A, 0x2,
+ I2C_MODE_BURST_DATA, 0x82ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x003A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A88, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x102A, 0x2,
+ I2C_MODE_BURST_DATA, 0x6A88, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x433A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA88, 0x2,
+ I2C_MODE_BURST_DATA, 0x21EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x033A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x633A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA33A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x633A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA33A, 0x2,
+ I2C_MODE_BURST_DATA, 0x82ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x003A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A88, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x102A, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA88, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x433A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A89, 0x2,
+ I2C_MODE_BURST_DATA, 0x21EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x033A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x633A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA33A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x633A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA33A, 0x2,
+ I2C_MODE_BURST_DATA, 0x82ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x003A, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA88, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x102A, 0x2,
+ I2C_MODE_BURST_DATA, 0xEA88, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x433A, 0x2,
+ I2C_MODE_BURST_DATA, 0x21EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x031A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x102A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A89, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x433A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x831A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x902A, 0x2,
+ I2C_MODE_BURST_DATA, 0x04EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x611A, 0x2,
+ I2C_MODE_BURST_DATA, 0x6428, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA11A, 0x2,
+ I2C_MODE_BURST_DATA, 0x82ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x001A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8ADB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x9B46, 0x2,
+ I2C_MODE_BURST_DATA, 0x3AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1410, 0x2,
+ I2C_MODE_BURST_DATA, 0xDBED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x5A46, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2888, 0x2,
+ I2C_MODE_BURST_DATA, 0x6AE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0xD7ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x1BD2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8003, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xD3ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x010A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x02D9, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6228, 0x2,
+ I2C_MODE_BURST_DATA, 0xEFDB, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x08EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8000, 0x2,
+ I2C_MODE_BURST_DATA, 0x91EC, 0x2,
+ I2C_MODE_BURST_DATA, 0x021A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x402A, 0x2,
+ I2C_MODE_BURST_DATA, 0x25E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0xD7ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x630A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x40D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8002, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xD2ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x010A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x02D9, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6228, 0x2,
+ I2C_MODE_BURST_DATA, 0xEFDB, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x09EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8000, 0x2,
+ I2C_MODE_BURST_DATA, 0x91EC, 0x2,
+ I2C_MODE_BURST_DATA, 0x021A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x402A, 0x2,
+ I2C_MODE_BURST_DATA, 0x90EC, 0x2,
+ I2C_MODE_BURST_DATA, 0x020A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x35FD, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x13E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B00, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7FB0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x000E, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x9726, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AC0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C23, 0x2,
+ I2C_MODE_BURST_DATA, 0xD70A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2005, 0x2,
+ I2C_MODE_BURST_DATA, 0x4F08, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x46F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2400, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x202C, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x7FAF, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF09F, 0x2,
+ I2C_MODE_BURST_DATA, 0x2889, 0x2,
+ I2C_MODE_BURST_DATA, 0xF5E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF4C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A8B, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x06F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x400B, 0x2,
+ I2C_MODE_BURST_DATA, 0xFD48, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF883, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0009, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE805, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x8057, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x08F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0201, 0x2,
+ I2C_MODE_BURST_DATA, 0x0023, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xF64A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9825, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AB1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A88, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x24F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x022B, 0x2,
+ I2C_MODE_BURST_DATA, 0x2028, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x5B1C, 0x2,
+ I2C_MODE_BURST_DATA, 0x202B, 0x2,
+ I2C_MODE_BURST_DATA, 0xEEDB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xBBF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x44FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x64FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x408A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0xBBF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x3DFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x5DFA, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x40AA, 0x2,
+ I2C_MODE_BURST_DATA, 0xE948, 0x2,
+ I2C_MODE_BURST_DATA, 0xC8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x2ABA, 0x2,
+ I2C_MODE_BURST_DATA, 0x90ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x52FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xE448, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x40AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2030, 0x2,
+ I2C_MODE_BURST_DATA, 0x90ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x48FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xDF48, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x409A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1030, 0x2,
+ I2C_MODE_BURST_DATA, 0x90ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x3EFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A9A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0820, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x29CA, 0x2,
+ I2C_MODE_BURST_DATA, 0x69EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x088A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x680A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBBF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x68EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x090A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x00BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x8246, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x2,
+ I2C_MODE_BURST_DATA, 0x8BEE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBBF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x02FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xCE49, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C15, 0x2,
+ I2C_MODE_BURST_DATA, 0x01B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x3846, 0x2,
+ I2C_MODE_BURST_DATA, 0xCB49, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA815, 0x2,
+ I2C_MODE_BURST_DATA, 0x49B1, 0x2,
+ I2C_MODE_BURST_DATA, 0xC949, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3015, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A02, 0x2,
+ I2C_MODE_BURST_DATA, 0xC749, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xEC15, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x8061, 0x2,
+ I2C_MODE_BURST_DATA, 0xC34A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xEA15, 0x2,
+ I2C_MODE_BURST_DATA, 0x1146, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xEA15, 0x2,
+ I2C_MODE_BURST_DATA, 0x4143, 0x2,
+ I2C_MODE_BURST_DATA, 0x8D0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBF48, 0x2,
+ I2C_MODE_BURST_DATA, 0xAAB2, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF5, 0x2,
+ I2C_MODE_BURST_DATA, 0x807F, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE025, 0x2,
+ I2C_MODE_BURST_DATA, 0x33D0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9805, 0x2,
+ I2C_MODE_BURST_DATA, 0x0128, 0x2,
+ I2C_MODE_BURST_DATA, 0x3ED0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6605, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFED, 0x2,
+ I2C_MODE_BURST_DATA, 0xB91A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB548, 0x2,
+ I2C_MODE_BURST_DATA, 0xB54B, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x212A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6805, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DF1, 0x2,
+ I2C_MODE_BURST_DATA, 0x9808, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB048, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9A05, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x218A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0xB19A, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4001, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E15, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x08EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x090A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xEEDB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4EE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x24F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x022B, 0x2,
+ I2C_MODE_BURST_DATA, 0x2028, 0x2,
+ I2C_MODE_BURST_DATA, 0xFADB, 0x2,
+ I2C_MODE_BURST_DATA, 0x491C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2029, 0x2,
+ I2C_MODE_BURST_DATA, 0xF6DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x33B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEC, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A8B, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF08F, 0x2,
+ I2C_MODE_BURST_DATA, 0x08F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0201, 0x2,
+ I2C_MODE_BURST_DATA, 0x0023, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x984A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9425, 0x2,
+ I2C_MODE_BURST_DATA, 0x012A, 0x2,
+ I2C_MODE_BURST_DATA, 0x17D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1070, 0x2,
+ I2C_MODE_BURST_DATA, 0xB7EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A0F, 0x2,
+ I2C_MODE_BURST_DATA, 0x12D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A88, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA42, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x24F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x022B, 0x2,
+ I2C_MODE_BURST_DATA, 0x2028, 0x2,
+ I2C_MODE_BURST_DATA, 0xEBDB, 0x2,
+ I2C_MODE_BURST_DATA, 0x5B1C, 0x2,
+ I2C_MODE_BURST_DATA, 0x202B, 0x2,
+ I2C_MODE_BURST_DATA, 0xE7DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x05E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x8C49, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE895, 0x2,
+ I2C_MODE_BURST_DATA, 0xD9E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A88, 0x2,
+ I2C_MODE_BURST_DATA, 0xEEE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x8948, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9E05, 0x2,
+ I2C_MODE_BURST_DATA, 0x60B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8BEE, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2CEE, 0x2,
+ I2C_MODE_BURST_DATA, 0x2B0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xCBEE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x270A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x26BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0BE0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB7EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x280A, 0x2,
+ I2C_MODE_BURST_DATA, 0x2AEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA90A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x270A, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x268A, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DF1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8C0C, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x003A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE205, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x7DD0, 0x2,
+ I2C_MODE_BURST_DATA, 0x7648, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6405, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x770A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x801A, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4001, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xE252, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE215, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x439A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x890A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x901A, 0x2,
+ I2C_MODE_BURST_DATA, 0x08EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x602A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC2EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x090A, 0x2,
+ I2C_MODE_BURST_DATA, 0x91ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x002A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x70EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC20A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x81ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x099A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE90A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1180, 0x2,
+ I2C_MODE_BURST_DATA, 0xD5DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x5B48, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x439A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9605, 0x2,
+ I2C_MODE_BURST_DATA, 0x68EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x298A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x210A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE80A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x05DD, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x218A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4F48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6A05, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFED, 0x2,
+ I2C_MODE_BURST_DATA, 0x53AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x7ED0, 0x2,
+ I2C_MODE_BURST_DATA, 0x22EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA1A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x230A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x692A, 0x2,
+ I2C_MODE_BURST_DATA, 0x81EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x020A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8AEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA00A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA400, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC01A, 0x2,
+ I2C_MODE_BURST_DATA, 0x11EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA600, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x242A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8AEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA21A, 0x2,
+ I2C_MODE_BURST_DATA, 0x30EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x010A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x020A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC10A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA800, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9EE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA00, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x250A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8AEE, 0x2,
+ I2C_MODE_BURST_DATA, 0x803A, 0x2,
+ I2C_MODE_BURST_DATA, 0x31EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x031A, 0x2,
+ I2C_MODE_BURST_DATA, 0x21EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x021A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC11A, 0x2,
+ I2C_MODE_BURST_DATA, 0x11EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC00, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA005, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x30EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC01A, 0x2,
+ I2C_MODE_BURST_DATA, 0x21EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x211A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x421A, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x891A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE10A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2448, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8E05, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x421A, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x891A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE10A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8200, 0x2,
+ I2C_MODE_BURST_DATA, 0x1A48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9005, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x421A, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x891A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE10A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8400, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9205, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x61E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x83E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x421A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x092A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x891A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC10A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8600, 0x2,
+ I2C_MODE_BURST_DATA, 0x12E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x9C8C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7CFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4E50, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA638, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A80, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x42C8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x3B80, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4580, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC20A, 0x2,
+ I2C_MODE_BURST_DATA, 0x6B46, 0x2,
+ I2C_MODE_BURST_DATA, 0x20AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x29A9, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8800, 0x2,
+ I2C_MODE_BURST_DATA, 0x5846, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0FC, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8005, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x28EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x231A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x010A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xA90A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xB842, 0x2,
+ I2C_MODE_BURST_DATA, 0x43D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x40E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x08EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x439A, 0x2,
+ I2C_MODE_BURST_DATA, 0x91ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8001, 0x2,
+ I2C_MODE_BURST_DATA, 0x03EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4002, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x099A, 0x2,
+ I2C_MODE_BURST_DATA, 0x81ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE90A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE215, 0x2,
+ I2C_MODE_BURST_DATA, 0xE8DB, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFE6, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x421A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x891A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC10A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8000, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x420A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8200, 0x2,
+ I2C_MODE_BURST_DATA, 0x42EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x890A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x30E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x092A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC20A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8400, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8600, 0x2,
+ I2C_MODE_BURST_DATA, 0xA3E7, 0x2,
+ I2C_MODE_BURST_DATA, 0xD64A, 0x2,
+ I2C_MODE_BURST_DATA, 0x6B46, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A01, 0x2,
+ I2C_MODE_BURST_DATA, 0xA5E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x3846, 0x2,
+ I2C_MODE_BURST_DATA, 0xCAEE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x290A, 0x2,
+ I2C_MODE_BURST_DATA, 0x8146, 0x2,
+ I2C_MODE_BURST_DATA, 0xBB46, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E90, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x28EE, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F90, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDE9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C07, 0x2,
+ I2C_MODE_BURST_DATA, 0x13E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC448, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8295, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8405, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E90, 0x2,
+ I2C_MODE_BURST_DATA, 0xC148, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x86B5, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8805, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F90, 0x2,
+ I2C_MODE_BURST_DATA, 0xBE48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A05, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C90, 0x2,
+ I2C_MODE_BURST_DATA, 0xBC48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8C05, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D90, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6805, 0x2,
+ I2C_MODE_BURST_DATA, 0xC102, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x230A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x090A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x801A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC10A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x82B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xB148, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA405, 0x2,
+ I2C_MODE_BURST_DATA, 0x8242, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AD8, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x901A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x801A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC10A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x3090, 0x2,
+ I2C_MODE_BURST_DATA, 0xA848, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA615, 0x2,
+ I2C_MODE_BURST_DATA, 0x3098, 0x2,
+ I2C_MODE_BURST_DATA, 0x8142, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0008, 0x2,
+ I2C_MODE_BURST_DATA, 0x3191, 0x2,
+ I2C_MODE_BURST_DATA, 0xA348, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xA205, 0x2,
+ I2C_MODE_BURST_DATA, 0x50B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x109A, 0x2,
+ I2C_MODE_BURST_DATA, 0x5DF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2800, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x408A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x201A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x230A, 0x2,
+ I2C_MODE_BURST_DATA, 0x61EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x090A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x89BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x90BA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x60AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x61EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x80CA, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x5DF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2800, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x109A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x010A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x230A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x890A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x901A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8B4F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0EDA, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x909A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x898A, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x6A8A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0099, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F9A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0xDDED, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E0A, 0x2,
+ I2C_MODE_BURST_DATA, 0x081A, 0x2,
+ I2C_MODE_BURST_DATA, 0x3099, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4143, 0x2,
+ I2C_MODE_BURST_DATA, 0xA2EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x9121, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0x20EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x09BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BA, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x40AA, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0x3199, 0x2,
+ I2C_MODE_BURST_DATA, 0x4843, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C99, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x40CA, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x9020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0027, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x40CA, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x40BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x38EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x290A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC08A, 0x2,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1700, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x18EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x901A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x402A, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x8842, 0x2,
+ I2C_MODE_BURST_DATA, 0x10D9, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x423A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x6B2A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x4C2A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x6C1A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A1A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B0A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x480A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x09E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x6C1A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9FED, 0x2,
+ I2C_MODE_BURST_DATA, 0x530A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x480A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xBCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0004, 0x2,
+ I2C_MODE_BURST_DATA, 0x0109, 0x2,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1700, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x5001, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x803F, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF70, 0x2,
+ I2C_MODE_BURST_DATA, 0x4549, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2080, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9415, 0x2,
+ I2C_MODE_BURST_DATA, 0x0129, 0x2,
+ I2C_MODE_BURST_DATA, 0x08D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1720, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A0F, 0x2,
+ I2C_MODE_BURST_DATA, 0x03D3, 0x2,
+ I2C_MODE_BURST_DATA, 0xA842, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0x2080, 0x2,
+ I2C_MODE_BURST_DATA, 0xA41C, 0x2,
+ I2C_MODE_BURST_DATA, 0x7F1C, 0x2,
+ I2C_MODE_BURST_DATA, 0x202F, 0x2,
+ I2C_MODE_BURST_DATA, 0xB4DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x08F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0108, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x200F, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x29AF, 0x2,
+ I2C_MODE_BURST_DATA, 0x1CE5, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF84F, 0x2,
+ I2C_MODE_BURST_DATA, 0x3949, 0x2,
+ I2C_MODE_BURST_DATA, 0x8146, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0xC900, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xA160, 0x2,
+ I2C_MODE_BURST_DATA, 0x0090, 0x2,
+ I2C_MODE_BURST_DATA, 0x09EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4900, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8000, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x1234, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0775, 0x2,
+ I2C_MODE_BURST_DATA, 0xB431, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F5, 0x2,
+ I2C_MODE_BURST_DATA, 0xA86B, 0x2,
+ I2C_MODE_BURST_DATA, 0xC88A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0988, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0A0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0108, 0x2,
+ I2C_MODE_BURST_DATA, 0x0026, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AEB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8601, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4900, 0x2,
+ I2C_MODE_BURST_DATA, 0x2978, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xD673, 0x2,
+ I2C_MODE_BURST_DATA, 0x2029, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CD0, 0x2,
+ I2C_MODE_BURST_DATA, 0x5B46, 0x2,
+ I2C_MODE_BURST_DATA, 0x3846, 0x2,
+ I2C_MODE_BURST_DATA, 0x009A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x761C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D1C, 0x2,
+ I2C_MODE_BURST_DATA, 0x24F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x020B, 0x2,
+ I2C_MODE_BURST_DATA, 0xF62E, 0x2,
+ I2C_MODE_BURST_DATA, 0xEBD3, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF88F, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0801, 0x2,
+ I2C_MODE_BURST_DATA, 0x2348, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3DF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2870, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0x5B46, 0x2,
+ I2C_MODE_BURST_DATA, 0x3846, 0x2,
+ I2C_MODE_BURST_DATA, 0x009A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x31F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x4044, 0x2,
+ I2C_MODE_BURST_DATA, 0xE9E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x1A4C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x2,
+ I2C_MODE_BURST_DATA, 0xB634, 0x2,
+ I2C_MODE_BURST_DATA, 0x0646, 0x2,
+ I2C_MODE_BURST_DATA, 0x2278, 0x2,
+ I2C_MODE_BURST_DATA, 0xA178, 0x2,
+ I2C_MODE_BURST_DATA, 0x1848, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2FF9, 0x2,
+ I2C_MODE_BURST_DATA, 0xA178, 0x2,
+ I2C_MODE_BURST_DATA, 0x2078, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3FF, 0x2,
+ I2C_MODE_BURST_DATA, 0x2946, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0x7040, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2AB9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF04F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DED, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0x87B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x27F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C80, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C90, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x806B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0290, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x22F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0390, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x23F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0490, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x8060, 0x2,
+ I2C_MODE_BURST_DATA, 0x401E, 0x2,
+ I2C_MODE_BURST_DATA, 0x10E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2520, 0x2,
+ I2C_MODE_BURST_DATA, 0x2001, 0x2,
+ I2C_MODE_BURST_DATA, 0x2A96, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8580, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x1368, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x878C, 0x2,
+ I2C_MODE_BURST_DATA, 0x2008, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2007, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB9F7, 0x2,
+ I2C_MODE_BURST_DATA, 0x5EFE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0398, 0x2,
+ I2C_MODE_BURST_DATA, 0x6A4E, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x8050, 0x2,
+ I2C_MODE_BURST_DATA, 0x401E, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0027, 0x2,
+ I2C_MODE_BURST_DATA, 0x3D46, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0xEA46, 0x2,
+ I2C_MODE_BURST_DATA, 0x80EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x808A, 0x2,
+ I2C_MODE_BURST_DATA, 0x281D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C46, 0x2,
+ I2C_MODE_BURST_DATA, 0x0590, 0x2,
+ I2C_MODE_BURST_DATA, 0x2CE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x6248, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3802, 0x2,
+ I2C_MODE_BURST_DATA, 0xA042, 0x2,
+ I2C_MODE_BURST_DATA, 0x03D9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0299, 0x2,
+ I2C_MODE_BURST_DATA, 0x04FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x16E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0498, 0x2,
+ I2C_MODE_BURST_DATA, 0x201A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB9F7, 0x2,
+ I2C_MODE_BURST_DATA, 0x3BFE, 0x2,
+ I2C_MODE_BURST_DATA, 0x0398, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x40EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x080A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x30EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x800A, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xC00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x621B, 0x2,
+ I2C_MODE_BURST_DATA, 0x611B, 0x2,
+ I2C_MODE_BURST_DATA, 0x2AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1200, 0x2,
+ I2C_MODE_BURST_DATA, 0x3AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1100, 0x2,
+ I2C_MODE_BURST_DATA, 0xC119, 0x2,
+ I2C_MODE_BURST_DATA, 0x4908, 0x2,
+ I2C_MODE_BURST_DATA, 0x26F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x021B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0746, 0x2,
+ I2C_MODE_BURST_DATA, 0x0598, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x8442, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C45, 0x2,
+ I2C_MODE_BURST_DATA, 0xCED3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0098, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D1D, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3041, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x041B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0198, 0x2,
+ I2C_MODE_BURST_DATA, 0x5D45, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3041, 0x2,
+ I2C_MODE_BURST_DATA, 0x49F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x041B, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDD3, 0x2,
+ I2C_MODE_BURST_DATA, 0x7F1E, 0x2,
+ I2C_MODE_BURST_DATA, 0x3780, 0x2,
+ I2C_MODE_BURST_DATA, 0x4148, 0x2,
+ I2C_MODE_BURST_DATA, 0x0390, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0x424C, 0x2,
+ I2C_MODE_BURST_DATA, 0x424D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0290, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA7F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1FFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x80FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA3F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8004, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x1049, 0x2,
+ I2C_MODE_BURST_DATA, 0xCBF5, 0x2,
+ I2C_MODE_BURST_DATA, 0x8050, 0x2,
+ I2C_MODE_BURST_DATA, 0x401E, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC9F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x8040, 0x2,
+ I2C_MODE_BURST_DATA, 0x401E, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x400A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0026, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x805C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x60EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x100A, 0x2,
+ I2C_MODE_BURST_DATA, 0x3346, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0x81EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x200A, 0x2,
+ I2C_MODE_BURST_DATA, 0x1946, 0x2,
+ I2C_MODE_BURST_DATA, 0x03F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x040E, 0x2,
+ I2C_MODE_BURST_DATA, 0x41E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D48, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A02, 0x2,
+ I2C_MODE_BURST_DATA, 0x8842, 0x2,
+ I2C_MODE_BURST_DATA, 0x04D9, 0x2,
+ I2C_MODE_BURST_DATA, 0x029F, 0x2,
+ I2C_MODE_BURST_DATA, 0x01FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x07F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A30, 0x2,
+ I2C_MODE_BURST_DATA, 0x14E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B00, 0x2,
+ I2C_MODE_BURST_DATA, 0x4043, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x601A, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x909A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x600A, 0x2,
+ I2C_MODE_BURST_DATA, 0x41EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x041A, 0x2,
+ I2C_MODE_BURST_DATA, 0x70EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x810A, 0x2,
+ I2C_MODE_BURST_DATA, 0xFCEE, 0x2,
+ I2C_MODE_BURST_DATA, 0xE00A, 0x2,
+ I2C_MODE_BURST_DATA, 0x10EE, 0x2,
+ I2C_MODE_BURST_DATA, 0x900A, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xD1B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x6FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0107, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0217, 0x2,
+ I2C_MODE_BURST_DATA, 0x8742, 0x2,
+ I2C_MODE_BURST_DATA, 0x05DB, 0x2,
+ I2C_MODE_BURST_DATA, 0x6FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E07, 0x2,
+ I2C_MODE_BURST_DATA, 0x07EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0217, 0x2,
+ I2C_MODE_BURST_DATA, 0x8742, 0x2,
+ I2C_MODE_BURST_DATA, 0x01DD, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x02E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB042, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0x039F, 0x2,
+ I2C_MODE_BURST_DATA, 0x37F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1270, 0x2,
+ I2C_MODE_BURST_DATA, 0x8F42, 0x2,
+ I2C_MODE_BURST_DATA, 0x04D1, 0x2,
+ I2C_MODE_BURST_DATA, 0xC6EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4210, 0x2,
+ I2C_MODE_BURST_DATA, 0x521C, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x92B2, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0308, 0x2,
+ I2C_MODE_BURST_DATA, 0x0646, 0x2,
+ I2C_MODE_BURST_DATA, 0x2AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1800, 0x2,
+ I2C_MODE_BURST_DATA, 0x491C, 0x2,
+ I2C_MODE_BURST_DATA, 0x7145, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x6145, 0x2,
+ I2C_MODE_BURST_DATA, 0xB9D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0098, 0x2,
+ I2C_MODE_BURST_DATA, 0x1B1D, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3040, 0x2,
+ I2C_MODE_BURST_DATA, 0x01C4, 0x2,
+ I2C_MODE_BURST_DATA, 0x0198, 0x2,
+ I2C_MODE_BURST_DATA, 0x6345, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3040, 0x2,
+ I2C_MODE_BURST_DATA, 0x01C5, 0x2,
+ I2C_MODE_BURST_DATA, 0xAAD3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2CF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x07B0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDEC, 0x2,
+ I2C_MODE_BURST_DATA, 0x028B, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF08F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2005, 0x2,
+ I2C_MODE_BURST_DATA, 0x5548, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x8BA0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2007, 0x2,
+ I2C_MODE_BURST_DATA, 0x8000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2007, 0x2,
+ I2C_MODE_BURST_DATA, 0x6000, 0x2,
+ I2C_MODE_BURST_DATA, 0x4CF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x891C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4CF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xC50C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4EF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x7D4C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4EF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x176C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4EF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xD36C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D4C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x020C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4DF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xB12C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D2C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x652C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24E8, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x002C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0068, 0x2,
+ 0x602A, 0x2504, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x24F0, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x1388, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ 0x602A, 0x2482, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ 0x602A, 0x24B8, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0404, 0x2,
+ I2C_MODE_BURST_DATA, 0x0404, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0406, 0x2,
+ I2C_MODE_BURST_DATA, 0x000A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C0E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F10, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ I2C_MODE_BURST_DATA, 0x0410, 0x2,
+ 0x602A, 0x248A, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ I2C_MODE_BURST_DATA, 0x0402, 0x2,
+ I2C_MODE_BURST_DATA, 0x0008, 0x2,
+ I2C_MODE_BURST_DATA, 0x0707, 0x2,
+ I2C_MODE_BURST_DATA, 0x0606, 0x2,
+ I2C_MODE_BURST_DATA, 0x0504, 0x2,
+ I2C_MODE_BURST_DATA, 0x0301, 0x2,
+ I2C_MODE_BURST_DATA, 0x0406, 0x2,
+ I2C_MODE_BURST_DATA, 0x080A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C0E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F10, 0x2,
+ I2C_MODE_BURST_DATA, 0x0008, 0x2,
+ I2C_MODE_BURST_DATA, 0x0707, 0x2,
+ I2C_MODE_BURST_DATA, 0x0606, 0x2,
+ I2C_MODE_BURST_DATA, 0x0504, 0x2,
+ I2C_MODE_BURST_DATA, 0x0301, 0x2,
+ I2C_MODE_BURST_DATA, 0x0406, 0x2,
+ I2C_MODE_BURST_DATA, 0x080A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C0E, 0x2,
+ I2C_MODE_BURST_DATA, 0x0F10, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D0, 0x2,
+ 0x602A, 0x250A, 0x2,
+ 0x6F12, 0x8001, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x8081, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A46, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x475A, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24E6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x5790, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D10, 0x1388, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2B0E, 0x2,
+ 0x6F12, 0x1344, 0x2,
+ 0x602A, 0x2B0C, 0x2,
+ 0x6F12, 0x18C0, 0x2,
+ 0x602A, 0x2B6C, 0x2,
+ 0x6F12, 0x0120, 0x2,
+ 0x6F12, 0x0132, 0x2,
+ 0x602A, 0x2B60, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x6F12, 0x0004, 0x2,
+ 0x602A, 0x2B5C, 0x2,
+ 0x6F12, 0x0040, 0x2,
+ 0x6F12, 0x0038, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24B4, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x01D0, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x20F0, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x14CE, 0x2,
+ 0x6F12, 0x00CC, 0x2,
+ 0x602A, 0x1918, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x602A, 0x191C, 0x2,
+ 0x6F12, 0x8091, 0x2,
+ 0x602A, 0x1920, 0x2,
+ 0x6F12, 0x8093, 0x2,
+ 0x602A, 0x1924, 0x2,
+ 0x6F12, 0x80A4, 0x2,
+ 0x602A, 0x1928, 0x2,
+ 0x6F12, 0x80A6, 0x2,
+ 0x602A, 0x192C, 0x2,
+ 0x6F12, 0x80B7, 0x2,
+ 0x602A, 0x1930, 0x2,
+ 0x6F12, 0x82F8, 0x2,
+ 0x602A, 0x1934, 0x2,
+ 0x6F12, 0x8309, 0x2,
+ 0x602A, 0x1938, 0x2,
+ 0x6F12, 0x830B, 0x2,
+ 0x602A, 0x193C, 0x2,
+ 0x6F12, 0x831C, 0x2,
+ 0x602A, 0x1940, 0x2,
+ 0x6F12, 0x831E, 0x2,
+ 0x602A, 0x1944, 0x2,
+ 0x6F12, 0x832F, 0x2,
+ 0x602A, 0x1476, 0x2,
+ 0x6F12, 0x0316, 0x2,
+ 0x602A, 0x1F18, 0x2,
+ 0x6F12, 0x00AE, 0x2,
+ 0x602A, 0x224A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1C28, 0x2,
+ 0x6F12, 0x090F, 0x2,
+ 0x602A, 0x15EA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1C3A, 0x2,
+ 0x6F12, 0x1FE9, 0x2,
+ 0x602A, 0x1C34, 0x2,
+ 0x6F12, 0x4408, 0x2,
+ 0x602A, 0x138A, 0x2,
+ 0x6F12, 0x0046, 0x2,
+ 0x602A, 0x139A, 0x2,
+ 0x6F12, 0x003A, 0x2,
+ 0x602A, 0x13EE, 0x2,
+ 0x6F12, 0x003F, 0x2,
+ 0x602A, 0x1C30, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0280, 0x2,
+ 0x602A, 0x1C2A, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF474, 0x0000, 0x2,
+ 0xF472, 0x0000, 0x2,
+ 0xF41A, 0x0010, 0x2,
+ 0xF446, 0x000E, 0x2,
+ 0xF448, 0x001B, 0x2,
+ 0xF44A, 0x0010, 0x2,
+ 0xF450, 0x0011, 0x2,
+ 0xF452, 0x000E, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0110, 0x1002, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11A4, 0x2,
+ 0x6F12, 0x28C0, 0x2,
+ 0x602A, 0x1118, 0x2,
+ 0x6F12, 0x0040, 0x2,
+ 0x6F12, 0x2140, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0000, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x250E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x5790, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x119E, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FEA, 0x2240, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2676, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ 0x602A, 0x203C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x25A0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2480, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x29E4, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0050, 0x2,
+ I2C_MODE_BURST_DATA, 0x003C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x0014, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0050, 0x2,
+ I2C_MODE_BURST_DATA, 0x003C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0050, 0x2,
+ I2C_MODE_BURST_DATA, 0x003C, 0x2,
+ I2C_MODE_BURST_DATA, 0x003C, 0x2,
+ I2C_MODE_BURST_DATA, 0x00C8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0096, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0050, 0x2,
+ I2C_MODE_BURST_DATA, 0x00C8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0096, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0050, 0x2,
+ I2C_MODE_BURST_DATA, 0x0032, 0x2,
+ I2C_MODE_BURST_DATA, 0x0025, 0x2,
+ I2C_MODE_BURST_DATA, 0x0019, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0050, 0x2,
+ I2C_MODE_BURST_DATA, 0x003C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x0014, 0x2,
+ I2C_MODE_BURST_DATA, 0x0050, 0x2,
+ I2C_MODE_BURST_DATA, 0x003C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x0014, 0x2,
+ I2C_MODE_BURST_DATA, 0x00C8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0096, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0032, 0x2,
+ I2C_MODE_BURST_DATA, 0x00C8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0096, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0032, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x29D6, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0128, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0002, 0x2,
+ 0x602A, 0x2A7E, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0320, 0x2,
+ I2C_MODE_BURST_DATA, 0x011B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ 0x602A, 0x2A84, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ I2C_MODE_BURST_DATA, 0x0480, 0x2,
+ I2C_MODE_BURST_DATA, 0x0480, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ I2C_MODE_BURST_DATA, 0x0200, 0x2,
+ I2C_MODE_BURST_DATA, 0x03D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x05A7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AD3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0320, 0x2,
+ I2C_MODE_BURST_DATA, 0x0320, 0x2,
+ I2C_MODE_BURST_DATA, 0x011B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0064, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ I2C_MODE_BURST_DATA, 0x0200, 0x2,
+ I2C_MODE_BURST_DATA, 0x1000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0800, 0x2,
+ I2C_MODE_BURST_DATA, 0x1000, 0x2,
+ I2C_MODE_BURST_DATA, 0x1000, 0x2,
+ 0x602A, 0x2AB4, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0400, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ 0x602A, 0x2AAE, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0200, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ I2C_MODE_BURST_DATA, 0x0180, 0x2,
+ 0x602A, 0x2A68, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A72, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A66, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x3662, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x375E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3796, 0x2,
+ 0x6F12, 0x00AD, 0x2,
+ 0x602A, 0x379A, 0x2,
+ 0x6F12, 0x00AD, 0x2,
+ 0x602A, 0x37AA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37AE, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37B2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37B6, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37BA, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37BE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37C2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37C6, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37CA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37CE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37D2, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37D6, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37DA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37DE, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37E2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37E6, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37EA, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37EE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x37F2, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37F6, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37FA, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x37FE, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3802, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3806, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3816, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x381A, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x381E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3822, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3826, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x382A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x382E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3832, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3836, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x383A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x383E, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3842, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3846, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x384A, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x384E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3852, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3856, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x385A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x385E, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3862, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x3866, 0x2,
+ 0x6F12, 0x000D, 0x2,
+ 0x602A, 0x386A, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x386E, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x3872, 0x2,
+ 0x6F12, 0x0010, 0x2,
+ 0x602A, 0x366E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x3676, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x372E, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x3732, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x3736, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x373A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3742, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x602A, 0x3746, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x602A, 0x374A, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x602A, 0x3752, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x602A, 0x3756, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x602A, 0x375A, 0x2,
+ 0x6F12, 0x0064, 0x2,
+ 0x602A, 0x3776, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x3786, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x418A, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ 0x602A, 0x4192, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x1080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8000, 0x2,
+ 0x602A, 0x419C, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ I2C_MODE_BURST_DATA, 0x8080, 0x2,
+ 0x602A, 0x41A4, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x102D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D00, 0x2,
+ 0x602A, 0x41AE, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2D, 0x2,
+ 0x602A, 0x41B6, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x102D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D2D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D00, 0x2,
+ 0x602A, 0x41C0, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ 0x602A, 0x41C8, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x1005, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ I2C_MODE_BURST_DATA, 0x0500, 0x2,
+ 0x602A, 0x41D2, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ I2C_MODE_BURST_DATA, 0x0505, 0x2,
+ 0x602A, 0x41DA, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x1001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ 0x602A, 0x41E4, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ 0x602A, 0x41EC, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x1001, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x0101, 0x2,
+ I2C_MODE_BURST_DATA, 0x0100, 0x2,
+ 0x602A, 0x421A, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ 0x602A, 0x4222, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF00, 0x2,
+ 0x602A, 0x422C, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFFF, 0x2,
+ 0x602A, 0x11B4, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x10EA, 0x2,
+ 0x6F12, 0x58C5, 0x2,
+ 0x602A, 0x11F0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x2A48, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0AAA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0223, 0x2,
+ I2C_MODE_BURST_DATA, 0x0112, 0x2,
+ I2C_MODE_BURST_DATA, 0x0112, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x124E, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x602A, 0x2990, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x080A, 0x0100, 0x2,
+ 0x6004, 0x0000, 0x2, /* burst mode direct */
+};
+
+/*
+ * [Mode Information]
+ * 0: [MCLK:26,Width:2880,Height:2160,Format:MIPI_RAW10,mipi_lane:4,mipi_datarate:2100,pvi_pclk_inverse:0]
+ * 1: [MCLK:26,Width:5760,Height:4320,Format:MIPI_RAW10,mipi_lane:4,mipi_datarate:2100,pvi_pclk_inverse:0]
+ * 2: [MCLK:26,Width:1920,Height:1080,Format:MIPI_RAW10,mipi_lane:4,mipi_datarate:1800,pvi_pclk_inverse:0]
+ * 3: [MCLK:26,Width:1920,Height:1080,Format:MIPI_RAW10,mipi_lane:4,mipi_datarate:1800,pvi_pclk_inverse:0]
+ */
+const u32 sensor_2x5sp_setfile_B_2880x2160_30fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x1687, 0x2,
+ 0x034A, 0x10E7, 0x2,
+ 0x034C, 0x0B40, 0x2,
+ 0x034E, 0x0870, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0930, 0x2,
+ 0x0342, 0x3500, 0x2,
+ 0x0900, 0x0122, 0x2,
+ 0x0902, 0x0001, 0x2,
+ 0x0380, 0x0002, 0x2,
+ 0x0382, 0x0002, 0x2,
+ 0x0384, 0x0002, 0x2,
+ 0x0386, 0x0002, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0400, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0000, 0x2,
+ 0x0310, 0x014A, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x10B6, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x1C38, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2DF6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2DFA, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x0B08, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x20F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FE0, 0x0000, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x0202, 0x0500, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B00, 0x0138, 0x2,
+ 0x0FE8, 0x28C0, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24FE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x2508, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2500, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x2502, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A34, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2516, 0x2,
+ 0x6F12, 0x0311, 0x2,
+ 0x602A, 0x2A36, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x4030, 0x2,
+ 0x6F12, 0x2820, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x250C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11B0, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0xE702, 0x2,
+ 0x602A, 0x11EE, 0x2,
+ 0x6F12, 0xE402, 0x2,
+ 0x602A, 0x11FA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1200, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11FC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x10E0, 0x2,
+ 0x6F12, 0x2ED7, 0x2,
+ 0x6F12, 0x2DB4, 0x2,
+ 0x602A, 0x11A0, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x122A, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0002, 0x2,
+ 0x1134, 0x4470, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1186, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3672, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2D24, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1110, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1188, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11B2, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11B6, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11BA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF466, 0x07FB, 0x2,
+ 0xF468, 0x2000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE9F0, 0x2,
+};
+
+const u32 sensor_2x5sp_setfile_B_5760x4320_24fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0344, 0x0004, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x168B, 0x2,
+ 0x034A, 0x10E7, 0x2,
+ 0x034C, 0x1680, 0x2,
+ 0x034E, 0x10E0, 0x2,
+ 0x0350, 0x0004, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x1480, 0x2,
+ 0x0342, 0x1DA0, 0x2,
+ 0x0900, 0x0011, 0x2,
+ 0x0902, 0x0000, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0001, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0400, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0000, 0x2,
+ 0x0310, 0x014A, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x10B6, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x1C38, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2DF6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2DFA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x0B08, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x20F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FE0, 0x0000, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x0202, 0x0820, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B00, 0x0138, 0x2,
+ 0x0FE8, 0x28C0, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24FE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x2508, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2500, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x2502, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A34, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2516, 0x2,
+ 0x6F12, 0x0311, 0x2,
+ 0x602A, 0x2A36, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x4030, 0x2,
+ 0x6F12, 0x2820, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x250C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11B0, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11EE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11FA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1200, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11FC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x10E0, 0x2,
+ 0x6F12, 0x28D2, 0x2,
+ 0x6F12, 0x27F1, 0x2,
+ 0x602A, 0x11A0, 0x2,
+ 0x6F12, 0x0301, 0x2,
+ 0x602A, 0x122A, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0002, 0x2,
+ 0x1134, 0x4470, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1186, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3672, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2D24, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1110, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1188, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11B2, 0x2,
+ 0x6F12, 0x007F, 0x2,
+ 0x602A, 0x11B6, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x11BA, 0x2,
+ 0x6F12, 0x004B, 0x2,
+ 0x6F12, 0x066B, 0x2,
+ 0x6F12, 0xF466, 0x2,
+ 0x6F12, 0xA000, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xF468, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF466, 0x004B, 0x2,
+ 0xF468, 0xA000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x35D6, 0x2,
+ 0x6F12, 0x0038, 0x2,
+ 0x602A, 0x35DA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x35E2, 0x2,
+ 0x6F12, 0x0006, 0x2,
+ 0x602A, 0x35F2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x35FE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x411E, 0x2,
+ 0x6F12, 0x0A0A, 0x2,
+ 0x6F12, 0x0A0A, 0x2,
+ 0x6F12, 0x0A0A, 0x2,
+ 0x602A, 0x4142, 0x2,
+ 0x6F12, 0x0505, 0x2,
+ 0x6F12, 0x0505, 0x2,
+ 0x6F12, 0x0505, 0x2,
+ 0x602A, 0x4166, 0x2,
+ 0x6F12, 0x3232, 0x2,
+ 0x6F12, 0x3232, 0x2,
+ 0x6F12, 0x3232, 0x2,
+ 0x602A, 0x4180, 0x2,
+ 0x6F12, 0x1040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x602A, 0x4690, 0x2,
+ 0x6F12, 0x1013, 0x2,
+ 0x6F12, 0x1313, 0x2,
+ 0x6F12, 0x1313, 0x2,
+ 0x6F12, 0x1300, 0x2,
+ 0x602A, 0x4E22, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x122C, 0x2,
+ 0x6F12, 0x1230, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2E10, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x46B4, 0x2,
+ 0x6F12, 0x4078, 0x2,
+ 0x6F12, 0x785E, 0x2,
+ 0x6F12, 0x4236, 0x2,
+ 0x6F12, 0x3601, 0x2,
+ 0x602A, 0x46BE, 0x2,
+ 0x6F12, 0x7878, 0x2,
+ 0x6F12, 0x5E42, 0x2,
+ 0x6F12, 0x3636, 0x2,
+ 0x602A, 0x46C6, 0x2,
+ 0x6F12, 0x405A, 0x2,
+ 0x6F12, 0x5A78, 0x2,
+ 0x6F12, 0x96B4, 0x2,
+ 0x6F12, 0xB401, 0x2,
+ 0x602A, 0x46D0, 0x2,
+ 0x6F12, 0x6464, 0x2,
+ 0x6F12, 0x85A7, 0x2,
+ 0x602A, 0x46D8, 0x2,
+ 0x6F12, 0x4053, 0x2,
+ 0x6F12, 0x5370, 0x2,
+ 0x6F12, 0x8BA7, 0x2,
+ 0x6F12, 0xA701, 0x2,
+ 0x602A, 0x46E2, 0x2,
+ 0x6F12, 0x5353, 0x2,
+ 0x6F12, 0x708B, 0x2,
+ 0x6F12, 0xA7A7, 0x2,
+ 0x602A, 0x46EA, 0x2,
+ 0x6F12, 0x4064, 0x2,
+ 0x6F12, 0x6486, 0x2,
+ 0x6F12, 0xA7C8, 0x2,
+ 0x6F12, 0xC801, 0x2,
+ 0x602A, 0x46F4, 0x2,
+ 0x6F12, 0x1414, 0x2,
+ 0x6F12, 0x1B21, 0x2,
+ 0x6F12, 0x2828, 0x2,
+ 0x602A, 0x46FC, 0x2,
+ 0x6F12, 0x4014, 0x2,
+ 0x6F12, 0x141B, 0x2,
+ 0x6F12, 0x2128, 0x2,
+ 0x6F12, 0x2801, 0x2,
+ 0x602A, 0x4706, 0x2,
+ 0x6F12, 0x1B1B, 0x2,
+ 0x6F12, 0x232D, 0x2,
+ 0x6F12, 0x3636, 0x2,
+ 0x602A, 0x470E, 0x2,
+ 0x6F12, 0x403C, 0x2,
+ 0x6F12, 0x3C50, 0x2,
+ 0x6F12, 0x6478, 0x2,
+ 0x6F12, 0x7801, 0x2,
+ 0x602A, 0x4718, 0x2,
+ 0x6F12, 0x3C3C, 0x2,
+ 0x6F12, 0x5064, 0x2,
+ 0x6F12, 0x7878, 0x2,
+ 0x602A, 0x3876, 0x2,
+ 0x6F12, 0x0035, 0x2,
+ 0x602A, 0x387A, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x602A, 0x38BA, 0x2,
+ 0x6F12, 0x0081, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE9F0, 0x2,
+};
+
+const u32 sensor_2x5sp_setfile_B_1920x1080_120fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0218, 0x2,
+ 0x0348, 0x1687, 0x2,
+ 0x034A, 0x0ED7, 0x2,
+ 0x034C, 0x0780, 0x2,
+ 0x034E, 0x0438, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0004, 0x2,
+ 0x0340, 0x08E4, 0x2,
+ 0x0342, 0x0DB0, 0x2,
+ 0x0900, 0x0122, 0x2,
+ 0x0902, 0x0001, 0x2,
+ 0x0380, 0x0002, 0x2,
+ 0x0382, 0x0002, 0x2,
+ 0x0384, 0x0002, 0x2,
+ 0x0386, 0x0002, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1818, 0x2,
+ 0x0400, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0000, 0x2,
+ 0x0310, 0x0115, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x10B6, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x1C38, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2DF6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2DFA, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x0B08, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x20F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FE0, 0x0000, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x0202, 0x0500, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B00, 0x0138, 0x2,
+ 0x0FE8, 0x28C0, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24FE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x2508, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2500, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x2502, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A34, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2516, 0x2,
+ 0x6F12, 0x0311, 0x2,
+ 0x602A, 0x2A36, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x4030, 0x2,
+ 0x6F12, 0x2820, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x250C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11B0, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0xE702, 0x2,
+ 0x602A, 0x11EE, 0x2,
+ 0x6F12, 0xE402, 0x2,
+ 0x602A, 0x11FA, 0x2,
+ 0x6F12, 0xE502, 0x2,
+ 0x602A, 0x11F6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1200, 0x2,
+ 0x6F12, 0xE602, 0x2,
+ 0x602A, 0x11FC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x10E0, 0x2,
+ 0x6F12, 0x2B00, 0x2,
+ 0x6F12, 0x28A0, 0x2,
+ 0x602A, 0x11A0, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x122A, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0002, 0x2,
+ 0x1134, 0x4470, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1186, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3672, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2D24, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1110, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1188, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11B2, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11B6, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11BA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF466, 0x07FB, 0x2,
+ 0xF468, 0x2000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE9F0, 0x2,
+};
+
+const u32 sensor_2x5sp_setfile_B_1280x720_240fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0344, 0x0148, 0x2,
+ 0x0346, 0x02D8, 0x2,
+ 0x0348, 0x1547, 0x2,
+ 0x034A, 0x0E17, 0x2,
+ 0x034C, 0x0500, 0x2,
+ 0x034E, 0x02D0, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x04BA, 0x2,
+ 0x0342, 0x0CE0, 0x2,
+ 0x0900, 0x0124, 0x2,
+ 0x0902, 0x0001, 0x2,
+ 0x0380, 0x0002, 0x2,
+ 0x0382, 0x0002, 0x2,
+ 0x0384, 0x0004, 0x2,
+ 0x0386, 0x0004, 0x2,
+ 0x0404, 0x2000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0400, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0000, 0x2,
+ 0x0310, 0x0115, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x10B6, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x1C38, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2DF6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2DFA, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x0B08, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x20F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FE0, 0x0000, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x0202, 0x0500, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B00, 0x0138, 0x2,
+ 0x0FE8, 0x28C0, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24FE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x2508, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2500, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x2502, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A34, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2516, 0x2,
+ 0x6F12, 0x0311, 0x2,
+ 0x602A, 0x2A36, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x4030, 0x2,
+ 0x6F12, 0x2820, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x250C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11B0, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0xE702, 0x2,
+ 0x602A, 0x11EE, 0x2,
+ 0x6F12, 0xE402, 0x2,
+ 0x602A, 0x11FA, 0x2,
+ 0x6F12, 0xE40C, 0x2,
+ 0x602A, 0x11F6, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x1200, 0x2,
+ 0x6F12, 0xE70C, 0x2,
+ 0x602A, 0x11FC, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x10E0, 0x2,
+ 0x6F12, 0x2B00, 0x2,
+ 0x6F12, 0x28A0, 0x2,
+ 0x602A, 0x11A0, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x122A, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0002, 0x2,
+ 0x1134, 0x4470, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1186, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3672, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2D24, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1110, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1188, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11B2, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11B6, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11BA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF466, 0x07FB, 0x2,
+ 0xF468, 0x2000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE9F0, 0x2,
+};
+
+const u32 sensor_2x5sp_setfile_B_2880x2160_30fps_3DHDR[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x1687, 0x2,
+ 0x034A, 0x10E7, 0x2,
+ 0x034C, 0x0B40, 0x2,
+ 0x034E, 0x0870, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x1200, 0x2,
+ 0x0342, 0x1B10, 0x2,
+ 0x0900, 0x0011, 0x2,
+ 0x0902, 0x0001, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0001, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0400, 0x2020, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0000, 0x2,
+ 0x0310, 0x00E7, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x10B6, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x1C38, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2DF6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2DFA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x0B08, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x20F4, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FE0, 0x0000, 0x2,
+ 0x021E, 0x0300, 0x2,
+ 0x0202, 0x0820, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B00, 0x0138, 0x2,
+ 0x0FE8, 0x28C0, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24FE, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x2508, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2500, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x2502, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A34, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2516, 0x2,
+ 0x6F12, 0x0301, 0x2,
+ 0x602A, 0x2A36, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x3838, 0x2,
+ 0x6F12, 0x2828, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x250C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11B0, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0xE702, 0x2,
+ 0x602A, 0x11EE, 0x2,
+ 0x6F12, 0xE402, 0x2,
+ 0x602A, 0x11FA, 0x2,
+ 0x6F12, 0xE502, 0x2,
+ 0x602A, 0x11F6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1200, 0x2,
+ 0x6F12, 0xE602, 0x2,
+ 0x602A, 0x11FC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x10E0, 0x2,
+ 0x6F12, 0x51C0, 0x2,
+ 0x6F12, 0x27F1, 0x2,
+ 0x602A, 0x11A0, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x122A, 0x2,
+ 0x6F12, 0x0A01, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0002, 0x2,
+ 0x1134, 0x4470, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1186, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3672, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2D24, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1110, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1188, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11B2, 0x2,
+ 0x6F12, 0x007F, 0x2,
+ 0x602A, 0x11B6, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x11BA, 0x2,
+ 0x6F12, 0x004B, 0x2,
+ 0x6F12, 0x066B, 0x2,
+ 0x6F12, 0xF466, 0x2,
+ 0x6F12, 0xA000, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xF468, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF466, 0x004B, 0x2,
+ 0xF468, 0xA000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2D12, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x602A, 0x206E, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x6F12, 0x7777, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x6F12, 0x7777, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x6F12, 0x7777, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x6F12, 0x7777, 0x2,
+ 0x602A, 0x2514, 0x2,
+ 0x6F12, 0x0301, 0x2,
+ 0x602A, 0x10F6, 0x2,
+ 0x6F12, 0x2600, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x56D8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x34B4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x34D6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x001F, 0x2,
+ 0x6F12, 0x002F, 0x2,
+ 0x6F12, 0x003F, 0x2,
+ 0x6F12, 0x004F, 0x2,
+ 0x6F12, 0x005F, 0x2,
+ 0x6F12, 0x006F, 0x2,
+ 0x6F12, 0x007F, 0x2,
+ 0x6F12, 0x008F, 0x2,
+ 0x6F12, 0x009F, 0x2,
+ 0x6F12, 0x00AF, 0x2,
+ 0x6F12, 0x00BF, 0x2,
+ 0x6F12, 0x00CF, 0x2,
+ 0x6F12, 0x00DF, 0x2,
+ 0x6F12, 0x00EF, 0x2,
+ 0x6F12, 0x00FF, 0x2,
+ 0x602A, 0x4B00, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4DF0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4AC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B02, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4AE0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4DE0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B12, 0x2,
+ 0x6F12, 0x00B7, 0x2,
+ 0x602A, 0x4B16, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B1A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B1E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B22, 0x2,
+ 0x6F12, 0x008F, 0x2,
+ 0x602A, 0x4B26, 0x2,
+ 0x6F12, 0x0087, 0x2,
+ 0x602A, 0x4B2A, 0x2,
+ 0x6F12, 0x00B7, 0x2,
+ 0x602A, 0x4B2E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B32, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B36, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B3A, 0x2,
+ 0x6F12, 0x008F, 0x2,
+ 0x602A, 0x4B3E, 0x2,
+ 0x6F12, 0x0087, 0x2,
+ 0x602A, 0x4B42, 0x2,
+ 0x6F12, 0x00B7, 0x2,
+ 0x602A, 0x4B46, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B4A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B4E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B52, 0x2,
+ 0x6F12, 0x008F, 0x2,
+ 0x602A, 0x4B56, 0x2,
+ 0x6F12, 0x0087, 0x2,
+ 0x602A, 0x4B5A, 0x2,
+ 0x6F12, 0x00B7, 0x2,
+ 0x602A, 0x4B5E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B62, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B66, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B6A, 0x2,
+ 0x6F12, 0x008F, 0x2,
+ 0x602A, 0x4B6E, 0x2,
+ 0x6F12, 0x0087, 0x2,
+ 0x602A, 0x4B72, 0x2,
+ 0x6F12, 0x0097, 0x2,
+ 0x602A, 0x4B76, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B7A, 0x2,
+ 0x6F12, 0x0097, 0x2,
+ 0x602A, 0x4B7E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B82, 0x2,
+ 0x6F12, 0x0097, 0x2,
+ 0x602A, 0x4B86, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B8A, 0x2,
+ 0x6F12, 0x0097, 0x2,
+ 0x602A, 0x4B8E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4DE2, 0x2,
+ 0x6F12, 0x0040, 0x2,
+ 0x602A, 0x4B96, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0290, 0x2,
+ 0x6F12, 0x051E, 0x2,
+ 0x6F12, 0x00DA, 0x2,
+ 0x602A, 0x4BB2, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0290, 0x2,
+ 0x6F12, 0x051E, 0x2,
+ 0x6F12, 0x00DA, 0x2,
+ 0x602A, 0x4BA4, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0290, 0x2,
+ 0x6F12, 0x051E, 0x2,
+ 0x6F12, 0x00DA, 0x2,
+ 0x602A, 0x4BCE, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x3E94, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x4BC0, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0889, 0x2,
+ 0x6F12, 0x0290, 0x2,
+ 0x6F12, 0x051E, 0x2,
+ 0x6F12, 0x00DA, 0x2,
+ 0x602A, 0x4DF6, 0x2,
+ 0x6F12, 0x0040, 0x2,
+ 0x602A, 0x4E06, 0x2,
+ 0x6F12, 0x088B, 0x2,
+ 0x6F12, 0x088B, 0x2,
+ 0x6F12, 0x088B, 0x2,
+ 0x6F12, 0x004D, 0x2,
+ 0x6F12, 0x009A, 0x2,
+ 0x6F12, 0x0019, 0x2,
+ 0x602A, 0x4DF2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x4E1C, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x4E22, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x122C, 0x2,
+ 0x6F12, 0x1230, 0x2,
+ 0x602A, 0x57A6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x4B04, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x4B10, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x602A, 0x3646, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x364E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x3652, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x3656, 0x2,
+ 0x6F12, 0x0099, 0x2,
+ 0x602A, 0x38BE, 0x2,
+ 0x6F12, 0x0C80, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x602A, 0x3946, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x602A, 0x3972, 0x2,
+ 0x6F12, 0x0C80, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x6F12, 0x8080, 0x2,
+ 0x602A, 0x39A0, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x602A, 0x3ADA, 0x2,
+ 0x6F12, 0x0C40, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4040, 0x2,
+ 0x6F12, 0x4020, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x6F12, 0x2020, 0x2,
+ 0x602A, 0x39FA, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x602A, 0x3A26, 0x2,
+ 0x6F12, 0x0C24, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x602A, 0x3B62, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x6F12, 0x0B0B, 0x2,
+ 0x602A, 0x3B8E, 0x2,
+ 0x6F12, 0x0C24, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x6F12, 0x2424, 0x2,
+ 0x602A, 0x3DAA, 0x2,
+ 0x6F12, 0x0C06, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x602A, 0x3DD8, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x6F12, 0x0606, 0x2,
+ 0x602A, 0x3E04, 0x2,
+ 0x6F12, 0x0C12, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x6F12, 0x1212, 0x2,
+ 0x602A, 0x3F40, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x6F12, 0x4141, 0x2,
+ 0x602A, 0x332E, 0x2,
+ 0x6F12, 0x0154, 0x2,
+ 0x6F12, 0x02BC, 0x2,
+ 0x602A, 0x3334, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x4E32, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x1206, 0x2,
+ 0x6F12, 0xE902, 0x2,
+ 0x602A, 0x1202, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x120C, 0x2,
+ 0x6F12, 0xEB02, 0x2,
+ 0x602A, 0x1208, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x332C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3614, 0x2,
+ 0x6F12, 0x003A, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x57A2, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x33CE, 0x2,
+ 0x6F12, 0x00CA, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x6F12, 0x0469, 0x2,
+ 0x6F12, 0x06A2, 0x2,
+ 0x6F12, 0x0B55, 0x2,
+ 0x6F12, 0x0D9A, 0x2,
+ 0x6F12, 0x0ED3, 0x2,
+ 0x6F12, 0x0FFF, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0202, 0x0800, 0x2,
+ 0x022C, 0x0800, 0x2,
+ 0x0226, 0x0800, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x011A, 0x1C01, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x250E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A50, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x6F12, 0x2D28, 0x2,
+ 0x6F12, 0x0096, 0x2,
+ 0x6F12, 0x08AF, 0x2,
+ 0x6F12, 0x005C, 0x2,
+ 0x6F12, 0xFC6F, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x6F12, 0xFF51, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x6F12, 0x0620, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE9F0, 0x2,
+};
+
+/* for reduce mipi speed at thermal throttling state */
+const u32 sensor_2x5sp_setfile_B_2880x2160_15fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x1687, 0x2,
+ 0x034A, 0x10E7, 0x2,
+ 0x034C, 0x0B40, 0x2,
+ 0x034E, 0x0870, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x2120, 0x2,
+ 0x0342, 0x1D48, 0x2,
+ 0x0900, 0x0122, 0x2,
+ 0x0902, 0x0001, 0x2,
+ 0x0380, 0x0002, 0x2,
+ 0x0382, 0x0002, 0x2,
+ 0x0384, 0x0002, 0x2,
+ 0x0386, 0x0002, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0400, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0004, 0x2,
+ 0x030C, 0x0001, 0x2,
+ 0x0306, 0x00DD, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0003, 0x2,
+ 0x030E, 0x0004, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0140, 0x2,
+ 0x030A, 0x0001, 0x2,
+ 0x0308, 0x0008, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1C1E, 0x2,
+ 0x6F12, 0x0E0D, 0x2,
+ 0x602A, 0x1322, 0x2,
+ 0x6F12, 0x0303, 0x2,
+ 0x602A, 0x10B6, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x1C38, 0x2,
+ 0x6F12, 0x004B, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2DF6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2DFA, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x0B08, 0x0001, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x117C, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x20F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0FE0, 0x0000, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x0202, 0x0500, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B00, 0x0138, 0x2,
+ 0x0FE8, 0x28C0, 0x2,
+ 0x6028, 0x2001, 0x2,
+ 0x602A, 0x24FE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x2508, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2500, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x2502, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2A34, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x2516, 0x2,
+ 0x6F12, 0x0311, 0x2,
+ 0x602A, 0x2A36, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6F12, 0x4030, 0x2,
+ 0x6F12, 0x2820, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x2510, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x250C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x11B0, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0xE702, 0x2,
+ 0x602A, 0x11EE, 0x2,
+ 0x6F12, 0xE402, 0x2,
+ 0x602A, 0x11FA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1200, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11FC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x10E0, 0x2,
+ 0x6F12, 0x2ED7, 0x2,
+ 0x6F12, 0x2DB4, 0x2,
+ 0x602A, 0x11A0, 0x2,
+ 0x6F12, 0x0300, 0x2,
+ 0x602A, 0x122A, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0002, 0x2,
+ 0x1134, 0x4470, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1186, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x3672, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x2D24, 0x2,
+ 0x6F12, 0x0101, 0x2,
+ 0x602A, 0x2520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1110, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1188, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11B2, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11B6, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x11BA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF466, 0x07FB, 0x2,
+ 0xF468, 0x2000, 0x2,
+ 0x6214, 0xE9F0, 0x2,
+ 0x6218, 0xE9F0, 0x2,
+};
+
+/* for reduce mipi speed at thermal throttling state */
+const struct sensor_pll_info_compact sensor_2x5sp_pllinfo_B_2880x2160_15fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1040000000, /* mipi_datarate */
+ 957666000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x2120, /* frame_length_lines (0x0340) */
+ 0x1D48, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_2x5sp_pllinfo_B_2880x2160_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2100000000, /* mipi_datarate */
+ 957666000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0930, /* frame_length_lines (0x0340) */
+ 0x3500, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_2x5sp_pllinfo_B_2880x2160_30fps_3DHDR = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1502000000, /* mipi_datarate */
+ 957666000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x1200, /* frame_length_lines (0x0340) */
+ 0x1B10, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_2x5sp_pllinfo_B_5760x4320_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2100000000, /* mipi_datarate */
+ 957666000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x1480, /* frame_length_lines (0x0340) */
+ 0x1DA0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_2x5sp_pllinfo_B_1920x1080_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1800000000, /* mipi_datarate */
+ 957666000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x093C, /* frame_length_lines (0x0340) */
+ 0x0D30, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_2x5sp_pllinfo_B_1280x720_240fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1800000000, /* mipi_datarate */
+ 975000000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x04C0, /* frame_length_lines (0x0340) */
+ 0x0CD0, /* line_length_pck (0x0342) */
+};
+
+static const u32 *sensor_2x5sp_setfiles_B[] = {
+ sensor_2x5sp_setfile_B_2880x2160_30fps,
+ sensor_2x5sp_setfile_B_2880x2160_30fps_3DHDR,
+ sensor_2x5sp_setfile_B_5760x4320_24fps,
+ sensor_2x5sp_setfile_B_1920x1080_120fps,
+ sensor_2x5sp_setfile_B_1280x720_240fps,
+};
+
+static const u32 sensor_2x5sp_setfile_B_sizes[] = {
+ ARRAY_SIZE(sensor_2x5sp_setfile_B_2880x2160_30fps),
+ ARRAY_SIZE(sensor_2x5sp_setfile_B_2880x2160_30fps_3DHDR),
+ ARRAY_SIZE(sensor_2x5sp_setfile_B_5760x4320_24fps),
+ ARRAY_SIZE(sensor_2x5sp_setfile_B_1920x1080_120fps),
+ ARRAY_SIZE(sensor_2x5sp_setfile_B_1280x720_240fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_2x5sp_pllinfos_B[] = {
+ &sensor_2x5sp_pllinfo_B_2880x2160_30fps,
+ &sensor_2x5sp_pllinfo_B_2880x2160_30fps_3DHDR,
+ &sensor_2x5sp_pllinfo_B_5760x4320_24fps,
+ &sensor_2x5sp_pllinfo_B_1920x1080_120fps,
+ &sensor_2x5sp_pllinfo_B_1280x720_240fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-2x5sp.h"
+#include "fimc-is-cis-2x5sp-setA.h"
+#include "fimc-is-cis-2x5sp-setB.h"
+
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "S5K2X5SP"
+/* #define DEBUG_2X5SP_PLL */
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_2x5sp_global;
+static u32 sensor_2x5sp_global_size;
+static const u32 **sensor_2x5sp_setfiles;
+static const u32 *sensor_2x5sp_setfile_sizes;
+static const u32 *sensor_2x5sp_otp_initial;
+static u32 sensor_2x5sp_otp_initial_size;
+static const struct sensor_pll_info_compact **sensor_2x5sp_pllinfos;
+static u32 sensor_2x5sp_max_setfile_num;
+
+static const u32 *sensor_2x5sp_setfile_throttling;
+static const struct sensor_pll_info_compact *sensor_2x5sp_pllinfo_throttling;
+
+static void sensor_2x5sp_cis_data_calculation(const struct sensor_pll_info_compact *pll_info_compact, cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, max_fps = 0, frame_valid_us = 0;
+
+ FIMC_BUG_VOID(!pll_info_compact);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info_compact->pclk;
+
+ dbg_sensor(1, "ext_clock(%d), mipi_datarate(%d), pclk(%d)\n",
+ pll_info_compact->ext_clk, pll_info_compact->mipi_datarate, pll_info_compact->pclk);
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info_compact->frame_length_lines(%d) * pll_info_compact->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info_compact->frame_length_lines, pll_info_compact->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = (vt_pix_clk_hz * 10) / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = max_fps;
+ cis_data->frame_length_lines = pll_info_compact->frame_length_lines;
+ cis_data->line_length_pck = pll_info_compact->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_2X5SP_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = cis_data->cur_width;
+ cis_data->min_coarse_integration_time = SENSOR_2X5SP_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_2X5SP_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+int sensor_2x5sp_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read8(client, 0x0002, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_otp_check_awb_ratio(char *unit, char *golden, char *limit)
+{
+ int ret = 0;
+
+ float r_g_min = (float)(limit[0]) / 1000;
+ float r_g_max = (float)(limit[1]) / 1000;
+ float b_g_min = (float)(limit[2]) / 1000;
+ float b_g_max = (float)(limit[3]) / 1000;
+
+ float rg = (float) ((unit[1]) | (unit[0] << 8)) / 16384;
+ float bg = (float) ((unit[3]) | (unit[2] << 8)) / 16384;
+
+ float golden_rg = (float) ((golden[1]) | (golden[0] << 8)) / 16384;
+ float golden_bg = (float) ((golden[3]) | (golden[2] << 8)) / 16384;
+
+ if (rg < (golden_rg - r_g_min) || rg > (golden_rg + r_g_max)) {
+ err("%s(): Final RG calibration factors out of range! rg=0x%x golden_rg=0x%x",
+ __func__, (unit[1] | unit[0] << 8), (golden[1] | golden[0] << 8));
+ ret = 1;
+ }
+
+ if (bg < (golden_bg - b_g_min) || bg > (golden_bg + b_g_max)) {
+ err("%s(): Final BG calibration factors out of range! bg=0x%x, golden_bg=0x%x",
+ __func__, (unit[3] | unit[2] << 8), (golden[3] | golden[2] << 8));
+ ret = 1;
+ }
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_otp_check_crc(struct v4l2_subdev *subdev,
+ struct fimc_is_device_sensor *device, int group)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ char *check_buf = (char *)&device->otp_cal_buf[0][0];
+
+ switch (group) {
+ case OTP_GROUP_ONE:
+ /* OTP Group1 CRC check */
+ crc_value = ((device->otp_cal_buf[254][60] << 8) | (device->otp_cal_buf[254][61]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[OTP_GRP1_AWB_CRC_START], OTP_GRP1_AWB_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR1: Error to AWB CRC16 : 0x%x, cal buffer CRC: 0x%x", crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR1: AWB CRC16 : 0x%x, cal buffer CRC: 0x%x\n", crc16, crc_value);
+
+ crc_value = ((device->otp_cal_buf[254][62] << 8) | (device->otp_cal_buf[254][63]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[OTP_GRP1_LSC_XTC_CRC_START], OTP_GRP1_LSC_XTC_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR1: Error to LSC & XTC CRC16 : 0x%x, cal buffer CRC: 0x%x", crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR1: LSC & XTC CRC16 : 0x%x, cal buffer CRC: 0x%x\n", crc16, crc_value);
+ break;
+ case OTP_GROUP_TWO:
+ /* OTP Group2 CRC check */
+ crc_value = ((device->otp_cal_buf[255][60] << 8) | (device->otp_cal_buf[255][61]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[OTP_GRP2_AWB_CRC_START], OTP_GRP2_AWB_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR2: Error to AWB CRC16 : 0x%x, cal buffer CRC: 0x%x", crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR2: AWB CRC16 : 0x%x, cal buffer CRC: 0x%x\n", crc16, crc_value);
+
+ crc_value = ((device->otp_cal_buf[255][62] << 8) | (device->otp_cal_buf[255][63]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[OTP_GRP2_LSC_XTC_CRC_START], OTP_GRP2_LSC_XTC_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR2: Error to LSC & XTC CRC16 : 0x%x, cal buffer CRC: 0x%x", crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR2: LSC & XTC CRC16 : 0x%x, cal buffer CRC: 0x%x\n", crc16, crc_value);
+ break;
+ default:
+ err("invalid OTP group when crc check(%d), check map data", group);
+ break;
+ }
+
+ return ret;
+}
+
+static int sensor_2x5sp_cis_otp_check(struct fimc_is_device_sensor *device, int group)
+{
+ int ret = 0;
+ u16 group_flag = 0;
+
+ switch (group) {
+ case OTP_GROUP_ONE:
+ /* Group1 valid check */
+ group_flag = device->otp_cal_buf[254][0];
+ if (group_flag != OTP_DATA_VALID) {
+ err("error Group1 OTP data invalid(0x%x)", group_flag);
+ ret = -EINVAL;
+ } else {
+ ret = OTP_GROUP_ONE;
+ }
+
+ break;
+ case OTP_GROUP_TWO:
+ /* First check Group2 data valid */
+ group_flag = device->otp_cal_buf[255][0];
+ if (group_flag != OTP_DATA_VALID) {
+ err("error Group2 OTP data invalid(0x%x)", group_flag);
+ ret = -EINVAL;
+
+ } else {
+ ret = OTP_GROUP_TWO;
+ }
+
+ break;
+ default:
+ err("invalid OTP group when invalid check(%d), check map data", group);
+ break;
+ }
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_otp_read(struct v4l2_subdev *subdev, struct fimc_is_device_sensor *device)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ u16 val = 1, page;
+ int i;
+ int retry;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ return -EINVAL;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -ENODEV;
+ }
+
+ info("OTP read start\n");
+ dbg_sensor(1, "%s, 1. sensor initial setting", __func__);
+ CALL_CISOPS(cis, cis_set_global_setting, subdev);
+ CALL_CISOPS(cis, cis_mode_change, subdev, 0);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ dbg_sensor(1, "%s, 2. sensor stream on", __func__);
+ fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+
+ /* wait 1ms */
+ usleep_range(1000, 1000);
+
+ dbg_sensor(1, "%s, 3. page select & read cal", __func__);
+ for (page = OTP_PAGE_START; page <= OTP_PAGE_END; page++) {
+ /* page select & read start */
+ fimc_is_sensor_write16(client, OTP_PAGE_SELECT, page);
+ fimc_is_sensor_write16(client, OTP_PAGE_CTRL, 0x0100);
+
+ /* wait 0x0A00 == 0 [0]: read completed with no errors */
+ retry = 500;
+ while (retry > 0 && val) {
+ fimc_is_sensor_read16(client, OTP_PAGE_CTRL, &val);
+ if (val == 0)
+ break;
+
+ usleep_range(100, 100);
+ retry--;
+ }
+
+ if (!retry)
+ err("%s: OTP page[%d] read fail with err(%d)\n",
+ __func__, page, val);
+
+ for (i = 0; i < OTP_PAGE_SIZE; i++) {
+ fimc_is_sensor_read8(client, OTP_PAGE_BASE + i, &device->otp_cal_buf[page][i]);
+ dbg_sensor(2, "cal: [%d][0x%x]: %x\n", page, OTP_PAGE_BASE + i, device->otp_cal_buf[page][i]);
+ }
+
+ /* make initial state */
+ fimc_is_sensor_write16(client, OTP_PAGE_CTRL, 0x0000);
+ }
+
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+ msleep(20);
+ info("OTP read end\n");
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_otp(struct v4l2_subdev *subdev, struct fimc_is_device_sensor *device)
+{
+ int ret = 0;
+ int i;
+ int otp_group = 0x0;
+ char *otp_buf = (char *)&device->otp_cal_buf[0][0];
+
+ ret = sensor_cis_otp_read_file(OTP_DATA_PATH, (void *)device->otp_cal_buf, OTP_PAGE_SIZE * 256);
+ if (ret) {
+ /* OTP data read */
+ ret = sensor_2x5sp_cis_otp_read(subdev, device);
+ if (ret < 0) {
+ err("Don't read to 2x5 OTP data");
+ goto p_err;
+ }
+
+ /* Write to OTP data at file */
+ ret = sensor_cis_otp_write_file(OTP_DATA_PATH, (void *)device->otp_cal_buf, OTP_PAGE_SIZE * 256);
+ if (ret < 0) {
+ err("2x5 OTP data don't file write");
+ goto p_err;
+ }
+ }
+
+ /* Need to first check GROUP2 */
+ for (i = OTP_GROUP_MAX - 1; i >= OTP_GROUP_ONE; i--) {
+ /* OTP valid check */
+ otp_group = sensor_2x5sp_cis_otp_check(device, i);
+ if (otp_group < 0) {
+ if (i == OTP_GROUP_ONE) {
+ err("All OTP data are invalid, check module");
+ goto p_err;
+ } else {
+ continue;
+ }
+ } else {
+ break;
+ }
+ }
+
+ /* OTP CRC check */
+ ret = sensor_2x5sp_cis_otp_check_crc(subdev, device, otp_group);
+ if (ret < 0) {
+ err("All OTP data CRC check fail, check module");
+
+ device->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_ERROR;
+ goto p_err;
+ } else {
+ err("%s: OTP group%d data availble\n", __func__, otp_group);
+
+ device->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_NO_ERROR;
+
+ ret = sensor_2x5sp_cis_otp_check_awb_ratio(&otp_buf[(253 + otp_group) * OTP_PAGE_SIZE + OTP_AWB_UNIT_OFFSET],
+ &otp_buf[(253 + otp_group) * OTP_PAGE_SIZE + OTP_AWB_GOLDEN_OFFSET],
+ &otp_buf[(253 + otp_group) * OTP_PAGE_SIZE + OTP_AWB_LIMIT_OFFSET]);
+
+ if (ret) {
+ err("%s(): 2X5 OTP AWB Group%d ratio out of limit(%d)", __func__, otp_group, ret);
+ device->cal_status[CAMERA_CRC_INDEX_AWB] = LIMIT_FAILURE;
+ ret = -1;
+ }
+ }
+
+p_err:
+ return ret;
+}
+
+/* CIS OPS */
+int sensor_2x5sp_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device = NULL;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+ setinfo.return_value = 0;
+
+ setinfo.param = NULL;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
+
+ device = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(module->subdev);
+ if (!device) {
+ err("device sensor is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+
+ cis->cis_data->cur_width = SENSOR_2X5SP_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_2X5SP_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_2x5sp_cis_data_calculation(sensor_2x5sp_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ if (device->use_otp_cal) {
+ ret = sensor_2x5sp_cis_otp(subdev, device);
+ if (ret < 0) {
+ err("2x5sp OTP data have probelm, check module");
+ ret = 0;
+ }
+ }
+
+p_err:
+ return ret;
+}
+
+int sensor_2x5sp_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ return -ENODEV;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -ENODEV;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ fimc_is_sensor_read16(client, 0x0000, &data16);
+ pr_err("[SEN:DUMP] model_id(%x)\n", data16);
+ fimc_is_sensor_read8(client, 0x0002, &data8);
+ pr_err("[SEN:DUMP] revision_number(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0005, &data8);
+ pr_err("[SEN:DUMP] frame_count(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0100, &data8);
+ pr_err("[SEN:DUMP] mode_select(%x)\n", data8);
+
+ sensor_cis_dump_registers(subdev, sensor_2x5sp_setfiles[0], sensor_2x5sp_setfile_sizes[0]);
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_2x5sp_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_2x5sp_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_2x5sp_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_2x5sp_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_2x5sp_global, sensor_2x5sp_global_size);
+
+ if (ret < 0) {
+ err("sensor_3p8sp_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_2x5sp_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ return -EINVAL;
+ }
+
+ sensor_2x5sp_cis_data_calculation(sensor_2x5sp_pllinfos[mode], cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_2x5sp_setfiles[mode], sensor_2x5sp_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_2x5sp_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_mode_change_throttling(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ sensor_2x5sp_cis_data_calculation(sensor_2x5sp_pllinfo_throttling, cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_2x5sp_setfile_throttling,
+ sizeof(sensor_2x5sp_setfile_throttling) / sizeof(sensor_2x5sp_setfile_throttling[0]));
+ if (ret < 0) {
+ err("sensor_gm1sp_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] throttling mode changed\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+/* Deprecated */
+int sensor_2x5sp_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ return 0;
+}
+
+int sensor_2x5sp_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+#ifdef DEBUG_2X5SP_PLL
+ {
+ u16 pll;
+
+ fimc_is_sensor_read16(client, 0x0300, &pll);
+ dbg_sensor(1, "______ vt_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0302, &pll);
+ dbg_sensor(1, "______ vt_sys_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0304, &pll);
+ dbg_sensor(1, "______ pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0306, &pll);
+ dbg_sensor(1, "______ pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0308, &pll);
+ dbg_sensor(1, "______ op_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030a, &pll);
+ dbg_sensor(1, "______ op_sys_clk_div(%x)\n", pll);
+
+ fimc_is_sensor_read16(client, 0x030c, &pll);
+ dbg_sensor(1, "______ secnd_pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030e, &pll);
+ dbg_sensor(1, "______ secnd_pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0340, &pll);
+ dbg_sensor(1, "______ frame_length_lines(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0342, &pll);
+ dbg_sensor(1, "______ line_length_pck(%x)\n", pll);
+ }
+#endif
+
+ /* Sensor stream on */
+ fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream off");
+
+ /* Sensor stream off */
+ fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u16 middle_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u64 numerator;
+ u8 lte_shifter;
+ u32 multiple_ratio = 1;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d), middle(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count,
+ target_exposure->long_val, target_exposure->short_val, target_exposure->middle_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ lte_shifter = cis->long_term_mode.sen_strm_off_on_enable ?
+ GET_2X5SP_LTE_SHIFT_CNT(target_exposure->long_val) : 0;
+
+ /* In 24M remosaic mode, set 4 times of exposure val */
+ if (cis_data->sens_config_index_cur == SENSOR_2X5SP_5760X4320_24FPS) {
+ multiple_ratio = 4;
+ dbg_sensor(1, "[mod:d:%d] %s, Set 4 times of coarse_int for 24M mode\n", cis->id, __func__);
+ }
+
+ numerator = (u64)cis_data->pclk * target_exposure->long_val * multiple_ratio;
+ long_coarse_int = (numerator - min_fine_int)
+ /(1000 * 1000) / line_length_pck / (1 << lte_shifter);
+ numerator = (u64)cis_data->pclk * target_exposure->short_val * multiple_ratio;
+ short_coarse_int = (numerator - min_fine_int)
+ /(1000 * 1000) / line_length_pck / (1 << lte_shifter);
+ numerator = (u64)cis_data->pclk * target_exposure->middle_val * multiple_ratio;
+ middle_coarse_int = (numerator - min_fine_int)
+ /(1000 * 1000) / line_length_pck / (1 << lte_shifter);
+
+ /* 4FDSUM mode should be set half of coarse integration */
+ if (cis_data->sens_config_index_cur == SENSOR_2X5SP_2880X2160_30FPS
+ || cis_data->sens_config_index_cur == SENSOR_2X5SP_1920X1080_120FPS
+ || cis_data->sens_config_index_cur == SENSOR_2X5SP_1280X720_240FPS) {
+ long_coarse_int /= 2;
+ short_coarse_int /= 2;
+ middle_coarse_int /= 2;
+ }
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (middle_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), middle coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, middle_coarse_int, cis_data->max_coarse_integration_time);
+ middle_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (middle_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), middle coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, middle_coarse_int, cis_data->min_coarse_integration_time);
+ middle_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short exposure */
+ ret = fimc_is_sensor_write16(client, 0x0202, short_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long exposure */
+ if (cis_data->is_data.wdr_mode != CAMERA_WDR_OFF) {
+ ret = fimc_is_sensor_write16(client, 0x0226, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ ret = fimc_is_sensor_write16(client, 0x022C, middle_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d), line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, cis_data->sen_vsync_count, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x), coarse_int (L:%#x, S:%#x, M:%#x)\n",
+ cis->id, __func__, cis_data->sen_vsync_count, cis_data->frame_length_lines,
+ long_coarse_int, short_coarse_int, middle_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 multiple_ratio = 1;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* In 24M remosaic mode, set 4 times of max_coarse_integration_time */
+ if (cis_data->sens_config_index_cur == SENSOR_2X5SP_5760X4320_24FPS) {
+ multiple_ratio = 4;
+ dbg_sensor(1, "[mod:d:%d] %s, Set 4 times of coarse_int for 24M mode\n", cis->id, __func__);
+ }
+
+ /* TODO: Is this values update here? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse * multiple_ratio;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_2x5sp_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+ u64 numerator;
+ u8 lte_shifter;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ lte_shifter = cis->long_term_mode.sen_strm_off_on_enable ?
+ GET_2X5SP_LTE_SHIFT_CNT(input_exposure_time) : 0;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * input_exposure_time;
+ frame_length_lines = (u16)((numerator / (1000 * 1000))/ line_length_pck / (1 << lte_shifter));
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ numerator = (u64)frame_length_lines * line_length_pck;
+ frame_duration = (numerator << lte_shifter) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time,
+ frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+ u64 numerator;
+ u32 max_coarse_integration_time = 0;
+ u8 lte_shifter;
+ u32 multiple_ratio = 1;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ lte_shifter = cis->long_term_mode.sen_strm_off_on_enable ?
+ GET_2X5SP_LTE_SHIFT_CNT(frame_duration) : 0;
+
+ /* In 24M remosaic mode, set 4 times of frame_length_lines */
+ if (cis_data->sens_config_index_cur == SENSOR_2X5SP_5760X4320_24FPS) {
+ multiple_ratio = 4;
+ dbg_sensor(1, "[mod:d:%d] %s, Set 4 times of coarse_int for 24M mode\n", cis->id, __func__);
+ }
+
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * frame_duration * multiple_ratio;
+ frame_length_lines = (u16)((numerator / line_length_pck) / (1000 * 1000) / (1 << lte_shifter));
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, cis_data->pclk, frame_duration, line_length_pck, frame_length_lines);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+
+ max_coarse_integration_time = cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+ cis_data->max_coarse_integration_time = max_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_2x5sp_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ analog_gain = (u16)sensor_cis_calc_again_code(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->long_val, analog_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0204, analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_analog_gain[0] = 0x20;
+ cis_data->min_analog_gain[1] = sensor_cis_calc_again_permile(cis_data->min_analog_gain[0]);
+
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_analog_gain[0] = 0x200;
+ cis_data->max_analog_gain[1] = sensor_cis_calc_again_permile(cis_data->max_analog_gain[0]);
+
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u16 middle_gain = 0;
+ u16 dgains[4] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+ middle_gain = (u16)sensor_cis_calc_dgain_code(dgain->middle_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ if (middle_gain < cis->cis_data->min_digital_gain[0])
+ middle_gain = cis->cis_data->min_digital_gain[0];
+
+ if (middle_gain > cis->cis_data->max_digital_gain[0])
+ middle_gain = cis->cis_data->max_digital_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d/%d us, gain(L:%#x, S:%#x, M:%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, dgain->long_val,
+ dgain->short_val, dgain->middle_val, long_gain, short_gain, middle_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = short_gain;
+ /* Short digital gain */
+ ret = fimc_is_sensor_write16_array(client, 0x020E, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long & medium digital gain */
+ if (cis_data->is_data.wdr_mode != CAMERA_WDR_OFF) {
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = long_gain;
+ /* long digital gain */
+ ret = fimc_is_sensor_write16_array(client, 0x0230, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = middle_gain;
+ /* middle digital gain */
+ ret = fimc_is_sensor_write16_array(client, 0x0238, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+ }
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_digital_gain[0] = 0x100;
+ cis_data->min_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->min_digital_gain[0]);
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_digital_gain[0] = 0x8000;
+ cis_data->max_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->max_digital_gain[0]);
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_wb_gain(struct v4l2_subdev *subdev, struct wb_gains wb_gains)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ u16 abs_gains[4] = {0, }; /* [0]=gr, [1]=r, [2]=b, [3]=gb */
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ BUG_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ BUG_ON(!cis);
+ BUG_ON(!cis->cis_data);
+
+ if (!cis->use_wb_gain)
+ return ret;
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ dbg_sensor(1, "[SEN:%d]%s:DDK vlaue: wb_gain_gr(%d), wb_gain_r(%d), wb_gain_b(%d)\n",
+ cis->id, __func__, wb_gains.gr, wb_gains.r, wb_gains.b, wb_gains.gb);
+
+ if (wb_gains.gr == 0 || wb_gains.r == 0 || wb_gains.b == 0 || wb_gains.gb == 0)
+ return ret;
+
+ abs_gains[0] = (u16)((wb_gains.r / 4) & 0xFFFF);
+ abs_gains[1] = (u16)((wb_gains.gr / 4) & 0xFFFF);
+ abs_gains[2] = (u16)((wb_gains.b / 4) & 0xFFFF);
+
+ dbg_sensor(1, "[SEN:%d]%s, abs_gain_r(0x%4X), abs_gain_gr(0x%4X), abs_gain_b(0x%4X)\n",
+ cis->id, __func__, abs_gains[0], abs_gains[1], abs_gains[2]);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* 0x40000D12 ~ 0x400000D16: api_rw_color_temperature_absolute_gain_red/green/blue */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ ret |= fimc_is_sensor_write16_array(client, 0x0D12, abs_gains, 3);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_3hdr_roi(struct v4l2_subdev *subdev, struct roi_setting_t roi_control)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ u16 roi_val[4];
+ int i;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ BUG_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ BUG_ON(!cis);
+ BUG_ON(!cis->cis_data);
+
+ if (!cis->use_3hdr)
+ return ret;
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ dbg_sensor(1, "%s: [MOD:%d] roi_control (start_x:%d, start_y:%d, end_x:%d, end_y:%d)\n",
+ __func__, cis->id,
+ roi_control.roi_start_x, roi_control.roi_start_y,
+ roi_control.roi_end_x, roi_control.roi_end_y);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* 0x2000_XXXX */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* t_isp_rgby_hist_mem_cfg_active_window_percent_14bit */
+ roi_val[0] = roi_control.roi_start_x; /* 0x20004B26: top_left_x */
+ roi_val[1] = roi_control.roi_start_y; /* 0x20004B28: top_left_y */
+ roi_val[2] = roi_control.roi_end_x; /* 0x20004B2A: bot_right_x */
+ roi_val[3] = roi_control.roi_end_y; /* 0x20004B2C: bot_right_y */
+
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4B26);
+ for (i = 0; i < 4; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, roi_val[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* t_isp_rgby_hist_grid_grid & thstat_grid_area */
+ roi_val[0] = roi_control.roi_end_x - roi_control.roi_start_x; /* 0x20004BEE & 0x20004E44: width */
+ roi_val[1] = roi_control.roi_end_y - roi_control.roi_start_y; /* 0x20004BF0 & 0x20004E46: height */
+ roi_val[2] = (roi_control.roi_start_x + roi_control.roi_end_x) / 2; /* center_x */
+ roi_val[3] = (roi_control.roi_start_y + roi_control.roi_end_y) / 2; /* center_y */
+
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4BEE);
+ for (i = 0; i < 4; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, roi_val[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4E44);
+ for (i = 0; i < 2; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, roi_val[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* restore 0x4000_XXXX */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_2x5sp_cis_set_3hdr_stat(struct v4l2_subdev *subdev, bool streaming, void *data)
+{
+ int ret = 0;
+ int hold = 0;
+ int i;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ u16 weight[3];
+ u16 low_gate_thr, high_gate_thr;
+ struct roi_setting_t y_sum_roi;
+ struct sensor_lsi_3hdr_stat_control_mode_change mode_change_stat;
+ struct sensor_lsi_3hdr_stat_control_per_frame per_frame_stat;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!data);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ BUG_ON(!cis);
+ BUG_ON(!cis->cis_data);
+
+ if (!cis->use_3hdr)
+ return ret;
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ if (streaming) {
+ per_frame_stat = *(struct sensor_lsi_3hdr_stat_control_per_frame *)data;
+
+ weight[0] = per_frame_stat.r_weight;
+ weight[1] = per_frame_stat.g_weight;
+ weight[2] = per_frame_stat.b_weight;
+ } else {
+ mode_change_stat = *(struct sensor_lsi_3hdr_stat_control_mode_change *)data;
+
+ weight[0] = mode_change_stat.r_weight;
+ weight[1] = mode_change_stat.g_weight;
+ weight[2] = mode_change_stat.b_weight;
+
+ low_gate_thr = mode_change_stat.low_gate_thr;
+ high_gate_thr = mode_change_stat.high_gate_thr;
+
+ y_sum_roi = mode_change_stat.y_sum_roi;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* t_isp_rgby_hist_short_exp_weight */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4BBC);
+ for (i = 0; i < 3; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, weight[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* t_isp_rgby_hist_long_exp_weight */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4BCA);
+ for (i = 0; i < 3; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, weight[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* t_isp_rgby_hist_medium_exp_weight */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4BD8);
+ for (i = 0; i < 3; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, weight[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* t_isp_rgby_hist_mixed_exp_weight */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4BE6);
+ for (i = 0; i < 3; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, weight[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ /* t_isp_drc_thstat_rgb_weights */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4E2C);
+ for (i = 0; i < 3; i++) {
+ ret = fimc_is_sensor_write16(client, 0x6F12, weight[i]);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ if (!streaming) {
+ /* t_isp_drc_thstat_u_low_tresh_red */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4E1A);
+ ret = fimc_is_sensor_write16(client, 0x6F12, low_gate_thr);
+ if (ret < 0)
+ goto p_err;
+ /* t_isp_drc_thstat_u_high_tresh_red */
+ ret = fimc_is_sensor_write16(client, 0x6F12, high_gate_thr);
+ if (ret < 0)
+ goto p_err;
+
+ /* t_isp_drc_thstat_u_low_tresh_green */
+ ret = fimc_is_sensor_write16(client, 0x6F12, low_gate_thr);
+ if (ret < 0)
+ goto p_err;
+
+ /* t_isp_drc_thstat_u_high_tresh_green */
+ ret = fimc_is_sensor_write16(client, 0x6F12, high_gate_thr);
+ if (ret < 0)
+ goto p_err;
+
+ /* t_isp_drc_thstat_u_low_tresh_blue */
+ ret = fimc_is_sensor_write16(client, 0x6F12, low_gate_thr);
+ if (ret < 0)
+ goto p_err;
+
+ /* t_isp_drc_thstat_u_high_tresh_blue */
+ ret = fimc_is_sensor_write16(client, 0x6F12, high_gate_thr);
+ if (ret < 0)
+ goto p_err;
+
+ /* t_isp_y_sum_top_left_x */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x4E04);
+ ret = fimc_is_sensor_write16(client, 0x6F12, y_sum_roi.roi_start_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x6F12, y_sum_roi.roi_start_y);
+ if (ret < 0)
+ goto p_err;
+ } else {
+ /* update 3hdr motion stat */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2001);
+ if (ret < 0)
+ goto p_err;
+
+ ret |= fimc_is_sensor_write16(client, 0x602A, 0x29D8);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_indication);
+
+ ret |= fimc_is_sensor_write16(client, 0x602A, 0x2A52);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_high_end_ty2ty1);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_high_end_ty3ty2);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_high_start_ty2ty1);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_high_start_ty3ty2);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_low_end_ty2ty1);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_low_end_ty3ty2);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_low_start_ty2ty1);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_low_start_ty3ty2);
+
+ dbg_sensor(2, "[%s] motion idc(%d) high21(e:%d, s:%d), low21(e:%d, s:%d)\n",
+ __func__,
+ (u16)per_frame_stat.motion_indication,
+ (u16)per_frame_stat.motion_high_end_ty2ty1,
+ (u16)per_frame_stat.motion_high_start_ty2ty1,
+ (u16)per_frame_stat.motion_low_end_ty2ty1,
+ (u16)per_frame_stat.motion_low_start_ty2ty1);
+ dbg_sensor(2, "[%s] motion high32(e:%d, s:%d), low32(e:%d, s:%d)\n",
+ __func__,
+ (u16)per_frame_stat.motion_high_end_ty3ty2,
+ (u16)per_frame_stat.motion_high_start_ty3ty2,
+ (u16)per_frame_stat.motion_low_end_ty3ty2,
+ (u16)per_frame_stat.motion_low_start_ty3ty2);
+
+ ret |= fimc_is_sensor_write16(client, 0x602A, 0x2A68);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.decision_thresh_override);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_abs_high_ty3ty2);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_abs_low_ty3ty2);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_abs_high_ty2ty1);
+ ret |= fimc_is_sensor_write16(client, 0x6F12,
+ (u16)per_frame_stat.motion_abs_low_ty2ty1);
+
+ dbg_sensor(2, "[%s] motion DTO(%d), abs(h32:%d, l32:%d), abs(h21:%d, l21:%d)\n",
+ __func__,
+ (u16)per_frame_stat.decision_thresh_override,
+ (u16)per_frame_stat.motion_abs_high_ty3ty2,
+ (u16)per_frame_stat.motion_abs_low_ty3ty2,
+ (u16)per_frame_stat.motion_abs_high_ty2ty1,
+ (u16)per_frame_stat.motion_abs_low_ty2ty1);
+
+ }
+
+ /* restore 0x4000_XXXX */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_2x5sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+void sensor_2x5sp_cis_check_wdr_mode(struct v4l2_subdev *subdev, u32 mode_idx)
+{
+ struct fimc_is_cis *cis;
+
+ FIMC_BUG_VOID(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG_VOID(!cis);
+ FIMC_BUG_VOID(!cis->cis_data);
+
+ /* check wdr mode */
+ if (mode_idx == SENSOR_2X5SP_2880X2160_30FPS_3DHDR)
+ cis->cis_data->is_data.wdr_enable = true;
+ else
+ cis->cis_data->is_data.wdr_enable = false;
+
+ dbg_sensor(1, "[%s] wdr_enable: %d\n", __func__,
+ cis->cis_data->is_data.wdr_enable);
+}
+
+int sensor_2x5sp_cis_long_term_exposure(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct fimc_is_long_term_expo_mode *lte_mode;
+ u8 shift_count;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ lte_mode = &cis->long_term_mode;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* LTE mode or normal mode set */
+ if (lte_mode->sen_strm_off_on_enable) {
+ shift_count = GET_2X5SP_LTE_SHIFT_CNT(lte_mode->expo[0]);
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0702, shift_count);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0704, shift_count);
+ } else {
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0702, 0);
+ ret |= fimc_is_sensor_write8(cis->client, 0x0704, 0);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ info("%s enable(%d)", __func__, lte_mode->sen_strm_off_on_enable);
+
+ if (ret < 0) {
+ pr_err("ERR[%s]: LTE register setting fail\n", __func__);
+ return ret;
+ }
+
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_2x5sp_cis_init,
+ .cis_log_status = sensor_2x5sp_cis_log_status,
+ .cis_group_param_hold = sensor_2x5sp_cis_group_param_hold,
+ .cis_set_global_setting = sensor_2x5sp_cis_set_global_setting,
+ .cis_mode_change = sensor_2x5sp_cis_mode_change,
+ .cis_set_size = sensor_2x5sp_cis_set_size,
+ .cis_stream_on = sensor_2x5sp_cis_stream_on,
+ .cis_stream_off = sensor_2x5sp_cis_stream_off,
+ .cis_set_exposure_time = sensor_2x5sp_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_2x5sp_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_2x5sp_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_2x5sp_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_2x5sp_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_2x5sp_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_2x5sp_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_2x5sp_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_2x5sp_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_2x5sp_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_2x5sp_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_2x5sp_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_2x5sp_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_2x5sp_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_2x5sp_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_2x5sp_cis_check_rev,
+ .cis_factory_test = sensor_cis_factory_test,
+ .cis_set_wb_gains = sensor_2x5sp_cis_set_wb_gain,
+ .cis_set_roi_stat = sensor_2x5sp_cis_set_3hdr_roi,
+ .cis_set_3hdr_stat = sensor_2x5sp_cis_set_3hdr_stat,
+ .cis_check_wdr_mode = sensor_2x5sp_cis_check_wdr_mode,
+ .cis_set_long_term_exposure = sensor_2x5sp_cis_long_term_exposure,
+ .cis_mode_change_throttling = sensor_2x5sp_cis_mode_change_throttling,
+};
+
+static int cis_2x5sp_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0, i;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_S5K2X5SP);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_S5K2X5SP;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_GR_BG;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+ cis->use_wb_gain = true;
+ cis->use_3hdr = true;
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_2x5sp_global = sensor_2x5sp_setfile_A_Global;
+ sensor_2x5sp_global_size = ARRAY_SIZE(sensor_2x5sp_setfile_A_Global);
+ sensor_2x5sp_setfiles = sensor_2x5sp_setfiles_A;
+ sensor_2x5sp_setfile_sizes = sensor_2x5sp_setfile_A_sizes;
+ sensor_2x5sp_otp_initial = sensor_2x5sp_setfiles_A_otp_initial;
+ sensor_2x5sp_otp_initial_size = ARRAY_SIZE(sensor_2x5sp_setfiles_A_otp_initial);
+ sensor_2x5sp_pllinfos = sensor_2x5sp_pllinfos_A;
+ sensor_2x5sp_max_setfile_num = ARRAY_SIZE(sensor_2x5sp_setfiles_A);
+ } else if (strcmp(setfile, "setB") == 0) {
+ probe_info("%s setfile_B\n", __func__);
+ sensor_2x5sp_global = sensor_2x5sp_setfile_B_Global;
+ sensor_2x5sp_global_size = ARRAY_SIZE(sensor_2x5sp_setfile_B_Global);
+ sensor_2x5sp_setfiles = sensor_2x5sp_setfiles_B;
+ sensor_2x5sp_setfile_sizes = sensor_2x5sp_setfile_B_sizes;
+ sensor_2x5sp_otp_initial = sensor_2x5sp_setfiles_A_otp_initial;
+ sensor_2x5sp_otp_initial_size = ARRAY_SIZE(sensor_2x5sp_setfiles_A_otp_initial);
+ sensor_2x5sp_pllinfos = sensor_2x5sp_pllinfos_B;
+ sensor_2x5sp_max_setfile_num = ARRAY_SIZE(sensor_2x5sp_setfiles_B);
+
+ /* throttling setting */
+ sensor_2x5sp_setfile_throttling = sensor_2x5sp_setfile_B_2880x2160_15fps;
+ sensor_2x5sp_pllinfo_throttling = &sensor_2x5sp_pllinfo_B_2880x2160_15fps;
+ } else {
+ err("%s setfile index out of bound, take default (setfile_A)", __func__);
+ sensor_2x5sp_global = sensor_2x5sp_setfile_A_Global;
+ sensor_2x5sp_global_size = ARRAY_SIZE(sensor_2x5sp_setfile_A_Global);
+ sensor_2x5sp_setfiles = sensor_2x5sp_setfiles_A;
+ sensor_2x5sp_setfile_sizes = sensor_2x5sp_setfile_A_sizes;
+ sensor_2x5sp_pllinfos = sensor_2x5sp_pllinfos_A;
+ sensor_2x5sp_max_setfile_num = ARRAY_SIZE(sensor_2x5sp_setfiles_A);
+ }
+
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
+ device->use_otp_cal = of_property_read_bool(dnode, "use_otp_cal");
+ probe_info("%s use otp_cal(%d)\n", __func__, device->use_otp_cal);
+
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ device->cal_status[i] = CRC_NO_ERROR;
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_2x5sp_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-2x5sp",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_2x5sp_match);
+
+static const struct i2c_device_id sensor_cis_2x5sp_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_2x5sp_driver = {
+ .probe = cis_2x5sp_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_2x5sp_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_2x5sp_idt
+};
+
+static int __init sensor_cis_2x5sp_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_2x5sp_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_2x5sp_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_2x5sp_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_2X5SP_H
+#define FIMC_IS_CIS_2X5SP_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_2X5SP_MAX_WIDTH (5760)
+#define SENSOR_2X5SP_MAX_HEIGHT (4320)
+
+/* TODO: Check below values are valid */
+#define SENSOR_2X5SP_FINE_INTEGRATION_TIME_MIN 0x0
+#define SENSOR_2X5SP_FINE_INTEGRATION_TIME_MAX 0x0 /* Not used */
+#define SENSOR_2X5SP_COARSE_INTEGRATION_TIME_MIN 0x4
+#define SENSOR_2X5SP_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x4
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+/* OTP valies */
+#define OTP_DATA_PATH "/data/camera/2x5_otp_cal_data.bin"
+#define OTP_PAGE_CTRL 0x0A00
+#define OTP_PAGE_SELECT 0x0A02
+#define OTP_PAGE_BASE 0x0A04
+#define OTP_PAGE_START 0
+#define OTP_PAGE_END 255
+#define OTP_PAGE_SIZE 64
+
+#define OTP_AWB_LIMIT_OFFSET 28
+#define OTP_AWB_GOLDEN_OFFSET 40
+#define OTP_AWB_UNIT_OFFSET 54
+
+#define OTP_GRP1_AWB_CRC_START (254 * OTP_PAGE_SIZE)
+#define OTP_GRP1_AWB_CRC_SIZE (60)
+#define OTP_GRP1_LSC_XTC_CRC_START (163 * OTP_PAGE_SIZE + 8)
+#define OTP_GRP1_LSC_XTC_CRC_SIZE (2896)
+
+#define OTP_GRP2_AWB_CRC_START (255 * OTP_PAGE_SIZE)
+#define OTP_GRP2_AWB_CRC_SIZE (60)
+#define OTP_GRP2_LSC_XTC_CRC_START (208 * OTP_PAGE_SIZE + 24)
+#define OTP_GRP2_LSC_XTC_CRC_SIZE (2896)
+
+/* [shift value setting for 2X5SP]
+ * 1s: 2, 2s: 3, 4s: 4, 8s: 5, 16s: 6, 32s: 7
+ */
+#define GET_2X5SP_LTE_SHIFT_CNT(val) \
+ ({u8 shift_count = 1, shifter; \
+ if (val >= 1000000) { \
+ shifter = val / 1000000; \
+ while (shifter) { \
+ shifter /= 2; \
+ shift_count++; \
+ } \
+ } else { \
+ shift_count = 0; \
+ }; shift_count;})
+
+enum otp_group {
+ OTP_GROUP_ONE = 0x1,
+ OTP_GROUP_TWO = 0x2,
+ OTP_GROUP_MAX,
+};
+
+enum valid_check {
+ OTP_DATA_EMPTY = 0x00,
+ OTP_DATA_VALID = 0x40,
+ OTP_DATA_INVALID = 0xC0,
+};
+
+enum sensor_2x5sp_mode_enum {
+ SENSOR_2X5SP_2880X2160_30FPS = 0,
+ SENSOR_2X5SP_2880X2160_30FPS_3DHDR,
+ SENSOR_2X5SP_5760X4320_24FPS,
+ SENSOR_2X5SP_1920X1080_120FPS,
+ SENSOR_2X5SP_1280X720_240FPS,
+};
+
+#endif
+
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_3h1_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
if (of_property_read_string(dnode, "setfile", &setfile)) {
err("setfile index read fail(%d), take default setfile!!", ret);
setfile = "default";
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_3J1_SET_A_H
+#define FIMC_IS_CIS_3J1_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-3j1.h"
+
+/* 3J1 sensor setting version - S5K3J1S_EVT0_Ver_0.10_1800718_forVendor */
+/* Global setting */
+/* sensor_3j1_setfile_A_Global */
+
+/* Mode setting */
+/* MODE3 */
+/* 1: 3648 x 2736 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 2: 2736 x 2736 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 3: 3968 x 2232 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 4: 3968 x 1880 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 *//* 19:9 */
+/* 5: 1824 x 1368 @30fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 6: 1988 x 1120 @120.4fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* MODE2 */
+/* 7: 1988 x 1120 @240.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 8: 912 x 684 @120.4fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+
+const u32 sensor_3j1_setfile_A_Global[] = {
+ 0x0100, 0x0000, 0x02,
+ 0x6010, 0x0001, 0x02,
+ I2C_MODE_DELAY, 3000, 0x00, /* 3ms delay */
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x90C8, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0549, 0x02,
+ I2C_MODE_BURST_DATA, 0x0448, 0x02,
+ I2C_MODE_BURST_DATA, 0x054A, 0x02,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xBC06, 0x02,
+ I2C_MODE_BURST_DATA, 0x101A, 0x02,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xC006, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x65B8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x926C, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x6640, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xDA00, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x0646, 0x02,
+ I2C_MODE_BURST_DATA, 0x3A48, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0268, 0x02,
+ I2C_MODE_BURST_DATA, 0x140C, 0x02,
+ I2C_MODE_BURST_DATA, 0x97B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x79F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x7AF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x70F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x3148, 0x02,
+ I2C_MODE_BURST_DATA, 0xD0F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C05, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0F5, 0x02,
+ I2C_MODE_BURST_DATA, 0x805F, 0x02,
+ I2C_MODE_BURST_DATA, 0x09D9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x0088, 0x02,
+ I2C_MODE_BURST_DATA, 0x0028, 0x02,
+ I2C_MODE_BURST_DATA, 0x05D0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2E49, 0x02,
+ I2C_MODE_BURST_DATA, 0x0220, 0x02,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0201, 0x02,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1401, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF081, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x284C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0146, 0x02,
+ I2C_MODE_BURST_DATA, 0xD4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xEC05, 0x02,
+ I2C_MODE_BURST_DATA, 0x04F2, 0x02,
+ I2C_MODE_BURST_DATA, 0xEC54, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5FF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2068, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x61F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x64F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2168, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0x2060, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF84F, 0x02,
+ I2C_MODE_BURST_DATA, 0x8246, 0x02,
+ I2C_MODE_BURST_DATA, 0x1D48, 0x02,
+ I2C_MODE_BURST_DATA, 0x8846, 0x02,
+ I2C_MODE_BURST_DATA, 0x1646, 0x02,
+ I2C_MODE_BURST_DATA, 0x8168, 0x02,
+ I2C_MODE_BURST_DATA, 0x9946, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D0C, 0x02,
+ I2C_MODE_BURST_DATA, 0x8FB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A9C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x3CF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4B46, 0x02,
+ I2C_MODE_BURST_DATA, 0x3246, 0x02,
+ I2C_MODE_BURST_DATA, 0x4146, 0x02,
+ I2C_MODE_BURST_DATA, 0x5046, 0x02,
+ I2C_MODE_BURST_DATA, 0x0094, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4EF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2846, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x30F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1248, 0x02,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x4801, 0x02,
+ I2C_MODE_BURST_DATA, 0x4088, 0x02,
+ I2C_MODE_BURST_DATA, 0x201A, 0x02,
+ I2C_MODE_BURST_DATA, 0x401E, 0x02,
+ I2C_MODE_BURST_DATA, 0xC880, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF88F, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xC301, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x3EF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x084C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x8301, 0x02,
+ I2C_MODE_BURST_DATA, 0x2060, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x36F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x6B01, 0x02,
+ I2C_MODE_BURST_DATA, 0x6060, 0x02,
+ I2C_MODE_BURST_DATA, 0x0848, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2FF8, 0x02,
+ I2C_MODE_BURST_DATA, 0xA060, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x9260, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x6640, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD900, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0xB000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xEEAF, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xD86B, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x01F5, 0x02,
+ I2C_MODE_BURST_DATA, 0x49F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x417C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4EF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xAF6C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4DF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x835C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4DF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xB16C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4DF2, 0x02,
+ I2C_MODE_BURST_DATA, 0xC16C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x40F2, 0x02,
+ I2C_MODE_BURST_DATA, 0xF51C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4BF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x535C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x30A1, 0x02,
+ I2C_MODE_BURST_DATA, 0x01CB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0026, 0x02,
+ 0x602A, 0xD900, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x6F12, 0x0000, 0x02,
+};
+
+const u32 sensor_3j1_setfile_A_3648x2736_30fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0880, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0102, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0x6F12, 0x0408, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x02FD, 0x02,
+ 0x6F12, 0x22EF, 0x02,
+ 0x6F12, 0x00A5, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x48AA, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0300, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0637, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x03F1, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0A01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x0B30, 0x02,
+ 0x0342, 0x24A8, 0x02,
+ 0x0344, 0x0148, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x0348, 0x1DC7, 0x02,
+ 0x034A, 0x0AAF, 0x02,
+ 0x034C, 0x0E40, 0x02,
+ 0x034E, 0x0AB0, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0B02, 0x0103, 0x02,
+ 0x0B04, 0x0001, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0301, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0100, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x0048, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0005, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00E9, 0x02,
+ 0x030C, 0x0001, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x0000, 0x02,
+ 0x0B8E, 0x0000, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const u32 sensor_3j1_setfile_A_2736x2736_30fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0880, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0102, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0x6F12, 0x0408, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x02FD, 0x02,
+ 0x6F12, 0x22EF, 0x02,
+ 0x6F12, 0x00A5, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x48AA, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0300, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0637, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x03F1, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0A01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x0B30, 0x02,
+ 0x0342, 0x24A8, 0x02,
+ 0x0344, 0x04D8, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x0348, 0x1A37, 0x02,
+ 0x034A, 0x0AAF, 0x02,
+ 0x034C, 0x0AB0, 0x02,
+ 0x034E, 0x0AB0, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0B02, 0x0103, 0x02,
+ 0x0B04, 0x0001, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0301, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0100, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x00A0, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0005, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00E9, 0x02,
+ 0x030C, 0x0001, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x0000, 0x02,
+ 0x0B8E, 0x0000, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const u32 sensor_3j1_setfile_A_3968x2232_30fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0880, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0102, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0x6F12, 0x0408, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x02FD, 0x02,
+ 0x6F12, 0x22EF, 0x02,
+ 0x6F12, 0x00A5, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x48AA, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0300, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0637, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x03F1, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0A01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x0944, 0x02,
+ 0x0342, 0x2C40, 0x02,
+ 0x0344, 0x0008, 0x02,
+ 0x0346, 0x00F0, 0x02,
+ 0x0348, 0x1F07, 0x02,
+ 0x034A, 0x09B7, 0x02,
+ 0x034C, 0x0F80, 0x02,
+ 0x034E, 0x08B8, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0352, 0x000C, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0B02, 0x0103, 0x02,
+ 0x0B04, 0x0001, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0301, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0100, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x00F0, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0005, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00E9, 0x02,
+ 0x030C, 0x0001, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x000C, 0x02,
+ 0x0B8E, 0x08B8, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const u32 sensor_3j1_setfile_A_3968x1880_30fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0880, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0102, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0x6F12, 0x0408, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x02FD, 0x02,
+ 0x6F12, 0x22EF, 0x02,
+ 0x6F12, 0x00A5, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x48AA, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x6F12, 0x000D, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0300, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0637, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x03F1, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0A01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x080E, 0x02,
+ 0x0342, 0x32E8, 0x02,
+ 0x0344, 0x0008, 0x02,
+ 0x0346, 0x0190, 0x02,
+ 0x0348, 0x1F07, 0x02,
+ 0x034A, 0x0927, 0x02,
+ 0x034C, 0x0F80, 0x02,
+ 0x034E, 0x0758, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0352, 0x001C, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0B02, 0x0103, 0x02,
+ 0x0B04, 0x0001, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0301, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0100, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0005, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00E9, 0x02,
+ 0x030C, 0x0001, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x001C, 0x02,
+ 0x0B8E, 0x0758, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const u32 sensor_3j1_setfile_A_1824x1368_30fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0880, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0102, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0x6F12, 0x0408, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x00FD, 0x02,
+ 0x6F12, 0x22EF, 0x02,
+ 0x6F12, 0x00A5, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x488A, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0301, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0200, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0617, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x0582, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0E01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000E, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x0597, 0x02,
+ 0x0342, 0x4940, 0x02,
+ 0x0344, 0x0140, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x0348, 0x1DCF, 0x02,
+ 0x034A, 0x0AAF, 0x02,
+ 0x034C, 0x0720, 0x02,
+ 0x034E, 0x0558, 0x02,
+ 0x0350, 0x0002, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0900, 0x0122, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0B02, 0x0103, 0x02,
+ 0x0B04, 0x0001, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0301, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0100, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x0070, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x0304, 0x0004, 0x02,
+ 0x0306, 0x00D9, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x0000, 0x02,
+ 0x0B8E, 0x0000, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const u32 sensor_3j1_setfile_A_1988x1120_120fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0880, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0102, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D04, 0x02,
+ 0x6F12, 0x0408, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x00FD, 0x02,
+ 0x6F12, 0x22EF, 0x02,
+ 0x6F12, 0x00A5, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x488A, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0301, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0200, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0617, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x0582, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0E01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000E, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x04C6, 0x02,
+ 0x0342, 0x1568, 0x02,
+ 0x0344, 0x0000, 0x02,
+ 0x0346, 0x00F8, 0x02,
+ 0x0348, 0x1F0F, 0x02,
+ 0x034A, 0x09BF, 0x02,
+ 0x034C, 0x07C4, 0x02,
+ 0x034E, 0x0460, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0900, 0x0122, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0B02, 0x0103, 0x02,
+ 0x0B04, 0x0001, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0301, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0100, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x0020, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x0304, 0x0004, 0x02,
+ 0x0306, 0x00D9, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x0004, 0x02,
+ 0x0B8E, 0x0460, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const u32 sensor_3j1_setfile_A_1988x1120_240fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D08, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0C00, 0x02,
+ 0x6F12, 0x0480, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0702, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D08, 0x02,
+ 0x6F12, 0x0808, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x00FD, 0x02,
+ 0x6F12, 0x1157, 0x02,
+ 0x6F12, 0x0055, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x48AA, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x6F12, 0x002F, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0301, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0200, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0637, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x058D, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0E01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000E, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x04E3, 0x02,
+ 0x0342, 0x0A90, 0x02,
+ 0x0344, 0x0000, 0x02,
+ 0x0346, 0x00F8, 0x02,
+ 0x0348, 0x1F0F, 0x02,
+ 0x034A, 0x09BF, 0x02,
+ 0x034C, 0x07C4, 0x02,
+ 0x034E, 0x0460, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0900, 0x0242, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0B02, 0x0106, 0x02,
+ 0x0B04, 0x0101, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0000, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x0020, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00A4, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x0000, 0x02,
+ 0x0B8E, 0x0000, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const u32 sensor_3j1_setfile_A_912x684_120fps[] = {
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D08, 0x02,
+ 0xF462, 0x0015, 0x02,
+ 0xF464, 0x0016, 0x02,
+ 0xF466, 0x0013, 0x02,
+ 0xF46C, 0x0010, 0x02,
+ 0xF45C, 0x00FF, 0x02,
+ 0xF48A, 0x0020, 0x02,
+ 0x602A, 0x3BE8, 0x02,
+ 0x6F12, 0x0C00, 0x02,
+ 0x6F12, 0x0480, 0x02,
+ 0x602A, 0x3BD4, 0x02,
+ 0x6F12, 0x3005, 0x02,
+ 0x6F12, 0x0505, 0x02,
+ 0x602A, 0x3BD8, 0x02,
+ 0x6F12, 0x070C, 0x02,
+ 0x602A, 0x3BDE, 0x02,
+ 0x6F12, 0x0D0F, 0x02,
+ 0x602A, 0x3BE0, 0x02,
+ 0x6F12, 0x0701, 0x02,
+ 0x6F12, 0x0102, 0x02,
+ 0x602A, 0x3BEC, 0x02,
+ 0x6F12, 0x4D08, 0x02,
+ 0x6F12, 0x0808, 0x02,
+ 0x602A, 0x3BFA, 0x02,
+ 0x6F12, 0x19EC, 0x02,
+ 0x6F12, 0x00FD, 0x02,
+ 0x6F12, 0x1157, 0x02,
+ 0x6F12, 0x0055, 0x02,
+ 0x602A, 0x3D2E, 0x02,
+ 0x6F12, 0x000C, 0x02,
+ 0x602A, 0x3D28, 0x02,
+ 0x6F12, 0x488A, 0x02,
+ 0x602A, 0x3D2C, 0x02,
+ 0x6F12, 0x8007, 0x02,
+ 0x602A, 0x0E50, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E52, 0x02,
+ 0x6F12, 0x00FF, 0x02,
+ 0x602A, 0x0E56, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x0E5A, 0x02,
+ 0x6F12, 0x001B, 0x02,
+ 0x6F12, 0x171B, 0x02,
+ 0x6F12, 0xF46E, 0x02,
+ 0x602A, 0x27F4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x13B4, 0x02,
+ 0x6F12, 0x003C, 0x02,
+ 0x602A, 0x2806, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x13C6, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x602A, 0x2866, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x602A, 0x1426, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x286C, 0x02,
+ 0x6F12, 0x001A, 0x02,
+ 0x6F12, 0x0016, 0x02,
+ 0x602A, 0x142C, 0x02,
+ 0x6F12, 0x000A, 0x02,
+ 0x602A, 0x2872, 0x02,
+ 0x6F12, 0x001D, 0x02,
+ 0x6F12, 0x0017, 0x02,
+ 0x602A, 0x2B06, 0x02,
+ 0x6F12, 0x0053, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x16C6, 0x02,
+ 0x6F12, 0x0011, 0x02,
+ 0x602A, 0x2B0C, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x0047, 0x02,
+ 0x602A, 0x16CC, 0x02,
+ 0x6F12, 0x0032, 0x02,
+ 0x602A, 0x2B12, 0x02,
+ 0x6F12, 0x009B, 0x02,
+ 0x6F12, 0x004E, 0x02,
+ 0x602A, 0x2A52, 0x02,
+ 0x6F12, 0x0260, 0x02,
+ 0x6F12, 0x0197, 0x02,
+ 0x602A, 0x2A58, 0x02,
+ 0x6F12, 0x026B, 0x02,
+ 0x6F12, 0x01A2, 0x02,
+ 0x602A, 0x2A5E, 0x02,
+ 0x6F12, 0x0276, 0x02,
+ 0x6F12, 0x01AD, 0x02,
+ 0x602A, 0x2A64, 0x02,
+ 0x6F12, 0x0281, 0x02,
+ 0x6F12, 0x01B8, 0x02,
+ 0x602A, 0x2A6A, 0x02,
+ 0x6F12, 0x028C, 0x02,
+ 0x6F12, 0x01C3, 0x02,
+ 0x602A, 0x2A70, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x6F12, 0x01CE, 0x02,
+ 0x602A, 0x2A76, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x6F12, 0x01D9, 0x02,
+ 0x602A, 0x2A7C, 0x02,
+ 0x6F12, 0x02AD, 0x02,
+ 0x6F12, 0x01E4, 0x02,
+ 0x602A, 0x2A82, 0x02,
+ 0x6F12, 0x02B8, 0x02,
+ 0x6F12, 0x01EF, 0x02,
+ 0x602A, 0x2A88, 0x02,
+ 0x6F12, 0x02C3, 0x02,
+ 0x6F12, 0x0297, 0x02,
+ 0x602A, 0x2A8E, 0x02,
+ 0x6F12, 0x02CE, 0x02,
+ 0x6F12, 0x02A2, 0x02,
+ 0x602A, 0x2782, 0x02,
+ 0x6F12, 0x01E0, 0x02,
+ 0x602A, 0x2788, 0x02,
+ 0x6F12, 0x03C0, 0x02,
+ 0x602A, 0x27A0, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x2784, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x278A, 0x02,
+ 0x6F12, 0x03B8, 0x02,
+ 0x602A, 0x27A2, 0x02,
+ 0x6F12, 0x08C0, 0x02,
+ 0x602A, 0x1342, 0x02,
+ 0x6F12, 0x01EA, 0x02,
+ 0x602A, 0x1348, 0x02,
+ 0x6F12, 0x041A, 0x02,
+ 0x602A, 0x3D36, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3D32, 0x02,
+ 0x6F12, 0x0130, 0x02,
+ 0x6F12, 0x06C0, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3DC8, 0x02,
+ 0x6F12, 0x0064, 0x02,
+ 0x602A, 0x3DC6, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x3DC4, 0x02,
+ 0x6F12, 0x05A0, 0x02,
+ 0x602A, 0x3DCC, 0x02,
+ 0x6F12, 0x06E0, 0x02,
+ 0x602A, 0x3DC2, 0x02,
+ 0x6F12, 0x06DE, 0x02,
+ 0x602A, 0x3DCA, 0x02,
+ 0x6F12, 0x076C, 0x02,
+ 0x602A, 0x4C84, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x6F12, 0x0028, 0x02,
+ 0x602A, 0x4FC8, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3BC0, 0x02,
+ 0x6F12, 0x0301, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x42E0, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x3F92, 0x02,
+ 0x6F12, 0x049E, 0x02,
+ 0x602A, 0x3F6C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FA4, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3FDC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x3C04, 0x02,
+ 0x6F12, 0x0637, 0x02,
+ 0x602A, 0x11B0, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x11C2, 0x02,
+ 0x6F12, 0x0815, 0x02,
+ 0x602A, 0x5394, 0x02,
+ 0x6F12, 0x0003, 0x02,
+ 0x602A, 0x1336, 0x02,
+ 0x6F12, 0x0584, 0x02,
+ 0x602A, 0x1334, 0x02,
+ 0x6F12, 0x0E01, 0x02,
+ 0x602A, 0x0D9C, 0x02,
+ 0x6F12, 0x000E, 0x02,
+ 0x602A, 0x133A, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0E00, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0850, 0x0000, 0x02,
+ 0x0340, 0x02EA, 0x02,
+ 0x0342, 0x2318, 0x02,
+ 0x0344, 0x0140, 0x02,
+ 0x0346, 0x0004, 0x02,
+ 0x0348, 0x1DCF, 0x02,
+ 0x034A, 0x0AB3, 0x02,
+ 0x034C, 0x0390, 0x02,
+ 0x034E, 0x02AC, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0900, 0x0244, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0003, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0007, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0404, 0x2000, 0x02,
+ 0x0B02, 0x0106, 0x02,
+ 0x0B04, 0x0101, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x602A, 0x53B2, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x53BE, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x0116, 0x2B00, 0x02,
+ 0x0112, 0x0A0A, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x602A, 0x0EE4, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x602A, 0x0EE6, 0x02,
+ 0x6F12, 0x0004, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0B80, 0x0000, 0x02,
+ 0x0B84, 0x0201, 0x02,
+ 0x602A, 0x5A40, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5A42, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0EE2, 0x02,
+ 0x6F12, 0x0030, 0x02,
+ 0x602A, 0x0EC0, 0x02,
+ 0x6F12, 0x0101, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x0304, 0x0003, 0x02,
+ 0x0306, 0x00A3, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0310, 0x0116, 0x02,
+ 0x0312, 0x0001, 0x02,
+ 0x0812, 0x0A08, 0x02,
+ 0x0814, 0x1806, 0x02,
+ 0x080E, 0x0407, 0x02,
+ 0x0810, 0x0805, 0x02,
+ 0x0816, 0x0B00, 0x02,
+ 0x602A, 0x52EA, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x5208, 0x02,
+ 0x6F12, 0x0100, 0x02,
+ 0x602A, 0x520A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5214, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x521E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5228, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x5232, 0x02,
+ 0x6F12, 0x0066, 0x02,
+ 0x602A, 0x523C, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5246, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5250, 0x02,
+ 0x6F12, 0x0014, 0x02,
+ 0x602A, 0x525A, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x5264, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x526E, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5278, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x5282, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x528C, 0x02,
+ 0x6F12, 0x001E, 0x02,
+ 0x602A, 0x5296, 0x02,
+ 0x6F12, 0x0033, 0x02,
+ 0x602A, 0x530A, 0x02,
+ 0x6F12, 0x100C, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x6F12, 0x1014, 0x02,
+ 0x6F12, 0x101C, 0x02,
+ 0x6F12, 0x1028, 0x02,
+ 0x602A, 0x52F6, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x6F12, 0x1000, 0x02,
+ 0x0118, 0x0102, 0x02,
+ 0x0B8C, 0x0000, 0x02,
+ 0x0B8E, 0x0000, 0x02,
+ 0x6214, 0x7970, 0x02,
+ /*0x0100, 0x0100, 0x02,// Stream On*/
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_3648x2736_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 201930000*4,
+ 0x0B30,
+ 0x24A8,
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_2736x2736_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 201930000*4,
+ 0x0B30,
+ 0x24A8,
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_3968x2232_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 201930000*4,
+ 0x0944,
+ 0x2C40,
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_3968x1880_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 201930000*4,
+ 0x080E,
+ 0x32E8,
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_1824x1368_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 201500000*4,
+ 0x0597,
+ 0x4940,
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_1988x1120_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 201500000*4,
+ 0x04C6,
+ 0x1568,
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_1988x1120_240fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 203050000*4,
+ 0x04E3,
+ 0x0A90,
+};
+
+const struct sensor_pll_info_compact sensor_3j1_pllinfo_A_912x684_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1807000000,
+ 201810000*4,
+ 0x02EA,
+ 0x2318,
+};
+
+static const u32 *sensor_3j1_setfiles_A[] = {
+ sensor_3j1_setfile_A_3648x2736_30fps,
+ sensor_3j1_setfile_A_2736x2736_30fps,
+ sensor_3j1_setfile_A_3968x2232_30fps,
+ sensor_3j1_setfile_A_3968x1880_30fps,
+ sensor_3j1_setfile_A_1824x1368_30fps,
+ sensor_3j1_setfile_A_1988x1120_120fps,
+ sensor_3j1_setfile_A_1988x1120_240fps,
+ sensor_3j1_setfile_A_912x684_120fps,
+};
+
+static const u32 sensor_3j1_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_3j1_setfile_A_3648x2736_30fps),
+ ARRAY_SIZE(sensor_3j1_setfile_A_2736x2736_30fps),
+ ARRAY_SIZE(sensor_3j1_setfile_A_3968x2232_30fps),
+ ARRAY_SIZE(sensor_3j1_setfile_A_3968x1880_30fps),
+ ARRAY_SIZE(sensor_3j1_setfile_A_1824x1368_30fps),
+ ARRAY_SIZE(sensor_3j1_setfile_A_1988x1120_120fps),
+ ARRAY_SIZE(sensor_3j1_setfile_A_1988x1120_240fps),
+ ARRAY_SIZE(sensor_3j1_setfile_A_912x684_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_3j1_pllinfos_A[] = {
+ &sensor_3j1_pllinfo_A_3648x2736_30fps,
+ &sensor_3j1_pllinfo_A_2736x2736_30fps,
+ &sensor_3j1_pllinfo_A_3968x2232_30fps,
+ &sensor_3j1_pllinfo_A_3968x1880_30fps,
+ &sensor_3j1_pllinfo_A_1824x1368_30fps,
+ &sensor_3j1_pllinfo_A_1988x1120_120fps,
+ &sensor_3j1_pllinfo_A_1988x1120_240fps,
+ &sensor_3j1_pllinfo_A_912x684_120fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_3J1_SET_B_H
+#define FIMC_IS_CIS_3J1_SET_B_H
+#if 0
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-3j1.h"
+
+/* EXTCLK 26Mhz */
+const u32 sensor_3j1_setfile_B_2608x1960_30fps[] = {
+ 0x535A ,0xC700 ,0x02
+ ,0x5402 ,0x1500 ,0x02
+ ,0x5400 ,0x061D ,0x02
+ ,0x6102 ,0xC000 ,0x02
+ ,0x614C ,0x25AA ,0x02
+ ,0x614E ,0x25B8 ,0x02
+ ,0x618C ,0x08D4 ,0x02
+ ,0x618E ,0x08D6 ,0x02
+ ,0x6028 ,0x2000 ,0x02
+ ,0x602A ,0x0668 ,0x02
+ ,0x6F12 ,0x4010 ,0x02
+ ,0x602A ,0x11A8 ,0x02
+ ,0x6F12 ,0x3AF9 ,0x02
+ ,0x6F12 ,0x1410 ,0x02
+ ,0x6F12 ,0x39F9 ,0x02
+ ,0x6F12 ,0x1410 ,0x02
+ ,0x6028 ,0x2000 ,0x02
+ ,0x602A ,0x0524 ,0x02
+ ,0x6F12 ,0x0007 ,0x02
+ ,0x602A ,0x12BC ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x12C2 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x12CA ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1010 ,0x02
+ ,0x602A ,0x12FC ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x1302 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x130A ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1010 ,0x02
+ ,0x602A ,0x14B8 ,0x02
+ ,0x6F12 ,0x0101 ,0x02
+ ,0x602A ,0x14C0 ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x602A ,0x1488 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x602A ,0x1496 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x602A ,0x14A4 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x602A ,0x147A ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0x0002 ,0x02
+ ,0x6F12 ,0xFFFC ,0x02
+ ,0x602A ,0x0512 ,0x02
+ ,0x6F12 ,0x0111 ,0x02
+ ,0x602A ,0x14AC ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x327A ,0x0001 ,0x02
+ ,0x3282 ,0x000A ,0x02
+ ,0x3296 ,0x0418 ,0x02
+ ,0x32E0 ,0x0000 ,0x02
+ ,0x3286 ,0x9000 ,0x02
+ ,0x3298 ,0x4007 ,0x02
+ ,0x32AA ,0x0000 ,0x02
+ ,0x327C ,0x0400 ,0x02
+ ,0x328A ,0x0800 ,0x02
+ ,0x3284 ,0x3700 ,0x02
+ ,0x32A0 ,0x0320 ,0x02
+ ,0x32A2 ,0x1000 ,0x02
+ ,0x32A4 ,0x0C00 ,0x02
+ ,0x3204 ,0x000C ,0x02
+ ,0x3206 ,0x000B ,0x02
+ ,0x3208 ,0x0009 ,0x02
+ ,0x3210 ,0x0007 ,0x02
+ ,0x3212 ,0x0007 ,0x02
+ ,0x3218 ,0x031c ,0x02
+ ,0x321A ,0x3224 ,0x02
+ ,0x321C ,0x0700 ,0x02
+ ,0x321E ,0x0800 ,0x02
+ ,0x3220 ,0x1300 ,0x02
+ ,0x3226 ,0x525C ,0x02
+ ,0x3228 ,0x0304 ,0x02
+ ,0x0200 ,0x0408 ,0x02
+ ,0x5428 ,0x1A00 ,0x02
+ ,0x3412 ,0x65AA ,0x02
+ ,0x535E ,0x0132 ,0x02
+ ,0x5360 ,0xC800 ,0x02
+ ,0x0304 ,0x0006 ,0x02
+ ,0x0306 ,0x00A6 ,0x02
+ ,0x3300 ,0x0000 ,0x02
+ ,0x5362 ,0x0A00 ,0x02
+ ,0x5364 ,0x31A0 ,0x02
+ ,0x534E ,0x4910 ,0x02
+ ,0x5330 ,0xD403 ,0x02
+ ,0x0340 ,0x07F8 ,0x02
+ ,0x0342 ,0x0B68 ,0x02
+ ,0x0202 ,0x03FC ,0x02
+ ,0x021E ,0x03FC ,0x02
+ ,0x0344 ,0x0000 ,0x02
+ ,0x0346 ,0x0000 ,0x02
+ ,0x0348 ,0x0A2F ,0x02
+ ,0x034A ,0x07A7 ,0x02
+ ,0x034C ,0x0A30 ,0x02
+ ,0x034E ,0x07A8 ,0x02
+ ,0x0382 ,0x0001 ,0x02
+ ,0x0386 ,0x0001 ,0x02
+ ,0x3500 ,0x0022 ,0x02
+ ,0x3088 ,0x0000 ,0x02
+ ,0x0216 ,0x0100 ,0x02
+ ,0x5332 ,0x04 ,0x01
+ ,0x5333 ,0xE2 ,0x01
+ ,0x5080 ,0x0100 ,0x02
+};
+
+/* EXTCLK 26Mhz */
+const u32 sensor_3j1_setfile_B_1304x980_30fps[] = {
+ 0x535B, 0x00 , 0x01,
+ 0x5402, 0x15 , 0x01,
+ 0x5401, 0x1D , 0x01,
+ 0x6102, 0xC000, 0x02,
+ 0x614C, 0x25AA, 0x02,
+ 0x614E, 0x25B8, 0x02,
+ 0x618C, 0x08D4, 0x02,
+ 0x618E, 0x08D6, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x11A8, 0x02,
+ 0x6F12, 0x3AF9, 0x02,
+ 0x6F12, 0x1410, 0x02,
+ 0x6F12, 0x39F9, 0x02,
+ 0x6F12, 0x1410, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x12BC, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x12C2, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x12CA, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x602A, 0x12FC, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x1302, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x130A, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x602A, 0x14B8, 0x02,
+ 0x6F12, 0x01 , 0x01,
+ 0x602A, 0x14B9, 0x02,
+ 0x6F12, 0x01 , 0x01,
+ 0x602A, 0x14C0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x1488, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x602A, 0x1496, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x602A, 0x14A4, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x602A, 0x147A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0xFFFC, 0x02,
+ 0x602A, 0x0512, 0x02,
+ 0x6F12, 0x0111, 0x02,
+ 0x602A, 0x066A, 0x02,
+ 0x6F12, 0x4110, 0x02,
+ 0x602A, 0x14AC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0524, 0x02,
+ 0x6F12, 0x00 , 0x01,
+ 0x3285, 0x00 , 0x01,
+ 0x327A, 0x0001, 0x02,
+ 0x3283, 0x0A , 0x01,
+ 0x3297, 0x18 , 0x01,
+ 0x32E1, 0x00 , 0x01,
+ 0x3286, 0x9000, 0x02,
+ 0x3298, 0x40 , 0x01,
+ 0x32AA, 0x01 , 0x01,
+ 0x327C, 0x0400, 0x02,
+ 0x328A, 0x0800, 0x02,
+ 0x3284, 0x37 , 0x01,
+ 0x32A1, 0x20 , 0x01,
+ 0x32A2, 0x10 , 0x01,
+ 0x32A4, 0x0C , 0x01,
+ 0x3204, 0x000C, 0x02,
+ 0x3206, 0x000B, 0x02,
+ 0x3208, 0x0009, 0x02,
+ 0x3210, 0x0007, 0x02,
+ 0x3212, 0x0007, 0x02,
+ 0x0200, 0x0408, 0x02,
+ 0x3219, 0x1C , 0x01,
+ 0x321A, 0x32 , 0x01,
+ 0x321B, 0x24 , 0x01,
+ 0x321C, 0x07 , 0x01,
+ 0x321E, 0x08 , 0x01,
+ 0x3220, 0x13 , 0x01,
+ 0x3226, 0x52 , 0x01,
+ 0x3227, 0x5C , 0x01,
+ 0x3228, 0x03 , 0x01,
+ 0x0305, 0x0A , 0x01,
+ 0x0306, 0x01 , 0x01,
+ 0x0307, 0x15 , 0x01,
+ 0x5363, 0x00 , 0x01,
+ 0x5364, 0x31 , 0x01,
+ 0x5365, 0xD0 , 0x01,
+ 0x534E, 0x49 , 0x01,
+ 0x534F, 0x10 , 0x01,
+ 0x535F, 0x32 , 0x01,
+ 0x5360, 0xC8 , 0x01,
+ 0x3412, 0x65 , 0x01,
+ 0x3413, 0xAA , 0x01,
+ 0x5428, 0x1A , 0x01,
+ 0x0340, 0x0424, 0x02,
+ 0x0342, 0x1612, 0x02,
+ 0x021E, 0x03FC, 0x02,
+ 0x0344, 0x0000, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x0348, 0x0A2F, 0x02,
+ 0x034A, 0x07A7, 0x02,
+ 0x034C, 0x0518, 0x02,
+ 0x034E, 0x03D4, 0x02,
+ 0x3500, 0x01 , 0x01,
+ 0x3089, 0x01 , 0x01,
+ 0x0216, 0x01 , 0x01,
+ 0x5333, 0xE0 , 0x01,
+ 0x5080, 0x01 , 0x01,
+};
+
+/* EXTCLK 26Mhz */
+const u32 sensor_3j1_setfile_B_1304x980_15fps[] = {
+ 0x535B, 0x00 , 0x01,
+ 0x5402, 0x15 , 0x01,
+ 0x5401, 0x1D , 0x01,
+ 0x6102, 0xC000, 0x02,
+ 0x614C, 0x25AA, 0x02,
+ 0x614E, 0x25B8, 0x02,
+ 0x618C, 0x08D4, 0x02,
+ 0x618E, 0x08D6, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x11A8, 0x02,
+ 0x6F12, 0x3AF9, 0x02,
+ 0x6F12, 0x1410, 0x02,
+ 0x6F12, 0x39F9, 0x02,
+ 0x6F12, 0x1410, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x12BC, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x12C2, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x12CA, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x602A, 0x12FC, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x1302, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x130A, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x602A, 0x14B8, 0x02,
+ 0x6F12, 0x01 , 0x01,
+ 0x602A, 0x14B9, 0x02,
+ 0x6F12, 0x01 , 0x01,
+ 0x602A, 0x14C0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x1488, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x602A, 0x1496, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x602A, 0x14A4, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x602A, 0x147A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0xFFFC, 0x02,
+ 0x602A, 0x0512, 0x02,
+ 0x6F12, 0x0111, 0x02,
+ 0x602A, 0x066A, 0x02,
+ 0x6F12, 0x4110, 0x02,
+ 0x602A, 0x14AC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0524, 0x02,
+ 0x6F12, 0x00 , 0x01,
+ 0x3285, 0x00 , 0x01,
+ 0x327A, 0x0001, 0x02,
+ 0x3283, 0x0A , 0x01,
+ 0x3297, 0x18 , 0x01,
+ 0x32E1, 0x00 , 0x01,
+ 0x3286, 0x9000, 0x02,
+ 0x3298, 0x40 , 0x01,
+ 0x32AA, 0x01 , 0x01,
+ 0x327C, 0x0400, 0x02,
+ 0x328A, 0x0800, 0x02,
+ 0x3284, 0x37 , 0x01,
+ 0x32A1, 0x20 , 0x01,
+ 0x32A2, 0x10 , 0x01,
+ 0x32A4, 0x0C , 0x01,
+ 0x3204, 0x000C, 0x02,
+ 0x3206, 0x000B, 0x02,
+ 0x3208, 0x0009, 0x02,
+ 0x3210, 0x0007, 0x02,
+ 0x3212, 0x0007, 0x02,
+ 0x0200, 0x0408, 0x02,
+ 0x3219, 0x1C , 0x01,
+ 0x321A, 0x32 , 0x01,
+ 0x321B, 0x24 , 0x01,
+ 0x321C, 0x07 , 0x01,
+ 0x321E, 0x08 , 0x01,
+ 0x3220, 0x13 , 0x01,
+ 0x3226, 0x52 , 0x01,
+ 0x3227, 0x5C , 0x01,
+ 0x3228, 0x03 , 0x01,
+ 0x3301, 0x01 , 0x01,
+ 0x0305, 0x06 , 0x01,
+ 0x0307, 0x9E , 0x01,
+ 0x5363, 0x00 , 0x01,
+ 0x5364, 0x32 , 0x01,
+ 0x5365, 0x7A , 0x01,
+ 0x534E, 0x49 , 0x01,
+ 0x535F, 0x32 , 0x01,
+ 0x5360, 0xC8 , 0x01,
+ 0x3412, 0x65 , 0x01,
+ 0x3413, 0xAA , 0x01,
+ 0x5428, 0x1A , 0x01,
+ 0x534F, 0x10 , 0x01,
+ 0x0340, 0x07DA, 0x02,
+ 0x0342, 0x0B04, 0x02,
+ 0x021E, 0x03FC, 0x02,
+ 0x0344, 0x0000, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x0348, 0x0A2F, 0x02,
+ 0x034A, 0x07A7, 0x02,
+ 0x034C, 0x0518, 0x02,
+ 0x034E, 0x03D4, 0x02,
+ 0x3500, 0x01 , 0x01,
+ 0x3089, 0x01 , 0x01,
+ 0x0216, 0x01 , 0x01,
+ 0x5333, 0xE0 , 0x01,
+ 0x5080, 0x01 , 0x01,
+};
+
+/* EXTCLK 26Mhz */
+const u32 sensor_3j1_setfile_B_1304x980_7fps[] = {
+ 0x535B, 0x00 , 0x01,
+ 0x5402, 0x15 , 0x01,
+ 0x5401, 0x1D , 0x01,
+ 0x6102, 0xC000, 0x02,
+ 0x614C, 0x25AA, 0x02,
+ 0x614E, 0x25B8, 0x02,
+ 0x618C, 0x08D4, 0x02,
+ 0x618E, 0x08D6, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x11A8, 0x02,
+ 0x6F12, 0x3AF9, 0x02,
+ 0x6F12, 0x1410, 0x02,
+ 0x6F12, 0x39F9, 0x02,
+ 0x6F12, 0x1410, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x12BC, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x12C2, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x12CA, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x602A, 0x12FC, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x1302, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x602A, 0x130A, 0x02,
+ 0x6F12, 0x1020, 0x02,
+ 0x6F12, 0x1010, 0x02,
+ 0x602A, 0x14B8, 0x02,
+ 0x6F12, 0x01 , 0x01,
+ 0x602A, 0x14B9, 0x02,
+ 0x6F12, 0x01 , 0x01,
+ 0x602A, 0x14C0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0xFFDA, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x1488, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x602A, 0x1496, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x6F12, 0xFF80, 0x02,
+ 0x602A, 0x14A4, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x6F12, 0xFFC0, 0x02,
+ 0x602A, 0x147A, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x6F12, 0x0002, 0x02,
+ 0x6F12, 0xFFFC, 0x02,
+ 0x602A, 0x0512, 0x02,
+ 0x6F12, 0x0111, 0x02,
+ 0x602A, 0x066A, 0x02,
+ 0x6F12, 0x4110, 0x02,
+ 0x602A, 0x14AC, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x0524, 0x02,
+ 0x6F12, 0x00 , 0x01,
+ 0x3285, 0x00 , 0x01,
+ 0x327A, 0x0001, 0x02,
+ 0x3283, 0x0A , 0x01,
+ 0x3297, 0x18 , 0x01,
+ 0x32E1, 0x00 , 0x01,
+ 0x3286, 0x9000, 0x02,
+ 0x3298, 0x40 , 0x01,
+ 0x32AA, 0x01 , 0x01,
+ 0x327C, 0x0400, 0x02,
+ 0x328A, 0x0800, 0x02,
+ 0x3284, 0x37 , 0x01,
+ 0x32A1, 0x20 , 0x01,
+ 0x32A2, 0x10 , 0x01,
+ 0x32A4, 0x0C , 0x01,
+ 0x3204, 0x000C, 0x02,
+ 0x3206, 0x000B, 0x02,
+ 0x3208, 0x0009, 0x02,
+ 0x3210, 0x0007, 0x02,
+ 0x3212, 0x0007, 0x02,
+ 0x0200, 0x0408, 0x02,
+ 0x3219, 0x1C , 0x01,
+ 0x321A, 0x32 , 0x01,
+ 0x321B, 0x24 , 0x01,
+ 0x321C, 0x07 , 0x01,
+ 0x321E, 0x08 , 0x01,
+ 0x3220, 0x13 , 0x01,
+ 0x3226, 0x52 , 0x01,
+ 0x3227, 0x5C , 0x01,
+ 0x3228, 0x03 , 0x01,
+ 0x3301, 0x01 , 0x01,
+ 0x0305, 0x06 , 0x01,
+ 0x0307, 0x9E , 0x01,
+ 0x5363, 0x00 , 0x01,
+ 0x5364, 0x32 , 0x01,
+ 0x5365, 0x7A , 0x01,
+ 0x534E, 0x49 , 0x01,
+ 0x535F, 0x32 , 0x01,
+ 0x5360, 0xC8 , 0x01,
+ 0x3412, 0x65 , 0x01,
+ 0x3413, 0xAA , 0x01,
+ 0x5428, 0x1A , 0x01,
+ 0x534F, 0x10 , 0x01,
+ 0x0340, 0x10CC, 0x02,
+ 0x0342, 0x0B04, 0x02,
+ 0x021E, 0x03FC, 0x02,
+ 0x0344, 0x0000, 0x02,
+ 0x0346, 0x0000, 0x02,
+ 0x0348, 0x0A2F, 0x02,
+ 0x034A, 0x07A7, 0x02,
+ 0x034C, 0x0518, 0x02,
+ 0x034E, 0x03D4, 0x02,
+ 0x3500, 0x01 , 0x01,
+ 0x3089, 0x01 , 0x01,
+ 0x0216, 0x01 , 0x01,
+ 0x5333, 0xE0 , 0x01,
+ 0x5080, 0x01 , 0x01,
+};
+
+/* EXTCLK 26Mhz */
+const u32 sensor_3j1_setfile_B_652x488_112fps[] = {
+ 0x535A ,0xC700 ,0x02
+ ,0x5402 ,0x1500 ,0x02
+ ,0x5400 ,0x061D ,0x02
+ ,0x6102 ,0xC000 ,0x02
+ ,0x614C ,0x25AA ,0x02
+ ,0x614E ,0x25B8 ,0x02
+ ,0x618C ,0x08D4 ,0x02
+ ,0x618E ,0x08D6 ,0x02
+ ,0x6028 ,0x2000 ,0x02
+ ,0x602A ,0x066A ,0x02
+ ,0x6F12 ,0x4110 ,0x02
+ ,0x602A ,0x11A8 ,0x02
+ ,0x6F12 ,0x3AF9 ,0x02
+ ,0x6F12 ,0x1410 ,0x02
+ ,0x6F12 ,0x39F9 ,0x02
+ ,0x6F12 ,0x1410 ,0x02
+ ,0x6028 ,0x2000 ,0x02
+ ,0x602A ,0x0524 ,0x02
+ ,0x6F12 ,0x0007 ,0x02
+ ,0x602A ,0x12BC ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x12C2 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x12CA ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1010 ,0x02
+ ,0x602A ,0x12FC ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x1302 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x602A ,0x130A ,0x02
+ ,0x6F12 ,0x1020 ,0x02
+ ,0x6F12 ,0x1010 ,0x02
+ ,0x602A ,0x14B8 ,0x02
+ ,0x6F12 ,0x0101 ,0x02
+ ,0x602A ,0x14C0 ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0xFFDA ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x602A ,0x1488 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x602A ,0x1496 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x6F12 ,0xFF80 ,0x02
+ ,0x602A ,0x14A4 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x6F12 ,0xFFC0 ,0x02
+ ,0x602A ,0x147A ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x6F12 ,0x0002 ,0x02
+ ,0x6F12 ,0xFFFC ,0x02
+ ,0x602A ,0x0512 ,0x02
+ ,0x6F12 ,0x0111 ,0x02
+ ,0x602A ,0x14AC ,0x02
+ ,0x6F12 ,0x0000 ,0x02
+ ,0x327A ,0x0001 ,0x02
+ ,0x3282 ,0x000A ,0x02
+ ,0x3296 ,0x0418 ,0x02
+ ,0x32E0 ,0x0000 ,0x02
+ ,0x3286 ,0x9000 ,0x02
+ ,0x3298 ,0x4007 ,0x02
+ ,0x32AA ,0x0100 ,0x02
+ ,0x327C ,0x0400 ,0x02
+ ,0x328A ,0x0800 ,0x02
+ ,0x3284 ,0x3700 ,0x02
+ ,0x32A0 ,0x0320 ,0x02
+ ,0x32A2 ,0x1000 ,0x02
+ ,0x32A4 ,0x0C00 ,0x02
+ ,0x3204 ,0x000C ,0x02
+ ,0x3206 ,0x000B ,0x02
+ ,0x3208 ,0x0009 ,0x02
+ ,0x3210 ,0x0007 ,0x02
+ ,0x3212 ,0x0007 ,0x02
+ ,0x3218 ,0x031c ,0x02
+ ,0x321A ,0x3224 ,0x02
+ ,0x321C ,0x0700 ,0x02
+ ,0x321E ,0x0800 ,0x02
+ ,0x3220 ,0x1300 ,0x02
+ ,0x3226 ,0x525C ,0x02
+ ,0x3228 ,0x0304 ,0x02
+ ,0x0200 ,0x0408 ,0x02
+ ,0x5428 ,0x1A00 ,0x02
+ ,0x3412 ,0x65AA ,0x02
+ ,0x535E ,0x0132 ,0x02
+ ,0x5360 ,0xC800 ,0x02
+ ,0x0304 ,0x0006 ,0x02
+ ,0x0306 ,0x00A6 ,0x02
+ ,0x3300 ,0x0000 ,0x02
+ ,0x5362 ,0x0A00 ,0x02
+ ,0x5364 ,0x31A0 ,0x02
+ ,0x534E ,0x4910 ,0x02
+ ,0x5330 ,0xD403 ,0x02
+ ,0x0340 ,0x0238 ,0x02
+ ,0x0342 ,0x0B04 ,0x02
+ ,0x0202 ,0x01F4 ,0x02
+ ,0x021E ,0x01F4 ,0x02
+ ,0x0344 ,0x0000 ,0x02
+ ,0x0346 ,0x0000 ,0x02
+ ,0x0348 ,0x0A2F ,0x02
+ ,0x034A ,0x079F ,0x02
+ ,0x034C ,0x028C ,0x02
+ ,0x034E ,0x01E8 ,0x02
+ ,0x0382 ,0x0003 ,0x02
+ ,0x0386 ,0x0003 ,0x02
+ ,0x3500 ,0x0122 ,0x02
+ ,0x3088 ,0x0001 ,0x02
+ ,0x0216 ,0x0100 ,0x02
+ ,0x5332 ,0x04 ,0x01
+ ,0x5333 ,0xE2 ,0x01
+ ,0x5080 ,0x0100 ,0x02
+};
+
+const struct sensor_pll_info sensor_3j1_pllinfo_B_2608x1960_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x08, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x0303) */
+ 0x06, /* pre_pll_clk_div (0x0305) */
+ 0xA6, /* pll_multiplier (0x0307) */
+ 0x00, /* op_pix_clk_div (0x0309) */
+ 0x00, /* op_sys_clk_div (0x030B) */
+
+ 0x00, /* secnd_pre_pll_clk_div (0x030D) */
+ 0x00, /* secnd_pll_multiplier (0x030F) */
+ 0x07F8, /* frame_length_lines (0x0341) */
+ 0x0B68, /* line_length_pck (0x0343) */
+};
+
+const struct sensor_pll_info sensor_3j1_pllinfo_B_1304x980_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x08, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x0303) */
+ 0x06, /* pre_pll_clk_div (0x0305) */
+ 0xA6, /* pll_multiplier (0x0307) */
+ 0x00, /* op_pix_clk_div (0x0309) */
+ 0x00, /* op_sys_clk_div (0x030B) */
+
+ 0x00, /* secnd_pre_pll_clk_div (0x030D) */
+ 0x00, /* secnd_pll_multiplier (0x030F) */
+ 0x0424, /* frame_length_lines (0x0341) */
+ 0x1612, /* line_length_pck (0x0343) */
+};
+
+const struct sensor_pll_info sensor_3j1_pllinfo_B_1304x980_15fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x08, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x0303) */
+ 0x06, /* pre_pll_clk_div (0x0305) */
+ 0x9C, /* pll_multiplier (0x0307) */
+ 0x00, /* op_pix_clk_div (0x0309) */
+ 0x00, /* op_sys_clk_div (0x030B) */
+
+ 0x00, /* secnd_pre_pll_clk_div (0x030D) */
+ 0x00, /* secnd_pll_multiplier (0x030F) */
+ 0x07DA, /* frame_length_lines (0x0341) */
+ 0x0B04, /* line_length_pck (0x0343) */
+};
+
+const struct sensor_pll_info sensor_3j1_pllinfo_B_1304x980_7fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x08, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x0303) */
+ 0x06, /* pre_pll_clk_div (0x0305) */
+ 0x9C, /* pll_multiplier (0x0307) */
+ 0x00, /* op_pix_clk_div (0x0309) */
+ 0x00, /* op_sys_clk_div (0x030B) */
+
+ 0x00, /* secnd_pre_pll_clk_div (0x030D) */
+ 0x00, /* secnd_pll_multiplier (0x030F) */
+ 0x10CC, /* frame_length_lines (0x0341) */
+ 0x0B04, /* line_length_pck (0x0343) */
+};
+
+const struct sensor_pll_info sensor_3j1_pllinfo_B_652x488_112fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x08, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x0303) */
+ 0x06, /* pre_pll_clk_div (0x0305) */
+ 0xA6, /* pll_multiplier (0x0307) */
+ 0x00, /* op_pix_clk_div (0x0309) */
+ 0x00, /* op_sys_clk_div (0x030B) */
+
+ 0x00, /* secnd_pre_pll_clk_div (0x030D) */
+ 0x00, /* secnd_pll_multiplier (0x030F) */
+ 0x0238, /* frame_length_lines (0x0341) */
+ 0x0B04, /* line_length_pck (0x0343) */
+};
+
+static const u32 *sensor_3j1_setfiles_B[] = {
+ sensor_3j1_setfile_B_2608x1960_30fps,
+ sensor_3j1_setfile_B_652x488_112fps,
+ sensor_3j1_setfile_B_1304x980_30fps,
+ sensor_3j1_setfile_B_1304x980_15fps,
+ sensor_3j1_setfile_B_1304x980_7fps,
+};
+
+static const u32 sensor_3j1_setfile_B_sizes[] = {
+ sizeof(sensor_3j1_setfile_B_2608x1960_30fps) / sizeof(sensor_3j1_setfile_B_2608x1960_30fps[0]),
+ sizeof(sensor_3j1_setfile_B_652x488_112fps) / sizeof(sensor_3j1_setfile_B_652x488_112fps[0]),
+ sizeof(sensor_3j1_setfile_B_1304x980_30fps) / sizeof(sensor_3j1_setfile_B_1304x980_30fps[0]),
+ sizeof(sensor_3j1_setfile_B_1304x980_15fps) / sizeof(sensor_3j1_setfile_B_1304x980_15fps[0]),
+ sizeof(sensor_3j1_setfile_B_1304x980_7fps) / sizeof(sensor_3j1_setfile_B_1304x980_7fps[0]),
+};
+
+static const struct sensor_pll_info *sensor_3j1_pllinfos_B[] = {
+ &sensor_3j1_pllinfo_B_2608x1960_30fps,
+ &sensor_3j1_pllinfo_B_652x488_112fps,
+ &sensor_3j1_pllinfo_B_1304x980_30fps,
+ &sensor_3j1_pllinfo_B_1304x980_15fps,
+ &sensor_3j1_pllinfo_B_1304x980_7fps,
+};
+#endif
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-3j1.h"
+#include "fimc-is-vender.h"
+#include "fimc-is-cis-3j1-setA.h"
+#include "fimc-is-cis-3j1-setB.h"
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "S5K3J1"
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_3j1_global;
+static u32 sensor_3j1_global_size;
+static const u32 **sensor_3j1_setfiles;
+static const u32 *sensor_3j1_setfile_sizes;
+static const struct sensor_pll_info_compact **sensor_3j1_pllinfos;
+static u32 sensor_3j1_max_setfile_num;
+
+static bool sensor_3j1_cis_is_wdr_mode_on(cis_shared_data *cis_data)
+{
+//ToDo : WDR always off for bring-up
+#if 0
+ unsigned int mode = cis_data->sens_config_index_cur;
+
+ if (fimc_is_vender_wdr_mode_on(cis_data) &&
+ (mode == SENSOR_3J1_3648X2736_30FPS
+ || mode == SENSOR_3J1_2736X2736_30FPS
+ || mode == SENSOR_3J1_3968X2232_30FPS
+ || mode == SENSOR_3J1_3968X1928_30FPS))
+ return true;
+#endif
+ return false;
+}
+
+static void sensor_3j1_cis_data_calculation(const struct sensor_pll_info_compact *pll_info_compact, cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, max_fps = 0, frame_valid_us = 0;
+
+ FIMC_BUG_VOID(!pll_info_compact);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info_compact->pclk;
+
+ dbg_sensor(1, "ext_clock(%d), mipi_datarate(%d), pclk(%d)\n",
+ pll_info_compact->ext_clk, pll_info_compact->mipi_datarate, pll_info_compact->pclk);
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info_compact->frame_length_lines(%d) * pll_info_compact->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info_compact->frame_length_lines, pll_info_compact->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = (vt_pix_clk_hz * 10) / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = max_fps;
+ cis_data->frame_length_lines = pll_info_compact->frame_length_lines;
+ cis_data->line_length_pck = pll_info_compact->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_3J1_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = SENSOR_3J1_FINE_INTEGRATION_TIME_MAX;
+ cis_data->min_coarse_integration_time = SENSOR_3J1_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_3J1_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+static int sensor_3j1_wait_stream_off_status(cis_shared_data *cis_data)
+{
+ int ret = 0;
+ u32 timeout = 0;
+
+ FIMC_BUG(!cis_data);
+
+#define STREAM_OFF_WAIT_TIME 250
+ while (timeout < STREAM_OFF_WAIT_TIME) {
+ if (cis_data->is_active_area == false &&
+ cis_data->stream_on == false) {
+ }
+ timeout++;
+ }
+
+ if (timeout == STREAM_OFF_WAIT_TIME) {
+ pr_err("actual stream off wait timeout\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+/* CIS OPS */
+int sensor_3j1_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+ setinfo.param = NULL;
+ setinfo.return_value = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ warn("sensor_3j1_check_rev is fail when cis init, ret(%d)", ret);
+ cis->rev_flag = true;
+ goto p_err;
+ }
+
+ cis->cis_data->product_name = cis->id;
+ cis->cis_data->cur_width = SENSOR_3J1_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_3J1_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_3j1_cis_data_calculation(sensor_3j1_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3j1_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ pr_err("[SEN:DUMP] *******************************\n");
+ fimc_is_sensor_read16(client, 0x0000, &data16);
+ pr_err("[SEN:DUMP] model_id(%x)\n", data16);
+ fimc_is_sensor_read8(client, 0x0002, &data8);
+ pr_err("[SEN:DUMP] revision_number(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0005, &data8);
+ pr_err("[SEN:DUMP] frame_count(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0100, &data8);
+ pr_err("[SEN:DUMP] mode_select(%x)\n", data8);
+
+ sensor_cis_dump_registers(subdev, sensor_3j1_setfiles[0], sensor_3j1_setfile_sizes[0]);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+p_err:
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_3j1_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_3j1_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_3j1_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_3j1_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_3j1_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ /* setfile global setting is at camera entrance */
+ info("[%s] global setting enter\n", __func__);
+ ret = sensor_cis_set_registers(subdev, sensor_3j1_global, sensor_3j1_global_size);
+ if (ret < 0) {
+ err("sensor_3j1_set_registers fail!!");
+ goto p_err;
+ }
+ info("[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_3j1_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ device = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev);
+ if (unlikely(!device)) {
+ err("device sensor is null");
+ return -EINVAL;
+ }
+
+ sensor_peri = find_peri_by_cis_id(device, cis->id);
+ if (unlikely(!sensor_peri)) {
+ err("sensor peri is NULL");
+ return -EINVAL;
+ }
+
+ if (mode >= sensor_3j1_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* If check_rev fail when cis_init, one more check_rev in mode_change */
+ if (cis->rev_flag == true) {
+ cis->rev_flag = false;
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ err("sensor_3j1_check_rev is fail");
+ goto p_err;
+ }
+ }
+
+ sensor_3j1_cis_data_calculation(sensor_3j1_pllinfos[mode], cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_cis_set_registers(subdev, sensor_3j1_setfiles[mode], sensor_3j1_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_3j1_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+/* TODO: Sensor set size sequence(sensor done, sensor stop, 3AA done in FW case */
+int sensor_3j1_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ int ret = 0;
+ bool binning = false;
+ u32 ratio_w = 0, ratio_h = 0, start_x = 0, start_y = 0, end_x = 0, end_y = 0;
+ u32 even_x= 0, odd_x = 0, even_y = 0, odd_y = 0;
+ struct i2c_client *client = NULL;
+ struct fimc_is_cis *cis = NULL;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ if (unlikely(!cis_data)) {
+ err("cis data is NULL");
+ if (unlikely(!cis->cis_data)) {
+ ret = -EINVAL;
+ goto p_err;
+ } else {
+ cis_data = cis->cis_data;
+ }
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* Wait actual stream off */
+ ret = sensor_3j1_wait_stream_off_status(cis_data);
+ if (ret) {
+ err("Must stream off\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ binning = cis_data->binning;
+ if (binning) {
+ ratio_w = (SENSOR_3J1_MAX_WIDTH / cis_data->cur_width);
+ ratio_h = (SENSOR_3J1_MAX_HEIGHT / cis_data->cur_height);
+ } else {
+ ratio_w = 1;
+ ratio_h = 1;
+ }
+
+ if (((cis_data->cur_width * ratio_w) > SENSOR_3J1_MAX_WIDTH) ||
+ ((cis_data->cur_height * ratio_h) > SENSOR_3J1_MAX_HEIGHT)) {
+ err("Config max sensor size over~!!\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* 1. page_select */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* 2. pixel address region setting */
+ start_x = ((SENSOR_3J1_MAX_WIDTH - cis_data->cur_width * ratio_w) / 2) & (~0x1);
+ start_y = ((SENSOR_3J1_MAX_HEIGHT - cis_data->cur_height * ratio_h) / 2) & (~0x1);
+ end_x = start_x + (cis_data->cur_width * ratio_w - 1);
+ end_y = start_y + (cis_data->cur_height * ratio_h - 1);
+
+ if (!(end_x & (0x1)) || !(end_y & (0x1))) {
+ err("Sensor pixel end address must odd\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0344, start_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0346, start_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0348, end_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034A, end_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 3. output address setting */
+ ret = fimc_is_sensor_write16(client, 0x034C, cis_data->cur_width);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034E, cis_data->cur_height);
+ if (ret < 0)
+ goto p_err;
+
+ /* If not use to binning, sensor image should set only crop */
+ if (!binning) {
+ dbg_sensor(1, "Sensor size set is not binning\n");
+ goto p_err;
+ }
+
+ /* 4. sub sampling setting */
+ even_x = 1; /* 1: not use to even sampling */
+ even_y = 1;
+ odd_x = (ratio_w * 2) - even_x;
+ odd_y = (ratio_h * 2) - even_y;
+
+ ret = fimc_is_sensor_write16(client, 0x0380, even_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0382, odd_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0384, even_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0386, odd_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 5. binnig setting */
+ ret = fimc_is_sensor_write8(client, 0x0900, binning); /* 1: binning enable, 0: disable */
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write8(client, 0x0901, (ratio_w << 4) | ratio_h);
+ if (ret < 0)
+ goto p_err;
+
+ /* 6. scaling setting: but not use */
+ /* scaling_mode (0: No scaling, 1: Horizontal, 2: Full) */
+ ret = fimc_is_sensor_write16(client, 0x0400, 0x0000);
+ if (ret < 0)
+ goto p_err;
+ /* down_scale_m: 1 to 16 upwards (scale_n: 16(fixed))
+ down scale factor = down_scale_m / down_scale_n */
+ ret = fimc_is_sensor_write16(client, 0x0404, 0x0010);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_3j1_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ struct fimc_is_device_sensor *device;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ device = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev);
+ if (unlikely(!device)) {
+ err("device sensor is null");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+ msleep(8);
+ /* Sensor stream on */
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+
+ if (sensor_3j1_cis_is_wdr_mode_on(cis_data))
+ fimc_is_sensor_write8(client, 0x0216, 0x01);
+ else
+ fimc_is_sensor_write8(client, 0x0216, 0x00);
+
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_3j1_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream off");
+
+ /* Sensor stream off */
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_3j1_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk_freq_mhz (%d), line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int);
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int);
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int);
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int);
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, frame_length_lines(%#x), long_coarse_int %#x, short_coarse_int %#x\n",
+ cis->id, __func__, cis_data->frame_length_lines, long_coarse_int, short_coarse_int);
+
+ cis_data->cur_long_exposure_coarse = long_coarse_int;
+ cis_data->cur_short_exposure_coarse = short_coarse_int;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* WDR mode */
+ if (sensor_3j1_cis_is_wdr_mode_on(cis_data)) {
+ fimc_is_sensor_write16(client, 0x0216, 0x0100);
+ } else {
+ fimc_is_sensor_write16(client, 0x0216, 0x0000);
+ }
+
+ /* Short exposure */
+ ret = fimc_is_sensor_write16(client, 0x0202, short_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long exposure */
+ if (sensor_3j1_cis_is_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x021E, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_3j1_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3j1_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update hear? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time, cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3j1_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s] input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, input_exposure_time, frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s] adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_3j1_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+
+ frame_length_lines = (u16)((vt_pic_clk_freq_mhz * frame_duration) / line_length_pck);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk_freq_mhz(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, vt_pic_clk_freq_mhz, frame_duration,
+ line_length_pck, frame_length_lines);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+ cis_data->max_coarse_integration_time = cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_3j1_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_3j1_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+int sensor_3j1_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0]) {
+ again_code = cis_data->max_analog_gain[0];
+ } else if (again_code < cis_data->min_analog_gain[0]) {
+ again_code = cis_data->min_analog_gain[0];
+ }
+
+ again_permile = sensor_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_3j1_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 short_gain = 0;
+ u16 long_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ short_gain = (u16)sensor_cis_calc_again_code(again->short_val);
+ long_gain = (u16)sensor_cis_calc_again_code(again->long_val);
+
+ if (long_gain < cis->cis_data->min_analog_gain[0]) {
+ info("[%s] not proper long_gain value, reset to min_analog_gain\n", __func__);
+ long_gain = cis->cis_data->min_analog_gain[0];
+ }
+ if (long_gain > cis->cis_data->max_analog_gain[0]) {
+ info("[%s] not proper long_gain value, reset to max_analog_gain\n", __func__);
+ long_gain = cis->cis_data->max_analog_gain[0];
+ }
+
+ if (short_gain < cis->cis_data->min_analog_gain[0]) {
+ info("[%s] not proper short_gain value, reset to min_analog_gain\n", __func__);
+ short_gain = cis->cis_data->min_analog_gain[0];
+ }
+ if (short_gain > cis->cis_data->max_analog_gain[0]) {
+ info("[%s] not proper short_gain value, reset to max_analog_gain\n", __func__);
+ short_gain = cis->cis_data->max_analog_gain[0];
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d),"
+ KERN_CONT "input short gain = %d us, input long gain = %d us,"
+ KERN_CONT "analog short gain(%#x), analog short gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count,
+ again->short_val, again->long_val,
+ short_gain, long_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short analog gain */
+ ret = fimc_is_sensor_write16(client, 0x0204, short_gain);
+ if (ret < 0)
+ goto p_err;
+
+#if 0
+ /*
+ * 3j1 sensor have to setting a long analog gain
+ * This function check a sensor guide by sensor development team
+ */
+ /* Long analog gain */
+ ret = fimc_is_sensor_write16(client, 0x0220, long_gain);
+ if (ret < 0)
+ goto p_err;
+#endif
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_3j1_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_3j1_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ fimc_is_sensor_read16(client, 0x0084, &read_value);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->min_analog_gain[0] = read_value;
+
+ cis_data->min_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3j1_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ fimc_is_sensor_read16(client, 0x0086, &read_value);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->max_analog_gain[0] = read_value;
+
+ cis_data->max_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3j1_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0]) {
+ info("[%s] not proper long_gain value, reset to min_digital_gain\n", __func__);
+ long_gain = cis->cis_data->min_digital_gain[0];
+ }
+ if (long_gain > cis->cis_data->max_digital_gain[0]) {
+ info("[%s] not proper long_gain value, reset to max_digital_gain\n", __func__);
+ long_gain = cis->cis_data->max_digital_gain[0];
+ }
+
+ if (short_gain < cis->cis_data->min_digital_gain[0]) {
+ info("[%s] not proper short_gain value, reset to min_digital_gain\n", __func__);
+ short_gain = cis->cis_data->min_digital_gain[0];
+ }
+ if (short_gain > cis->cis_data->max_digital_gain[0]) {
+ info("[%s] not proper short_gain value, reset to max_digital_gain\n", __func__);
+ short_gain = cis->cis_data->max_digital_gain[0];
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, dgain->long_val, dgain->short_val, long_gain, short_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* DGain WDR Mode */
+ if (sensor_3j1_cis_is_wdr_mode_on(cis_data)) {
+ fimc_is_sensor_write16(client, 0x31E8, 0x0100);
+ } else {
+ fimc_is_sensor_write16(client, 0x31E8, 0x0000);
+ }
+
+ /* Short digital gain */
+ ret = fimc_is_sensor_write16(client, 0x020E, short_gain);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long digital gain */
+ if (sensor_3j1_cis_is_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x0C82, long_gain);
+ if (ret < 0)
+ goto p_err;
+ }
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_3j1_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3j1_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_3j1_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ fimc_is_sensor_read16(client, 0x1084, &read_value);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->min_digital_gain[0] = read_value;
+
+ cis_data->min_digital_gain[1] = sensor_cis_calc_dgain_permile(read_value);
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3j1_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ fimc_is_sensor_read16(client, 0x1086, &read_value);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->max_digital_gain[0] = read_value;
+
+ cis_data->max_digital_gain[1] = sensor_cis_calc_dgain_permile(read_value);
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_3j1_cis_init,
+ .cis_log_status = sensor_3j1_cis_log_status,
+ .cis_group_param_hold = sensor_3j1_cis_group_param_hold,
+ .cis_set_global_setting = sensor_3j1_cis_set_global_setting,
+ .cis_mode_change = sensor_3j1_cis_mode_change,
+ .cis_set_size = sensor_3j1_cis_set_size,
+ .cis_stream_on = sensor_3j1_cis_stream_on,
+ .cis_stream_off = sensor_3j1_cis_stream_off,
+ .cis_set_exposure_time = sensor_3j1_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_3j1_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_3j1_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_3j1_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_3j1_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_3j1_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_3j1_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_3j1_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_3j1_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_3j1_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_3j1_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_3j1_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_3j1_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_3j1_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_3j1_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_cis_wait_streamon,
+};
+
+static int cis_3j1_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id[FIMC_IS_STREAM_COUNT] = {0, };
+ u32 sensor_id_len;
+ const u32 *sensor_id_spec;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+ int i;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ sensor_id_spec = of_get_property(dnode, "id", &sensor_id_len);
+ if (!sensor_id_spec) {
+ err("sensor_id num read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ sensor_id_len /= (unsigned int)sizeof(*sensor_id_spec);
+
+ probe_info("%s sensor_id_spec %d, sensor_id_len %d\n", __func__,
+ *sensor_id_spec, sensor_id_len);
+
+ ret = of_property_read_u32_array(dnode, "id", sensor_id, sensor_id_len);
+ if (ret) {
+ err("sensor_id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ for (i = 0; i < sensor_id_len; i++) {
+ probe_info("%s sensor_id %d\n", __func__, sensor_id[i]);
+ device = &core->sensor[sensor_id[i]];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_S5K3J1);
+ if (!sensor_peri) {
+ probe_info("3J1 : sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+ }
+
+ for (i = 0; i < sensor_id_len; i++) {
+ device = &core->sensor[sensor_id[i]];
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_S5K3J1);
+
+ cis = &sensor_peri->cis;
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ probe_err("subdev_cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_S5K3J1;
+ cis->subdev = subdev_cis;
+ cis->device = sensor_id[i];
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->i2c_lock = NULL;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_GR_BG;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ if (of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num))
+ warn("f-number read is fail(%d)",ret);
+ } else {
+ cis->aperture_num = F1_9;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+ }
+
+ if (of_property_read_string(dnode, "setfile", &setfile)) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_3j1_global = sensor_3j1_setfile_A_Global;
+ sensor_3j1_global_size = ARRAY_SIZE(sensor_3j1_setfile_A_Global);
+ sensor_3j1_setfiles = sensor_3j1_setfiles_A;
+ sensor_3j1_setfile_sizes = sensor_3j1_setfile_A_sizes;
+ sensor_3j1_pllinfos = sensor_3j1_pllinfos_A;
+ sensor_3j1_max_setfile_num = ARRAY_SIZE(sensor_3j1_setfiles_A);
+ }
+#if 0
+ else if (strcmp(setfile, "setB") == 0) {
+ probe_info("%s setfile_B\n", __func__);
+ sensor_3j1_global = sensor_3j1_setfile_B_Global;
+ sensor_3j1_global_size = ARRAY_SIZE(sensor_3j1_setfile_B_Global);
+ sensor_3j1_setfiles = sensor_3j1_setfiles_B;
+ sensor_3j1_setfile_sizes = sensor_3j1_setfile_B_sizes;
+ sensor_3j1_pllinfos = sensor_3j1_pllinfos_B;
+ sensor_3j1_max_setfile_num = ARRAY_SIZE(sensor_3j1_setfiles_B);
+ }
+#endif
+ else {
+ err("%s setfile index out of bound, take default (setfile_A)", __func__);
+ sensor_3j1_global = sensor_3j1_setfile_A_Global;
+ sensor_3j1_global_size = ARRAY_SIZE(sensor_3j1_setfile_A_Global);
+ sensor_3j1_setfiles = sensor_3j1_setfiles_A;
+ sensor_3j1_setfile_sizes = sensor_3j1_setfile_A_sizes;
+ sensor_3j1_pllinfos = sensor_3j1_pllinfos_A;
+ sensor_3j1_max_setfile_num = ARRAY_SIZE(sensor_3j1_setfiles_A);
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_3j1_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-3j1",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_3j1_match);
+
+static const struct i2c_device_id sensor_cis_3j1_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_3j1_driver = {
+ .probe = cis_3j1_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_3j1_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_3j1_idt
+};
+
+static int __init sensor_cis_3j1_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_3j1_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_3j1_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_3j1_init);
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_3J1_H
+#define FIMC_IS_CIS_3J1_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+/* FIXME */
+#define SENSOR_3J1_MAX_WIDTH (3976 + 0)
+#define SENSOR_3J1_MAX_HEIGHT (2736 + 0)
+
+#define SENSOR_3J1_FINE_INTEGRATION_TIME_MIN 0x100
+#define SENSOR_3J1_FINE_INTEGRATION_TIME_MAX 0x100
+#define SENSOR_3J1_COARSE_INTEGRATION_TIME_MIN 0x2
+#define SENSOR_3J1_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x4
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+enum sensor_3j1_mode_enum {
+ SENSOR_3J1_3648X2736_30FPS = 0,
+ SENSOR_3J1_2736X2736_30FPS,
+ SENSOR_3J1_3968X2232_30FPS,
+ SENSOR_3J1_3968X1880_30FPS,
+ SENSOR_3J1_1824X1368_30FPS,
+ SENSOR_3J1_1988X1120_120FPS,
+ SENSOR_3J1_1988X1120_240FPS,
+ SENSOR_3J1_912X684_120FPS,
+};
+#endif
+
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_3l2_probe(struct i2c_client *client,
sensor_3l2_max_setfile_num = sizeof(sensor_3l2_setfiles_A) / sizeof(sensor_3l2_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_3m2_probe(struct i2c_client *client,
sensor_3m2_max_setfile_num = sizeof(sensor_3m2_setfiles_A) / sizeof(sensor_3m2_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
#include "fimc-is-cis.h"
#include "fimc-is-cis-3m3.h"
-/* S5K3M3SM_EVT0.1_Ver_1.3_20170920.xlsx */
+/* S5K3M3SM_EVT0.1_Ver_2.0_20180724 */
const u32 sensor_3m3_setfile_A_Global[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6010, 0x0001, 0x02,
- I2C_MODE_DELAY, 3000, 0x00, /* 3ms delay */
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x6004, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x30EC, 0x02,
- I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x0449, 0x02,
- I2C_MODE_BURST_DATA, 0x0348, 0x02,
- I2C_MODE_BURST_DATA, 0x044A, 0x02,
- I2C_MODE_BURST_DATA, 0x0860, 0x02,
- I2C_MODE_BURST_DATA, 0x101A, 0x02,
- I2C_MODE_BURST_DATA, 0x8880, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x5CB9, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0x3444, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0x1E80, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0x4C00, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0xF0B5, 0x02,
- I2C_MODE_BURST_DATA, 0x5E88, 0x02,
- I2C_MODE_BURST_DATA, 0x1F89, 0x02,
- I2C_MODE_BURST_DATA, 0x9D88, 0x02,
- I2C_MODE_BURST_DATA, 0xF419, 0x02,
- I2C_MODE_BURST_DATA, 0x641B, 0x02,
- I2C_MODE_BURST_DATA, 0x25B2, 0x02,
- I2C_MODE_BURST_DATA, 0x1C88, 0x02,
- I2C_MODE_BURST_DATA, 0x002D, 0x02,
- I2C_MODE_BURST_DATA, 0x01DC, 0x02,
- I2C_MODE_BURST_DATA, 0x7D1B, 0x02,
- I2C_MODE_BURST_DATA, 0x08E0, 0x02,
- I2C_MODE_BURST_DATA, 0x6D1E, 0x02,
- I2C_MODE_BURST_DATA, 0x2544, 0x02,
- I2C_MODE_BURST_DATA, 0x95FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF4FC, 0x02,
- I2C_MODE_BURST_DATA, 0x04FB, 0x02,
- I2C_MODE_BURST_DATA, 0x1C55, 0x02,
- I2C_MODE_BURST_DATA, 0x2744, 0x02,
- I2C_MODE_BURST_DATA, 0x7D1B, 0x02,
- I2C_MODE_BURST_DATA, 0x6D1E, 0x02,
- I2C_MODE_BURST_DATA, 0x5F89, 0x02,
- I2C_MODE_BURST_DATA, 0xB3F8, 0x02,
- I2C_MODE_BURST_DATA, 0x06C0, 0x02,
- I2C_MODE_BURST_DATA, 0x3744, 0x02,
- I2C_MODE_BURST_DATA, 0xADB2, 0x02,
- I2C_MODE_BURST_DATA, 0x6745, 0x02,
- I2C_MODE_BURST_DATA, 0x00D3, 0x02,
- I2C_MODE_BURST_DATA, 0x6746, 0x02,
- I2C_MODE_BURST_DATA, 0x2E44, 0x02,
- I2C_MODE_BURST_DATA, 0xBE1B, 0x02,
- I2C_MODE_BURST_DATA, 0xB6B2, 0x02,
- I2C_MODE_BURST_DATA, 0xB6FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF4F4, 0x02,
- I2C_MODE_BURST_DATA, 0x0580, 0x02,
- I2C_MODE_BURST_DATA, 0x1888, 0x02,
- I2C_MODE_BURST_DATA, 0x04FB, 0x02,
- I2C_MODE_BURST_DATA, 0x0050, 0x02,
- I2C_MODE_BURST_DATA, 0x0880, 0x02,
- I2C_MODE_BURST_DATA, 0x1480, 0x02,
- I2C_MODE_BURST_DATA, 0xF0BD, 0x02,
- I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
- I2C_MODE_BURST_DATA, 0xF043, 0x02,
- I2C_MODE_BURST_DATA, 0x0446, 0x02,
- I2C_MODE_BURST_DATA, 0x9C48, 0x02,
- I2C_MODE_BURST_DATA, 0x1646, 0x02,
- I2C_MODE_BURST_DATA, 0x0D46, 0x02,
- I2C_MODE_BURST_DATA, 0x0068, 0x02,
- I2C_MODE_BURST_DATA, 0x85B0, 0x02,
- I2C_MODE_BURST_DATA, 0x87B2, 0x02,
- I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
- I2C_MODE_BURST_DATA, 0x1048, 0x02,
- I2C_MODE_BURST_DATA, 0x0022, 0x02,
- I2C_MODE_BURST_DATA, 0x3946, 0x02,
- I2C_MODE_BURST_DATA, 0x4046, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x39F9, 0x02,
- I2C_MODE_BURST_DATA, 0x3246, 0x02,
- I2C_MODE_BURST_DATA, 0x2946, 0x02,
- I2C_MODE_BURST_DATA, 0x2046, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x39F9, 0x02,
- I2C_MODE_BURST_DATA, 0x0122, 0x02,
- I2C_MODE_BURST_DATA, 0x3946, 0x02,
- I2C_MODE_BURST_DATA, 0x4046, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x2FF9, 0x02,
- I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
- I2C_MODE_BURST_DATA, 0x4892, 0x02,
- I2C_MODE_BURST_DATA, 0xB9F8, 0x02,
- I2C_MODE_BURST_DATA, 0x5C00, 0x02,
- I2C_MODE_BURST_DATA, 0x0028, 0x02,
- I2C_MODE_BURST_DATA, 0x7ED0, 0x02,
- I2C_MODE_BURST_DATA, 0x0027, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0070, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6C00, 0x02,
- I2C_MODE_BURST_DATA, 0x0028, 0x02,
- I2C_MODE_BURST_DATA, 0x2088, 0x02,
- I2C_MODE_BURST_DATA, 0x07D0, 0x02,
- I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6410, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6820, 0x02,
- I2C_MODE_BURST_DATA, 0x01FB, 0x02,
- I2C_MODE_BURST_DATA, 0x0200, 0x02,
- I2C_MODE_BURST_DATA, 0xC0F5, 0x02,
- I2C_MODE_BURST_DATA, 0x8450, 0x02,
- I2C_MODE_BURST_DATA, 0x80B2, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0A00, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6910, 0x02,
- I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
- I2C_MODE_BURST_DATA, 0x4008, 0x02,
- I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0A00, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6900, 0x02,
- I2C_MODE_BURST_DATA, 0x02AB, 0x02,
- I2C_MODE_BURST_DATA, 0xB8FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF0F1, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0810, 0x02,
- I2C_MODE_BURST_DATA, 0x6021, 0x02,
- I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0C00, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6900, 0x02,
- I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
- I2C_MODE_BURST_DATA, 0x8151, 0x02,
- I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0E00, 0x02,
- I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
- I2C_MODE_BURST_DATA, 0x9E10, 0x02,
- I2C_MODE_BURST_DATA, 0x7089, 0x02,
- I2C_MODE_BURST_DATA, 0x0909, 0x02,
- I2C_MODE_BURST_DATA, 0x4843, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x1200, 0x02,
- I2C_MODE_BURST_DATA, 0x3088, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x1000, 0x02,
- I2C_MODE_BURST_DATA, 0x05F1, 0x02,
- I2C_MODE_BURST_DATA, 0x1E01, 0x02,
- I2C_MODE_BURST_DATA, 0x6A46, 0x02,
- I2C_MODE_BURST_DATA, 0x881E, 0x02,
- I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
- I2C_MODE_BURST_DATA, 0x78FF, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x7E21, 0x02,
- I2C_MODE_BURST_DATA, 0xB1EB, 0x02,
- I2C_MODE_BURST_DATA, 0x400F, 0x02,
- I2C_MODE_BURST_DATA, 0x01D2, 0x02,
- I2C_MODE_BURST_DATA, 0x7E20, 0x02,
- I2C_MODE_BURST_DATA, 0x00E0, 0x02,
- I2C_MODE_BURST_DATA, 0x4000, 0x02,
- I2C_MODE_BURST_DATA, 0x80B2, 0x02,
- I2C_MODE_BURST_DATA, 0x0C21, 0x02,
- I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF1F2, 0x02,
- I2C_MODE_BURST_DATA, 0x2881, 0x02,
- I2C_MODE_BURST_DATA, 0x6A81, 0x02,
- I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF1F2, 0x02,
- I2C_MODE_BURST_DATA, 0x01FB, 0x02,
- I2C_MODE_BURST_DATA, 0x1200, 0x02,
- I2C_MODE_BURST_DATA, 0xA881, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0470, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6D00, 0x02,
- I2C_MODE_BURST_DATA, 0x0028, 0x02,
- I2C_MODE_BURST_DATA, 0x6088, 0x02,
- I2C_MODE_BURST_DATA, 0x07D0, 0x02,
- I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6610, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6A20, 0x02,
- I2C_MODE_BURST_DATA, 0x01FB, 0x02,
- I2C_MODE_BURST_DATA, 0x0200, 0x02,
- I2C_MODE_BURST_DATA, 0xC0F5, 0x02,
- I2C_MODE_BURST_DATA, 0x4460, 0x02,
- I2C_MODE_BURST_DATA, 0x80B2, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0A00, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6B10, 0x02,
- I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0A00, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6B00, 0x02,
- I2C_MODE_BURST_DATA, 0xB8FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF0F1, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0810, 0x02,
- I2C_MODE_BURST_DATA, 0x2021, 0x02,
- I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0C00, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6B10, 0x02,
- I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
- I2C_MODE_BURST_DATA, 0x4268, 0x02,
- I2C_MODE_BURST_DATA, 0xB8FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0E00, 0x02,
- I2C_MODE_BURST_DATA, 0x00E0, 0x02,
- I2C_MODE_BURST_DATA, 0x57E0, 0x02,
- I2C_MODE_BURST_DATA, 0xB089, 0x02,
- I2C_MODE_BURST_DATA, 0x718A, 0x02,
- I2C_MODE_BURST_DATA, 0x4F4F, 0x02,
- I2C_MODE_BURST_DATA, 0x401A, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x1200, 0x02,
- I2C_MODE_BURST_DATA, 0x7088, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0xB210, 0x02,
- I2C_MODE_BURST_DATA, 0x02AB, 0x02,
- I2C_MODE_BURST_DATA, 0x401A, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x1000, 0x02,
- I2C_MODE_BURST_DATA, 0x6A46, 0x02,
- I2C_MODE_BURST_DATA, 0x01A9, 0x02,
- I2C_MODE_BURST_DATA, 0xB81C, 0x02,
- I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
- I2C_MODE_BURST_DATA, 0x25FF, 0x02,
- I2C_MODE_BURST_DATA, 0xB9F8, 0x02,
- I2C_MODE_BURST_DATA, 0x5E00, 0x02,
- I2C_MODE_BURST_DATA, 0xB8B1, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6D00, 0x02,
- I2C_MODE_BURST_DATA, 0x90B9, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0A10, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x1200, 0x02,
- I2C_MODE_BURST_DATA, 0x0144, 0x02,
- I2C_MODE_BURST_DATA, 0x4145, 0x02,
- I2C_MODE_BURST_DATA, 0x0BD8, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x1010, 0x02,
- I2C_MODE_BURST_DATA, 0x0844, 0x02,
- I2C_MODE_BURST_DATA, 0x7988, 0x02,
- I2C_MODE_BURST_DATA, 0x401A, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0810, 0x02,
- I2C_MODE_BURST_DATA, 0x90FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF1F2, 0x02,
- I2C_MODE_BURST_DATA, 0x01FB, 0x02,
- I2C_MODE_BURST_DATA, 0x1200, 0x02,
- I2C_MODE_BURST_DATA, 0x70B1, 0x02,
- I2C_MODE_BURST_DATA, 0x0020, 0x02,
- I2C_MODE_BURST_DATA, 0xB880, 0x02,
- I2C_MODE_BURST_DATA, 0x7888, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x9210, 0x02,
- I2C_MODE_BURST_DATA, 0x0844, 0x02,
- I2C_MODE_BURST_DATA, 0xE882, 0x02,
- I2C_MODE_BURST_DATA, 0xB888, 0x02,
- I2C_MODE_BURST_DATA, 0x38B1, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0800, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0410, 0x02,
- I2C_MODE_BURST_DATA, 0x081A, 0x02,
- I2C_MODE_BURST_DATA, 0x03E0, 0x02,
- I2C_MODE_BURST_DATA, 0x0120, 0x02,
- I2C_MODE_BURST_DATA, 0xEFE7, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0400, 0x02,
- I2C_MODE_BURST_DATA, 0x80B2, 0x02,
- I2C_MODE_BURST_DATA, 0xADF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0400, 0x02,
- I2C_MODE_BURST_DATA, 0x94F8, 0x02,
- I2C_MODE_BURST_DATA, 0x9210, 0x02,
- I2C_MODE_BURST_DATA, 0x0144, 0x02,
- I2C_MODE_BURST_DATA, 0x2983, 0x02,
- I2C_MODE_BURST_DATA, 0x6988, 0x02,
- I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
- I2C_MODE_BURST_DATA, 0x0C20, 0x02,
- I2C_MODE_BURST_DATA, 0x9142, 0x02,
- I2C_MODE_BURST_DATA, 0x04D9, 0x02,
- I2C_MODE_BURST_DATA, 0xE980, 0x02,
- I2C_MODE_BURST_DATA, 0x7A88, 0x02,
- I2C_MODE_BURST_DATA, 0x1144, 0x02,
- I2C_MODE_BURST_DATA, 0xE980, 0x02,
- I2C_MODE_BURST_DATA, 0x00E0, 0x02,
- I2C_MODE_BURST_DATA, 0xEA80, 0x02,
- I2C_MODE_BURST_DATA, 0xE988, 0x02,
- I2C_MODE_BURST_DATA, 0x728A, 0x02,
- I2C_MODE_BURST_DATA, 0x1144, 0x02,
- I2C_MODE_BURST_DATA, 0xE980, 0x02,
- I2C_MODE_BURST_DATA, 0x7A88, 0x02,
- I2C_MODE_BURST_DATA, 0x801A, 0x02,
- I2C_MODE_BURST_DATA, 0x0844, 0x02,
- I2C_MODE_BURST_DATA, 0xA880, 0x02,
- I2C_MODE_BURST_DATA, 0x05B0, 0x02,
- I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
- I2C_MODE_BURST_DATA, 0xF083, 0x02,
- I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
- I2C_MODE_BURST_DATA, 0xF041, 0x02,
- I2C_MODE_BURST_DATA, 0x8046, 0x02,
- I2C_MODE_BURST_DATA, 0x1F48, 0x02,
- I2C_MODE_BURST_DATA, 0x1546, 0x02,
- I2C_MODE_BURST_DATA, 0x0E46, 0x02,
- I2C_MODE_BURST_DATA, 0x4368, 0x02,
- I2C_MODE_BURST_DATA, 0x0022, 0x02,
- I2C_MODE_BURST_DATA, 0x1C0C, 0x02,
- I2C_MODE_BURST_DATA, 0x9FB2, 0x02,
- I2C_MODE_BURST_DATA, 0x3946, 0x02,
- I2C_MODE_BURST_DATA, 0x2046, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x40F8, 0x02,
- I2C_MODE_BURST_DATA, 0x2A46, 0x02,
- I2C_MODE_BURST_DATA, 0x3146, 0x02,
- I2C_MODE_BURST_DATA, 0x4046, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x45F8, 0x02,
- I2C_MODE_BURST_DATA, 0x0646, 0x02,
- I2C_MODE_BURST_DATA, 0x0122, 0x02,
- I2C_MODE_BURST_DATA, 0x3946, 0x02,
- I2C_MODE_BURST_DATA, 0x2046, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x35F8, 0x02,
- I2C_MODE_BURST_DATA, 0x95F8, 0x02,
- I2C_MODE_BURST_DATA, 0x6B00, 0x02,
- I2C_MODE_BURST_DATA, 0x4021, 0x02,
- I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF0F1, 0x02,
- I2C_MODE_BURST_DATA, 0x1448, 0x02,
- I2C_MODE_BURST_DATA, 0x028B, 0x02,
- I2C_MODE_BURST_DATA, 0xC08A, 0x02,
- I2C_MODE_BURST_DATA, 0x101A, 0x02,
- I2C_MODE_BURST_DATA, 0x90FB, 0x02,
- I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
- I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
- I2C_MODE_BURST_DATA, 0xFF71, 0x02,
- I2C_MODE_BURST_DATA, 0x01EA, 0x02,
- I2C_MODE_BURST_DATA, 0x0010, 0x02,
- I2C_MODE_BURST_DATA, 0x0D49, 0x02,
- I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
- I2C_MODE_BURST_DATA, 0x5C10, 0x02,
- I2C_MODE_BURST_DATA, 0x0029, 0x02,
- I2C_MODE_BURST_DATA, 0x00D1, 0x02,
- I2C_MODE_BURST_DATA, 0x3046, 0x02,
- I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
- I2C_MODE_BURST_DATA, 0xF081, 0x02,
- I2C_MODE_BURST_DATA, 0x10B5, 0x02,
- I2C_MODE_BURST_DATA, 0x0022, 0x02,
- I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x5D21, 0x02,
- I2C_MODE_BURST_DATA, 0x0A48, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x26F8, 0x02,
- I2C_MODE_BURST_DATA, 0x054C, 0x02,
- I2C_MODE_BURST_DATA, 0x0022, 0x02,
- I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
- I2C_MODE_BURST_DATA, 0x7301, 0x02,
- I2C_MODE_BURST_DATA, 0x2060, 0x02,
- I2C_MODE_BURST_DATA, 0x0748, 0x02,
- I2C_MODE_BURST_DATA, 0x00F0, 0x02,
- I2C_MODE_BURST_DATA, 0x1EF8, 0x02,
- I2C_MODE_BURST_DATA, 0x6060, 0x02,
- I2C_MODE_BURST_DATA, 0x10BD, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0x3430, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0x2F10, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0x2F70, 0x02,
- I2C_MODE_BURST_DATA, 0x2000, 0x02,
- I2C_MODE_BURST_DATA, 0x1B10, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x0B8B, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0xA135, 0x02,
- I2C_MODE_BURST_DATA, 0x40F6, 0x02,
- I2C_MODE_BURST_DATA, 0x4F0C, 0x02,
- I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
- I2C_MODE_BURST_DATA, 0x000C, 0x02,
- I2C_MODE_BURST_DATA, 0x6047, 0x02,
- I2C_MODE_BURST_DATA, 0x40F6, 0x02,
- I2C_MODE_BURST_DATA, 0x8B3C, 0x02,
- I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
- I2C_MODE_BURST_DATA, 0x000C, 0x02,
- I2C_MODE_BURST_DATA, 0x6047, 0x02,
- I2C_MODE_BURST_DATA, 0x4AF2, 0x02,
- I2C_MODE_BURST_DATA, 0x351C, 0x02,
- I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
- I2C_MODE_BURST_DATA, 0x000C, 0x02,
- I2C_MODE_BURST_DATA, 0x6047, 0x02,
- I2C_MODE_BURST_DATA, 0x4DF6, 0x02,
- I2C_MODE_BURST_DATA, 0x4B2C, 0x02,
- I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
- I2C_MODE_BURST_DATA, 0x000C, 0x02,
- I2C_MODE_BURST_DATA, 0x6047, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x30D3, 0x02,
- I2C_MODE_BURST_DATA, 0x02BB, 0x02,
- I2C_MODE_BURST_DATA, 0x0000, 0x02,
- I2C_MODE_BURST_DATA, 0x0004, 0x02,
- 0x6028, 0x4000, 0x02,
- 0x0300, 0x0004, 0x02,
- 0x0302, 0x0001, 0x02,
- 0x0304, 0x0006, 0x02,
- 0x0308, 0x0008, 0x02,
- 0x030A, 0x0001, 0x02,
- 0x030C, 0x0004, 0x02,
- 0x3644, 0x0060, 0x02,
- 0x3150, 0x1500, 0x02,
- 0x0216, 0x0000, 0x02,
- 0xF496, 0x0048, 0x02,
- 0x30D4, 0x0300, 0x02,
- 0x30D2, 0x0004, 0x02,
- 0x30D6, 0x0100, 0x02,
- 0x30D8, 0x0100, 0x02,
- 0x30DA, 0x0016, 0x02,
- 0x30DC, 0x0016, 0x02,
- 0x3EF8, 0x0000, 0x02,
- 0x3EFA, 0x0000, 0x02,
- 0x1118, 0x43C8, 0x02,
- 0x1124, 0x43C8, 0x02,
- 0x30AC, 0x0064, 0x02,
- 0x708A, 0x1FFF, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F40, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x602A, 0x2F42, 0x02,
- 0x6F12, 0x0044, 0x02,
- 0x602A, 0x2F34, 0x02,
- 0x6F12, 0x00A0, 0x02,
- 0x602A, 0x2F48, 0x02,
- 0x6F12, 0xFFF8, 0x02,
- 0x602A, 0x2F54, 0x02,
- 0x6F12, 0x0034, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6010, 0x0001, 0x02,
+ I2C_MODE_DELAY, 3000, 0x00,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x6004, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x30EC, 0x02,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0449, 0x02,
+ I2C_MODE_BURST_DATA, 0x0348, 0x02,
+ I2C_MODE_BURST_DATA, 0x044A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0860, 0x02,
+ I2C_MODE_BURST_DATA, 0x101A, 0x02,
+ I2C_MODE_BURST_DATA, 0x8880, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x5CB9, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3444, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1E80, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x4C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x5E88, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F89, 0x02,
+ I2C_MODE_BURST_DATA, 0x9D88, 0x02,
+ I2C_MODE_BURST_DATA, 0xF419, 0x02,
+ I2C_MODE_BURST_DATA, 0x641B, 0x02,
+ I2C_MODE_BURST_DATA, 0x25B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C88, 0x02,
+ I2C_MODE_BURST_DATA, 0x002D, 0x02,
+ I2C_MODE_BURST_DATA, 0x01DC, 0x02,
+ I2C_MODE_BURST_DATA, 0x7D1B, 0x02,
+ I2C_MODE_BURST_DATA, 0x08E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D1E, 0x02,
+ I2C_MODE_BURST_DATA, 0x2544, 0x02,
+ I2C_MODE_BURST_DATA, 0x95FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF4FC, 0x02,
+ I2C_MODE_BURST_DATA, 0x04FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C55, 0x02,
+ I2C_MODE_BURST_DATA, 0x2744, 0x02,
+ I2C_MODE_BURST_DATA, 0x7D1B, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D1E, 0x02,
+ I2C_MODE_BURST_DATA, 0x5F89, 0x02,
+ I2C_MODE_BURST_DATA, 0xB3F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x06C0, 0x02,
+ I2C_MODE_BURST_DATA, 0x3744, 0x02,
+ I2C_MODE_BURST_DATA, 0xADB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x6745, 0x02,
+ I2C_MODE_BURST_DATA, 0x00D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x6746, 0x02,
+ I2C_MODE_BURST_DATA, 0x2E44, 0x02,
+ I2C_MODE_BURST_DATA, 0xBE1B, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6B2, 0x02,
+ I2C_MODE_BURST_DATA, 0xB6FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF4F4, 0x02,
+ I2C_MODE_BURST_DATA, 0x0580, 0x02,
+ I2C_MODE_BURST_DATA, 0x1888, 0x02,
+ I2C_MODE_BURST_DATA, 0x04FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0050, 0x02,
+ I2C_MODE_BURST_DATA, 0x0880, 0x02,
+ I2C_MODE_BURST_DATA, 0x1480, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF043, 0x02,
+ I2C_MODE_BURST_DATA, 0x0446, 0x02,
+ I2C_MODE_BURST_DATA, 0x9C48, 0x02,
+ I2C_MODE_BURST_DATA, 0x1646, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D46, 0x02,
+ I2C_MODE_BURST_DATA, 0x0068, 0x02,
+ I2C_MODE_BURST_DATA, 0x85B0, 0x02,
+ I2C_MODE_BURST_DATA, 0x87B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x02,
+ I2C_MODE_BURST_DATA, 0x1048, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x4046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x39F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x3246, 0x02,
+ I2C_MODE_BURST_DATA, 0x2946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x39F9, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x4046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x2FF9, 0x02,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x4892, 0x02,
+ I2C_MODE_BURST_DATA, 0xB9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0028, 0x02,
+ I2C_MODE_BURST_DATA, 0x7ED0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0027, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0070, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0028, 0x02,
+ I2C_MODE_BURST_DATA, 0x2088, 0x02,
+ I2C_MODE_BURST_DATA, 0x07D0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6410, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6820, 0x02,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0200, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F5, 0x02,
+ I2C_MODE_BURST_DATA, 0x8450, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6910, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4008, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6900, 0x02,
+ I2C_MODE_BURST_DATA, 0x02AB, 0x02,
+ I2C_MODE_BURST_DATA, 0xB8FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F1, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0810, 0x02,
+ I2C_MODE_BURST_DATA, 0x6021, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6900, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x8151, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E00, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9E10, 0x02,
+ I2C_MODE_BURST_DATA, 0x7089, 0x02,
+ I2C_MODE_BURST_DATA, 0x0909, 0x02,
+ I2C_MODE_BURST_DATA, 0x4843, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1200, 0x02,
+ I2C_MODE_BURST_DATA, 0x3088, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1000, 0x02,
+ I2C_MODE_BURST_DATA, 0x05F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x1E01, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A46, 0x02,
+ I2C_MODE_BURST_DATA, 0x881E, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x78FF, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x7E21, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1EB, 0x02,
+ I2C_MODE_BURST_DATA, 0x400F, 0x02,
+ I2C_MODE_BURST_DATA, 0x01D2, 0x02,
+ I2C_MODE_BURST_DATA, 0x7E20, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4000, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C21, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x2881, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A81, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1200, 0x02,
+ I2C_MODE_BURST_DATA, 0xA881, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0470, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D00, 0x02,
+ I2C_MODE_BURST_DATA, 0x0028, 0x02,
+ I2C_MODE_BURST_DATA, 0x6088, 0x02,
+ I2C_MODE_BURST_DATA, 0x07D0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB4F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6610, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A20, 0x02,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0200, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F5, 0x02,
+ I2C_MODE_BURST_DATA, 0x4460, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6B10, 0x02,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A00, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6B00, 0x02,
+ I2C_MODE_BURST_DATA, 0xB8FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F1, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0810, 0x02,
+ I2C_MODE_BURST_DATA, 0x2021, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C00, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6B10, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x02,
+ I2C_MODE_BURST_DATA, 0x4268, 0x02,
+ I2C_MODE_BURST_DATA, 0xB8FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E00, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x57E0, 0x02,
+ I2C_MODE_BURST_DATA, 0xB089, 0x02,
+ I2C_MODE_BURST_DATA, 0x718A, 0x02,
+ I2C_MODE_BURST_DATA, 0x4F4F, 0x02,
+ I2C_MODE_BURST_DATA, 0x401A, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1200, 0x02,
+ I2C_MODE_BURST_DATA, 0x7088, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0xB210, 0x02,
+ I2C_MODE_BURST_DATA, 0x02AB, 0x02,
+ I2C_MODE_BURST_DATA, 0x401A, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1000, 0x02,
+ I2C_MODE_BURST_DATA, 0x6A46, 0x02,
+ I2C_MODE_BURST_DATA, 0x01A9, 0x02,
+ I2C_MODE_BURST_DATA, 0xB81C, 0x02,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x02,
+ I2C_MODE_BURST_DATA, 0x25FF, 0x02,
+ I2C_MODE_BURST_DATA, 0xB9F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5E00, 0x02,
+ I2C_MODE_BURST_DATA, 0xB8B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6D00, 0x02,
+ I2C_MODE_BURST_DATA, 0x90B9, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A10, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1200, 0x02,
+ I2C_MODE_BURST_DATA, 0x0144, 0x02,
+ I2C_MODE_BURST_DATA, 0x4145, 0x02,
+ I2C_MODE_BURST_DATA, 0x0BD8, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x1010, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0x7988, 0x02,
+ I2C_MODE_BURST_DATA, 0x401A, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0810, 0x02,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x02,
+ I2C_MODE_BURST_DATA, 0x1200, 0x02,
+ I2C_MODE_BURST_DATA, 0x70B1, 0x02,
+ I2C_MODE_BURST_DATA, 0x0020, 0x02,
+ I2C_MODE_BURST_DATA, 0xB880, 0x02,
+ I2C_MODE_BURST_DATA, 0x7888, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9210, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0xE882, 0x02,
+ I2C_MODE_BURST_DATA, 0xB888, 0x02,
+ I2C_MODE_BURST_DATA, 0x38B1, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0800, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0410, 0x02,
+ I2C_MODE_BURST_DATA, 0x081A, 0x02,
+ I2C_MODE_BURST_DATA, 0x03E0, 0x02,
+ I2C_MODE_BURST_DATA, 0x0120, 0x02,
+ I2C_MODE_BURST_DATA, 0xEFE7, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x02,
+ I2C_MODE_BURST_DATA, 0xADF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0400, 0x02,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x9210, 0x02,
+ I2C_MODE_BURST_DATA, 0x0144, 0x02,
+ I2C_MODE_BURST_DATA, 0x2983, 0x02,
+ I2C_MODE_BURST_DATA, 0x6988, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0C20, 0x02,
+ I2C_MODE_BURST_DATA, 0x9142, 0x02,
+ I2C_MODE_BURST_DATA, 0x04D9, 0x02,
+ I2C_MODE_BURST_DATA, 0xE980, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A88, 0x02,
+ I2C_MODE_BURST_DATA, 0x1144, 0x02,
+ I2C_MODE_BURST_DATA, 0xE980, 0x02,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x02,
+ I2C_MODE_BURST_DATA, 0xEA80, 0x02,
+ I2C_MODE_BURST_DATA, 0xE988, 0x02,
+ I2C_MODE_BURST_DATA, 0x728A, 0x02,
+ I2C_MODE_BURST_DATA, 0x1144, 0x02,
+ I2C_MODE_BURST_DATA, 0xE980, 0x02,
+ I2C_MODE_BURST_DATA, 0x7A88, 0x02,
+ I2C_MODE_BURST_DATA, 0x801A, 0x02,
+ I2C_MODE_BURST_DATA, 0x0844, 0x02,
+ I2C_MODE_BURST_DATA, 0xA880, 0x02,
+ I2C_MODE_BURST_DATA, 0x05B0, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF083, 0x02,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x02,
+ I2C_MODE_BURST_DATA, 0xF041, 0x02,
+ I2C_MODE_BURST_DATA, 0x8046, 0x02,
+ I2C_MODE_BURST_DATA, 0x1F48, 0x02,
+ I2C_MODE_BURST_DATA, 0x1546, 0x02,
+ I2C_MODE_BURST_DATA, 0x0E46, 0x02,
+ I2C_MODE_BURST_DATA, 0x4368, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0x1C0C, 0x02,
+ I2C_MODE_BURST_DATA, 0x9FB2, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x40F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x2A46, 0x02,
+ I2C_MODE_BURST_DATA, 0x3146, 0x02,
+ I2C_MODE_BURST_DATA, 0x4046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x45F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x0646, 0x02,
+ I2C_MODE_BURST_DATA, 0x0122, 0x02,
+ I2C_MODE_BURST_DATA, 0x3946, 0x02,
+ I2C_MODE_BURST_DATA, 0x2046, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x35F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x95F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6B00, 0x02,
+ I2C_MODE_BURST_DATA, 0x4021, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF0F1, 0x02,
+ I2C_MODE_BURST_DATA, 0x1448, 0x02,
+ I2C_MODE_BURST_DATA, 0x028B, 0x02,
+ I2C_MODE_BURST_DATA, 0xC08A, 0x02,
+ I2C_MODE_BURST_DATA, 0x101A, 0x02,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x02,
+ I2C_MODE_BURST_DATA, 0xF1F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x4FF6, 0x02,
+ I2C_MODE_BURST_DATA, 0xFF71, 0x02,
+ I2C_MODE_BURST_DATA, 0x01EA, 0x02,
+ I2C_MODE_BURST_DATA, 0x0010, 0x02,
+ I2C_MODE_BURST_DATA, 0x0D49, 0x02,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x5C10, 0x02,
+ I2C_MODE_BURST_DATA, 0x0029, 0x02,
+ I2C_MODE_BURST_DATA, 0x00D1, 0x02,
+ I2C_MODE_BURST_DATA, 0x3046, 0x02,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x02,
+ I2C_MODE_BURST_DATA, 0xF081, 0x02,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x5D21, 0x02,
+ I2C_MODE_BURST_DATA, 0x0A48, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x26F8, 0x02,
+ I2C_MODE_BURST_DATA, 0x054C, 0x02,
+ I2C_MODE_BURST_DATA, 0x0022, 0x02,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x7301, 0x02,
+ I2C_MODE_BURST_DATA, 0x2060, 0x02,
+ I2C_MODE_BURST_DATA, 0x0748, 0x02,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x02,
+ I2C_MODE_BURST_DATA, 0x1EF8, 0x02,
+ I2C_MODE_BURST_DATA, 0x6060, 0x02,
+ I2C_MODE_BURST_DATA, 0x10BD, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x3430, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2F10, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x2F70, 0x02,
+ I2C_MODE_BURST_DATA, 0x2000, 0x02,
+ I2C_MODE_BURST_DATA, 0x1B10, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0B8B, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0xA135, 0x02,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x4F0C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x02,
+ I2C_MODE_BURST_DATA, 0x8B3C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4AF2, 0x02,
+ I2C_MODE_BURST_DATA, 0x351C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x4DF6, 0x02,
+ I2C_MODE_BURST_DATA, 0x4B2C, 0x02,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x02,
+ I2C_MODE_BURST_DATA, 0x000C, 0x02,
+ I2C_MODE_BURST_DATA, 0x6047, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x30D3, 0x02,
+ I2C_MODE_BURST_DATA, 0x02BB, 0x02,
+ I2C_MODE_BURST_DATA, 0x0000, 0x02,
+ I2C_MODE_BURST_DATA, 0x0004, 0x02,
+ 0x6028, 0x4000, 0x02,
+ 0x0300, 0x0004, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x030C, 0x0004, 0x02,
+ 0x3644, 0x0060, 0x02,
+ 0x3150, 0x1500, 0x02,
+ 0x0216, 0x0000, 0x02,
+ 0xF496, 0x0048, 0x02,
+ 0x30D4, 0x0300, 0x02,
+ 0x30D2, 0x0004, 0x02,
+ 0x30D6, 0x0100, 0x02,
+ 0x30D8, 0x0100, 0x02,
+ 0x3EF8, 0x0000, 0x02,
+ 0x3EFA, 0x0000, 0x02,
+ 0x1118, 0x43C8, 0x02,
+ 0x1124, 0x43C8, 0x02,
+ 0x30AC, 0x0064, 0x02,
+ 0x708A, 0x1FFF, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F40, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x602A, 0x2F42, 0x02,
+ 0x6F12, 0x0044, 0x02,
+ 0x602A, 0x2F34, 0x02,
+ 0x6F12, 0x00A0, 0x02,
+ 0x602A, 0x2F48, 0x02,
+ 0x6F12, 0xFFF8, 0x02,
+ 0x602A, 0x2F54, 0x02,
+ 0x6F12, 0x0034, 0x02,
};
/* EXTCLK 26Mhz */
0x317A, 0x0115, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_A_4032x2268_30fps[] = {
0x317A, 0x0115, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
+/* 18.5:9 setting */
const u32 sensor_3m3_setfile_A_4032x1960_30fps[] = {
0xFCFC, 0x4000, 0x02,
0x6214, 0x7971, 0x02,
0x317A, 0x0115, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
//0x0100, 0x0100, 0x02,
};
+/* 19:9 setting */
+const u32 sensor_3m3_setfile_A_4032x1908_30fps[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0060, 0x02,
+ 0x0346, 0x0268, 0x02,
+ 0x0348, 0x101F, 0x02,
+ 0x034A, 0x09DF, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x0774, 0x02,
+ 0x0340, 0x0D48, 0x02,
+ 0x0342, 0x1268, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x002F, 0x02,
+ 0xF494, 0x0030, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x0D27, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0400, 0x0000, 0x02,
+ 0x0404, 0x0010, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0x0115, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+};
+
const u32 sensor_3m3_setfile_A_3024x3024_30fps[] = {
0xFCFC, 0x4000, 0x02,
0x6214, 0x7971, 0x02,
0x317A, 0x0015, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_A_2016x1512_30fps[] = {
0x317A, 0xFFFF, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_A_1504x1504_30fps[] = {
0x317A, 0xFFFF, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_A_1920x1080_60fps[] = {
0x317A, 0x006B, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_A_1344x756_120fps[] = {
0x317A, 0x0007, 0x02,
0x30E2, 0x0000, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_A_2016x1134_30fps[] = {
0x317A, 0xFFFF, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
0x602A, 0x2F6E, 0x02,
0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
};
const struct sensor_pll_info_compact sensor_3m3_pllinfo_A_4032x3024_30fps = {
0x1268, /* line_length_pck */
};
+const struct sensor_pll_info_compact sensor_3m3_pllinfo_A_4032x1908_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1196000000, /* mipi_datarate */
+ 481000000, /* pclk = VT pix CLK * 4(this value is different by cis) */
+ 0x0D48, /* frame_length_lines */
+ 0x1268, /* line_length_pck */
+};
+
const struct sensor_pll_info_compact sensor_3m3_pllinfo_A_3024x3024_30fps = {
EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
1196000000, /* mipi_datarate */
sensor_3m3_setfile_A_4032x3024_30fps,
sensor_3m3_setfile_A_4032x2268_30fps,
sensor_3m3_setfile_A_4032x1960_30fps,
+ sensor_3m3_setfile_A_4032x1908_30fps,
sensor_3m3_setfile_A_3024x3024_30fps,
sensor_3m3_setfile_A_2016x1512_30fps,
sensor_3m3_setfile_A_1504x1504_30fps,
ARRAY_SIZE(sensor_3m3_setfile_A_4032x3024_30fps),
ARRAY_SIZE(sensor_3m3_setfile_A_4032x2268_30fps),
ARRAY_SIZE(sensor_3m3_setfile_A_4032x1960_30fps),
+ ARRAY_SIZE(sensor_3m3_setfile_A_4032x1908_30fps),
ARRAY_SIZE(sensor_3m3_setfile_A_3024x3024_30fps),
ARRAY_SIZE(sensor_3m3_setfile_A_2016x1512_30fps),
ARRAY_SIZE(sensor_3m3_setfile_A_1504x1504_30fps),
&sensor_3m3_pllinfo_A_4032x3024_30fps,
&sensor_3m3_pllinfo_A_4032x2268_30fps,
&sensor_3m3_pllinfo_A_4032x1960_30fps,
+ &sensor_3m3_pllinfo_A_4032x1908_30fps,
&sensor_3m3_pllinfo_A_3024x3024_30fps,
&sensor_3m3_pllinfo_A_2016x1512_30fps,
&sensor_3m3_pllinfo_A_1504x1504_30fps,
0x30D2, 0x0004, 0x02,
0x30D6, 0x0100, 0x02,
0x30D8, 0x0100, 0x02,
- 0x30DA, 0x0016, 0x02,
- 0x30DC, 0x0016, 0x02,
0x3EF8, 0x0000, 0x02,
0x3EFA, 0x0000, 0x02,
0x1118, 0x43C8, 0x02,
/* EXTCLK 26Mhz */
const u32 sensor_3m3_setfile_B_4032x3024_30fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0060, 0x02,
- 0x0346, 0x0038, 0x02,
- 0x0348, 0x101F, 0x02,
- 0x034A, 0x0C07, 0x02,
- 0x034C, 0x0FC0, 0x02,
- 0x034E, 0x0BD0, 0x02,
- 0x0340, 0x0D48, 0x02,
- 0x0342, 0x1268, 0x02,
- 0x3000, 0x0001, 0x02,
- 0xF440, 0x002F, 0x02,
- 0xF494, 0x0030, 0x02,
- 0x3604, 0x0000, 0x02,
- 0xF4CC, 0x0029, 0x02,
- 0xF4CE, 0x002C, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0035, 0x02,
- 0xF4D4, 0x0038, 0x02,
- 0xF4D6, 0x0039, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0035, 0x02,
- 0xF4DC, 0x0038, 0x02,
- 0xF4DE, 0x0039, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x0D27, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0011, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0001, 0x02,
- 0x0400, 0x0000, 0x02,
- 0x0404, 0x0010, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x317A, 0x0115, 0x02,
- 0x30E2, 0x0001, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0060, 0x02,
+ 0x0346, 0x0038, 0x02,
+ 0x0348, 0x101F, 0x02,
+ 0x034A, 0x0C07, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x0BD0, 0x02,
+ 0x0340, 0x0D48, 0x02,
+ 0x0342, 0x1268, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x002F, 0x02,
+ 0xF494, 0x0030, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x0D27, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0400, 0x0000, 0x02,
+ 0x0404, 0x0010, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0x0115, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_B_4032x2268_30fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0060, 0x02,
- 0x0346, 0x01B0, 0x02,
- 0x0348, 0x101F, 0x02,
- 0x034A, 0x0A8F, 0x02,
- 0x034C, 0x0FC0, 0x02,
- 0x034E, 0x08DC, 0x02,
- 0x0340, 0x0D48, 0x02,
- 0x0342, 0x1268, 0x02,
- 0x3000, 0x0001, 0x02,
- 0xF440, 0x002F, 0x02,
- 0xF494, 0x0030, 0x02,
- 0x3604, 0x0000, 0x02,
- 0xF4CC, 0x0029, 0x02,
- 0xF4CE, 0x002C, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0035, 0x02,
- 0xF4D4, 0x0038, 0x02,
- 0xF4D6, 0x0039, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0035, 0x02,
- 0xF4DC, 0x0038, 0x02,
- 0xF4DE, 0x0039, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x0D27, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0011, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0001, 0x02,
- 0x0400, 0x0000, 0x02,
- 0x0404, 0x0010, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x317A, 0x0115, 0x02,
- 0x30E2, 0x0001, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0060, 0x02,
+ 0x0346, 0x01B0, 0x02,
+ 0x0348, 0x101F, 0x02,
+ 0x034A, 0x0A8F, 0x02,
+ 0x034C, 0x0FC0, 0x02,
+ 0x034E, 0x08DC, 0x02,
+ 0x0340, 0x0D48, 0x02,
+ 0x0342, 0x1268, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x002F, 0x02,
+ 0xF494, 0x0030, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x0D27, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0400, 0x0000, 0x02,
+ 0x0404, 0x0010, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0x0115, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_B_4032x1960_30fps[] = {
0x317A, 0x0115, 0x02,
0x30E2, 0x0001, 0x02,
0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
0x6028, 0x2000, 0x02,
0x602A, 0x2F6C, 0x02,
0x6F12, 0x0001, 0x02,
};
const u32 sensor_3m3_setfile_B_3024x3024_30fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0258, 0x02,
- 0x0346, 0x0038, 0x02,
- 0x0348, 0x0E27, 0x02,
- 0x034A, 0x0C07, 0x02,
- 0x034C, 0x0BD0, 0x02,
- 0x034E, 0x0BD0, 0x02,
- 0x0340, 0x0D48, 0x02,
- 0x0342, 0x1268, 0x02,
- 0x3000, 0x0001, 0x02,
- 0xF440, 0x002F, 0x02,
- 0xF494, 0x0030, 0x02,
- 0x3604, 0x0000, 0x02,
- 0xF4CC, 0x0029, 0x02,
- 0xF4CE, 0x002C, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0035, 0x02,
- 0xF4D4, 0x0038, 0x02,
- 0xF4D6, 0x0039, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0035, 0x02,
- 0xF4DC, 0x0038, 0x02,
- 0xF4DE, 0x0039, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x0D27, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0011, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0001, 0x02,
- 0x0400, 0x0000, 0x02,
- 0x0404, 0x0010, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x317A, 0x0015, 0x02,
- 0x30E2, 0x0001, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0258, 0x02,
+ 0x0346, 0x0038, 0x02,
+ 0x0348, 0x0E27, 0x02,
+ 0x034A, 0x0C07, 0x02,
+ 0x034C, 0x0BD0, 0x02,
+ 0x034E, 0x0BD0, 0x02,
+ 0x0340, 0x0D48, 0x02,
+ 0x0342, 0x1268, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x002F, 0x02,
+ 0xF494, 0x0030, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x0D27, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0400, 0x0000, 0x02,
+ 0x0404, 0x0010, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0x0015, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_B_2016x1512_30fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0060, 0x02,
- 0x0346, 0x0038, 0x02,
- 0x0348, 0x101F, 0x02,
- 0x034A, 0x0C07, 0x02,
- 0x034C, 0x07E0, 0x02,
- 0x034E, 0x05E8, 0x02,
- 0x0340, 0x0667, 0x02,
- 0x0342, 0x2628, 0x02,
- 0x3000, 0x0001, 0x02,
- 0xF440, 0x006F, 0x02,
- 0xF494, 0x0020, 0x02,
- 0x3604, 0x0000, 0x02,
- 0xF4CC, 0x0029, 0x02,
- 0xF4CE, 0x002C, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0035, 0x02,
- 0xF4D4, 0x0038, 0x02,
- 0xF4D6, 0x0039, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0035, 0x02,
- 0xF4DC, 0x0038, 0x02,
- 0xF4DE, 0x0039, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x059D, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0112, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0003, 0x02,
- 0x0400, 0x0001, 0x02,
- 0x0404, 0x0020, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x317A, 0xFFFF, 0x02,
- 0x30E2, 0x0001, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0060, 0x02,
+ 0x0346, 0x0038, 0x02,
+ 0x0348, 0x101F, 0x02,
+ 0x034A, 0x0C07, 0x02,
+ 0x034C, 0x07E0, 0x02,
+ 0x034E, 0x05E8, 0x02,
+ 0x0340, 0x0667, 0x02,
+ 0x0342, 0x2628, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x006F, 0x02,
+ 0xF494, 0x0020, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x059D, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0400, 0x0001, 0x02,
+ 0x0404, 0x0020, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0xFFFF, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_B_1504x1504_30fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0260, 0x02,
- 0x0346, 0x0040, 0x02,
- 0x0348, 0x0E1F, 0x02,
- 0x034A, 0x0BFF, 0x02,
- 0x034C, 0x05E0, 0x02,
- 0x034E, 0x05E0, 0x02,
- 0x0340, 0x065F, 0x02,
- 0x0342, 0x265E, 0x02,
- 0x3000, 0x0001, 0x02,
- 0xF440, 0x006F, 0x02,
- 0xF494, 0x0020, 0x02,
- 0x3604, 0x0000, 0x02,
- 0xF4CC, 0x0029, 0x02,
- 0xF4CE, 0x002C, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0035, 0x02,
- 0xF4D4, 0x0038, 0x02,
- 0xF4D6, 0x0039, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0035, 0x02,
- 0xF4DC, 0x0038, 0x02,
- 0xF4DE, 0x0039, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x059D, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0112, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0003, 0x02,
- 0x0400, 0x0001, 0x02,
- 0x0404, 0x0020, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x317A, 0xFFFF, 0x02,
- 0x30E2, 0x0001, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0260, 0x02,
+ 0x0346, 0x0040, 0x02,
+ 0x0348, 0x0E1F, 0x02,
+ 0x034A, 0x0BFF, 0x02,
+ 0x034C, 0x05E0, 0x02,
+ 0x034E, 0x05E0, 0x02,
+ 0x0340, 0x065F, 0x02,
+ 0x0342, 0x265E, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x006F, 0x02,
+ 0xF494, 0x0020, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x059D, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0400, 0x0001, 0x02,
+ 0x0404, 0x0020, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0xFFFF, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_B_1920x1080_60fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0480, 0x02,
- 0x0346, 0x0400, 0x02,
- 0x0348, 0x0BFF, 0x02,
- 0x034A, 0x0837, 0x02,
- 0x034C, 0x0780, 0x02,
- 0x034E, 0x0438, 0x02,
- 0x0340, 0x069E, 0x02,
- 0x0342, 0x1268, 0x02,
- 0x3000, 0x0001, 0x02,
- 0xF440, 0x002F, 0x02,
- 0xF494, 0x0030, 0x02,
- 0x3604, 0x0000, 0x02,
- 0xF4CC, 0x0029, 0x02,
- 0xF4CE, 0x002C, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0035, 0x02,
- 0xF4D4, 0x0038, 0x02,
- 0xF4D6, 0x0039, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0035, 0x02,
- 0xF4DC, 0x0038, 0x02,
- 0xF4DE, 0x0039, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x0D27, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0011, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0001, 0x02,
- 0x0400, 0x0000, 0x02,
- 0x0404, 0x0010, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x317A, 0x006B, 0x02,
- 0x30E2, 0x0001, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0480, 0x02,
+ 0x0346, 0x0400, 0x02,
+ 0x0348, 0x0BFF, 0x02,
+ 0x034A, 0x0837, 0x02,
+ 0x034C, 0x0780, 0x02,
+ 0x034E, 0x0438, 0x02,
+ 0x0340, 0x069E, 0x02,
+ 0x0342, 0x1268, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x002F, 0x02,
+ 0xF494, 0x0030, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x0D27, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0400, 0x0000, 0x02,
+ 0x0404, 0x0010, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0x006B, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_B_1344x756_120fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0060, 0x02,
- 0x0346, 0x01B0, 0x02,
- 0x0348, 0x101F, 0x02,
- 0x034A, 0x0A97, 0x02,
- 0x034C, 0x0540, 0x02,
- 0x034E, 0x02F4, 0x02,
- 0x0340, 0x0382, 0x02,
- 0x0342, 0x1168, 0x02,
- 0x3000, 0x0000, 0x02,
- 0xF440, 0x00AF, 0x02,
- 0xF494, 0x0020, 0x02,
- 0x3604, 0x0001, 0x02,
- 0xF4CC, 0x0028, 0x02,
- 0xF4CE, 0x0028, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0034, 0x02,
- 0xF4D4, 0x0FFF, 0x02,
- 0xF4D6, 0x0FFF, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0034, 0x02,
- 0xF4DC, 0x0FFF, 0x02,
- 0xF4DE, 0x0FFF, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x0369, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0113, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0005, 0x02,
- 0x0400, 0x0001, 0x02,
- 0x0404, 0x0030, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0000, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x317A, 0x0007, 0x02,
- 0x30E2, 0x0000, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0060, 0x02,
+ 0x0346, 0x01B0, 0x02,
+ 0x0348, 0x101F, 0x02,
+ 0x034A, 0x0A97, 0x02,
+ 0x034C, 0x0540, 0x02,
+ 0x034E, 0x02F4, 0x02,
+ 0x0340, 0x0382, 0x02,
+ 0x0342, 0x1168, 0x02,
+ 0x3000, 0x0000, 0x02,
+ 0xF440, 0x00AF, 0x02,
+ 0xF494, 0x0020, 0x02,
+ 0x3604, 0x0001, 0x02,
+ 0xF4CC, 0x0028, 0x02,
+ 0xF4CE, 0x0028, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0034, 0x02,
+ 0xF4D4, 0x0FFF, 0x02,
+ 0xF4D6, 0x0FFF, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0034, 0x02,
+ 0xF4DC, 0x0FFF, 0x02,
+ 0xF4DE, 0x0FFF, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x0369, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0113, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0005, 0x02,
+ 0x0400, 0x0001, 0x02,
+ 0x0404, 0x0030, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0000, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x317A, 0x0007, 0x02,
+ 0x30E2, 0x0000, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const u32 sensor_3m3_setfile_B_2016x1134_30fps[] = {
- 0xFCFC, 0x4000, 0x02,
- 0x6214, 0x7971, 0x02,
- 0x6218, 0x7150, 0x02,
- 0x0136, 0x1A00, 0x02,
- 0x1130, 0x43F1, 0x02,
- 0x0306, 0x006F, 0x02,
- 0x030E, 0x005C, 0x02,
- 0x0344, 0x0060, 0x02,
- 0x0346, 0x01B0, 0x02,
- 0x0348, 0x101F, 0x02,
- 0x034A, 0x0A8F, 0x02,
- 0x034C, 0x07E0, 0x02,
- 0x034E, 0x046E, 0x02,
- 0x0340, 0x04D0, 0x02,
- 0x0342, 0x32CA, 0x02,
- 0x3000, 0x0001, 0x02,
- 0xF440, 0x006F, 0x02,
- 0xF494, 0x0020, 0x02,
- 0x3604, 0x0000, 0x02,
- 0xF4CC, 0x0029, 0x02,
- 0xF4CE, 0x002C, 0x02,
- 0xF4D0, 0x0034, 0x02,
- 0xF4D2, 0x0035, 0x02,
- 0xF4D4, 0x0038, 0x02,
- 0xF4D6, 0x0039, 0x02,
- 0xF4D8, 0x0034, 0x02,
- 0xF4DA, 0x0035, 0x02,
- 0xF4DC, 0x0038, 0x02,
- 0xF4DE, 0x0039, 0x02,
- 0x0200, 0x0618, 0x02,
- 0x0202, 0x059D, 0x02,
- 0x021E, 0x0400, 0x02,
- 0x021C, 0x0000, 0x02,
- 0x0900, 0x0112, 0x02,
- 0x0380, 0x0001, 0x02,
- 0x0382, 0x0001, 0x02,
- 0x0384, 0x0001, 0x02,
- 0x0386, 0x0003, 0x02,
- 0x0400, 0x0001, 0x02,
- 0x0404, 0x0020, 0x02,
- 0x0B0E, 0x0100, 0x02,
- 0x3058, 0x0001, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x19E0, 0x02,
- 0x6F12, 0x0000, 0x02,
- 0x317A, 0xFFFF, 0x02,
- 0x30E2, 0x0001, 0x02,
- 0x30E4, 0x002B, 0x02,
- 0x6028, 0x2000, 0x02,
- 0x602A, 0x2F6C, 0x02,
- 0x6F12, 0x0001, 0x02,
- 0x602A, 0x2F6E, 0x02,
- 0x6F12, 0x0001, 0x02,
- //0x0100, 0x0100, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6214, 0x7971, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x1130, 0x43F1, 0x02,
+ 0x0306, 0x006F, 0x02,
+ 0x030E, 0x005C, 0x02,
+ 0x0344, 0x0060, 0x02,
+ 0x0346, 0x01B0, 0x02,
+ 0x0348, 0x101F, 0x02,
+ 0x034A, 0x0A8F, 0x02,
+ 0x034C, 0x07E0, 0x02,
+ 0x034E, 0x046E, 0x02,
+ 0x0340, 0x04D0, 0x02,
+ 0x0342, 0x32CA, 0x02,
+ 0x3000, 0x0001, 0x02,
+ 0xF440, 0x006F, 0x02,
+ 0xF494, 0x0020, 0x02,
+ 0x3604, 0x0000, 0x02,
+ 0xF4CC, 0x0029, 0x02,
+ 0xF4CE, 0x002C, 0x02,
+ 0xF4D0, 0x0034, 0x02,
+ 0xF4D2, 0x0035, 0x02,
+ 0xF4D4, 0x0038, 0x02,
+ 0xF4D6, 0x0039, 0x02,
+ 0xF4D8, 0x0034, 0x02,
+ 0xF4DA, 0x0035, 0x02,
+ 0xF4DC, 0x0038, 0x02,
+ 0xF4DE, 0x0039, 0x02,
+ 0x0200, 0x0618, 0x02,
+ 0x0202, 0x059D, 0x02,
+ 0x021E, 0x0400, 0x02,
+ 0x021C, 0x0000, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0400, 0x0001, 0x02,
+ 0x0404, 0x0020, 0x02,
+ 0x0B0E, 0x0100, 0x02,
+ 0x3058, 0x0001, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x19E0, 0x02,
+ 0x6F12, 0x0000, 0x02,
+ 0x317A, 0xFFFF, 0x02,
+ 0x30E2, 0x0001, 0x02,
+ 0x30E4, 0x002B, 0x02,
+ 0x30DA, 0x0016, 0x02,
+ 0x30DC, 0x0016, 0x02,
+ 0x6028, 0x2000, 0x02,
+ 0x602A, 0x2F6C, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ 0x602A, 0x2F6E, 0x02,
+ 0x6F12, 0x0001, 0x02,
+ //0x0100, 0x0100, 0x02,
};
const struct sensor_pll_info_compact sensor_3m3_pllinfo_B_4032x3024_30fps = {
return ret;
}
+int sensor_3m3_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read8(client, 0x0002, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Default version 3m3 sensor. Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
/* CIS OPS */
int sensor_3m3_cis_init(struct v4l2_subdev *subdev)
{
struct fimc_is_cis *cis;
u32 setfile_index = 0;
cis_setting_info setinfo;
- int retry_cnt = 3;
setinfo.param = NULL;
setinfo.return_value = 0;
}
FIMC_BUG(!cis->cis_data);
- memset(cis->cis_data, 0, sizeof(cis_shared_data));
-
-retry:
- ret = sensor_cis_check_rev(cis);
- if (ret < 0) {
- if (retry_cnt-- > 0) {
- err("sensor_3m3_check_rev is fail. retry %d", retry_cnt);
- usleep_range(10000, 10000);
- goto retry;
- } else {
- err("sensor_3m3_check_rev is fail");
- goto p_err;
- }
- }
cis->cis_data->cur_width = SENSOR_3M3_MAX_WIDTH;
cis->cis_data->cur_height = SENSOR_3M3_MAX_HEIGHT;
return 0;
}
- fimc_is_sec_get_cal_buf(&cal_buf);
+ fimc_is_sec_get_cal_buf(&cal_buf, ROM_ID_REAR);
dummy_flag = cal_buf[FROM_REAR2_FLAG_DUMMY_ADDR];
crop_num = cal_buf[FROM_REAR2_IMAGE_CROP_NUM_ADDR];
info("[%s] dummy_flag[%x], crop_num[%x]", __func__, dummy_flag, crop_num);
- if (dummy_flag == 7 && (crop_num >= 1 && crop_num <= 9)) {
+ if (dummy_flag == 7 && (crop_num >= 1 && crop_num <= 9)) { /* Get a crop shift num from cal data */
cis->cis_data->sensor_shifted_num = crop_num;
- } else {
+ } else if (dummy_flag == 4) { /* Map to a fixed crop shiift num */
+ crop_num = FIXED_SENSOR_CROP_SHIFT_NUM;
+ cis->cis_data->sensor_shifted_num = crop_num;
+ } else { /* Invalid cal data. Contrast AF only */
cis->cis_data->sensor_shifted_num = 0;
+ }
+
+ if (cis->cis_data->sensor_shifted_num == 0) {
return 0;
}
return 0;
}
- fimc_is_sec_get_cal_buf(&cal_buf);
+ fimc_is_sec_get_cal_buf(&cal_buf, ROM_ID_REAR);
#ifdef TEST_SHIFT_CROP
cal_buf[FROM_REAR2_FLAG_DUMMY_ADDR] = 7;
info("[%s] dummy_flag[%x], crop_num[%x]", __func__, dummy_flag, crop_num);
- if (dummy_flag == 7 && (crop_num >= 1 && crop_num <= 9)) {
+ if (dummy_flag == 7 && (crop_num >= 1 && crop_num <= 9)) { /* Get a crop shift num from cal data */
cis->cis_data->sensor_shifted_num = crop_num;
- } else {
+ } else if (dummy_flag == 4) { /* Map to a fixed crop shiift num */
+ crop_num = FIXED_SENSOR_CROP_SHIFT_NUM;
+ cis->cis_data->sensor_shifted_num = crop_num;
+ } else { /* Invalid cal data. Contrast AF only */
cis->cis_data->sensor_shifted_num = 0;
+ }
+
+ if (cis->cis_data->sensor_shifted_num == 0) {
return 0;
}
if (crop_num == 7 || crop_num == 8 || crop_num == 9)
height = 560;
break;
+ case SENSOR_3M3_4032X1908_30FPS:
+ width = 124;
+ height = 448;
+ if (crop_num == 1 || crop_num == 2 || crop_num == 7 || crop_num == 8)
+ height = 464;
+ break;
default:
warn("[%s] Don't change pdaf tail size\n", __func__);
break;
#ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
.cis_update_pdaf_tail_size = sensor_3m3_cis_update_pdaf_tail_size,
#endif
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_3m3_cis_check_rev,
};
static int cis_3m3_probe(struct i2c_client *client,
setfile = "default";
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
SENSOR_3M3_4032X3024_30FPS = 0,
SENSOR_3M3_4032X2268_30FPS,
SENSOR_3M3_4032X1960_30FPS,
+ SENSOR_3M3_4032X1908_30FPS,
SENSOR_3M3_3024X3024_30FPS,
SENSOR_3M3_2016X1512_30FPS,
SENSOR_3M3_1504X1504_30FPS,
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_3p3_probe(struct i2c_client *client,
sensor_3p3_max_setfile_num = sizeof(sensor_3p3_setfiles_A) / sizeof(sensor_3p3_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_3p8_probe(struct i2c_client *client,
sensor_3p8_pllinfos = sensor_3p8_pllinfos_A;
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_3p8sp_probe(struct i2c_client *client,
sensor_3p8sp_pllinfos = sensor_3p8sp_pllinfos_A;
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_3P9_SET_A_H
+#define FIMC_IS_CIS_3P9_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-3p9.h"
+
+/* S5K3P9SX_REV0.0_Ver0.1_20180720.xlsx */
+const u32 sensor_3p9_setfile_A_Global[] = {
+ 0x0100, 0x0000, 0x02,
+ 0x6010, 0x0001, 0x02,
+ I2C_MODE_DELAY, 3000, 0x00,
+
+ 0x6214, 0x7970, 0x02,
+ 0x6218, 0x7150, 0x02,
+
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+ 0x6018, 0x0001, 0x02,
+ 0x7004, 0x1A00, 0x02,
+ 0x70D8, 0x18E2, 0x02,
+ 0x6014, 0x0001, 0x02,
+ I2C_MODE_DELAY, 3000, 0x00,
+ 0x6214, 0x7970, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x3F4C, 0x0000, 0x02,
+ 0x3F4E, 0x0000, 0x02,
+ 0x3F50, 0x0649, 0x02,
+ 0x3F52, 0x0548, 0x02,
+ 0x3F54, 0xC1F8, 0x02,
+ 0x3F56, 0xC405, 0x02,
+ 0x3F58, 0x0549, 0x02,
+ 0x3F5A, 0x081A, 0x02,
+ 0x3F5C, 0x0349, 0x02,
+ 0x3F5E, 0xA1F8, 0x02,
+ 0x3F60, 0xC805, 0x02,
+ 0x3F62, 0x00F0, 0x02,
+ 0x3F64, 0x65BC, 0x02,
+ 0x3F66, 0x0000, 0x02,
+ 0x3F68, 0x2000, 0x02,
+ 0x3F6A, 0x4A84, 0x02,
+ 0x3F6C, 0x2000, 0x02,
+ 0x3F6E, 0x2ED0, 0x02,
+ 0x3F70, 0x2000, 0x02,
+ 0x3F72, 0x6C00, 0x02,
+ 0x3F74, 0x0000, 0x02,
+ 0x3F76, 0x0000, 0x02,
+ 0x3F78, 0x0000, 0x02,
+ 0x3F7A, 0x0000, 0x02,
+ 0x3F7C, 0x0000, 0x02,
+ 0x3F7E, 0x0000, 0x02,
+ 0x3F80, 0x40BA, 0x02,
+ 0x3F82, 0x7047, 0x02,
+ 0x3F84, 0x0000, 0x02,
+ 0x3F86, 0x0000, 0x02,
+ 0x3F88, 0x0000, 0x02,
+ 0x3F8A, 0x0000, 0x02,
+ 0x3F8C, 0x0000, 0x02,
+ 0x3F8E, 0x0000, 0x02,
+ 0x3F90, 0xC0BA, 0x02,
+ 0x3F92, 0x7047, 0x02,
+ 0x3F94, 0x0000, 0x02,
+ 0x3F96, 0x0000, 0x02,
+ 0x3F98, 0x0000, 0x02,
+ 0x3F9A, 0x0000, 0x02,
+ 0x3F9C, 0x0000, 0x02,
+ 0x3F9E, 0x0000, 0x02,
+ 0x3FA0, 0x2DE9, 0x02,
+ 0x3FA2, 0xF047, 0x02,
+ 0x3FA4, 0x1C46, 0x02,
+ 0x3FA6, 0x9046, 0x02,
+ 0x3FA8, 0x8946, 0x02,
+ 0x3FAA, 0x0746, 0x02,
+ 0x3FAC, 0xFE48, 0x02,
+ 0x3FAE, 0x0022, 0x02,
+ 0x3FB0, 0x0068, 0x02,
+ 0x3FB2, 0x86B2, 0x02,
+ 0x3FB4, 0x050C, 0x02,
+ 0x3FB6, 0x3146, 0x02,
+ 0x3FB8, 0x2846, 0x02,
+ 0x3FBA, 0x00F0, 0x02,
+ 0x3FBC, 0xC5FC, 0x02,
+ 0x3FBE, 0x2346, 0x02,
+ 0x3FC0, 0x4246, 0x02,
+ 0x3FC2, 0x4946, 0x02,
+ 0x3FC4, 0x3846, 0x02,
+ 0x3FC6, 0x00F0, 0x02,
+ 0x3FC8, 0xC4FC, 0x02,
+ 0x3FCA, 0xF848, 0x02,
+ 0x3FCC, 0x90F8, 0x02,
+ 0x3FCE, 0x8B02, 0x02,
+ 0x3FD0, 0x88B1, 0x02,
+ 0x3FD2, 0x788A, 0x02,
+ 0x3FD4, 0x04F1, 0x02,
+ 0x3FD6, 0x0054, 0x02,
+ 0x3FD8, 0x04EB, 0x02,
+ 0x3FDA, 0x8001, 0x02,
+ 0x3FDC, 0x09E0, 0x02,
+ 0x3FDE, 0x2268, 0x02,
+ 0x3FE0, 0xC2F3, 0x02,
+ 0x3FE2, 0xC360, 0x02,
+ 0x3FE4, 0x90FA, 0x02,
+ 0x3FE6, 0xA0F0, 0x02,
+ 0x3FE8, 0x22F0, 0x02,
+ 0x3FEA, 0x7842, 0x02,
+ 0x3FEC, 0x42EA, 0x02,
+ 0x3FEE, 0x5000, 0x02,
+ 0x3FF0, 0x01C4, 0x02,
+ 0x3FF2, 0x8C42, 0x02,
+ 0x3FF4, 0xF3D1, 0x02,
+ 0x3FF6, 0x3146, 0x02,
+ 0x3FF8, 0x2846, 0x02,
+ 0x3FFA, 0xBDE8, 0x02,
+ 0x3FFC, 0xF047, 0x02,
+ 0x3FFE, 0x0122, 0x02,
+ 0x4000, 0x00F0, 0x02,
+ 0x4002, 0xA2BC, 0x02,
+ 0x4004, 0x2DE9, 0x02,
+ 0x4006, 0xFC5F, 0x02,
+ 0x4008, 0x8346, 0x02,
+ 0x400A, 0xE748, 0x02,
+ 0x400C, 0x8A46, 0x02,
+ 0x400E, 0x0022, 0x02,
+ 0x4010, 0x4068, 0x02,
+ 0x4012, 0x010C, 0x02,
+ 0x4014, 0x80B2, 0x02,
+ 0x4016, 0xCDE9, 0x02,
+ 0x4018, 0x0001, 0x02,
+ 0x401A, 0x0146, 0x02,
+ 0x401C, 0x0198, 0x02,
+ 0x401E, 0x00F0, 0x02,
+ 0x4020, 0x93FC, 0x02,
+ 0x4022, 0xABFB, 0x02,
+ 0x4024, 0x0A10, 0x02,
+ 0x4026, 0xE24B, 0x02,
+ 0x4028, 0xE04D, 0x02,
+ 0x402A, 0xE04A, 0x02,
+ 0x402C, 0x93F8, 0x02,
+ 0x402E, 0x9160, 0x02,
+ 0x4030, 0x05F5, 0x02,
+ 0x4032, 0xAA69, 0x02,
+ 0x4034, 0x06FB, 0x02,
+ 0x4036, 0x0BF6, 0x02,
+ 0x4038, 0x0023, 0x02,
+ 0x403A, 0x891B, 0x02,
+ 0x403C, 0x4D46, 0x02,
+ 0x403E, 0x60EB, 0x02,
+ 0x4040, 0x0300, 0x02,
+ 0x4042, 0x03C5, 0x02,
+ 0x4044, 0x1D46, 0x02,
+ 0x4046, 0xEBFB, 0x02,
+ 0x4048, 0x0A65, 0x02,
+ 0x404A, 0x02F5, 0x02,
+ 0x404C, 0xAB67, 0x02,
+ 0x404E, 0x3A46, 0x02,
+ 0x4050, 0xD64C, 0x02,
+ 0x4052, 0x60C2, 0x02,
+ 0x4054, 0xA4F8, 0x02,
+ 0x4056, 0x4835, 0x02,
+ 0x4058, 0x04F5, 0x02,
+ 0x405A, 0xA962, 0x02,
+ 0x405C, 0x94F8, 0x02,
+ 0x405E, 0xA0C4, 0x02,
+ 0x4060, 0x94F8, 0x02,
+ 0x4062, 0xA144, 0x02,
+ 0x4064, 0x4FF4, 0x02,
+ 0x4066, 0xF858, 0x02,
+ 0x4068, 0xBCF1, 0x02,
+ 0x406A, 0x010F, 0x02,
+ 0x406C, 0x03D0, 0x02,
+ 0x406E, 0xBCF1, 0x02,
+ 0x4070, 0x020F, 0x02,
+ 0x4072, 0x14D0, 0x02,
+ 0x4074, 0x29E0, 0x02,
+ 0x4076, 0x08EA, 0x02,
+ 0x4078, 0x0423, 0x02,
+ 0x407A, 0x43F0, 0x02,
+ 0x407C, 0x1103, 0x02,
+ 0x407E, 0x1380, 0x02,
+ 0x4080, 0x2346, 0x02,
+ 0x4082, 0x0022, 0x02,
+ 0x4084, 0x00F0, 0x02,
+ 0x4086, 0x6AFC, 0x02,
+ 0x4088, 0xC9E9, 0x02,
+ 0x408A, 0x0001, 0x02,
+ 0x408C, 0x2346, 0x02,
+ 0x408E, 0x0022, 0x02,
+ 0x4090, 0x2846, 0x02,
+ 0x4092, 0x3146, 0x02,
+ 0x4094, 0x00F0, 0x02,
+ 0x4096, 0x62FC, 0x02,
+ 0x4098, 0xC7E9, 0x02,
+ 0x409A, 0x0001, 0x02,
+ 0x409C, 0x15E0, 0x02,
+ 0x409E, 0x08EA, 0x02,
+ 0x40A0, 0x042C, 0x02,
+ 0x40A2, 0x4CF0, 0x02,
+ 0x40A4, 0x010C, 0x02,
+ 0x40A6, 0xA2F8, 0x02,
+ 0x40A8, 0x00C0, 0x02,
+ 0x40AA, 0xA1FB, 0x02,
+ 0x40AC, 0x042C, 0x02,
+ 0x40AE, 0x00FB, 0x02,
+ 0x40B0, 0x04C0, 0x02,
+ 0x40B2, 0x01FB, 0x02,
+ 0x40B4, 0x0301, 0x02,
+ 0x40B6, 0xC9E9, 0x02,
+ 0x40B8, 0x0012, 0x02,
+ 0x40BA, 0xA6FB, 0x02,
+ 0x40BC, 0x0401, 0x02,
+ 0x40BE, 0x05FB, 0x02,
+ 0x40C0, 0x0411, 0x02,
+ 0x40C2, 0x06FB, 0x02,
+ 0x40C4, 0x0311, 0x02,
+ 0x40C6, 0xC7E9, 0x02,
+ 0x40C8, 0x0010, 0x02,
+ 0x40CA, 0xB848, 0x02,
+ 0x40CC, 0xB949, 0x02,
+ 0x40CE, 0xB0F8, 0x02,
+ 0x40D0, 0x4805, 0x02,
+ 0x40D2, 0x0880, 0x02,
+ 0x40D4, 0xB848, 0x02,
+ 0x40D6, 0x0CC8, 0x02,
+ 0x40D8, 0x48F6, 0x02,
+ 0x40DA, 0x2200, 0x02,
+ 0x40DC, 0x00F0, 0x02,
+ 0x40DE, 0x43FC, 0x02,
+ 0x40E0, 0xB548, 0x02,
+ 0x40E2, 0x0830, 0x02,
+ 0x40E4, 0x0CC8, 0x02,
+ 0x40E6, 0x48F6, 0x02,
+ 0x40E8, 0x2A00, 0x02,
+ 0x40EA, 0x00F0, 0x02,
+ 0x40EC, 0x3CFC, 0x02,
+ 0x40EE, 0x5846, 0x02,
+ 0x40F0, 0x00F0, 0x02,
+ 0x40F2, 0x3EFC, 0x02,
+ 0x40F4, 0xAD49, 0x02,
+ 0x40F6, 0x0122, 0x02,
+ 0x40F8, 0xC1F8, 0x02,
+ 0x40FA, 0x68A5, 0x02,
+ 0x40FC, 0xDDE9, 0x02,
+ 0x40FE, 0x0010, 0x02,
+ 0x4100, 0x02B0, 0x02,
+ 0x4102, 0xBDE8, 0x02,
+ 0x4104, 0xF05F, 0x02,
+ 0x4106, 0x00F0, 0x02,
+ 0x4108, 0x1FBC, 0x02,
+ 0x410A, 0xA84A, 0x02,
+ 0x410C, 0x92F8, 0x02,
+ 0x410E, 0xD525, 0x02,
+ 0x4110, 0x2AB1, 0x02,
+ 0x4112, 0xA64A, 0x02,
+ 0x4114, 0xA54B, 0x02,
+ 0x4116, 0xD2F8, 0x02,
+ 0x4118, 0x6825, 0x02,
+ 0x411A, 0xC3F8, 0x02,
+ 0x411C, 0x3024, 0x02,
+ 0x411E, 0xA34A, 0x02,
+ 0x4120, 0xD2F8, 0x02,
+ 0x4122, 0x3024, 0x02,
+ 0x4124, 0x00F0, 0x02,
+ 0x4126, 0x29BC, 0x02,
+ 0x4128, 0x10B5, 0x02,
+ 0x412A, 0xA049, 0x02,
+ 0x412C, 0xA34A, 0x02,
+ 0x412E, 0xA44B, 0x02,
+ 0x4130, 0xD1F8, 0x02,
+ 0x4132, 0x3C14, 0x02,
+ 0x4134, 0x947C, 0x02,
+ 0x4136, 0x0CB1, 0x02,
+ 0x4138, 0x908A, 0x02,
+ 0x413A, 0x1BE0, 0x02,
+ 0x413C, 0x9B4A, 0x02,
+ 0x413E, 0x92F8, 0x02,
+ 0x4140, 0xA220, 0x02,
+ 0x4142, 0xC2F1, 0x02,
+ 0x4144, 0x0C02, 0x02,
+ 0x4146, 0xD140, 0x02,
+ 0x4148, 0x4843, 0x02,
+ 0x414A, 0x010A, 0x02,
+ 0x414C, 0x9D48, 0x02,
+ 0x414E, 0xD0F8, 0x02,
+ 0x4150, 0x8400, 0x02,
+ 0x4152, 0x0279, 0x02,
+ 0x4154, 0x4A43, 0x02,
+ 0x4156, 0x4179, 0x02,
+ 0x4158, 0xC088, 0x02,
+ 0x415A, 0xCA40, 0x02,
+ 0x415C, 0x00EB, 0x02,
+ 0x415E, 0x1210, 0x02,
+ 0x4160, 0x4FF4, 0x02,
+ 0x4162, 0x8021, 0x02,
+ 0x4164, 0xB1FB, 0x02,
+ 0x4166, 0xF0F0, 0x02,
+ 0x4168, 0x0911, 0x02,
+ 0x416A, 0x8842, 0x02,
+ 0x416C, 0x04D2, 0x02,
+ 0x416E, 0x4028, 0x02,
+ 0x4170, 0x00D8, 0x02,
+ 0x4172, 0x4020, 0x02,
+ 0x4174, 0x5880, 0x02,
+ 0x4176, 0x10BD, 0x02,
+ 0x4178, 0x0846, 0x02,
+ 0x417A, 0xFBE7, 0x02,
+ 0x417C, 0x4168, 0x02,
+ 0x417E, 0x4A7B, 0x02,
+ 0x4180, 0x9149, 0x02,
+ 0x4182, 0xA1F8, 0x02,
+ 0x4184, 0x8223, 0x02,
+ 0x4186, 0x4268, 0x02,
+ 0x4188, 0x537B, 0x02,
+ 0x418A, 0x002B, 0x02,
+ 0x418C, 0x15D0, 0x02,
+ 0x418E, 0x01F5, 0x02,
+ 0x4190, 0x6171, 0x02,
+ 0x4192, 0x927B, 0x02,
+ 0x4194, 0x0A80, 0x02,
+ 0x4196, 0x4068, 0x02,
+ 0x4198, 0xC07B, 0x02,
+ 0x419A, 0x4880, 0x02,
+ 0x419C, 0x8B48, 0x02,
+ 0x419E, 0xB0F8, 0x02,
+ 0x41A0, 0xC220, 0x02,
+ 0x41A2, 0x8A80, 0x02,
+ 0x41A4, 0xB0F8, 0x02,
+ 0x41A6, 0xC420, 0x02,
+ 0x41A8, 0xCA80, 0x02,
+ 0x41AA, 0x10F8, 0x02,
+ 0x41AC, 0xC72F, 0x02,
+ 0x41AE, 0xC078, 0x02,
+ 0x41B0, 0x5208, 0x02,
+ 0x41B2, 0x4008, 0x02,
+ 0x41B4, 0x42EA, 0x02,
+ 0x41B6, 0x8000, 0x02,
+ 0x41B8, 0x0881, 0x02,
+ 0x41BA, 0x7047, 0x02,
+ 0x41BC, 0x2DE9, 0x02,
+ 0x41BE, 0xFF4F, 0x02,
+ 0x41C0, 0x8348, 0x02,
+ 0x41C2, 0x83B0, 0x02,
+ 0x41C4, 0x1D46, 0x02,
+ 0x41C6, 0xC079, 0x02,
+ 0x41C8, 0xDDF8, 0x02,
+ 0x41CA, 0x44B0, 0x02,
+ 0x41CC, 0x1646, 0x02,
+ 0x41CE, 0x0F46, 0x02,
+ 0x41D0, 0x0028, 0x02,
+ 0x41D2, 0x6ED0, 0x02,
+ 0x41D4, 0xDFF8, 0x02,
+ 0x41D6, 0xF4A1, 0x02,
+ 0x41D8, 0x0AF1, 0x02,
+ 0x41DA, 0xBA0A, 0x02,
+ 0x41DC, 0xAAF1, 0x02,
+ 0x41DE, 0x1C00, 0x02,
+ 0x41E0, 0xB0F8, 0x02,
+ 0x41E2, 0x0090, 0x02,
+ 0x41E4, 0xB0F8, 0x02,
+ 0x41E6, 0x0480, 0x02,
+ 0x41E8, 0x00F0, 0x02,
+ 0x41EA, 0xCCFB, 0x02,
+ 0x41EC, 0x0399, 0x02,
+ 0x41EE, 0x109C, 0x02,
+ 0x41F0, 0x0843, 0x02,
+ 0x41F2, 0x04F1, 0x02,
+ 0x41F4, 0x8044, 0x02,
+ 0x41F6, 0x07D0, 0x02,
+ 0x41F8, 0xA780, 0x02,
+ 0x41FA, 0xE680, 0x02,
+ 0x41FC, 0xAAF1, 0x02,
+ 0x41FE, 0x1C00, 0x02,
+ 0x4200, 0x0188, 0x02,
+ 0x4202, 0x2181, 0x02,
+ 0x4204, 0x8088, 0x02,
+ 0x4206, 0x20E0, 0x02,
+ 0x4208, 0x6848, 0x02,
+ 0x420A, 0x9AF8, 0x02,
+ 0x420C, 0x0C10, 0x02,
+ 0x420E, 0xB0F8, 0x02,
+ 0x4210, 0xD801, 0x02,
+ 0x4212, 0x4843, 0x02,
+ 0x4214, 0x0290, 0x02,
+ 0x4216, 0x00F0, 0x02,
+ 0x4218, 0xBAFB, 0x02,
+ 0x421A, 0x0028, 0x02,
+ 0x421C, 0x0298, 0x02,
+ 0x421E, 0x01D0, 0x02,
+ 0x4220, 0x361A, 0x02,
+ 0x4222, 0x00E0, 0x02,
+ 0x4224, 0x0744, 0x02,
+ 0x4226, 0xA780, 0x02,
+ 0x4228, 0xE680, 0x02,
+ 0x422A, 0x6048, 0x02,
+ 0x422C, 0xB0F8, 0x02,
+ 0x422E, 0xDA61, 0x02,
+ 0x4230, 0x90F8, 0x02,
+ 0x4232, 0x8A02, 0x02,
+ 0x4234, 0x4643, 0x02,
+ 0x4236, 0x00F0, 0x02,
+ 0x4238, 0xAFFB, 0x02,
+ 0x423A, 0x10B1, 0x02,
+ 0x423C, 0xA8EB, 0x02,
+ 0x423E, 0x0608, 0x02,
+ 0x4240, 0x00E0, 0x02,
+ 0x4242, 0xB144, 0x02,
+ 0x4244, 0xA4F8, 0x02,
+ 0x4246, 0x0890, 0x02,
+ 0x4248, 0x4046, 0x02,
+ 0x424A, 0x6081, 0x02,
+ 0x424C, 0x0398, 0x02,
+ 0x424E, 0x28B1, 0x02,
+ 0x4250, 0x5648, 0x02,
+ 0x4252, 0x90F8, 0x02,
+ 0x4254, 0x4F11, 0x02,
+ 0x4256, 0x90F8, 0x02,
+ 0x4258, 0x8902, 0x02,
+ 0x425A, 0x03E0, 0x02,
+ 0x425C, 0x9AF8, 0x02,
+ 0x425E, 0x0D10, 0x02,
+ 0x4260, 0x9AF8, 0x02,
+ 0x4262, 0x0C00, 0x02,
+ 0x4264, 0x0A01, 0x02,
+ 0x4266, 0x5149, 0x02,
+ 0x4268, 0x91F8, 0x02,
+ 0x426A, 0x4E11, 0x02,
+ 0x426C, 0x42EA, 0x02,
+ 0x426E, 0x8121, 0x02,
+ 0x4270, 0x41F0, 0x02,
+ 0x4272, 0x0301, 0x02,
+ 0x4274, 0xA181, 0x02,
+ 0x4276, 0x0121, 0x02,
+ 0x4278, 0xFF22, 0x02,
+ 0x427A, 0x02EB, 0x02,
+ 0x427C, 0x4000, 0x02,
+ 0x427E, 0x41EA, 0x02,
+ 0x4280, 0x0020, 0x02,
+ 0x4282, 0xE081, 0x02,
+ 0x4284, 0x01A9, 0x02,
+ 0x4286, 0x6846, 0x02,
+ 0x4288, 0x00F0, 0x02,
+ 0x428A, 0x8BFB, 0x02,
+ 0x428C, 0x9DF8, 0x02,
+ 0x428E, 0x0000, 0x02,
+ 0x4290, 0x9DF8, 0x02,
+ 0x4292, 0x0410, 0x02,
+ 0x4294, 0x40EA, 0x02,
+ 0x4296, 0x0120, 0x02,
+ 0x4298, 0x2082, 0x02,
+ 0x429A, 0x5F46, 0x02,
+ 0x429C, 0x3E46, 0x02,
+ 0x429E, 0x00F0, 0x02,
+ 0x42A0, 0x7BFB, 0x02,
+ 0x42A2, 0x791E, 0x02,
+ 0x42A4, 0x0028, 0x02,
+ 0x42A6, 0xA889, 0x02,
+ 0x42A8, 0x04D0, 0x02,
+ 0x42AA, 0x4718, 0x02,
+ 0x42AC, 0x46F6, 0x02,
+ 0x42AE, 0xA410, 0x02,
+ 0x42B0, 0x03E0, 0x02,
+ 0x42B2, 0x3FE0, 0x02,
+ 0x42B4, 0x4618, 0x02,
+ 0x42B6, 0x46F6, 0x02,
+ 0x42B8, 0x2410, 0x02,
+ 0x42BA, 0xA880, 0x02,
+ 0x42BC, 0x6782, 0x02,
+ 0x42BE, 0xE682, 0x02,
+ 0x42C0, 0x0020, 0x02,
+ 0x42C2, 0xA082, 0x02,
+ 0x42C4, 0xA888, 0x02,
+ 0x42C6, 0x2080, 0x02,
+ 0x42C8, 0x00F0, 0x02,
+ 0x42CA, 0x70FB, 0x02,
+ 0x42CC, 0x0128, 0x02,
+ 0x42CE, 0x0CD1, 0x02,
+ 0x42D0, 0x00F0, 0x02,
+ 0x42D2, 0x71FB, 0x02,
+ 0x42D4, 0x48B1, 0x02,
+ 0x42D6, 0x00F0, 0x02,
+ 0x42D8, 0x73FB, 0x02,
+ 0x42DA, 0x30B1, 0x02,
+ 0x42DC, 0x40F2, 0x02,
+ 0x42DE, 0x1340, 0x02,
+ 0x42E0, 0xA081, 0x02,
+ 0x42E2, 0x40F2, 0x02,
+ 0x42E4, 0x0110, 0x02,
+ 0x42E6, 0xE081, 0x02,
+ 0x42E8, 0x2082, 0x02,
+ 0x42EA, 0x2B6A, 0x02,
+ 0x42EC, 0x0021, 0x02,
+ 0x42EE, 0x8320, 0x02,
+ 0x42F0, 0x109A, 0x02,
+ 0x42F2, 0x00F0, 0x02,
+ 0x42F4, 0x6AFB, 0x02,
+ 0x42F6, 0xE881, 0x02,
+ 0x42F8, 0x00F0, 0x02,
+ 0x42FA, 0x58FB, 0x02,
+ 0x42FC, 0x0126, 0x02,
+ 0x42FE, 0x0128, 0x02,
+ 0x4300, 0x12D1, 0x02,
+ 0x4302, 0x00F0, 0x02,
+ 0x4304, 0x58FB, 0x02,
+ 0x4306, 0x78B1, 0x02,
+ 0x4308, 0x00F0, 0x02,
+ 0x430A, 0x5AFB, 0x02,
+ 0x430C, 0x60B1, 0x02,
+ 0x430E, 0x2680, 0x02,
+ 0x4310, 0x3048, 0x02,
+ 0x4312, 0x0021, 0x02,
+ 0x4314, 0x04E0, 0x02,
+ 0x4316, 0x0288, 0x02,
+ 0x4318, 0x5208, 0x02,
+ 0x431A, 0x20F8, 0x02,
+ 0x431C, 0x022B, 0x02,
+ 0x431E, 0x491C, 0x02,
+ 0x4320, 0xEA89, 0x02,
+ 0x4322, 0xB1EB, 0x02,
+ 0x4324, 0x420F, 0x02,
+ 0x4326, 0xF6DB, 0x02,
+ 0x4328, 0xE989, 0x02,
+ 0x432A, 0xA889, 0x02,
+ 0x432C, 0x8142, 0x02,
+ 0x432E, 0x00D9, 0x02,
+ 0x4330, 0xE881, 0x02,
+ 0x4332, 0x2680, 0x02,
+ 0x4334, 0x07B0, 0x02,
+ 0x4336, 0xBDE8, 0x02,
+ 0x4338, 0xF08F, 0x02,
+ 0x433A, 0x2DE9, 0x02,
+ 0x433C, 0xF843, 0x02,
+ 0x433E, 0x1A48, 0x02,
+ 0x4340, 0x0022, 0x02,
+ 0x4342, 0x4069, 0x02,
+ 0x4344, 0x85B2, 0x02,
+ 0x4346, 0x4FEA, 0x02,
+ 0x4348, 0x1048, 0x02,
+ 0x434A, 0x2946, 0x02,
+ 0x434C, 0x4046, 0x02,
+ 0x434E, 0x00F0, 0x02,
+ 0x4350, 0xFBFA, 0x02,
+ 0x4352, 0x00F0, 0x02,
+ 0x4354, 0x3FFB, 0x02,
+ 0x4356, 0x204F, 0x02,
+ 0x4358, 0x97F8, 0x02,
+ 0x435A, 0x7300, 0x02,
+ 0x435C, 0x30B1, 0x02,
+ 0x435E, 0x1348, 0x02,
+ 0x4360, 0x90F8, 0x02,
+ 0x4362, 0x8B02, 0x02,
+ 0x4364, 0x10B1, 0x02,
+ 0x4366, 0x1D49, 0x02,
+ 0x4368, 0x1B20, 0x02,
+ 0x436A, 0x0880, 0x02,
+ 0x436C, 0x1C48, 0x02,
+ 0x436E, 0x0E4E, 0x02,
+ 0x4370, 0x3436, 0x02,
+ 0x4372, 0x90F8, 0x02,
+ 0x4374, 0xC046, 0x02,
+ 0x4376, 0xB089, 0x02,
+ 0x4378, 0x98B9, 0x02,
+ 0x437A, 0x0020, 0x02,
+ 0x437C, 0xADF8, 0x02,
+ 0x437E, 0x0000, 0x02,
+ 0x4380, 0x0A48, 0x02,
+ 0x4382, 0x0222, 0x02,
+ 0x4384, 0x6946, 0x02,
+ 0x4386, 0xB0F8, 0x02,
+ 0x4388, 0x0006, 0x02,
+ 0x438A, 0x2E30, 0x02,
+ 0x438C, 0x00F0, 0x02,
+ 0x438E, 0x27FB, 0x02,
+ 0x4390, 0x10B1, 0x02,
+ 0x4392, 0xBDF8, 0x02,
+ 0x4394, 0x0000, 0x02,
+ 0x4396, 0xB081, 0x02,
+ 0x4398, 0xB089, 0x02,
+ 0x439A, 0x10B9, 0x02,
+ 0x439C, 0x4FF4, 0x02,
+ 0x439E, 0x8060, 0x02,
+ 0x43A0, 0xB081, 0x02,
+ 0x43A2, 0x97F8, 0x02,
+ 0x43A4, 0x7500, 0x02,
+ 0x43A6, 0x1DE0, 0x02,
+ 0x43A8, 0x2000, 0x02,
+ 0x43AA, 0x4A40, 0x02,
+ 0x43AC, 0x2000, 0x02,
+ 0x43AE, 0x2ED0, 0x02,
+ 0x43B0, 0x2000, 0x02,
+ 0x43B2, 0x0E20, 0x02,
+ 0x43B4, 0x4000, 0x02,
+ 0x43B6, 0x8832, 0x02,
+ 0x43B8, 0x2000, 0x02,
+ 0x43BA, 0x3420, 0x02,
+ 0x43BC, 0x2000, 0x02,
+ 0x43BE, 0x21A0, 0x02,
+ 0x43C0, 0x2000, 0x02,
+ 0x43C2, 0x3F40, 0x02,
+ 0x43C4, 0x2000, 0x02,
+ 0x43C6, 0x3E70, 0x02,
+ 0x43C8, 0x4000, 0x02,
+ 0x43CA, 0xA000, 0x02,
+ 0x43CC, 0x2000, 0x02,
+ 0x43CE, 0x38C0, 0x02,
+ 0x43D0, 0x2000, 0x02,
+ 0x43D2, 0x2210, 0x02,
+ 0x43D4, 0x2000, 0x02,
+ 0x43D6, 0x8000, 0x02,
+ 0x43D8, 0x2000, 0x02,
+ 0x43DA, 0x2850, 0x02,
+ 0x43DC, 0x4000, 0x02,
+ 0x43DE, 0xF47E, 0x02,
+ 0x43E0, 0x2000, 0x02,
+ 0x43E2, 0x0FE0, 0x02,
+ 0x43E4, 0x28B1, 0x02,
+ 0x43E6, 0xB089, 0x02,
+ 0x43E8, 0x18B1, 0x02,
+ 0x43EA, 0x6043, 0x02,
+ 0x43EC, 0x00F5, 0x02,
+ 0x43EE, 0x0070, 0x02,
+ 0x43F0, 0x840A, 0x02,
+ 0x43F2, 0xFE48, 0x02,
+ 0x43F4, 0x4FF4, 0x02,
+ 0x43F6, 0x8072, 0x02,
+ 0x43F8, 0xB0F8, 0x02,
+ 0x43FA, 0x7C07, 0x02,
+ 0x43FC, 0x9042, 0x02,
+ 0x43FE, 0x01D9, 0x02,
+ 0x4400, 0x0146, 0x02,
+ 0x4402, 0x00E0, 0x02,
+ 0x4404, 0x1146, 0x02,
+ 0x4406, 0x8B01, 0x02,
+ 0x4408, 0xA3F5, 0x02,
+ 0x440A, 0x8043, 0x02,
+ 0x440C, 0x9042, 0x02,
+ 0x440E, 0x01D9, 0x02,
+ 0x4410, 0x0146, 0x02,
+ 0x4412, 0x00E0, 0x02,
+ 0x4414, 0x1146, 0x02,
+ 0x4416, 0x01FB, 0x02,
+ 0x4418, 0x0431, 0x02,
+ 0x441A, 0xFF23, 0x02,
+ 0x441C, 0xB3EB, 0x02,
+ 0x441E, 0x112F, 0x02,
+ 0x4420, 0x0ED9, 0x02,
+ 0x4422, 0x9042, 0x02,
+ 0x4424, 0x01D9, 0x02,
+ 0x4426, 0x0146, 0x02,
+ 0x4428, 0x00E0, 0x02,
+ 0x442A, 0x1146, 0x02,
+ 0x442C, 0x8901, 0x02,
+ 0x442E, 0xA1F5, 0x02,
+ 0x4430, 0x8041, 0x02,
+ 0x4432, 0x9042, 0x02,
+ 0x4434, 0x00D8, 0x02,
+ 0x4436, 0x1046, 0x02,
+ 0x4438, 0x00FB, 0x02,
+ 0x443A, 0x0410, 0x02,
+ 0x443C, 0x000A, 0x02,
+ 0x443E, 0x00E0, 0x02,
+ 0x4440, 0xFF20, 0x02,
+ 0x4442, 0xEB49, 0x02,
+ 0x4444, 0x0880, 0x02,
+ 0x4446, 0x2946, 0x02,
+ 0x4448, 0x4046, 0x02,
+ 0x444A, 0xBDE8, 0x02,
+ 0x444C, 0xF843, 0x02,
+ 0x444E, 0x0122, 0x02,
+ 0x4450, 0x00F0, 0x02,
+ 0x4452, 0x7ABA, 0x02,
+ 0x4454, 0x70B5, 0x02,
+ 0x4456, 0xE748, 0x02,
+ 0x4458, 0x0022, 0x02,
+ 0x445A, 0x8169, 0x02,
+ 0x445C, 0x0C0C, 0x02,
+ 0x445E, 0x8DB2, 0x02,
+ 0x4460, 0x2946, 0x02,
+ 0x4462, 0x2046, 0x02,
+ 0x4464, 0x00F0, 0x02,
+ 0x4466, 0x70FA, 0x02,
+ 0x4468, 0x00F0, 0x02,
+ 0x446A, 0xBEFA, 0x02,
+ 0x446C, 0xE248, 0x02,
+ 0x446E, 0x90F8, 0x02,
+ 0x4470, 0x7410, 0x02,
+ 0x4472, 0x11B1, 0x02,
+ 0x4474, 0x0021, 0x02,
+ 0x4476, 0x80F8, 0x02,
+ 0x4478, 0x7010, 0x02,
+ 0x447A, 0xE048, 0x02,
+ 0x447C, 0x4FF4, 0x02,
+ 0x447E, 0x8071, 0x02,
+ 0x4480, 0x90F8, 0x02,
+ 0x4482, 0x6F20, 0x02,
+ 0x4484, 0x4FF4, 0x02,
+ 0x4486, 0x3040, 0x02,
+ 0x4488, 0x00F0, 0x02,
+ 0x448A, 0x5EFA, 0x02,
+ 0x448C, 0x2946, 0x02,
+ 0x448E, 0x2046, 0x02,
+ 0x4490, 0xBDE8, 0x02,
+ 0x4492, 0x7040, 0x02,
+ 0x4494, 0x0122, 0x02,
+ 0x4496, 0x00F0, 0x02,
+ 0x4498, 0x57BA, 0x02,
+ 0x449A, 0x70B5, 0x02,
+ 0x449C, 0x0446, 0x02,
+ 0x449E, 0xD648, 0x02,
+ 0x44A0, 0xD74D, 0x02,
+ 0x44A2, 0x90F8, 0x02,
+ 0x44A4, 0x0804, 0x02,
+ 0x44A6, 0xC8B1, 0x02,
+ 0x44A8, 0x2846, 0x02,
+ 0x44AA, 0x90F8, 0x02,
+ 0x44AC, 0x0906, 0x02,
+ 0x44AE, 0xA8B1, 0x02,
+ 0x44B0, 0x2846, 0x02,
+ 0x44B2, 0xD5F8, 0x02,
+ 0x44B4, 0x8423, 0x02,
+ 0x44B6, 0xC0F8, 0x02,
+ 0x44B8, 0x1424, 0x02,
+ 0x44BA, 0x00F2, 0x02,
+ 0x44BC, 0x1441, 0x02,
+ 0x44BE, 0x2A46, 0x02,
+ 0x44C0, 0xD5F8, 0x02,
+ 0x44C2, 0x9003, 0x02,
+ 0x44C4, 0xC2F8, 0x02,
+ 0x44C6, 0x2004, 0x02,
+ 0x44C8, 0xD5F8, 0x02,
+ 0x44CA, 0xC043, 0x02,
+ 0x44CC, 0x1046, 0x02,
+ 0x44CE, 0xC5F8, 0x02,
+ 0x44D0, 0xE442, 0x02,
+ 0x44D2, 0xC0F8, 0x02,
+ 0x44D4, 0x3044, 0x02,
+ 0x44D6, 0x0846, 0x02,
+ 0x44D8, 0x00F0, 0x02,
+ 0x44DA, 0x8BFA, 0x02,
+ 0x44DC, 0xC749, 0x02,
+ 0x44DE, 0xB5F8, 0x02,
+ 0x44E0, 0xB022, 0x02,
+ 0x44E2, 0x088F, 0x02,
+ 0x44E4, 0x498F, 0x02,
+ 0x44E6, 0x201A, 0x02,
+ 0x44E8, 0x401E, 0x02,
+ 0x44EA, 0x1144, 0x02,
+ 0x44EC, 0x8142, 0x02,
+ 0x44EE, 0x00D9, 0x02,
+ 0x44F0, 0x0846, 0x02,
+ 0x44F2, 0xA5F8, 0x02,
+ 0x44F4, 0xB202, 0x02,
+ 0x44F6, 0x70BD, 0x02,
+ 0x44F8, 0x2DE9, 0x02,
+ 0x44FA, 0xF041, 0x02,
+ 0x44FC, 0x0646, 0x02,
+ 0x44FE, 0xBD48, 0x02,
+ 0x4500, 0x0022, 0x02,
+ 0x4502, 0x006A, 0x02,
+ 0x4504, 0x85B2, 0x02,
+ 0x4506, 0x040C, 0x02,
+ 0x4508, 0x2946, 0x02,
+ 0x450A, 0x2046, 0x02,
+ 0x450C, 0x00F0, 0x02,
+ 0x450E, 0x1CFA, 0x02,
+ 0x4510, 0x3046, 0x02,
+ 0x4512, 0x00F0, 0x02,
+ 0x4514, 0x73FA, 0x02,
+ 0x4516, 0xBB48, 0x02,
+ 0x4518, 0xBB4F, 0x02,
+ 0x451A, 0x0068, 0x02,
+ 0x451C, 0x3B68, 0x02,
+ 0x451E, 0x418B, 0x02,
+ 0x4520, 0x090A, 0x02,
+ 0x4522, 0x83F8, 0x02,
+ 0x4524, 0x3610, 0x02,
+ 0x4526, 0xC17E, 0x02,
+ 0x4528, 0x83F8, 0x02,
+ 0x452A, 0x3810, 0x02,
+ 0x452C, 0xB449, 0x02,
+ 0x452E, 0x91F8, 0x02,
+ 0x4530, 0x4C21, 0x02,
+ 0x4532, 0x002A, 0x02,
+ 0x4534, 0xD1F8, 0x02,
+ 0x4536, 0x3421, 0x02,
+ 0x4538, 0x01D0, 0x02,
+ 0x453A, 0x521C, 0x02,
+ 0x453C, 0x5208, 0x02,
+ 0x453E, 0xCE33, 0x02,
+ 0x4540, 0x160A, 0x02,
+ 0x4542, 0x1E71, 0x02,
+ 0x4544, 0x9A71, 0x02,
+ 0x4546, 0xB1F8, 0x02,
+ 0x4548, 0x3C21, 0x02,
+ 0x454A, 0xC2F3, 0x02,
+ 0x454C, 0x5712, 0x02,
+ 0x454E, 0x1A70, 0x02,
+ 0x4550, 0x91F8, 0x02,
+ 0x4552, 0x3D21, 0x02,
+ 0x4554, 0xD200, 0x02,
+ 0x4556, 0x9A70, 0x02,
+ 0x4558, 0x91F8, 0x02,
+ 0x455A, 0x4D21, 0x02,
+ 0x455C, 0xCE3B, 0x02,
+ 0x455E, 0x22B1, 0x02,
+ 0x4560, 0xD1F8, 0x02,
+ 0x4562, 0x3821, 0x02,
+ 0x4564, 0x521C, 0x02,
+ 0x4566, 0x5608, 0x02,
+ 0x4568, 0x01E0, 0x02,
+ 0x456A, 0xD1F8, 0x02,
+ 0x456C, 0x3861, 0x02,
+ 0x456E, 0x7A68, 0x02,
+ 0x4570, 0x4FEA, 0x02,
+ 0x4572, 0x162C, 0x02,
+ 0x4574, 0x01F5, 0x02,
+ 0x4576, 0x9071, 0x02,
+ 0x4578, 0x82F8, 0x02,
+ 0x457A, 0x16C0, 0x02,
+ 0x457C, 0x1676, 0x02,
+ 0x457E, 0xCE8B, 0x02,
+ 0x4580, 0x00F5, 0x02,
+ 0x4582, 0xBA70, 0x02,
+ 0x4584, 0xC6F3, 0x02,
+ 0x4586, 0x5716, 0x02,
+ 0x4588, 0x9674, 0x02,
+ 0x458A, 0xCE7F, 0x02,
+ 0x458C, 0xF600, 0x02,
+ 0x458E, 0x1675, 0x02,
+ 0x4590, 0x0E8C, 0x02,
+ 0x4592, 0xCF68, 0x02,
+ 0x4594, 0xF608, 0x02,
+ 0x4596, 0x7E43, 0x02,
+ 0x4598, 0x360B, 0x02,
+ 0x459A, 0x370A, 0x02,
+ 0x459C, 0x03F8, 0x02,
+ 0x459E, 0xD67F, 0x02,
+ 0x45A0, 0x7732, 0x02,
+ 0x45A2, 0x9E70, 0x02,
+ 0x45A4, 0x0688, 0x02,
+ 0x45A6, 0x360A, 0x02,
+ 0x45A8, 0x02F8, 0x02,
+ 0x45AA, 0x276C, 0x02,
+ 0x45AC, 0x4678, 0x02,
+ 0x45AE, 0x02F8, 0x02,
+ 0x45B0, 0x256C, 0x02,
+ 0x45B2, 0x8688, 0x02,
+ 0x45B4, 0x360A, 0x02,
+ 0x45B6, 0x02F8, 0x02,
+ 0x45B8, 0x1F6C, 0x02,
+ 0x45BA, 0x4679, 0x02,
+ 0x45BC, 0x02F8, 0x02,
+ 0x45BE, 0x1D6C, 0x02,
+ 0x45C0, 0x8F4E, 0x02,
+ 0x45C2, 0x96F8, 0x02,
+ 0x45C4, 0x1064, 0x02,
+ 0x45C6, 0xD671, 0x02,
+ 0x45C8, 0x8D4E, 0x02,
+ 0x45CA, 0x96F8, 0x02,
+ 0x45CC, 0x1164, 0x02,
+ 0x45CE, 0x5672, 0x02,
+ 0x45D0, 0x8B4E, 0x02,
+ 0x45D2, 0x96F8, 0x02,
+ 0x45D4, 0x0B64, 0x02,
+ 0x45D6, 0xD672, 0x02,
+ 0x45D8, 0x894E, 0x02,
+ 0x45DA, 0x96F8, 0x02,
+ 0x45DC, 0x0964, 0x02,
+ 0x45DE, 0x5673, 0x02,
+ 0x45E0, 0x90F8, 0x02,
+ 0x45E2, 0x3060, 0x02,
+ 0x45E4, 0xD673, 0x02,
+ 0x45E6, 0x90F8, 0x02,
+ 0x45E8, 0xDE00, 0x02,
+ 0x45EA, 0x02F8, 0x02,
+ 0x45EC, 0x1F0F, 0x02,
+ 0x45EE, 0x8448, 0x02,
+ 0x45F0, 0x00F2, 0x02,
+ 0x45F2, 0x7246, 0x02,
+ 0x45F4, 0x90F8, 0x02,
+ 0x45F6, 0x7204, 0x02,
+ 0x45F8, 0x9074, 0x02,
+ 0x45FA, 0x3078, 0x02,
+ 0x45FC, 0x1075, 0x02,
+ 0x45FE, 0xA522, 0x02,
+ 0x4600, 0xDA70, 0x02,
+ 0x4602, 0x0E20, 0x02,
+ 0x4604, 0x1871, 0x02,
+ 0x4606, 0x11F8, 0x02,
+ 0x4608, 0x7E0C, 0x02,
+ 0x460A, 0xC0F1, 0x02,
+ 0x460C, 0x0C01, 0x02,
+ 0x460E, 0x7C48, 0x02,
+ 0x4610, 0xD0F8, 0x02,
+ 0x4612, 0x3C04, 0x02,
+ 0x4614, 0xC840, 0x02,
+ 0x4616, 0x060A, 0x02,
+ 0x4618, 0x9E71, 0x02,
+ 0x461A, 0x1872, 0x02,
+ 0x461C, 0x0120, 0x02,
+ 0x461E, 0x03F8, 0x02,
+ 0x4620, 0x2C0C, 0x02,
+ 0x4622, 0x7748, 0x02,
+ 0x4624, 0xD0F8, 0x02,
+ 0x4626, 0x4C04, 0x02,
+ 0x4628, 0xC840, 0x02,
+ 0x462A, 0xAA21, 0x02,
+ 0x462C, 0x03F8, 0x02,
+ 0x462E, 0x571D, 0x02,
+ 0x4630, 0x0226, 0x02,
+ 0x4632, 0x5E70, 0x02,
+ 0x4634, 0x9A70, 0x02,
+ 0x4636, 0x3022, 0x02,
+ 0x4638, 0xDA70, 0x02,
+ 0x463A, 0x5A22, 0x02,
+ 0x463C, 0x1A71, 0x02,
+ 0x463E, 0x060A, 0x02,
+ 0x4640, 0x5E71, 0x02,
+ 0x4642, 0x9A71, 0x02,
+ 0x4644, 0xD871, 0x02,
+ 0x4646, 0x1972, 0x02,
+ 0x4648, 0x0020, 0x02,
+ 0x464A, 0x5872, 0x02,
+ 0x464C, 0x2946, 0x02,
+ 0x464E, 0x2046, 0x02,
+ 0x4650, 0xBDE8, 0x02,
+ 0x4652, 0xF041, 0x02,
+ 0x4654, 0x0122, 0x02,
+ 0x4656, 0x00F0, 0x02,
+ 0x4658, 0x77B9, 0x02,
+ 0x465A, 0x2DE9, 0x02,
+ 0x465C, 0xF041, 0x02,
+ 0x465E, 0x0746, 0x02,
+ 0x4660, 0x6448, 0x02,
+ 0x4662, 0x0C46, 0x02,
+ 0x4664, 0x0022, 0x02,
+ 0x4666, 0x406A, 0x02,
+ 0x4668, 0x86B2, 0x02,
+ 0x466A, 0x050C, 0x02,
+ 0x466C, 0x3146, 0x02,
+ 0x466E, 0x2846, 0x02,
+ 0x4670, 0x00F0, 0x02,
+ 0x4672, 0x6AF9, 0x02,
+ 0x4674, 0x2146, 0x02,
+ 0x4676, 0x3846, 0x02,
+ 0x4678, 0x00F0, 0x02,
+ 0x467A, 0xC5F9, 0x02,
+ 0x467C, 0x6048, 0x02,
+ 0x467E, 0x90F8, 0x02,
+ 0x4680, 0x9702, 0x02,
+ 0x4682, 0x10B9, 0x02,
+ 0x4684, 0x00F0, 0x02,
+ 0x4686, 0x97F9, 0x02,
+ 0x4688, 0x20B1, 0x02,
+ 0x468A, 0x04F1, 0x02,
+ 0x468C, 0x8044, 0x02,
+ 0x468E, 0xA08A, 0x02,
+ 0x4690, 0x401C, 0x02,
+ 0x4692, 0xA082, 0x02,
+ 0x4694, 0x3146, 0x02,
+ 0x4696, 0x2846, 0x02,
+ 0x4698, 0xBDE8, 0x02,
+ 0x469A, 0xF041, 0x02,
+ 0x469C, 0x0122, 0x02,
+ 0x469E, 0x00F0, 0x02,
+ 0x46A0, 0x53B9, 0x02,
+ 0x46A2, 0x2DE9, 0x02,
+ 0x46A4, 0xF041, 0x02,
+ 0x46A6, 0x0746, 0x02,
+ 0x46A8, 0x5248, 0x02,
+ 0x46AA, 0x0E46, 0x02,
+ 0x46AC, 0x0022, 0x02,
+ 0x46AE, 0x806A, 0x02,
+ 0x46B0, 0x85B2, 0x02,
+ 0x46B2, 0x040C, 0x02,
+ 0x46B4, 0x2946, 0x02,
+ 0x46B6, 0x2046, 0x02,
+ 0x46B8, 0x00F0, 0x02,
+ 0x46BA, 0x46F9, 0x02,
+ 0x46BC, 0x3146, 0x02,
+ 0x46BE, 0x3846, 0x02,
+ 0x46C0, 0x00F0, 0x02,
+ 0x46C2, 0xA6F9, 0x02,
+ 0x46C4, 0x4B4F, 0x02,
+ 0x46C6, 0x4DF2, 0x02,
+ 0x46C8, 0x0C26, 0x02,
+ 0x46CA, 0x3437, 0x02,
+ 0x46CC, 0x4FF4, 0x02,
+ 0x46CE, 0x8061, 0x02,
+ 0x46D0, 0x3A78, 0x02,
+ 0x46D2, 0x3046, 0x02,
+ 0x46D4, 0x00F0, 0x02,
+ 0x46D6, 0x38F9, 0x02,
+ 0x46D8, 0x7878, 0x02,
+ 0x46DA, 0xC8B3, 0x02,
+ 0x46DC, 0x0022, 0x02,
+ 0x46DE, 0x4FF4, 0x02,
+ 0x46E0, 0x0071, 0x02,
+ 0x46E2, 0x3046, 0x02,
+ 0x46E4, 0x00F0, 0x02,
+ 0x46E6, 0x30F9, 0x02,
+ 0x46E8, 0x4848, 0x02,
+ 0x46EA, 0x0088, 0x02,
+ 0x46EC, 0x484B, 0x02,
+ 0x46EE, 0xA3F8, 0x02,
+ 0x46F0, 0x4402, 0x02,
+ 0x46F2, 0x4648, 0x02,
+ 0x46F4, 0x001D, 0x02,
+ 0x46F6, 0x0088, 0x02,
+ 0x46F8, 0xA3F8, 0x02,
+ 0x46FA, 0x4602, 0x02,
+ 0x46FC, 0xB3F8, 0x02,
+ 0x46FE, 0x4402, 0x02,
+ 0x4700, 0xB3F8, 0x02,
+ 0x4702, 0x4612, 0x02,
+ 0x4704, 0x4218, 0x02,
+ 0x4706, 0x02D0, 0x02,
+ 0x4708, 0x8002, 0x02,
+ 0x470A, 0xB0FB, 0x02,
+ 0x470C, 0xF2F2, 0x02,
+ 0x470E, 0x91B2, 0x02,
+ 0x4710, 0x404A, 0x02,
+ 0x4712, 0xA3F8, 0x02,
+ 0x4714, 0x4812, 0x02,
+ 0x4716, 0x5088, 0x02,
+ 0x4718, 0x1288, 0x02,
+ 0x471A, 0x3D4B, 0x02,
+ 0x471C, 0xA3F8, 0x02,
+ 0x471E, 0xA605, 0x02,
+ 0x4720, 0xA3F8, 0x02,
+ 0x4722, 0xA825, 0x02,
+ 0x4724, 0x8018, 0x02,
+ 0x4726, 0x05D0, 0x02,
+ 0x4728, 0x9202, 0x02,
+ 0x472A, 0xB2FB, 0x02,
+ 0x472C, 0xF0F0, 0x02,
+ 0x472E, 0x1A46, 0x02,
+ 0x4730, 0xA2F8, 0x02,
+ 0x4732, 0xAA05, 0x02,
+ 0x4734, 0x3648, 0x02,
+ 0x4736, 0xB0F8, 0x02,
+ 0x4738, 0xAA05, 0x02,
+ 0x473A, 0x0A18, 0x02,
+ 0x473C, 0x01FB, 0x02,
+ 0x473E, 0x1020, 0x02,
+ 0x4740, 0x40F3, 0x02,
+ 0x4742, 0x9510, 0x02,
+ 0x4744, 0x1028, 0x02,
+ 0x4746, 0x06DC, 0x02,
+ 0x4748, 0x0028, 0x02,
+ 0x474A, 0x05DA, 0x02,
+ 0x474C, 0x0020, 0x02,
+ 0x474E, 0x03E0, 0x02,
+ 0x4750, 0xFFE7, 0x02,
+ 0x4752, 0x0122, 0x02,
+ 0x4754, 0xC3E7, 0x02,
+ 0x4756, 0x1020, 0x02,
+ 0x4758, 0x2F49, 0x02,
+ 0x475A, 0x0880, 0x02,
+ 0x475C, 0x2946, 0x02,
+ 0x475E, 0x2046, 0x02,
+ 0x4760, 0xBDE8, 0x02,
+ 0x4762, 0xF041, 0x02,
+ 0x4764, 0x0122, 0x02,
+ 0x4766, 0x00F0, 0x02,
+ 0x4768, 0xEFB8, 0x02,
+ 0x476A, 0x70B5, 0x02,
+ 0x476C, 0x2148, 0x02,
+ 0x476E, 0x0022, 0x02,
+ 0x4770, 0xC16A, 0x02,
+ 0x4772, 0x0C0C, 0x02,
+ 0x4774, 0x8DB2, 0x02,
+ 0x4776, 0x2946, 0x02,
+ 0x4778, 0x2046, 0x02,
+ 0x477A, 0x00F0, 0x02,
+ 0x477C, 0xE5F8, 0x02,
+ 0x477E, 0x2148, 0x02,
+ 0x4780, 0x0268, 0x02,
+ 0x4782, 0xB2F8, 0x02,
+ 0x4784, 0x6202, 0x02,
+ 0x4786, 0x8301, 0x02,
+ 0x4788, 0x92F8, 0x02,
+ 0x478A, 0x6002, 0x02,
+ 0x478C, 0x10F0, 0x02,
+ 0x478E, 0x020F, 0x02,
+ 0x4790, 0x09D0, 0x02,
+ 0x4792, 0x1848, 0x02,
+ 0x4794, 0x3430, 0x02,
+ 0x4796, 0x8188, 0x02,
+ 0x4798, 0x9942, 0x02,
+ 0x479A, 0x06D8, 0x02,
+ 0x479C, 0x4088, 0x02,
+ 0x479E, 0xA0F5, 0x02,
+ 0x47A0, 0x5141, 0x02,
+ 0x47A2, 0x2339, 0x02,
+ 0x47A4, 0x01D1, 0x02,
+ 0x47A6, 0x00F0, 0x02,
+ 0x47A8, 0x38F9, 0x02,
+ 0x47AA, 0x2946, 0x02,
+ 0x47AC, 0x2046, 0x02,
+ 0x47AE, 0xBDE8, 0x02,
+ 0x47B0, 0x7040, 0x02,
+ 0x47B2, 0x0122, 0x02,
+ 0x47B4, 0x00F0, 0x02,
+ 0x47B6, 0xC8B8, 0x02,
+ 0x47B8, 0x70B5, 0x02,
+ 0x47BA, 0x0646, 0x02,
+ 0x47BC, 0x0D48, 0x02,
+ 0x47BE, 0x0022, 0x02,
+ 0x47C0, 0x016B, 0x02,
+ 0x47C2, 0x0C0C, 0x02,
+ 0x47C4, 0x8DB2, 0x02,
+ 0x47C6, 0x2946, 0x02,
+ 0x47C8, 0x2046, 0x02,
+ 0x47CA, 0x00F0, 0x02,
+ 0x47CC, 0xBDF8, 0x02,
+ 0x47CE, 0x3046, 0x02,
+ 0x47D0, 0x00F0, 0x02,
+ 0x47D2, 0x28F9, 0x02,
+ 0x47D4, 0x0749, 0x02,
+ 0x47D6, 0x114A, 0x02,
+ 0x47D8, 0x3431, 0x02,
+ 0x47DA, 0xCB79, 0x02,
+ 0x47DC, 0xD068, 0x02,
+ 0x47DE, 0x9840, 0x02,
+ 0x47E0, 0xD060, 0x02,
+ 0x47E2, 0x1068, 0x02,
+ 0x47E4, 0x9840, 0x02,
+ 0x47E6, 0x1060, 0x02,
+ 0x47E8, 0x8868, 0x02,
+ 0x47EA, 0x19E0, 0x02,
+ 0x47EC, 0x2000, 0x02,
+ 0x47EE, 0x0FE0, 0x02,
+ 0x47F0, 0x4000, 0x02,
+ 0x47F2, 0xF474, 0x02,
+ 0x47F4, 0x2000, 0x02,
+ 0x47F6, 0x4A40, 0x02,
+ 0x47F8, 0x2000, 0x02,
+ 0x47FA, 0x2850, 0x02,
+ 0x47FC, 0x2000, 0x02,
+ 0x47FE, 0x0E20, 0x02,
+ 0x4800, 0x2000, 0x02,
+ 0x4802, 0x2ED0, 0x02,
+ 0x4804, 0x2000, 0x02,
+ 0x4806, 0x08D0, 0x02,
+ 0x4808, 0x2000, 0x02,
+ 0x480A, 0x36E0, 0x02,
+ 0x480C, 0x4000, 0x02,
+ 0x480E, 0x9404, 0x02,
+ 0x4810, 0x2000, 0x02,
+ 0x4812, 0x38C0, 0x02,
+ 0x4814, 0x4000, 0x02,
+ 0x4816, 0xD214, 0x02,
+ 0x4818, 0x4000, 0x02,
+ 0x481A, 0xA410, 0x02,
+ 0x481C, 0x2000, 0x02,
+ 0x481E, 0x3254, 0x02,
+ 0x4820, 0xD063, 0x02,
+ 0x4822, 0x2946, 0x02,
+ 0x4824, 0x2046, 0x02,
+ 0x4826, 0xBDE8, 0x02,
+ 0x4828, 0x7040, 0x02,
+ 0x482A, 0x0122, 0x02,
+ 0x482C, 0x00F0, 0x02,
+ 0x482E, 0x8CB8, 0x02,
+ 0x4830, 0x10B5, 0x02,
+ 0x4832, 0x0022, 0x02,
+ 0x4834, 0xAFF6, 0x02,
+ 0x4836, 0x9701, 0x02,
+ 0x4838, 0x3348, 0x02,
+ 0x483A, 0x00F0, 0x02,
+ 0x483C, 0xF8F8, 0x02,
+ 0x483E, 0x334C, 0x02,
+ 0x4840, 0x0022, 0x02,
+ 0x4842, 0xAFF6, 0x02,
+ 0x4844, 0x3F01, 0x02,
+ 0x4846, 0x2060, 0x02,
+ 0x4848, 0x3148, 0x02,
+ 0x484A, 0x00F0, 0x02,
+ 0x484C, 0xF0F8, 0x02,
+ 0x484E, 0x6060, 0x02,
+ 0x4850, 0xAFF2, 0x02,
+ 0x4852, 0x4970, 0x02,
+ 0x4854, 0x2F49, 0x02,
+ 0x4856, 0x0022, 0x02,
+ 0x4858, 0xC861, 0x02,
+ 0x485A, 0xAFF2, 0x02,
+ 0x485C, 0x9F61, 0x02,
+ 0x485E, 0x2E48, 0x02,
+ 0x4860, 0x00F0, 0x02,
+ 0x4862, 0xE5F8, 0x02,
+ 0x4864, 0x0022, 0x02,
+ 0x4866, 0xAFF2, 0x02,
+ 0x4868, 0x2D51, 0x02,
+ 0x486A, 0x2061, 0x02,
+ 0x486C, 0x2B48, 0x02,
+ 0x486E, 0x00F0, 0x02,
+ 0x4870, 0xDEF8, 0x02,
+ 0x4872, 0x0022, 0x02,
+ 0x4874, 0xAFF2, 0x02,
+ 0x4876, 0x2341, 0x02,
+ 0x4878, 0x6061, 0x02,
+ 0x487A, 0x2948, 0x02,
+ 0x487C, 0x00F0, 0x02,
+ 0x487E, 0xD7F8, 0x02,
+ 0x4880, 0x0022, 0x02,
+ 0x4882, 0xAFF2, 0x02,
+ 0x4884, 0xE931, 0x02,
+ 0x4886, 0xA061, 0x02,
+ 0x4888, 0x2648, 0x02,
+ 0x488A, 0x00F0, 0x02,
+ 0x488C, 0xD0F8, 0x02,
+ 0x488E, 0x0022, 0x02,
+ 0x4890, 0xAFF2, 0x02,
+ 0x4892, 0x6B71, 0x02,
+ 0x4894, 0xE061, 0x02,
+ 0x4896, 0x2448, 0x02,
+ 0x4898, 0x00F0, 0x02,
+ 0x489A, 0xC9F8, 0x02,
+ 0x489C, 0x0022, 0x02,
+ 0x489E, 0xAFF2, 0x02,
+ 0x48A0, 0x2371, 0x02,
+ 0x48A2, 0xA060, 0x02,
+ 0x48A4, 0x2148, 0x02,
+ 0x48A6, 0x00F0, 0x02,
+ 0x48A8, 0xC2F8, 0x02,
+ 0x48AA, 0x0022, 0x02,
+ 0x48AC, 0xAFF2, 0x02,
+ 0x48AE, 0xB731, 0x02,
+ 0x48B0, 0xE060, 0x02,
+ 0x48B2, 0x1F48, 0x02,
+ 0x48B4, 0x00F0, 0x02,
+ 0x48B6, 0xBBF8, 0x02,
+ 0x48B8, 0x0022, 0x02,
+ 0x48BA, 0xAFF2, 0x02,
+ 0x48BC, 0x6121, 0x02,
+ 0x48BE, 0x2062, 0x02,
+ 0x48C0, 0x1C48, 0x02,
+ 0x48C2, 0x00F0, 0x02,
+ 0x48C4, 0xB4F8, 0x02,
+ 0x48C6, 0x6062, 0x02,
+ 0x48C8, 0x0020, 0x02,
+ 0x48CA, 0x04F1, 0x02,
+ 0x48CC, 0x3401, 0x02,
+ 0x48CE, 0x0246, 0x02,
+ 0x48D0, 0x8881, 0x02,
+ 0x48D2, 0xAFF2, 0x02,
+ 0x48D4, 0x3121, 0x02,
+ 0x48D6, 0x1848, 0x02,
+ 0x48D8, 0x00F0, 0x02,
+ 0x48DA, 0xA9F8, 0x02,
+ 0x48DC, 0x0022, 0x02,
+ 0x48DE, 0xAFF2, 0x02,
+ 0x48E0, 0x7511, 0x02,
+ 0x48E2, 0xA062, 0x02,
+ 0x48E4, 0x1548, 0x02,
+ 0x48E6, 0x00F0, 0x02,
+ 0x48E8, 0xA2F8, 0x02,
+ 0x48EA, 0x0022, 0x02,
+ 0x48EC, 0xAFF2, 0x02,
+ 0x48EE, 0x3711, 0x02,
+ 0x48F0, 0xE062, 0x02,
+ 0x48F2, 0x1348, 0x02,
+ 0x48F4, 0x00F0, 0x02,
+ 0x48F6, 0x9BF8, 0x02,
+ 0x48F8, 0x1249, 0x02,
+ 0x48FA, 0x2063, 0x02,
+ 0x48FC, 0x40F6, 0x02,
+ 0x48FE, 0xF100, 0x02,
+ 0x4900, 0x0968, 0x02,
+ 0x4902, 0x4883, 0x02,
+ 0x4904, 0x10BD, 0x02,
+ 0x4906, 0x0000, 0x02,
+ 0x4908, 0x0000, 0x02,
+ 0x490A, 0xDE1F, 0x02,
+ 0x490C, 0x2000, 0x02,
+ 0x490E, 0x4A40, 0x02,
+ 0x4910, 0x0000, 0x02,
+ 0x4912, 0x5F3B, 0x02,
+ 0x4914, 0x2000, 0x02,
+ 0x4916, 0x0850, 0x02,
+ 0x4918, 0x0000, 0x02,
+ 0x491A, 0xD719, 0x02,
+ 0x491C, 0x0000, 0x02,
+ 0x491E, 0x27FF, 0x02,
+ 0x4920, 0x0000, 0x02,
+ 0x4922, 0x39E3, 0x02,
+ 0x4924, 0x0001, 0x02,
+ 0x4926, 0x32CF, 0x02,
+ 0x4928, 0x0001, 0x02,
+ 0x492A, 0x1E3B, 0x02,
+ 0x492C, 0x0000, 0x02,
+ 0x492E, 0xEC45, 0x02,
+ 0x4930, 0x0000, 0x02,
+ 0x4932, 0x67B9, 0x02,
+ 0x4934, 0x0000, 0x02,
+ 0x4936, 0xE62B, 0x02,
+ 0x4938, 0x0001, 0x02,
+ 0x493A, 0x2265, 0x02,
+ 0x493C, 0x0000, 0x02,
+ 0x493E, 0x8C83, 0x02,
+ 0x4940, 0x0000, 0x02,
+ 0x4942, 0x5449, 0x02,
+ 0x4944, 0x2000, 0x02,
+ 0x4946, 0x08D0, 0x02,
+ 0x4948, 0x4AF2, 0x02,
+ 0x494A, 0x2B1C, 0x02,
+ 0x494C, 0xC0F2, 0x02,
+ 0x494E, 0x000C, 0x02,
+ 0x4950, 0x6047, 0x02,
+ 0x4952, 0x4DF6, 0x02,
+ 0x4954, 0x1F6C, 0x02,
+ 0x4956, 0xC0F2, 0x02,
+ 0x4958, 0x000C, 0x02,
+ 0x495A, 0x6047, 0x02,
+ 0x495C, 0x44F6, 0x02,
+ 0x495E, 0x655C, 0x02,
+ 0x4960, 0xC0F2, 0x02,
+ 0x4962, 0x010C, 0x02,
+ 0x4964, 0x6047, 0x02,
+ 0x4966, 0x45F6, 0x02,
+ 0x4968, 0x433C, 0x02,
+ 0x496A, 0xC0F2, 0x02,
+ 0x496C, 0x000C, 0x02,
+ 0x496E, 0x6047, 0x02,
+ 0x4970, 0x45F6, 0x02,
+ 0x4972, 0xE36C, 0x02,
+ 0x4974, 0xC0F2, 0x02,
+ 0x4976, 0x000C, 0x02,
+ 0x4978, 0x6047, 0x02,
+ 0x497A, 0x46F2, 0x02,
+ 0x497C, 0x7B1C, 0x02,
+ 0x497E, 0xC0F2, 0x02,
+ 0x4980, 0x000C, 0x02,
+ 0x4982, 0x6047, 0x02,
+ 0x4984, 0x44F6, 0x02,
+ 0x4986, 0xD90C, 0x02,
+ 0x4988, 0xC0F2, 0x02,
+ 0x498A, 0x000C, 0x02,
+ 0x498C, 0x6047, 0x02,
+ 0x498E, 0x44F6, 0x02,
+ 0x4990, 0x791C, 0x02,
+ 0x4992, 0xC0F2, 0x02,
+ 0x4994, 0x000C, 0x02,
+ 0x4996, 0x6047, 0x02,
+ 0x4998, 0x44F6, 0x02,
+ 0x499A, 0x811C, 0x02,
+ 0x499C, 0xC0F2, 0x02,
+ 0x499E, 0x000C, 0x02,
+ 0x49A0, 0x6047, 0x02,
+ 0x49A2, 0x44F2, 0x02,
+ 0x49A4, 0xB50C, 0x02,
+ 0x49A6, 0xC0F2, 0x02,
+ 0x49A8, 0x000C, 0x02,
+ 0x49AA, 0x6047, 0x02,
+ 0x49AC, 0x44F6, 0x02,
+ 0x49AE, 0xE90C, 0x02,
+ 0x49B0, 0xC0F2, 0x02,
+ 0x49B2, 0x000C, 0x02,
+ 0x49B4, 0x6047, 0x02,
+ 0x49B6, 0x43F6, 0x02,
+ 0x49B8, 0x155C, 0x02,
+ 0x49BA, 0xC0F2, 0x02,
+ 0x49BC, 0x000C, 0x02,
+ 0x49BE, 0x6047, 0x02,
+ 0x49C0, 0x43F6, 0x02,
+ 0x49C2, 0x1D5C, 0x02,
+ 0x49C4, 0xC0F2, 0x02,
+ 0x49C6, 0x000C, 0x02,
+ 0x49C8, 0x6047, 0x02,
+ 0x49CA, 0x4DF2, 0x02,
+ 0x49CC, 0xC95C, 0x02,
+ 0x49CE, 0xC0F2, 0x02,
+ 0x49D0, 0x000C, 0x02,
+ 0x49D2, 0x6047, 0x02,
+ 0x49D4, 0x42F2, 0x02,
+ 0x49D6, 0xFF7C, 0x02,
+ 0x49D8, 0xC0F2, 0x02,
+ 0x49DA, 0x000C, 0x02,
+ 0x49DC, 0x6047, 0x02,
+ 0x49DE, 0x48F2, 0x02,
+ 0x49E0, 0x712C, 0x02,
+ 0x49E2, 0xC0F2, 0x02,
+ 0x49E4, 0x000C, 0x02,
+ 0x49E6, 0x6047, 0x02,
+ 0x49E8, 0x43F6, 0x02,
+ 0x49EA, 0xE31C, 0x02,
+ 0x49EC, 0xC0F2, 0x02,
+ 0x49EE, 0x000C, 0x02,
+ 0x49F0, 0x6047, 0x02,
+ 0x49F2, 0x43F2, 0x02,
+ 0x49F4, 0x374C, 0x02,
+ 0x49F6, 0xC0F2, 0x02,
+ 0x49F8, 0x010C, 0x02,
+ 0x49FA, 0x6047, 0x02,
+ 0x49FC, 0x46F2, 0x02,
+ 0x49FE, 0xB97C, 0x02,
+ 0x4A00, 0xC0F2, 0x02,
+ 0x4A02, 0x000C, 0x02,
+ 0x4A04, 0x6047, 0x02,
+ 0x4A06, 0x4EF2, 0x02,
+ 0x4A08, 0x2B6C, 0x02,
+ 0x4A0A, 0xC0F2, 0x02,
+ 0x4A0C, 0x000C, 0x02,
+ 0x4A0E, 0x6047, 0x02,
+ 0x4A10, 0x42F2, 0x02,
+ 0x4A12, 0x652C, 0x02,
+ 0x4A14, 0xC0F2, 0x02,
+ 0x4A16, 0x010C, 0x02,
+ 0x4A18, 0x6047, 0x02,
+ 0x4A1A, 0x48F6, 0x02,
+ 0x4A1C, 0x834C, 0x02,
+ 0x4A1E, 0xC0F2, 0x02,
+ 0x4A20, 0x000C, 0x02,
+ 0x4A22, 0x6047, 0x02,
+ 0x4A24, 0x45F2, 0x02,
+ 0x4A26, 0x494C, 0x02,
+ 0x4A28, 0xC0F2, 0x02,
+ 0x4A2A, 0x000C, 0x02,
+ 0x4A2C, 0x6047, 0x02,
+ 0x4A2E, 0x4CF2, 0x02,
+ 0x4A30, 0x2D1C, 0x02,
+ 0x4A32, 0xC0F2, 0x02,
+ 0x4A34, 0x000C, 0x02,
+ 0x4A36, 0x6047, 0x02,
+ 0x1EDA, 0x000E, 0x02,
+ 0x1EDC, 0x000E, 0x02,
+ 0x1EDE, 0x000E, 0x02,
+ 0x1EE0, 0x000E, 0x02,
+ 0x1EE2, 0x000E, 0x02,
+ 0x1EE4, 0x000E, 0x02,
+ 0x1EE6, 0x000E, 0x02,
+ 0x1EE8, 0x000E, 0x02,
+ 0x1EEA, 0x000E, 0x02,
+ 0x1EEC, 0x000E, 0x02,
+ 0x1EEE, 0x000E, 0x02,
+ 0x1EF0, 0x000E, 0x02,
+ 0x1EF2, 0x000E, 0x02,
+ 0x1EF4, 0x000E, 0x02,
+ 0x1EF6, 0x000E, 0x02,
+ 0x1EF8, 0x000E, 0x02,
+ 0x16A0, 0x3D09, 0x02,
+ 0x0E58, 0x0040, 0x02,
+ 0x2690, 0x0000, 0x02,
+ 0x2692, 0x0055, 0x02,
+ 0x16A8, 0x38CD, 0x02,
+ 0x108C, 0x0003, 0x02,
+ 0x10CC, 0x0008, 0x02,
+ 0x10D0, 0x000F, 0x02,
+ 0x10A8, 0x000E, 0x02,
+ 0x1198, 0x002B, 0x02,
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF44A, 0x0007, 0x02,
+ 0xF456, 0x000A, 0x02,
+ 0xF46A, 0xBFA0, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x1758, 0x0020, 0x02,
+ 0x1694, 0x1B0F, 0x02,
+ 0x0F70, 0x0100, 0x02,
+ 0x0F72, 0x002F, 0x02,
+ 0x0F76, 0x0030, 0x02,
+ 0x0F7A, 0x000B, 0x02,
+ 0x0F7C, 0x0009, 0x02,
+ 0x0F7E, 0xF46E, 0x02,
+ 0x1698, 0x0D05, 0x02,
+};
+
+/*
+ * [Mode Information]
+ * 0: 4608 x 3456 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ * 1: 4608 x 2592 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ * 2: 4608 x 2240 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ * 3: 3456 x 3456 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ * 4: 2304 x 1728 @60, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ * 5: 2304 x 1296 @60, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ * 6: 1728 x 1728 @60, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ * 7: 1152 x 864 @90, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1456, MIPI Mclk(Mhz): 26
+ */
+const u32 sensor_3p9_setfile_A_4608x3456_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x1200, 0x02,
+ 0x034E, 0x0D80, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_A_4608x2592_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x01C8, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0BE7, 0x02,
+ 0x034C, 0x1200, 0x02,
+ 0x034E, 0x0A20, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_A_4608x2240_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0278, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0B37, 0x02,
+ 0x034C, 0x1200, 0x02,
+ 0x034E, 0x08C0, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_A_3456x3456_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0250, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x0FDF, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x0D80, 0x02,
+ 0x034E, 0x0D80, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_A_2304x1728_60fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x0900, 0x02,
+ 0x034E, 0x06C0, 0x02,
+ 0x0350, 0x0004, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0404, 0x2000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0728, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_A_2304x1296_60fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x01C8, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0BE7, 0x02,
+ 0x034C, 0x0900, 0x02,
+ 0x034E, 0x0510, 0x02,
+ 0x0350, 0x0004, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0404, 0x2000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0728, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_A_1728x1728_60fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0250, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x0FDF, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x06C0, 0x02,
+ 0x034E, 0x06C0, 0x02,
+ 0x0350, 0x0004, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0404, 0x2000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0728, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_A_1152x864_90fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0258, 0x02,
+ 0x0346, 0x01C8, 0x02,
+ 0x0348, 0x0FD7, 0x02,
+ 0x034A, 0x0BE7, 0x02,
+ 0x034C, 0x0480, 0x02,
+ 0x034E, 0x0360, 0x02,
+ 0x0350, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0005, 0x02,
+ 0x0900, 0x0113, 0x02,
+ 0x0404, 0x3000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x0070, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x04C6, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x0D80, 0x1388, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16BE, 0x1515, 0x02,
+ 0x16C0, 0x1515, 0x02,
+ 0x16C8, 0x0029, 0x02,
+ 0x16CA, 0x0029, 0x02,
+ 0x16D6, 0x0015, 0x02,
+ 0x16D8, 0x0015, 0x02,
+ 0x16E0, 0x2929, 0x02,
+ 0x16E2, 0x2929, 0x02,
+ 0x16E4, 0x2929, 0x02,
+ 0x0F50, 0x0100, 0x02,
+ 0x19B8, 0x0100, 0x02,
+ 0x4A74, 0x0101, 0x02,
+ 0x4A76, 0xD123, 0x02,
+ 0x4A78, 0x1E00, 0x02,
+ 0x4A7A, 0x0000, 0x02,
+ 0x4A7C, 0x0000, 0x02,
+ 0x4A7E, 0x0000, 0x02,
+ 0x2224, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x20A0, 0x0001, 0x02,
+ 0x20A2, 0x0203, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_4608x3456_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x04, /* secnd_pre_pll_clk_div(0x030E) */
+ 0x70, /* secnd_pll_multiplier (0x0310) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_4608x2592_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x04, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x70, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_4608x2240_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_3456x3456_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_2304x1728_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0728, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_2304x1296_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0728, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_1728x1728_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0728, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_A_1152x864_90fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x04C6, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+static const u32 *sensor_3p9_setfiles_A[] = {
+ sensor_3p9_setfile_A_4608x3456_30fps,
+ sensor_3p9_setfile_A_4608x2592_30fps,
+ sensor_3p9_setfile_A_4608x2240_30fps,
+ sensor_3p9_setfile_A_3456x3456_30fps,
+ sensor_3p9_setfile_A_2304x1728_60fps,
+ sensor_3p9_setfile_A_2304x1296_60fps,
+ sensor_3p9_setfile_A_1728x1728_60fps,
+ sensor_3p9_setfile_A_1152x864_90fps,
+};
+
+static const u32 sensor_3p9_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_3p9_setfile_A_4608x3456_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_A_4608x2592_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_A_4608x2240_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_A_3456x3456_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_A_2304x1728_60fps),
+ ARRAY_SIZE(sensor_3p9_setfile_A_2304x1296_60fps),
+ ARRAY_SIZE(sensor_3p9_setfile_A_1728x1728_60fps),
+ ARRAY_SIZE(sensor_3p9_setfile_A_1152x864_90fps),
+};
+
+static const struct sensor_pll_info *sensor_3p9_pllinfos_A[] = {
+ &sensor_3p9_pllinfo_A_4608x3456_30fps,
+ &sensor_3p9_pllinfo_A_4608x2592_30fps,
+ &sensor_3p9_pllinfo_A_4608x2240_30fps,
+ &sensor_3p9_pllinfo_A_3456x3456_30fps,
+ &sensor_3p9_pllinfo_A_2304x1728_60fps,
+ &sensor_3p9_pllinfo_A_2304x1296_60fps,
+ &sensor_3p9_pllinfo_A_1728x1728_60fps,
+ &sensor_3p9_pllinfo_A_1152x864_90fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_3P9_SET_B_H
+#define FIMC_IS_CIS_3P9_SET_B_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-3p9.h"
+
+/* S5K3P9SN_REV0.1_Ver0.6_20180806 */
+const u32 sensor_3p9_setfile_B_Global[] = {
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+ 0x6018, 0x0001, 0x02,
+ 0x7004, 0x1A00, 0x02,
+ 0x70D8, 0x18E2, 0x02,
+ 0x6014, 0x0001, 0x02,
+ I2C_MODE_DELAY, 3000, 0x00,
+ 0x6214, 0x7970, 0x02,
+ 0x6218, 0x7150, 0x02,
+ 0x0136, 0x1A00, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x3F3C, 0x0000, 0x02,
+ 0x3F3E, 0x0000, 0x02,
+ 0x3F40, 0x0649, 0x02,
+ 0x3F42, 0x0548, 0x02,
+ 0x3F44, 0xC1F8, 0x02,
+ 0x3F46, 0xD405, 0x02,
+ 0x3F48, 0x0549, 0x02,
+ 0x3F4A, 0x081A, 0x02,
+ 0x3F4C, 0x0349, 0x02,
+ 0x3F4E, 0xA1F8, 0x02,
+ 0x3F50, 0xD805, 0x02,
+ 0x3F52, 0x00F0, 0x02,
+ 0x3F54, 0xBDB8, 0x02,
+ 0x3F56, 0x0000, 0x02,
+ 0x3F58, 0x2000, 0x02,
+ 0x3F5A, 0x4182, 0x02,
+ 0x3F5C, 0x2000, 0x02,
+ 0x3F5E, 0x2E90, 0x02,
+ 0x3F60, 0x2000, 0x02,
+ 0x3F62, 0x6C00, 0x02,
+ 0x3F64, 0x0000, 0x02,
+ 0x3F66, 0x0000, 0x02,
+ 0x3F68, 0x0000, 0x02,
+ 0x3F6A, 0x0000, 0x02,
+ 0x3F6C, 0x0000, 0x02,
+ 0x3F6E, 0x0000, 0x02,
+ 0x3F70, 0x2DE9, 0x02,
+ 0x3F72, 0xF041, 0x02,
+ 0x3F74, 0x0746, 0x02,
+ 0x3F76, 0x6548, 0x02,
+ 0x3F78, 0x0E46, 0x02,
+ 0x3F7A, 0x0022, 0x02,
+ 0x3F7C, 0x0068, 0x02,
+ 0x3F7E, 0x85B2, 0x02,
+ 0x3F80, 0x040C, 0x02,
+ 0x3F82, 0x2946, 0x02,
+ 0x3F84, 0x2046, 0x02,
+ 0x3F86, 0x00F0, 0x02,
+ 0x3F88, 0xD7F8, 0x02,
+ 0x3F8A, 0x3146, 0x02,
+ 0x3F8C, 0x3846, 0x02,
+ 0x3F8E, 0x00F0, 0x02,
+ 0x3F90, 0xD8F8, 0x02,
+ 0x3F92, 0x5E4F, 0x02,
+ 0x3F94, 0x4DF2, 0x02,
+ 0x3F96, 0x0C26, 0x02,
+ 0x3F98, 0x0C37, 0x02,
+ 0x3F9A, 0x4FF4, 0x02,
+ 0x3F9C, 0x8061, 0x02,
+ 0x3F9E, 0x3A78, 0x02,
+ 0x3FA0, 0x3046, 0x02,
+ 0x3FA2, 0x00F0, 0x02,
+ 0x3FA4, 0xC9F8, 0x02,
+ 0x3FA6, 0x7878, 0x02,
+ 0x3FA8, 0xD8B3, 0x02,
+ 0x3FAA, 0x0022, 0x02,
+ 0x3FAC, 0x4FF4, 0x02,
+ 0x3FAE, 0x0071, 0x02,
+ 0x3FB0, 0x3046, 0x02,
+ 0x3FB2, 0x00F0, 0x02,
+ 0x3FB4, 0xC1F8, 0x02,
+ 0x3FB6, 0x5648, 0x02,
+ 0x3FB8, 0x0088, 0x02,
+ 0x3FBA, 0x5649, 0x02,
+ 0x3FBC, 0xA1F8, 0x02,
+ 0x3FBE, 0x4402, 0x02,
+ 0x3FC0, 0x5348, 0x02,
+ 0x3FC2, 0x001D, 0x02,
+ 0x3FC4, 0x0088, 0x02,
+ 0x3FC6, 0xA1F8, 0x02,
+ 0x3FC8, 0x4602, 0x02,
+ 0x3FCA, 0xB1F8, 0x02,
+ 0x3FCC, 0x4402, 0x02,
+ 0x3FCE, 0xB1F8, 0x02,
+ 0x3FD0, 0x4622, 0x02,
+ 0x3FD2, 0x0244, 0x02,
+ 0x3FD4, 0x1204, 0x02,
+ 0x3FD6, 0x120C, 0x02,
+ 0x3FD8, 0x03D0, 0x02,
+ 0x3FDA, 0x8002, 0x02,
+ 0x3FDC, 0xB0FB, 0x02,
+ 0x3FDE, 0xF2F0, 0x02,
+ 0x3FE0, 0x82B2, 0x02,
+ 0x3FE2, 0xA1F8, 0x02,
+ 0x3FE4, 0x4822, 0x02,
+ 0x3FE6, 0x4C49, 0x02,
+ 0x3FE8, 0x4888, 0x02,
+ 0x3FEA, 0x0B88, 0x02,
+ 0x3FEC, 0x4949, 0x02,
+ 0x3FEE, 0xA1F8, 0x02,
+ 0x3FF0, 0xA605, 0x02,
+ 0x3FF2, 0xA1F8, 0x02,
+ 0x3FF4, 0xA835, 0x02,
+ 0x3FF6, 0xC018, 0x02,
+ 0x3FF8, 0x05D0, 0x02,
+ 0x3FFA, 0x9902, 0x02,
+ 0x3FFC, 0xB1FB, 0x02,
+ 0x3FFE, 0xF0F0, 0x02,
+ 0x4000, 0x4449, 0x02,
+ 0x4002, 0xA1F8, 0x02,
+ 0x4004, 0xAA05, 0x02,
+ 0x4006, 0x4348, 0x02,
+ 0x4008, 0xB0F8, 0x02,
+ 0x400A, 0xAA05, 0x02,
+ 0x400C, 0x1118, 0x02,
+ 0x400E, 0x02FB, 0x02,
+ 0x4010, 0x1010, 0x02,
+ 0x4012, 0x40F3, 0x02,
+ 0x4014, 0x9510, 0x02,
+ 0x4016, 0x1028, 0x02,
+ 0x4018, 0x06DC, 0x02,
+ 0x401A, 0x0028, 0x02,
+ 0x401C, 0x05DA, 0x02,
+ 0x401E, 0x0020, 0x02,
+ 0x4020, 0x03E0, 0x02,
+ 0x4022, 0xFFE7, 0x02,
+ 0x4024, 0x0122, 0x02,
+ 0x4026, 0xC1E7, 0x02,
+ 0x4028, 0x1020, 0x02,
+ 0x402A, 0x3C49, 0x02,
+ 0x402C, 0x0880, 0x02,
+ 0x402E, 0x2946, 0x02,
+ 0x4030, 0x2046, 0x02,
+ 0x4032, 0xBDE8, 0x02,
+ 0x4034, 0xF041, 0x02,
+ 0x4036, 0x0122, 0x02,
+ 0x4038, 0x00F0, 0x02,
+ 0x403A, 0x7EB8, 0x02,
+ 0x403C, 0x70B5, 0x02,
+ 0x403E, 0x3348, 0x02,
+ 0x4040, 0x0022, 0x02,
+ 0x4042, 0x4168, 0x02,
+ 0x4044, 0x0C0C, 0x02,
+ 0x4046, 0x8DB2, 0x02,
+ 0x4048, 0x2946, 0x02,
+ 0x404A, 0x2046, 0x02,
+ 0x404C, 0x00F0, 0x02,
+ 0x404E, 0x74F8, 0x02,
+ 0x4050, 0x3348, 0x02,
+ 0x4052, 0x0268, 0x02,
+ 0x4054, 0xB2F8, 0x02,
+ 0x4056, 0x6202, 0x02,
+ 0x4058, 0x8301, 0x02,
+ 0x405A, 0x92F8, 0x02,
+ 0x405C, 0x6002, 0x02,
+ 0x405E, 0x10F0, 0x02,
+ 0x4060, 0x020F, 0x02,
+ 0x4062, 0x09D0, 0x02,
+ 0x4064, 0x2948, 0x02,
+ 0x4066, 0x0C30, 0x02,
+ 0x4068, 0x8188, 0x02,
+ 0x406A, 0x9942, 0x02,
+ 0x406C, 0x06D8, 0x02,
+ 0x406E, 0x4088, 0x02,
+ 0x4070, 0xA0F5, 0x02,
+ 0x4072, 0x5141, 0x02,
+ 0x4074, 0x2339, 0x02,
+ 0x4076, 0x01D1, 0x02,
+ 0x4078, 0x00F0, 0x02,
+ 0x407A, 0x68F8, 0x02,
+ 0x407C, 0x2946, 0x02,
+ 0x407E, 0x2046, 0x02,
+ 0x4080, 0xBDE8, 0x02,
+ 0x4082, 0x7040, 0x02,
+ 0x4084, 0x0122, 0x02,
+ 0x4086, 0x00F0, 0x02,
+ 0x4088, 0x57B8, 0x02,
+ 0x408A, 0x70B5, 0x02,
+ 0x408C, 0x1F48, 0x02,
+ 0x408E, 0x0022, 0x02,
+ 0x4090, 0x8168, 0x02,
+ 0x4092, 0x0C0C, 0x02,
+ 0x4094, 0x8DB2, 0x02,
+ 0x4096, 0x2946, 0x02,
+ 0x4098, 0x2046, 0x02,
+ 0x409A, 0x00F0, 0x02,
+ 0x409C, 0x4DF8, 0x02,
+ 0x409E, 0x00F0, 0x02,
+ 0x40A0, 0x5AF8, 0x02,
+ 0x40A2, 0x2048, 0x02,
+ 0x40A4, 0x90F8, 0x02,
+ 0x40A6, 0x9410, 0x02,
+ 0x40A8, 0x11B1, 0x02,
+ 0x40AA, 0x0021, 0x02,
+ 0x40AC, 0x80F8, 0x02,
+ 0x40AE, 0x9010, 0x02,
+ 0x40B0, 0x1D48, 0x02,
+ 0x40B2, 0x4FF4, 0x02,
+ 0x40B4, 0x8071, 0x02,
+ 0x40B6, 0x90F8, 0x02,
+ 0x40B8, 0x6F20, 0x02,
+ 0x40BA, 0x4FF4, 0x02,
+ 0x40BC, 0x3040, 0x02,
+ 0x40BE, 0x00F0, 0x02,
+ 0x40C0, 0x3BF8, 0x02,
+ 0x40C2, 0x2946, 0x02,
+ 0x40C4, 0x2046, 0x02,
+ 0x40C6, 0xBDE8, 0x02,
+ 0x40C8, 0x7040, 0x02,
+ 0x40CA, 0x0122, 0x02,
+ 0x40CC, 0x00F0, 0x02,
+ 0x40CE, 0x34B8, 0x02,
+ 0x40D0, 0x10B5, 0x02,
+ 0x40D2, 0x0022, 0x02,
+ 0x40D4, 0xAFF2, 0x02,
+ 0x40D6, 0x6711, 0x02,
+ 0x40D8, 0x1448, 0x02,
+ 0x40DA, 0x00F0, 0x02,
+ 0x40DC, 0x41F8, 0x02,
+ 0x40DE, 0x0B4C, 0x02,
+ 0x40E0, 0x0022, 0x02,
+ 0x40E2, 0xAFF2, 0x02,
+ 0x40E4, 0xA701, 0x02,
+ 0x40E6, 0x2060, 0x02,
+ 0x40E8, 0x1148, 0x02,
+ 0x40EA, 0x00F0, 0x02,
+ 0x40EC, 0x39F8, 0x02,
+ 0x40EE, 0x0022, 0x02,
+ 0x40F0, 0xAFF2, 0x02,
+ 0x40F2, 0x6901, 0x02,
+ 0x40F4, 0x6060, 0x02,
+ 0x40F6, 0x0F48, 0x02,
+ 0x40F8, 0x00F0, 0x02,
+ 0x40FA, 0x32F8, 0x02,
+ 0x40FC, 0x0849, 0x02,
+ 0x40FE, 0xA060, 0x02,
+ 0x4100, 0x40F6, 0x02,
+ 0x4102, 0xFA00, 0x02,
+ 0x4104, 0x0968, 0x02,
+ 0x4106, 0x4883, 0x02,
+ 0x4108, 0x10BD, 0x02,
+ 0x410A, 0x0000, 0x02,
+ 0x410C, 0x2000, 0x02,
+ 0x410E, 0x4170, 0x02,
+ 0x4110, 0x4000, 0x02,
+ 0x4112, 0x9404, 0x02,
+ 0x4114, 0x2000, 0x02,
+ 0x4116, 0x38B0, 0x02,
+ 0x4118, 0x4000, 0x02,
+ 0x411A, 0xD214, 0x02,
+ 0x411C, 0x4000, 0x02,
+ 0x411E, 0xA410, 0x02,
+ 0x4120, 0x2000, 0x02,
+ 0x4122, 0x08D0, 0x02,
+ 0x4124, 0x2000, 0x02,
+ 0x4126, 0x2800, 0x02,
+ 0x4128, 0x2000, 0x02,
+ 0x412A, 0x0E30, 0x02,
+ 0x412C, 0x0001, 0x02,
+ 0x412E, 0x1929, 0x02,
+ 0x4130, 0x0000, 0x02,
+ 0x4132, 0x8DA3, 0x02,
+ 0x4134, 0x0000, 0x02,
+ 0x4136, 0x3A93, 0x02,
+ 0x4138, 0x4AF2, 0x02,
+ 0x413A, 0x692C, 0x02,
+ 0x413C, 0xC0F2, 0x02,
+ 0x413E, 0x000C, 0x02,
+ 0x4140, 0x6047, 0x02,
+ 0x4142, 0x41F6, 0x02,
+ 0x4144, 0x291C, 0x02,
+ 0x4146, 0xC0F2, 0x02,
+ 0x4148, 0x010C, 0x02,
+ 0x414A, 0x6047, 0x02,
+ 0x414C, 0x48F6, 0x02,
+ 0x414E, 0xA35C, 0x02,
+ 0x4150, 0xC0F2, 0x02,
+ 0x4152, 0x000C, 0x02,
+ 0x4154, 0x6047, 0x02,
+ 0x4156, 0x43F6, 0x02,
+ 0x4158, 0x932C, 0x02,
+ 0x415A, 0xC0F2, 0x02,
+ 0x415C, 0x000C, 0x02,
+ 0x415E, 0x6047, 0x02,
+ 0x4160, 0x4BF2, 0x02,
+ 0x4162, 0x757C, 0x02,
+ 0x4164, 0xC0F2, 0x02,
+ 0x4166, 0x000C, 0x02,
+ 0x4168, 0x6047, 0x02,
+ 0x416A, 0x0000, 0x02,
+ 0x10AC, 0x0003, 0x02,
+ 0x10EC, 0x0008, 0x02,
+ 0x10C8, 0x000E, 0x02,
+ 0x11B8, 0x002B, 0x02,
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0xF44A, 0x0007, 0x02,
+ 0xF456, 0x000A, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x16B8, 0x0D05, 0x02,
+ 0x1022, 0x0020, 0x02,
+ 0x1E6A, 0x0000, 0x02,
+ 0x1E6C, 0x0000, 0x02,
+ 0x1E6E, 0x0000, 0x02,
+ 0x1E70, 0x0000, 0x02,
+ 0x1E72, 0x0000, 0x02,
+ 0x1E74, 0x0000, 0x02,
+ 0x1E76, 0x0000, 0x02,
+ 0x1E78, 0x0000, 0x02,
+ 0x1E7A, 0x0000, 0x02,
+ 0x1E7C, 0x0000, 0x02,
+ 0x1E7E, 0x0000, 0x02,
+ 0x1E80, 0x0000, 0x02,
+ 0x1E82, 0x0000, 0x02,
+ 0x1E84, 0x0000, 0x02,
+ 0x1E86, 0x0000, 0x02,
+ 0x1E88, 0x0000, 0x02,
+};
+
+/*
+ * [Mode Information]
+ * 0: 4608 x 3456 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1365, MIPI Mclk(Mhz): 26
+ * 1: 4608 x 2592 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1365, MIPI Mclk(Mhz): 26
+ * 2: 4608 x 2240 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1365, MIPI Mclk(Mhz): 26
+ * 3: 3456 x 3456 @30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 1365, MIPI Mclk(Mhz): 26
+ */
+const u32 sensor_3p9_setfile_B_4608x3456_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x1200, 0x02,
+ 0x034E, 0x0D80, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x0055, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_4608x2592_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x01C8, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0BE7, 0x02,
+ 0x034C, 0x1200, 0x02,
+ 0x034E, 0x0A20, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x0055, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_4608x2240_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0278, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0B37, 0x02,
+ 0x034C, 0x1200, 0x02,
+ 0x034E, 0x08C0, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x0055, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_4608x2184_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0290, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0B1F, 0x02,
+ 0x034C, 0x1200, 0x02,
+ 0x034E, 0x0888, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0352, 0x0004, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x0055, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_3456x3456_30fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0250, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x0FDF, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x0D80, 0x02,
+ 0x034E, 0x0D80, 0x02,
+ 0x0350, 0x0008, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0001, 0x02,
+ 0x0900, 0x0011, 0x02,
+ 0x0404, 0x1000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0E52, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x0055, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_2304x1728_60fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x0900, 0x02,
+ 0x034E, 0x06C0, 0x02,
+ 0x0350, 0x0004, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0404, 0x2000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0728, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x004A, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_2304x1296_60fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x01C8, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0BE7, 0x02,
+ 0x034C, 0x0900, 0x02,
+ 0x034E, 0x0510, 0x02,
+ 0x0350, 0x0004, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0404, 0x2000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0728, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x004A, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_1728x1728_60fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0250, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x0FDF, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x06C0, 0x02,
+ 0x034E, 0x06C0, 0x02,
+ 0x0350, 0x0004, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0003, 0x02,
+ 0x0900, 0x0112, 0x02,
+ 0x0404, 0x2000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x0728, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x004A, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0100, 0x02,
+ 0x1F1A, 0x00CC, 0x02,
+ 0x1F24, 0x0133, 0x02,
+ 0x1F2E, 0x0133, 0x02,
+ 0x1F38, 0x0133, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const u32 sensor_3p9_setfile_B_1152x864_112fps[] = {
+ 0x6000, 0x0085, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x0110, 0x1002, 0x02,
+ 0x0114, 0x0300, 0x02,
+ 0x0344, 0x0010, 0x02,
+ 0x0346, 0x0018, 0x02,
+ 0x0348, 0x121F, 0x02,
+ 0x034A, 0x0D97, 0x02,
+ 0x034C, 0x0480, 0x02,
+ 0x034E, 0x0360, 0x02,
+ 0x0350, 0x0002, 0x02,
+ 0x0352, 0x0000, 0x02,
+ 0x0380, 0x0001, 0x02,
+ 0x0382, 0x0001, 0x02,
+ 0x0384, 0x0001, 0x02,
+ 0x0386, 0x0007, 0x02,
+ 0x0900, 0x0114, 0x02,
+ 0x0404, 0x4000, 0x02,
+ 0x0402, 0x1010, 0x02,
+ 0x0400, 0x1010, 0x02,
+ 0x0304, 0x0006, 0x02,
+ 0x030C, 0x0000, 0x02,
+ 0x0306, 0x00E2, 0x02,
+ 0x0302, 0x0001, 0x02,
+ 0x0300, 0x0007, 0x02,
+ 0x030E, 0x0004, 0x02,
+ 0x0312, 0x0000, 0x02,
+ 0x0310, 0x009E, 0x02,
+ 0x030A, 0x0001, 0x02,
+ 0x0308, 0x0008, 0x02,
+ 0x0342, 0x13E0, 0x02,
+ 0x0340, 0x03D6, 0x02,
+ 0x021E, 0x0000, 0x02,
+ 0x0D00, 0x0000, 0x02,
+ 0x0D02, 0x0001, 0x02,
+ 0x0FEA, 0x1440, 0x02,
+ 0x0B06, 0x0101, 0x02,
+ 0x6000, 0x0005, 0x02,
+ 0xFCFC, 0x2000, 0x02,
+ 0x2642, 0x0000, 0x02,
+ 0x0F62, 0x0100, 0x02,
+ 0x417C, 0x0101, 0x02,
+ 0x417E, 0xD123, 0x02,
+ 0x4180, 0x1E00, 0x02,
+ 0x21B6, 0x0100, 0x02,
+ 0x0DF8, 0x1001, 0x02,
+ 0x1F0E, 0x0000, 0x02,
+ 0x1F1A, 0x0000, 0x02,
+ 0x1F24, 0x0000, 0x02,
+ 0x1F2E, 0x0000, 0x02,
+ 0x1F38, 0x0000, 0x02,
+ 0xFCFC, 0x4000, 0x02,
+ 0x6000, 0x0085, 0x02,
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_4608x3456_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_4608x2592_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_4608x2240_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_4608x2184_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_3456x3456_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0E52, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_2304x1728_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0728, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_2304x1296_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0728, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_1728x1728_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x0728, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info sensor_3p9_pllinfo_B_1152x864_112fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x07, /* vt_pix_clk_div (0x0300) */
+ 0x01, /* vt_sys_clk_div (0x0302) */
+ 0x06, /* pre_pll_clk_div(0x0304) */
+ 0xE2, /* pll_multiplier (0x0306) */
+ 0x08, /* op_pix_clk_div (0x0308) */
+ 0x01, /* op_sys_clk_div (0x030A) */
+
+ 0x00, /* secnd_pre_pll_clk_div(0x030C) */
+ 0x04, /* secnd_pll_multiplier (0x030E) */
+ 0x03D6, /* frame_length_lines (0x0340) */
+ 0x13E0, /* line_length_pck (0x0342) */
+};
+
+static const u32 *sensor_3p9_setfiles_B[] = {
+ sensor_3p9_setfile_B_4608x3456_30fps,
+ sensor_3p9_setfile_B_4608x2592_30fps,
+ sensor_3p9_setfile_B_4608x2240_30fps,
+ sensor_3p9_setfile_B_4608x2184_30fps,
+ sensor_3p9_setfile_B_3456x3456_30fps,
+ sensor_3p9_setfile_B_2304x1728_60fps,
+ sensor_3p9_setfile_B_2304x1296_60fps,
+ sensor_3p9_setfile_B_1728x1728_60fps,
+ sensor_3p9_setfile_B_1152x864_112fps,
+};
+
+static const u32 sensor_3p9_setfile_B_sizes[] = {
+ ARRAY_SIZE(sensor_3p9_setfile_B_4608x3456_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_4608x2592_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_4608x2240_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_4608x2184_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_3456x3456_30fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_2304x1728_60fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_2304x1296_60fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_1728x1728_60fps),
+ ARRAY_SIZE(sensor_3p9_setfile_B_1152x864_112fps),
+};
+
+static const struct sensor_pll_info *sensor_3p9_pllinfos_B[] = {
+ &sensor_3p9_pllinfo_B_4608x3456_30fps,
+ &sensor_3p9_pllinfo_B_4608x2592_30fps,
+ &sensor_3p9_pllinfo_B_4608x2240_30fps,
+ &sensor_3p9_pllinfo_B_4608x2184_30fps,
+ &sensor_3p9_pllinfo_B_3456x3456_30fps,
+ &sensor_3p9_pllinfo_B_2304x1728_60fps,
+ &sensor_3p9_pllinfo_B_2304x1296_60fps,
+ &sensor_3p9_pllinfo_B_1728x1728_60fps,
+ &sensor_3p9_pllinfo_B_1152x864_112fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-3p9.h"
+#include "fimc-is-cis-3p9-setA.h"
+#include "fimc-is-cis-3p9-setB.h"
+
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "S5K3P9"
+/* #define DEBUG_3P9_PLL */
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_3p9_global;
+static u32 sensor_3p9_global_size;
+static const u32 **sensor_3p9_setfiles;
+static const u32 *sensor_3p9_setfile_sizes;
+static u32 sensor_3p9_max_setfile_num;
+static const struct sensor_pll_info **sensor_3p9_pllinfos;
+
+/* variables of pdaf setting */
+static const u32 *sensor_3p9_pdaf_global;
+static u32 sensor_3p9_pdaf_global_size;
+static const u32 **sensor_3p9_pdaf_setfiles;
+static const u32 *sensor_3p9_pdaf_setfile_sizes;
+static u32 sensor_3p9_pdaf_max_setfile_num;
+static const struct sensor_pll_info **sensor_3p9_pdaf_pllinfos;
+
+static void sensor_3p9_cis_data_calculation(const struct sensor_pll_info *pll_info, cis_shared_data *cis_data)
+{
+ u32 pll_voc_a = 0, vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, max_fps = 0, frame_valid_us = 0;
+
+ FIMC_BUG_VOID(!pll_info);
+
+ /* 1. mipi data rate calculation (Mbps/Lane) */
+ /* ToDo: using output Pixel Clock Divider Value */
+ /* pll_voc_b = pll_info->ext_clk / pll_info->secnd_pre_pll_clk_div * pll_info->secnd_pll_multiplier * 2;
+ op_sys_clk_hz = pll_voc_b / pll_info->op_sys_clk_div;
+ if(gpsSensorExInfo) {
+ gpsSensorExInfo->uiMIPISpeedBps = op_sys_clk_hz;
+ gpsSensorExInfo->uiMCLK = sensorInfo.ext_clk;
+ } */
+
+ /* 2. pixel rate calculation (Mpps) */
+ pll_voc_a = pll_info->ext_clk / pll_info->pre_pll_clk_div * pll_info->pll_multiplier;
+ vt_pix_clk_hz = (pll_voc_a / pll_info->vt_pix_clk_div) * 4;
+
+ dbg_sensor(1, "ext_clock(%d) / pre_pll_clk_div(%d) * pll_multiplier(%d) = pll_voc_a(%d)\n",
+ pll_info->ext_clk, pll_info->pre_pll_clk_div,
+ pll_info->pll_multiplier, pll_voc_a);
+ dbg_sensor(1, "pll_voc_a(%d) / (vt_sys_clk_div(%d) * vt_pix_clk_div(%d)) = pixel clock (%d hz)\n",
+ pll_voc_a, pll_info->vt_sys_clk_div,
+ pll_info->vt_pix_clk_div, vt_pix_clk_hz);
+
+ /* 3. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info->frame_length_lines * pll_info->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 4. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info->frame_length_lines * pll_info->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info->frame_length_lines(%d) * pll_info->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info->frame_length_lines, pll_info->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = (vt_pix_clk_hz * 10) / (pll_info->frame_length_lines * pll_info->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = max_fps;
+ cis_data->frame_length_lines = pll_info->frame_length_lines;
+ cis_data->line_length_pck = pll_info->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+ /* dbg_sensor(1, "Mbps/lane : %d Mbps\n", pll_voc_b / pll_info->op_sys_clk_div / 1000 / 1000); */
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_3P9_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = SENSOR_3P9_FINE_INTEGRATION_TIME_MAX;
+ cis_data->min_coarse_integration_time = SENSOR_3P9_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_3P9_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+static int sensor_3p9_wait_stream_off_status(cis_shared_data *cis_data)
+{
+ int ret = 0;
+ u32 timeout = 0;
+
+ FIMC_BUG(!cis_data);
+
+#define STREAM_OFF_WAIT_TIME 250
+ while (timeout < STREAM_OFF_WAIT_TIME) {
+ if (cis_data->is_active_area == false &&
+ cis_data->stream_on == false) {
+ pr_debug("actual stream off\n");
+ break;
+ }
+ timeout++;
+ }
+
+ if (timeout == STREAM_OFF_WAIT_TIME) {
+ pr_err("actual stream off wait timeout\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+int sensor_3p9_cis_select_setfile(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ rev = cis->cis_data->cis_rev;
+
+ switch (rev) {
+ case 0xA0: /* 3P9SX */
+ pr_info("%s setfile_A(3P9SX)\n", __func__);
+ sensor_3p9_global = sensor_3p9_setfile_A_Global;
+ sensor_3p9_global_size = sizeof(sensor_3p9_setfile_A_Global) / sizeof(sensor_3p9_setfile_A_Global[0]);
+ sensor_3p9_setfiles = sensor_3p9_setfiles_A;
+ sensor_3p9_setfile_sizes = sensor_3p9_setfile_A_sizes;
+ sensor_3p9_max_setfile_num = sizeof(sensor_3p9_setfiles_A) / sizeof(sensor_3p9_setfiles_A[0]);
+ sensor_3p9_pllinfos = sensor_3p9_pllinfos_A;
+ break;
+ case 0xA1: /* 3P9SN */
+ pr_info("%s setfile_B(3P9SN)\n", __func__);
+ sensor_3p9_global = sensor_3p9_setfile_B_Global;
+ sensor_3p9_global_size = sizeof(sensor_3p9_setfile_B_Global) / sizeof(sensor_3p9_setfile_B_Global[0]);
+ sensor_3p9_setfiles = sensor_3p9_setfiles_B;
+ sensor_3p9_setfile_sizes = sensor_3p9_setfile_B_sizes;
+ sensor_3p9_max_setfile_num = sizeof(sensor_3p9_setfiles_B) / sizeof(sensor_3p9_setfiles_B[0]);
+ sensor_3p9_pllinfos = sensor_3p9_pllinfos_B;
+ break;
+ default:
+ err("Unsupported 3p9 sensor revision(%#x) use setfile_B(3P9SN) for default\n", rev);
+ sensor_3p9_global = sensor_3p9_setfile_B_Global;
+ sensor_3p9_global_size = sizeof(sensor_3p9_setfile_B_Global) / sizeof(sensor_3p9_setfile_B_Global[0]);
+ sensor_3p9_setfiles = sensor_3p9_setfiles_B;
+ sensor_3p9_setfile_sizes = sensor_3p9_setfile_B_sizes;
+ sensor_3p9_max_setfile_num = sizeof(sensor_3p9_setfiles_B) / sizeof(sensor_3p9_setfiles_B[0]);
+ sensor_3p9_pllinfos = sensor_3p9_pllinfos_B;
+ break;
+ }
+
+ return ret;
+}
+
+/* CIS OPS */
+int sensor_3p9_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+ setinfo.param = NULL;
+ setinfo.return_value = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ warn("sensor_3p9_check_rev is fail when cis init");
+ cis->rev_flag = true;
+ ret = 0;
+ }
+
+ ret = sensor_3p9_cis_select_setfile(subdev);
+
+ cis->cis_data->cur_width = SENSOR_3P9_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_3P9_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_3p9_cis_data_calculation(sensor_3p9_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ ret = fimc_is_sensor_read16(client, 0x0000, &data16);
+ if (unlikely(!ret)) printk("[SEN:DUMP] model_id(%x)\n", data16);
+ ret = fimc_is_sensor_read8(client, 0x0002, &data8);
+ if (unlikely(!ret)) printk("[SEN:DUMP] revision_number(%x)\n", data8);
+ ret = fimc_is_sensor_read8(client, 0x0005, &data8);
+ if (unlikely(!ret)) printk("[SEN:DUMP] frame_count(%x)\n", data8);
+ ret = fimc_is_sensor_read8(client, 0x0100, &data8);
+ if (unlikely(!ret)) printk("[SEN:DUMP] mode_select(%x)\n", data8);
+
+ if (cis->use_pdaf == true) {
+ sensor_cis_dump_registers(subdev, sensor_3p9_pdaf_setfiles[0], sensor_3p9_pdaf_setfile_sizes[0]);
+ } else {
+ sensor_cis_dump_registers(subdev, sensor_3p9_setfiles[0], sensor_3p9_setfile_sizes[0]);
+ }
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+p_err:
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_3p9_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_3p9_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_3p9_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ ret = sensor_3p9_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ info("[%s] global setting enter\n", __func__);
+ /* setfile global setting is at camera entrance */
+ if (cis->use_pdaf == true) {
+ ret = sensor_cis_set_registers(subdev, sensor_3p9_pdaf_global, sensor_3p9_pdaf_global_size);
+ } else {
+ ret = sensor_cis_set_registers(subdev, sensor_3p9_global, sensor_3p9_global_size);
+ }
+
+ if (ret < 0) {
+ err("sensor_3p9_set_registers fail!!");
+ goto p_err;
+ }
+ info("[%s] global setting done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ u32 max_setfile_num = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (cis->use_pdaf == true) {
+ max_setfile_num = sensor_3p9_pdaf_max_setfile_num;
+ } else {
+ max_setfile_num = sensor_3p9_max_setfile_num;
+ }
+
+ if (mode > max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* If check_rev fail when cis_init, one more check_rev in mode_change */
+ if (cis->rev_flag == true) {
+ cis->rev_flag = false;
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ err("sensor_3p9_check_rev is fail");
+ goto p_err;
+ }
+ }
+
+ if (cis->use_pdaf == true) {
+ sensor_3p9_cis_data_calculation(sensor_3p9_pdaf_pllinfos[mode], cis->cis_data);
+ ret = sensor_cis_set_registers(subdev, sensor_3p9_pdaf_setfiles[mode], sensor_3p9_pdaf_setfile_sizes[mode]);
+ } else {
+ sensor_3p9_cis_data_calculation(sensor_3p9_pllinfos[mode], cis->cis_data);
+ ret = sensor_cis_set_registers(subdev, sensor_3p9_setfiles[mode], sensor_3p9_setfile_sizes[mode]);
+ }
+
+ if (ret < 0) {
+ err("sensor_3p9_set_registers fail!!");
+ goto p_err;
+ }
+
+ if (cis->use_pdaf == true) {
+#if defined(S5K3P9_PDAF_DISABLE)
+ /* TEMP : PDAF disable */
+ ret = fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret = fimc_is_sensor_write8(cis->client, 0x3059, 0x00);
+ info("[%s] S5K3P9_PDAF_DISABLE\n", __func__);
+#endif
+
+#if defined(S5K3P9_TAIL_DISABLE)
+ /* TEMP : Tail mode disable */
+ ret = fimc_is_sensor_write16(cis->client, 0x6028, 0x2000);
+ ret = fimc_is_sensor_write16(cis->client, 0x602A, 0x19E0);
+ ret = fimc_is_sensor_write16(cis->client, 0x6F12, 0x0001);
+
+ ret = fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret = fimc_is_sensor_write16(cis->client, 0x30E2, 0x0000);
+ info("[%s] S5K3P9_TAIL_DISABLE\n", __func__);
+#endif
+
+#if defined(S5K3P9_BPC_DISABLE)
+ /* TEMP : BPC disable */
+ ret = fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret = fimc_is_sensor_write8(cis->client, 0x0B0E, 0x00);
+ info("[%s] S5K3P9_BPC_DISABLE\n", __func__);
+#endif
+ }
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ return ret;
+}
+
+/* TODO: Sensor set size sequence(sensor done, sensor stop, 3AA done in FW case */
+int sensor_3p9_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ int ret = 0;
+ bool binning = false;
+ u32 ratio_w = 0, ratio_h = 0, start_x = 0, start_y = 0, end_x = 0, end_y = 0;
+ u32 even_x= 0, odd_x = 0, even_y = 0, odd_y = 0;
+ struct i2c_client *client = NULL;
+ struct fimc_is_cis *cis = NULL;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ if (unlikely(!cis_data)) {
+ err("cis data is NULL");
+ if (unlikely(!cis->cis_data)) {
+ ret = -EINVAL;
+ goto p_err;
+ } else {
+ cis_data = cis->cis_data;
+ }
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* Wait actual stream off */
+ ret = sensor_3p9_wait_stream_off_status(cis_data);
+ if (ret) {
+ err("Must stream off\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ binning = cis_data->binning;
+ if (binning) {
+ ratio_w = (SENSOR_3P9_MAX_WIDTH / cis_data->cur_width);
+ ratio_h = (SENSOR_3P9_MAX_HEIGHT / cis_data->cur_height);
+ } else {
+ ratio_w = 1;
+ ratio_h = 1;
+ }
+
+ if (((cis_data->cur_width * ratio_w) > SENSOR_3P9_MAX_WIDTH) ||
+ ((cis_data->cur_height * ratio_h) > SENSOR_3P9_MAX_HEIGHT)) {
+ err("Config max sensor size over~!!\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* 1. page_select */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* 2. pixel address region setting */
+ start_x = ((SENSOR_3P9_MAX_WIDTH - cis_data->cur_width * ratio_w) / 2) & (~0x1);
+ start_y = ((SENSOR_3P9_MAX_HEIGHT - cis_data->cur_height * ratio_h) / 2) & (~0x1);
+ end_x = start_x + (cis_data->cur_width * ratio_w - 1);
+ end_y = start_y + (cis_data->cur_height * ratio_h - 1);
+
+ if (!(end_x & (0x1)) || !(end_y & (0x1))) {
+ err("Sensor pixel end address must odd\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0344, start_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0346, start_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0348, end_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034A, end_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 3. output address setting */
+ ret = fimc_is_sensor_write16(client, 0x034C, cis_data->cur_width);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034E, cis_data->cur_height);
+ if (ret < 0)
+ goto p_err;
+
+ /* If not use to binning, sensor image should set only crop */
+ if (!binning) {
+ dbg_sensor(1, "Sensor size set is not binning\n");
+ goto p_err;
+ }
+
+ /* 4. sub sampling setting */
+ even_x = 1; /* 1: not use to even sampling */
+ even_y = 1;
+ odd_x = (ratio_w * 2) - even_x;
+ odd_y = (ratio_h * 2) - even_y;
+
+ ret = fimc_is_sensor_write16(client, 0x0380, even_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0382, odd_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0384, even_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0386, odd_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 5. binnig setting */
+ ret = fimc_is_sensor_write8(client, 0x0900, binning); /* 1: binning enable, 0: disable */
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write8(client, 0x0901, (ratio_w << 4) | ratio_h);
+ if (ret < 0)
+ goto p_err;
+
+ /* 6. scaling setting: but not use */
+ /* scaling_mode (0: No scaling, 1: Horizontal, 2: Full) */
+ ret = fimc_is_sensor_write16(client, 0x0400, 0x0000);
+ if (ret < 0)
+ goto p_err;
+ /* down_scale_m: 1 to 16 upwards (scale_n: 16(fixed))
+ down scale factor = down_scale_m / down_scale_n */
+ ret = fimc_is_sensor_write16(client, 0x0404, 0x0010);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ ret = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("[%s] sensor_3p9_cis_group_param_hold_func fail\n", __func__);
+
+#ifdef DEBUG_3P9_PLL
+ {
+ u16 pll;
+ ret = fimc_is_sensor_read16(client, 0x0300, &pll);
+ dbg_sensor(1, "______ vt_pix_clk_div(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x0302, &pll);
+ dbg_sensor(1, "______ vt_sys_clk_div(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x0304, &pll);
+ dbg_sensor(1, "______ pre_pll_clk_div(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x0306, &pll);
+ dbg_sensor(1, "______ pll_multiplier(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x0308, &pll);
+ dbg_sensor(1, "______ op_pix_clk_div(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x030a, &pll);
+ dbg_sensor(1, "______ op_sys_clk_div(%x)\n", pll);
+
+ ret = fimc_is_sensor_read16(client, 0x030c, &pll);
+ dbg_sensor(1, "______ secnd_pre_pll_clk_div(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x030e, &pll);
+ dbg_sensor(1, "______ secnd_pll_multiplier(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x0340, &pll);
+ dbg_sensor(1, "______ frame_length_lines(%x)\n", pll);
+ ret = fimc_is_sensor_read16(client, 0x0342, &pll);
+ dbg_sensor(1, "______ line_length_pck(%x)\n", pll);
+ }
+#endif
+
+ /* Sensor stream on */
+ ret = fimc_is_sensor_write16(client, 0xFCFC, 0x4000);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0xFCFC, 0x4000, ret);
+ ret = fimc_is_sensor_write16(client, 0x0100, 0x0100);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0100, 0x0100, ret);
+
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ ret = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("[%s] sensor_3p9_cis_group_param_hold_func fail\n", __func__);
+
+ /* Sensor stream off */
+ ret = fimc_is_sensor_write16(client, 0xFCFC, 0x4000);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0xFCFC, 0x4000, ret);
+ ret = fimc_is_sensor_write16(client, 0x0100, 0x0000);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0100, 0x00, ret);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short exposure */
+ ret = fimc_is_sensor_write16(client, 0x0202, short_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long exposure */
+/* if (cis_data->companion_data.enable_wdr == true) {
+ ret = fimc_is_sensor_write16(client, 0x021E, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }*/
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d),"
+ KERN_CONT "line_length_pck(%d), min_fine_int (%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x),"
+ KERN_CONT "long_coarse_int %#x, short_coarse_int %#x\n", cis->id, __func__,
+ cis_data->sen_vsync_count, cis_data->frame_length_lines, long_coarse_int, short_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_3p9_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update hear? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time, cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time, frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_3p9_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+
+ frame_length_lines = (u16)((vt_pic_clk_freq_mhz * frame_duration) / line_length_pck);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk_freq_mhz(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, vt_pic_clk_freq_mhz, frame_duration, line_length_pck, frame_length_lines);
+
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+ cis_data->max_coarse_integration_time = cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_3p9_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_3p9_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+int sensor_3p9_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0]) {
+ again_code = cis_data->max_analog_gain[0];
+ } else if (again_code < cis_data->min_analog_gain[0]) {
+ again_code = cis_data->min_analog_gain[0];
+ }
+
+ again_permile = sensor_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_3p9_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ analog_gain = (u16)sensor_cis_calc_again_code(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0]) {
+ analog_gain = cis->cis_data->min_analog_gain[0];
+ }
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0]) {
+ analog_gain = cis->cis_data->max_analog_gain[0];
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0204, analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_3p9_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_3p9_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x0084, &read_value);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0084, read_value, ret);
+
+ cis_data->min_analog_gain[0] = read_value;
+
+ cis_data->min_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x0086, &read_value);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0086, read_value, ret);
+
+ cis_data->max_analog_gain[0] = read_value;
+
+ cis_data->max_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_3p9_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u16 dgains[4] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0]) {
+ long_gain = cis->cis_data->min_digital_gain[0];
+ }
+ if (long_gain > cis->cis_data->max_digital_gain[0]) {
+ long_gain = cis->cis_data->max_digital_gain[0];
+ }
+
+ if (short_gain < cis->cis_data->min_digital_gain[0]) {
+ short_gain = cis->cis_data->min_digital_gain[0];
+ }
+ if (short_gain > cis->cis_data->max_digital_gain[0]) {
+ short_gain = cis->cis_data->max_digital_gain[0];
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, dgain->long_val, dgain->short_val, long_gain, short_gain);
+
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = short_gain;
+ /* Short digital gain */
+ ret = fimc_is_sensor_write16_array(client, 0x020E, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long digital gain */
+/* if (cis_data->companion_data.enable_wdr == true) {
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = long_gain;
+ ret = fimc_is_sensor_write16_array(client, 0x3062, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+ }*/
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_3p9_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_3p9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_3p9_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ /* 3P9 cannot read min/max digital gain */
+ cis_data->min_digital_gain[0] = 0x0100;
+
+ cis_data->min_digital_gain[1] = 1000;
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_3p9_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ /* 3P9 cannot read min/max digital gain */
+ cis_data->max_digital_gain[0] = 0x1000;
+
+ cis_data->max_digital_gain[1] = 16000;
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_3p9_cis_init,
+ .cis_log_status = sensor_3p9_cis_log_status,
+ .cis_group_param_hold = sensor_3p9_cis_group_param_hold,
+ .cis_set_global_setting = sensor_3p9_cis_set_global_setting,
+ .cis_mode_change = sensor_3p9_cis_mode_change,
+ .cis_set_size = sensor_3p9_cis_set_size,
+ .cis_stream_on = sensor_3p9_cis_stream_on,
+ .cis_stream_off = sensor_3p9_cis_stream_off,
+ .cis_set_exposure_time = sensor_3p9_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_3p9_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_3p9_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_3p9_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_3p9_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_3p9_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_3p9_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_3p9_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_3p9_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_3p9_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_3p9_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_3p9_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_3p9_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_3p9_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_3p9_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_cis_wait_streamon,
+};
+
+static int cis_3p9_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ bool use_pdaf = false;
+
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ if (of_property_read_bool(dnode, "use_pdaf")) {
+ use_pdaf = true;
+ }
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor id read is fail(%d)\n", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_S5K3P9);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ probe_err("subdev_cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_S5K3P9;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_GR_BG;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret) {
+ warn("f-number read is fail(%d)",ret);
+ }
+ } else {
+ cis->aperture_num = F1_9;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ if (use_pdaf == true) {
+ cis->use_pdaf = true;
+ } else {
+ cis->use_pdaf = false;
+ }
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_3p9_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-3p9",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_3p9_match);
+
+static const struct i2c_device_id sensor_cis_3p9_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_3p9_driver = {
+ .probe = cis_3p9_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_3p9_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_3p9_idt
+};
+
+static int __init sensor_cis_3p9_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_3p9_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_3p9_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_3p9_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_3P9_H
+#define FIMC_IS_CIS_3P9_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_3P9_MAX_WIDTH (4608 + 16)
+#define SENSOR_3P9_MAX_HEIGHT (3456 + 10)
+
+/* TODO: Check below values are valid */
+#define SENSOR_3P9_FINE_INTEGRATION_TIME_MIN 0x0618
+#define SENSOR_3P9_FINE_INTEGRATION_TIME_MAX 0x0618
+#define SENSOR_3P9_COARSE_INTEGRATION_TIME_MIN 0x07
+#define SENSOR_3P9_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x08
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+#endif
+
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_4e6_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
ret = of_property_read_string(dnode, "setfile", &setfile);
if (ret) {
err("setfile index read fail(%d), take default setfile!!", ret);
.cis_compensate_gain_for_extremely_br = sensor_4h5_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_4h5_probe(struct i2c_client *client,
sensor_4h5_max_setfile_num = sizeof(sensor_4h5_setfiles_A) / sizeof(sensor_4h5_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_4h5yc_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_4h5yc_probe(struct i2c_client *client,
sensor_4h5yc_max_setfile_num = sizeof(sensor_4h5yc_setfiles_A) / sizeof(sensor_4h5yc_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_4HA_SET_A_H
+#define FIMC_IS_CIS_4HA_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-4ha.h"
+
+/* Reference : S5K4HA04_EVT0.0_Ver_2.61_20161129.xlsx */
+
+const u32 sensor_4ha_setfile_A_Global[] = {
+ 0x0100, 0x00, 0x01,
+ 0x0A02, 0x7F, 0x01,
+ 0x3B45, 0x01, 0x01,
+ 0x3264, 0x01, 0x01,
+ 0x3290, 0x10, 0x01,
+ 0x0B05, 0x01, 0x01,
+ 0x3069, 0xC7, 0x01,
+ 0x3074, 0x06, 0x01,
+ 0x3075, 0x32, 0x01,
+ 0x3068, 0xF7, 0x01,
+ 0x30C6, 0x01, 0x01,
+ 0x301F, 0x20, 0x01,
+ 0x306B, 0x9A, 0x01,
+ 0x3091, 0x1F, 0x01,
+ 0x306E, 0x71, 0x01,
+ 0x306F, 0x28, 0x01,
+ 0x306D, 0x08, 0x01,
+ 0x3084, 0x16, 0x01,
+ 0x3070, 0x0F, 0x01,
+ 0x306A, 0x79, 0x01,
+ 0x30B0, 0xFF, 0x01,
+ 0x30C2, 0x05, 0x01,
+ 0x30C4, 0x06, 0x01,
+ 0x3081, 0x07, 0x01,
+ 0x307B, 0x85, 0x01,
+ 0x307A, 0x0A, 0x01,
+ 0x3079, 0x0A, 0x01,
+ 0x308A, 0x20, 0x01,
+ 0x308B, 0x08, 0x01,
+ 0x308C, 0x0B, 0x01,
+ 0x392F, 0x01, 0x01,
+ 0x3930, 0x00, 0x01,
+ 0x3924, 0x7F, 0x01,
+ 0x3925, 0xFD, 0x01,
+ 0x3C08, 0xFF, 0x01,
+ 0x3C09, 0xFF, 0x01,
+ 0x3C31, 0xFF, 0x01,
+ 0x3C32, 0xFF, 0x01,
+};
+
+/* 26M_3Lane */
+const u32 sensor_4ha_setfile_A_3264x2448_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x0C, 0x01,
+ 0x034D, 0xC0, 0x01,
+ 0x034E, 0x09, 0x01,
+ 0x034F, 0x90, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_3264x1836_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x01, 0x01,
+ 0x0347, 0x3A, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x08, 0x01,
+ 0x034B, 0x65, 0x01,
+ 0x034C, 0x0C, 0x01,
+ 0x034D, 0xC0, 0x01,
+ 0x034E, 0x07, 0x01,
+ 0x034F, 0x2C, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_3264x1588_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x01, 0x01,
+ 0x0347, 0xB6, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x07, 0x01,
+ 0x034B, 0xE9, 0x01,
+ 0x034C, 0x0C, 0x01,
+ 0x034D, 0xC0, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x34, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_2448x2448_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x01, 0x01,
+ 0x0345, 0xA0, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0B, 0x01,
+ 0x0349, 0x2F, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x09, 0x01,
+ 0x034D, 0x90, 0x01,
+ 0x034E, 0x09, 0x01,
+ 0x034F, 0x90, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+#if 0
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_1640x1228_7fps[] = {};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_1640x1228_15fps[] = {};
+#endif
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_1632x1224_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x06, 0x01,
+ 0x034D, 0x60, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0xC8, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x03, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_1632x1224_60fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x04, 0x01,
+ 0x0341, 0xF0, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x06, 0x01,
+ 0x034D, 0x60, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0xC8, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x03, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+#if 0
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_1640x924_60fps[] = {};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_816x604_115fps[] = {};
+#endif
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_A_800x600_120fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x02, 0x01,
+ 0x0341, 0x78, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x28, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xA7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x7F, 0x01,
+ 0x034C, 0x03, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x02, 0x01,
+ 0x034F, 0x58, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x07, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x44, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_A_3264x2448_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_A_3264x1836_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_A_3264x1588_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_A_2448x2448_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_A_1632x1224_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_A_1632x1224_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 1264, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_A_800x600_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 632, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+static const u32 *sensor_4ha_setfiles_A[] = {
+ /* 16x10 margin */
+ sensor_4ha_setfile_A_3264x2448_30fps,
+ sensor_4ha_setfile_A_3264x1836_30fps,
+ sensor_4ha_setfile_A_3264x1588_30fps,
+ sensor_4ha_setfile_A_2448x2448_30fps,
+ sensor_4ha_setfile_A_1632x1224_30fps,
+ sensor_4ha_setfile_A_1632x1224_60fps,
+ sensor_4ha_setfile_A_800x600_120fps,
+};
+
+static const u32 sensor_4ha_setfile_A_sizes[] = {
+ /* 16x10 margin */
+ ARRAY_SIZE(sensor_4ha_setfile_A_3264x2448_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_A_3264x1836_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_A_3264x1588_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_A_2448x2448_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_A_1632x1224_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_A_1632x1224_60fps),
+ ARRAY_SIZE(sensor_4ha_setfile_A_800x600_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_4ha_pllinfos_A[] = {
+ /* 16x10 margin */
+ &sensor_4ha_pllinfo_A_3264x2448_30fps,
+ &sensor_4ha_pllinfo_A_3264x1836_30fps,
+ &sensor_4ha_pllinfo_A_3264x1588_30fps,
+ &sensor_4ha_pllinfo_A_2448x2448_30fps,
+ &sensor_4ha_pllinfo_A_1632x1224_30fps,
+ &sensor_4ha_pllinfo_A_1632x1224_60fps,
+ &sensor_4ha_pllinfo_A_800x600_120fps,
+};
+
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_4HA_SET_B_H
+#define FIMC_IS_CIS_4HA_SET_B_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-4ha.h"
+
+/* Reference : S5K4HA04_EVT0.0_Ver_2.61_20161129.xlsx */
+
+const u32 sensor_4ha_setfile_B_Global[] = {
+ 0x0100, 0x00, 0x01,
+ 0x0A02, 0x7F, 0x01,
+ 0x3B45, 0x01, 0x01,
+ 0x3264, 0x01, 0x01,
+ 0x3290, 0x10, 0x01,
+ 0x0B05, 0x01, 0x01,
+ 0x3069, 0xC7, 0x01,
+ 0x3074, 0x06, 0x01,
+ 0x3075, 0x32, 0x01,
+ 0x3068, 0xF7, 0x01,
+ 0x30C6, 0x01, 0x01,
+ 0x301F, 0x20, 0x01,
+ 0x306B, 0x9A, 0x01,
+ 0x3091, 0x1F, 0x01,
+ 0x306E, 0x71, 0x01,
+ 0x306F, 0x28, 0x01,
+ 0x306D, 0x08, 0x01,
+ 0x3084, 0x16, 0x01,
+ 0x3070, 0x0F, 0x01,
+ 0x306A, 0x79, 0x01,
+ 0x30B0, 0xFF, 0x01,
+ 0x30C2, 0x05, 0x01,
+ 0x30C4, 0x06, 0x01,
+ 0x3081, 0x07, 0x01,
+ 0x307B, 0x85, 0x01,
+ 0x307A, 0x0A, 0x01,
+ 0x3079, 0x0A, 0x01,
+ 0x308A, 0x20, 0x01,
+ 0x308B, 0x08, 0x01,
+ 0x308C, 0x0B, 0x01,
+ 0x392F, 0x01, 0x01,
+ 0x3930, 0x00, 0x01,
+ 0x3924, 0x7F, 0x01,
+ 0x3925, 0xFD, 0x01,
+ 0x3C08, 0xFF, 0x01,
+ 0x3C09, 0xFF, 0x01,
+ 0x3C31, 0xFF, 0x01,
+ 0x3C32, 0xFF, 0x01,
+};
+
+/* 26M_3Lane */
+const u32 sensor_4ha_setfile_B_3264x2448_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x0C, 0x01,
+ 0x034D, 0xC0, 0x01,
+ 0x034E, 0x09, 0x01,
+ 0x034F, 0x90, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_3264x1836_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x01, 0x01,
+ 0x0347, 0x3A, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x08, 0x01,
+ 0x034B, 0x65, 0x01,
+ 0x034C, 0x0C, 0x01,
+ 0x034D, 0xC0, 0x01,
+ 0x034E, 0x07, 0x01,
+ 0x034F, 0x2C, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_3264x1588_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x01, 0x01,
+ 0x0347, 0xB6, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x07, 0x01,
+ 0x034B, 0xE9, 0x01,
+ 0x034C, 0x0C, 0x01,
+ 0x034D, 0xC0, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x34, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_2448x2448_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x01, 0x01,
+ 0x0345, 0xA0, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0B, 0x01,
+ 0x0349, 0x2F, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x09, 0x01,
+ 0x034D, 0x90, 0x01,
+ 0x034E, 0x09, 0x01,
+ 0x034F, 0x90, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x01, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x00, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+#if 0
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_1640x1228_7fps[] = {};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_1640x1228_15fps[] = {};
+#endif
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_1632x1224_30fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x09, 0x01,
+ 0x0341, 0xE2, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x06, 0x01,
+ 0x034D, 0x60, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0xC8, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x03, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_1632x1224_60fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x04, 0x01,
+ 0x0341, 0xF0, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x08, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x08, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xC7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x97, 0x01,
+ 0x034C, 0x06, 0x01,
+ 0x034D, 0x60, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0xC8, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x03, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+#if 0
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_1640x924_60fps[] = {};
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_816x604_115fps[] = {};
+#endif
+
+/* 16x10 margin, EXTCLK 26Mhz */
+const u32 sensor_4ha_setfile_B_800x600_120fps[] = {
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ 0x0301, 0x04, 0x01,
+ 0x0305, 0x05, 0x01,
+ 0x0306, 0x00, 0x01,
+ 0x0307, 0x6C, 0x01,
+ 0x3C1F, 0x00, 0x01,
+ 0x030D, 0x05, 0x01,
+ 0x030E, 0x00, 0x01,
+ 0x030F, 0xAF, 0x01,
+ 0x3C17, 0x00, 0x01,
+ 0x0340, 0x02, 0x01,
+ 0x0341, 0x78, 0x01,
+ 0x0342, 0x0E, 0x01,
+ 0x0343, 0x68, 0x01,
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x28, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x0C, 0x01,
+ 0x0349, 0xA7, 0x01,
+ 0x034A, 0x09, 0x01,
+ 0x034B, 0x7F, 0x01,
+ 0x034C, 0x03, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x02, 0x01,
+ 0x034F, 0x58, 0x01,
+ 0x0381, 0x01, 0x01,
+ 0x0383, 0x01, 0x01,
+ 0x0385, 0x01, 0x01,
+ 0x0387, 0x07, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x44, 0x01,
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x20, 0x01,
+ 0x0200, 0x0D, 0x01,
+ 0x0201, 0xD8, 0x01,
+ 0x0202, 0x00, 0x01,
+ 0x0203, 0x02, 0x01,
+ 0x0820, 0x03, 0x01,
+ 0x0821, 0x8E, 0x01,
+ 0x0822, 0x00, 0x01,
+ 0x0823, 0x00, 0x01,
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x02, 0x01,
+ 0x3929, 0x2F, 0x01,
+ 0x0101, 0x00, 0x01,
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_B_3264x2448_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_B_3264x1836_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_B_3264x1588_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_B_2448x2448_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_B_1632x1224_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 2530, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_B_1632x1224_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 1264, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+const struct sensor_pll_info_compact sensor_4ha_pllinfo_B_800x600_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 910000000, /* mipi_datarate = OPSYCK */
+ 280800000, /* VT picxel clk */
+ 632, /* frame_length_lines */
+ 3688, /* line_length_pck */
+};
+
+static const u32 *sensor_4ha_setfiles_B[] = {
+ /* 16x10 margin */
+ sensor_4ha_setfile_B_3264x2448_30fps,
+ sensor_4ha_setfile_B_3264x1836_30fps,
+ sensor_4ha_setfile_B_3264x1588_30fps,
+ sensor_4ha_setfile_B_2448x2448_30fps,
+ sensor_4ha_setfile_B_1632x1224_30fps,
+ sensor_4ha_setfile_B_1632x1224_60fps,
+ sensor_4ha_setfile_B_800x600_120fps,
+};
+
+static const u32 sensor_4ha_setfile_B_sizes[] = {
+ /* 16x10 margin */
+ ARRAY_SIZE(sensor_4ha_setfile_B_3264x2448_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_B_3264x1836_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_B_3264x1588_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_B_2448x2448_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_B_1632x1224_30fps),
+ ARRAY_SIZE(sensor_4ha_setfile_B_1632x1224_60fps),
+ ARRAY_SIZE(sensor_4ha_setfile_B_800x600_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_4ha_pllinfos_B[] = {
+ /* 16x10 margin */
+ &sensor_4ha_pllinfo_B_3264x2448_30fps,
+ &sensor_4ha_pllinfo_B_3264x1836_30fps,
+ &sensor_4ha_pllinfo_B_3264x1588_30fps,
+ &sensor_4ha_pllinfo_B_2448x2448_30fps,
+ &sensor_4ha_pllinfo_B_1632x1224_30fps,
+ &sensor_4ha_pllinfo_B_1632x1224_60fps,
+ &sensor_4ha_pllinfo_B_800x600_120fps,
+};
+
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-4ha.h"
+#include "fimc-is-cis-4ha-setA.h"
+#include "fimc-is-cis-4ha-setB.h"
+
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "S5K4HA"
+/* #define DEBUG_4HA_PLL */
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_4ha_global;
+static u32 sensor_4ha_global_size;
+static const u32 **sensor_4ha_setfiles;
+static const u32 *sensor_4ha_setfile_sizes;
+static u32 sensor_4ha_max_setfile_num;
+static const struct sensor_pll_info_compact **sensor_4ha_pllinfos;
+
+static void sensor_4ha_cis_data_calculation(const struct sensor_pll_info_compact *pll_info, cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, max_fps = 0, frame_valid_us = 0;
+
+ FIMC_BUG_VOID(!pll_info);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info->pclk;
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = ((pll_info->frame_length_lines * pll_info->line_length_pck)
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info->frame_length_lines * pll_info->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info->frame_length_lines(%d) * pll_info->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info->frame_length_lines, pll_info->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = (vt_pix_clk_hz * 10) / (pll_info->frame_length_lines * pll_info->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = max_fps;
+ cis_data->frame_length_lines = pll_info->frame_length_lines;
+ cis_data->line_length_pck = pll_info->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck
+ * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck
+ * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_4HA_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = SENSOR_4HA_FINE_INTEGRATION_TIME_MAX;
+ cis_data->min_coarse_integration_time = SENSOR_4HA_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_4HA_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+ info("%s: done", __func__);
+}
+
+static int sensor_4ha_wait_stream_off_status(cis_shared_data *cis_data)
+{
+ int ret = 0;
+ u32 timeout = 0;
+
+ FIMC_BUG(!cis_data);
+
+#define STREAM_OFF_WAIT_TIME 250
+ while (timeout < STREAM_OFF_WAIT_TIME) {
+ if (cis_data->is_active_area == false &&
+ cis_data->stream_on == false) {
+ pr_debug("actual stream off\n");
+ break;
+ }
+ timeout++;
+ }
+
+ if (timeout == STREAM_OFF_WAIT_TIME) {
+ pr_err("actual stream off wait timeout\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+/* CIS OPS */
+int sensor_4ha_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+ setinfo.param = NULL;
+ setinfo.return_value = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ warn("sensor_4ha_check_rev is fail when cis init");
+ cis->rev_flag = true;
+ ret = 0;
+ }
+
+ cis->cis_data->cur_width = SENSOR_4HA_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_4HA_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_4ha_cis_data_calculation(sensor_4ha_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ ret = fimc_is_sensor_read16(client, 0x0000, &data16);
+ if (unlikely(!ret))
+ dbg_sensor(1, "[SEN:DUMP] model_id(%x)\n", data16);
+
+ ret = fimc_is_sensor_read8(client, 0x0002, &data8);
+ if (unlikely(!ret))
+ dbg_sensor(1, "[SEN:DUMP] revision_number(%x)\n", data8);
+
+ ret = fimc_is_sensor_read8(client, 0x0005, &data8);
+ if (unlikely(!ret))
+ dbg_sensor(1, "[SEN:DUMP] frame_count(%x)\n", data8);
+
+ ret = fimc_is_sensor_read8(client, 0x0100, &data8);
+ if (unlikely(!ret))
+ dbg_sensor(1, "[SEN:DUMP] mode_select(%x)\n", data8);
+
+ sensor_cis_dump_registers(subdev, sensor_4ha_setfiles[0], sensor_4ha_setfile_sizes[0]);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+p_err:
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_4ha_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_4ha_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_4ha_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ ret = sensor_4ha_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ /* ARM start */
+ ret = fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret = fimc_is_sensor_write16(cis->client, 0x6010, 0x0001);
+ /* 3ms delay to operate sensor FW */
+ usleep_range(3000, 3000);
+
+ ret = sensor_cis_set_registers(subdev, sensor_4ha_global, sensor_4ha_global_size);
+
+ if (ret < 0) {
+ err("sensor_4ha_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_4ha_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* If check_rev fail when cis_init, one more check_rev in mode_change */
+ if (cis->rev_flag == true) {
+ cis->rev_flag = false;
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ err("sensor_4ha_check_rev is fail");
+ goto p_err;
+ }
+ }
+
+ sensor_4ha_cis_data_calculation(sensor_4ha_pllinfos[mode], cis->cis_data);
+
+ ret = sensor_cis_set_registers(subdev, sensor_4ha_setfiles[mode], sensor_4ha_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_4ha_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ return ret;
+}
+
+/* TODO: Sensor set size sequence(sensor done, sensor stop, 3AA done in FW case */
+int sensor_4ha_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ int ret = 0;
+ bool binning = false;
+ u32 ratio_w = 0, ratio_h = 0, start_x = 0, start_y = 0, end_x = 0, end_y = 0;
+ u32 even_x = 0, odd_x = 0, even_y = 0, odd_y = 0;
+ struct i2c_client *client = NULL;
+ struct fimc_is_cis *cis = NULL;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ if (unlikely(!cis_data)) {
+ err("cis data is NULL");
+ if (unlikely(!cis->cis_data)) {
+ ret = -EINVAL;
+ goto p_err;
+ } else {
+ cis_data = cis->cis_data;
+ }
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* Wait actual stream off */
+ ret = sensor_4ha_wait_stream_off_status(cis_data);
+ if (ret) {
+ err("Must stream off\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ binning = cis_data->binning;
+ if (binning) {
+ ratio_w = (SENSOR_4HA_MAX_WIDTH / cis_data->cur_width);
+ ratio_h = (SENSOR_4HA_MAX_HEIGHT / cis_data->cur_height);
+ } else {
+ ratio_w = 1;
+ ratio_h = 1;
+ }
+
+ if (((cis_data->cur_width * ratio_w) > SENSOR_4HA_MAX_WIDTH) ||
+ ((cis_data->cur_height * ratio_h) > SENSOR_4HA_MAX_HEIGHT)) {
+ err("Config max sensor size over~!!\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* 1. page_select */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* 2. pixel address region setting */
+ start_x = ((SENSOR_4HA_MAX_WIDTH - cis_data->cur_width * ratio_w) / 2) & (~0x1);
+ start_y = ((SENSOR_4HA_MAX_HEIGHT - cis_data->cur_height * ratio_h) / 2) & (~0x1);
+ end_x = start_x + (cis_data->cur_width * ratio_w - 1);
+ end_y = start_y + (cis_data->cur_height * ratio_h - 1);
+
+ if (!(end_x & (0x1)) || !(end_y & (0x1))) {
+ err("Sensor pixel end address must odd\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0344, start_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0346, start_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0348, end_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034A, end_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 3. output address setting */
+ ret = fimc_is_sensor_write16(client, 0x034C, cis_data->cur_width);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034E, cis_data->cur_height);
+ if (ret < 0)
+ goto p_err;
+
+ /* If not use to binning, sensor image should set only crop */
+ if (!binning) {
+ dbg_sensor(1, "Sensor size set is not binning\n");
+ goto p_err;
+ }
+
+ /* 4. sub sampling setting */
+ even_x = 1; /* 1: not use to even sampling */
+ even_y = 1;
+ odd_x = (ratio_w * 2) - even_x;
+ odd_y = (ratio_h * 2) - even_y;
+
+ ret = fimc_is_sensor_write16(client, 0x0380, even_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0382, odd_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0384, even_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0386, odd_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 5. binnig setting */
+ ret = fimc_is_sensor_write8(client, 0x0900, binning); /* 1: binning enable, 0: disable */
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write8(client, 0x0901, (ratio_w << 4) | ratio_h);
+ if (ret < 0)
+ goto p_err;
+
+ /* 6. scaling setting: but not use */
+ /* scaling_mode (0: No scaling, 1: Horizontal, 2: Full) */
+ ret = fimc_is_sensor_write16(client, 0x0400, 0x0000);
+ if (ret < 0)
+ goto p_err;
+ /* down_scale_m: 1 to 16 upwards (scale_n: 16(fixed)) */
+ /* down scale factor = down_scale_m / down_scale_n */
+ ret = fimc_is_sensor_write16(client, 0x0404, 0x0010);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n",
+ __func__, cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+
+#ifdef DEBUG_4HA_PLL
+ {
+ u16 pll;
+
+ fimc_is_sensor_read16(client, 0x0300, &pll);
+ dbg_sensor(1, "______ vt_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0302, &pll);
+ dbg_sensor(1, "______ vt_sys_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0304, &pll);
+ dbg_sensor(1, "______ pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0306, &pll);
+ dbg_sensor(1, "______ pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0308, &pll);
+ dbg_sensor(1, "______ op_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030a, &pll);
+ dbg_sensor(1, "______ op_sys_clk_div(%x)\n", pll);
+
+ fimc_is_sensor_read16(client, 0x030c, &pll);
+ dbg_sensor(1, "______ secnd_pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030e, &pll);
+ dbg_sensor(1, "______ secnd_pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0340, &pll);
+ dbg_sensor(1, "______ frame_length_lines(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0342, &pll);
+ dbg_sensor(1, "______ line_length_pck(%x)\n", pll);
+ }
+#endif
+
+ /* Sensor stream on */
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+
+ /* Sensor stream off */
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 fine_int = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ fine_int = line_length_pck - 0xf0;
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0200, (u16)(fine_int & 0xFFFF));
+ if (ret < 0)
+ goto p_err;
+
+ /* Short exposure */
+ ret = fimc_is_sensor_write16(client, 0x0202, short_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d),"
+ KERN_CONT "line_length_pck(%d), fine_int (%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, vt_pic_clk_freq_mhz, line_length_pck, fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x),"
+ KERN_CONT "long_coarse_int %#x, short_coarse_int %#x\n", cis->id, __func__,
+ cis_data->sen_vsync_count, cis_data->frame_length_lines, long_coarse_int, short_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_4ha_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update hear? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time, frame_duration,
+ cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_4ha_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+
+ frame_length_lines = (u16)((vt_pic_clk_freq_mhz * frame_duration) / line_length_pck);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk_freq_mhz(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, vt_pic_clk_freq_mhz, frame_duration, line_length_pck, frame_length_lines);
+
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+ cis_data->max_coarse_integration_time = cis_data->frame_length_lines
+ - cis_data->max_margin_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_4ha_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+ u32 cur_mode_min_duration = 0;
+ const struct sensor_pll_info_compact *pll_info = NULL;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_4ha_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ if (cis_data->sens_config_index_cur <= sensor_4ha_max_setfile_num) {
+ pll_info = sensor_4ha_pllinfos[cis_data->sens_config_index_cur];
+ } else {
+ err("[MOD:D:%d] %s, current sensor mode is invalid(%d)\n",
+ cis->id, __func__, cis_data->sens_config_index_cur);
+ }
+
+ if (pll_info != NULL) {
+ cur_mode_min_duration = (pll_info->frame_length_lines * pll_info->line_length_pck
+ / (cis_data->pclk / (1000 * 1000)));
+ }
+
+ if (frame_duration < cur_mode_min_duration)
+ cis_data->min_frame_us_time = cur_mode_min_duration;
+ else
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+int sensor_4ha_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_4ha_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ analog_gain = (u16)sensor_cis_calc_again_code(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0204, analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_4ha_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_4ha_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x0084, &read_value);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0084, read_value, ret);
+
+ cis_data->min_analog_gain[0] = read_value;
+
+ cis_data->min_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x0086, &read_value);
+ if (ret < 0)
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0086, read_value, ret);
+
+ cis_data->max_analog_gain[0] = read_value;
+
+ cis_data->max_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u16 dgains[4] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, dgain->long_val, dgain->short_val,
+ long_gain, short_gain);
+
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = short_gain;
+ /* Short digital gain */
+ ret = fimc_is_sensor_write16_array(client, 0x020E, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_4ha_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_4ha_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_4ha_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ fimc_is_sensor_read16(client, 0x1084, &read_value);
+
+ cis_data->min_digital_gain[0] = read_value;
+
+ cis_data->min_digital_gain[1] = sensor_cis_calc_dgain_permile(read_value);
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ fimc_is_sensor_read16(client, 0x1086, &read_value);
+
+ cis_data->max_digital_gain[0] = read_value;
+
+ cis_data->max_digital_gain[1] = sensor_cis_calc_dgain_permile(read_value);
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_4ha_cis_compensate_gain_for_extremely_br(struct v4l2_subdev *subdev, u32 expo, u32 *again, u32 *dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u16 coarse_int = 0;
+ u32 compensated_again = 0;
+ u32 integration_time = 0;
+
+ u32 ratio = 0;
+ static u32 pre_ratio;
+ static u32 pre_coarse_int;
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ if (line_length_pck <= 0) {
+ err("[%s] invalid line_length_pck(%d)\n", __func__, line_length_pck);
+ goto p_err;
+ }
+
+ coarse_int = ((expo * vt_pic_clk_freq_mhz) - (cis_data->line_length_pck - 0xf0)) / line_length_pck;
+ if (coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, coarse_int, cis_data->min_coarse_integration_time);
+ coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ integration_time = ((cis_data->line_length_pck * coarse_int + (cis_data->line_length_pck - 0xf0))
+ / vt_pic_clk_freq_mhz);
+ ratio = ((expo << 8) / integration_time);
+
+ if (pre_coarse_int <= 15) {
+ compensated_again = (*again * (pre_ratio)) >> 8;
+
+ if (compensated_again < cis_data->min_analog_gain[1])
+ *again = cis_data->min_analog_gain[1];
+ else if (*again >= cis_data->max_analog_gain[1])
+ *dgain = (*dgain * (pre_ratio));
+ else
+ *again = compensated_again;
+
+ dbg_sensor(1, "[%s] exp(%d), again(%d), dgain(%d), coarse_int(%d),"
+ KERN_CONT "compensated_again(%d), integration_time : (%d)\n",
+ __func__, expo, *again, *dgain, coarse_int, compensated_again, integration_time);
+ }
+
+ pre_ratio = ratio;
+ pre_coarse_int = coarse_int;
+p_err:
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_4ha_cis_init,
+ .cis_log_status = sensor_4ha_cis_log_status,
+ .cis_group_param_hold = sensor_4ha_cis_group_param_hold,
+ .cis_set_global_setting = sensor_4ha_cis_set_global_setting,
+ .cis_mode_change = sensor_4ha_cis_mode_change,
+ .cis_set_size = sensor_4ha_cis_set_size,
+ .cis_stream_on = sensor_4ha_cis_stream_on,
+ .cis_stream_off = sensor_4ha_cis_stream_off,
+ .cis_set_exposure_time = sensor_4ha_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_4ha_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_4ha_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_4ha_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_4ha_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_4ha_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_4ha_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_4ha_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_4ha_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_4ha_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_4ha_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_4ha_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_4ha_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_4ha_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_4ha_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_4ha_cis_compensate_gain_for_extremely_br,
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_cis_wait_streamon,
+};
+
+int cis_4ha_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor_id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor_id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_S5K4HA);
+ if (!sensor_peri) {
+ probe_info("sensor peri is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_S5K4HA;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_ONE_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_GR_BG;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_4ha_global = sensor_4ha_setfile_A_Global;
+ sensor_4ha_global_size = ARRAY_SIZE(sensor_4ha_setfile_A_Global);
+ sensor_4ha_setfiles = sensor_4ha_setfiles_A;
+ sensor_4ha_setfile_sizes = sensor_4ha_setfile_A_sizes;
+ sensor_4ha_pllinfos = sensor_4ha_pllinfos_A;
+ sensor_4ha_max_setfile_num = ARRAY_SIZE(sensor_4ha_setfiles_A);
+ } else if (strcmp(setfile, "setB") == 0) {
+ probe_info("%s setfile_B\n", __func__);
+ sensor_4ha_global = sensor_4ha_setfile_B_Global;
+ sensor_4ha_global_size = ARRAY_SIZE(sensor_4ha_setfile_B_Global);
+ sensor_4ha_setfiles = sensor_4ha_setfiles_B;
+ sensor_4ha_setfile_sizes = sensor_4ha_setfile_B_sizes;
+ sensor_4ha_pllinfos = sensor_4ha_pllinfos_B;
+ sensor_4ha_max_setfile_num = ARRAY_SIZE(sensor_4ha_setfiles_B);
+ } else {
+ err("%s setfile index out of bound, take default (setfile_A)", __func__);
+ sensor_4ha_global = sensor_4ha_setfile_A_Global;
+ sensor_4ha_global_size = ARRAY_SIZE(sensor_4ha_setfile_A_Global);
+ sensor_4ha_setfiles = sensor_4ha_setfiles_A;
+ sensor_4ha_setfile_sizes = sensor_4ha_setfile_A_sizes;
+ sensor_4ha_pllinfos = sensor_4ha_pllinfos_A;
+ sensor_4ha_max_setfile_num = ARRAY_SIZE(sensor_4ha_setfiles_A);
+ }
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_4ha_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-4ha",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_cis_4ha_match);
+
+static const struct i2c_device_id sensor_cis_4ha_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_4ha_driver = {
+ .probe = cis_4ha_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_4ha_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_4ha_idt
+};
+
+static int __init sensor_cis_4ha_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_4ha_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_4ha_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_4ha_init);
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_4HA_H
+#define FIMC_IS_CIS_4HA_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_4HA_MAX_WIDTH (3264 + 0)
+#define SENSOR_4HA_MAX_HEIGHT (2448 + 0)
+
+/* TODO: Check below values are valid */
+#define SENSOR_4HA_FINE_INTEGRATION_TIME_MIN 0x1C5
+#define SENSOR_4HA_FINE_INTEGRATION_TIME_MAX 0x1C5
+#define SENSOR_4HA_COARSE_INTEGRATION_TIME_MIN 0x1
+#define SENSOR_4HA_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x4
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+#endif
+
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_5e2_probe(struct i2c_client *client,
sensor_5e2_max_setfile_num = sizeof(sensor_5e2_setfiles_A) / sizeof(sensor_5e2_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int __init cis_5e3_probe(struct i2c_client *client,
sensor_5e3_max_setfile_num = sizeof(sensor_5e3_setfiles_A) / sizeof(sensor_5e3_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_5E9_SET_A_H
+#define FIMC_IS_CIS_5E9_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-5e9.h"
+
+/* 5E9_EVT00_Setfile_REV06i.xlsx */
+const u32 sensor_5e9_setfile_A_Global[] = {
+ /* Analog Global Setting */
+ 0x0100, 0x00, 0x1,
+ 0x0A02, 0x3F, 0x1,
+ 0x3B45, 0x01, 0x1,
+ 0x3290, 0x10, 0x1,
+ 0x0B05, 0x01, 0x1,
+ 0x3069, 0x87, 0x1,
+ 0x3074, 0x06, 0x1,
+ 0x3075, 0x2F, 0x1,
+ 0x301F, 0x20, 0x1,
+ 0x306B, 0x9A, 0x1,
+ 0x3091, 0x1B, 0x1,
+ 0x306E, 0x71, 0x1,
+ 0x306F, 0x28, 0x1,
+ 0x306D, 0x08, 0x1,
+ 0x3084, 0x16, 0x1,
+ 0x3070, 0x0F, 0x1,
+ 0x306A, 0x79, 0x1,
+ 0x30B0, 0xFF, 0x1,
+ 0x30C2, 0x05, 0x1,
+ 0x30C4, 0x06, 0x1,
+ 0x3012, 0x4E, 0x1,
+ 0x3080, 0x08, 0x1,
+ 0x3083, 0x14, 0x1,
+ 0x3200, 0x01, 0x1,
+ 0x3081, 0x07, 0x1,
+ 0x307B, 0x85, 0x1,
+ 0x307A, 0x0A, 0x1,
+ 0x3079, 0x0A, 0x1,
+ 0x308A, 0x20, 0x1,
+ 0x308B, 0x08, 0x1,
+ 0x308C, 0x0B, 0x1,
+ 0x392F, 0x01, 0x1,
+ 0x3930, 0x00, 0x1,
+ 0x3924, 0x7F, 0x1,
+ 0x3925, 0xFD, 0x1,
+ 0x3C08, 0xFF, 0x1,
+ 0x3C09, 0xFF, 0x1,
+ 0x3C31, 0xFF, 0x1,
+ 0x3C32, 0xFF, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_2592x1944_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x08, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9F, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x98, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_2592x1460_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xF8, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB4, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_2592x1458_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xFA, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB2, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_2592x1260_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x01, 0x1,
+ 0x0347, 0x5E, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0x49, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x04, 0x1,
+ 0x034F, 0xEC, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_1936x1936_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x01, 0x1,
+ 0x0345, 0x50, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x0C, 0x1,
+ 0x0348, 0x08, 0x1,
+ 0x0349, 0xDF, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9B, 0x1,
+ 0x034C, 0x07, 0x1,
+ 0x034D, 0x90, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x90, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_2592x1460_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xF8, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB4, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_2592x1458_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xFA, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB2, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_2592x1260_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x01, 0x1,
+ 0x0347, 0x5E, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0x49, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x04, 0x1,
+ 0x034F, 0xEC, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_A_1936x1936_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x01, 0x1,
+ 0x0345, 0x50, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x0C, 0x1,
+ 0x0348, 0x08, 0x1,
+ 0x0349, 0xDF, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9B, 0x1,
+ 0x034C, 0x07, 0x1,
+ 0x034D, 0x90, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x90, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+/* 2x2 Binning */
+const u32 sensor_5e9_setfile_A_1296x972_58fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x04, 0x1,
+ 0x0341, 0x0E, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x08, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9F, 0x1,
+ 0x034C, 0x05, 0x1,
+ 0x034D, 0x10, 0x1,
+ 0x034E, 0x03, 0x1,
+ 0x034F, 0xCC, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x03, 0x1,
+ 0x0900, 0x01, 0x1,
+ 0x0901, 0x22, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+/* 2x2 Binning */
+const u32 sensor_5e9_setfile_A_640x480_120fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x02, 0x1,
+ 0x0341, 0x34, 0x1,
+ 0x0342, 0x0A, 0x1,
+ 0x0343, 0xF0, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x18, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x14, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x17, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x93, 0x1,
+ 0x034C, 0x02, 0x1,
+ 0x034D, 0x80, 0x1,
+ 0x034E, 0x01, 0x1,
+ 0x034F, 0xE0, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x07, 0x1,
+ 0x0900, 0x01, 0x1,
+ 0x0901, 0x44, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0A, 0x1,
+ 0x0201, 0x64, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2E, 0x1,
+ 0x30BA, 0x36, 0x1,
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_2592x1944_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_2592x1460_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_2592x1458_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_2592x1260_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_1936x1936_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_2592x1460_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_2592x1458_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_2592x1260_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_1936x1936_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_1296x972_58fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x040E, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_A_640x480_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x0234, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0AF0, /* line_length_pck (0x0342, 0x0343) */
+};
+
+static const u32 *sensor_5e9_setfiles_A[] = {
+ sensor_5e9_setfile_A_2592x1944_30fps,
+ sensor_5e9_setfile_A_2592x1460_30fps,
+ sensor_5e9_setfile_A_2592x1458_30fps,
+ sensor_5e9_setfile_A_2592x1260_30fps,
+ sensor_5e9_setfile_A_1936x1936_30fps,
+ sensor_5e9_setfile_A_2592x1460_24fps,
+ sensor_5e9_setfile_A_2592x1458_24fps,
+ sensor_5e9_setfile_A_2592x1260_24fps,
+ sensor_5e9_setfile_A_1936x1936_24fps,
+ sensor_5e9_setfile_A_1296x972_58fps,
+ sensor_5e9_setfile_A_640x480_120fps,
+};
+
+static const u32 sensor_5e9_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_5e9_setfile_A_2592x1944_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_2592x1460_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_2592x1458_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_2592x1260_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_1936x1936_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_2592x1460_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_2592x1458_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_2592x1260_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_1936x1936_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_1296x972_58fps),
+ ARRAY_SIZE(sensor_5e9_setfile_A_640x480_120fps),
+};
+
+static const struct sensor_pll_info *sensor_5e9_pllinfos_A[] = {
+ &sensor_5e9_pllinfo_A_2592x1944_30fps,
+ &sensor_5e9_pllinfo_A_2592x1460_30fps,
+ &sensor_5e9_pllinfo_A_2592x1458_30fps,
+ &sensor_5e9_pllinfo_A_2592x1260_30fps,
+ &sensor_5e9_pllinfo_A_1936x1936_30fps,
+ &sensor_5e9_pllinfo_A_2592x1460_24fps,
+ &sensor_5e9_pllinfo_A_2592x1458_24fps,
+ &sensor_5e9_pllinfo_A_2592x1260_24fps,
+ &sensor_5e9_pllinfo_A_1936x1936_24fps,
+ &sensor_5e9_pllinfo_A_1296x972_58fps,
+ &sensor_5e9_pllinfo_A_640x480_120fps,
+};
+
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_5E9_SET_B_H
+#define FIMC_IS_CIS_5E9_SET_B_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-5e9.h"
+
+/* 5E9_EVT00_Setfile_REV06i.xlsx */
+const u32 sensor_5e9_setfile_B_Global[] = {
+ /* Analog Global Setting */
+ 0x0100, 0x00, 0x1,
+ 0x0A02, 0x3F, 0x1,
+ 0x3B45, 0x01, 0x1,
+ 0x3290, 0x10, 0x1,
+ 0x0B05, 0x01, 0x1,
+ 0x3069, 0x87, 0x1,
+ 0x3074, 0x06, 0x1,
+ 0x3075, 0x2F, 0x1,
+ 0x301F, 0x20, 0x1,
+ 0x306B, 0x9A, 0x1,
+ 0x3091, 0x1B, 0x1,
+ 0x306E, 0x71, 0x1,
+ 0x306F, 0x28, 0x1,
+ 0x306D, 0x08, 0x1,
+ 0x3084, 0x16, 0x1,
+ 0x3070, 0x0F, 0x1,
+ 0x306A, 0x79, 0x1,
+ 0x30B0, 0xFF, 0x1,
+ 0x30C2, 0x05, 0x1,
+ 0x30C4, 0x06, 0x1,
+ 0x3012, 0x4E, 0x1,
+ 0x3080, 0x08, 0x1,
+ 0x3083, 0x14, 0x1,
+ 0x3200, 0x01, 0x1,
+ 0x3081, 0x07, 0x1,
+ 0x307B, 0x85, 0x1,
+ 0x307A, 0x0A, 0x1,
+ 0x3079, 0x0A, 0x1,
+ 0x308A, 0x20, 0x1,
+ 0x308B, 0x08, 0x1,
+ 0x308C, 0x0B, 0x1,
+ 0x392F, 0x01, 0x1,
+ 0x3930, 0x00, 0x1,
+ 0x3924, 0x7F, 0x1,
+ 0x3925, 0xFD, 0x1,
+ 0x3C08, 0xFF, 0x1,
+ 0x3C09, 0xFF, 0x1,
+ 0x3C31, 0xFF, 0x1,
+ 0x3C32, 0xFF, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_2592x1944_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x08, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9F, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x98, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_2592x1460_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xF8, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB4, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_2592x1458_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xFA, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB2, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_2592x1260_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x01, 0x1,
+ 0x0347, 0x5E, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0x49, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x04, 0x1,
+ 0x034F, 0xEC, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_1936x1936_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xEE, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x01, 0x1,
+ 0x0345, 0x50, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x0C, 0x1,
+ 0x0348, 0x08, 0x1,
+ 0x0349, 0xDF, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9B, 0x1,
+ 0x034C, 0x07, 0x1,
+ 0x034D, 0x90, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x90, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_2592x1460_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xF8, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB4, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_2592x1458_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0xFA, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0xAB, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x05, 0x1,
+ 0x034F, 0xB2, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_2592x1260_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x01, 0x1,
+ 0x0347, 0x5E, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x06, 0x1,
+ 0x034B, 0x49, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x04, 0x1,
+ 0x034F, 0xEC, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+const u32 sensor_5e9_setfile_B_1936x1936_24fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x09, 0x1,
+ 0x0341, 0xE1, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x01, 0x1,
+ 0x0345, 0x50, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x0C, 0x1,
+ 0x0348, 0x08, 0x1,
+ 0x0349, 0xDF, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9B, 0x1,
+ 0x034C, 0x07, 0x1,
+ 0x034D, 0x90, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x90, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+/* 2x2 Binning */
+const u32 sensor_5e9_setfile_B_1296x972_58fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x04, 0x1,
+ 0x0341, 0x0E, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x08, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9F, 0x1,
+ 0x034C, 0x05, 0x1,
+ 0x034D, 0x10, 0x1,
+ 0x034E, 0x03, 0x1,
+ 0x034F, 0xCC, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x03, 0x1,
+ 0x0900, 0x01, 0x1,
+ 0x0901, 0x22, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2A, 0x1,
+ 0x30BA, 0x2E, 0x1,
+};
+
+/* 2x2 Binning */
+const u32 sensor_5e9_setfile_B_640x480_120fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0301, 0x06, 0x1,
+ 0x0305, 0x05, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x6D, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x030D, 0x05, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0xA8, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0340, 0x02, 0x1,
+ 0x0341, 0x34, 0x1,
+ 0x0342, 0x0A, 0x1,
+ 0x0343, 0xF0, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x18, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x14, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x17, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x93, 0x1,
+ 0x034C, 0x02, 0x1,
+ 0x034D, 0x80, 0x1,
+ 0x034E, 0x01, 0x1,
+ 0x034F, 0xE0, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x07, 0x1,
+ 0x0900, 0x01, 0x1,
+ 0x0901, 0x44, 0x1,
+ 0x0204, 0x00, 0x1,
+ 0x0205, 0x20, 0x1,
+ 0x0200, 0x0A, 0x1,
+ 0x0201, 0x64, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x6A, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x30B8, 0x2E, 0x1,
+ 0x30BA, 0x36, 0x1,
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_2592x1944_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_2592x1460_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_2592x1458_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_2592x1260_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_1936x1936_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07EE, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_2592x1460_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_2592x1458_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_2592x1260_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_1936x1936_24fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x09E1, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_1296x972_58fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x040E, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+const struct sensor_pll_info sensor_5e9_pllinfo_B_640x480_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x05, /* pre_pll_clk_div (0x0305) */
+ 0x6D, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x0234, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0AF0, /* line_length_pck (0x0342, 0x0343) */
+};
+
+static const u32 *sensor_5e9_setfiles_B[] = {
+ sensor_5e9_setfile_B_2592x1944_30fps,
+ sensor_5e9_setfile_B_2592x1460_30fps,
+ sensor_5e9_setfile_B_2592x1458_30fps,
+ sensor_5e9_setfile_B_2592x1260_30fps,
+ sensor_5e9_setfile_B_1936x1936_30fps,
+ sensor_5e9_setfile_B_2592x1460_24fps,
+ sensor_5e9_setfile_B_2592x1458_24fps,
+ sensor_5e9_setfile_B_2592x1260_24fps,
+ sensor_5e9_setfile_B_1936x1936_24fps,
+ sensor_5e9_setfile_B_1296x972_58fps,
+ sensor_5e9_setfile_B_640x480_120fps,
+};
+
+static const u32 sensor_5e9_setfile_B_sizes[] = {
+ ARRAY_SIZE(sensor_5e9_setfile_B_2592x1944_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_2592x1460_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_2592x1458_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_2592x1260_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_1936x1936_30fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_2592x1460_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_2592x1458_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_2592x1260_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_1936x1936_24fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_1296x972_58fps),
+ ARRAY_SIZE(sensor_5e9_setfile_B_640x480_120fps),
+};
+
+static const struct sensor_pll_info *sensor_5e9_pllinfos_B[] = {
+ &sensor_5e9_pllinfo_B_2592x1944_30fps,
+ &sensor_5e9_pllinfo_B_2592x1460_30fps,
+ &sensor_5e9_pllinfo_B_2592x1458_30fps,
+ &sensor_5e9_pllinfo_B_2592x1260_30fps,
+ &sensor_5e9_pllinfo_B_1936x1936_30fps,
+ &sensor_5e9_pllinfo_B_2592x1460_24fps,
+ &sensor_5e9_pllinfo_B_2592x1458_24fps,
+ &sensor_5e9_pllinfo_B_2592x1260_24fps,
+ &sensor_5e9_pllinfo_B_1936x1936_24fps,
+ &sensor_5e9_pllinfo_B_1296x972_58fps,
+ &sensor_5e9_pllinfo_B_640x480_120fps,
+};
+
+#endif
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_5E9_SET_C_H
+#define FIMC_IS_CIS_5E9_SET_C_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-5e9.h"
+
+const u32 sensor_5e9_setfile_C_Global[] = {
+ 0x0100, 0x00, 0x1,
+ 0x0000, 0x04, 0x1,
+ 0x0000, 0x55, 0x1,
+ 0x0A02, 0x3F, 0x1,
+ 0x0100, 0x00, 0x1,
+ 0x3B45, 0x01, 0x1,
+ 0x0B05, 0x01, 0x1,
+ 0x392F, 0x01, 0x1,
+ 0x3930, 0x00, 0x1,
+ 0x3924, 0x7F, 0x1,
+ 0x3925, 0xFD, 0x1,
+ 0x3C08, 0xFF, 0x1,
+ 0x3C09, 0xFF, 0x1,
+ 0x3C31, 0xFF, 0x1,
+ 0x3C32, 0xFF, 0x1,
+ 0x3290, 0x10, 0x1,
+ 0x3200, 0x01, 0x1,
+ 0x3074, 0x06, 0x1,
+ 0x3075, 0x2F, 0x1,
+ 0x308A, 0x20, 0x1,
+ 0x308B, 0x08, 0x1,
+ 0x308C, 0x0B, 0x1,
+ 0x3081, 0x07, 0x1,
+ 0x307B, 0x85, 0x1,
+ 0x307A, 0x0A, 0x1,
+ 0x3079, 0x0A, 0x1,
+ 0x306E, 0x71, 0x1,
+ 0x306F, 0x28, 0x1,
+ 0x301F, 0x20, 0x1,
+ 0x3012, 0x4E, 0x1,
+ 0x306B, 0x9A, 0x1,
+ 0x3091, 0x16, 0x1,
+ 0x30C4, 0x06, 0x1,
+ 0x306A, 0x79, 0x1,
+ 0x30B0, 0xFF, 0x1,
+ 0x306D, 0x08, 0x1,
+ 0x3084, 0x16, 0x1,
+ 0x3070, 0x0F, 0x1,
+ 0x30C2, 0x05, 0x1,
+ 0x3069, 0x87, 0x1,
+ 0x3C0F, 0x00, 0x1,
+ 0x3083, 0x14, 0x1,
+ 0x3080, 0x08, 0x1,
+ 0x3C34, 0xEA, 0x1,
+ 0x3C35, 0x5C, 0x1,
+};
+
+/* 26Mhz, 5E9_2592x1944_30fps_MCLK26_0917.txt */
+const u32 sensor_5e9_setfile_C_2592x1944_30fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0305, 0x04, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x57, 0x1,
+ 0x030D, 0x04, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0x86, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x3C17, 0x00, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x0820, 0x03, 0x1,
+ 0x0821, 0x67, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x08, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9F, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x98, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xE2, 0x1,
+ 0x0342, 0x0C, 0x1,
+ 0x0343, 0x28, 0x1,
+ 0x0200, 0x0B, 0x1,
+ 0x0201, 0x9C, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x30B8, 0x2E, 0x1,
+ 0x30BA, 0x36, 0x1,
+ /* dual slave setting */
+#if 0
+ 0x3C02, 0x01, 0x1,
+ 0x3C05, 0x1D, 0x1,
+ 0x3500, 0x03, 0x1,
+#endif
+};
+
+/* for reduce mipi speed at thermal throttling state */
+const u32 sensor_5e9_setfile_C_2592x1944_15fps[] = {
+ 0x0136, 0x1A, 0x1,
+ 0x0137, 0x00, 0x1,
+ 0x0305, 0x04, 0x1,
+ 0x0306, 0x00, 0x1,
+ 0x0307, 0x57, 0x1,
+ 0x030D, 0x04, 0x1,
+ 0x030E, 0x00, 0x1,
+ 0x030F, 0x88, 0x1,
+ 0x3C1F, 0x00, 0x1,
+ 0x3C17, 0x01, 0x1,
+ 0x0112, 0x0A, 0x1,
+ 0x0113, 0x0A, 0x1,
+ 0x0114, 0x01, 0x1,
+ 0x0820, 0x01, 0x1,
+ 0x0821, 0xBA, 0x1,
+ 0x0822, 0x00, 0x1,
+ 0x0823, 0x00, 0x1,
+ 0x3929, 0x0F, 0x1,
+ 0x0344, 0x00, 0x1,
+ 0x0345, 0x08, 0x1,
+ 0x0346, 0x00, 0x1,
+ 0x0347, 0x08, 0x1,
+ 0x0348, 0x0A, 0x1,
+ 0x0349, 0x27, 0x1,
+ 0x034A, 0x07, 0x1,
+ 0x034B, 0x9f, 0x1,
+ 0x034C, 0x0A, 0x1,
+ 0x034D, 0x20, 0x1,
+ 0x034E, 0x07, 0x1,
+ 0x034F, 0x98, 0x1,
+ 0x0900, 0x00, 0x1,
+ 0x0901, 0x00, 0x1,
+ 0x0381, 0x01, 0x1,
+ 0x0383, 0x01, 0x1,
+ 0x0385, 0x01, 0x1,
+ 0x0387, 0x01, 0x1,
+ 0x0101, 0x00, 0x1,
+ 0x0340, 0x07, 0x1,
+ 0x0341, 0xE2, 0x1,
+ 0x0342, 0x18, 0x1,
+ 0x0343, 0x50, 0x1,
+ 0x0200, 0x17, 0x1,
+ 0x0201, 0xC4, 0x1,
+ 0x0202, 0x00, 0x1,
+ 0x0203, 0x02, 0x1,
+ 0x30B8, 0x2E, 0x1,
+ 0x30BA, 0x36, 0x1,
+};
+
+/* for reduce mipi speed at thermal throttling state */
+const struct sensor_pll_info sensor_5e9_pllinfo_C_2592x1944_15fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x04, /* pre_pll_clk_div (0x0305) */
+ 0x57, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07E2, /* frame_length_lines (0x0340, 0x0341) */
+ 0x1850, /* line_length_pck (0x0342, 0x0343) */
+};
+
+/* TODO: use pllinfo_compact */
+const struct sensor_pll_info sensor_5e9_pllinfo_C_2592x1944_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 0x06, /* vt_pix_clk_div (0x0301) */
+ 0x01, /* vt_sys_clk_div (0x3C1C[7:4]) */
+ 0x04, /* pre_pll_clk_div (0x0305) */
+ 0x57, /* pll_multiplier (0x0306, 0x0307) */
+ 0x00, /* op_pix_clk_div */
+ 0x00, /* op_sys_clk_div */
+
+ 0x00, /* secnd_pre_pll_clk_div */
+ 0x00, /* secnd_pll_multiplier */
+ 0x07E2, /* frame_length_lines (0x0340, 0x0341) */
+ 0x0C28, /* line_length_pck (0x0342, 0x0343) */
+};
+
+
+static const u32 *sensor_5e9_setfiles_C[] = {
+ sensor_5e9_setfile_C_2592x1944_30fps,
+};
+
+static const u32 sensor_5e9_setfile_C_sizes[] = {
+ ARRAY_SIZE(sensor_5e9_setfile_C_2592x1944_30fps),
+};
+
+static const struct sensor_pll_info *sensor_5e9_pllinfos_C[] = {
+ &sensor_5e9_pllinfo_C_2592x1944_30fps,
+};
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-5e9.h"
+#include "fimc-is-cis-5e9-setA.h"
+#include "fimc-is-cis-5e9-setB.h"
+#include "fimc-is-cis-5e9-setC.h"
+
+#include "fimc-is-helper-i2c.h"
+#include "fimc-is-vender-specific.h"
+
+#define SENSOR_NAME "S5K5E9"
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_5e9_global;
+static u32 sensor_5e9_global_size;
+static const u32 **sensor_5e9_setfiles;
+static const u32 *sensor_5e9_setfile_sizes;
+static const struct sensor_pll_info **sensor_5e9_pllinfos;
+static u32 sensor_5e9_max_setfile_num;
+
+static const u32 *sensor_5e9_setfile_throttling;
+static const struct sensor_pll_info *sensor_5e9_pllinfo_throttling;
+
+static void sensor_5e9_cis_data_calculation(const struct sensor_pll_info *pll_info, cis_shared_data *cis_data)
+{
+ u32 pll_voc_a = 0, vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, max_fps = 0, frame_valid_us = 0;
+
+ FIMC_BUG_VOID(!pll_info);
+
+ /* 1. mipi data rate calculation (Mbps/Lane) */
+ /* ToDo: using output Pixel Clock Divider Value */
+ /* pll_voc_b = pll_info->ext_clk / pll_info->secnd_pre_pll_clk_div * pll_info->secnd_pll_multiplier * 2;
+ op_sys_clk_hz = pll_voc_b / pll_info->op_sys_clk_div;
+ if(gpsSensorExInfo) {
+ gpsSensorExInfo->uiMIPISpeedBps = op_sys_clk_hz;
+ gpsSensorExInfo->uiMCLK = sensorInfo.ext_clk;
+ } */
+
+ /* 2. pixel rate calculation (Mpps) */
+ pll_voc_a = pll_info->ext_clk / pll_info->pre_pll_clk_div * pll_info->pll_multiplier;
+ vt_pix_clk_hz = pll_voc_a * 2 / (pll_info->vt_sys_clk_div * pll_info->vt_pix_clk_div);
+
+ dbg_sensor(1, "ext_clock(%d) / pre_pll_clk_div(%d) * pll_multiplier(%d) = pll_voc_a(%d)\n",
+ pll_info->ext_clk, pll_info->pre_pll_clk_div,
+ pll_info->pll_multiplier, pll_voc_a);
+ dbg_sensor(1, "pll_voc_a(%d) / (vt_sys_clk_div(%d) * vt_pix_clk_div(%d)) = pixel clock (%d hz)\n",
+ pll_voc_a, pll_info->vt_sys_clk_div,
+ pll_info->vt_pix_clk_div, vt_pix_clk_hz);
+
+ /* 3. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info->frame_length_lines * pll_info->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 4. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info->frame_length_lines * pll_info->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = (vt_pix_clk_hz * 10) / (pll_info->frame_length_lines * pll_info->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = max_fps;
+ cis_data->frame_length_lines = pll_info->frame_length_lines;
+ cis_data->line_length_pck = pll_info->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck *
+ (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck *
+ (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+ /* dbg_sensor(1, "Mbps/lane : %d Mbps\n", pll_voc_b / pll_info->op_sys_clk_div / 1000 / 1000); */
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_5E9_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = SENSOR_5E9_FINE_INTEGRATION_TIME_MAX;
+ cis_data->min_coarse_integration_time = SENSOR_5E9_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_5E9_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+static int sensor_5e9_wait_stream_off_status(cis_shared_data *cis_data)
+{
+ int ret = 0;
+ u32 timeout = 0;
+
+ FIMC_BUG(!cis_data);
+
+#define STREAM_OFF_WAIT_TIME 250
+ while (timeout < STREAM_OFF_WAIT_TIME) {
+ if (cis_data->is_active_area == false &&
+ cis_data->stream_on == false) {
+ pr_debug("actual stream off\n");
+ break;
+ }
+ timeout++;
+ }
+
+ if (timeout == STREAM_OFF_WAIT_TIME) {
+ pr_err("actual stream off wait timeout\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+int sensor_5e9_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read8(client, 0x0002, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_5e9_cis_otp_check_awb_ratio(char *unit, char *golden, char *limit)
+{
+ int ret = 0;
+
+ float r_g_min = (float)(limit[0]) / 1000;
+ float r_g_max = (float)(limit[1]) / 1000;
+ float b_g_min = (float)(limit[2]) / 1000;
+ float b_g_max = (float)(limit[3]) / 1000;
+
+ /* read by little endian */
+ float rg = (float) ((unit[1] << 8) | (unit[0])) / 16384;
+ float bg = (float) ((unit[3] << 8) | (unit[2])) / 16384;
+
+ float golden_rg = (float) ((golden[1] << 8) | (golden[0])) / 16384;
+ float golden_bg = (float) ((golden[3] << 8) | (golden[2])) / 16384;
+
+ if (rg < (golden_rg - r_g_min) || rg > (golden_rg + r_g_max)) {
+ err("%s(): Final RG calibration factors out of range! rg=0x%x golden_rg=0x%x",
+ __func__, (unit[1] << 8 | unit[0]), (golden[1] << 8 | golden[0]));
+ ret = 1;
+ }
+
+ if (bg < (golden_bg - b_g_min) || bg > (golden_bg + b_g_max)) {
+ err("%s(): Final BG calibration factors out of range! bg=0x%x, golden_bg=0x%x",
+ __func__, (unit[3] << 8 | unit[2]), (golden[3] << 8 | golden[2]));
+ ret = 1;
+ }
+
+ return ret;
+}
+
+int sensor_5e9_cis_otp_check_crc(struct v4l2_subdev *subdev,
+ struct fimc_is_device_sensor *device, int grp_offset)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ char *check_buf = (char *)&device->otp_cal_buf[0][0];
+ int group = (grp_offset == 0) ? 1 : 2;
+
+ /* ADDR CRC check */
+ crc_value = ((check_buf[grp_offset + OTP_GRP_ADDR_CHKSUM + 1] << 8)
+ | (check_buf[grp_offset + OTP_GRP_ADDR_CHKSUM]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[grp_offset + OTP_GRP_ADDR_CRC_START],
+ OTP_GRP_ADDR_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR%d: Error to ADDR CRC16 : 0x%x, cal buffer CRC: 0x%x", group, crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR%d: ADDR CRC16 : 0x%x, cal buffer CRC: 0x%x\n", group, crc16, crc_value);
+
+ /* INFO CRC check */
+ crc_value = ((check_buf[grp_offset + OTP_GRP_INFO_CHKSUM + 1] << 8)
+ | (check_buf[grp_offset + OTP_GRP_INFO_CHKSUM]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[grp_offset + OTP_GRP_INFO_CRC_START],
+ OTP_GRP_INFO_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR%d: Error to INFO CRC16 : 0x%x, cal buffer CRC: 0x%x", group, crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR%d: INFO CRC16 : 0x%x, cal buffer CRC: 0x%x\n", group, crc16, crc_value);
+
+ /* AWB CRC check */
+ crc_value = ((check_buf[grp_offset + OTP_GRP_AWB_CHKSUM + 1] << 8)
+ | (check_buf[grp_offset + OTP_GRP_AWB_CHKSUM]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[grp_offset + OTP_GRP_AWB_CRC_START],
+ OTP_GRP_AWB_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR%d: Error to AWB CRC16 : 0x%x, cal buffer CRC: 0x%x", group, crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR%d: AWB CRC16 : 0x%x, cal buffer CRC: 0x%x\n", group, crc16, crc_value);
+
+ /* LSC_XTC CRC check */
+ crc_value = ((check_buf[grp_offset + OTP_GRP_LSC_XTC_CHKSUM + 1] << 8)
+ | (check_buf[grp_offset + OTP_GRP_LSC_XTC_CHKSUM]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[grp_offset + OTP_GRP_LSC_XTC_CRC_START],
+ OTP_GRP_LSC_XTC_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR%d: Error to LSC_XTC CRC16 : 0x%x, cal buffer CRC: 0x%x", group, crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR%d: LSC_XTC CRC16 : 0x%x, cal buffer CRC: 0x%x\n", group, crc16, crc_value);
+
+ /* LSC_XTC CRC check */
+ crc_value = ((check_buf[grp_offset + OTP_GRP_AE_SYNC_CHKSUM + 1] << 8)
+ | (check_buf[grp_offset + OTP_GRP_AE_SYNC_CHKSUM]));
+ crc16 = sensor_cis_otp_get_crc16(&check_buf[grp_offset + OTP_GRP_AE_SYNC_CRC_START],
+ OTP_GRP_AE_SYNC_CRC_SIZE);
+ if (crc_value != crc16) {
+ err("GR%d: Error to AE_SYNC CRC16 : 0x%x, cal buffer CRC: 0x%x", group, crc16, crc_value);
+ ret = -EINVAL;
+ } else
+ info("GR%d: AE_SYNC CRC16 : 0x%x, cal buffer CRC: 0x%x\n", group, crc16, crc_value);
+
+ return ret;
+}
+
+int sensor_5e9_cis_otp_read(struct v4l2_subdev *subdev, struct fimc_is_device_sensor *device)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ u8 val, page;
+ int i;
+ int retry;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ return -EINVAL;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -ENODEV;
+ }
+
+ info("OTP read start\n");
+ dbg_sensor(1, "%s, 1. sensor initial setting", __func__);
+ CALL_CISOPS(cis, cis_set_global_setting, subdev);
+ CALL_CISOPS(cis, cis_mode_change, subdev, 0);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ dbg_sensor(1, "%s, 2. sensor stream on", __func__);
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+
+ /* wait 50ms */
+ msleep(50);
+
+ dbg_sensor(1, "%s, 3. page select & read cal", __func__);
+ for (page = OTP_PAGE_START; page <= OTP_PAGE_END; page++) {
+ /* page select & read start */
+ fimc_is_sensor_write8(client, OTP_PAGE_SELECT, page);
+ fimc_is_sensor_write8(client, OTP_PAGE_CTRL, 0x01);
+ usleep_range(1000, 1001);
+
+ /* wait 0x0A01 == 1 [0]: read completed with no errors */
+ retry = 500;
+ while (retry > 0) {
+ fimc_is_sensor_read8(client, OTP_PAGE_ERRCHK, &val);
+ if (val == 1)
+ break;
+
+ usleep_range(100, 100);
+ retry--;
+ }
+
+ if (!retry)
+ err("%s: OTP page[%d] read fail with err(%d)\n",
+ __func__, page, val);
+
+ for (i = 0; i < OTP_PAGE_SIZE; i++) {
+ fimc_is_sensor_read8(client, OTP_PAGE_BASE + i, &device->otp_cal_buf[page][i]);
+ dbg_sensor(2, "cal: [%d][0x%x]: %x\n", page, OTP_PAGE_BASE + i, device->otp_cal_buf[page][i]);
+ }
+
+ /* make initial state */
+ fimc_is_sensor_write8(client, OTP_PAGE_CTRL, 0x04);
+ fimc_is_sensor_write8(client, OTP_PAGE_CTRL, 0x00);
+ }
+
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+ msleep(20);
+ info("OTP end!!!!!\n");
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_5e9_cis_otp(struct v4l2_subdev *subdev, struct fimc_is_device_sensor *device)
+{
+ int ret = 0;
+ int otp_group = 0x0;
+ int offset = 0;
+ char *otp_buf = (char *)&device->otp_cal_buf[0][0];
+ char file_str[60];
+
+ snprintf(file_str, sizeof(file_str), "%s%s", OTP_DATA_PATH, device->otp_filename);
+ ret = sensor_cis_otp_read_file(file_str, (void *)device->otp_cal_buf, OTP_PAGE_SIZE * 64);
+ if (ret) {
+ /* OTP data read */
+ ret = sensor_5e9_cis_otp_read(subdev, device);
+ if (ret < 0) {
+ err("Don't read to 5E9 OTP data");
+ goto p_err;
+ }
+
+ /* Write to OTP data at file */
+ ret = sensor_cis_otp_write_file(file_str, (void *)device->otp_cal_buf, OTP_PAGE_SIZE * 64);
+ if (ret < 0) {
+ err("5E9 OTP data don't file write");
+ goto p_err;
+ }
+ }
+
+ /* Need to first check GROUP2 */
+ if (otp_buf[OTP_GRP_FLAG + OTP_GRP2_OFFSET * OTP_PAGE_SIZE] == OTP_DATA_VALID) {
+ otp_group = OTP_GROUP_TWO;
+ offset = OTP_GRP2_OFFSET * OTP_PAGE_SIZE;
+ } else if (otp_buf[OTP_GRP_FLAG] == OTP_DATA_VALID) {
+ otp_group = OTP_GROUP_ONE;
+ offset = 0;
+ } else {
+ err("All OTP data are invalid, check module");
+ goto p_err;
+ }
+
+ /* OTP CRC check */
+ ret = sensor_5e9_cis_otp_check_crc(subdev, device, offset);
+ if (ret < 0) {
+ err("All OTP data CRC check fail, check module");
+
+ device->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_ERROR;
+ goto p_err;
+ } else {
+ u8 *awb_base = &otp_buf[offset + OTP_GRP_AWB_CHKSUM];
+
+ device->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_NO_ERROR;
+ ret = sensor_5e9_cis_otp_check_awb_ratio(&awb_base[CURRENT_RG_RATIO_OFFSET],
+ &awb_base[MASTER_RG_RATIO_OFFSET],
+ &awb_base[RG_MIN_LIMIT_OFFSET]);
+ if (ret) {
+ err("%s(): 5E9 OTP AWB Group%d ratio out of limit(%d)", __func__, otp_group, ret);
+ device->cal_status[CAMERA_CRC_INDEX_AWB] = LIMIT_FAILURE;
+ ret = -1;
+ }
+ }
+
+p_err:
+ return ret;
+}
+
+/* CIS OPS */
+int sensor_5e9_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device = NULL;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+#if USE_OTP_AWB_CAL_DATA
+ struct i2c_client *client = NULL;
+ u8 selected_page;
+ u16 data16[4];
+ u8 cal_map_ver[4];
+ bool skip_cal_write = false;
+#endif
+
+ setinfo.param = NULL;
+ setinfo.return_value = 0;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
+
+ device = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(module->subdev);
+ if (!device) {
+ err("device sensor is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+#if USE_OTP_AWB_CAL_DATA
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+#endif
+
+ BUG_ON(!cis->cis_data);
+
+ cis->cis_data->cur_width = SENSOR_5E9_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_5E9_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ sensor_5e9_cis_data_calculation(sensor_5e9_pllinfos[setfile_index], cis->cis_data);
+
+#if USE_OTP_AWB_CAL_DATA
+ /* Read AWB Cal Data from OTPROM */
+ printk(KERN_INFO "%s 5E9 AWB Cal data read!\n", __func__);
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x04);
+ if (unlikely(ret)) {
+ err("failed to fimc_is_i2c_write (%d)\n", ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ ret = fimc_is_sensor_write8(client, 0xA02, 0x02);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x01);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+
+ ret = fimc_is_sensor_read8(client, 0xA12, &selected_page);
+ if (unlikely(ret)) {
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ printk(KERN_INFO "Camera: otp_bank = %d\n", selected_page);
+ if (selected_page == 0x3) {
+ printk(KERN_INFO "Camera: OTP 3 page selected\n");
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x04);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x00);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+
+ usleep_range(1000, 1000);
+
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x04);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_write8(client, 0xA02, 0x03);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x01);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ }
+ ret = fimc_is_sensor_read16(client, 0x0A04, &data16[0]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_read16(client, 0x0A06, &data16[1]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_read16(client, 0x0A08, &data16[2]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_read16(client, 0x0A0A, &data16[3]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+
+ ret = fimc_is_sensor_read8(client, 0xA22, &cal_map_ver[0]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_read8(client, 0xA23, &cal_map_ver[1]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_read8(client, 0xA24, &cal_map_ver[2]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_read8(client, 0xA25, &cal_map_ver[3]);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+
+ printk(KERN_INFO "5e9 cal map version %c %c %c %c\n",
+ cal_map_ver[0], cal_map_ver[1], cal_map_ver[2], cal_map_ver[3]);
+
+ if (cal_map_ver[0] != 0x56 || cal_map_ver[1] != 0x30
+ || cal_map_ver[2] != 0x30 || cal_map_ver[3] < 0x31) {
+ printk(KERN_INFO "5e9 cal map version 0x%x 0x%x 0x%x 0x%x\n",
+ cal_map_ver[0], cal_map_ver[1], cal_map_ver[2], cal_map_ver[3]);
+ skip_cal_write = true;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x04);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+ ret = fimc_is_sensor_write8(client, 0xA00, 0x00);
+ if (unlikely(ret))
+ err("failed to fimc_is_i2c_read (%d)\n", ret);
+
+ printk(KERN_INFO "5e9 awb cal data %x %x %x %x\n",
+ data16[0], data16[1], data16[2], data16[3]);
+
+ /* Write AWB Cal Data to sensor */
+ usleep_range(10000, 10000);
+
+ if (skip_cal_write == false) {
+ ret = fimc_is_sensor_write16_array(client, 0x020E, data16, 4);
+ if (ret < 0) {
+ printk(KERN_INFO "fimc_is_sensor_write16_array fail\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+ }
+
+ cis->use_dgain = false;
+#endif
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ if (device->use_otp_cal) {
+ ret = sensor_5e9_cis_otp(subdev, device);
+ if (ret < 0) {
+ err("5E9 OTP data have problem, check module");
+ ret = 0;
+ }
+ }
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ ret = fimc_is_sensor_read16(client, 0x0000, &data16);
+ if (unlikely(!ret))
+ printk("[SEN:DUMP] model_id(%x)\n", data16);
+
+ ret = fimc_is_sensor_read8(client, 0x0002, &data8);
+ if (unlikely(!ret))
+ printk("[SEN:DUMP] revision_number(%x)\n", data8);
+
+ ret = fimc_is_sensor_read8(client, 0x0005, &data8);
+ if (unlikely(!ret))
+ printk("[SEN:DUMP] frame_count(%x)\n", data8);
+
+ ret = fimc_is_sensor_read8(client, 0x0100, &data8);
+ if (unlikely(!ret))
+ pr_err("[SEN:DUMP] mode_select(%x)\n", data8);
+
+ sensor_cis_dump_registers(subdev, sensor_5e9_setfiles[0], sensor_5e9_setfile_sizes[0]);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+p_err:
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_5e9_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_5e9_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ return 0;
+}
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_5e9_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ ret = sensor_5e9_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ /* setfile global setting is at camera entrance */
+ ret = sensor_cis_set_registers(subdev, sensor_5e9_global, sensor_5e9_global_size);
+ if (ret < 0) {
+ err("sensor_5e9_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_5e9_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ sensor_5e9_cis_data_calculation(sensor_5e9_pllinfos[mode], cis->cis_data);
+
+ ret = sensor_cis_set_registers(subdev, sensor_5e9_setfiles[mode], sensor_5e9_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_5e9_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ return ret;
+}
+
+
+int sensor_5e9_cis_mode_change_throttling(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ sensor_5e9_cis_data_calculation(sensor_5e9_pllinfo_throttling, cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_5e9_setfile_throttling,
+ sizeof(sensor_5e9_setfile_throttling) / sizeof(sensor_5e9_setfile_throttling[0]));
+ if (ret < 0) {
+ err("sensor_gm1sp_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] throttling mode changed\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+/* TODO: Sensor set size sequence(sensor done, sensor stop, 3AA done in FW case */
+int sensor_5e9_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ int ret = 0;
+ bool binning = false;
+ u32 ratio_w = 0, ratio_h = 0, start_x = 0, start_y = 0, end_x = 0, end_y = 0;
+ u32 even_x = 0, odd_x = 0, even_y = 0, odd_y = 0;
+ struct i2c_client *client = NULL;
+ struct fimc_is_cis *cis = NULL;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ if (unlikely(!cis_data)) {
+ err("cis data is NULL");
+ if (unlikely(!cis->cis_data)) {
+ ret = -EINVAL;
+ goto p_err;
+ } else {
+ cis_data = cis->cis_data;
+ }
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* Wait actual stream off */
+ ret = sensor_5e9_wait_stream_off_status(cis_data);
+ if (ret) {
+ err("Must stream off\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ binning = cis_data->binning;
+ if (binning) {
+ ratio_w = (SENSOR_5E9_MAX_WIDTH / cis_data->cur_width);
+ ratio_h = (SENSOR_5E9_MAX_HEIGHT / cis_data->cur_height);
+ } else {
+ ratio_w = 1;
+ ratio_h = 1;
+ }
+
+ if (((cis_data->cur_width * ratio_w) > SENSOR_5E9_MAX_WIDTH) ||
+ ((cis_data->cur_height * ratio_h) > SENSOR_5E9_MAX_HEIGHT)) {
+ err("Config max sensor size over~!!\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* 1. page_select */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* 2. pixel address region setting */
+ start_x = ((SENSOR_5E9_MAX_WIDTH - cis_data->cur_width * ratio_w) / 2) & (~0x1);
+ start_y = ((SENSOR_5E9_MAX_HEIGHT - cis_data->cur_height * ratio_h) / 2) & (~0x1);
+ end_x = start_x + (cis_data->cur_width * ratio_w - 1);
+ end_y = start_y + (cis_data->cur_height * ratio_h - 1);
+
+ if (!(end_x & (0x1)) || !(end_y & (0x1))) {
+ err("Sensor pixel end address must odd\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0344, start_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0346, start_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0348, end_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034A, end_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 3. output address setting */
+ ret = fimc_is_sensor_write16(client, 0x034C, cis_data->cur_width);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034E, cis_data->cur_height);
+ if (ret < 0)
+ goto p_err;
+
+ /* If not use to binning, sensor image should set only crop */
+ if (!binning) {
+ dbg_sensor(1, "Sensor size set is not binning\n");
+ goto p_err;
+ }
+
+ /* 4. sub sampling setting */
+ even_x = 1; /* 1: not use to even sampling */
+ even_y = 1;
+ odd_x = (ratio_w * 2) - even_x;
+ odd_y = (ratio_h * 2) - even_y;
+
+ ret = fimc_is_sensor_write16(client, 0x0380, even_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0382, odd_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0384, even_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0386, odd_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 5. binnig setting */
+ ret = fimc_is_sensor_write8(client, 0x0900, binning); /* 1: binning enable, 0: disable */
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write8(client, 0x0901, (ratio_w << 4) | ratio_h);
+ if (ret < 0)
+ goto p_err;
+
+ /* 6. scaling setting: but not use */
+ /* scaling_mode (0: No scaling, 1: Horizontal, 2: Full) */
+ ret = fimc_is_sensor_write16(client, 0x0400, 0x0000);
+ if (ret < 0)
+ goto p_err;
+ /* down_scale_m: 1 to 16 upwards (scale_n: 16(fixed)) */
+ /* down scale factor = down_scale_m / down_scale_n */
+ ret = fimc_is_sensor_write16(client, 0x0404, 0x0010);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ ret = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("[%s] sensor_5e9_cis_group_param_hold_func fail\n", __func__);
+
+ /* Sensor stream on */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x6028, 0x4000, ret);
+ ret = fimc_is_sensor_write8(client, 0x0100, 0x01);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x0100, 0x01, ret);
+
+ /* WDR */
+ if (fimc_is_vender_wdr_mode_on(cis_data))
+ ret = fimc_is_sensor_write8(client, 0x0216, 0x01);
+ else
+ ret = fimc_is_sensor_write8(client, 0x0216, 0x00);
+
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), ret(%d)\n", 0x216, ret);
+
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ ret = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("[%s] sensor_5e9_cis_group_param_hold_func fail\n", __func__);
+
+ /* Sensor stream off */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x6028, 0x4000, ret);
+ ret = fimc_is_sensor_write8(client, 0x0100, 0x00);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x0100, 0x00, ret);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk_freq_mhz (%d), line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int);
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int);
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int);
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int);
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, frame_length_lines(%#x), long_coarse_int %#x, short_coarse_int %#x\n",
+ cis->id, __func__, cis_data->frame_length_lines, long_coarse_int, short_coarse_int);
+
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short exposure */
+ ret = fimc_is_sensor_write16(client, 0x0202, short_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long exposure */
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x021E, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_5e9_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update hear? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s] input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, input_exposure_time, frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s] adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_5e9_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+ u64 numerator;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * frame_duration;
+ frame_length_lines = (u16)((numerator / line_length_pck) / (1000 * 1000));
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, cis_data->pclk, frame_duration, line_length_pck, frame_length_lines);
+
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+ cis_data->max_coarse_integration_time = cis_data->frame_length_lines
+ - cis_data->max_margin_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_5e9_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_5e9_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+int sensor_5e9_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_5e9_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ analog_gain = (u16)sensor_cis_calc_again_code(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s, input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, again->val, analog_gain);
+
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0204, analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_5e9_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_5e9_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x0084, &read_value);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x0084, read_value, ret);
+
+ cis_data->min_analog_gain[0] = read_value;
+
+ cis_data->min_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x0086, &read_value);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x0086, read_value, ret);
+
+ cis_data->max_analog_gain[0] = read_value;
+
+ cis_data->max_analog_gain[1] = sensor_cis_calc_again_permile(read_value);
+
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+#if USE_OTP_AWB_CAL_DATA
+// Do nothing ! Digital gains are used to compensate for the AWB M2M (module to mudule) variation
+int sensor_5e9_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ return 0;
+}
+#else
+int sensor_5e9_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u16 dgains[4] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s, input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, dgain->long_val, dgain->short_val, long_gain, short_gain);
+
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = short_gain;
+ /* Short digital gain */
+ ret = fimc_is_sensor_write16_array(client, 0x020E, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long digital gain */
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x305C, long_gain);
+ if (ret < 0)
+ goto p_err;
+ }
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+#endif
+
+int sensor_5e9_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_5e9_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ return ret;
+}
+
+int sensor_5e9_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x1084, &read_value);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x1084, read_value, ret);
+
+ cis_data->min_digital_gain[0] = read_value;
+
+ cis_data->min_digital_gain[1] = sensor_cis_calc_dgain_permile(read_value);
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ ret = fimc_is_sensor_read16(client, 0x1086, &read_value);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x1086, read_value, ret);
+
+ cis_data->max_digital_gain[0] = read_value;
+
+ cis_data->max_digital_gain[1] = sensor_cis_calc_dgain_permile(read_value);
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+static int sensor_5e9_cis_set_dual_master_setting(struct fimc_is_cis *cis)
+{
+ int ret = 0;
+ struct i2c_client *client;
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ /* Vsync out */
+ ret = fimc_is_sensor_write8(client, 0x3C03, 0x0F);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x3C03, 0x0F, ret);
+
+p_err:
+ return ret;
+}
+
+static int sensor_5e9_cis_set_dual_slave_setting(struct fimc_is_cis *cis)
+{
+ int ret = 0;
+ struct i2c_client *client;
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ /* Vsync Input Source Select */
+ ret = fimc_is_sensor_write8(client, 0x3C02, 0x01);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x3C02, 0x01, ret);
+ /* gpio1 Input Option */
+ ret = fimc_is_sensor_write8(client, 0x3C05, 0x1D);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x3C02, 0x1D, ret);
+ /* Dual Sync Slave enable */
+ ret = fimc_is_sensor_write8(client, 0x3500, 0x03);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x3500, 0x03, ret);
+
+p_err:
+ return ret;
+}
+
+int sensor_5e9_cis_set_dual_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ switch (cis->dual_sync_mode) {
+ case DUAL_SYNC_MASTER:
+ ret = sensor_5e9_cis_set_dual_master_setting(cis);
+ if (ret)
+ err("5e9 dual master setting fail");
+ break;
+ case DUAL_SYNC_SLAVE:
+ ret = sensor_5e9_cis_set_dual_slave_setting(cis);
+ if (ret)
+ err("5e9 dual slave setting fail");
+ break;
+ default:
+ err("invalid cis->dual_sync_mode(%d)\n", cis->dual_sync_mode);
+ ret = -EINVAL;
+ }
+
+p_err:
+ return ret;
+}
+
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_5e9_cis_init,
+ .cis_log_status = sensor_5e9_cis_log_status,
+ .cis_group_param_hold = sensor_5e9_cis_group_param_hold,
+ .cis_set_global_setting = sensor_5e9_cis_set_global_setting,
+ .cis_mode_change = sensor_5e9_cis_mode_change,
+ .cis_set_size = sensor_5e9_cis_set_size,
+ .cis_stream_on = sensor_5e9_cis_stream_on,
+ .cis_stream_off = sensor_5e9_cis_stream_off,
+ .cis_set_exposure_time = sensor_5e9_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_5e9_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_5e9_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_5e9_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_5e9_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_5e9_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_5e9_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_5e9_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_5e9_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_5e9_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_5e9_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_5e9_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_5e9_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_5e9_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_5e9_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_5e9_cis_check_rev,
+ .cis_factory_test = sensor_cis_factory_test,
+ .cis_set_dual_setting = sensor_5e9_cis_set_dual_setting,
+ .cis_mode_change_throttling = sensor_5e9_cis_mode_change_throttling,
+};
+
+static int cis_5e9_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ int i;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+#if defined(CONFIG_USE_DIRECT_IS_CONTROL) && defined(CONFIG_CAMERA_OTPROM_SUPPORT_FRONT)
+ struct fimc_is_vender_specific *specific = NULL;
+#endif
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor_id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor_id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_S5K5E9);
+ if (!sensor_peri) {
+ probe_info("sensor peri is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_S5K5E9;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_ONE_FRAME;
+#if defined(CONFIG_USE_DIRECT_IS_CONTROL) && defined(CONFIG_CAMERA_OTPROM_SUPPORT_FRONT)
+ specific = core->vender.private_data;
+ specific->front_cis_client = client;
+#endif
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_GR_BG;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ if (of_property_read_bool(dnode, "dual_sync_mode")) {
+ ret = of_property_read_u32(dnode, "dual_sync_mode", &cis->dual_sync_mode);
+ if (ret)
+ warn("dual_sync_mode read is fail(%d)", ret);
+ } else {
+ cis->dual_sync_mode = DUAL_SYNC_NONE;
+ }
+
+ probe_info("%s dual_sync_mode %d\n", __func__, cis->dual_sync_mode);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_5e9_global = sensor_5e9_setfile_A_Global;
+ sensor_5e9_global_size = ARRAY_SIZE(sensor_5e9_setfile_A_Global);
+ sensor_5e9_setfiles = sensor_5e9_setfiles_A;
+ sensor_5e9_setfile_sizes = sensor_5e9_setfile_A_sizes;
+ sensor_5e9_pllinfos = sensor_5e9_pllinfos_A;
+ sensor_5e9_max_setfile_num = ARRAY_SIZE(sensor_5e9_setfiles_A);
+ } else if (strcmp(setfile, "setB") == 0) {
+ probe_info("%s setfile_B\n", __func__);
+ sensor_5e9_global = sensor_5e9_setfile_B_Global;
+ sensor_5e9_global_size = ARRAY_SIZE(sensor_5e9_setfile_B_Global);
+ sensor_5e9_setfiles = sensor_5e9_setfiles_B;
+ sensor_5e9_setfile_sizes = sensor_5e9_setfile_B_sizes;
+ sensor_5e9_pllinfos = sensor_5e9_pllinfos_B;
+ sensor_5e9_max_setfile_num = ARRAY_SIZE(sensor_5e9_setfiles_B);
+ } else if (strcmp(setfile, "setC") == 0) {
+ probe_info("%s setfile_C\n", __func__);
+ sensor_5e9_global = sensor_5e9_setfile_C_Global;
+ sensor_5e9_global_size = ARRAY_SIZE(sensor_5e9_setfile_C_Global);
+ sensor_5e9_setfiles = sensor_5e9_setfiles_C;
+ sensor_5e9_setfile_sizes = sensor_5e9_setfile_C_sizes;
+ sensor_5e9_pllinfos = sensor_5e9_pllinfos_C;
+ sensor_5e9_max_setfile_num = ARRAY_SIZE(sensor_5e9_setfiles_C);
+
+ /* throttling setting */
+ sensor_5e9_setfile_throttling = sensor_5e9_setfile_C_2592x1944_15fps;
+ sensor_5e9_pllinfo_throttling = &sensor_5e9_pllinfo_C_2592x1944_15fps;
+ } else {
+ err("%s setfile index out of bound, take default (setfile_A)", __func__);
+ sensor_5e9_global = sensor_5e9_setfile_A_Global;
+ sensor_5e9_global_size = ARRAY_SIZE(sensor_5e9_setfile_A_Global);
+ sensor_5e9_setfiles = sensor_5e9_setfiles_A;
+ sensor_5e9_setfile_sizes = sensor_5e9_setfile_A_sizes;
+ sensor_5e9_pllinfos = sensor_5e9_pllinfos_A;
+ sensor_5e9_max_setfile_num = ARRAY_SIZE(sensor_5e9_setfiles_A);
+ }
+
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
+ device->use_otp_cal = of_property_read_bool(dnode, "use_otp_cal");
+ probe_info("%s use otp_cal(%d)\n", __func__, device->use_otp_cal);
+ if (device->use_otp_cal) {
+ ret = of_property_read_string(dnode, "otp_filename", &device->otp_filename);
+ if (ret) {
+ err("OTP filename read fail(%d), take default name", ret);
+ device->otp_filename = "5e9_otp_cal_data.bin";
+ }
+ probe_info("%s otp_filename(%s)\n", __func__, device->otp_filename);
+ }
+
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ device->cal_status[i] = CRC_NO_ERROR;
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_5e9_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-5e9",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_5e9_match);
+
+static const struct i2c_device_id sensor_cis_5e9_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_5e9_driver = {
+ .probe = cis_5e9_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_5e9_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_5e9_idt
+};
+
+static int __init sensor_cis_5e9_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_5e9_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_5e9_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_5e9_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_5E9_H
+#define FIMC_IS_CIS_5E9_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_5E9_MAX_WIDTH (2592 + 0)
+#define SENSOR_5E9_MAX_HEIGHT (1944 + 0)
+
+/* TODO: Check below values are valid */
+#define SENSOR_5E9_FINE_INTEGRATION_TIME_MIN 0x64
+#define SENSOR_5E9_FINE_INTEGRATION_TIME_MAX 0x64
+#define SENSOR_5E9_COARSE_INTEGRATION_TIME_MIN 0x2
+#define SENSOR_5E9_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x5
+
+#define USE_GROUP_PARAM_HOLD (1)
+#if defined(CONFIG_CAMERA_OTPROM_SUPPORT_REAR)
+#define USE_OTP_AWB_CAL_DATA (1)
+#else
+#define USE_OTP_AWB_CAL_DATA (0)
+#endif
+
+/* OTP valies */
+#define OTP_DATA_PATH "/data/vendor/camera/"
+#define OTP_PAGE_CTRL 0x0A00
+#define OTP_PAGE_ERRCHK 0x0A01
+#define OTP_PAGE_SELECT 0x0A02
+#define OTP_PAGE_BASE 0x0A04
+#define OTP_PAGE_START 0
+#define OTP_PAGE_END 63
+#define OTP_PAGE_SIZE 64
+
+#define OTP_GRP_FLAG (17 * OTP_PAGE_SIZE)
+
+#define OTP_GRP_ADDR_CHKSUM (17 * OTP_PAGE_SIZE + 0x4)
+#define OTP_GRP_ADDR_CRC_START (17 * OTP_PAGE_SIZE + 0x8)
+#define OTP_GRP_ADDR_CRC_SIZE (72)
+#define OTP_GRP_INFO_CHKSUM (18 * OTP_PAGE_SIZE + 0x20)
+#define OTP_GRP_INFO_CRC_START (18 * OTP_PAGE_SIZE + 0x24)
+#define OTP_GRP_INFO_CRC_SIZE (54)
+#define OTP_GRP_AWB_CHKSUM (19 * OTP_PAGE_SIZE + 0x30)
+#define OTP_GRP_AWB_CRC_START (19 * OTP_PAGE_SIZE + 0x34)
+#define OTP_GRP_AWB_CRC_SIZE (80)
+#define OTP_GRP_LSC_XTC_CHKSUM (21 * OTP_PAGE_SIZE + 0x20)
+#define OTP_GRP_LSC_XTC_CRC_START (21 * OTP_PAGE_SIZE + 0x24)
+#define OTP_GRP_LSC_XTC_CRC_SIZE (888)
+#define OTP_GRP_AE_SYNC_CHKSUM (35 * OTP_PAGE_SIZE + 0x30)
+#define OTP_GRP_AE_SYNC_CRC_START (35 * OTP_PAGE_SIZE + 0x34)
+#define OTP_GRP_AE_SYNC_CRC_SIZE (4)
+
+#define OTP_GRP2_OFFSET (20)
+
+/* AWB ratio check */
+#define RG_MIN_LIMIT_OFFSET 0x28
+#define RG_MAX_LIMIT_OFFSET 0x29
+#define BG_MIN_LIMIT_OFFSET 0x2A
+#define BG_MAX_LIMIT_OFFSET 0x2B
+
+#define MASTER_RG_RATIO_OFFSET 0x2C
+#define MASTER_BG_RATIO_OFFSET 0x2E
+#define MASTER_GR_GB_RATIO_OFFSET 0x30
+#define CURRENT_RG_RATIO_OFFSET 0x32
+#define CURRENT_BG_RATIO_OFFSET 0x34
+#define CURRENT_GR_GB_RATIO_OFFSET 0x36
+
+enum otp_group {
+ OTP_GROUP_ONE = 0x1,
+ OTP_GROUP_TWO = 0x2,
+ OTP_GROUP_MAX,
+};
+
+enum valid_check {
+ OTP_DATA_EMPTY = 0x0,
+ OTP_DATA_VALID = 0x40,
+ OTP_DATA_INVALID = 0xC0,
+};
+
+#endif
+
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
.cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_factory_test = sensor_cis_factory_test,
};
static int cis_6b2_probe(struct i2c_client *client,
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_GM1SP_SET_A_H
+#define FIMC_IS_CIS_GM1SP_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-gm1sp.h"
+
+const u32 sensor_gm1sp_setfile_A_Global[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x0000, 0x0004, 0x2,
+ 0x0000, 0x08D1, 0x2,
+ 0x6010, 0x0001, 0x2,
+ I2C_MODE_DELAY, 3000, 0x00,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0A02, 0x0074, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x3F5C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0549, 0x2,
+ 0x6F12, 0x0448, 0x2,
+ 0x6F12, 0x054A, 0x2,
+ 0x6F12, 0xC1F8, 0x2,
+ 0x6F12, 0x5005, 0x2,
+ 0x6F12, 0x101A, 0x2,
+ 0x6F12, 0xA1F8, 0x2,
+ 0x6F12, 0x5405, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xD9B8, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x41DC, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x2E30, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6E00, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xFF5F, 0x2,
+ 0x6F12, 0x7448, 0x2,
+ 0x6F12, 0x8B46, 0x2,
+ 0x6F12, 0x1746, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x6F12, 0x9A46, 0x2,
+ 0x6F12, 0x4FEA, 0x2,
+ 0x6F12, 0x1049, 0x2,
+ 0x6F12, 0x80B2, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x0146, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x4846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xECF8, 0x2,
+ 0x6F12, 0x6E4D, 0x2,
+ 0x6F12, 0x95F8, 0x2,
+ 0x6F12, 0x6D00, 0x2,
+ 0x6F12, 0x0228, 0x2,
+ 0x6F12, 0x35D0, 0x2,
+ 0x6F12, 0x0224, 0x2,
+ 0x6F12, 0x6C4E, 0x2,
+ 0x6F12, 0x5346, 0x2,
+ 0x6F12, 0xB6F8, 0x2,
+ 0x6F12, 0xB802, 0x2,
+ 0x6F12, 0xB0FB, 0x2,
+ 0x6F12, 0xF4F0, 0x2,
+ 0x6F12, 0xA6F8, 0x2,
+ 0x6F12, 0xB802, 0x2,
+ 0x6F12, 0xD5F8, 0x2,
+ 0x6F12, 0x1411, 0x2,
+ 0x6F12, 0x06F5, 0x2,
+ 0x6F12, 0x2E76, 0x2,
+ 0x6F12, 0x6143, 0x2,
+ 0x6F12, 0xC5F8, 0x2,
+ 0x6F12, 0x1411, 0x2,
+ 0x6F12, 0xB5F8, 0x2,
+ 0x6F12, 0x8C11, 0x2,
+ 0x6F12, 0x411A, 0x2,
+ 0x6F12, 0x89B2, 0x2,
+ 0x6F12, 0x25F8, 0x2,
+ 0x6F12, 0x981B, 0x2,
+ 0x6F12, 0x35F8, 0x2,
+ 0x6F12, 0x142C, 0x2,
+ 0x6F12, 0x6243, 0x2,
+ 0x6F12, 0x521E, 0x2,
+ 0x6F12, 0x00FB, 0x2,
+ 0x6F12, 0x0210, 0x2,
+ 0x6F12, 0xB5F8, 0x2,
+ 0x6F12, 0xF210, 0x2,
+ 0x6F12, 0x07FB, 0x2,
+ 0x6F12, 0x04F2, 0x2,
+ 0x6F12, 0x0844, 0x2,
+ 0x6F12, 0xC5F8, 0x2,
+ 0x6F12, 0xF800, 0x2,
+ 0x6F12, 0x5946, 0x2,
+ 0x6F12, 0x0098, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xC5F8, 0x2,
+ 0x6F12, 0x3088, 0x2,
+ 0x6F12, 0x4146, 0x2,
+ 0x6F12, 0x6043, 0x2,
+ 0x6F12, 0x3080, 0x2,
+ 0x6F12, 0xE86F, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xB0FB, 0x2,
+ 0x6F12, 0xF4F0, 0x2,
+ 0x6F12, 0xE867, 0x2,
+ 0x6F12, 0x04B0, 0x2,
+ 0x6F12, 0x4846, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF05F, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xB1B8, 0x2,
+ 0x6F12, 0x0124, 0x2,
+ 0x6F12, 0xC8E7, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x8046, 0x2,
+ 0x6F12, 0x4D48, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x4168, 0x2,
+ 0x6F12, 0x0D0C, 0x2,
+ 0x6F12, 0x8EB2, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xA3F8, 0x2,
+ 0x6F12, 0x4C4C, 0x2,
+ 0x6F12, 0x4A4F, 0x2,
+ 0x6F12, 0x2078, 0x2,
+ 0x6F12, 0x97F8, 0x2,
+ 0x6F12, 0x8B12, 0x2,
+ 0x6F12, 0x10FB, 0x2,
+ 0x6F12, 0x01F0, 0x2,
+ 0x6F12, 0x2070, 0x2,
+ 0x6F12, 0x4046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0xA2F8, 0x2,
+ 0x6F12, 0x2078, 0x2,
+ 0x6F12, 0x97F8, 0x2,
+ 0x6F12, 0x8B12, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xB0FB, 0x2,
+ 0x6F12, 0xF1F0, 0x2,
+ 0x6F12, 0x2070, 0x2,
+ 0x6F12, 0x3146, 0x2,
+ 0x6F12, 0x2846, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF041, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x8BB8, 0x2,
+ 0x6F12, 0x2DE9, 0x2,
+ 0x6F12, 0xFF47, 0x2,
+ 0x6F12, 0x8146, 0x2,
+ 0x6F12, 0x3B48, 0x2,
+ 0x6F12, 0x1746, 0x2,
+ 0x6F12, 0x8846, 0x2,
+ 0x6F12, 0x8068, 0x2,
+ 0x6F12, 0x1C46, 0x2,
+ 0x6F12, 0x85B2, 0x2,
+ 0x6F12, 0x060C, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x7CF8, 0x2,
+ 0x6F12, 0x2346, 0x2,
+ 0x6F12, 0x3A46, 0x2,
+ 0x6F12, 0x4146, 0x2,
+ 0x6F12, 0x4846, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x85F8, 0x2,
+ 0x6F12, 0x364A, 0x2,
+ 0x6F12, 0x9088, 0x2,
+ 0x6F12, 0xF0B3, 0x2,
+ 0x6F12, 0x3348, 0x2,
+ 0x6F12, 0x90F8, 0x2,
+ 0x6F12, 0xBA10, 0x2,
+ 0x6F12, 0xD1B3, 0x2,
+ 0x6F12, 0xD0F8, 0x2,
+ 0x6F12, 0x2801, 0x2,
+ 0x6F12, 0x1168, 0x2,
+ 0x6F12, 0x8842, 0x2,
+ 0x6F12, 0x00D3, 0x2,
+ 0x6F12, 0x0846, 0x2,
+ 0x6F12, 0x010A, 0x2,
+ 0x6F12, 0xB1FA, 0x2,
+ 0x6F12, 0x81F0, 0x2,
+ 0x6F12, 0xC0F1, 0x2,
+ 0x6F12, 0x1700, 0x2,
+ 0x6F12, 0xC140, 0x2,
+ 0x6F12, 0x02EB, 0x2,
+ 0x6F12, 0x4000, 0x2,
+ 0x6F12, 0xC9B2, 0x2,
+ 0x6F12, 0x0389, 0x2,
+ 0x6F12, 0xC288, 0x2,
+ 0x6F12, 0x9B1A, 0x2,
+ 0x6F12, 0x4B43, 0x2,
+ 0x6F12, 0x8033, 0x2,
+ 0x6F12, 0x02EB, 0x2,
+ 0x6F12, 0x2322, 0x2,
+ 0x6F12, 0x0092, 0x2,
+ 0x6F12, 0x438A, 0x2,
+ 0x6F12, 0x028A, 0x2,
+ 0x6F12, 0x9B1A, 0x2,
+ 0x6F12, 0x4B43, 0x2,
+ 0x6F12, 0x8033, 0x2,
+ 0x6F12, 0x02EB, 0x2,
+ 0x6F12, 0x2322, 0x2,
+ 0x6F12, 0x0192, 0x2,
+ 0x6F12, 0x838B, 0x2,
+ 0x6F12, 0x428B, 0x2,
+ 0x6F12, 0x9B1A, 0x2,
+ 0x6F12, 0x4B43, 0x2,
+ 0x6F12, 0x8033, 0x2,
+ 0x6F12, 0x02EB, 0x2,
+ 0x6F12, 0x2322, 0x2,
+ 0x6F12, 0x0292, 0x2,
+ 0x6F12, 0xC28C, 0x2,
+ 0x6F12, 0x808C, 0x2,
+ 0x6F12, 0x121A, 0x2,
+ 0x6F12, 0x4A43, 0x2,
+ 0x6F12, 0x8032, 0x2,
+ 0x6F12, 0x00EB, 0x2,
+ 0x6F12, 0x2220, 0x2,
+ 0x6F12, 0x0390, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0x6846, 0x2,
+ 0x6F12, 0x54F8, 0x2,
+ 0x6F12, 0x2210, 0x2,
+ 0x6F12, 0x50F8, 0x2,
+ 0x6F12, 0x2230, 0x2,
+ 0x6F12, 0x5943, 0x2,
+ 0x6F12, 0x090B, 0x2,
+ 0x6F12, 0x44F8, 0x2,
+ 0x6F12, 0x2210, 0x2,
+ 0x6F12, 0x521C, 0x2,
+ 0x6F12, 0x00E0, 0x2,
+ 0x6F12, 0x01E0, 0x2,
+ 0x6F12, 0x042A, 0x2,
+ 0x6F12, 0xF2D3, 0x2,
+ 0x6F12, 0x04B0, 0x2,
+ 0x6F12, 0x2946, 0x2,
+ 0x6F12, 0x3046, 0x2,
+ 0x6F12, 0xBDE8, 0x2,
+ 0x6F12, 0xF047, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x29B8, 0x2,
+ 0x6F12, 0x10B5, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0xAB11, 0x2,
+ 0x6F12, 0x0F48, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x36F8, 0x2,
+ 0x6F12, 0x084C, 0x2,
+ 0x6F12, 0x0122, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0x2111, 0x2,
+ 0x6F12, 0x2060, 0x2,
+ 0x6F12, 0x0C48, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x2EF8, 0x2,
+ 0x6F12, 0x0022, 0x2,
+ 0x6F12, 0xAFF2, 0x2,
+ 0x6F12, 0xE501, 0x2,
+ 0x6F12, 0x6060, 0x2,
+ 0x6F12, 0x0948, 0x2,
+ 0x6F12, 0x00F0, 0x2,
+ 0x6F12, 0x27F8, 0x2,
+ 0x6F12, 0xA060, 0x2,
+ 0x6F12, 0x10BD, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x41D0, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x2C30, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x2E30, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x2580, 0x2,
+ 0x6F12, 0x2000, 0x2,
+ 0x6F12, 0x6000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x24A7, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x1AF3, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x6F12, 0x09BD, 0x2,
+ 0x6F12, 0x4AF6, 0x2,
+ 0x6F12, 0x293C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x42F2, 0x2,
+ 0x6F12, 0xA74C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x41F6, 0x2,
+ 0x6F12, 0xF32C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x40F6, 0x2,
+ 0x6F12, 0xBD1C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x010C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x4BF2, 0x2,
+ 0x6F12, 0xAB4C, 0x2,
+ 0x6F12, 0xC0F2, 0x2,
+ 0x6F12, 0x000C, 0x2,
+ 0x6F12, 0x6047, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x08D1, 0x2,
+ 0x6F12, 0x0068, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x6F12, 0x0007, 0x2,
+};
+
+/*
+ * [Mode Information]
+ * 0: [MCLK:26,Width:4000,Height:3000,Format:MIPI_RAW10,mipi_lane:4,mipi_datarate:1152,pvi_pclk_inverse:0]
+ */
+const u32 sensor_gm1sp_setfile_A_4000x3000_30fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x0FA7, 0x2,
+ 0x034A, 0x0BBF, 0x2,
+ 0x034C, 0x0FA0, 0x2,
+ 0x034E, 0x0BB8, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0C86, 0x2,
+ 0x0342, 0x13A0, 0x2,
+ 0x0900, 0x0111, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0001, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0085, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0004, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0802, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x0804, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x5500, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x0601, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x0605, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0101, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0F07, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x170B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x000C, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x68C0, 0x2,
+ 0xF470, 0x7809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x6028, 0x4000, 0x2,
+};
+
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_A_4000x3000_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1152670000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0C86, /* frame_length_lines (0x0340) */
+ 0x13A0, /* line_length_pck (0x0342) */
+};
+
+static const u32 *sensor_gm1sp_setfiles_A[] = {
+ sensor_gm1sp_setfile_A_4000x3000_30fps,
+};
+
+static const u32 sensor_gm1sp_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_gm1sp_setfile_A_4000x3000_30fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_gm1sp_pllinfos_A[] = {
+ &sensor_gm1sp_pllinfo_A_4000x3000_30fps,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_GM1SP_SET_B_H
+#define FIMC_IS_CIS_GM1SP_SET_B_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-gm1sp.h"
+
+/* S5KGM1SP_ReferenceSetfile_v0.9g_20190219_For SOC.xlsx */
+const u32 sensor_gm1sp_setfile_B_Global[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x0000, 0x0009, 0x2,
+ 0x0000, 0x08D1, 0x2,
+ 0x6010, 0x0001, 0x2,
+ I2C_MODE_DELAY, 3000, 0x00,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0A02, 0x0074, 0x2,
+
+ 0x6004, 0x0001, 0x2, /* burst mode indirect */
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x3F5C, 0x2,
+ I2C_MODE_BURST_ADDR, 0x6F12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0549, 0x2,
+ I2C_MODE_BURST_DATA, 0x0448, 0x2,
+ I2C_MODE_BURST_DATA, 0x054A, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5005, 0x2,
+ I2C_MODE_BURST_DATA, 0x101A, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5405, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x46D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E30, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6E00, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF5F, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF48, 0x2,
+ I2C_MODE_BURST_DATA, 0x8B46, 0x2,
+ I2C_MODE_BURST_DATA, 0x1746, 0x2,
+ I2C_MODE_BURST_DATA, 0x0068, 0x2,
+ I2C_MODE_BURST_DATA, 0x9A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x1049, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x8046, 0x2,
+ I2C_MODE_BURST_DATA, 0x0146, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x4846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x02FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF94D, 0x2,
+ I2C_MODE_BURST_DATA, 0x95F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D00, 0x2,
+ I2C_MODE_BURST_DATA, 0x0228, 0x2,
+ I2C_MODE_BURST_DATA, 0x35D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0224, 0x2,
+ I2C_MODE_BURST_DATA, 0xF74E, 0x2,
+ I2C_MODE_BURST_DATA, 0x5346, 0x2,
+ I2C_MODE_BURST_DATA, 0xB6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB802, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF4F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB802, 0x2,
+ I2C_MODE_BURST_DATA, 0xD5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1411, 0x2,
+ I2C_MODE_BURST_DATA, 0x06F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E76, 0x2,
+ I2C_MODE_BURST_DATA, 0x6143, 0x2,
+ I2C_MODE_BURST_DATA, 0xC5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x1411, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8C11, 0x2,
+ I2C_MODE_BURST_DATA, 0x411A, 0x2,
+ I2C_MODE_BURST_DATA, 0x89B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x25F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x981B, 0x2,
+ I2C_MODE_BURST_DATA, 0x35F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x142C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6243, 0x2,
+ I2C_MODE_BURST_DATA, 0x521E, 0x2,
+ I2C_MODE_BURST_DATA, 0x00FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x0210, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF210, 0x2,
+ I2C_MODE_BURST_DATA, 0x07FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x04F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0844, 0x2,
+ I2C_MODE_BURST_DATA, 0xC5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF800, 0x2,
+ I2C_MODE_BURST_DATA, 0x5946, 0x2,
+ I2C_MODE_BURST_DATA, 0x0098, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xDBFA, 0x2,
+ I2C_MODE_BURST_DATA, 0x3088, 0x2,
+ I2C_MODE_BURST_DATA, 0x4146, 0x2,
+ I2C_MODE_BURST_DATA, 0x6043, 0x2,
+ I2C_MODE_BURST_DATA, 0x3080, 0x2,
+ I2C_MODE_BURST_DATA, 0xE86F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF4F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xE867, 0x2,
+ I2C_MODE_BURST_DATA, 0x04B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF05F, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC7BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x0124, 0x2,
+ I2C_MODE_BURST_DATA, 0xC8E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x8046, 0x2,
+ I2C_MODE_BURST_DATA, 0xD848, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x4168, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D0C, 0x2,
+ I2C_MODE_BURST_DATA, 0x8EB2, 0x2,
+ I2C_MODE_BURST_DATA, 0x3146, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB9FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xD74C, 0x2,
+ I2C_MODE_BURST_DATA, 0xD54F, 0x2,
+ I2C_MODE_BURST_DATA, 0x2078, 0x2,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8B12, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2070, 0x2,
+ I2C_MODE_BURST_DATA, 0x4046, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2078, 0x2,
+ I2C_MODE_BURST_DATA, 0x97F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8B12, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2070, 0x2,
+ I2C_MODE_BURST_DATA, 0x3146, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF47, 0x2,
+ I2C_MODE_BURST_DATA, 0x8146, 0x2,
+ I2C_MODE_BURST_DATA, 0xC648, 0x2,
+ I2C_MODE_BURST_DATA, 0x1746, 0x2,
+ I2C_MODE_BURST_DATA, 0x8846, 0x2,
+ I2C_MODE_BURST_DATA, 0x8068, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C46, 0x2,
+ I2C_MODE_BURST_DATA, 0x85B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x060C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x2946, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x92FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2346, 0x2,
+ I2C_MODE_BURST_DATA, 0x3A46, 0x2,
+ I2C_MODE_BURST_DATA, 0x4146, 0x2,
+ I2C_MODE_BURST_DATA, 0x4846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9BFA, 0x2,
+ I2C_MODE_BURST_DATA, 0xC14A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9088, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0B3, 0x2,
+ I2C_MODE_BURST_DATA, 0xBE48, 0x2,
+ I2C_MODE_BURST_DATA, 0x90F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBA10, 0x2,
+ I2C_MODE_BURST_DATA, 0xD1B3, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2801, 0x2,
+ I2C_MODE_BURST_DATA, 0x1168, 0x2,
+ I2C_MODE_BURST_DATA, 0x8842, 0x2,
+ I2C_MODE_BURST_DATA, 0x00D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0x010A, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x81F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x1700, 0x2,
+ I2C_MODE_BURST_DATA, 0xC140, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xC9B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0389, 0x2,
+ I2C_MODE_BURST_DATA, 0xC288, 0x2,
+ I2C_MODE_BURST_DATA, 0x9B1A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B43, 0x2,
+ I2C_MODE_BURST_DATA, 0x8033, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2322, 0x2,
+ I2C_MODE_BURST_DATA, 0x0092, 0x2,
+ I2C_MODE_BURST_DATA, 0x438A, 0x2,
+ I2C_MODE_BURST_DATA, 0x028A, 0x2,
+ I2C_MODE_BURST_DATA, 0x9B1A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B43, 0x2,
+ I2C_MODE_BURST_DATA, 0x8033, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2322, 0x2,
+ I2C_MODE_BURST_DATA, 0x0192, 0x2,
+ I2C_MODE_BURST_DATA, 0x838B, 0x2,
+ I2C_MODE_BURST_DATA, 0x428B, 0x2,
+ I2C_MODE_BURST_DATA, 0x9B1A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B43, 0x2,
+ I2C_MODE_BURST_DATA, 0x8033, 0x2,
+ I2C_MODE_BURST_DATA, 0x02EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2322, 0x2,
+ I2C_MODE_BURST_DATA, 0x0292, 0x2,
+ I2C_MODE_BURST_DATA, 0xC28C, 0x2,
+ I2C_MODE_BURST_DATA, 0x808C, 0x2,
+ I2C_MODE_BURST_DATA, 0x121A, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A43, 0x2,
+ I2C_MODE_BURST_DATA, 0x8032, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x2220, 0x2,
+ I2C_MODE_BURST_DATA, 0x0390, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x6846, 0x2,
+ I2C_MODE_BURST_DATA, 0x54F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2210, 0x2,
+ I2C_MODE_BURST_DATA, 0x50F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2230, 0x2,
+ I2C_MODE_BURST_DATA, 0x5943, 0x2,
+ I2C_MODE_BURST_DATA, 0x090B, 0x2,
+ I2C_MODE_BURST_DATA, 0x44F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2210, 0x2,
+ I2C_MODE_BURST_DATA, 0x521C, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x01E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x042A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x04B0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2946, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF047, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x3FBA, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A71, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x1207, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x934E, 0x2,
+ I2C_MODE_BURST_DATA, 0x06E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xE801, 0x2,
+ I2C_MODE_BURST_DATA, 0x4843, 0x2,
+ I2C_MODE_BURST_DATA, 0x400B, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x40FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x706B, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC42, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FEA, 0x2,
+ I2C_MODE_BURST_DATA, 0x9000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF3D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x7843, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x00EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4010, 0x2,
+ I2C_MODE_BURST_DATA, 0x400B, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x32BA, 0x2,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A4D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CE0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x7F42, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE3A, 0x2,
+ I2C_MODE_BURST_DATA, 0x13D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x521E, 0x2,
+ I2C_MODE_BURST_DATA, 0x14D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E11, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x29FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x142C, 0x2,
+ I2C_MODE_BURST_DATA, 0x05D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x05EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8401, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C01, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0xECD1, 0x2,
+ I2C_MODE_BURST_DATA, 0x7D49, 0x2,
+ I2C_MODE_BURST_DATA, 0x0420, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA06, 0x2,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E01, 0x2,
+ I2C_MODE_BURST_DATA, 0x05E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0E01, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A71, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x15FA, 0x2,
+ I2C_MODE_BURST_DATA, 0xE5E7, 0x2,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x764D, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CE0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F5, 0x2,
+ I2C_MODE_BURST_DATA, 0x7F42, 0x2,
+ I2C_MODE_BURST_DATA, 0xFE3A, 0x2,
+ I2C_MODE_BURST_DATA, 0x13D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x521E, 0x2,
+ I2C_MODE_BURST_DATA, 0x14D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E11, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x01FA, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x142C, 0x2,
+ I2C_MODE_BURST_DATA, 0x05D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x05EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8401, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5C01, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0xECD1, 0x2,
+ I2C_MODE_BURST_DATA, 0x6949, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0xA1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA06, 0x2,
+ I2C_MODE_BURST_DATA, 0x70BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E01, 0x2,
+ I2C_MODE_BURST_DATA, 0x05E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x91F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5E01, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A71, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xEDF9, 0x2,
+ I2C_MODE_BURST_DATA, 0xE5E7, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x604D, 0x2,
+ I2C_MODE_BURST_DATA, 0xB5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xCA06, 0x2,
+ I2C_MODE_BURST_DATA, 0x0328, 0x2,
+ I2C_MODE_BURST_DATA, 0x5BD1, 0x2,
+ I2C_MODE_BURST_DATA, 0x5F4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3800, 0x2,
+ I2C_MODE_BURST_DATA, 0x90B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3900, 0x2,
+ I2C_MODE_BURST_DATA, 0x0A28, 0x2,
+ I2C_MODE_BURST_DATA, 0x0ED8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0024, 0x2,
+ I2C_MODE_BURST_DATA, 0x08E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x06EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4400, 0x2,
+ I2C_MODE_BURST_DATA, 0x3219, 0x2,
+ I2C_MODE_BURST_DATA, 0x408F, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x4E32, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xD9F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x641C, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3900, 0x2,
+ I2C_MODE_BURST_DATA, 0xA042, 0x2,
+ I2C_MODE_BURST_DATA, 0xF2D8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD5F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xDC06, 0x2,
+ I2C_MODE_BURST_DATA, 0x8047, 0x2,
+ I2C_MODE_BURST_DATA, 0x96F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E00, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF4, 0x2,
+ I2C_MODE_BURST_DATA, 0x7A71, 0x2,
+ I2C_MODE_BURST_DATA, 0x10FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x01F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC4F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0220, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xCBF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xCDF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x4D49, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0x4883, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B4C, 0x2,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xFB20, 0x2,
+ I2C_MODE_BURST_DATA, 0x4A83, 0x2,
+ I2C_MODE_BURST_DATA, 0x95F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xAC10, 0x2,
+ I2C_MODE_BURST_DATA, 0xB1B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x85F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4807, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC4F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0646, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC5F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xD4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6412, 0x2,
+ I2C_MODE_BURST_DATA, 0x8142, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0121, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0021, 0x2,
+ I2C_MODE_BURST_DATA, 0x95F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x4807, 0x2,
+ I2C_MODE_BURST_DATA, 0x8DF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x9DF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0843, 0x2,
+ I2C_MODE_BURST_DATA, 0xEDD0, 0x2,
+ I2C_MODE_BURST_DATA, 0x95F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9806, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0x0ED0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x1402, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xF825, 0x2,
+ I2C_MODE_BURST_DATA, 0x2146, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF9, 0x2,
+ I2C_MODE_BURST_DATA, 0x2146, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF840, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA8B9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF8BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x344C, 0x2,
+ I2C_MODE_BURST_DATA, 0x3249, 0x2,
+ I2C_MODE_BURST_DATA, 0x0646, 0x2,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x6970, 0x2,
+ I2C_MODE_BURST_DATA, 0x8988, 0x2,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8120, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2146, 0x2,
+ I2C_MODE_BURST_DATA, 0xD1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9410, 0x2,
+ I2C_MODE_BURST_DATA, 0x72B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8FB1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x98F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0546, 0x2,
+ I2C_MODE_BURST_DATA, 0xE06F, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x94F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x8542, 0x2,
+ I2C_MODE_BURST_DATA, 0x02D2, 0x2,
+ I2C_MODE_BURST_DATA, 0xD4F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x9400, 0x2,
+ I2C_MODE_BURST_DATA, 0x26E0, 0x2,
+ I2C_MODE_BURST_DATA, 0xE06F, 0x2,
+ I2C_MODE_BURST_DATA, 0x24E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x002F, 0x2,
+ I2C_MODE_BURST_DATA, 0xFBD1, 0x2,
+ I2C_MODE_BURST_DATA, 0x002A, 0x2,
+ I2C_MODE_BURST_DATA, 0x24D0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0846, 0x2,
+ I2C_MODE_BURST_DATA, 0x1EE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1E49, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D8E, 0x2,
+ I2C_MODE_BURST_DATA, 0x496B, 0x2,
+ I2C_MODE_BURST_DATA, 0x4B42, 0x2,
+ I2C_MODE_BURST_DATA, 0x77B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x2048, 0x2,
+ I2C_MODE_BURST_DATA, 0x806F, 0x2,
+ I2C_MODE_BURST_DATA, 0x10E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4242, 0x2,
+ I2C_MODE_BURST_DATA, 0x00E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0246, 0x2,
+ I2C_MODE_BURST_DATA, 0x0029, 0x2,
+ I2C_MODE_BURST_DATA, 0x0FDB, 0x2,
+ I2C_MODE_BURST_DATA, 0x8A42, 0x2,
+ I2C_MODE_BURST_DATA, 0x0FDD, 0x2,
+ I2C_MODE_BURST_DATA, 0x3046, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF041, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x78B9, 0x2,
+ I2C_MODE_BURST_DATA, 0x002A, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CD0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1748, 0x2,
+ I2C_MODE_BURST_DATA, 0xD0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x8C00, 0x2,
+ I2C_MODE_BURST_DATA, 0x25B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0028, 0x2,
+ I2C_MODE_BURST_DATA, 0xEDDA, 0x2,
+ I2C_MODE_BURST_DATA, 0xEAE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x1946, 0x2,
+ I2C_MODE_BURST_DATA, 0xEDE7, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x70F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xE060, 0x2,
+ I2C_MODE_BURST_DATA, 0x0120, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xF081, 0x2,
+ I2C_MODE_BURST_DATA, 0x2DE9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF35F, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x24A0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C46, 0x2,
+ I2C_MODE_BURST_DATA, 0xBAF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xBE04, 0x2,
+ I2C_MODE_BURST_DATA, 0x08B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x67F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B4E, 0x2,
+ I2C_MODE_BURST_DATA, 0x3088, 0x2,
+ I2C_MODE_BURST_DATA, 0x0128, 0x2,
+ I2C_MODE_BURST_DATA, 0x19D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x002C, 0x2,
+ I2C_MODE_BURST_DATA, 0x17D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x11E0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x46C0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2C30, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E30, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2580, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x6000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0DE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2BA0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x3600, 0x2,
+ I2C_MODE_BURST_DATA, 0x6F4D, 0x2,
+ I2C_MODE_BURST_DATA, 0x2889, 0x2,
+ I2C_MODE_BURST_DATA, 0x18B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x401E, 0x2,
+ I2C_MODE_BURST_DATA, 0x2881, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xFC9F, 0x2,
+ I2C_MODE_BURST_DATA, 0xDFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0xB491, 0x2,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD602, 0x2,
+ I2C_MODE_BURST_DATA, 0x38B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x3089, 0x2,
+ I2C_MODE_BURST_DATA, 0x401C, 0x2,
+ I2C_MODE_BURST_DATA, 0x80B2, 0x2,
+ I2C_MODE_BURST_DATA, 0x3081, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF28, 0x2,
+ I2C_MODE_BURST_DATA, 0x01D9, 0x2,
+ I2C_MODE_BURST_DATA, 0xE889, 0x2,
+ I2C_MODE_BURST_DATA, 0x3081, 0x2,
+ I2C_MODE_BURST_DATA, 0x6648, 0x2,
+ I2C_MODE_BURST_DATA, 0x4FF0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0008, 0x2,
+ I2C_MODE_BURST_DATA, 0xC6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0C80, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x5EB0, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xFF31, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B20, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x31F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0027, 0x2,
+ I2C_MODE_BURST_DATA, 0x3C46, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD412, 0x2,
+ I2C_MODE_BURST_DATA, 0x21B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0098, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x18F9, 0x2,
+ I2C_MODE_BURST_DATA, 0x0746, 0x2,
+ I2C_MODE_BURST_DATA, 0x0BE0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD602, 0x2,
+ I2C_MODE_BURST_DATA, 0x40B1, 0x2,
+ I2C_MODE_BURST_DATA, 0x3089, 0x2,
+ I2C_MODE_BURST_DATA, 0xE989, 0x2,
+ I2C_MODE_BURST_DATA, 0x8842, 0x2,
+ I2C_MODE_BURST_DATA, 0x04D3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0098, 0x2,
+ I2C_MODE_BURST_DATA, 0xFFF7, 0x2,
+ I2C_MODE_BURST_DATA, 0x5BFF, 0x2,
+ I2C_MODE_BURST_DATA, 0x0746, 0x2,
+ I2C_MODE_BURST_DATA, 0x0124, 0x2,
+ I2C_MODE_BURST_DATA, 0x3846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x1BF9, 0x2,
+ I2C_MODE_BURST_DATA, 0xD9F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xB0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xD602, 0x2,
+ I2C_MODE_BURST_DATA, 0x08B9, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0280, 0x2,
+ I2C_MODE_BURST_DATA, 0xC7B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x4746, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0880, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x13F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xF068, 0x2,
+ I2C_MODE_BURST_DATA, 0x3061, 0x2,
+ I2C_MODE_BURST_DATA, 0x688D, 0x2,
+ I2C_MODE_BURST_DATA, 0x50B3, 0x2,
+ I2C_MODE_BURST_DATA, 0xA88D, 0x2,
+ I2C_MODE_BURST_DATA, 0x50BB, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x10F9, 0x2,
+ I2C_MODE_BURST_DATA, 0xA889, 0x2,
+ I2C_MODE_BURST_DATA, 0x20B3, 0x2,
+ I2C_MODE_BURST_DATA, 0x1CB3, 0x2,
+ I2C_MODE_BURST_DATA, 0x706B, 0x2,
+ I2C_MODE_BURST_DATA, 0xAA88, 0x2,
+ I2C_MODE_BURST_DATA, 0xDAF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0815, 0x2,
+ I2C_MODE_BURST_DATA, 0xCAB1, 0x2,
+ I2C_MODE_BURST_DATA, 0x8842, 0x2,
+ I2C_MODE_BURST_DATA, 0x0CDB, 0x2,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1F3, 0x2,
+ I2C_MODE_BURST_DATA, 0x90FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF1F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x1303, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x610F, 0x2,
+ I2C_MODE_BURST_DATA, 0x00DD, 0x2,
+ I2C_MODE_BURST_DATA, 0x521C, 0x2,
+ I2C_MODE_BURST_DATA, 0x01FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x1200, 0x2,
+ I2C_MODE_BURST_DATA, 0x0BE0, 0x2,
+ I2C_MODE_BURST_DATA, 0x91FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F3, 0x2,
+ I2C_MODE_BURST_DATA, 0x91FB, 0x2,
+ I2C_MODE_BURST_DATA, 0xF0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x00FB, 0x2,
+ I2C_MODE_BURST_DATA, 0x1313, 0x2,
+ I2C_MODE_BURST_DATA, 0xB3EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x600F, 0x2,
+ I2C_MODE_BURST_DATA, 0x00DD, 0x2,
+ I2C_MODE_BURST_DATA, 0x521C, 0x2,
+ I2C_MODE_BURST_DATA, 0x5043, 0x2,
+ I2C_MODE_BURST_DATA, 0x401A, 0x2,
+ I2C_MODE_BURST_DATA, 0xF168, 0x2,
+ I2C_MODE_BURST_DATA, 0x01EB, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0xF060, 0x2,
+ I2C_MODE_BURST_DATA, 0xA88D, 0x2,
+ I2C_MODE_BURST_DATA, 0x10B1, 0x2,
+ I2C_MODE_BURST_DATA, 0xF089, 0x2,
+ I2C_MODE_BURST_DATA, 0x3087, 0x2,
+ I2C_MODE_BURST_DATA, 0xAF85, 0x2,
+ I2C_MODE_BURST_DATA, 0x5846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0xFC5F, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xE4B8, 0x2,
+ I2C_MODE_BURST_DATA, 0x70B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x3049, 0x2,
+ I2C_MODE_BURST_DATA, 0x0446, 0x2,
+ I2C_MODE_BURST_DATA, 0x0020, 0x2,
+ I2C_MODE_BURST_DATA, 0xC1F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3005, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F48, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xC168, 0x2,
+ I2C_MODE_BURST_DATA, 0x0D0C, 0x2,
+ I2C_MODE_BURST_DATA, 0x8EB2, 0x2,
+ I2C_MODE_BURST_DATA, 0x3146, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x6CF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x2046, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xD7F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x3146, 0x2,
+ I2C_MODE_BURST_DATA, 0x2846, 0x2,
+ I2C_MODE_BURST_DATA, 0xBDE8, 0x2,
+ I2C_MODE_BURST_DATA, 0x7040, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x62B8, 0x2,
+ I2C_MODE_BURST_DATA, 0x10B5, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x6751, 0x2,
+ I2C_MODE_BURST_DATA, 0x2448, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xCEF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x224C, 0x2,
+ I2C_MODE_BURST_DATA, 0x0122, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xD941, 0x2,
+ I2C_MODE_BURST_DATA, 0x2060, 0x2,
+ I2C_MODE_BURST_DATA, 0x2148, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xC6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xA141, 0x2,
+ I2C_MODE_BURST_DATA, 0x6060, 0x2,
+ I2C_MODE_BURST_DATA, 0x1F48, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xBFF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xE931, 0x2,
+ I2C_MODE_BURST_DATA, 0xA060, 0x2,
+ I2C_MODE_BURST_DATA, 0x1C48, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB8F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xB731, 0x2,
+ I2C_MODE_BURST_DATA, 0x1A48, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xB2F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x7331, 0x2,
+ I2C_MODE_BURST_DATA, 0x1848, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xACF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x2F31, 0x2,
+ I2C_MODE_BURST_DATA, 0x1648, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA6F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0x7521, 0x2,
+ I2C_MODE_BURST_DATA, 0x1448, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0xA0F8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xED11, 0x2,
+ I2C_MODE_BURST_DATA, 0x1248, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x9AF8, 0x2,
+ I2C_MODE_BURST_DATA, 0x0022, 0x2,
+ I2C_MODE_BURST_DATA, 0xAFF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xAD01, 0x2,
+ I2C_MODE_BURST_DATA, 0x1048, 0x2,
+ I2C_MODE_BURST_DATA, 0x00F0, 0x2,
+ I2C_MODE_BURST_DATA, 0x94F8, 0x2,
+ I2C_MODE_BURST_DATA, 0xE060, 0x2,
+ I2C_MODE_BURST_DATA, 0x10BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2BA0, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0890, 0x2,
+ I2C_MODE_BURST_DATA, 0x4000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x2E30, 0x2,
+ I2C_MODE_BURST_DATA, 0x2000, 0x2,
+ I2C_MODE_BURST_DATA, 0x46C0, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x24A7, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x1AF3, 0x2,
+ I2C_MODE_BURST_DATA, 0x0001, 0x2,
+ I2C_MODE_BURST_DATA, 0x09BD, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xA943, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x71F1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x7239, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x5D87, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x576B, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x57ED, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0xBF8D, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x293C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x42F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xA74C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x41F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xF32C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xBD1C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x010C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x2D1C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x0B3C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x431C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x48F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x6F2C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x47F6, 0x2,
+ I2C_MODE_BURST_DATA, 0xA57C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x815C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0xE70C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x171C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x453C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4AF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x532C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x377C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xD56C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xC91C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xAB2C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x44F6, 0x2,
+ I2C_MODE_BURST_DATA, 0x897C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xA56C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x45F2, 0x2,
+ I2C_MODE_BURST_DATA, 0xEF6C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x40F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x6D7C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BF6, 0x2,
+ I2C_MODE_BURST_DATA, 0x8D7C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x4BF2, 0x2,
+ I2C_MODE_BURST_DATA, 0xAB4C, 0x2,
+ I2C_MODE_BURST_DATA, 0xC0F2, 0x2,
+ I2C_MODE_BURST_DATA, 0x000C, 0x2,
+ I2C_MODE_BURST_DATA, 0x6047, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x08D1, 0x2,
+ I2C_MODE_BURST_DATA, 0x0097, 0x2,
+ I2C_MODE_BURST_DATA, 0x0000, 0x2,
+ I2C_MODE_BURST_DATA, 0x00FF, 0x2,
+ 0x6004, 0x0000, 0x2, /* burst mode direct */
+};
+
+/*
+ * [Mode Information]
+ * 0: [MCLK:26,Width:4000,Height:3000,Format:MIPI_RAW10,mipi_lane:4,mipi_datarate:1152,pvi_pclk_inverse:0]
+ */
+
+/* Tail on, PDC on, w/Gyro */
+const u32 sensor_gm1sp_setfile_B_4000x3000_30fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x0FA7, 0x2,
+ 0x034A, 0x0BBF, 0x2,
+ 0x034C, 0x0FA0, 0x2,
+ 0x034E, 0x0BB8, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0C84, 0x2,
+ 0x0342, 0x13A0, 0x2,
+ 0x0900, 0x0111, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0001, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0085, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0004, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0802, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x0804, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x5500, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x0601, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x0605, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0101, 0x2,
+ 0x0D02, 0x0101, 0x2,
+ 0x0114, 0x0301, 0x2,
+ 0x0116, 0x2B00, 0x2, /* Tail dt: 0x2B */
+ 0xF486, 0x0000, 0x2,
+ 0xF488, 0x0000, 0x2,
+ 0xF48A, 0x0000, 0x2,
+ 0xF48C, 0x0000, 0x2,
+ 0xF48E, 0x0000, 0x2,
+ 0xF490, 0x0000, 0x2,
+ 0xF492, 0x0000, 0x2,
+ 0xF494, 0x0000, 0x2,
+ 0xF496, 0x0000, 0x2,
+ 0xF498, 0x0000, 0x2,
+ 0xF49A, 0x0000, 0x2,
+ 0xF49C, 0x0000, 0x2,
+ 0xF49E, 0x0000, 0x2,
+ 0xF4A0, 0x0000, 0x2,
+ 0xF4A2, 0x0000, 0x2,
+ 0xF4A4, 0x0000, 0x2,
+ 0xF4A6, 0x0000, 0x2,
+ 0xF4A8, 0x0000, 0x2,
+ 0xF4AA, 0x0000, 0x2,
+ 0xF4AC, 0x0000, 0x2,
+ 0xF4AE, 0x0000, 0x2,
+ 0xF4B0, 0x0000, 0x2,
+ 0xF4B2, 0x0000, 0x2,
+ 0xF4B4, 0x0000, 0x2,
+ 0xF4B6, 0x0000, 0x2,
+ 0xF4B8, 0x0000, 0x2,
+ 0xF4BA, 0x0000, 0x2,
+ 0xF4BC, 0x0000, 0x2,
+ 0xF4BE, 0x0000, 0x2,
+ 0xF4C0, 0x0000, 0x2,
+ 0xF4C2, 0x0000, 0x2,
+ 0xF4C4, 0x0000, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0F04, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x170B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x0008, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x40C0, 0x2,
+ 0xF470, 0x7809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x1144, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1146, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x1080, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1084, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x108A, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x1090, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1092, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1094, 0x2,
+ 0x6F12, 0xA32E, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x010C, 0x0100, 0x2,
+ 0x011A, 0x0401, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x0EB0, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x0ECA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E2D, 0x2,
+ 0x6F12, 0x0130, 0x2, /* 0x0131 -> 0x0130, Gyro DT changed */
+ 0x602A, 0x0EDC, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x0EDE, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0E80, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EDA, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x0E88, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E8A, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x0ED8, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x602A, 0x102C, 0x2,
+ 0x6F12, 0x0075, 0x2,
+ 0x602A, 0x1030, 0x2,
+ 0x6F12, 0x0041, 0x2,
+ 0x602A, 0x0F8C, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0F8E, 0x2,
+ 0x6F12, 0x0C00, 0x2,
+ 0x602A, 0x0EEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0EEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EF0, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x602A, 0x0EF2, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x0EF4, 0x2,
+ 0x6F12, 0x0013, 0x2,
+ 0x602A, 0x0EF6, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x602A, 0x0EF8, 0x2,
+ 0x6F12, 0x004C, 0x2,
+ 0x602A, 0x0EFA, 0x2,
+ 0x6F12, 0x3300, 0x2,
+ 0x602A, 0x0EFC, 0x2,
+ 0x6F12, 0x0065, 0x2,
+ 0x602A, 0x0EFE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x0F00, 0x2,
+ 0x6F12, 0x004F, 0x2,
+ 0x602A, 0x0F02, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x602A, 0x0F04, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F06, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0F08, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x602A, 0x0F0A, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F0C, 0x2,
+ 0x6F12, 0x007B, 0x2,
+ 0x602A, 0x0F0E, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F10, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F12, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F14, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0F16, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F18, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0F1A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F1C, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0F1E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F20, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F22, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0FDC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FDE, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0FE0, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0FE2, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE4, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0FE6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE8, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0FEA, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0FF0, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0FF2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x102E, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x602A, 0x602E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6038, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x602A, 0x603A, 0x2,
+ 0x6F12, 0x005F, 0x2,
+ 0x602A, 0x603C, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x603E, 0x2,
+ 0x6F12, 0x0061, 0x2,
+};
+
+/* Tail on, PDC on, w/Gyro */
+const u32 sensor_gm1sp_setfile_B_2000x1124_60fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0180, 0x2,
+ 0x0348, 0x0FA7, 0x2,
+ 0x034A, 0x0A47, 0x2,
+ 0x034C, 0x07D0, 0x2,
+ 0x034E, 0x0464, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x063C, 0x2,
+ 0x0342, 0x13A0, 0x2,
+ 0x0900, 0x0112, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0003, 0x2,
+ 0x0404, 0x2000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0085, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0x006F, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0004, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xFF00, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xFF00, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0802, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x1004, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x7801, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x7805, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0641, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0145, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0149, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x064D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0651, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0155, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0159, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x065D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0661, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0165, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0169, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x066D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0671, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0175, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0179, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x067D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0641, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0145, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0149, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x064D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0651, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0155, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0159, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x065D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0661, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0165, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0169, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x066D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0671, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0175, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0179, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x067D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0004, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0101, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x0116, 0x2B00, 0x2, /* Tail dt: 0x2B */
+ 0xF486, 0x0000, 0x2,
+ 0xF488, 0x0000, 0x2,
+ 0xF48A, 0x0000, 0x2,
+ 0xF48C, 0x0000, 0x2,
+ 0xF48E, 0x0000, 0x2,
+ 0xF490, 0x0000, 0x2,
+ 0xF492, 0x0000, 0x2,
+ 0xF494, 0x0000, 0x2,
+ 0xF496, 0x0000, 0x2,
+ 0xF498, 0x0000, 0x2,
+ 0xF49A, 0x0000, 0x2,
+ 0xF49C, 0x0000, 0x2,
+ 0xF49E, 0x0000, 0x2,
+ 0xF4A0, 0x0000, 0x2,
+ 0xF4A2, 0x0000, 0x2,
+ 0xF4A4, 0x0000, 0x2,
+ 0xF4A6, 0x0000, 0x2,
+ 0xF4A8, 0x0000, 0x2,
+ 0xF4AA, 0x0000, 0x2,
+ 0xF4AC, 0x0000, 0x2,
+ 0xF4AE, 0x0000, 0x2,
+ 0xF4B0, 0x0000, 0x2,
+ 0xF4B2, 0x0000, 0x2,
+ 0xF4B4, 0x0000, 0x2,
+ 0xF4B6, 0x0000, 0x2,
+ 0xF4B8, 0x0000, 0x2,
+ 0xF4BA, 0x0000, 0x2,
+ 0xF4BC, 0x0000, 0x2,
+ 0xF4BE, 0x0000, 0x2,
+ 0xF4C0, 0x0000, 0x2,
+ 0xF4C2, 0x0000, 0x2,
+ 0xF4C4, 0x0000, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0F04, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x0F0B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x0008, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x74C0, 0x2,
+ 0xF470, 0x2809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x1144, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1146, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x1080, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1084, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x108A, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x1090, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1092, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1094, 0x2,
+ 0x6F12, 0xA32E, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x010C, 0x0100, 0x2,
+ 0x011A, 0x0401, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x0EB0, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x0ECA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E2D, 0x2,
+ 0x6F12, 0x0130, 0x2, /* 0x0131 -> 0x0130, Gyro DT changed */
+ 0x602A, 0x0EDC, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x0EDE, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0E80, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EDA, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x0E88, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E8A, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x0ED8, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x602A, 0x102C, 0x2,
+ 0x6F12, 0x0075, 0x2,
+ 0x602A, 0x1030, 0x2,
+ 0x6F12, 0x0041, 0x2,
+ 0x602A, 0x0F8C, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0F8E, 0x2,
+ 0x6F12, 0x0C00, 0x2,
+ 0x602A, 0x0EEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0EEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EF0, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x602A, 0x0EF2, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x0EF4, 0x2,
+ 0x6F12, 0x0013, 0x2,
+ 0x602A, 0x0EF6, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x602A, 0x0EF8, 0x2,
+ 0x6F12, 0x004C, 0x2,
+ 0x602A, 0x0EFA, 0x2,
+ 0x6F12, 0x3300, 0x2,
+ 0x602A, 0x0EFC, 0x2,
+ 0x6F12, 0x0065, 0x2,
+ 0x602A, 0x0EFE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x0F00, 0x2,
+ 0x6F12, 0x004F, 0x2,
+ 0x602A, 0x0F02, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x602A, 0x0F04, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F06, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0F08, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x602A, 0x0F0A, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F0C, 0x2,
+ 0x6F12, 0x007B, 0x2,
+ 0x602A, 0x0F0E, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F10, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F12, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F14, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0F16, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F18, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0F1A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F1C, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0F1E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F20, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F22, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0FDC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FDE, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0FE0, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0FE2, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE4, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0FE6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE8, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0FEA, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0FF0, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0FF2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x102E, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x602A, 0x602E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6038, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x602A, 0x603A, 0x2,
+ 0x6F12, 0x005F, 0x2,
+ 0x602A, 0x603C, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x603E, 0x2,
+ 0x6F12, 0x0061, 0x2,
+};
+
+/* Tail off, PDC on, w/o Gyro */
+const u32 sensor_gm1sp_setfile_B_2000x1124_120fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0180, 0x2,
+ 0x0348, 0x0FA7, 0x2,
+ 0x034A, 0x0A47, 0x2,
+ 0x034C, 0x07D0, 0x2,
+ 0x034E, 0x0464, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0642, 0x2,
+ 0x0342, 0x09D0, 0x2,
+ 0x0900, 0x0122, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0003, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0003, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x008A, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0x0069, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0004, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xFF00, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xFF00, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0402, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x1004, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x0601, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x0605, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0641, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0145, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0149, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x064D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0651, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0155, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0159, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x065D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0661, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0165, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0169, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x066D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0671, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0175, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0179, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x067D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0641, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0145, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0149, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x064D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0651, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0155, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0159, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x065D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0661, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0165, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0169, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x066D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0671, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0175, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0179, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x067D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0101, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0904, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x170B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x0008, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x90C0, 0x2,
+ 0xF470, 0x2809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x1144, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1146, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x1080, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1084, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x108A, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x1090, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1092, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1094, 0x2,
+ 0x6F12, 0xA32E, 0x2,
+};
+
+/* Tail off, PDC off, w/o Gyro */
+const u32 sensor_gm1sp_setfile_B_1280x720_240fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0058, 0x2,
+ 0x0346, 0x01AC, 0x2,
+ 0x0348, 0x0F57, 0x2,
+ 0x034A, 0x0A1B, 0x2,
+ 0x034C, 0x0500, 0x2,
+ 0x034E, 0x02D0, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0334, 0x2,
+ 0x0342, 0x0990, 0x2,
+ 0x0900, 0x0123, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0002, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0005, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1810, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0058, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0104, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0802, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x0804, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x5500, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x0601, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x0605, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0100, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0904, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x170B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x0080, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x0008, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x6CC0, 0x2,
+ 0xF470, 0x7809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x1144, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1146, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x1080, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1084, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x108A, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x1090, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1092, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1094, 0x2,
+ 0x6F12, 0xA32E, 0x2,
+};
+
+const u32 sensor_gm1sp_setfile_B_4000x3000_30fps_Gyro_test_1st[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x0FA7, 0x2,
+ 0x034A, 0x0BBF, 0x2,
+ 0x034C, 0x0FA0, 0x2,
+ 0x034E, 0x0BB8, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0C86, 0x2,
+ 0x0342, 0x13A0, 0x2,
+ 0x0900, 0x0111, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0001, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0085, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0004, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0802, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x0804, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x5500, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x0601, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x0605, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0101, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0F04, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x170B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x0008, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x40C0, 0x2,
+ 0xF470, 0x7809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x1144, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1146, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x1080, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1084, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x108A, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x1090, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1092, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1094, 0x2,
+ 0x6F12, 0xA32E, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x010C, 0x0100, 0x2,
+ 0x011A, 0x0401, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x0EB0, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x0ECA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E2D, 0x2,
+ 0x6F12, 0x0130, 0x2,
+ 0x602A, 0x0EDC, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x0EDE, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0E80, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EDA, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x0E88, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E8A, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x0ED8, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x602A, 0x102C, 0x2,
+ 0x6F12, 0x0075, 0x2,
+ 0x602A, 0x1030, 0x2,
+ 0x6F12, 0x0041, 0x2,
+ 0x602A, 0x0F8C, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F8E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F90, 0x2,
+ 0x6F12, 0x0051, 0x2,
+ 0x602A, 0x0F92, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x0F94, 0x2,
+ 0x6F12, 0x0052, 0x2,
+ 0x602A, 0x0F96, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x0F98, 0x2,
+ 0x6F12, 0x004F, 0x2,
+ 0x602A, 0x0F9A, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x602A, 0x0F9C, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0F9E, 0x2,
+ 0x6F12, 0x0C00, 0x2,
+ 0x602A, 0x0FA0, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FA2, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0EEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0EEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EF0, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x602A, 0x0EF2, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x0EF4, 0x2,
+ 0x6F12, 0x0013, 0x2,
+ 0x602A, 0x0EF6, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x602A, 0x0EF8, 0x2,
+ 0x6F12, 0x004C, 0x2,
+ 0x602A, 0x0EFA, 0x2,
+ 0x6F12, 0x3300, 0x2,
+ 0x602A, 0x0EFC, 0x2,
+ 0x6F12, 0x0065, 0x2,
+ 0x602A, 0x0EFE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x0F00, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F02, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0F04, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x602A, 0x0F06, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F08, 0x2,
+ 0x6F12, 0x007B, 0x2,
+ 0x602A, 0x0F0A, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F0C, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F0E, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F10, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0F12, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F14, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0F16, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F18, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0F1A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F1C, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F1E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F20, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F22, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0FDC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FDE, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0FE0, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0FE2, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE4, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0FE6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE8, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0FEA, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0FF0, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0FF2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x102E, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x602A, 0x602E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6038, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x602A, 0x603A, 0x2,
+ 0x6F12, 0x005F, 0x2,
+ 0x602A, 0x603C, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x603E, 0x2,
+ 0x6F12, 0x0061, 0x2,
+};
+
+const u32 sensor_gm1sp_setfile_B_4000x3000_30fps_Gyro_test_2nd[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x0FA7, 0x2,
+ 0x034A, 0x0BBF, 0x2,
+ 0x034C, 0x0FA0, 0x2,
+ 0x034E, 0x0BB8, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0C86, 0x2,
+ 0x0342, 0x13A0, 0x2,
+ 0x0900, 0x0111, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0001, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0001, 0x2,
+ 0x0310, 0x0085, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0004, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0802, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x0804, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x5500, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x0601, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x0605, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0101, 0x2,
+ 0x0D02, 0x0001, 0x2,
+ 0x0114, 0x0300, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0F04, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x170B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x0008, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x40C0, 0x2,
+ 0xF470, 0x7809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x1144, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1146, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x1080, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1084, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x108A, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x1090, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1092, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1094, 0x2,
+ 0x6F12, 0xA32E, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x010C, 0x0100, 0x2,
+ 0x011A, 0x0401, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x0EB0, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x0ECA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E2D, 0x2,
+ 0x6F12, 0x0130, 0x2,
+ 0x602A, 0x0EDC, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x0EDE, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0E80, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EDA, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x0E88, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0E8A, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x0ED8, 0x2,
+ 0x6F12, 0x0A00, 0x2,
+ 0x602A, 0x102C, 0x2,
+ 0x6F12, 0x0075, 0x2,
+ 0x602A, 0x1030, 0x2,
+ 0x6F12, 0x0041, 0x2,
+ 0x602A, 0x0F8C, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F8E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F90, 0x2,
+ 0x6F12, 0x0051, 0x2,
+ 0x602A, 0x0F92, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x0F94, 0x2,
+ 0x6F12, 0x0052, 0x2,
+ 0x602A, 0x0F96, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x0F98, 0x2,
+ 0x6F12, 0x004F, 0x2,
+ 0x602A, 0x0F9A, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x602A, 0x0F9C, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0F9E, 0x2,
+ 0x6F12, 0x0C00, 0x2,
+ 0x602A, 0x0FA0, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FA2, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0EEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0EEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0EF0, 0x2,
+ 0x6F12, 0x0014, 0x2,
+ 0x602A, 0x0EF2, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x0EF4, 0x2,
+ 0x6F12, 0x0013, 0x2,
+ 0x602A, 0x0EF6, 0x2,
+ 0x6F12, 0x0600, 0x2,
+ 0x602A, 0x0EF8, 0x2,
+ 0x6F12, 0x004C, 0x2,
+ 0x602A, 0x0EFA, 0x2,
+ 0x6F12, 0x3300, 0x2,
+ 0x602A, 0x0EFC, 0x2,
+ 0x6F12, 0x0065, 0x2,
+ 0x602A, 0x0EFE, 0x2,
+ 0x6F12, 0x0800, 0x2,
+ 0x602A, 0x0F00, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F02, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0F04, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x602A, 0x0F06, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F08, 0x2,
+ 0x6F12, 0x007B, 0x2,
+ 0x602A, 0x0F0A, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F0C, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F0E, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0F10, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0F12, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F14, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0F16, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F18, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0F1A, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F1C, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0F1E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0F20, 0x2,
+ 0x6F12, 0x0070, 0x2,
+ 0x602A, 0x0F22, 0x2,
+ 0x6F12, 0x0700, 0x2,
+ 0x602A, 0x0FDC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FDE, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x0FE0, 0x2,
+ 0x6F12, 0x0071, 0x2,
+ 0x602A, 0x0FE2, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE4, 0x2,
+ 0x6F12, 0x0072, 0x2,
+ 0x602A, 0x0FE6, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FE8, 0x2,
+ 0x6F12, 0x0073, 0x2,
+ 0x602A, 0x0FEA, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x0FEC, 0x2,
+ 0x6F12, 0x0076, 0x2,
+ 0x602A, 0x0FEE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x0FF0, 0x2,
+ 0x6F12, 0x004E, 0x2,
+ 0x602A, 0x0FF2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x102E, 0x2,
+ 0x6F12, 0x0025, 0x2,
+ 0x602A, 0x602E, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6038, 0x2,
+ 0x6F12, 0x0103, 0x2,
+ 0x602A, 0x603A, 0x2,
+ 0x6F12, 0x005F, 0x2,
+ 0x602A, 0x603C, 0x2,
+ 0x6F12, 0x0060, 0x2,
+ 0x602A, 0x603E, 0x2,
+ 0x6F12, 0x0061, 0x2,
+};
+
+/* for reduce mipi speed at thermal throttling state */
+const u32 sensor_gm1sp_setfile_B_4000x3000_15fps[] = {
+ 0x6028, 0x4000, 0x2,
+ 0x6214, 0x7971, 0x2,
+ 0x6218, 0x7150, 0x2,
+ 0x0344, 0x0008, 0x2,
+ 0x0346, 0x0008, 0x2,
+ 0x0348, 0x0FA7, 0x2,
+ 0x034A, 0x0BBF, 0x2,
+ 0x034C, 0x0FA0, 0x2,
+ 0x034E, 0x0BB8, 0x2,
+ 0x0350, 0x0000, 0x2,
+ 0x0352, 0x0000, 0x2,
+ 0x0340, 0x0C86, 0x2,
+ 0x0342, 0x2740, 0x2,
+ 0x0900, 0x0111, 0x2,
+ 0x0380, 0x0001, 0x2,
+ 0x0382, 0x0001, 0x2,
+ 0x0384, 0x0001, 0x2,
+ 0x0386, 0x0001, 0x2,
+ 0x0404, 0x1000, 0x2,
+ 0x0402, 0x1010, 0x2,
+ 0x0136, 0x1A00, 0x2,
+ 0x0304, 0x0006, 0x2,
+ 0x030C, 0x0000, 0x2,
+ 0x0306, 0x00DF, 0x2,
+ 0x0302, 0x0001, 0x2,
+ 0x0300, 0x0008, 0x2,
+ 0x030E, 0x0003, 0x2,
+ 0x0312, 0x0002, 0x2,
+ 0x0310, 0x0085, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1492, 0x2,
+ 0x6F12, 0x0078, 0x2,
+ 0x602A, 0x0E4E, 0x2,
+ 0x6F12, 0x007A, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0118, 0x0004, 0x2,
+ 0x021E, 0x0000, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x2126, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1168, 0x2,
+ 0x6F12, 0x0020, 0x2,
+ 0x602A, 0x2DB6, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1668, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x166A, 0x2,
+ 0x6F12, 0xF0F0, 0x2,
+ 0x602A, 0x118A, 0x2,
+ 0x6F12, 0x0802, 0x2,
+ 0x602A, 0x151E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x217E, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1520, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x2522, 0x2,
+ 0x6F12, 0x0804, 0x2,
+ 0x602A, 0x2524, 0x2,
+ 0x6F12, 0x0400, 0x2,
+ 0x602A, 0x2568, 0x2,
+ 0x6F12, 0x5500, 0x2,
+ 0x602A, 0x2588, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x258C, 0x2,
+ 0x6F12, 0x1111, 0x2,
+ 0x602A, 0x25A6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x252C, 0x2,
+ 0x6F12, 0x0601, 0x2,
+ 0x602A, 0x252E, 0x2,
+ 0x6F12, 0x0605, 0x2,
+ 0x602A, 0x25A8, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25AC, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x25B0, 0x2,
+ 0x6F12, 0x1100, 0x2,
+ 0x602A, 0x25B4, 0x2,
+ 0x6F12, 0x0011, 0x2,
+ 0x602A, 0x15A4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15A6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15A8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15AA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15AC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15AE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15B0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15B2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15B4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15B6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15B8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15BA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15BC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15BE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15C0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15C2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x15C4, 0x2,
+ 0x6F12, 0x0141, 0x2,
+ 0x602A, 0x15C6, 0x2,
+ 0x6F12, 0x0545, 0x2,
+ 0x602A, 0x15C8, 0x2,
+ 0x6F12, 0x0649, 0x2,
+ 0x602A, 0x15CA, 0x2,
+ 0x6F12, 0x024D, 0x2,
+ 0x602A, 0x15CC, 0x2,
+ 0x6F12, 0x0151, 0x2,
+ 0x602A, 0x15CE, 0x2,
+ 0x6F12, 0x0555, 0x2,
+ 0x602A, 0x15D0, 0x2,
+ 0x6F12, 0x0659, 0x2,
+ 0x602A, 0x15D2, 0x2,
+ 0x6F12, 0x025D, 0x2,
+ 0x602A, 0x15D4, 0x2,
+ 0x6F12, 0x0161, 0x2,
+ 0x602A, 0x15D6, 0x2,
+ 0x6F12, 0x0565, 0x2,
+ 0x602A, 0x15D8, 0x2,
+ 0x6F12, 0x0669, 0x2,
+ 0x602A, 0x15DA, 0x2,
+ 0x6F12, 0x026D, 0x2,
+ 0x602A, 0x15DC, 0x2,
+ 0x6F12, 0x0171, 0x2,
+ 0x602A, 0x15DE, 0x2,
+ 0x6F12, 0x0575, 0x2,
+ 0x602A, 0x15E0, 0x2,
+ 0x6F12, 0x0679, 0x2,
+ 0x602A, 0x15E2, 0x2,
+ 0x6F12, 0x027D, 0x2,
+ 0x602A, 0x1A50, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1A54, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0x0D00, 0x0101, 0x2,
+ 0x0D02, 0x0101, 0x2,
+ 0x0114, 0x0301, 0x2,
+ 0xF486, 0x0000, 0x2,
+ 0xF488, 0x0000, 0x2,
+ 0xF48A, 0x0000, 0x2,
+ 0xF48C, 0x0000, 0x2,
+ 0xF48E, 0x0000, 0x2,
+ 0xF490, 0x0000, 0x2,
+ 0xF492, 0x0000, 0x2,
+ 0xF494, 0x0000, 0x2,
+ 0xF496, 0x0000, 0x2,
+ 0xF498, 0x0000, 0x2,
+ 0xF49A, 0x0000, 0x2,
+ 0xF49C, 0x0000, 0x2,
+ 0xF49E, 0x0000, 0x2,
+ 0xF4A0, 0x0000, 0x2,
+ 0xF4A2, 0x0000, 0x2,
+ 0xF4A4, 0x0000, 0x2,
+ 0xF4A6, 0x0000, 0x2,
+ 0xF4A8, 0x0000, 0x2,
+ 0xF4AA, 0x0000, 0x2,
+ 0xF4AC, 0x0000, 0x2,
+ 0xF4AE, 0x0000, 0x2,
+ 0xF4B0, 0x0000, 0x2,
+ 0xF4B2, 0x0000, 0x2,
+ 0xF4B4, 0x0000, 0x2,
+ 0xF4B6, 0x0000, 0x2,
+ 0xF4B8, 0x0000, 0x2,
+ 0xF4BA, 0x0000, 0x2,
+ 0xF4BC, 0x0000, 0x2,
+ 0xF4BE, 0x0000, 0x2,
+ 0xF4C0, 0x0000, 0x2,
+ 0xF4C2, 0x0000, 0x2,
+ 0xF4C4, 0x0000, 0x2,
+ 0x0202, 0x0010, 0x2,
+ 0x0226, 0x0010, 0x2,
+ 0x0204, 0x0020, 0x2,
+ 0x0B06, 0x0101, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x107A, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x1074, 0x2,
+ 0x6F12, 0x1D00, 0x2,
+ 0x602A, 0x0E7C, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1120, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1122, 0x2,
+ 0x6F12, 0x0028, 0x2,
+ 0x602A, 0x1128, 0x2,
+ 0x6F12, 0x0604, 0x2,
+ 0x602A, 0x1AC0, 0x2,
+ 0x6F12, 0x0200, 0x2,
+ 0x602A, 0x1AC2, 0x2,
+ 0x6F12, 0x0002, 0x2,
+ 0x602A, 0x1494, 0x2,
+ 0x6F12, 0x3D68, 0x2,
+ 0x602A, 0x1498, 0x2,
+ 0x6F12, 0xF10D, 0x2,
+ 0x602A, 0x1488, 0x2,
+ 0x6F12, 0x0F04, 0x2,
+ 0x602A, 0x148A, 0x2,
+ 0x6F12, 0x170B, 0x2,
+ 0x602A, 0x150E, 0x2,
+ 0x6F12, 0x00C2, 0x2,
+ 0x602A, 0x1510, 0x2,
+ 0x6F12, 0xC0AF, 0x2,
+ 0x602A, 0x1512, 0x2,
+ 0x6F12, 0x00A0, 0x2,
+ 0x602A, 0x1486, 0x2,
+ 0x6F12, 0x1430, 0x2,
+ 0x602A, 0x1490, 0x2,
+ 0x6F12, 0x4D09, 0x2,
+ 0x602A, 0x149E, 0x2,
+ 0x6F12, 0x01C4, 0x2,
+ 0x602A, 0x11CC, 0x2,
+ 0x6F12, 0x0008, 0x2,
+ 0x602A, 0x11CE, 0x2,
+ 0x6F12, 0x000B, 0x2,
+ 0x602A, 0x11D0, 0x2,
+ 0x6F12, 0x0003, 0x2,
+ 0x602A, 0x11DA, 0x2,
+ 0x6F12, 0x0012, 0x2,
+ 0x602A, 0x11E6, 0x2,
+ 0x6F12, 0x002A, 0x2,
+ 0x602A, 0x125E, 0x2,
+ 0x6F12, 0x0048, 0x2,
+ 0x602A, 0x11F4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x11F8, 0x2,
+ 0x6F12, 0x0016, 0x2,
+ 0x6028, 0x4000, 0x2,
+ 0xF444, 0x05BF, 0x2,
+ 0xF44A, 0x0008, 0x2,
+ 0xF44E, 0x0012, 0x2,
+ 0xF46E, 0x40C0, 0x2,
+ 0xF470, 0x7809, 0x2,
+ 0x6028, 0x2000, 0x2,
+ 0x602A, 0x1CAA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CAE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CB8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBA, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBC, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CBE, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC0, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC2, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC4, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC6, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1CC8, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6000, 0x2,
+ 0x6F12, 0x000F, 0x2,
+ 0x602A, 0x6002, 0x2,
+ 0x6F12, 0xFFFF, 0x2,
+ 0x602A, 0x6004, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x6006, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6008, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x600E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6010, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6012, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6014, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6016, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6018, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x601E, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6020, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6022, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6024, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6026, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x6028, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602A, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x602C, 0x2,
+ 0x6F12, 0x1000, 0x2,
+ 0x602A, 0x1144, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1146, 0x2,
+ 0x6F12, 0x1B00, 0x2,
+ 0x602A, 0x1080, 0x2,
+ 0x6F12, 0x0100, 0x2,
+ 0x602A, 0x1084, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x108A, 0x2,
+ 0x6F12, 0x00C0, 0x2,
+ 0x602A, 0x1090, 0x2,
+ 0x6F12, 0x0001, 0x2,
+ 0x602A, 0x1092, 0x2,
+ 0x6F12, 0x0000, 0x2,
+ 0x602A, 0x1094, 0x2,
+ 0x6F12, 0xA32E, 0x2,
+};
+
+/* for reduce mipi speed at thermal throttling state */
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_B_4000x3000_15fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 576330000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0C84, /* frame_length_lines (0x0340) */
+ 0x2740, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_B_4000x3000_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1152670000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0C84, /* frame_length_lines (0x0340) */
+ 0x13A0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_B_2000x1124_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1152670000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x063C, /* frame_length_lines (0x0340) */
+ 0x13A0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_B_2000x1124_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1196000000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0642, /* frame_length_lines (0x0340) */
+ 0x09D0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_B_1280x720_240fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 763000000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0334, /* frame_length_lines (0x0340) */
+ 0x0990, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_B_4000x3000_30fps_gyro_test_1st = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1152670000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0C86, /* frame_length_lines (0x0340) */
+ 0x13A0, /* line_length_pck (0x0342) */
+};
+
+const struct sensor_pll_info_compact sensor_gm1sp_pllinfo_B_4000x3000_30fps_gyro_test_2nd = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 1152670000, /* mipi_datarate */
+ 483170000, /* pclk = VT pix CLK (this value is different by cis) */
+ 0x0C86, /* frame_length_lines (0x0340) */
+ 0x13A0, /* line_length_pck (0x0342) */
+};
+
+static const u32 *sensor_gm1sp_setfiles_B[] = {
+ sensor_gm1sp_setfile_B_4000x3000_30fps,
+ sensor_gm1sp_setfile_B_2000x1124_60fps,
+ sensor_gm1sp_setfile_B_2000x1124_120fps,
+ sensor_gm1sp_setfile_B_1280x720_240fps,
+ sensor_gm1sp_setfile_B_4000x3000_30fps_Gyro_test_1st,
+ sensor_gm1sp_setfile_B_4000x3000_30fps_Gyro_test_2nd,
+};
+
+static const u32 sensor_gm1sp_setfile_B_sizes[] = {
+ ARRAY_SIZE(sensor_gm1sp_setfile_B_4000x3000_30fps),
+ ARRAY_SIZE(sensor_gm1sp_setfile_B_2000x1124_60fps),
+ ARRAY_SIZE(sensor_gm1sp_setfile_B_2000x1124_120fps),
+ ARRAY_SIZE(sensor_gm1sp_setfile_B_1280x720_240fps),
+ ARRAY_SIZE(sensor_gm1sp_setfile_B_4000x3000_30fps_Gyro_test_1st),
+ ARRAY_SIZE(sensor_gm1sp_setfile_B_4000x3000_30fps_Gyro_test_2nd),
+};
+
+static const struct sensor_pll_info_compact *sensor_gm1sp_pllinfos_B[] = {
+ &sensor_gm1sp_pllinfo_B_4000x3000_30fps,
+ &sensor_gm1sp_pllinfo_B_2000x1124_60fps,
+ &sensor_gm1sp_pllinfo_B_2000x1124_120fps,
+ &sensor_gm1sp_pllinfo_B_1280x720_240fps,
+ &sensor_gm1sp_pllinfo_B_4000x3000_30fps_gyro_test_1st,
+ &sensor_gm1sp_pllinfo_B_4000x3000_30fps_gyro_test_2nd,
+};
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-gm1sp.h"
+#include "fimc-is-cis-gm1sp-setA.h"
+#include "fimc-is-cis-gm1sp-setB.h"
+
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "S5KGM1SP"
+/* #define DEBUG_GM1SP_PLL */
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+static const u32 *sensor_gm1sp_global;
+static u32 sensor_gm1sp_global_size;
+static const u32 **sensor_gm1sp_setfiles;
+static const u32 *sensor_gm1sp_setfile_sizes;
+static const struct sensor_pll_info_compact **sensor_gm1sp_pllinfos;
+static u32 sensor_gm1sp_max_setfile_num;
+
+static const u32 *sensor_gm1sp_setfile_throttling;
+static const struct sensor_pll_info_compact *sensor_gm1sp_pllinfo_throttling;
+
+static void sensor_gm1sp_cis_data_calculation(const struct sensor_pll_info_compact *pll_info_compact, cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, frame_valid_us = 0;
+ u64 max_fps = 0;
+
+ FIMC_BUG_VOID(!pll_info_compact);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info_compact->pclk;
+
+ dbg_sensor(1, "ext_clock(%d), mipi_datarate(%d), pclk(%d)\n",
+ pll_info_compact->ext_clk, pll_info_compact->mipi_datarate, pll_info_compact->pclk);
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info_compact->frame_length_lines(%d) * pll_info_compact->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info_compact->frame_length_lines, pll_info_compact->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = ((u64)vt_pix_clk_hz * 10) / (pll_info_compact->frame_length_lines * pll_info_compact->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = (u32)max_fps;
+ cis_data->frame_length_lines = pll_info_compact->frame_length_lines;
+ cis_data->line_length_pck = pll_info_compact->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n",
+ cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_GM1SP_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = cis_data->cur_width;
+ cis_data->min_coarse_integration_time = SENSOR_GM1SP_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_GM1SP_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+}
+
+int sensor_gm1sp_cis_check_rev(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u8 rev = 0;
+ struct i2c_client *client;
+ struct fimc_is_cis *cis = NULL;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ WARN_ON(!cis);
+ WARN_ON(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+ cis->rev_flag = false;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = fimc_is_sensor_read8(client, 0x0002, &rev);
+ if (ret < 0) {
+ cis->rev_flag = true;
+ ret = -EAGAIN;
+ } else {
+ cis->cis_data->cis_rev = rev;
+ pr_info("%s : Rev. 0x%X\n", __func__, rev);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+/* CIS OPS */
+int sensor_gm1sp_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+ setinfo.return_value = 0;
+
+ setinfo.param = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+
+ cis->cis_data->cur_width = SENSOR_GM1SP_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_GM1SP_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+
+ cis->gyro_test_val.x = 0;
+ cis->gyro_test_val.y = 0;
+ cis->gyro_test_val.z = 0;
+ cis->gyro_test_val.state = SENSOR_GYRO_INFO_STATE_BASE;
+ cis->gyro_self_test_step = 0;
+
+ sensor_gm1sp_cis_data_calculation(sensor_gm1sp_pllinfos[setfile_index], cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_gm1sp_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ return -ENODEV;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -ENODEV;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+ fimc_is_sensor_read16(client, 0x0000, &data16);
+ pr_err("[SEN:DUMP] model_id(%x)\n", data16);
+ fimc_is_sensor_read8(client, 0x0002, &data8);
+ pr_err("[SEN:DUMP] revision_number(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0005, &data8);
+ pr_err("[SEN:DUMP] frame_count(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0100, &data8);
+ pr_err("[SEN:DUMP] mode_select(%x)\n", data8);
+
+ sensor_cis_dump_registers(subdev, sensor_gm1sp_setfiles[0], sensor_gm1sp_setfile_sizes[0]);
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_gm1sp_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_gm1sp_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_gm1sp_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_gm1sp_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_gm1sp_global, sensor_gm1sp_global_size);
+ if (ret < 0) {
+ err("sensor_gm1sp_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_gm1sp_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ return -EINVAL;
+ }
+
+ if (cis->gyro_self_test_step == 1) {
+ mode = GYRO_SELF_TEST_STEP1_SET_NUM;
+ info("%d setfile will be set for gyro self test step1\n", mode);
+ } else if (cis->gyro_self_test_step == 2) {
+ mode = GYRO_SELF_TEST_STEP2_SET_NUM;
+ info("%d setfile will be set for gyro self test step2\n", mode);
+ }
+
+ sensor_gm1sp_cis_data_calculation(sensor_gm1sp_pllinfos[mode], cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_gm1sp_setfiles[mode], sensor_gm1sp_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_gm1sp_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_mode_change_throttling(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ sensor_gm1sp_cis_data_calculation(sensor_gm1sp_pllinfo_throttling, cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_cis_set_registers(subdev, sensor_gm1sp_setfile_throttling,
+ sizeof(sensor_gm1sp_setfile_throttling) / sizeof(sensor_gm1sp_setfile_throttling[0]));
+ if (ret < 0) {
+ err("sensor_gm1sp_set_registers fail!!");
+ goto p_err;
+ }
+
+ cis->cis_data->frame_time = (cis->cis_data->line_readOut_time * cis->cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis->cis_data->frame_time, cis->cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "[%s] throttling mode changed\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+/* Deprecated */
+int sensor_gm1sp_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ return 0;
+}
+
+int sensor_gm1sp_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u32 err_check = 0;
+ u8 read_val;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream on");
+
+#ifdef DEBUG_GM1SP_PLL
+ {
+ u16 pll;
+
+ fimc_is_sensor_read16(client, 0x0300, &pll);
+ dbg_sensor(1, "______ vt_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0302, &pll);
+ dbg_sensor(1, "______ vt_sys_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0304, &pll);
+ dbg_sensor(1, "______ pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0306, &pll);
+ dbg_sensor(1, "______ pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0308, &pll);
+ dbg_sensor(1, "______ op_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030a, &pll);
+ dbg_sensor(1, "______ op_sys_clk_div(%x)\n", pll);
+
+ fimc_is_sensor_read16(client, 0x030c, &pll);
+ dbg_sensor(1, "______ secnd_pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030e, &pll);
+ dbg_sensor(1, "______ secnd_pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0340, &pll);
+ dbg_sensor(1, "______ frame_length_lines(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0342, &pll);
+ dbg_sensor(1, "______ line_length_pck(%x)\n", pll);
+ }
+#endif
+ /* Sensor stream on */
+ fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+
+ /* In second test step, get x,y,z gyro val by i2c transfer */
+ if (cis->gyro_self_test_step == 2) {
+ fimc_is_sensor_write16(client, 0x602c, 0x2000);
+ fimc_is_sensor_write16(client, 0x602e, 0x604e);
+ ret = fimc_is_sensor_read8(client, 0x6f12, &(read_val));
+ if (ret) {
+ err_check++;
+ err("fail to get gyro test x value\n");
+ } else {
+ cis->gyro_test_val.x = (u32)read_val;
+ }
+
+ fimc_is_sensor_write16(client, 0x602e, 0x604f);
+ ret = fimc_is_sensor_read8(client, 0x6f12, &(read_val));
+ if (ret) {
+ err_check++;
+ err("fail to get gyro test y value\n");
+ } else {
+ cis->gyro_test_val.y = (u32)read_val;
+ }
+
+ fimc_is_sensor_write16(client, 0x602e, 0x6050);
+ ret = fimc_is_sensor_read8(client, 0x6f12, &(read_val));
+ if (ret) {
+ err_check++;
+ err("fail to get gyro test z value\n");
+ } else {
+ cis->gyro_test_val.z = (u32)read_val;
+ }
+
+ if (!err_check) {
+ cis->gyro_test_val.state = SENSOR_GYRO_INFO_STATE_SUCCESS;
+ info("success to get gyro test x(%d), y(%d), z(%d) value\n",
+ cis->gyro_test_val.x, cis->gyro_test_val.y, cis->gyro_test_val.z);
+ } else {
+ cis->gyro_test_val.state = SENSOR_GYRO_INFO_STATE_FAIL;
+ err("Fail to get gyro test value\n");
+ }
+ }
+
+ /* WDR */
+ if (fimc_is_vender_wdr_mode_on(cis_data))
+ fimc_is_sensor_write8(client, 0x021E, 0x01);
+ else
+ fimc_is_sensor_write8(client, 0x021E, 0x00);
+
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ ret = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (ret < 0)
+ err("group_param_hold_func failed at stream off");
+
+ /* Sensor stream off */
+ fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u64 numerator;
+ u8 lte_shifter;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ lte_shifter = cis->long_term_mode.sen_strm_off_on_enable ?
+ SENSOR_GM1SP_LONG_TERM_EXPOSURE_SHITFER : 0;
+
+ numerator = (u64)cis_data->pclk * target_exposure->long_val;
+ long_coarse_int = (numerator - min_fine_int)
+ /(1000 * 1000) / line_length_pck / (1 << lte_shifter);
+ numerator = (u64)cis_data->pclk * target_exposure->short_val;
+ short_coarse_int = (numerator - min_fine_int)
+ /(1000 * 1000) / line_length_pck / (1 << lte_shifter);
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Short exposure */
+ ret = fimc_is_sensor_write16(client, 0x0202, short_coarse_int);
+ if (ret < 0)
+ goto p_err;
+
+ /* Long exposure */
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ ret = fimc_is_sensor_write16(client, 0x0226, long_coarse_int);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk(%lld), line_length_pck(%d), min_fine_int (%d)\n",
+ cis->id, __func__, cis_data->sen_vsync_count, cis_data->pclk, line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x), long_coarse_int %#x, short_coarse_int %#x\n",
+ cis->id, __func__, cis_data->sen_vsync_count, cis_data->frame_length_lines,
+ long_coarse_int, short_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update here? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_gm1sp_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+ u64 numerator;
+ u8 lte_shifter;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ lte_shifter = cis->long_term_mode.sen_strm_off_on_enable ?
+ SENSOR_GM1SP_LONG_TERM_EXPOSURE_SHITFER : 0;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * input_exposure_time;
+ frame_length_lines = (u16)((numerator / (1000 * 1000))/ line_length_pck / (1 << lte_shifter));
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ numerator = (u64)frame_length_lines * line_length_pck;
+ frame_duration = (numerator << lte_shifter) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time,
+ frame_duration, cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+ u64 numerator;
+ u32 max_coarse_integration_time = 0;
+ u8 lte_shifter;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ lte_shifter = cis->long_term_mode.sen_strm_off_on_enable ?
+ SENSOR_GM1SP_LONG_TERM_EXPOSURE_SHITFER : 0;
+
+ line_length_pck = cis_data->line_length_pck;
+ numerator = (u64)cis_data->pclk * frame_duration;
+ frame_length_lines = (u16)((numerator / line_length_pck) / (1000 * 1000) / (1 << lte_shifter));
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, cis_data->pclk, frame_duration, line_length_pck, frame_length_lines);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+
+ max_coarse_integration_time = cis_data->frame_length_lines - cis_data->max_margin_coarse_integration_time;
+ cis_data->max_coarse_integration_time = max_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_gm1sp_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ analog_gain = (u16)sensor_cis_calc_again_code(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0204, analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_analog_gain[0] = 0x20;
+ cis_data->min_analog_gain[1] = sensor_cis_calc_again_permile(cis_data->min_analog_gain[0]);
+
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_analog_gain[0], cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_analog_gain[0] = 0x200;
+ cis_data->max_analog_gain[1] = sensor_cis_calc_again_permile(cis_data->max_analog_gain[0]);
+
+ *max_again = cis_data->max_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_analog_gain[0], cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u16 dgains[4] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us, long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, dgain->long_val,
+ dgain->short_val, long_gain, short_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ dgains[0] = dgains[1] = dgains[2] = dgains[3] = short_gain;
+ /* Short digital gain */
+ ret = fimc_is_sensor_write16_array(client, 0x020E, dgains, 4);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_gm1sp_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_digital_gain[0] = 0x100;
+ cis_data->min_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->min_digital_gain[0]);
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->min_digital_gain[0], cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_digital_gain[0] = 0x8000;
+ cis_data->max_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->max_digital_gain[0]);
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__,
+ cis_data->max_digital_gain[0], cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+static int sensor_gm1sp_cis_set_dual_master_setting(struct fimc_is_cis *cis)
+{
+ int ret = 0;
+ struct i2c_client *client;
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ return -EINVAL;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ /* page 0x2000*/
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x4000);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x6028, 0x4000, ret);
+ /* dual sync enable */
+ ret = fimc_is_sensor_write16(client, 0x0A70, 0x0001);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x0A70, 0x0001, ret);
+ /* master mode select */
+ ret = fimc_is_sensor_write16(client, 0x0A72, 0x0100);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x0A72, 0x0100, ret);
+ /* page 0x2000*/
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x6028, 0x2000, ret);
+ /* dual sync out index */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x106A);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x602A, 0x106A, ret);
+ ret = fimc_is_sensor_write16(client, 0x6F12, 0x0003);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x6F12, 0x0003, ret);
+ /* master vsync out sel */
+ ret = fimc_is_sensor_write16(client, 0x602A, 0x2BC2);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x602A, 0x2BC2, ret);
+ ret = fimc_is_sensor_write16(client, 0x6F12, 0x0003);
+ if (unlikely(ret))
+ err("i2c treansfer fail addr(%x), val(%x), ret(%d)\n", 0x6F12, 0x0003, ret);
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_gm1sp_cis_set_dual_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ switch (cis->dual_sync_mode) {
+ case DUAL_SYNC_MASTER:
+ ret = sensor_gm1sp_cis_set_dual_master_setting(cis);
+ if (ret)
+ err("gm1sp dual master setting fail");
+ break;
+ case DUAL_SYNC_SLAVE:
+ break;
+ default:
+ err("invalid cis->dual_sync_mode(%d)\n", cis->dual_sync_mode);
+ ret = -EINVAL;
+ }
+
+p_err:
+ return ret;
+}
+
+int sensor_gm1sp_cis_long_term_exposure(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct fimc_is_long_term_expo_mode *lte_mode;
+
+ WARN_ON(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ lte_mode = &cis->long_term_mode;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* LTE mode or normal mode set */
+ if (lte_mode->sen_strm_off_on_enable) {
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0702, 0x0600);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0704, 0x0600);
+ } else {
+ ret |= fimc_is_sensor_write16(cis->client, 0xFCFC, 0x4000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0702, 0x0000);
+ ret |= fimc_is_sensor_write16(cis->client, 0x0704, 0x0000);
+ }
+
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ info("%s enable(%d)", __func__, lte_mode->sen_strm_off_on_enable);
+
+ if (ret < 0) {
+ pr_err("ERR[%s]: LTE register setting fail\n", __func__);
+ return ret;
+ }
+
+ return ret;
+}
+static struct fimc_is_cis_ops cis_ops = {
+ .cis_init = sensor_gm1sp_cis_init,
+ .cis_log_status = sensor_gm1sp_cis_log_status,
+ .cis_group_param_hold = sensor_gm1sp_cis_group_param_hold,
+ .cis_set_global_setting = sensor_gm1sp_cis_set_global_setting,
+ .cis_mode_change = sensor_gm1sp_cis_mode_change,
+ .cis_set_size = sensor_gm1sp_cis_set_size,
+ .cis_stream_on = sensor_gm1sp_cis_stream_on,
+ .cis_stream_off = sensor_gm1sp_cis_stream_off,
+ .cis_set_exposure_time = sensor_gm1sp_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_gm1sp_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_gm1sp_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_gm1sp_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_gm1sp_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_gm1sp_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_gm1sp_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_gm1sp_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_gm1sp_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_gm1sp_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_gm1sp_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_gm1sp_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_gm1sp_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_gm1sp_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_gm1sp_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
+ .cis_check_rev = sensor_gm1sp_cis_check_rev,
+ .cis_factory_test = sensor_cis_factory_test,
+ .cis_set_dual_setting = sensor_gm1sp_cis_set_dual_setting,
+ .cis_set_long_term_exposure = sensor_gm1sp_cis_long_term_exposure,
+ .cis_mode_change_throttling = sensor_gm1sp_cis_mode_change_throttling,
+};
+
+static int cis_gm1sp_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id = 0;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("sensor id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_S5KGM1SP);
+ if (!sensor_peri) {
+ probe_info("sensor peri is net yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ cis = &sensor_peri->cis;
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_S5KGM1SP;
+ cis->subdev = subdev_cis;
+ cis->device = 0;
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ cis->cis_ops = &cis_ops;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_GR_BG;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ if (of_property_read_bool(dnode, "dual_sync_mode")) {
+ ret = of_property_read_u32(dnode, "dual_sync_mode", &cis->dual_sync_mode);
+ if (ret)
+ warn("dual_sync_mode read is fail(%d)", ret);
+ } else {
+ cis->dual_sync_mode = DUAL_SYNC_NONE;
+ }
+
+ probe_info("%s dual_sync_mode %d\n", __func__, cis->dual_sync_mode);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ if (strcmp(setfile, "default") == 0 ||
+ strcmp(setfile, "setA") == 0) {
+ probe_info("%s setfile_A\n", __func__);
+ sensor_gm1sp_global = sensor_gm1sp_setfile_A_Global;
+ sensor_gm1sp_global_size = ARRAY_SIZE(sensor_gm1sp_setfile_A_Global);
+ sensor_gm1sp_setfiles = sensor_gm1sp_setfiles_A;
+ sensor_gm1sp_setfile_sizes = sensor_gm1sp_setfile_A_sizes;
+ sensor_gm1sp_pllinfos = sensor_gm1sp_pllinfos_A;
+ sensor_gm1sp_max_setfile_num = ARRAY_SIZE(sensor_gm1sp_setfiles_A);
+ } else if (strcmp(setfile, "setB") == 0) {
+ probe_info("%s setfile_B\n", __func__);
+ sensor_gm1sp_global = sensor_gm1sp_setfile_B_Global;
+ sensor_gm1sp_global_size = ARRAY_SIZE(sensor_gm1sp_setfile_B_Global);
+ sensor_gm1sp_setfiles = sensor_gm1sp_setfiles_B;
+ sensor_gm1sp_setfile_sizes = sensor_gm1sp_setfile_B_sizes;
+ sensor_gm1sp_pllinfos = sensor_gm1sp_pllinfos_B;
+ sensor_gm1sp_max_setfile_num = ARRAY_SIZE(sensor_gm1sp_setfiles_B);
+
+ /* throttling setting */
+ sensor_gm1sp_setfile_throttling = sensor_gm1sp_setfile_B_4000x3000_15fps;
+ sensor_gm1sp_pllinfo_throttling = &sensor_gm1sp_pllinfo_B_4000x3000_15fps;
+ } else {
+ err("%s setfile index out of bound, take default (setfile_A)", __func__);
+ sensor_gm1sp_global = sensor_gm1sp_setfile_A_Global;
+ sensor_gm1sp_global_size = ARRAY_SIZE(sensor_gm1sp_setfile_A_Global);
+ sensor_gm1sp_setfiles = sensor_gm1sp_setfiles_A;
+ sensor_gm1sp_setfile_sizes = sensor_gm1sp_setfile_A_sizes;
+ sensor_gm1sp_pllinfos = sensor_gm1sp_pllinfos_A;
+ sensor_gm1sp_max_setfile_num = ARRAY_SIZE(sensor_gm1sp_setfiles_A);
+ }
+
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
+ v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_gm1sp_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-gm1sp",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_gm1sp_match);
+
+static const struct i2c_device_id sensor_cis_gm1sp_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_gm1sp_driver = {
+ .probe = cis_gm1sp_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_gm1sp_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_gm1sp_idt
+};
+
+static int __init sensor_cis_gm1sp_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_gm1sp_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_gm1sp_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_gm1sp_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_GM1SP_H
+#define FIMC_IS_CIS_GM1SP_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_GM1SP_MAX_WIDTH (4000)
+#define SENSOR_GM1SP_MAX_HEIGHT (3000)
+
+/* TODO: Check below values are valid */
+#define SENSOR_GM1SP_FINE_INTEGRATION_TIME_MIN 0x0
+#define SENSOR_GM1SP_FINE_INTEGRATION_TIME_MAX 0x0 /* Not used */
+#define SENSOR_GM1SP_COARSE_INTEGRATION_TIME_MIN 0x2 /* TODO */
+#define SENSOR_GM1SP_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x2 /* TODO */
+
+#define SENSOR_GM1SP_LONG_TERM_EXPOSURE_SHITFER (6)
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+#define GYRO_SELF_TEST_STEP1_SET_NUM (4)
+#define GYRO_SELF_TEST_STEP2_SET_NUM (5)
+
+#endif
+
.cis_get_max_digital_gain = sensor_imx219_cis_get_max_digital_gain,
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_imx219_probe(struct i2c_client *client,
sensor_imx219_max_setfile_num = sizeof(sensor_imx219_setfiles_A) / sizeof(sensor_imx219_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_get_max_digital_gain = sensor_imx241_cis_get_max_digital_gain,
.cis_compensate_gain_for_extremely_br = sensor_imx241_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_imx241_probe(struct i2c_client *client,
sensor_imx241_max_setfile_num = sizeof(sensor_imx241_setfiles_A) / sizeof(sensor_imx241_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_get_max_digital_gain = sensor_imx258_cis_get_max_digital_gain,
.cis_compensate_gain_for_extremely_br = sensor_imx258_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_imx258_probe(struct i2c_client *client,
sensor_imx258_max_setfile_num = sizeof(sensor_imx258_setfiles_A) / sizeof(sensor_imx258_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
.cis_data_calculation = sensor_imx260_cis_data_calc,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_imx260_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
ret = of_property_read_string(dnode, "setfile", &setfile);
if (ret) {
err("setfile index read fail(%d), take default setfile!!", ret);
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
.cis_data_calculation = sensor_imx320_cis_data_calc,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_imx320_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
ret = of_property_read_string(dnode, "setfile", &setfile);
if (ret) {
err("setfile index read fail(%d), take default setfile!!", ret);
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_data_calculation = sensor_imx333_cis_data_calc,
.cis_set_long_term_exposure = sensor_imx333_cis_long_term_exposure,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_imx333_probe(struct i2c_client *client,
snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
ret = of_property_read_string(dnode, "setfile", &setfile);
if (ret) {
err("setfile index read fail(%d), take default setfile!!", ret);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_IMX576_SET_A_H
+#define FIMC_IS_CIS_IMX576_SET_A_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-imx576.h"
+
+// Reference Version : 'IMX576-AAKH5_SAM-Set-26MHz-DPHY_RegisterSetting_ver2.00-9.00_MP_180712.xlsx'
+
+/*
+ * [Mode Information]
+ * - Global Setting -
+ *
+ * - 2X2 BINNING -
+ * [0] REG_A: Single Still Preview (4:3) : 2832x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [1] REG_B: Single Still Preview (16:9) : 2832x1592@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [2] REG_C: Single Still Preview (18.5:9): 2832x1376@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [3] REG_D: Single Still Preview (1:1) : 2124x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - QBC_HDR -
+ * [4] REG_E: Single Still 3HDR (4:3) : 2832x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [5] REG_F: Single Still 3HDR (16:9) : 2832x1592@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [6] REG_G: Single Still 3HDR (18.5:9) : 2832x1376@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [7] REG_H: Single Still 3HDR (1:1) : 2124x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - QBC_REMOSAIC -
+ * [8] REG_I: Single Still Capture (4:3) : 5664X4248@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [9] REG_J: Single Still Capture (16:9) : 5664X3184@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [10]REG_K: Single Still Capture (18.5:9): 5664X2752@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [11]REG_L: Single Still Capture (1:1) : 4248X4248@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - Super Slow Motion (SSM) -
+ * [12]REG_M: Super Slow Motion (16:9) : 1872x1052@240, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [13]REG_N: Super Slow Motion (16:9) : 1920x1080@120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [14]REG_O: Super Slow Motion (16:9) : 1280x720 @240, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [15]REG_U: Super Slow Motion (16:9) : 1280x720 @120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - FAST AE -
+ * [16]REG_R: Single Preview Fast(4:3) : 2832x2124@117, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [17]REG_S: Single Preview Fast(4:3) : 2832x2124@ 60, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [18]REG_T: Single Preview Fast(16:9) : 2832x1592@120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ */
+
+const u32 sensor_imx576_setfile_A_Global[] = {
+ //External Clock Setting
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ //Register version
+ 0x3C7E, 0x04, 0x01,
+ 0x3C7F, 0x09, 0x01,
+ //Global Setting
+ 0x380C, 0x00, 0x01,
+ 0x3C00, 0x10, 0x01,
+ 0x3C01, 0x10, 0x01,
+ 0x3C02, 0x10, 0x01,
+ 0x3C03, 0x10, 0x01,
+ 0x3C04, 0x10, 0x01,
+ 0x3C05, 0x01, 0x01,
+ 0x3C08, 0xFF, 0x01,
+ 0x3C09, 0xFF, 0x01,
+ 0x3C0A, 0x01, 0x01,
+ 0x3C0D, 0xFF, 0x01,
+ 0x3C0E, 0xFF, 0x01,
+ 0x3C0F, 0x20, 0x01,
+ 0x3F89, 0x01, 0x01,
+ 0x4B8E, 0x18, 0x01,
+ 0x4B8F, 0x10, 0x01,
+ 0x4BA8, 0x08, 0x01,
+ 0x4BAA, 0x08, 0x01,
+ 0x4BAB, 0x08, 0x01,
+ 0x4BC9, 0x10, 0x01,
+ 0x5511, 0x01, 0x01,
+ 0x560B, 0x5B, 0x01,
+ 0x56A7, 0x60, 0x01,
+ 0x5B3B, 0x60, 0x01,
+ 0x5BA7, 0x60, 0x01,
+ 0x6002, 0x00, 0x01,
+ 0x6014, 0x01, 0x01,
+ 0x6118, 0x0A, 0x01,
+ 0x6122, 0x0A, 0x01,
+ 0x6128, 0x0A, 0x01,
+ 0x6132, 0x0A, 0x01,
+ 0x6138, 0x0A, 0x01,
+ 0x6142, 0x0A, 0x01,
+ 0x6148, 0x0A, 0x01,
+ 0x6152, 0x0A, 0x01,
+ 0x617B, 0x04, 0x01,
+ 0x617E, 0x04, 0x01,
+ 0x6187, 0x04, 0x01,
+ 0x618A, 0x04, 0x01,
+ 0x6193, 0x04, 0x01,
+ 0x6196, 0x04, 0x01,
+ 0x619F, 0x04, 0x01,
+ 0x61A2, 0x04, 0x01,
+ 0x61AB, 0x04, 0x01,
+ 0x61AE, 0x04, 0x01,
+ 0x61B7, 0x04, 0x01,
+ 0x61BA, 0x04, 0x01,
+ 0x61C3, 0x04, 0x01,
+ 0x61C6, 0x04, 0x01,
+ 0x61CF, 0x04, 0x01,
+ 0x61D2, 0x04, 0x01,
+ 0x61DB, 0x04, 0x01,
+ 0x61DE, 0x04, 0x01,
+ 0x61E7, 0x04, 0x01,
+ 0x61EA, 0x04, 0x01,
+ 0x61F3, 0x04, 0x01,
+ 0x61F6, 0x04, 0x01,
+ 0x61FF, 0x04, 0x01,
+ 0x6202, 0x04, 0x01,
+ 0x620B, 0x04, 0x01,
+ 0x620E, 0x04, 0x01,
+ 0x6217, 0x04, 0x01,
+ 0x621A, 0x04, 0x01,
+ 0x6223, 0x04, 0x01,
+ 0x6226, 0x04, 0x01,
+ 0x6B0B, 0x02, 0x01,
+ 0x6B0C, 0x01, 0x01,
+ 0x6B0D, 0x05, 0x01,
+ 0x6B0F, 0x04, 0x01,
+ 0x6B10, 0x02, 0x01,
+ 0x6B11, 0x06, 0x01,
+ 0x6B12, 0x03, 0x01,
+ 0x6B13, 0x07, 0x01,
+ 0x6B14, 0x0D, 0x01,
+ 0x6B15, 0x09, 0x01,
+ 0x6B16, 0x0C, 0x01,
+ 0x6B17, 0x08, 0x01,
+ 0x6B18, 0x0E, 0x01,
+ 0x6B19, 0x0A, 0x01,
+ 0x6B1A, 0x0F, 0x01,
+ 0x6B1B, 0x0B, 0x01,
+ 0x6B1C, 0x01, 0x01,
+ 0x6B1D, 0x05, 0x01,
+ 0x6B1F, 0x04, 0x01,
+ 0x6B20, 0x02, 0x01,
+ 0x6B21, 0x06, 0x01,
+ 0x6B22, 0x03, 0x01,
+ 0x6B23, 0x07, 0x01,
+ 0x6B24, 0x0D, 0x01,
+ 0x6B25, 0x09, 0x01,
+ 0x6B26, 0x0C, 0x01,
+ 0x6B27, 0x08, 0x01,
+ 0x6B28, 0x0E, 0x01,
+ 0x6B29, 0x0A, 0x01,
+ 0x6B2A, 0x0F, 0x01,
+ 0x6B2B, 0x0B, 0x01,
+ 0x7948, 0x01, 0x01,
+ 0x7949, 0x06, 0x01,
+ 0x794B, 0x04, 0x01,
+ 0x794C, 0x04, 0x01,
+ 0x794D, 0x3A, 0x01,
+ 0x7951, 0x00, 0x01,
+ 0x7952, 0x01, 0x01,
+ 0x7955, 0x00, 0x01,
+ 0x9004, 0x10, 0x01,
+ 0x9200, 0xA0, 0x01,
+ 0x9201, 0xA7, 0x01,
+ 0x9202, 0xA0, 0x01,
+ 0x9203, 0xAA, 0x01,
+ 0x9204, 0xA0, 0x01,
+ 0x9205, 0xAD, 0x01,
+ 0x9206, 0xA0, 0x01,
+ 0x9207, 0xB0, 0x01,
+ 0x9208, 0xA0, 0x01,
+ 0x9209, 0xB3, 0x01,
+ 0x920A, 0xB7, 0x01,
+ 0x920B, 0x34, 0x01,
+ 0x920C, 0xB7, 0x01,
+ 0x920D, 0x36, 0x01,
+ 0x920E, 0xB7, 0x01,
+ 0x920F, 0x37, 0x01,
+ 0x9210, 0xB7, 0x01,
+ 0x9211, 0x38, 0x01,
+ 0x9212, 0xB7, 0x01,
+ 0x9213, 0x39, 0x01,
+ 0x9214, 0xB7, 0x01,
+ 0x9215, 0x3A, 0x01,
+ 0x9216, 0xB7, 0x01,
+ 0x9217, 0x3C, 0x01,
+ 0x9218, 0xB7, 0x01,
+ 0x9219, 0x3D, 0x01,
+ 0x921A, 0xB7, 0x01,
+ 0x921B, 0x3E, 0x01,
+ 0x921C, 0xB7, 0x01,
+ 0x921D, 0x3F, 0x01,
+ 0x921E, 0x7F, 0x01,
+ 0x921F, 0x77, 0x01,
+ 0x99AF, 0x0F, 0x01,
+ 0x99B0, 0x0F, 0x01,
+ 0x99B1, 0x0F, 0x01,
+ 0x99B2, 0x0F, 0x01,
+ 0x99B3, 0x0F, 0x01,
+ 0x99E1, 0x0F, 0x01,
+ 0x99E2, 0x0F, 0x01,
+ 0x99E3, 0x0F, 0x01,
+ 0x99E4, 0x0F, 0x01,
+ 0x99E5, 0x0F, 0x01,
+ 0x99E6, 0x0F, 0x01,
+ 0x99E7, 0x0F, 0x01,
+ 0x99E8, 0x0F, 0x01,
+ 0x99E9, 0x0F, 0x01,
+ 0x99EA, 0x0F, 0x01,
+ 0xE286, 0x31, 0x01,
+ 0xE2A6, 0x32, 0x01,
+ 0xE2C6, 0x33, 0x01,
+ //Image Quality adjustment setting
+ 0x4038, 0x00, 0x01,
+ 0x9856, 0xA0, 0x01,
+ 0x9857, 0x78, 0x01,
+ 0x9858, 0x64, 0x01,
+ 0x986E, 0x64, 0x01,
+ 0x9870, 0x3C, 0x01,
+ 0x993A, 0x0E, 0x01,
+ 0x993B, 0x0E, 0x01,
+ 0x9953, 0x08, 0x01,
+ 0x9954, 0x08, 0x01,
+ 0x996B, 0x0F, 0x01,
+ 0x996D, 0x0F, 0x01,
+ 0x996F, 0x0F, 0x01,
+ 0x998E, 0x0F, 0x01,
+ 0xA101, 0x01, 0x01,
+ 0xA103, 0x01, 0x01,
+ 0xA105, 0x01, 0x01,
+ 0xA107, 0x01, 0x01,
+ 0xA109, 0x01, 0x01,
+ 0xA10B, 0x01, 0x01,
+ 0xA10D, 0x01, 0x01,
+ 0xA10F, 0x01, 0x01,
+ 0xA111, 0x01, 0x01,
+ 0xA113, 0x01, 0x01,
+ 0xA115, 0x01, 0x01,
+ 0xA117, 0x01, 0x01,
+ 0xA119, 0x01, 0x01,
+ 0xA11B, 0x01, 0x01,
+ 0xA11D, 0x01, 0x01,
+ 0xAA58, 0x00, 0x01,
+ 0xAA59, 0x01, 0x01,
+ 0xAB03, 0x10, 0x01,
+ 0xAB04, 0x10, 0x01,
+ 0xAB05, 0x10, 0x01,
+ 0xAD6A, 0x03, 0x01,
+ 0xAD6B, 0xFF, 0x01,
+ 0xAD77, 0x00, 0x01,
+ 0xAD82, 0x03, 0x01,
+ 0xAD83, 0xFF, 0x01,
+ 0xAE06, 0x04, 0x01,
+ 0xAE07, 0x16, 0x01,
+ 0xAE08, 0xFF, 0x01,
+ 0xAE09, 0x04, 0x01,
+ 0xAE0A, 0x16, 0x01,
+ 0xAE0B, 0xFF, 0x01,
+ 0xAF01, 0x04, 0x01,
+ 0xAF03, 0x0A, 0x01,
+ 0xAF05, 0x18, 0x01,
+ 0xB048, 0x0A, 0x01,
+};
+
+//[0] REG_A: Single Still Preview (4:3) : 2832x2124@30
+const u32 sensor_imx576_setfile_A_2X2BIN_2832x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+const u32 sensor_imx576_setfile_A_2X2BIN_2832x1592_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x0A, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x06, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[2] REG_C: Single Still Preview (18.5:9): 2832x1376@30
+const u32 sensor_imx576_setfile_A_2X2BIN_2832x1376_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x76, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x05, 0x01,
+ 0x040F, 0x60, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x05, 0x01,
+ 0x034F, 0x60, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[3] REG_D: Single Still Preview (1:1) : 2124x2124@30
+const u32 sensor_imx576_setfile_A_2X2BIN_2124x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0x7A, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x08, 0x01,
+ 0x040D, 0x4C, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x08, 0x01,
+ 0x034D, 0x4C, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0X00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[4] REG_E: Single Still 3HDR (4:3) : 2832x2124@30
+const u32 sensor_imx576_setfile_A_QBCHDR_2832x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[5] REG_F: Single Still 3HDR (16:9) : 2832x1592@30
+const u32 sensor_imx576_setfile_A_QBCHDR_2832x1592_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x0A, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x06, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[6] REG_G: Single Still 3HDR (18.5:9) : 2832x1376@30
+const u32 sensor_imx576_setfile_A_QBCHDR_2832x1376_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x76, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x05, 0x01,
+ 0x040F, 0x60, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x05, 0x01,
+ 0x034F, 0x60, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[7] REG_H: Single Still 3HDR (1:1) : 2124x2124@30
+const u32 sensor_imx576_setfile_A_QBCHDR_2124x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0x7A, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x08, 0x01,
+ 0x040D, 0x4C, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x08, 0x01,
+ 0x034D, 0x4C, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[8] REG_I: Single Still Capture (4:3) : 5664X4248@30
+const u32 sensor_imx576_setfile_A_5664X4248_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x30, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x16, 0x01,
+ 0x040D, 0x20, 0x01,
+ 0x040E, 0x10, 0x01,
+ 0x040F, 0x98, 0x01,
+ //Output Size Setting
+ 0x034C, 0x16, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x10, 0x01,
+ 0x034F, 0x98, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[9] REG_J: Single Still Capture (16:9) : 5664X3184@30
+const u32 sensor_imx576_setfile_A_5664X3184_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x30, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0x14, 0x01,
+ 0x040C, 0x16, 0x01,
+ 0x040D, 0x20, 0x01,
+ 0x040E, 0x0C, 0x01,
+ 0x040F, 0x70, 0x01,
+ //Output Size Setting
+ 0x034C, 0x16, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x0C, 0x01,
+ 0x034F, 0x70, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[10]REG_K: Single Still Capture (18.5:9): 5664X2752@30
+const u32 sensor_imx576_setfile_A_5664X2752_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x30, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0xEC, 0x01,
+ 0x040C, 0x16, 0x01,
+ 0x040D, 0x20, 0x01,
+ 0x040E, 0x0A, 0x01,
+ 0x040F, 0xC0, 0x01,
+ //Output Size Setting
+ 0x034C, 0x16, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x0A, 0x01,
+ 0x034F, 0xC0, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[11]REG_L: Single Still Capture (1:1) : 4248X4248@30
+const u32 sensor_imx576_setfile_A_4248X4248_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x02, 0x01,
+ 0x0409, 0xF4, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x10, 0x01,
+ 0x040D, 0x98, 0x01,
+ 0x040E, 0x10, 0x01,
+ 0x040F, 0x98, 0x01,
+ //Output Size Setting
+ 0x034C, 0x10, 0x01,
+ 0x034D, 0x98, 0x01,
+ 0x034E, 0x10, 0x01,
+ 0x034F, 0x98, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[12]REG_M: Super Slow Motion (16:9) : 1872x1052@240
+const u32 sensor_imx576_setfile_A_1872x1052_240fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x04, 0x01,
+ 0x0341, 0x53, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x04, 0x01,
+ 0x0347, 0x50, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x0C, 0x01,
+ 0x034B, 0x87, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0xF8, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x07, 0x01,
+ 0x040D, 0x50, 0x01,
+ 0x040E, 0x04, 0x01,
+ 0x040F, 0x1C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x07, 0x01,
+ 0x034D, 0x50, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0x1C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x43, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x04, 0x01,
+ 0x0203, 0x14, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0x05, 0x01,
+ 0x3FE0, 0x02, 0x01,
+ 0x3FE1, 0x0A, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[13]REG_N: Super Slow Motion (16:9) : 1920x1080@120
+const u32 sensor_imx576_setfile_A_1920x1080_120fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0xE0, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0x0A, 0x01,
+ 0x040C, 0x07, 0x01,
+ 0x040D, 0x80, 0x01,
+ 0x040E, 0x04, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x07, 0x01,
+ 0x034D, 0x80, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[14]REG_O: Super Slow Motion (16:9) : 1280x720 @240
+const u32 sensor_imx576_setfile_A_1280x720_240fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x04, 0x01,
+ 0x0341, 0x53, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x04, 0x01,
+ 0x0347, 0x50, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x0C, 0x01,
+ 0x034B, 0x87, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x03, 0x01,
+ 0x0409, 0x20, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0xA6, 0x01,
+ 0x040C, 0x05, 0x01,
+ 0x040D, 0x00, 0x01,
+ 0x040E, 0x02, 0x01,
+ 0x040F, 0xD0, 0x01,
+ //Output Size Setting
+ 0x034C, 0x05, 0x01,
+ 0x034D, 0x00, 0x01,
+ 0x034E, 0x02, 0x01,
+ 0x034F, 0xD0, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x43, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x04, 0x01,
+ 0x0203, 0x14, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0x05, 0x01,
+ 0x3FE0, 0x02, 0x01,
+ 0x3FE1, 0x0A, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[15]REG_U: Super Slow Motion (16:9) : 1280x720 @120
+const u32 sensor_imx576_setfile_A_1280x720_120fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x03, 0x01,
+ 0x0409, 0x20, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0xBE, 0x01,
+ 0x040C, 0x05, 0x01,
+ 0x040D, 0x00, 0x01,
+ 0x040E, 0x02, 0x01,
+ 0x040F, 0xD0, 0x01,
+ //Output Size Setting
+ 0x034C, 0x05, 0x01,
+ 0x034D, 0x00, 0x01,
+ 0x034E, 0x02, 0x01,
+ 0x034F, 0xD0, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0X00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[16]REG_R: Single Preview Fast(4:3) : 2832x2124@117
+const u32 sensor_imx576_setfile_A_2832x2124_117fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x80, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x37, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[17]REG_S: Single Preview Fast(4:3) : 2832x2124@ 60
+const u32 sensor_imx576_setfile_A_2832x2124_60fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[18]REG_T: Single Preview Fast(16:9) : 2832x1592@120
+const u32 sensor_imx576_setfile_A_2832x1592_120fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x54, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x4C, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0x8B, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0xF4, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x06, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x37, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0X00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[0] REG_A: Single Still Preview (4:3) : 2832x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_2X2BIN_2832x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate = OPSYCK */
+ 103350000 * 4, /* pclk = VTPXCK x 4 */
+ 2180, /* frame_length_lines */
+ 6320, /* line_length_pck */
+};
+
+//[1] REG_B: Single Still Preview (16:9) : 2832x1592@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_2X2BIN_2832x1592_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 103350000 * 4,
+ 2180,
+ 6320,
+};
+
+//[2] REG_C: Single Still Preview (18.5:9): 2832x1376@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_2X2BIN_2832x1376_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 103350000 * 4,
+ 2180,
+ 6320,
+};
+
+//[3] REG_D: Single Still Preview (1:1) : 2124x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_2X2BIN_2124x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 103350000 * 4,
+ 2180,
+ 6320,
+};
+
+//[4] REG_E: Single Still 3HDR (4:3) : 2832x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_QBCHDR_2832x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[5] REG_F: Single Still 3HDR (16:9) : 2832x1592@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_QBCHDR_2832x1592_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[6] REG_G: Single Still 3HDR (18.5:9) : 2832x1376@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_QBCHDR_2832x1376_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[7] REG_H: Single Still 3HDR (1:1) : 2124x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_QBCHDR_2124x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[8] REG_I: Single Still Capture (4:3) : 5664X4248@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_5664x4248_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[9] REG_J: Single Still Capture (16:9) : 5664X3184@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_5664x3184_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[10]REG_K: Single Still Capture (18.5:9): 5664X2752@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_5664x2752_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[11]REG_L: Single Still Capture (1:1) : 4248X4248@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_4248x4248_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[12]REG_M: Super Slow Motion (16:9) : 1872x1052@240
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_1872x1052_240fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 209950000 * 4,
+ 1107,
+ 3160,
+};
+
+//[13]REG_N: Super Slow Motion (16:9) : 1920x1080@120
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_1920x1080_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 206700000 * 4,
+ 2180,
+ 3160,
+};
+
+//[14]REG_O: Super Slow Motion (16:9) : 1280x720 @240
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_1280x720_240fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 209950000 * 4,
+ 1107,
+ 3160,
+};
+
+//[15]REG_U: Super Slow Motion (16:9) : 1280x720 @120
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_1280x720_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 206700000 * 4,
+ 2180,
+ 3160,
+};
+
+//[16]REG_R: Single Preview Fast(4:3) : 2832x2124@118
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_2832x2124_117fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 202150000 * 4,
+ 2176,
+ 3160,
+};
+
+//[17]REG_S: Single Preview Fast(4:3) : 2832x2124@ 60
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_2832x2124_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 206700000 * 4,
+ 2180,
+ 6320,
+};
+
+//[18]REG_T: Single Preview Fast(16:9) : 2832x1592@120
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_A_2832x1592_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 202150000 * 4,
+ 2132,
+ 3160,
+};
+
+static const u32 *sensor_imx576_setfiles_A[] = {
+ sensor_imx576_setfile_A_2X2BIN_2832x2124_30fps,
+ sensor_imx576_setfile_A_2X2BIN_2832x1592_30fps,
+ sensor_imx576_setfile_A_2X2BIN_2832x1376_30fps,
+ sensor_imx576_setfile_A_2X2BIN_2124x2124_30fps,
+ sensor_imx576_setfile_A_QBCHDR_2832x2124_30fps,
+ sensor_imx576_setfile_A_QBCHDR_2832x1592_30fps,
+ sensor_imx576_setfile_A_QBCHDR_2832x1376_30fps,
+ sensor_imx576_setfile_A_QBCHDR_2124x2124_30fps,
+ sensor_imx576_setfile_A_5664X4248_30fps,
+ sensor_imx576_setfile_A_5664X3184_30fps,
+ sensor_imx576_setfile_A_5664X2752_30fps,
+ sensor_imx576_setfile_A_4248X4248_30fps,
+ sensor_imx576_setfile_A_1872x1052_240fps,
+ sensor_imx576_setfile_A_1920x1080_120fps,
+ sensor_imx576_setfile_A_1280x720_240fps,
+ sensor_imx576_setfile_A_1280x720_120fps,
+ sensor_imx576_setfile_A_2832x2124_117fps,
+ sensor_imx576_setfile_A_2832x2124_60fps,
+ sensor_imx576_setfile_A_2832x1592_120fps,
+};
+
+static const u32 sensor_imx576_setfile_A_sizes[] = {
+ ARRAY_SIZE(sensor_imx576_setfile_A_2X2BIN_2832x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_2X2BIN_2832x1592_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_2X2BIN_2832x1376_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_2X2BIN_2124x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_QBCHDR_2832x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_QBCHDR_2832x1592_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_QBCHDR_2832x1376_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_QBCHDR_2124x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_5664X4248_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_5664X3184_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_5664X2752_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_4248X4248_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_1872x1052_240fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_1920x1080_120fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_1280x720_240fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_1280x720_120fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_2832x2124_117fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_2832x2124_60fps),
+ ARRAY_SIZE(sensor_imx576_setfile_A_2832x1592_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_imx576_pllinfos_A[] = {
+ &sensor_imx576_pllinfo_A_2X2BIN_2832x2124_30fps,
+ &sensor_imx576_pllinfo_A_2X2BIN_2832x1592_30fps,
+ &sensor_imx576_pllinfo_A_2X2BIN_2832x1376_30fps,
+ &sensor_imx576_pllinfo_A_2X2BIN_2124x2124_30fps,
+ &sensor_imx576_pllinfo_A_QBCHDR_2832x2124_30fps,
+ &sensor_imx576_pllinfo_A_QBCHDR_2832x1592_30fps,
+ &sensor_imx576_pllinfo_A_QBCHDR_2832x1376_30fps,
+ &sensor_imx576_pllinfo_A_QBCHDR_2124x2124_30fps,
+ &sensor_imx576_pllinfo_A_5664x4248_30fps,
+ &sensor_imx576_pllinfo_A_5664x3184_30fps,
+ &sensor_imx576_pllinfo_A_5664x2752_30fps,
+ &sensor_imx576_pllinfo_A_4248x4248_30fps,
+ &sensor_imx576_pllinfo_A_1872x1052_240fps,
+ &sensor_imx576_pllinfo_A_1920x1080_120fps,
+ &sensor_imx576_pllinfo_A_1280x720_240fps,
+ &sensor_imx576_pllinfo_A_1280x720_120fps,
+ &sensor_imx576_pllinfo_A_2832x2124_117fps,
+ &sensor_imx576_pllinfo_A_2832x2124_60fps,
+ &sensor_imx576_pllinfo_A_2832x1592_120fps,
+};
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_IMX576_SET_B_H
+#define FIMC_IS_CIS_IMX576_SET_B_H
+
+#include "fimc-is-cis.h"
+#include "fimc-is-cis-imx576.h"
+
+// Reference Version : 'IMX576-AAKH5_SAM-Set-26MHz-DPHY_RegisterSetting_ver2.00-8.00_MP0_180712.xlsx'
+
+/*
+ * [Mode Information]
+ * - Global Setting -
+ *
+ * - 2X2 BINNING -
+ * [0] REG_A: Single Still Preview (4:3) : 2832x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [1] REG_B: Single Still Preview (16:9) : 2832x1592@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [2] REG_C: Single Still Preview (18.5:9): 2832x1376@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [3] REG_D: Single Still Preview (1:1) : 2124x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - QBC_HDR -
+ * [4] REG_E: Single Still 3HDR (4:3) : 2832x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [5] REG_F: Single Still 3HDR (16:9) : 2832x1592@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [6] REG_G: Single Still 3HDR (18.5:9) : 2832x1376@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [7] REG_H: Single Still 3HDR (1:1) : 2124x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - QBC_REMOSAIC -
+ * [8] REG_I: Single Still Capture (4:3) : 5664X4248@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [9] REG_J: Single Still Capture (16:9) : 5664X3184@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [10]REG_K: Single Still Capture (18.5:9): 5664X2752@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [11]REG_L: Single Still Capture (1:1) : 4248X4248@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - Super Slow Motion (SSM) -
+ * [12]REG_M: Super Slow Motion (16:9) : 1872x1052@240, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [13]REG_N: Super Slow Motion (16:9) : 1920x1080@120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [14]REG_O: Super Slow Motion (16:9) : 1280x720 @240, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [15]REG_U: Super Slow Motion (16:9) : 1280x720 @120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - FAST AE -
+ * [16]REG_R: Single Preview Fast(4:3) : 2832x2124@117, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [17]REG_S: Single Preview Fast(4:3) : 2832x2124@ 60, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [18]REG_T: Single Preview Fast(16:9) : 2832x1592@120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ */
+
+const u32 sensor_imx576_setfile_B_Global[] = {
+ //External Clock Setting
+ 0x0136, 0x1A, 0x01,
+ 0x0137, 0x00, 0x01,
+ //Register version
+ 0x3C7E, 0x04, 0x01,
+ 0x3C7F, 0x08, 0x01,
+ //Global Setting
+ 0x380C, 0x00, 0x01,
+ 0x3C00, 0x10, 0x01,
+ 0x3C01, 0x10, 0x01,
+ 0x3C02, 0x10, 0x01,
+ 0x3C03, 0x10, 0x01,
+ 0x3C04, 0x10, 0x01,
+ 0x3C05, 0x01, 0x01,
+ 0x3C08, 0xFF, 0x01,
+ 0x3C09, 0xFF, 0x01,
+ 0x3C0A, 0x01, 0x01,
+ 0x3C0D, 0xFF, 0x01,
+ 0x3C0E, 0xFF, 0x01,
+ 0x3C0F, 0x20, 0x01,
+ 0x3F89, 0x01, 0x01,
+ 0x4430, 0x02, 0x01,
+ 0x4B8E, 0x18, 0x01,
+ 0x4B8F, 0x10, 0x01,
+ 0x4BA8, 0x08, 0x01,
+ 0x4BAA, 0x08, 0x01,
+ 0x4BAB, 0x08, 0x01,
+ 0x4BC9, 0x10, 0x01,
+ 0x5511, 0x01, 0x01,
+ 0x560B, 0x5B, 0x01,
+ 0x56A7, 0x60, 0x01,
+ 0x5B3B, 0x60, 0x01,
+ 0x5BA7, 0x60, 0x01,
+ 0x6002, 0x00, 0x01,
+ 0x6014, 0x01, 0x01,
+ 0x6118, 0x0A, 0x01,
+ 0x6122, 0x0A, 0x01,
+ 0x6128, 0x0A, 0x01,
+ 0x6132, 0x0A, 0x01,
+ 0x6138, 0x0A, 0x01,
+ 0x6142, 0x0A, 0x01,
+ 0x6148, 0x0A, 0x01,
+ 0x6152, 0x0A, 0x01,
+ 0x617B, 0x04, 0x01,
+ 0x617E, 0x04, 0x01,
+ 0x6181, 0x04, 0x01,
+ 0x6184, 0x04, 0x01,
+ 0x6187, 0x04, 0x01,
+ 0x618A, 0x04, 0x01,
+ 0x618D, 0x04, 0x01,
+ 0x6190, 0x04, 0x01,
+ 0x6193, 0x04, 0x01,
+ 0x6196, 0x04, 0x01,
+ 0x6199, 0x04, 0x01,
+ 0x619C, 0x04, 0x01,
+ 0x619F, 0x04, 0x01,
+ 0x61A2, 0x04, 0x01,
+ 0x61A5, 0x04, 0x01,
+ 0x61A8, 0x04, 0x01,
+ 0x61AB, 0x04, 0x01,
+ 0x61AE, 0x04, 0x01,
+ 0x61B1, 0x04, 0x01,
+ 0x61B4, 0x04, 0x01,
+ 0x61B7, 0x04, 0x01,
+ 0x61BA, 0x04, 0x01,
+ 0x61BD, 0x04, 0x01,
+ 0x61C0, 0x04, 0x01,
+ 0x61C3, 0x04, 0x01,
+ 0x61C6, 0x04, 0x01,
+ 0x61C9, 0x04, 0x01,
+ 0x61CC, 0x04, 0x01,
+ 0x61CF, 0x04, 0x01,
+ 0x61D2, 0x04, 0x01,
+ 0x61D5, 0x04, 0x01,
+ 0x61D8, 0x04, 0x01,
+ 0x61DB, 0x04, 0x01,
+ 0x61DE, 0x04, 0x01,
+ 0x61E1, 0x04, 0x01,
+ 0x61E4, 0x04, 0x01,
+ 0x61E7, 0x04, 0x01,
+ 0x61EA, 0x04, 0x01,
+ 0x61ED, 0x04, 0x01,
+ 0x61F0, 0x04, 0x01,
+ 0x61F3, 0x04, 0x01,
+ 0x61F6, 0x04, 0x01,
+ 0x61F9, 0x04, 0x01,
+ 0x61FC, 0x04, 0x01,
+ 0x61FF, 0x04, 0x01,
+ 0x6202, 0x04, 0x01,
+ 0x6205, 0x04, 0x01,
+ 0x6208, 0x04, 0x01,
+ 0x620B, 0x04, 0x01,
+ 0x620E, 0x04, 0x01,
+ 0x6211, 0x04, 0x01,
+ 0x6214, 0x04, 0x01,
+ 0x6217, 0x04, 0x01,
+ 0x621A, 0x04, 0x01,
+ 0x621D, 0x04, 0x01,
+ 0x6220, 0x04, 0x01,
+ 0x6223, 0x04, 0x01,
+ 0x6226, 0x04, 0x01,
+ 0x6229, 0x04, 0x01,
+ 0x622C, 0x04, 0x01,
+ 0x681D, 0xBA, 0x01,
+ 0x681E, 0xA0, 0x01,
+ 0x6823, 0x32, 0x01,
+ 0x6824, 0x6C, 0x01,
+ 0x6828, 0x9B, 0x01,
+ 0x682A, 0x13, 0x01,
+ 0x682C, 0x82, 0x01,
+ 0x682D, 0x6C, 0x01,
+ 0x6835, 0x84, 0x01,
+ 0x6836, 0xB8, 0x01,
+ 0x6837, 0xC4, 0x01,
+ 0x6838, 0x5C, 0x01,
+ 0x6839, 0x63, 0x01,
+ 0x683A, 0xAE, 0x01,
+ 0x683B, 0x51, 0x01,
+ 0x683C, 0x57, 0x01,
+ 0x683E, 0x4B, 0x01,
+ 0x683F, 0x0C, 0x01,
+ 0x6840, 0xA5, 0x01,
+ 0x6841, 0x86, 0x01,
+ 0x6842, 0x52, 0x01,
+ 0x6843, 0xC3, 0x01,
+ 0x6844, 0x21, 0x01,
+ 0x6845, 0x71, 0x01,
+ 0x6847, 0xB8, 0x01,
+ 0x6849, 0x5C, 0x01,
+ 0x684A, 0x63, 0x01,
+ 0x684B, 0xAE, 0x01,
+ 0x684C, 0x51, 0x01,
+ 0x684D, 0x97, 0x01,
+ 0x684F, 0x4B, 0x01,
+ 0x6851, 0xA5, 0x01,
+ 0x6852, 0xC6, 0x01,
+ 0x6853, 0x42, 0x01,
+ 0x6854, 0xE3, 0x01,
+ 0x6856, 0x71, 0x01,
+ 0x6857, 0x84, 0x01,
+ 0x6858, 0xB0, 0x01,
+ 0x6859, 0xC4, 0x01,
+ 0x685A, 0x58, 0x01,
+ 0x685B, 0x63, 0x01,
+ 0x685C, 0xAE, 0x01,
+ 0x685D, 0x51, 0x01,
+ 0x685E, 0x17, 0x01,
+ 0x685F, 0x18, 0x01,
+ 0x6860, 0x0B, 0x01,
+ 0x6861, 0x0C, 0x01,
+ 0x6862, 0x45, 0x01,
+ 0x6863, 0x86, 0x01,
+ 0x6864, 0x32, 0x01,
+ 0x6865, 0xC3, 0x01,
+ 0x6866, 0x21, 0x01,
+ 0x6867, 0x71, 0x01,
+ 0x6868, 0x84, 0x01,
+ 0x6869, 0xA8, 0x01,
+ 0x686A, 0xC4, 0x01,
+ 0x686B, 0x54, 0x01,
+ 0x686C, 0x63, 0x01,
+ 0x686D, 0xAC, 0x01,
+ 0x686E, 0x51, 0x01,
+ 0x686F, 0x17, 0x01,
+ 0x6870, 0x18, 0x01,
+ 0x6871, 0x0A, 0x01,
+ 0x6873, 0x25, 0x01,
+ 0x6875, 0x2A, 0x01,
+ 0x6876, 0xA3, 0x01,
+ 0x6877, 0x21, 0x01,
+ 0x6878, 0x61, 0x01,
+ 0x6879, 0xAA, 0x01,
+ 0x687A, 0x88, 0x01,
+ 0x687B, 0x02, 0x01,
+ 0x687C, 0x08, 0x01,
+ 0x687D, 0x42, 0x01,
+ 0x687E, 0x0D, 0x01,
+ 0x687F, 0x04, 0x01,
+ 0x6880, 0x14, 0x01,
+ 0x6881, 0x48, 0x01,
+ 0x6882, 0x55, 0x01,
+ 0x6883, 0x10, 0x01,
+ 0x6884, 0x04, 0x01,
+ 0x6885, 0x10, 0x01,
+ 0x6886, 0x84, 0x01,
+ 0x6887, 0x1A, 0x01,
+ 0x6888, 0x08, 0x01,
+ 0x6889, 0x28, 0x01,
+ 0x688A, 0x90, 0x01,
+ 0x688B, 0xAA, 0x01,
+ 0x688C, 0x1E, 0x01,
+ 0x688D, 0x08, 0x01,
+ 0x688E, 0x20, 0x01,
+ 0x688F, 0x08, 0x01,
+ 0x6890, 0x21, 0x01,
+ 0x6891, 0x08, 0x01,
+ 0x6892, 0x34, 0x01,
+ 0x6893, 0x11, 0x01,
+ 0x6894, 0x54, 0x01,
+ 0x6895, 0x30, 0x01,
+ 0x6897, 0x32, 0x01,
+ 0x6899, 0x52, 0x01,
+ 0x689B, 0x82, 0x01,
+ 0x689C, 0x02, 0x01,
+ 0x689D, 0xA8, 0x01,
+ 0x689E, 0x58, 0x01,
+ 0x68A0, 0x60, 0x01,
+ 0x68A2, 0x64, 0x01,
+ 0x68A4, 0xA4, 0x01,
+ 0x68A5, 0x05, 0x01,
+ 0x68A6, 0x50, 0x01,
+ 0x68A7, 0xC0, 0x01,
+ 0x68A8, 0x04, 0x01,
+ 0x68A9, 0xC3, 0x01,
+ 0x68AA, 0x20, 0x01,
+ 0x68AB, 0x05, 0x01,
+ 0x68AC, 0x20, 0x01,
+ 0x68AD, 0x08, 0x01,
+ 0x68AE, 0x20, 0x01,
+ 0x68AF, 0x2A, 0x01,
+ 0x68B0, 0x86, 0x01,
+ 0x68B2, 0x26, 0x01,
+ 0x68B3, 0x19, 0x01,
+ 0x68B5, 0x29, 0x01,
+ 0x68B7, 0x41, 0x01,
+ 0x68B8, 0x01, 0x01,
+ 0x68B9, 0x54, 0x01,
+ 0x68BA, 0x30, 0x01,
+ 0x68BC, 0x32, 0x01,
+ 0x68BE, 0x52, 0x01,
+ 0x68C0, 0x82, 0x01,
+ 0x68C1, 0x02, 0x01,
+ 0x68C2, 0xA8, 0x01,
+ 0x68C3, 0x58, 0x01,
+ 0x68C5, 0x60, 0x01,
+ 0x68C7, 0x64, 0x01,
+ 0x68C9, 0xA4, 0x01,
+ 0x68CA, 0x05, 0x01,
+ 0x68CB, 0x51, 0x01,
+ 0x68CD, 0x41, 0x01,
+ 0x68CE, 0x08, 0x01,
+ 0x68CF, 0x41, 0x01,
+ 0x68D0, 0xA0, 0x01,
+ 0x68D1, 0x82, 0x01,
+ 0x68D2, 0x91, 0x01,
+ 0x68D3, 0x0A, 0x01,
+ 0x68D4, 0xA1, 0x01,
+ 0x68D5, 0xD0, 0x01,
+ 0x68D6, 0x82, 0x01,
+ 0x68D8, 0x82, 0x01,
+ 0x68D9, 0x10, 0x01,
+ 0x68DA, 0x83, 0x01,
+ 0x68DB, 0x41, 0x01,
+ 0x68DC, 0x15, 0x01,
+ 0x68DD, 0x44, 0x01,
+ 0x68DE, 0x01, 0x01,
+ 0x68DF, 0x04, 0x01,
+ 0x68E0, 0x21, 0x01,
+ 0x68E1, 0x06, 0x01,
+ 0x68E2, 0x82, 0x01,
+ 0x68E3, 0x0A, 0x01,
+ 0x68E4, 0x44, 0x01,
+ 0x68E5, 0x2A, 0x01,
+ 0x68E6, 0x87, 0x01,
+ 0x68E7, 0x42, 0x01,
+ 0x68E8, 0x08, 0x01,
+ 0x68E9, 0x02, 0x01,
+ 0x68EA, 0x08, 0x01,
+ 0x68EB, 0x42, 0x01,
+ 0x68EC, 0x0D, 0x01,
+ 0x68ED, 0x04, 0x01,
+ 0x68EE, 0x55, 0x01,
+ 0x68EF, 0x0F, 0x01,
+ 0x68F0, 0x84, 0x01,
+ 0x68F1, 0x10, 0x01,
+ 0x68F2, 0x04, 0x01,
+ 0x68F3, 0x19, 0x01,
+ 0x68F4, 0x88, 0x01,
+ 0x68F5, 0x28, 0x01,
+ 0x68F6, 0x10, 0x01,
+ 0x68F7, 0xAA, 0x01,
+ 0x68F8, 0x1C, 0x01,
+ 0x68F9, 0x08, 0x01,
+ 0x68FA, 0x1F, 0x01,
+ 0x68FB, 0x08, 0x01,
+ 0x68FC, 0x20, 0x01,
+ 0x68FD, 0x08, 0x01,
+ 0x68FE, 0x33, 0x01,
+ 0x68FF, 0x10, 0x01,
+ 0x690C, 0x04, 0x01,
+ 0x690D, 0x04, 0x01,
+ 0x690F, 0x04, 0x01,
+ 0x6910, 0x04, 0x01,
+ 0x6911, 0x04, 0x01,
+ 0x6912, 0x05, 0x01,
+ 0x6930, 0xB5, 0x01,
+ 0x6931, 0xF6, 0x01,
+ 0x6933, 0xF3, 0x01,
+ 0x6939, 0x5B, 0x01,
+ 0x693A, 0x5A, 0x01,
+ 0x693B, 0xDA, 0x01,
+ 0x693C, 0xD6, 0x01,
+ 0x693D, 0xD6, 0x01,
+ 0x693E, 0xB6, 0x01,
+ 0x693F, 0xB5, 0x01,
+ 0x6940, 0xB5, 0x01,
+ 0x6941, 0xAD, 0x01,
+ 0x6942, 0xAD, 0x01,
+ 0x6943, 0x6D, 0x01,
+ 0x6944, 0x6B, 0x01,
+ 0x6945, 0x6B, 0x01,
+ 0x6946, 0x5B, 0x01,
+ 0x6947, 0x5A, 0x01,
+ 0x6948, 0xDA, 0x01,
+ 0x6949, 0xD6, 0x01,
+ 0x694A, 0xD6, 0x01,
+ 0x694B, 0xB6, 0x01,
+ 0x694C, 0xB5, 0x01,
+ 0x694D, 0xB5, 0x01,
+ 0x694E, 0xAD, 0x01,
+ 0x694F, 0xAD, 0x01,
+ 0x6950, 0x6C, 0x01,
+ 0x6B0B, 0x02, 0x01,
+ 0x6B0C, 0x01, 0x01,
+ 0x6B0D, 0x05, 0x01,
+ 0x6B0F, 0x04, 0x01,
+ 0x6B10, 0x02, 0x01,
+ 0x6B11, 0x06, 0x01,
+ 0x6B12, 0x03, 0x01,
+ 0x6B13, 0x07, 0x01,
+ 0x6B14, 0x0D, 0x01,
+ 0x6B15, 0x09, 0x01,
+ 0x6B16, 0x0C, 0x01,
+ 0x6B17, 0x08, 0x01,
+ 0x6B18, 0x0E, 0x01,
+ 0x6B19, 0x0A, 0x01,
+ 0x6B1A, 0x0F, 0x01,
+ 0x6B1B, 0x0B, 0x01,
+ 0x6B1C, 0x01, 0x01,
+ 0x6B1D, 0x05, 0x01,
+ 0x6B1F, 0x04, 0x01,
+ 0x6B20, 0x02, 0x01,
+ 0x6B21, 0x06, 0x01,
+ 0x6B22, 0x03, 0x01,
+ 0x6B23, 0x07, 0x01,
+ 0x6B24, 0x0D, 0x01,
+ 0x6B25, 0x09, 0x01,
+ 0x6B26, 0x0C, 0x01,
+ 0x6B27, 0x08, 0x01,
+ 0x6B28, 0x0E, 0x01,
+ 0x6B29, 0x0A, 0x01,
+ 0x6B2A, 0x0F, 0x01,
+ 0x6B2B, 0x0B, 0x01,
+ 0x7948, 0x01, 0x01,
+ 0x7949, 0x06, 0x01,
+ 0x794B, 0x04, 0x01,
+ 0x794C, 0x04, 0x01,
+ 0x794D, 0x3A, 0x01,
+ 0x7951, 0x00, 0x01,
+ 0x7952, 0x01, 0x01,
+ 0x7955, 0x00, 0x01,
+ 0x9004, 0x10, 0x01,
+ 0x9200, 0xA0, 0x01,
+ 0x9201, 0xA7, 0x01,
+ 0x9202, 0xA0, 0x01,
+ 0x9203, 0xAA, 0x01,
+ 0x9204, 0xA0, 0x01,
+ 0x9205, 0xAD, 0x01,
+ 0x9206, 0xA0, 0x01,
+ 0x9207, 0xB0, 0x01,
+ 0x9208, 0xA0, 0x01,
+ 0x9209, 0xB3, 0x01,
+ 0x920A, 0xB7, 0x01,
+ 0x920B, 0x34, 0x01,
+ 0x920C, 0xB7, 0x01,
+ 0x920D, 0x36, 0x01,
+ 0x920E, 0xB7, 0x01,
+ 0x920F, 0x37, 0x01,
+ 0x9210, 0xB7, 0x01,
+ 0x9211, 0x38, 0x01,
+ 0x9212, 0xB7, 0x01,
+ 0x9213, 0x39, 0x01,
+ 0x9214, 0xB7, 0x01,
+ 0x9215, 0x3A, 0x01,
+ 0x9216, 0xB7, 0x01,
+ 0x9217, 0x3C, 0x01,
+ 0x9218, 0xB7, 0x01,
+ 0x9219, 0x3D, 0x01,
+ 0x921A, 0xB7, 0x01,
+ 0x921B, 0x3E, 0x01,
+ 0x921C, 0xB7, 0x01,
+ 0x921D, 0x3F, 0x01,
+ 0x921E, 0x7F, 0x01,
+ 0x921F, 0x77, 0x01,
+ 0x9385, 0x4B, 0x01,
+ 0x9387, 0x46, 0x01,
+ 0x9389, 0x1E, 0x01,
+ 0x938B, 0x1E, 0x01,
+ 0x938D, 0x4B, 0x01,
+ 0x938F, 0x46, 0x01,
+ 0x9391, 0x1E, 0x01,
+ 0x9393, 0x1E, 0x01,
+ 0x9395, 0x50, 0x01,
+ 0x9397, 0x4B, 0x01,
+ 0x9399, 0x46, 0x01,
+ 0x939B, 0x1E, 0x01,
+ 0x939D, 0x4B, 0x01,
+ 0x939F, 0x46, 0x01,
+ 0x93A1, 0x1E, 0x01,
+ 0x93A3, 0x1E, 0x01,
+ 0x93A5, 0x50, 0x01,
+ 0x93A7, 0x4B, 0x01,
+ 0x93A9, 0x41, 0x01,
+ 0x93AB, 0x1E, 0x01,
+ 0x93AD, 0x4B, 0x01,
+ 0x93AF, 0x46, 0x01,
+ 0x93B1, 0x1E, 0x01,
+ 0x93B3, 0x1E, 0x01,
+ 0x93B5, 0x4B, 0x01,
+ 0x93B7, 0x46, 0x01,
+ 0x93B9, 0x1E, 0x01,
+ 0x93BB, 0x1E, 0x01,
+ 0x93BD, 0x4B, 0x01,
+ 0x93BF, 0x46, 0x01,
+ 0x93C1, 0x1E, 0x01,
+ 0x93C3, 0x1E, 0x01,
+ 0x93C5, 0x50, 0x01,
+ 0x93C7, 0x4B, 0x01,
+ 0x93C9, 0x46, 0x01,
+ 0x93CB, 0x1E, 0x01,
+ 0x93CD, 0x4B, 0x01,
+ 0x93CF, 0x46, 0x01,
+ 0x93D1, 0x1E, 0x01,
+ 0x93D3, 0x1E, 0x01,
+ 0x93D5, 0x50, 0x01,
+ 0x93D7, 0x4B, 0x01,
+ 0x93D9, 0x46, 0x01,
+ 0x93DB, 0x1E, 0x01,
+ 0x93DD, 0x4B, 0x01,
+ 0x93DF, 0x46, 0x01,
+ 0x93E1, 0x1E, 0x01,
+ 0x93E3, 0x1E, 0x01,
+ 0x93E5, 0x50, 0x01,
+ 0x93E7, 0x4B, 0x01,
+ 0x93E9, 0x46, 0x01,
+ 0x93EB, 0x1E, 0x01,
+ 0x93ED, 0x55, 0x01,
+ 0x93EF, 0x50, 0x01,
+ 0x93F1, 0x1E, 0x01,
+ 0x93F3, 0x1E, 0x01,
+ 0x93F5, 0x5A, 0x01,
+ 0x93F7, 0x55, 0x01,
+ 0x93F9, 0x50, 0x01,
+ 0x93FB, 0x1E, 0x01,
+ 0x99AF, 0x0F, 0x01,
+ 0x99B0, 0x0F, 0x01,
+ 0x99B1, 0x0F, 0x01,
+ 0x99B2, 0x0F, 0x01,
+ 0x99B3, 0x0F, 0x01,
+ 0x99E1, 0x0F, 0x01,
+ 0x99E2, 0x0F, 0x01,
+ 0x99E3, 0x0F, 0x01,
+ 0x99E4, 0x0F, 0x01,
+ 0x99E5, 0x0F, 0x01,
+ 0x99E6, 0x0F, 0x01,
+ 0x99E7, 0x0F, 0x01,
+ 0x99E8, 0x0F, 0x01,
+ 0x99E9, 0x0F, 0x01,
+ 0x99EA, 0x0F, 0x01,
+ 0xCD32, 0x02, 0x01,
+ 0xE0CE, 0x03, 0x01,
+ 0xE0D1, 0x0B, 0x01,
+ 0xE0D2, 0x0B, 0x01,
+ 0xE286, 0x31, 0x01,
+ 0xE2A6, 0x32, 0x01,
+ 0xE2C6, 0x33, 0x01,
+ //Image Quality adjustment setting
+ 0x4038, 0x00, 0x01,
+ 0x9856, 0xA0, 0x01,
+ 0x9857, 0x78, 0x01,
+ 0x9858, 0x64, 0x01,
+ 0x986E, 0x64, 0x01,
+ 0x9870, 0x3C, 0x01,
+ 0x993A, 0x0E, 0x01,
+ 0x993B, 0x0E, 0x01,
+ 0x9953, 0x08, 0x01,
+ 0x9954, 0x08, 0x01,
+ 0x996B, 0x0F, 0x01,
+ 0x996D, 0x0F, 0x01,
+ 0x996F, 0x0F, 0x01,
+ 0x998E, 0x0F, 0x01,
+ 0xA101, 0x01, 0x01,
+ 0xA103, 0x01, 0x01,
+ 0xA105, 0x01, 0x01,
+ 0xA107, 0x01, 0x01,
+ 0xA109, 0x01, 0x01,
+ 0xA10B, 0x01, 0x01,
+ 0xA10D, 0x01, 0x01,
+ 0xA10F, 0x01, 0x01,
+ 0xA111, 0x01, 0x01,
+ 0xA113, 0x01, 0x01,
+ 0xA115, 0x01, 0x01,
+ 0xA117, 0x01, 0x01,
+ 0xA119, 0x01, 0x01,
+ 0xA11B, 0x01, 0x01,
+ 0xA11D, 0x01, 0x01,
+ 0xAA58, 0x00, 0x01,
+ 0xAA59, 0x01, 0x01,
+ 0xAB03, 0x10, 0x01,
+ 0xAB04, 0x10, 0x01,
+ 0xAB05, 0x10, 0x01,
+ 0xAD6A, 0x03, 0x01,
+ 0xAD6B, 0xFF, 0x01,
+ 0xAD77, 0x00, 0x01,
+ 0xAD82, 0x03, 0x01,
+ 0xAD83, 0xFF, 0x01,
+ 0xAE06, 0x04, 0x01,
+ 0xAE07, 0x16, 0x01,
+ 0xAE08, 0xFF, 0x01,
+ 0xAE09, 0x04, 0x01,
+ 0xAE0A, 0x16, 0x01,
+ 0xAE0B, 0xFF, 0x01,
+ 0xAF01, 0x04, 0x01,
+ 0xAF03, 0x0A, 0x01,
+ 0xAF05, 0x18, 0x01,
+ 0xB048, 0x0A, 0x01,
+};
+
+//[0] REG_A: Single Still Preview (4:3) : 2832x2124@30
+const u32 sensor_imx576_setfile_B_2X2BIN_2832x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[1] REG_B: Single Still Preview (16:9) : 2832x1592@30
+const u32 sensor_imx576_setfile_B_2X2BIN_2832x1592_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x0A, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x06, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[2] REG_C: Single Still Preview (18.5:9): 2832x1376@30
+const u32 sensor_imx576_setfile_B_2X2BIN_2832x1376_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x76, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x05, 0x01,
+ 0x040F, 0x60, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x05, 0x01,
+ 0x034F, 0x60, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[3] REG_D: Single Still Preview (1:1) : 2124x2124@30
+const u32 sensor_imx576_setfile_B_2X2BIN_2124x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0x7A, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x08, 0x01,
+ 0x040D, 0x4C, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x08, 0x01,
+ 0x034D, 0x4C, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x04, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[4] REG_E: Single Still 3HDR (4:3) : 2832x2124@30
+const u32 sensor_imx576_setfile_B_QBCHDR_2832x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[5] REG_F: Single Still 3HDR (16:9) : 2832x1592@30
+const u32 sensor_imx576_setfile_B_QBCHDR_2832x1592_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x0A, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x06, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[6] REG_G: Single Still 3HDR (18.5:9) : 2832x1376@30
+const u32 sensor_imx576_setfile_B_QBCHDR_2832x1376_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x01, 0x01,
+ 0x040B, 0x76, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x05, 0x01,
+ 0x040F, 0x60, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x05, 0x01,
+ 0x034F, 0x60, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[7] REG_H: Single Still 3HDR (1:1) : 2124x2124@30
+const u32 sensor_imx576_setfile_B_QBCHDR_2124x2124_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x63, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x04, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0x7A, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x08, 0x01,
+ 0x040D, 0x4C, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x08, 0x01,
+ 0x034D, 0x4C, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xCA, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x6A, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x01, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x01, 0x01,
+ //Flicker Setting
+ 0x323C, 0x01, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x01, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[8] REG_I: Single Still Capture (4:3) : 5664X4248@30
+const u32 sensor_imx576_setfile_B_5664x4248_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x30, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x16, 0x01,
+ 0x040D, 0x20, 0x01,
+ 0x040E, 0x10, 0x01,
+ 0x040F, 0x98, 0x01,
+ //Output Size Setting
+ 0x034C, 0x16, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x10, 0x01,
+ 0x034F, 0x98, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[9] REG_J: Single Still Capture (16:9) : 5664X3184@30
+const u32 sensor_imx576_setfile_B_5664x3184_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x30, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0x14, 0x01,
+ 0x040C, 0x16, 0x01,
+ 0x040D, 0x20, 0x01,
+ 0x040E, 0x0C, 0x01,
+ 0x040F, 0x70, 0x01,
+ //Output Size Setting
+ 0x034C, 0x16, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x0C, 0x01,
+ 0x034F, 0x70, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[10]REG_K: Single Still Capture (18.5:9): 5664X2752@30
+const u32 sensor_imx576_setfile_B_5664x2752_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x30, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0xEC, 0x01,
+ 0x040C, 0x16, 0x01,
+ 0x040D, 0x20, 0x01,
+ 0x040E, 0x0A, 0x01,
+ 0x040F, 0xC0, 0x01,
+ //Output Size Setting
+ 0x034C, 0x16, 0x01,
+ 0x034D, 0x20, 0x01,
+ 0x034E, 0x0A, 0x01,
+ 0x034F, 0xC0, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[11]REG_L: Single Still Capture (1:1) : 4248X4248@30
+const u32 sensor_imx576_setfile_B_4248x4248_30fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0x00, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x10, 0x01,
+ 0x0341, 0xDC, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x00, 0x01,
+ 0x0901, 0x11, 0x01,
+ 0x0902, 0x0A, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x01, 0x01,
+ 0x3247, 0x01, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x02, 0x01,
+ 0x0409, 0xF4, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x10, 0x01,
+ 0x040D, 0x98, 0x01,
+ 0x040E, 0x10, 0x01,
+ 0x040F, 0x98, 0x01,
+ //Output Size Setting
+ 0x034C, 0x10, 0x01,
+ 0x034D, 0x98, 0x01,
+ 0x034E, 0x10, 0x01,
+ 0x034F, 0x98, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x32, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x01, 0x01,
+ 0x3620, 0x01, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x01, 0x01,
+ 0x3F81, 0x72, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x3C, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x01, 0x01,
+};
+
+//[12]REG_M: Super Slow Motion (16:9) : 1872x1052@240
+const u32 sensor_imx576_setfile_B_1872x1052_240fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x04, 0x01,
+ 0x0341, 0x53, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x04, 0x01,
+ 0x0347, 0x50, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x0C, 0x01,
+ 0x034B, 0x87, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0xF8, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x07, 0x01,
+ 0x040D, 0x50, 0x01,
+ 0x040E, 0x04, 0x01,
+ 0x040F, 0x1C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x07, 0x01,
+ 0x034D, 0x50, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0x1C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x43, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x04, 0x01,
+ 0x0203, 0x14, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0x05, 0x01,
+ 0x3FE0, 0x02, 0x01,
+ 0x3FE1, 0x0A, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[13]REG_N: Super Slow Motion (16:9) : 1920x1080@120
+const u32 sensor_imx576_setfile_B_1920x1080_120fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x01, 0x01,
+ 0x0409, 0xE0, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0x0A, 0x01,
+ 0x040C, 0x07, 0x01,
+ 0x040D, 0x80, 0x01,
+ 0x040E, 0x04, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x07, 0x01,
+ 0x034D, 0x80, 0x01,
+ 0x034E, 0x04, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[14]REG_O: Super Slow Motion (16:9) : 1280x720 @240
+const u32 sensor_imx576_setfile_B_1280x720_240fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x04, 0x01,
+ 0x0341, 0x53, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x04, 0x01,
+ 0x0347, 0x50, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x0C, 0x01,
+ 0x034B, 0x87, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x03, 0x01,
+ 0x0409, 0x20, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0xA6, 0x01,
+ 0x040C, 0x05, 0x01,
+ 0x040D, 0x00, 0x01,
+ 0x040E, 0x02, 0x01,
+ 0x040F, 0xD0, 0x01,
+ //Output Size Setting
+ 0x034C, 0x05, 0x01,
+ 0x034D, 0x00, 0x01,
+ 0x034E, 0x02, 0x01,
+ 0x034F, 0xD0, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x43, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x04, 0x01,
+ 0x0203, 0x14, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0x05, 0x01,
+ 0x3FE0, 0x02, 0x01,
+ 0x3FE1, 0x0A, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[15]REG_U: Super Slow Motion (16:9) : 1280x720 @120
+const u32 sensor_imx576_setfile_B_1280x720_120fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x03, 0x01,
+ 0x0409, 0x20, 0x01,
+ 0x040A, 0x02, 0x01,
+ 0x040B, 0xBE, 0x01,
+ 0x040C, 0x05, 0x01,
+ 0x040D, 0x00, 0x01,
+ 0x040E, 0x02, 0x01,
+ 0x040F, 0xD0, 0x01,
+ //Output Size Setting
+ 0x034C, 0x05, 0x01,
+ 0x034D, 0x00, 0x01,
+ 0x034E, 0x02, 0x01,
+ 0x034F, 0xD0, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[16]REG_R: Single Preview Fast(4:3) : 2832x2124@117
+const u32 sensor_imx576_setfile_B_2832x2124_117fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x80, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x37, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[17]REG_S: Single Preview Fast(4:3) : 2832x2124@ 60
+const u32 sensor_imx576_setfile_B_2832x2124_60fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x18, 0x01,
+ 0x0343, 0xB0, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x84, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x20, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0xB7, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0x00, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x08, 0x01,
+ 0x040F, 0x4C, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x08, 0x01,
+ 0x034F, 0x4C, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x3E, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x02, 0x01,
+ 0x3F81, 0x30, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[18]REG_T: Single Preview Fast(16:9) : 2832x1592@120
+const u32 sensor_imx576_setfile_B_2832x1592_120fps[] = {
+ //MIPI output setting
+ 0x0112, 0x0A, 0x01,
+ 0x0113, 0x0A, 0x01,
+ 0x0114, 0x03, 0x01,
+ //Line Length PCK Setting
+ 0x0342, 0x0C, 0x01,
+ 0x0343, 0x58, 0x01,
+ //Frame Length Lines Setting
+ 0x0340, 0x08, 0x01,
+ 0x0341, 0x54, 0x01,
+ //ROI Setting
+ 0x0344, 0x00, 0x01,
+ 0x0345, 0x00, 0x01,
+ 0x0346, 0x00, 0x01,
+ 0x0347, 0x4C, 0x01,
+ 0x0348, 0x16, 0x01,
+ 0x0349, 0x7F, 0x01,
+ 0x034A, 0x10, 0x01,
+ 0x034B, 0x8B, 0x01,
+ //Mode Setting
+ 0x0220, 0x62, 0x01,
+ 0x0900, 0x01, 0x01,
+ 0x0901, 0x22, 0x01,
+ 0x0902, 0x08, 0x01,
+ 0x3140, 0x00, 0x01,
+ 0x3246, 0x81, 0x01,
+ 0x3247, 0x81, 0x01,
+ //Digital Crop & Scaling
+ 0x0401, 0x00, 0x01,
+ 0x0404, 0x00, 0x01,
+ 0x0405, 0x10, 0x01,
+ 0x0408, 0x00, 0x01,
+ 0x0409, 0x18, 0x01,
+ 0x040A, 0x00, 0x01,
+ 0x040B, 0xF4, 0x01,
+ 0x040C, 0x0B, 0x01,
+ 0x040D, 0x10, 0x01,
+ 0x040E, 0x06, 0x01,
+ 0x040F, 0x38, 0x01,
+ //Output Size Setting
+ 0x034C, 0x0B, 0x01,
+ 0x034D, 0x10, 0x01,
+ 0x034E, 0x06, 0x01,
+ 0x034F, 0x38, 0x01,
+ //Clock Setting
+ 0x0301, 0x05, 0x01,
+ 0x0303, 0x02, 0x01,
+ 0x0305, 0x04, 0x01,
+ 0x0306, 0x01, 0x01,
+ 0x0307, 0x37, 0x01,
+ 0x030B, 0x01, 0x01,
+ 0x030D, 0x04, 0x01,
+ 0x030E, 0x01, 0x01,
+ 0x030F, 0x3C, 0x01,
+ 0x0310, 0x01, 0x01,
+ //Other Setting
+ 0x0B06, 0x00, 0x01,
+ 0x3620, 0x00, 0x01,
+ 0x3F0C, 0x00, 0x01,
+ 0x3F14, 0x01, 0x01,
+ 0x3F80, 0x03, 0x01,
+ 0x3F81, 0xE8, 0x01,
+ 0x3FFC, 0x00, 0x01,
+ 0x3FFD, 0x26, 0x01,
+ //Integration Setting
+ 0x0202, 0x07, 0x01,
+ 0x0203, 0xD0, 0x01,
+ 0x0224, 0x01, 0x01,
+ 0x0225, 0xF4, 0x01,
+ 0x3FE0, 0x03, 0x01,
+ 0x3FE1, 0xE8, 0x01,
+ //Gain Setting
+ 0x0204, 0x00, 0x01,
+ 0x0205, 0x00, 0x01,
+ 0x0216, 0x00, 0x01,
+ 0x0217, 0x00, 0x01,
+ 0x0218, 0x01, 0x01,
+ 0x0219, 0x00, 0x01,
+ 0x020E, 0x01, 0x01,
+ 0x020F, 0x00, 0x01,
+ 0x3FE2, 0x00, 0x01,
+ 0x3FE3, 0x00, 0x01,
+ 0x3FE4, 0x01, 0x01,
+ 0x3FE5, 0x00, 0x01,
+ //Y-Hist Setting
+ 0x323A, 0x00, 0x01,
+ //AE-Hist Setting
+ 0x323B, 0x00, 0x01,
+ //Flicker Setting
+ 0x323C, 0x00, 0x01,
+ //SHD_CORR_EN
+ 0x0b00, 0x00, 0x01,
+ //QSC_EN
+ 0x3621, 0x00, 0x01,
+};
+
+//[0] REG_A: Single Still Preview (4:3) : 2832x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_2X2BIN_2832x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000, /* mipi_datarate = OPSYCK */
+ 103350000 * 4, /* pclk = VTPXCK * 4*/
+ 2180, /* frame_length_lines */
+ 6320, /* line_length_pck */
+};
+
+//[1] REG_B: Single Still Preview (16:9) : 2832x1592@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_2X2BIN_2832x1592_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 103350000 * 4,
+ 2180,
+ 6320,
+};
+
+//[2] REG_C: Single Still Preview (18.5:9): 2832x1376@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_2X2BIN_2832x1376_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 103350000 * 4,
+ 2180,
+ 6320,
+};
+
+//[3] REG_D: Single Still Preview (1:1) : 2124x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_2X2BIN_2124x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 103350000 * 4,
+ 2180,
+ 6320,
+};
+
+//[4] REG_E: Single Still 3HDR (4:3) : 2832x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_QBCHDR_2832x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[5] REG_F: Single Still 3HDR (16:9) : 2832x1592@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_QBCHDR_2832x1592_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[6] REG_G: Single Still 3HDR (18.5:9) : 2832x1376@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_QBCHDR_2832x1376_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[7] REG_H: Single Still 3HDR (1:1) : 2124x2124@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_QBCHDR_2124x2124_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[8] REG_I: Single Still Capture (4:3) : 5664X4248@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_5664x4248_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[9] REG_J: Single Still Capture (16:9) : 5664X3184@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_5664x3184_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[10]REG_K: Single Still Capture (18.5:9): 5664X2752@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_5664x2752_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[11]REG_L: Single Still Capture (1:1) : 4248X4248@30
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_4248x4248_30fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 198900000 * 4,
+ 4316,
+ 6144,
+};
+
+//[12]REG_M: Super Slow Motion (16:9) : 1872x1052@240
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_1872x1052_240fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 209950000 * 4,
+ 1107,
+ 3160,
+};
+
+//[13]REG_N: Super Slow Motion (16:9) : 1920x1080@120
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_1920x1080_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 206700000 * 4,
+ 2180,
+ 3160,
+};
+
+//[14]REG_O: Super Slow Motion (16:9) : 1280x720 @240
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_1280x720_240fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 209950000 * 4,
+ 1107,
+ 3160,
+};
+
+//[15]REG_U: Super Slow Motion (16:9) : 1280x720 @120
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_1280x720_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 206700000 * 4,
+ 2180,
+ 3160,
+};
+
+//[16]REG_R: Single Preview Fast(4:3) : 2832x2124@118
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_2832x2124_117fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 202150000 * 4,
+ 2176,
+ 3160,
+};
+
+//[17]REG_S: Single Preview Fast(4:3) : 2832x2124@ 60
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_2832x2124_60fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 206700000 * 4,
+ 2180,
+ 6320,
+};
+
+//[18]REG_T: Single Preview Fast(16:9) : 2832x1592@120
+const struct sensor_pll_info_compact sensor_imx576_pllinfo_B_2832x1592_120fps = {
+ EXT_CLK_Mhz * 1000 * 1000, /* ext_clk */
+ 2054000000,
+ 202150000 * 4,
+ 2132,
+ 3160,
+};
+
+static const u32 *sensor_imx576_setfiles_B[] = {
+ sensor_imx576_setfile_B_2X2BIN_2832x2124_30fps,
+ sensor_imx576_setfile_B_2X2BIN_2832x1592_30fps,
+ sensor_imx576_setfile_B_2X2BIN_2832x1376_30fps,
+ sensor_imx576_setfile_B_2X2BIN_2124x2124_30fps,
+ sensor_imx576_setfile_B_QBCHDR_2832x2124_30fps,
+ sensor_imx576_setfile_B_QBCHDR_2832x1592_30fps,
+ sensor_imx576_setfile_B_QBCHDR_2832x1376_30fps,
+ sensor_imx576_setfile_B_QBCHDR_2124x2124_30fps,
+ sensor_imx576_setfile_B_5664x4248_30fps,
+ sensor_imx576_setfile_B_5664x3184_30fps,
+ sensor_imx576_setfile_B_5664x2752_30fps,
+ sensor_imx576_setfile_B_4248x4248_30fps,
+ sensor_imx576_setfile_B_1872x1052_240fps,
+ sensor_imx576_setfile_B_1920x1080_120fps,
+ sensor_imx576_setfile_B_1280x720_240fps,
+ sensor_imx576_setfile_B_1280x720_120fps,
+ sensor_imx576_setfile_B_2832x2124_117fps,
+ sensor_imx576_setfile_B_2832x2124_60fps,
+ sensor_imx576_setfile_B_2832x1592_120fps,
+};
+
+static const u32 sensor_imx576_setfile_B_sizes[] = {
+ ARRAY_SIZE(sensor_imx576_setfile_B_2X2BIN_2832x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_2X2BIN_2832x1592_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_2X2BIN_2832x1376_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_2X2BIN_2124x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_QBCHDR_2832x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_QBCHDR_2832x1592_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_QBCHDR_2832x1376_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_QBCHDR_2124x2124_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_5664x4248_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_5664x3184_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_5664x2752_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_4248x4248_30fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_1872x1052_240fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_1920x1080_120fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_1280x720_240fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_1280x720_120fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_2832x2124_117fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_2832x2124_60fps),
+ ARRAY_SIZE(sensor_imx576_setfile_B_2832x1592_120fps),
+};
+
+static const struct sensor_pll_info_compact *sensor_imx576_pllinfos_B[] = {
+ &sensor_imx576_pllinfo_B_2X2BIN_2832x2124_30fps,
+ &sensor_imx576_pllinfo_B_2X2BIN_2832x1592_30fps,
+ &sensor_imx576_pllinfo_B_2X2BIN_2832x1376_30fps,
+ &sensor_imx576_pllinfo_B_2X2BIN_2124x2124_30fps,
+ &sensor_imx576_pllinfo_B_QBCHDR_2832x2124_30fps,
+ &sensor_imx576_pllinfo_B_QBCHDR_2832x1592_30fps,
+ &sensor_imx576_pllinfo_B_QBCHDR_2832x1376_30fps,
+ &sensor_imx576_pllinfo_B_QBCHDR_2124x2124_30fps,
+ &sensor_imx576_pllinfo_B_5664x4248_30fps,
+ &sensor_imx576_pllinfo_B_5664x3184_30fps,
+ &sensor_imx576_pllinfo_B_5664x2752_30fps,
+ &sensor_imx576_pllinfo_B_4248x4248_30fps,
+ &sensor_imx576_pllinfo_B_1872x1052_240fps,
+ &sensor_imx576_pllinfo_B_1920x1080_120fps,
+ &sensor_imx576_pllinfo_B_1280x720_240fps,
+ &sensor_imx576_pllinfo_B_1280x720_120fps,
+ &sensor_imx576_pllinfo_B_2832x2124_117fps,
+ &sensor_imx576_pllinfo_B_2832x2124_60fps,
+ &sensor_imx576_pllinfo_B_2832x1592_120fps,
+};
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-param.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+#include "fimc-is-cis-imx576.h"
+#include "fimc-is-cis-imx576-setA.h"
+#include "fimc-is-cis-imx576-setB.h"
+
+#include "fimc-is-helper-i2c.h"
+
+#define SENSOR_NAME "IMX576"
+#define SENSOR_NAME_FRONT "IMX576_FRONT"
+#define SENSOR_NAME_REAR "IMX576_REAR"
+#define SENSOR_REAR_DATA 0
+#define SENSOR_FRONT_DATA 1
+/* #define DEBUG_IMX576_PLL */
+
+static const u32 *sensor_imx576_global;
+static u32 sensor_imx576_global_size;
+static const u32 **sensor_imx576_setfiles;
+static const u32 *sensor_imx576_setfile_sizes;
+static const struct sensor_pll_info_compact **sensor_imx576_pllinfos;
+static u32 sensor_imx576_max_setfile_num;
+
+static void sensor_imx576_set_integration_max_margin(u32 mode, cis_shared_data *cis_data)
+{
+ FIMC_BUG_VOID(!cis_data);
+
+ switch (mode) {
+ case SENSOR_IMX576_2832X2124_2X2BIN_30FPS:
+ case SENSOR_IMX576_2832X1592_2X2BIN_30FPS:
+ case SENSOR_IMX576_2832X1376_2X2BIN_30FPS:
+ case SENSOR_IMX576_2124X2124_2X2BIN_30FPS:
+ case SENSOR_IMX576_2832X2124_QBCHDR_30FPS:
+ case SENSOR_IMX576_2832X1592_QBCHDR_30FPS:
+ case SENSOR_IMX576_2832X1376_QBCHDR_30FPS:
+ case SENSOR_IMX576_2124X2124_QBCHDR_30FPS:
+ case SENSOR_IMX576_5664X4248_QBCREMOSAIC_30FPS:
+ case SENSOR_IMX576_5664X3184_QBCREMOSAIC_30FPS:
+ case SENSOR_IMX576_5664X2752_QBCREMOSAIC_30FPS:
+ case SENSOR_IMX576_4248X4248_QBCREMOSAIC_30FPS:
+ case SENSOR_IMX576_1870X1052_SSM_240FPS:
+ case SENSOR_IMX576_1920X1080_SSM_120FPS:
+ case SENSOR_IMX576_1280X720_SSM_240FPS:
+ case SENSOR_IMX576_2832X2124_120FPS:
+ cis_data->max_margin_coarse_integration_time = SENSOR_IMX576_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+ dbg_sensor(1, "max_margin_coarse_integration_time(%d)\n",
+ cis_data->max_margin_coarse_integration_time);
+ break;
+ default:
+ err("[%s] Unsupport imx576 sensor mode\n", __func__);
+ cis_data->max_margin_coarse_integration_time = SENSOR_IMX576_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+ dbg_sensor(1, "max_margin_coarse_integration_time(%d)\n",
+ cis_data->max_margin_coarse_integration_time);
+ break;
+ }
+}
+
+static void sensor_imx576_set_integration_min(u32 mode, cis_shared_data *cis_data)
+{
+ FIMC_BUG_VOID(!cis_data);
+
+ switch (mode) {
+ case SENSOR_IMX576_2832X2124_2X2BIN_30FPS:
+ case SENSOR_IMX576_2832X1592_2X2BIN_30FPS:
+ case SENSOR_IMX576_2832X1376_2X2BIN_30FPS:
+ case SENSOR_IMX576_2124X2124_2X2BIN_30FPS:
+ cis_data->min_coarse_integration_time = 4;
+ dbg_sensor(1, "min_coarse_integration_time(%d)\n",
+ cis_data->min_coarse_integration_time);
+ break;
+ case SENSOR_IMX576_2832X2124_QBCHDR_30FPS:
+ case SENSOR_IMX576_2832X1592_QBCHDR_30FPS:
+ case SENSOR_IMX576_2832X1376_QBCHDR_30FPS:
+ case SENSOR_IMX576_2124X2124_QBCHDR_30FPS:
+ cis_data->min_coarse_integration_time = SENSOR_IMX576_COARSE_INTEGRATION_TIME_MIN;
+ dbg_sensor(1, "min_coarse_integration_time(%d)\n",
+ cis_data->min_coarse_integration_time);
+ break;
+ case SENSOR_IMX576_5664X4248_QBCREMOSAIC_30FPS:
+ case SENSOR_IMX576_5664X3184_QBCREMOSAIC_30FPS:
+ case SENSOR_IMX576_5664X2752_QBCREMOSAIC_30FPS:
+ case SENSOR_IMX576_4248X4248_QBCREMOSAIC_30FPS:
+ cis_data->min_coarse_integration_time = 4;
+ dbg_sensor(1, "min_coarse_integration_time(%d)\n",
+ cis_data->min_coarse_integration_time);
+ break;
+ case SENSOR_IMX576_1870X1052_SSM_240FPS:
+ case SENSOR_IMX576_1920X1080_SSM_120FPS:
+ case SENSOR_IMX576_1280X720_SSM_240FPS:
+ cis_data->min_coarse_integration_time = SENSOR_IMX576_COARSE_INTEGRATION_TIME_MIN;
+ dbg_sensor(1, "min_coarse_integration_time(%d)\n",
+ cis_data->min_coarse_integration_time);
+ break;
+ case SENSOR_IMX576_2832X2124_120FPS:
+ cis_data->min_coarse_integration_time = 4;
+ dbg_sensor(1, "min_coarse_integration_time(%d)\n",
+ cis_data->min_coarse_integration_time);
+ break;
+ default:
+ err("[%s] Unsupport imx576 sensor mode\n", __func__);
+ cis_data->min_coarse_integration_time = SENSOR_IMX576_COARSE_INTEGRATION_TIME_MIN;
+ dbg_sensor(1, "min_coarse_integration_time(%d)\n",
+ cis_data->min_coarse_integration_time);
+ break;
+ }
+}
+
+static void sensor_imx576_cis_data_calculation(const struct sensor_pll_info_compact *pll_info,
+ cis_shared_data *cis_data)
+{
+ u32 vt_pix_clk_hz = 0;
+ u32 frame_rate = 0, max_fps = 0, frame_valid_us = 0;
+
+ FIMC_BUG_VOID(!pll_info);
+
+ /* 1. get pclk value from pll info */
+ vt_pix_clk_hz = pll_info->pclk;
+
+ /* 2. the time of processing one frame calculation (us) */
+ cis_data->min_frame_us_time = ((pll_info->frame_length_lines * pll_info->line_length_pck)
+ / (vt_pix_clk_hz / (1000 * 1000)));
+ cis_data->cur_frame_us_time = cis_data->min_frame_us_time;
+
+ /* 3. FPS calculation */
+ frame_rate = vt_pix_clk_hz / (pll_info->frame_length_lines * pll_info->line_length_pck);
+ dbg_sensor(1, "frame_rate (%d) = vt_pix_clk_hz(%d) / "
+ KERN_CONT "(pll_info->frame_length_lines(%d) * pll_info->line_length_pck(%d))\n",
+ frame_rate, vt_pix_clk_hz, pll_info->frame_length_lines, pll_info->line_length_pck);
+
+ /* calculate max fps */
+ max_fps = (vt_pix_clk_hz * 10) / (pll_info->frame_length_lines * pll_info->line_length_pck);
+ max_fps = (max_fps % 10 >= 5 ? frame_rate + 1 : frame_rate);
+
+ cis_data->pclk = vt_pix_clk_hz;
+ cis_data->max_fps = max_fps;
+ cis_data->frame_length_lines = pll_info->frame_length_lines;
+ cis_data->line_length_pck = pll_info->line_length_pck;
+ cis_data->line_readOut_time = sensor_cis_do_div64((u64)cis_data->line_length_pck
+ * (u64)(1000 * 1000 * 1000), cis_data->pclk);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+ cis_data->stream_on = false;
+
+ /* Frame valid time calcuration */
+ frame_valid_us = sensor_cis_do_div64((u64)cis_data->cur_height * (u64)cis_data->line_length_pck
+ * (u64)(1000 * 1000), cis_data->pclk);
+ cis_data->frame_valid_us_time = (int)frame_valid_us;
+
+ dbg_sensor(1, "%s\n", __func__);
+ dbg_sensor(1, "Sensor size(%d x %d) setting: SUCCESS!\n", cis_data->cur_width, cis_data->cur_height);
+ dbg_sensor(1, "Frame Valid(us): %d\n", frame_valid_us);
+ dbg_sensor(1, "rolling_shutter_skew: %lld\n", cis_data->rolling_shutter_skew);
+
+ dbg_sensor(1, "Fps: %d, max fps(%d)\n", frame_rate, cis_data->max_fps);
+ dbg_sensor(1, "min_frame_time(%d us)\n", cis_data->min_frame_us_time);
+ dbg_sensor(1, "Pixel rate(Mbps): %d\n", cis_data->pclk / 1000000);
+
+ /* Frame period calculation */
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis_data->rolling_shutter_skew = (cis_data->cur_height - 1) * cis_data->line_readOut_time;
+
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__,
+ cis_data->frame_time, cis_data->rolling_shutter_skew);
+
+ /* Constant values */
+ cis_data->min_fine_integration_time = SENSOR_IMX576_FINE_INTEGRATION_TIME_MIN;
+ cis_data->max_fine_integration_time = SENSOR_IMX576_FINE_INTEGRATION_TIME_MAX;
+ cis_data->min_coarse_integration_time = SENSOR_IMX576_COARSE_INTEGRATION_TIME_MIN;
+ cis_data->max_margin_coarse_integration_time = SENSOR_IMX576_COARSE_INTEGRATION_TIME_MAX_MARGIN;
+ info("%s: done", __func__);
+}
+
+void sensor_imx576_cis_data_calc(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG_VOID(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG_VOID(!cis);
+ FIMC_BUG_VOID(!cis->cis_data);
+
+ if (mode > sensor_imx576_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ return;
+ }
+
+ /* If check_rev fail when cis_init, one more check_rev in mode_change */
+ if (cis->rev_flag == true) {
+ cis->rev_flag = false;
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ err("sensor_imx576_check_rev is fail: ret(%d)", ret);
+ return;
+ }
+ }
+
+ sensor_imx576_cis_data_calculation(sensor_imx576_pllinfos[mode], cis->cis_data);
+}
+
+static int sensor_imx576_wait_stream_off_status(cis_shared_data *cis_data)
+{
+ int ret = 0;
+ u32 timeout = 0;
+
+ FIMC_BUG(!cis_data);
+
+#define STREAM_OFF_WAIT_TIME 250
+ while (timeout < STREAM_OFF_WAIT_TIME) {
+ if (cis_data->is_active_area == false &&
+ cis_data->stream_on == false) {
+ pr_debug("actual stream off\n");
+ break;
+ }
+ timeout++;
+ }
+
+ if (timeout == STREAM_OFF_WAIT_TIME) {
+ pr_err("actual stream off wait timeout\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+int sensor_imx576_cis_check_rev(struct fimc_is_cis *cis)
+{
+ int ret = 0;
+ u8 rev = 0, status = 0;
+ struct i2c_client *client;
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* Specify OTP Page Address for READ - Page63(dec) */
+ fimc_is_sensor_write8(client, 0x0A02, 0x3F);
+
+ /* Turn ON OTP Read MODE */
+ fimc_is_sensor_write8(client, 0x0A00, 0x01);
+
+ /* Check status - 0x01 : read ready*/
+ fimc_is_sensor_read8(client, 0x0A01, &status);
+ if ((status & 0x1) == false)
+ err("status fail, (%d)", status);
+
+ /* Readout data
+ * addr = 0x0018
+ * value = 0x10 ---> MP0 (frist sample)
+ * value = 0x11 ---> MP (for MP)
+ */
+ ret = fimc_is_sensor_read8(client, 0x0018, &rev);
+ if (ret < 0) {
+ err("fimc_is_sensor_read8 fail (ret %d)", ret);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis->cis_data->cis_rev = rev;
+ probe_info("imx576 rev:%x", rev);
+
+ return 0;
+}
+
+/* CIS OPS */
+int sensor_imx576_cis_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ u32 setfile_index = 0;
+ cis_setting_info setinfo;
+
+ setinfo.param = NULL;
+ setinfo.return_value = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ FIMC_BUG(!cis->cis_data);
+ memset(cis->cis_data, 0, sizeof(cis_shared_data));
+
+ probe_info("%s imx576 init\n", __func__);
+ cis->rev_flag = false;
+
+ ret = sensor_imx576_cis_check_rev(cis);
+ if (ret < 0) {
+ warn("sensor_imx576_check_rev is fail when cis init");
+ cis->rev_flag = true;
+ ret = 0;
+ }
+
+ info("[%s] cis_rev=%#x\n", __func__, cis->cis_data->cis_rev);
+
+ if (cis->cis_data->cis_rev == 0x11) {
+ probe_info("%s setfile_A for MP\n", __func__);
+ sensor_imx576_global = sensor_imx576_setfile_A_Global;
+ sensor_imx576_global_size = ARRAY_SIZE(sensor_imx576_setfile_A_Global);
+ sensor_imx576_setfiles = sensor_imx576_setfiles_A;
+ sensor_imx576_setfile_sizes = sensor_imx576_setfile_A_sizes;
+ sensor_imx576_pllinfos = sensor_imx576_pllinfos_A;
+ sensor_imx576_max_setfile_num = ARRAY_SIZE(sensor_imx576_setfiles_A);
+ } else if (cis->cis_data->cis_rev == 0x10) {
+ probe_info("%s setfile_B for MP0\n", __func__);
+ sensor_imx576_global = sensor_imx576_setfile_B_Global;
+ sensor_imx576_global_size = ARRAY_SIZE(sensor_imx576_setfile_B_Global);
+ sensor_imx576_setfiles = sensor_imx576_setfiles_B;
+ sensor_imx576_setfile_sizes = sensor_imx576_setfile_B_sizes;
+ sensor_imx576_pllinfos = sensor_imx576_pllinfos_B;
+ sensor_imx576_max_setfile_num = ARRAY_SIZE(sensor_imx576_setfiles_B);
+ } else {
+ probe_info("%s chip_rev(%d) is wrong! setfile_A for MP (default)\n", __func__, cis->cis_data->cis_rev);
+ sensor_imx576_global = sensor_imx576_setfile_A_Global;
+ sensor_imx576_global_size = ARRAY_SIZE(sensor_imx576_setfile_A_Global);
+ sensor_imx576_setfiles = sensor_imx576_setfiles_A;
+ sensor_imx576_setfile_sizes = sensor_imx576_setfile_A_sizes;
+ sensor_imx576_pllinfos = sensor_imx576_pllinfos_A;
+ sensor_imx576_max_setfile_num = ARRAY_SIZE(sensor_imx576_setfiles_A);
+ }
+
+ cis->cis_data->product_name = cis->id;
+ cis->cis_data->cur_width = SENSOR_IMX576_MAX_WIDTH;
+ cis->cis_data->cur_height = SENSOR_IMX576_MAX_HEIGHT;
+ cis->cis_data->low_expo_start = 33000;
+ cis->need_mode_change = false;
+ cis->long_term_mode.sen_strm_off_on_step = 0;
+
+ sensor_imx576_cis_data_calculation(sensor_imx576_pllinfos[setfile_index], cis->cis_data);
+ sensor_imx576_set_integration_max_margin(setfile_index, cis->cis_data);
+ sensor_imx576_set_integration_min(setfile_index, cis->cis_data);
+
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_exposure_time, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max exposure time : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_analog_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max again : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_min_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] min dgain : %d\n", __func__, setinfo.return_value);
+ setinfo.return_value = 0;
+ CALL_CISOPS(cis, cis_get_max_digital_gain, subdev, &setinfo.return_value);
+ dbg_sensor(1, "[%s] max dgain : %d\n", __func__, setinfo.return_value);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_imx576_cis_log_status(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client = NULL;
+ u8 data8 = 0;
+ u16 data16 = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (!cis) {
+ err("cis is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -ENODEV;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ pr_err("[SEN:DUMP] *******************************\n");
+ fimc_is_sensor_read16(client, 0x0000, &data16);
+ pr_err("[SEN:DUMP] model_id(%x)\n", data16);
+ fimc_is_sensor_read8(client, 0x0002, &data8);
+ pr_err("[SEN:DUMP] revision_number(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0005, &data8);
+ pr_err("[SEN:DUMP] frame_count(%x)\n", data8);
+ fimc_is_sensor_read8(client, 0x0100, &data8);
+ pr_err("[SEN:DUMP] mode_select(%x)\n", data8);
+
+ sensor_cis_dump_registers(subdev, sensor_imx576_setfiles[0], sensor_imx576_setfile_sizes[0]);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ pr_err("[SEN:DUMP] *******************************\n");
+
+p_err:
+ return ret;
+}
+
+#if USE_GROUP_PARAM_HOLD
+static int sensor_imx576_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct i2c_client *client = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if (hold == cis->cis_data->group_param_hold) {
+ pr_debug("already group_param_hold (%d)\n", cis->cis_data->group_param_hold);
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write8(client, 0x0104, hold);
+ if (ret < 0)
+ goto p_err;
+
+ cis->cis_data->group_param_hold = hold;
+ ret = 1;
+p_err:
+ return ret;
+}
+#else
+static inline int sensor_imx576_cis_group_param_hold_func(struct v4l2_subdev *subdev, unsigned int hold)
+{ return 0; }
+#endif
+
+/* Input
+ * hold : true - hold, flase - no hold
+ * Output
+ * return: 0 - no effect(already hold or no hold)
+ * positive - setted by request
+ * negative - ERROR value
+ */
+int sensor_imx576_cis_group_param_hold(struct v4l2_subdev *subdev, bool hold)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ ret = sensor_imx576_cis_group_param_hold_func(subdev, hold);
+ if (ret < 0)
+ goto p_err;
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_imx576_cis_set_global_setting(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct sensor_open_extended *ext_info;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* setfile global setting is at camera entrance */
+ info("[%s] global setting start\n", __func__);
+ ret = sensor_cis_set_registers(subdev, sensor_imx576_global, sensor_imx576_global_size);
+ if (ret < 0) {
+ err("sensor_imx576_set_registers fail!!");
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[%s] global setting done\n", __func__);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_imx576_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct fimc_is_module_enum *module;
+ struct sensor_open_extended *ext_info;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ if (mode > sensor_imx576_max_setfile_num) {
+ err("invalid mode(%d)!!", mode);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* If check_rev(Sensor ID in OTP) of IMX576 fail when cis_init, one more check_rev in mode_change */
+ if (cis->rev_flag == true) {
+ cis->rev_flag = false;
+ ret = sensor_cis_check_rev(cis);
+ if (ret < 0) {
+ err("sensor_imx576_check_rev is fail");
+ goto p_err;
+ }
+ info("[%s] cis_rev=%#x\n", __func__, cis->cis_data->cis_rev);
+ }
+
+#if 0 /* cis_data_calculation is called in module_s_format */
+ sensor_imx576_cis_data_calculation(sensor_imx576_pllinfos[mode], cis->cis_data);
+#endif
+ sensor_imx576_set_integration_max_margin(mode, cis->cis_data);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ module = sensor_peri->module;
+ ext_info = &module->ext;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+
+ info("[%s] mode=%d, mode change setting start\n", __func__, mode);
+ ret = sensor_cis_set_registers(subdev, sensor_imx576_setfiles[mode], sensor_imx576_setfile_sizes[mode]);
+ if (ret < 0) {
+ err("sensor_imx576_set_registers fail!!");
+ goto p_err;
+ }
+ dbg_sensor(1, "[%s] mode changed(%d)\n", __func__, mode);
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+/* TODO: Sensor set size sequence(sensor done, sensor stop, 3AA done in FW case */
+int sensor_imx576_cis_set_size(struct v4l2_subdev *subdev, cis_shared_data *cis_data)
+{
+ int ret = 0;
+ bool binning = false;
+ u32 ratio_w = 0, ratio_h = 0, start_x = 0, start_y = 0, end_x = 0, end_y = 0;
+ u32 even_x = 0, odd_x = 0, even_y = 0, odd_y = 0;
+ struct i2c_client *client = NULL;
+ struct fimc_is_cis *cis = NULL;
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!cis);
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ if (unlikely(!cis_data)) {
+ err("cis data is NULL");
+ if (unlikely(!cis->cis_data)) {
+ ret = -EINVAL;
+ goto p_err;
+ } else {
+ cis_data = cis->cis_data;
+ }
+ }
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ /* Wait actual stream off */
+ ret = sensor_imx576_wait_stream_off_status(cis_data);
+ if (ret) {
+ err("Must stream off\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ binning = cis_data->binning;
+ if (binning) {
+ ratio_w = (SENSOR_IMX576_MAX_WIDTH / cis_data->cur_width);
+ ratio_h = (SENSOR_IMX576_MAX_HEIGHT / cis_data->cur_height);
+ } else {
+ ratio_w = 1;
+ ratio_h = 1;
+ }
+
+ if (((cis_data->cur_width * ratio_w) > SENSOR_IMX576_MAX_WIDTH) ||
+ ((cis_data->cur_height * ratio_h) > SENSOR_IMX576_MAX_HEIGHT)) {
+ err("Config max sensor size over~!!\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ /* 1. page_select */
+ ret = fimc_is_sensor_write16(client, 0x6028, 0x2000);
+ if (ret < 0)
+ goto p_err;
+
+ /* 2. pixel address region setting */
+ start_x = ((SENSOR_IMX576_MAX_WIDTH - cis_data->cur_width * ratio_w) / 2) & (~0x1);
+ start_y = ((SENSOR_IMX576_MAX_HEIGHT - cis_data->cur_height * ratio_h) / 2) & (~0x1);
+ end_x = start_x + (cis_data->cur_width * ratio_w - 1);
+ end_y = start_y + (cis_data->cur_height * ratio_h - 1);
+
+ if (!(end_x & (0x1)) || !(end_y & (0x1))) {
+ err("Sensor pixel end address must odd\n");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0344, start_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0346, start_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0348, end_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034A, end_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 3. output address setting */
+ ret = fimc_is_sensor_write16(client, 0x034C, cis_data->cur_width);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x034E, cis_data->cur_height);
+ if (ret < 0)
+ goto p_err;
+
+ /* If not use to binning, sensor image should set only crop */
+ if (!binning) {
+ dbg_sensor(1, "Sensor size set is not binning\n");
+ goto p_err;
+ }
+
+ /* 4. sub sampling setting */
+ even_x = 1; /* 1: not use to even sampling */
+ even_y = 1;
+ odd_x = (ratio_w * 2) - even_x;
+ odd_y = (ratio_h * 2) - even_y;
+
+ ret = fimc_is_sensor_write16(client, 0x0380, even_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0382, odd_x);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0384, even_y);
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write16(client, 0x0386, odd_y);
+ if (ret < 0)
+ goto p_err;
+
+ /* 5. binnig setting */
+ ret = fimc_is_sensor_write8(client, 0x0900, binning); /* 1: binning enable, 0: disable */
+ if (ret < 0)
+ goto p_err;
+ ret = fimc_is_sensor_write8(client, 0x0901, (ratio_w << 4) | ratio_h);
+ if (ret < 0)
+ goto p_err;
+
+ /* 6. scaling setting: but not use */
+ /* scaling_mode (0: No scaling, 1: Horizontal, 2: Full) */
+ ret = fimc_is_sensor_write16(client, 0x0400, 0x0000);
+ if (ret < 0)
+ goto p_err;
+ /* down_scale_m: 1 to 16 upwards (scale_n: 16(fixed)) */
+ /* down scale factor = down_scale_m / down_scale_n */
+ ret = fimc_is_sensor_write16(client, 0x0404, 0x0010);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->frame_time = (cis_data->line_readOut_time * cis_data->cur_height / 1000);
+ cis->cis_data->rolling_shutter_skew = (cis->cis_data->cur_height - 1) * cis->cis_data->line_readOut_time;
+ dbg_sensor(1, "[%s] frame_time(%d), rolling_shutter_skew(%lld)\n", __func__, cis->cis_data->frame_time,
+ cis->cis_data->rolling_shutter_skew);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec) * 1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+ return ret;
+}
+
+int sensor_imx576_cis_stream_on(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ FIMC_BUG(!sensor_peri);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+
+#ifdef DEBUG_IMX576_PLL
+ {
+ u16 pll;
+
+ fimc_is_sensor_read16(client, 0x0300, &pll);
+ dbg_sensor(1, "______ vt_pix_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0302, &pll);
+ dbg_sensor(1, "______ vt_sys_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0304, &pll);
+ dbg_sensor(1, "______ pre_pll_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0306, &pll);
+ dbg_sensor(1, "______ pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030a, &pll);
+ dbg_sensor(1, "______ op_sys_clk_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030c, &pll);
+ dbg_sensor(1, "______ op_prepllck_div(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x030e, &pll);
+ dbg_sensor(1, "______ op_pll_multiplier(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0310, &pll);
+ dbg_sensor(1, "______ pll_mult_driv(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0340, &pll);
+ dbg_sensor(1, "______ frame_length_lines(%x)\n", pll);
+ fimc_is_sensor_read16(client, 0x0342, &pll);
+ dbg_sensor(1, "______ line_length_pck(%x)\n", pll);
+ }
+#endif
+
+ info("[%s] start\n", __func__);
+ /* Sensor stream on */
+ fimc_is_sensor_write8(client, 0x0100, 0x01);
+
+ sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->stream_on = true;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_imx576_cis_stream_off(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s\n", cis->id, __func__);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+
+ fimc_is_sensor_write8(client, 0x0100, 0x00);
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ cis_data->stream_on = false;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_imx576_cis_set_exposure_time(struct v4l2_subdev *subdev, struct ae_param *target_exposure)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u16 long_coarse_int = 0;
+ u16 short_coarse_int = 0;
+ u32 line_length_pck = 0;
+ u32 min_fine_int = 0;
+ u8 arrayBuf[4];
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_exposure);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ if ((target_exposure->long_val <= 0) || (target_exposure->short_val <= 0)) {
+ err("[%s] invalid target exposure(%d, %d)\n", __func__,
+ target_exposure->long_val, target_exposure->short_val);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), target long(%d), short(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, target_exposure->long_val, target_exposure->short_val);
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ min_fine_int = cis_data->min_fine_integration_time;
+
+ long_coarse_int = ((target_exposure->long_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+ short_coarse_int = ((target_exposure->short_val * vt_pic_clk_freq_mhz) - min_fine_int) / line_length_pck;
+
+ if (long_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->max_coarse_integration_time);
+ long_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (short_coarse_int > cis_data->max_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) max(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->max_coarse_integration_time);
+ short_coarse_int = cis_data->max_coarse_integration_time;
+ }
+
+ if (long_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), long coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, long_coarse_int, cis_data->min_coarse_integration_time);
+ long_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ if (short_coarse_int < cis_data->min_coarse_integration_time) {
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), short coarse(%d) min(%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, short_coarse_int, cis_data->min_coarse_integration_time);
+ short_coarse_int = cis_data->min_coarse_integration_time;
+ }
+
+ cis_data->cur_long_exposure_coarse = long_coarse_int;
+ cis_data->cur_short_exposure_coarse = short_coarse_int;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ // WDR mode off
+ if (fimc_is_vender_wdr_mode_on(cis_data))
+ fimc_is_sensor_write8(cis->client, 0x0220, 0x63);
+ else
+ fimc_is_sensor_write8(cis->client, 0x0220, 0x62);
+
+ //Long exposure
+ arrayBuf[0] = (cis_data->cur_long_exposure_coarse & 0xFF00) >> 8;
+ arrayBuf[1] = cis_data->cur_long_exposure_coarse & 0xFF;
+ ret = fimc_is_sensor_write8_array(client, 0x0204, arrayBuf, 2);
+ if (ret < 0)
+ goto p_err;
+
+ //Short exposure
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ arrayBuf[0] = (cis_data->cur_short_exposure_coarse & 0xFF00) >> 8;
+ arrayBuf[1] = cis_data->cur_short_exposure_coarse & 0xFF;
+ ret = fimc_is_sensor_write8_array(client, 0x0224, arrayBuf, 2);
+ if (ret < 0)
+ goto p_err;
+ }
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), vt_pic_clk_freq_mhz (%d),"
+ KERN_CONT "line_length_pck(%d), min_fine_int (%d)\n", cis->id, __func__,
+ cis_data->sen_vsync_count, vt_pic_clk_freq_mhz, line_length_pck, min_fine_int);
+ dbg_sensor(1, "[MOD:D:%d] %s, vsync_cnt(%d), frame_length_lines(%#x),"
+ KERN_CONT "long_coarse_int %#x, short_coarse_int %#x\n", cis->id, __func__,
+ cis_data->sen_vsync_count, cis_data->frame_length_lines, long_coarse_int, short_coarse_int);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_get_min_exposure_time(struct v4l2_subdev *subdev, u32 *min_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis = NULL;
+ cis_shared_data *cis_data = NULL;
+ u32 min_integration_time = 0;
+ u32 min_coarse = 0;
+ u32 min_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ min_coarse = cis_data->min_coarse_integration_time;
+ min_fine = cis_data->min_fine_integration_time;
+
+ min_integration_time = ((line_length_pck * min_coarse) + min_fine) / vt_pic_clk_freq_mhz;
+ *min_expo = min_integration_time;
+
+ dbg_sensor(1, "[%s] min integration time %d\n", __func__, min_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_imx576_cis_get_max_exposure_time(struct v4l2_subdev *subdev, u32 *max_expo)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+ u32 max_integration_time = 0;
+ u32 max_coarse_margin = 0;
+ u32 max_fine_margin = 0;
+ u32 max_coarse = 0;
+ u32 max_fine = 0;
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_expo);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ if (vt_pic_clk_freq_mhz == 0) {
+ pr_err("[MOD:D:%d] %s, Invalid vt_pic_clk_freq_mhz(%d)\n", cis->id, __func__, vt_pic_clk_freq_mhz);
+ goto p_err;
+ }
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = cis_data->frame_length_lines;
+
+ max_coarse_margin = cis_data->max_margin_coarse_integration_time;
+ max_fine_margin = line_length_pck - cis_data->min_fine_integration_time;
+ max_coarse = frame_length_lines - max_coarse_margin;
+ max_fine = cis_data->max_fine_integration_time;
+
+ max_integration_time = ((line_length_pck * max_coarse) + max_fine) / vt_pic_clk_freq_mhz;
+
+ *max_expo = max_integration_time;
+
+ /* TODO: Is this values update hear? */
+ cis_data->max_margin_fine_integration_time = max_fine_margin;
+ cis_data->max_coarse_integration_time = max_coarse;
+
+ dbg_sensor(1, "[%s] max integration time %d, max margin fine integration %d, max coarse integration %d\n",
+ __func__, max_integration_time, cis_data->max_margin_fine_integration_time,
+ cis_data->max_coarse_integration_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_imx576_cis_adjust_frame_duration(struct v4l2_subdev *subdev,
+ u32 input_exposure_time,
+ u32 *target_duration)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u32 frame_length_lines = 0;
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_duration);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+ frame_length_lines = ((vt_pic_clk_freq_mhz * input_exposure_time) / line_length_pck);
+ frame_length_lines += cis_data->max_margin_coarse_integration_time;
+
+ frame_duration = (frame_length_lines * line_length_pck) / vt_pic_clk_freq_mhz;
+
+ dbg_sensor(1, "[%s](vsync cnt = %d) input exp(%d), adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, input_exposure_time, frame_duration,
+ cis_data->min_frame_us_time);
+ dbg_sensor(1, "[%s](vsync cnt = %d) adj duration, frame duraion(%d), min_frame_us(%d)\n",
+ __func__, cis_data->sen_vsync_count, frame_duration, cis_data->min_frame_us_time);
+
+ *target_duration = MAX(frame_duration, cis_data->min_frame_us_time);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+ return ret;
+}
+
+int sensor_imx576_cis_set_frame_duration(struct v4l2_subdev *subdev, u32 frame_duration)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u32 vt_pic_clk_freq_mhz = 0;
+ u32 line_length_pck = 0;
+ u16 frame_length_lines = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ if (frame_duration < cis_data->min_frame_us_time) {
+ dbg_sensor(1, "frame duration is less than min(%d)\n", frame_duration);
+ frame_duration = cis_data->min_frame_us_time;
+ }
+
+ vt_pic_clk_freq_mhz = cis_data->pclk / (1000 * 1000);
+ line_length_pck = cis_data->line_length_pck;
+
+ frame_length_lines = (u16)((vt_pic_clk_freq_mhz * frame_duration) / line_length_pck);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, vt_pic_clk_freq_mhz(%#x) frame_duration = %d us,"
+ KERN_CONT "(line_length_pck%#x), frame_length_lines(%#x)\n",
+ cis->id, __func__, vt_pic_clk_freq_mhz, frame_duration,
+ line_length_pck, frame_length_lines);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_write16(client, 0x0340, frame_length_lines);
+ if (ret < 0)
+ goto p_err;
+
+ cis_data->cur_frame_us_time = frame_duration;
+ cis_data->frame_length_lines = frame_length_lines;
+ cis_data->max_coarse_integration_time = cis_data->frame_length_lines
+ - cis_data->max_margin_coarse_integration_time;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_set_frame_rate(struct v4l2_subdev *subdev, u32 min_fps)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 frame_duration = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ if (min_fps > cis_data->max_fps) {
+ err("[MOD:D:%d] %s, request FPS is too high(%d), set to max(%d)\n",
+ cis->id, __func__, min_fps, cis_data->max_fps);
+ min_fps = cis_data->max_fps;
+ }
+
+ if (min_fps == 0) {
+ err("[MOD:D:%d] %s, request FPS is 0, set to min FPS(1)\n",
+ cis->id, __func__);
+ min_fps = 1;
+ }
+
+ frame_duration = (1 * 1000 * 1000) / min_fps;
+
+ dbg_sensor(1, "[MOD:D:%d] %s, set FPS(%d), frame duration(%d)\n",
+ cis->id, __func__, min_fps, frame_duration);
+
+ ret = sensor_imx576_cis_set_frame_duration(subdev, frame_duration);
+ if (ret < 0) {
+ err("[MOD:D:%d] %s, set frame duration is fail(%d)\n",
+ cis->id, __func__, ret);
+ goto p_err;
+ }
+
+ cis_data->min_frame_us_time = frame_duration;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+
+ return ret;
+}
+
+u32 sensor_imx576_cis_calc_again_code(u32 permille)
+{
+ return 1024 - (1024000 / permille);
+}
+
+u32 sensor_imx576_cis_calc_again_permile(u32 code)
+{
+ return 1024000 / (1024 - code);
+}
+
+int sensor_imx576_cis_adjust_analog_gain(struct v4l2_subdev *subdev, u32 input_again, u32 *target_permile)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ cis_shared_data *cis_data;
+
+ u32 again_code = 0;
+ u32 again_permile = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!target_permile);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ cis_data = cis->cis_data;
+
+ again_code = sensor_cis_calc_again_code(input_again);
+
+ if (again_code > cis_data->max_analog_gain[0])
+ again_code = cis_data->max_analog_gain[0];
+ else if (again_code < cis_data->min_analog_gain[0])
+ again_code = cis_data->min_analog_gain[0];
+
+ again_permile = sensor_imx576_cis_calc_again_permile(again_code);
+
+ dbg_sensor(1, "[%s] min again(%d), max(%d), input_again(%d), code(%d), permile(%d)\n", __func__,
+ cis_data->max_analog_gain[0],
+ cis_data->min_analog_gain[0],
+ input_again,
+ again_code,
+ again_permile);
+
+ *target_permile = again_permile;
+
+ return ret;
+}
+
+int sensor_imx576_cis_set_analog_gain(struct v4l2_subdev *subdev, struct ae_param *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ u16 analog_gain = 0;
+ u8 arrayBuf[2];
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ analog_gain = (u16)sensor_imx576_cis_calc_again_code(again->val);
+
+ if (analog_gain < cis->cis_data->min_analog_gain[0])
+ analog_gain = cis->cis_data->min_analog_gain[0];
+
+ if (analog_gain > cis->cis_data->max_analog_gain[0])
+ analog_gain = cis->cis_data->max_analog_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count, again->val, analog_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ /* Analog gain */
+ arrayBuf[0] = (analog_gain & 0xFF00) >> 8;
+ arrayBuf[1] = analog_gain & 0xFF;
+ ret = fimc_is_sensor_write8_array(client, 0x0204, arrayBuf, 2);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_get_analog_gain(struct v4l2_subdev *subdev, u32 *again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 analog_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &analog_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *again = sensor_imx576_cis_calc_again_permile(analog_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_again = %d us, analog_gain(%#x)\n",
+ cis->id, __func__, *again, analog_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_get_min_analog_gain(struct v4l2_subdev *subdev, u32 *min_again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0216, &read_value);
+ if (ret < 0) {
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0216, read_value, ret);
+ goto p_err;
+ }
+
+ cis_data->min_analog_gain[0] = read_value;
+ cis_data->min_analog_gain[1] = sensor_imx576_cis_calc_again_permile(cis_data->min_analog_gain[0]);
+ *min_again = cis_data->min_analog_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_analog_gain[0],
+ cis_data->min_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_get_max_analog_gain(struct v4l2_subdev *subdev, u32 *max_again)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+ u16 read_value = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_again);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x0204, &read_value);
+ if (ret < 0) {
+ err("i2c transfer fail addr(%x), val(%x), ret = %d\n", 0x0204, read_value, ret);
+ goto p_err;
+ }
+
+ cis_data->max_analog_gain[0] = read_value;
+ cis_data->max_analog_gain[1] = sensor_imx576_cis_calc_again_permile(cis_data->max_analog_gain[0]);
+ *max_again = cis_data->max_analog_gain[1];
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_analog_gain[0],
+ cis_data->max_analog_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_set_digital_gain(struct v4l2_subdev *subdev, struct ae_param *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+ u16 long_gain = 0;
+ u16 short_gain = 0;
+ u8 dgains[2] = {0};
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+
+ long_gain = (u16)sensor_cis_calc_dgain_code(dgain->long_val);
+ short_gain = (u16)sensor_cis_calc_dgain_code(dgain->short_val);
+
+ if (long_gain < cis->cis_data->min_digital_gain[0])
+ long_gain = cis->cis_data->min_digital_gain[0];
+
+ if (long_gain > cis->cis_data->max_digital_gain[0])
+ long_gain = cis->cis_data->max_digital_gain[0];
+
+ if (short_gain < cis->cis_data->min_digital_gain[0])
+ short_gain = cis->cis_data->min_digital_gain[0];
+
+ if (short_gain > cis->cis_data->max_digital_gain[0])
+ short_gain = cis->cis_data->max_digital_gain[0];
+
+ dbg_sensor(1, "[MOD:D:%d] %s(vsync cnt = %d), input_dgain = %d/%d us,"
+ KERN_CONT "long_gain(%#x), short_gain(%#x)\n",
+ cis->id, __func__, cis->cis_data->sen_vsync_count,
+ dgain->long_val, dgain->short_val, long_gain, short_gain);
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ // Set current short & long digitial gain
+ // 0x0218 ~ 0x0219 : ST_DIG_GAIN_GLOBAL
+ // 0x020E ~ 0x020F : DIG_GAIN_GLOBAL
+ if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ dgains[0] = (short_gain & 0xFF00) >> 8;
+ dgains[1] = short_gain & 0xFF;
+ ret = fimc_is_sensor_write8_array(client, 0x0218, dgains, 2);
+ if (ret < 0)
+ goto p_err;
+ }
+ dgains[0] = (long_gain & 0xFF00) >> 8;
+ dgains[1] = long_gain & 0xFF;
+ ret = fimc_is_sensor_write8_array(client, 0x020E, dgains, 2);
+ if (ret < 0)
+ goto p_err;
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_get_digital_gain(struct v4l2_subdev *subdev, u32 *dgain)
+{
+ int ret = 0;
+ int hold = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+
+ u16 digital_gain = 0;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ I2C_MUTEX_LOCK(cis->i2c_lock);
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x01);
+ if (hold < 0) {
+ ret = hold;
+ goto p_err;
+ }
+
+ ret = fimc_is_sensor_read16(client, 0x020E, &digital_gain);
+ if (ret < 0)
+ goto p_err;
+
+ *dgain = sensor_cis_calc_dgain_permile(digital_gain);
+
+ dbg_sensor(1, "[MOD:D:%d] %s, cur_dgain = %d us, digital_gain(%#x)\n",
+ cis->id, __func__, *dgain, digital_gain);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ if (hold > 0) {
+ hold = sensor_imx576_cis_group_param_hold_func(subdev, 0x00);
+ if (hold < 0)
+ ret = hold;
+ }
+ I2C_MUTEX_UNLOCK(cis->i2c_lock);
+
+ return ret;
+}
+
+int sensor_imx576_cis_get_min_digital_gain(struct v4l2_subdev *subdev, u32 *min_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!min_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->min_digital_gain[0] = 0x100;
+ cis_data->min_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->min_digital_gain[0]);
+
+ *min_dgain = cis_data->min_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->min_digital_gain[0],
+ cis_data->min_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_imx576_cis_get_max_digital_gain(struct v4l2_subdev *subdev, u32 *max_dgain)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct i2c_client *client;
+ cis_shared_data *cis_data;
+
+#ifdef DEBUG_SENSOR_TIME
+ struct timeval st, end;
+
+ do_gettimeofday(&st);
+#endif
+
+ FIMC_BUG(!subdev);
+ FIMC_BUG(!max_dgain);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!cis);
+ FIMC_BUG(!cis->cis_data);
+
+ client = cis->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ cis_data = cis->cis_data;
+ cis_data->max_digital_gain[0] = 0xfff;
+ cis_data->max_digital_gain[1] = sensor_cis_calc_dgain_permile(cis_data->max_digital_gain[0]);
+
+ *max_dgain = cis_data->max_digital_gain[1];
+
+ dbg_sensor(1, "[%s] code %d, permile %d\n", __func__, cis_data->max_digital_gain[0],
+ cis_data->max_digital_gain[1]);
+
+#ifdef DEBUG_SENSOR_TIME
+ do_gettimeofday(&end);
+ dbg_sensor(1, "[%s] time %lu us\n", __func__, (end.tv_sec - st.tv_sec)*1000000 + (end.tv_usec - st.tv_usec));
+#endif
+
+p_err:
+ return ret;
+}
+
+int sensor_imx576_cis_long_term_exposure(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct fimc_is_long_term_expo_mode *lte_mode;
+ unsigned char cit_lshift_val = 0;
+
+ FIMC_BUG(!subdev);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ lte_mode = &cis->long_term_mode;
+
+ /* LTE mode or normal mode set */
+ if (lte_mode->sen_strm_off_on_enable) {
+ if (lte_mode->expo[0] > 500000) {
+ cit_lshift_val = (unsigned char)(lte_mode->expo[0] / 500000);
+ cit_lshift_val = cit_lshift_val / 2;
+ lte_mode->expo[0] = 500000;
+ ret |= fimc_is_sensor_write8(cis->client, 0x3100, cit_lshift_val);
+ }
+ } else {
+ cit_lshift_val = 0;
+ ret |= fimc_is_sensor_write8(cis->client, 0x3100, cit_lshift_val);
+ }
+
+ info("%s enable(%d) %d %d", __func__, lte_mode->sen_strm_off_on_enable, cit_lshift_val, lte_mode->expo[0]);
+
+ if (ret < 0) {
+ pr_err("ERR[%s]: LTE register setting fail\n", __func__);
+ return ret;
+ }
+
+ return ret;
+}
+static struct fimc_is_cis_ops cis_ops_imx576 = {
+ .cis_init = sensor_imx576_cis_init,
+ .cis_log_status = sensor_imx576_cis_log_status,
+ .cis_group_param_hold = sensor_imx576_cis_group_param_hold,
+ .cis_set_global_setting = sensor_imx576_cis_set_global_setting,
+ .cis_mode_change = sensor_imx576_cis_mode_change,
+ .cis_set_size = sensor_imx576_cis_set_size,
+ .cis_stream_on = sensor_imx576_cis_stream_on,
+ .cis_stream_off = sensor_imx576_cis_stream_off,
+ .cis_set_exposure_time = sensor_imx576_cis_set_exposure_time,
+ .cis_get_min_exposure_time = sensor_imx576_cis_get_min_exposure_time,
+ .cis_get_max_exposure_time = sensor_imx576_cis_get_max_exposure_time,
+ .cis_adjust_frame_duration = sensor_imx576_cis_adjust_frame_duration,
+ .cis_set_frame_duration = sensor_imx576_cis_set_frame_duration,
+ .cis_set_frame_rate = sensor_imx576_cis_set_frame_rate,
+ .cis_adjust_analog_gain = sensor_imx576_cis_adjust_analog_gain,
+ .cis_set_analog_gain = sensor_imx576_cis_set_analog_gain,
+ .cis_get_analog_gain = sensor_imx576_cis_get_analog_gain,
+ .cis_get_min_analog_gain = sensor_imx576_cis_get_min_analog_gain,
+ .cis_get_max_analog_gain = sensor_imx576_cis_get_max_analog_gain,
+ .cis_set_digital_gain = sensor_imx576_cis_set_digital_gain,
+ .cis_get_digital_gain = sensor_imx576_cis_get_digital_gain,
+ .cis_get_min_digital_gain = sensor_imx576_cis_get_min_digital_gain,
+ .cis_get_max_digital_gain = sensor_imx576_cis_get_max_digital_gain,
+ .cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
+#if 0
+ .cis_compensate_gain_for_extremely_br = sensor_imx576_cis_compensate_gain_under_ext_br,
+#endif
+ .cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_data_calculation = sensor_imx576_cis_data_calc,
+ .cis_set_long_term_exposure = sensor_imx576_cis_long_term_exposure,
+};
+
+int cis_imx576_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core = NULL;
+ struct v4l2_subdev *subdev_cis = NULL;
+ struct fimc_is_cis *cis = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ u32 sensor_id[FIMC_IS_STREAM_COUNT] = {0, };
+ u32 sensor_id_len;
+ const u32 *sensor_id_spec;
+ char const *setfile;
+ struct device *dev;
+ struct device_node *dnode;
+ int i;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ sensor_id_spec = of_get_property(dnode, "id", &sensor_id_len);
+ if (!sensor_id_spec) {
+ err("sensor_id num read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ sensor_id_len /= sizeof(*sensor_id_spec);
+
+ probe_info("%s sensor_id_spec %d, sensor_id_len %d\n", __func__,
+ *sensor_id_spec, sensor_id_len);
+
+ ret = of_property_read_u32_array(dnode, "id", sensor_id, sensor_id_len);
+ if (ret) {
+ err("sensor_id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ for (i = 0; i < sensor_id_len; i++) {
+ probe_info("%s sensor_id %d\n", __func__, sensor_id[i]);
+ device = &core->sensor[sensor_id[i]];
+
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_IMX576);
+ if (!sensor_peri) {
+ probe_info("sensor peri is not yet probed");
+ return -EPROBE_DEFER;
+ }
+ }
+
+ for (i = 0; i < sensor_id_len; i++) {
+ device = &core->sensor[sensor_id[i]];
+ sensor_peri = find_peri_by_cis_id(device, SENSOR_NAME_IMX576);
+
+ cis = &sensor_peri->cis;
+ subdev_cis = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_cis) {
+ probe_err("subdev_cis is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ sensor_peri->subdev_cis = subdev_cis;
+
+ cis->id = SENSOR_NAME_IMX576;
+ cis->subdev = subdev_cis;
+ cis->device = sensor_id[i];
+ cis->client = client;
+ sensor_peri->module->client = cis->client;
+ cis->i2c_lock = NULL;
+ cis->ctrl_delay = N_PLUS_TWO_FRAME;
+
+ cis->cis_data = kzalloc(sizeof(cis_shared_data), GFP_KERNEL);
+ if (!cis->cis_data) {
+ err("cis_data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ cis->cis_ops = &cis_ops_imx576;
+
+ /* belows are depend on sensor cis. MUST check sensor spec */
+ cis->bayer_order = OTF_INPUT_ORDER_BAYER_RG_GB;
+
+ if (of_property_read_bool(dnode, "sensor_f_number")) {
+ ret = of_property_read_u32(dnode, "sensor_f_number", &cis->aperture_num);
+ if (ret)
+ warn("f-number read is fail(%d)", ret);
+ } else {
+ cis->aperture_num = F2_2;
+ }
+
+ probe_info("%s f-number %d\n", __func__, cis->aperture_num);
+
+ cis->use_dgain = true;
+ cis->hdr_ctrl_by_again = false;
+
+ v4l2_set_subdevdata(subdev_cis, cis);
+ v4l2_set_subdev_hostdata(subdev_cis, device);
+ snprintf(subdev_cis->name, V4L2_SUBDEV_NAME_SIZE, "cis-subdev.%d", cis->id);
+ }
+
+ ret = of_property_read_string(dnode, "setfile", &setfile);
+ if (ret) {
+ err("setfile index read fail(%d), take default setfile!!", ret);
+ setfile = "default";
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_cis_imx576_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-cis-imx576",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_cis_imx576_match);
+
+static const struct i2c_device_id sensor_cis_imx576_idt[] = {
+ { SENSOR_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_cis_imx576_driver = {
+ .probe = cis_imx576_probe,
+ .driver = {
+ .name = SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_cis_imx576_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_cis_imx576_idt
+};
+
+static int __init sensor_cis_imx576_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_cis_imx576_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_cis_imx576_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_cis_imx576_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_CIS_IMX576_H
+#define FIMC_IS_CIS_IMX576_H
+
+#include "fimc-is-cis.h"
+
+#define EXT_CLK_Mhz (26)
+
+#define SENSOR_IMX576_MAX_WIDTH (5664 + 0)
+#define SENSOR_IMX576_MAX_HEIGHT (4248 + 0)
+
+#define SENSOR_IMX576_FINE_INTEGRATION_TIME_MIN 0x510
+#define SENSOR_IMX576_FINE_INTEGRATION_TIME_MAX 0x510
+#define SENSOR_IMX576_COARSE_INTEGRATION_TIME_MIN 0x06
+#define SENSOR_IMX576_COARSE_INTEGRATION_TIME_MAX_MARGIN 0x0
+
+#define USE_GROUP_PARAM_HOLD (0)
+
+enum sensor_imx576_mode_enum {
+ /* 2x2 Binnig */
+ SENSOR_IMX576_2832X2124_2X2BIN_30FPS = 0,
+ SENSOR_IMX576_2832X1592_2X2BIN_30FPS,
+ SENSOR_IMX576_2832X1376_2X2BIN_30FPS,
+ SENSOR_IMX576_2124X2124_2X2BIN_30FPS,
+
+ /* QBC-HDR */
+ SENSOR_IMX576_2832X2124_QBCHDR_30FPS = 4,
+ SENSOR_IMX576_2832X1592_QBCHDR_30FPS,
+ SENSOR_IMX576_2832X1376_QBCHDR_30FPS,
+ SENSOR_IMX576_2124X2124_QBCHDR_30FPS,
+
+ /* QBC-REMOSAIC */
+ SENSOR_IMX576_5664X4248_QBCREMOSAIC_30FPS = 8,
+ SENSOR_IMX576_5664X3184_QBCREMOSAIC_30FPS,
+ SENSOR_IMX576_5664X2752_QBCREMOSAIC_30FPS,
+ SENSOR_IMX576_4248X4248_QBCREMOSAIC_30FPS,
+
+ /* Super Slow Motion */
+ SENSOR_IMX576_1870X1052_SSM_240FPS = 12,
+ SENSOR_IMX576_1920X1080_SSM_120FPS,
+ SENSOR_IMX576_1280X720_SSM_240FPS,
+
+ /* FAST AE */
+ SENSOR_IMX576_2832X2124_120FPS = 15,
+};
+
+#endif
+
+
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
.cis_wait_streamon = sensor_cis_wait_streamon,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
int cis_rpb_probe(struct i2c_client *client,
return -EINVAL;
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
.cis_get_max_digital_gain = sensor_sr259_cis_get_max_digital_gain,
.cis_compensate_gain_for_extremely_br = sensor_cis_compensate_gain_for_extremely_br,
.cis_wait_streamoff = sensor_cis_wait_streamoff,
+ .cis_set_initial_exposure = sensor_cis_set_initial_exposure,
};
static int cis_sr259_probe(struct i2c_client *client,
sensor_sr259_max_setfile_num = sizeof(sensor_sr259_setfiles_A) / sizeof(sensor_sr259_setfiles_A[0]);
}
+ cis->use_initial_ae = of_property_read_bool(dnode, "use_initial_ae");
+ probe_info("%s use initial_ae(%d)\n", __func__, cis->use_initial_ae);
+
v4l2_i2c_subdev_init(subdev_cis, client, &subdev_ops);
v4l2_set_subdevdata(subdev_cis, cis);
v4l2_set_subdev_hostdata(subdev_cis, device);
u32 min_fine_int = 0;
u16 coarse_int = 0;
u32 compensated_again = 0;
+ u32 coarse_int_standard;
FIMC_BUG(!subdev);
FIMC_BUG(!again);
coarse_int = cis_data->min_coarse_integration_time;
}
- if (coarse_int <= 15) {
+ coarse_int_standard = 15;
+#ifdef CONFIG_CAMERA_CIS_2X5SP_OBJ
+ /* if cis is 2x5sp, coarse_integration is not applyed */
+ if (cis->id == SENSOR_NAME_S5K2X5SP)
+ coarse_int_standard = 2;
+ dbg_sensor(1, "[MOD:D:%d] %s, coarse_int_standard(%d)\n", cis->id, __func__, coarse_int_standard);
+#endif
+ if (coarse_int <= coarse_int_standard) {
compensated_again = (*again * ((expo * vt_pic_clk_freq_mhz) - min_fine_int)) / (line_length_pck * coarse_int);
if (compensated_again < cis_data->min_analog_gain[1]) {
struct fimc_is_cis *cis;
struct i2c_client *client;
cis_shared_data *cis_data;
- u32 wait_cnt = 0, time_out_cnt = 250;
+ u32 wait_cnt = 0, time_out_cnt = 2500;
u8 sensor_fcount = 0;
FIMC_BUG(!subdev);
return 0;
}
+
+int sensor_cis_factory_test(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (unlikely(!cis)) {
+ err("cis is NULL");
+ return -EINVAL;
+ }
+
+ /* sensor mode setting */
+ ret = CALL_CISOPS(cis, cis_set_global_setting, subdev);
+ if (ret < 0) {
+ err("[%s] cis global setting fail\n", __func__);
+ return ret;
+ }
+
+ ret = CALL_CISOPS(cis, cis_mode_change, subdev, 0);
+ if (ret < 0) {
+ err("[%s] cis mode setting(0) fail\n", __func__);
+ return ret;
+ }
+
+ /* sensor stream on */
+ ret = CALL_CISOPS(cis, cis_stream_on, subdev);
+ if (ret < 0) {
+ err("[%s] stream on fail\n", __func__);
+ return ret;
+ }
+
+ ret = CALL_CISOPS(cis, cis_wait_streamon, subdev);
+ if (ret < 0) {
+ err("[%s] sensor wait stream on fail\n", __func__);
+ return ret;
+ }
+
+ msleep(100);
+
+ /* Sensor stream off */
+ ret = CALL_CISOPS(cis, cis_stream_off, subdev);
+ if (ret < 0) {
+ err("[%s] stream off fail\n", __func__);
+ return ret;
+ }
+
+ ret = CALL_CISOPS(cis, cis_wait_streamoff, subdev);
+ if (ret < 0) {
+ err("[%s] stream off fail\n", __func__);
+ return ret;
+ }
+
+ info("[MOD:D:%d] %s: %d\n", cis->id, __func__, ret);
+
+ return ret;
+}
+
+u16 sensor_cis_otp_get_crc16(char *data, int count)
+{
+ char *tmp = data;
+ u32 crc[16];
+ int i, j;
+ u16 crc16 = 0;
+
+ memset(crc, 0, sizeof(crc));
+ for (i = 0; i < count; i++) {
+ for (j = 7; j >= 0; j--) {
+ /* isolate the bit in the byte */
+ u32 doInvert = *tmp & (1 << j);
+
+ /* shift the bit to LSB in the byte */
+ doInvert = doInvert >> j;
+
+ /* XOR required? */
+ doInvert = doInvert ^ crc[15];
+
+ crc[15] = crc[14] ^ doInvert;
+ crc[14] = crc[13];
+ crc[13] = crc[12];
+ crc[12] = crc[11];
+ crc[11] = crc[10];
+ crc[10] = crc[9];
+ crc[9] = crc[8];
+ crc[8] = crc[7];
+ crc[7] = crc[6];
+ crc[6] = crc[5];
+ crc[5] = crc[4];
+ crc[4] = crc[3];
+ crc[3] = crc[2];
+ crc[2] = crc[1] ^ doInvert;
+ crc[1] = crc[0];
+ crc[0] = doInvert;
+ }
+ tmp++;
+ }
+
+ /* convert bits to CRC word */
+ for (i = 0; i < 16; i++)
+ crc16 = crc16 + (crc[i] << i);
+
+ return crc16;
+}
+
+int sensor_cis_otp_read_file(const char *file_name, const void *data, unsigned long size)
+{
+ int ret = 0;
+ long nread;
+ struct file *fp = NULL;
+ mm_segment_t old_fs;
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ fp = filp_open(file_name, O_RDONLY, 0);
+ if (IS_ERR(fp)) {
+ ret = PTR_ERR(fp);
+ pr_err("%s(): open file error(%d)\n", __func__, ret);
+ goto exit;
+ }
+
+ nread = vfs_read(fp, (char __user *)data, size, &fp->f_pos);
+ if (nread != size) {
+ err("failed to read otp file, (%ld) Bytes", nread);
+ ret = -EIO;
+ }
+
+exit:
+ if (!IS_ERR(fp))
+ filp_close(fp, NULL);
+
+ set_fs(old_fs);
+
+ return ret;
+}
+
+int sensor_cis_otp_write_file(const char *file_name, const void *data, unsigned long size)
+{
+ int ret = 0;
+ struct file *fp = NULL;
+ mm_segment_t old_fs;
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ pr_info("%s(), open file %s\n", __func__, file_name);
+
+ fp = filp_open(file_name, O_WRONLY|O_CREAT, 0644);
+ if (IS_ERR(fp)) {
+ ret = PTR_ERR(fp);
+ pr_err("%s(): open file error(%d)\n", __func__, ret);
+ goto exit;
+ }
+
+ pr_info("%s(), write to %s\n", __func__, file_name);
+
+ ret = vfs_write(fp, (const char *)data,
+ size, &fp->f_pos);
+ if (ret < 0)
+ pr_err("%s:write file %s error(%d)\n", __func__, file_name, ret);
+
+exit:
+ if (!IS_ERR(fp))
+ filp_close(fp, NULL);
+
+ set_fs(old_fs);
+
+ return 0;
+}
#ifndef FIMC_IS_CIS_H
#define FIMC_IS_CIS_H
-#ifdef CONFIG_VENDER_PSV
-#define CIS_TEST_PATTERN_MODE 2 /* PSV set only color-bar */
-#else
+/* if you need color-bar, change a below macro to 2 */
#define CIS_TEST_PATTERN_MODE 0
-#endif
-
#define CIS_STREAM_OFF_WAIT_TIME 2000 /* 2ms */
#define CIS_STREAM_ON_WAIT_TIME 2000 /* 2ms */
int sensor_cis_wait_streamon(struct v4l2_subdev *subdev);
int sensor_cis_set_initial_exposure(struct v4l2_subdev *subdev);
+int sensor_cis_factory_test(struct v4l2_subdev *subdev);
+/* OTP function */
+u16 sensor_cis_otp_get_crc16(char *data, int count);
+int sensor_cis_otp_read_file(const char *file_name, const void *data, unsigned long size);
+int sensor_cis_otp_write_file(const char *file_name, const void *data, unsigned long size);
#endif
--- /dev/null
+menuconfig CAMERA_EEPROM_SELECT
+ bool "Sensor eeprom select"
+ depends on USE_DIRECT_IS_CONTROL
+ help
+ Say Y here to enable support for platform-specific V4L drivers.
+
+config CAMERA_EEPROM_GM1_OBJ
+ bool "Use GM1 EEPROM"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_EEPROM_SELECT
+ default n
+ help
+ Use to build GM1 eeprom driver.
+
+config CAMERA_EEPROM_5E9_OBJ
+ bool "Use 5E9 EEPROM"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_EEPROM_SELECT
+ default n
+ help
+ Use to build 5E9 eeprom driver.
+
+config CAMERA_EEPROM_12A10_OBJ
+ bool "Use 12A10 EEPROM"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_EEPROM_SELECT
+ default n
+ help
+ Use to build 12A10 eeprom driver.
+
+config CAMERA_EEPROM_12A10FF_OBJ
+ bool "Use 12A10FF EEPROM"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_EEPROM_SELECT
+ default n
+ help
+ Use to build 12A10FF eeprom driver.
+
+config CAMERA_EEPROM_16885C_OBJ
+ bool "Use 16885C EEPROM"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_EEPROM_SELECT
+ default n
+ help
+ Use to build 16885C eeprom driver.
--- /dev/null
+obj-$(CONFIG_CAMERA_EEPROM_SELECT) += fimc-is-sensor-eeprom.o
+obj-$(CONFIG_CAMERA_EEPROM_GM1_OBJ) += fimc-is-sensor-eeprom-gm1.o
+obj-$(CONFIG_CAMERA_EEPROM_5E9_OBJ) += fimc-is-sensor-eeprom-5e9.o
+obj-$(CONFIG_CAMERA_EEPROM_12A10_OBJ) += fimc-is-sensor-eeprom-12a10.o
+obj-$(CONFIG_CAMERA_EEPROM_12A10FF_OBJ) += fimc-is-sensor-eeprom-12a10ff.o
+obj-$(CONFIG_CAMERA_EEPROM_16885C_OBJ) += fimc-is-sensor-eeprom-16885c.o
+
+ccflags-y := -Idrivers/media/platform/exynos/fimc-is2
+ccflags-y += -Idrivers/media/platform/exynos/fimc-is2/include
+ccflags-y += -Idrivers/media/platform/exynos/fimc-is2/vendor
+ccflags-y += -Idrivers/media/platform/exynos/fimc-is2/hardware/api
+ccflags-y += -Idrivers/media/platform/exynos/fimc-is2/sensor
+ccflags-y += -Idrivers/media/platform/exynos/fimc-is2/sensor/module_framework
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-sensor-eeprom-12a10.h"
+#include "fimc-is-sensor-eeprom.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+
+#define SENSOR_EEPROM_NAME "12A10"
+
+int fimc_is_eeprom_12a10_check_all_crc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *sensor = NULL;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+ FIMC_BUG(!module);
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(module->subdev);
+ if (!sensor) {
+ err("device sensor is NULL");
+ ret = -ENODEV;
+ return ret;
+ }
+
+ /* Check CRC to Address cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_address, subdev);
+ if (ret) {
+ err("%s(): 12A10 EEPROM Address section CRC check fail(%d)", __func__, ret);
+
+ /* All calibration data is zero set only Address section is invalid CRC */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "all",
+ EEPROM_ADD_CRC_SEC, EEPROM_DATA_SIZE, 0xff);
+
+ /*Set all cal_status to ERROR if Address cal data invalid*/
+ for (int i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ sensor->cal_status[i] = CRC_ERROR;
+ return ret;
+ } else
+ info("12A10 EEPROM Address section CRC check success\n");
+
+ /* Check CRC to Information cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_info, subdev);
+ if (ret) {
+ err("%s(): 12A10 EEPROM Information CRC section check fail(%d)", __func__, ret);
+
+ /* All calibration data is 0xff set but exception Address section */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "Information - End",
+ EEPROM_INFO_CRC_SEC, EEPROM_ADD_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_ERROR;
+ } else {
+ info("12A10 EEPROM Informaion section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to AWB cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_awb, subdev);
+ if (ret) {
+ err("%s(): 12A10 EEPROM AWB section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AWB",
+ EEPROM_AWB_CRC_SEC, EEPROM_AWB_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_ERROR;
+ } else {
+ info("12A10 EEPROM AWB section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_NO_ERROR;
+
+ ret = fimc_is_sensor_eeprom_check_awb_ratio(&eeprom->data[EEPROM_AWB_UNIT_OFFSET],
+ &eeprom->data[EEPROM_AWB_GOLDEN_OFFSET],&eeprom->data[EEPROM_AWB_LIMIT_OFFSET]);
+ if (ret) {
+ err("%s(): 12A10 EEPROM AWB ratio out of limit(%d)", __func__, ret);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = LIMIT_FAILURE;
+ }
+ }
+
+ /* Check CRC to AF cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_af, subdev);
+ if (ret) {
+ err("%s(): 12A10 EEPROM AF section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AF",
+ EEPROM_AF_CRC_SEC, EEPROM_AF_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AF] = CRC_ERROR;
+ } else {
+ info("12A10 EEPROM AF section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to LSC cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_lsc, subdev);
+ if (ret) {
+ err("%s(): 12A10 EEPROM LSC section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "LSC",
+ EEPROM_LSC_CRC_SEC, EEPROM_LSC_CAL_SIZE, 0xff);
+ } else
+ info("12A10 EEPROM LSC section CRC check success\n");
+
+ /* Check CRC to PDAF cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_pdaf, subdev);
+ if (ret) {
+ err("%s(): 12A10 EEPROM PDAF section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "PDAF",
+ EEPROM_PDAF_CRC_SEC, EEPROM_PDAF_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_PDAF] = CRC_ERROR;
+ } else {
+ info("12A10 EEPROM PDAF section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_PDAF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to AE Sync cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_ae, subdev);
+ if (ret) {
+ err("%s(): 12A10 EEPROM AE section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AE",
+ EEPROM_AE_CRC_SEC, EEPROM_AE_CAL_SIZE, 0xff);
+ } else
+ info("12A10 EEPROM AE section CRC check success\n");
+
+ /* Check CRC to Dual cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_dual, subdev);
+ if (ret) {
+ err("%s(): EEPROM Dual section check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "DUAL",
+ EEPROM_DUAL_CRC_SEC, EEPROM_DUAL_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_DUAL] = CRC_ERROR;
+ } else {
+ info("12A10 EEPROM Dual section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_DUAL] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to SFR cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_sfr, subdev);
+ if (ret) {
+ err("%s(): EEPROM SFR section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "SFR",
+ EEPROM_SFR_CRC_SEC, EEPROM_SFR_CAL_SIZE, 0xff);
+ } else
+ info("12A10 EEPROM SFR section CRC check success\n");
+
+ /*
+ * Write files to serial number and Dual cal data when success of
+ * Address, Info, Dual calibration data
+ */
+ if (!sensor->cal_status[CAMERA_CRC_INDEX_DUAL]) {
+ ret = fimc_is_eeprom_file_write(EEPROM_SERIAL_NUM_DATA_PATH,
+ (void *)&eeprom->data[EEPROM_INFO_SERIAL_NUM_START], EEPROM_INFO_SERIAL_NUM_SIZE);
+ if (ret < 0)
+ err("%s(), Serial number file write fail(%d)", __func__, ret);
+
+ /* Write file to Dual calibration data */
+ ret = fimc_is_eeprom_file_write(EEPROM_DUAL_DATA_PATH,
+ (void *)&eeprom->data[EEPROM_DUAL_CRC_CHK_START], EEPROM_DUAL_CAL_SIZE);
+ if (ret < 0)
+ err("%s(), DUAL cal file write fail(%d)", __func__, ret);
+ }
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_address(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_ADD_CRC_SEC] << 8) | (eeprom->data[EEPROM_ADD_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_ADD_CRC_CHK_START], EEPROM_ADD_CRC_CHK_SIZE);
+ if (crc_value != crc16) {
+ err("Error to ADD CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+
+ ret = -EINVAL;
+ } else
+ info("ADD CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_info(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_INFO_CRC_SEC] << 8) | (eeprom->data[EEPROM_INFO_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_INFO_CRC_CHK_START], EEPROM_INFO_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to INFO CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("INFO CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_awb(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AWB_CRC_SEC] << 8) | (eeprom->data[EEPROM_AWB_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AWB_CRC_CHK_START], EEPROM_AWB_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AWB CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AWB CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_af(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AF_CRC_SEC] << 8) | (eeprom->data[EEPROM_AF_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AF_CRC_CHK_START], EEPROM_AF_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AF CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AF CRC16: %x, cal_buffer CRC: %x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_ae(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AE_CRC_SEC] << 8) | (eeprom->data[EEPROM_AE_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AE_CRC_CHK_START], EEPROM_AE_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AE CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AE CRC16: %x, cal_buffer CRC: %x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_lsc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_LSC_CRC_SEC] << 8) | (eeprom->data[EEPROM_LSC_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_LSC_CRC_CHK_START], EEPROM_LSC_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to LSC CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("LSC CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_pdaf(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_PDAF_CRC_SEC] << 8) | (eeprom->data[EEPROM_PDAF_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_PDAF_CRC_CHK_START], EEPROM_PDAF_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to PDAF CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("PDAF CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_dual(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_DUAL_CRC_SEC] << 8) | (eeprom->data[EEPROM_DUAL_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_DUAL_CRC_CHK_START], EEPROM_DUAL_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to DUAL CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("DUAL CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10_check_sfr(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_SFR_CRC_SEC] << 8) | (eeprom->data[EEPROM_SFR_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_SFR_CRC_CHK_START], EEPROM_SFR_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to SFR CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("SFR CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+int fimc_is_eeprom_12a10_get_cal_data(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_eeprom *eeprom;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ client = eeprom->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ /*
+ * If already read at EEPROM data in module
+ * don't again read at EEPROM but there isn't file or
+ * data is NULL read EEPROM data
+ */
+ ret = fimc_is_eeprom_file_read(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret) {
+ I2C_MUTEX_LOCK(eeprom->i2c_lock);
+ /* I2C read to Sensor EEPROM cal data */
+ ret = fimc_is_eeprom_module_read(client, EEPROM_ADD_CRC_FST, eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(): eeprom i2c read failed(%d)\n", __func__, ret);
+ I2C_MUTEX_UNLOCK(eeprom->i2c_lock);
+ return ret;
+ }
+ I2C_MUTEX_UNLOCK(eeprom->i2c_lock);
+
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+
+ /* Write file to Cal data */
+ ret = fimc_is_eeprom_file_write(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(), eeprom file write fail(%d)\n", __func__, ret);
+ return ret;
+ }
+ } else {
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+ }
+
+ return ret;
+}
+
+static struct fimc_is_eeprom_ops sensor_eeprom_ops = {
+ .eeprom_read = fimc_is_eeprom_12a10_get_cal_data,
+ .eeprom_check_all_crc = fimc_is_eeprom_12a10_check_all_crc,
+ .eeprom_check_address = fimc_is_eeprom_12a10_check_address,
+ .eeprom_check_info = fimc_is_eeprom_12a10_check_info,
+ .eeprom_check_awb = fimc_is_eeprom_12a10_check_awb,
+ .eeprom_check_af = fimc_is_eeprom_12a10_check_af,
+ .eeprom_check_ae = fimc_is_eeprom_12a10_check_ae,
+ .eeprom_check_lsc = fimc_is_eeprom_12a10_check_lsc,
+ .eeprom_check_pdaf = fimc_is_eeprom_12a10_check_pdaf,
+ .eeprom_check_dual = fimc_is_eeprom_12a10_check_dual,
+ .eeprom_check_sfr = fimc_is_eeprom_12a10_check_sfr,
+};
+
+static int sensor_eeprom_12a10_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0, i;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_eeprom = NULL;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *device;
+ struct device *dev;
+ struct device_node *dnode;
+ u32 sensor_id = 0;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ device = &core->sensor[sensor_id];
+ if (!device) {
+ err("sensor device is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom = kzalloc(sizeof(struct fimc_is_eeprom), GFP_KERNEL);
+ if (!eeprom) {
+ err("eeprom is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_eeprom = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_eeprom) {
+ err("subdev_eeprom NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->data = kzalloc(EEPROM_DATA_SIZE, GFP_KERNEL);
+ if (!eeprom->data) {
+ err("data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->id = EEPROM_NAME_12A10;
+ eeprom->subdev = subdev_eeprom;
+ eeprom->device = sensor_id;
+ eeprom->client = client;
+ eeprom->i2c_lock = NULL;
+ eeprom->total_size = EEPROM_DATA_SIZE;
+ eeprom->eeprom_ops = &sensor_eeprom_ops;
+
+ device->subdev_eeprom = subdev_eeprom;
+ device->eeprom = eeprom;
+
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ device->cal_status[i] = CRC_NO_ERROR;
+
+ v4l2_set_subdevdata(subdev_eeprom, eeprom);
+ v4l2_set_subdev_hostdata(subdev_eeprom, device);
+
+ snprintf(subdev_eeprom->name, V4L2_SUBDEV_NAME_SIZE, "eeprom-subdev.%d", eeprom->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_eeprom_12a10sp_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-sensor-eeprom-12a10",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_eeprom_12a10sp_match);
+
+static const struct i2c_device_id sensor_eeprom_12a10sp_idt[] = {
+ { SENSOR_EEPROM_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_eeprom_12a10sp_driver = {
+ .probe = sensor_eeprom_12a10_probe,
+ .driver = {
+ .name = SENSOR_EEPROM_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_eeprom_12a10sp_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_eeprom_12a10sp_idt
+};
+
+static int __init sensor_eeprom_12a10sp_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_eeprom_12a10sp_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_eeprom_12a10sp_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_eeprom_12a10sp_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series EEPROM driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_EEPROM_12A10_H
+#define FIMC_IS_EEPROM_12A10_H
+
+#define EEPROM_DATA_PATH "/data/vendor/camera/dump_12a10_eeprom_data.bin"
+#define EEPROM_DUAL_DATA_PATH "/data/vendor/camera/dual_cal_dump.bin"
+#define EEPROM_SERIAL_NUM_DATA_PATH "/data/vendor/camera/serial_number.bin"
+
+/* Total Cal data size */
+#define EEPROM_DATA_SIZE SZ_16K
+
+/* Big endian Checksum */
+/* Address */
+#define EEPROM_ADD_CRC_FST 0x00
+#define EEPROM_ADD_CRC_SEC 0x01
+#define EEPROM_ADD_CRC_CHK_START 0x04
+#define EEPROM_ADD_CRC_CHK_SIZE 0x48
+#define EEPROM_ADD_CAL_SIZE 0x4C
+
+/* Information Cal */
+#define EEPROM_INFO_CRC_FST 0x60
+#define EEPROM_INFO_CRC_SEC 0x61
+#define EEPROM_INFO_CRC_CHK_START 0x64
+#define EEPROM_INFO_CRC_CHK_SIZE 0x36
+#define EEPROM_INFO_SERIAL_NUM_START 0x89
+#define EEPROM_INFO_SERIAL_NUM_SIZE 0x10
+#define EEPROM_INFO_CAL_SIZE 0x3A
+
+/* AWB Cal */
+#define EEPROM_AWB_CRC_FST 0xB0
+#define EEPROM_AWB_CRC_SEC 0xB1
+#define EEPROM_AWB_CRC_CHK_START 0xB4
+#define EEPROM_AWB_CRC_CHK_SIZE 0x50
+#define EEPROM_AWB_CAL_SIZE 0x54
+#define EEPROM_AWB_LIMIT_OFFSET 0xD8
+#define EEPROM_AWB_GOLDEN_OFFSET 0xDC
+#define EEPROM_AWB_UNIT_OFFSET 0xE2
+
+/* AF Cal */
+#define EEPROM_AF_CRC_FST 0x120
+#define EEPROM_AF_CRC_SEC 0x121
+#define EEPROM_AF_CRC_CHK_START 0x124
+#define EEPROM_AF_CRC_CHK_SIZE 0x1C
+#define EEPROM_AF_CAL_SIZE 0x20
+
+/* LSC Cal */
+#define EEPROM_LSC_CRC_FST 0x150
+#define EEPROM_LSC_CRC_SEC 0x151
+#define EEPROM_LSC_CRC_CHK_START 0x154
+#define EEPROM_LSC_CRC_CHK_SIZE 0x16D0
+#define EEPROM_LSC_CAL_SIZE 0x16D4
+
+/* PDAF Cal */
+#define EEPROM_PDAF_CRC_FST 0x1900
+#define EEPROM_PDAF_CRC_SEC 0x1901
+#define EEPROM_PDAF_CRC_CHK_START 0x1904
+#define EEPROM_PDAF_CRC_CHK_SIZE 0x5A0
+#define EEPROM_PDAF_CAL_SIZE 0x5A4
+
+/* AE Sync Cal */
+#define EEPROM_AE_CRC_FST 0x2000
+#define EEPROM_AE_CRC_SEC 0x2001
+#define EEPROM_AE_CRC_CHK_START 0x2004
+#define EEPROM_AE_CRC_CHK_SIZE 0x4
+#define EEPROM_AE_CAL_SIZE 0x8
+
+/* Dual camera Cal */
+#define EEPROM_DUAL_CRC_FST 0x2100
+#define EEPROM_DUAL_CRC_SEC 0x2101
+#define EEPROM_DUAL_CRC_CHK_START 0x2104
+#define EEPROM_DUAL_CRC_CHK_SIZE 0x800
+#define EEPROM_DUAL_CAL_SIZE 0x804
+
+/* SFR Cal */
+#define EEPROM_SFR_CRC_FST 0x3000
+#define EEPROM_SFR_CRC_SEC 0x3001
+#define EEPROM_SFR_CRC_CHK_START 0x3004
+#define EEPROM_SFR_CRC_CHK_SIZE 0x1CC
+#define EEPROM_SFR_CAL_SIZE 0x1D0
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-sensor-eeprom-12a10ff.h"
+#include "fimc-is-sensor-eeprom.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+
+#define SENSOR_EEPROM_NAME "12A10FF"
+
+int fimc_is_eeprom_12a10ff_check_all_crc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *sensor = NULL;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+ FIMC_BUG(!module);
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(module->subdev);
+ if (!sensor) {
+ err("device sensor is NULL");
+ ret = -ENODEV;
+ return ret;
+ }
+
+ /* Check CRC to Address cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_address, subdev);
+ if (ret) {
+ err("%s(): 12A10FF EEPROM Address section CRC check fail(%d)", __func__, ret);
+
+ /* All calibration data is zero set only Address section is invalid CRC */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "all",
+ EEPROM_ADD_CRC_SEC, EEPROM_DATA_SIZE, 0xff);
+
+ /*Set all cal_status to ERROR if Address cal data invalid*/
+ for (int i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ sensor->cal_status[i] = CRC_ERROR;
+
+ return ret;
+ } else
+ info("12A10FF EEPROM Address section CRC check success\n");
+
+ /* Check CRC to Information cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_info, subdev);
+ if (ret) {
+ err("%s(): 12A10FF EEPROM Information CRC section check fail(%d)", __func__, ret);
+
+ /* All calibration data is 0xff set but exception Address section */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "Information - End",
+ EEPROM_INFO_CRC_SEC, EEPROM_ADD_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_ERROR;
+
+ } else {
+ info("12A10FF EEPROM Informaion section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to AWB cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_awb, subdev);
+ if (ret) {
+ err("%s(): 12A10FF EEPROM AWB section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AWB",
+ EEPROM_AWB_CRC_SEC, EEPROM_AWB_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_ERROR;
+
+ } else {
+ info("12A10FF EEPROM AWB section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_NO_ERROR;
+
+ ret = fimc_is_sensor_eeprom_check_awb_ratio(&eeprom->data[EEPROM_AWB_UNIT_OFFSET],
+ &eeprom->data[EEPROM_AWB_GOLDEN_OFFSET],&eeprom->data[EEPROM_AWB_LIMIT_OFFSET]);
+ if (ret) {
+ err("%s(): 12A10FF EEPROM AWB ratio out of limit(%d)", __func__, ret);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = LIMIT_FAILURE;
+ }
+ }
+
+ /* Check CRC to LSC cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_lsc, subdev);
+ if (ret) {
+ err("%s(): 12A10FF EEPROM LSC section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "LSC",
+ EEPROM_LSC_CRC_SEC, EEPROM_LSC_CAL_SIZE, 0xff);
+
+ } else
+ info("12A10FF EEPROM LSC section CRC check success\n");
+
+ /* Check CRC to SFR cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_sfr, subdev);
+ if (ret) {
+ err("%s(): EEPROM SFR section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "SFR",
+ EEPROM_SFR_CRC_SEC, EEPROM_SFR_CAL_SIZE, 0xff);
+
+ } else
+ info("12A10FF EEPROM SFR section CRC check success\n");
+
+ /* Write file to serial number of Information calibration data */
+ ret = fimc_is_eeprom_file_write(EEPROM_SERIAL_NUM_DATA_PATH,
+ (void *)&eeprom->data[EEPROM_INFO_SERIAL_NUM_START], EEPROM_INFO_SERIAL_NUM_SIZE);
+ if (ret < 0)
+ err("%s(), DUAL cal file write fail(%d)", __func__, ret);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10ff_check_address(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_ADD_CRC_SEC] << 8) | (eeprom->data[EEPROM_ADD_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_ADD_CRC_CHK_START], EEPROM_ADD_CRC_CHK_SIZE);
+ if (crc_value != crc16) {
+ err("Error to ADD CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+
+ ret = -EINVAL;
+ } else
+ info("ADD CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10ff_check_info(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_INFO_CRC_SEC] << 8) | (eeprom->data[EEPROM_INFO_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_INFO_CRC_CHK_START], EEPROM_INFO_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to INFO CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("INFO CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10ff_check_awb(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AWB_CRC_SEC] << 8) | (eeprom->data[EEPROM_AWB_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AWB_CRC_CHK_START], EEPROM_AWB_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AWB CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AWB CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10ff_check_lsc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_LSC_CRC_SEC] << 8) | (eeprom->data[EEPROM_LSC_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_LSC_CRC_CHK_START], EEPROM_LSC_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to LSC CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("LSC CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_12a10ff_check_sfr(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_SFR_CRC_SEC] << 8) | (eeprom->data[EEPROM_SFR_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_SFR_CRC_CHK_START], EEPROM_SFR_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to SFR CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("SFR CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+int fimc_is_eeprom_12a10ff_get_cal_data(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_eeprom *eeprom;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ client = eeprom->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ /*
+ * If already read at EEPROM data in module
+ * don't again read at EEPROM but there isn't file or
+ * data is NULL read EEPROM data
+ */
+ ret = fimc_is_eeprom_file_read(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret) {
+ /* I2C read to Sensor EEPROM cal data */
+ ret = fimc_is_eeprom_module_read(client, EEPROM_ADD_CRC_FST, eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(): eeprom i2c read failed(%d)\n", __func__, ret);
+ return ret;
+ }
+
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+
+ /* Write file to Cal data */
+ ret = fimc_is_eeprom_file_write(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(), eeprom file write fail(%d)\n", __func__, ret);
+ return ret;
+ }
+ } else {
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+ }
+
+ return ret;
+}
+
+static struct fimc_is_eeprom_ops sensor_eeprom_ops = {
+ .eeprom_read = fimc_is_eeprom_12a10ff_get_cal_data,
+ .eeprom_check_all_crc = fimc_is_eeprom_12a10ff_check_all_crc,
+ .eeprom_check_address = fimc_is_eeprom_12a10ff_check_address,
+ .eeprom_check_info = fimc_is_eeprom_12a10ff_check_info,
+ .eeprom_check_awb = fimc_is_eeprom_12a10ff_check_awb,
+ .eeprom_check_lsc = fimc_is_eeprom_12a10ff_check_lsc,
+ .eeprom_check_sfr = fimc_is_eeprom_12a10ff_check_sfr,
+};
+
+static int sensor_eeprom_12a10ff_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0, i;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_eeprom = NULL;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *device;
+ struct device *dev;
+ struct device_node *dnode;
+ u32 sensor_id = 0;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ device = &core->sensor[sensor_id];
+ if (!device) {
+ err("sensor device is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom = kzalloc(sizeof(struct fimc_is_eeprom), GFP_KERNEL);
+ if (!eeprom) {
+ err("eeprom is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_eeprom = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_eeprom) {
+ probe_err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->data = kzalloc(EEPROM_DATA_SIZE, GFP_KERNEL);
+ if (!eeprom->data) {
+ err("data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->id = EEPROM_NAME_12A10FF;
+ eeprom->subdev = subdev_eeprom;
+ eeprom->device = sensor_id;
+ eeprom->client = client;
+ eeprom->i2c_lock = NULL;
+ eeprom->total_size = EEPROM_DATA_SIZE;
+ eeprom->eeprom_ops = &sensor_eeprom_ops;
+
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ device->cal_status[i] = CRC_NO_ERROR;
+
+ device->subdev_eeprom = subdev_eeprom;
+ device->eeprom = eeprom;
+
+ v4l2_set_subdevdata(subdev_eeprom, eeprom);
+ v4l2_set_subdev_hostdata(subdev_eeprom, device);
+
+ snprintf(subdev_eeprom->name, V4L2_SUBDEV_NAME_SIZE, "eeprom-subdev.%d", eeprom->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_eeprom_12a10ff_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-sensor-eeprom-12a10ff",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_eeprom_12a10ff_match);
+
+static const struct i2c_device_id sensor_eeprom_12a10ff_idt[] = {
+ { SENSOR_EEPROM_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_eeprom_12a10ff_driver = {
+ .probe = sensor_eeprom_12a10ff_probe,
+ .driver = {
+ .name = SENSOR_EEPROM_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_eeprom_12a10ff_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_eeprom_12a10ff_idt
+};
+
+static int __init sensor_eeprom_12a10ff_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_eeprom_12a10ff_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_eeprom_12a10ff_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_eeprom_12a10ff_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series EEPROM driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_EEPROM_12A10FF_H
+#define FIMC_IS_EEPROM_12A10FF_H
+
+#define EEPROM_DATA_PATH "/data/vendor/camera/dump_12a10ff_eeprom_data.bin"
+#define EEPROM_SERIAL_NUM_DATA_PATH "/data/vendor/camera/serial_number_12a10ff.bin"
+
+/* Total Cal data size */
+#define EEPROM_DATA_SIZE SZ_8K
+
+/* Big endian Checksum */
+/* Address */
+#define EEPROM_ADD_CRC_FST 0x00
+#define EEPROM_ADD_CRC_SEC 0x01
+#define EEPROM_ADD_CRC_CHK_START 0x04
+#define EEPROM_ADD_CRC_CHK_SIZE 0x48
+#define EEPROM_ADD_CAL_SIZE 0x4C
+
+/* Information Cal */
+#define EEPROM_INFO_CRC_FST 0x60
+#define EEPROM_INFO_CRC_SEC 0x61
+#define EEPROM_INFO_CRC_CHK_START 0x64
+#define EEPROM_INFO_CRC_CHK_SIZE 0x36
+#define EEPROM_INFO_SERIAL_NUM_START 0x89
+#define EEPROM_INFO_SERIAL_NUM_SIZE 0x10
+#define EEPROM_INFO_CAL_SIZE 0x3A
+
+/* AWB Cal */
+#define EEPROM_AWB_CRC_FST 0xB0
+#define EEPROM_AWB_CRC_SEC 0xB1
+#define EEPROM_AWB_CRC_CHK_START 0xB4
+#define EEPROM_AWB_CRC_CHK_SIZE 0x50
+#define EEPROM_AWB_CAL_SIZE 0x54
+#define EEPROM_AWB_LIMIT_OFFSET 0xD8
+#define EEPROM_AWB_GOLDEN_OFFSET 0xDC
+#define EEPROM_AWB_UNIT_OFFSET 0xE2
+
+/* LSC Cal */
+#define EEPROM_LSC_CRC_FST 0x120
+#define EEPROM_LSC_CRC_SEC 0x121
+#define EEPROM_LSC_CRC_CHK_START 0x124
+#define EEPROM_LSC_CRC_CHK_SIZE 0x1374
+#define EEPROM_LSC_CAL_SIZE 0x1378
+
+/* SFR Cal */
+#define EEPROM_SFR_CRC_FST 0x1500
+#define EEPROM_SFR_CRC_SEC 0x1501
+#define EEPROM_SFR_CRC_CHK_START 0x1504
+#define EEPROM_SFR_CRC_CHK_SIZE 0x64
+#define EEPROM_SFR_CAL_SIZE 0x68
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-sensor-eeprom-16885c.h"
+#include "fimc-is-sensor-eeprom.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+
+#define SENSOR_EEPROM_NAME "16885C"
+
+int fimc_is_eeprom_16885c_check_all_crc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *sensor = NULL;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+ FIMC_BUG(!module);
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(module->subdev);
+ if (!sensor) {
+ err("device sensor is NULL");
+ ret = -ENODEV;
+ return ret;
+ }
+
+ /* Check CRC to Address cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_address, subdev);
+ if (ret) {
+ err("%s(): 16885C EEPROM Address section CRC check fail(%d)", __func__, ret);
+
+ /* All calibration data is zero set only Address section is invalid CRC */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "all",
+ EEPROM_ADD_CRC_SEC, EEPROM_DATA_SIZE, 0xff);
+
+ /*Set all cal_status to ERROR if Address cal data invalid*/
+ for (int i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ sensor->cal_status[i] = CRC_ERROR;
+
+ return ret;
+ } else
+ info("16885C EEPROM Address section CRC check success\n");
+
+ /* Check CRC to Information cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_info, subdev);
+ if (ret) {
+ err("%s(): 16885C EEPROM Information CRC section check fail(%d)", __func__, ret);
+
+ /* All calibration data is 0xff set but exception Address section */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "Information - End",
+ EEPROM_INFO_CRC_SEC, EEPROM_ADD_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_ERROR;
+
+ } else {
+ info("16885C EEPROM Informaion section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to AWB cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_awb, subdev);
+ if (ret) {
+ err("%s(): 16885C EEPROM AWB section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AWB",
+ EEPROM_AWB_CRC_SEC, EEPROM_AWB_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_ERROR;
+
+ } else {
+ info("16885C EEPROM AWB section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_NO_ERROR;
+
+ ret = fimc_is_sensor_eeprom_check_awb_ratio(&eeprom->data[EEPROM_AWB_UNIT_OFFSET],
+ &eeprom->data[EEPROM_AWB_GOLDEN_OFFSET],&eeprom->data[EEPROM_AWB_LIMIT_OFFSET]);
+ if (ret) {
+ err("%s(): 16885C EEPROM AWB ratio out of limit(%d)", __func__, ret);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = LIMIT_FAILURE;
+ }
+ }
+
+ /* Check CRC to LSC cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_lsc, subdev);
+ if (ret) {
+ err("%s(): 16885C EEPROM LSC section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "LSC",
+ EEPROM_LSC_CRC_SEC, EEPROM_LSC_CAL_SIZE, 0xff);
+
+ } else
+ info("16885C EEPROM LSC section CRC check success\n");
+
+ /* Check CRC to SFR cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_sfr, subdev);
+ if (ret) {
+ err("%s(): EEPROM SFR section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "SFR",
+ EEPROM_SFR_CRC_SEC, EEPROM_SFR_CAL_SIZE, 0xff);
+
+ } else
+ info("16885C EEPROM SFR section CRC check success\n");
+
+ /* Write file to serial number of Information calibration data */
+ ret = fimc_is_eeprom_file_write(EEPROM_SERIAL_NUM_DATA_PATH,
+ (void *)&eeprom->data[EEPROM_INFO_SERIAL_NUM_START], EEPROM_INFO_SERIAL_NUM_SIZE);
+ if (ret < 0)
+ err("%s(), DUAL cal file write fail(%d)", __func__, ret);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_16885c_check_address(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_ADD_CRC_SEC] << 8) | (eeprom->data[EEPROM_ADD_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_ADD_CRC_CHK_START], EEPROM_ADD_CRC_CHK_SIZE);
+ if (crc_value != crc16) {
+ err("Error to ADD CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+
+ ret = -EINVAL;
+ } else
+ info("ADD CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_16885c_check_info(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_INFO_CRC_SEC] << 8) | (eeprom->data[EEPROM_INFO_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_INFO_CRC_CHK_START], EEPROM_INFO_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to INFO CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("INFO CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_16885c_check_awb(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AWB_CRC_SEC] << 8) | (eeprom->data[EEPROM_AWB_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AWB_CRC_CHK_START], EEPROM_AWB_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AWB CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AWB CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_16885c_check_lsc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_LSC_CRC_SEC] << 8) | (eeprom->data[EEPROM_LSC_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_LSC_CRC_CHK_START], EEPROM_LSC_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to LSC CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("LSC CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_16885c_check_sfr(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_SFR_CRC_SEC] << 8) | (eeprom->data[EEPROM_SFR_CRC_FST]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_SFR_CRC_CHK_START], EEPROM_SFR_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to SFR CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("SFR CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+int fimc_is_eeprom_16885c_get_cal_data(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_eeprom *eeprom;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ client = eeprom->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ /*
+ * If already read at EEPROM data in module
+ * don't again read at EEPROM but there isn't file or
+ * data is NULL read EEPROM data
+ */
+ ret = fimc_is_eeprom_file_read(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret) {
+ /* I2C read to Sensor EEPROM cal data */
+ ret = fimc_is_eeprom_module_read(client, EEPROM_ADD_CRC_FST, eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(): eeprom i2c read failed(%d)\n", __func__, ret);
+ return ret;
+ }
+
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+
+ /* Write file to Cal data */
+ ret = fimc_is_eeprom_file_write(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(), eeprom file write fail(%d)\n", __func__, ret);
+ return ret;
+ }
+ } else {
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+ }
+
+ return ret;
+}
+
+static struct fimc_is_eeprom_ops sensor_eeprom_ops = {
+ .eeprom_read = fimc_is_eeprom_16885c_get_cal_data,
+ .eeprom_check_all_crc = fimc_is_eeprom_16885c_check_all_crc,
+ .eeprom_check_address = fimc_is_eeprom_16885c_check_address,
+ .eeprom_check_info = fimc_is_eeprom_16885c_check_info,
+ .eeprom_check_awb = fimc_is_eeprom_16885c_check_awb,
+ .eeprom_check_lsc = fimc_is_eeprom_16885c_check_lsc,
+ .eeprom_check_sfr = fimc_is_eeprom_16885c_check_sfr,
+};
+
+static int sensor_eeprom_16885c_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0, i;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_eeprom = NULL;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *device;
+ struct device *dev;
+ struct device_node *dnode;
+ u32 sensor_id = 0;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ device = &core->sensor[sensor_id];
+ if (!device) {
+ err("sensor device is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom = kzalloc(sizeof(struct fimc_is_eeprom), GFP_KERNEL);
+ if (!eeprom) {
+ err("eeprom is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_eeprom = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_eeprom) {
+ probe_err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->data = kzalloc(EEPROM_DATA_SIZE, GFP_KERNEL);
+ if (!eeprom->data) {
+ err("data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->id = EEPROM_NAME_16885C;
+ eeprom->subdev = subdev_eeprom;
+ eeprom->device = sensor_id;
+ eeprom->client = client;
+ eeprom->i2c_lock = NULL;
+ eeprom->total_size = EEPROM_DATA_SIZE;
+ eeprom->eeprom_ops = &sensor_eeprom_ops;
+
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ device->cal_status[i] = CRC_NO_ERROR;
+
+ device->subdev_eeprom = subdev_eeprom;
+ device->eeprom = eeprom;
+
+ v4l2_set_subdevdata(subdev_eeprom, eeprom);
+ v4l2_set_subdev_hostdata(subdev_eeprom, device);
+
+ snprintf(subdev_eeprom->name, V4L2_SUBDEV_NAME_SIZE, "eeprom-subdev.%d", eeprom->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_eeprom_16885c_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-sensor-eeprom-16885c",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_eeprom_16885c_match);
+
+static const struct i2c_device_id sensor_eeprom_16885c_idt[] = {
+ { SENSOR_EEPROM_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_eeprom_16885c_driver = {
+ .probe = sensor_eeprom_16885c_probe,
+ .driver = {
+ .name = SENSOR_EEPROM_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_eeprom_16885c_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_eeprom_16885c_idt
+};
+
+static int __init sensor_eeprom_16885c_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_eeprom_16885c_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_eeprom_16885c_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_eeprom_16885c_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series EEPROM driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_EEPROM_16885C_H
+#define FIMC_IS_EEPROM_16885C_H
+
+#define EEPROM_DATA_PATH "/data/vendor/camera/dump_16885c_eeprom_data.bin"
+#define EEPROM_SERIAL_NUM_DATA_PATH "/data/vendor/camera/serial_number_16885c.bin"
+
+/* Total Cal data size */
+#define EEPROM_DATA_SIZE SZ_8K
+
+/* Big endian Checksum */
+/* Address */
+#define EEPROM_ADD_CRC_FST 0x00
+#define EEPROM_ADD_CRC_SEC 0x01
+#define EEPROM_ADD_CRC_CHK_START 0x04
+#define EEPROM_ADD_CRC_CHK_SIZE 0x48
+#define EEPROM_ADD_CAL_SIZE 0x4C
+
+/* Information Cal */
+#define EEPROM_INFO_CRC_FST 0x60
+#define EEPROM_INFO_CRC_SEC 0x61
+#define EEPROM_INFO_CRC_CHK_START 0x64
+#define EEPROM_INFO_CRC_CHK_SIZE 0x36
+#define EEPROM_INFO_SERIAL_NUM_START 0x89
+#define EEPROM_INFO_SERIAL_NUM_SIZE 0x10
+#define EEPROM_INFO_CAL_SIZE 0x3A
+
+/* AWB Cal */
+#define EEPROM_AWB_CRC_FST 0xB0
+#define EEPROM_AWB_CRC_SEC 0xB1
+#define EEPROM_AWB_CRC_CHK_START 0xB4
+#define EEPROM_AWB_CRC_CHK_SIZE 0x50
+#define EEPROM_AWB_CAL_SIZE 0x54
+#define EEPROM_AWB_LIMIT_OFFSET 0xD8
+#define EEPROM_AWB_GOLDEN_OFFSET 0xDC
+#define EEPROM_AWB_UNIT_OFFSET 0xE2
+
+/* LSC Cal */
+#define EEPROM_LSC_CRC_FST 0x120
+#define EEPROM_LSC_CRC_SEC 0x121
+#define EEPROM_LSC_CRC_CHK_START 0x124
+#define EEPROM_LSC_CRC_CHK_SIZE 0x1374
+#define EEPROM_LSC_CAL_SIZE 0x1378
+
+/* SFR Cal */
+#define EEPROM_SFR_CRC_FST 0x1500
+#define EEPROM_SFR_CRC_SEC 0x1501
+#define EEPROM_SFR_CRC_CHK_START 0x1504
+#define EEPROM_SFR_CRC_CHK_SIZE 0x64
+#define EEPROM_SFR_CAL_SIZE 0x68
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-sensor-eeprom-5e9.h"
+#include "fimc-is-sensor-eeprom.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+
+#define SENSOR_EEPROM_NAME "5E9"
+
+int fimc_is_eeprom_5e9_check_all_crc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *sensor = NULL;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+ FIMC_BUG(!module);
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(module->subdev);
+ if (!sensor) {
+ err("device sensor is NULL");
+ ret = -ENODEV;
+ return ret;
+ }
+
+ /* Check CRC to Address cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_address, subdev);
+ if (ret) {
+ err("%s(): 5E9 EEPROM Address section CRC check fail(%d)", __func__, ret);
+
+ /* All calibration data is zero set only Address section is invalid CRC */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "all",
+ EEPROM_ADD_CRC_SEC, EEPROM_DATA_SIZE, 0xff);
+
+ /*Set all cal_status to ERROR if Address cal data invalid*/
+ for (int i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ sensor->cal_status[i] = CRC_ERROR;
+
+ return ret;
+ } else
+ info("5E9 EEPROM Address section CRC check success\n");
+
+ /* Check CRC to Information cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_info, subdev);
+ if (ret) {
+ err("%s(): 5E9 EEPROM Information CRC section check fail(%d)", __func__, ret);
+
+ /* All calibration data is 0xff set but exception Address section */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "Information - End",
+ EEPROM_INFO_CRC_SEC, EEPROM_ADD_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_ERROR;
+
+ } else {
+ info("5E9 EEPROM Informaion section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to AWB cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_awb, subdev);
+ if (ret) {
+ err("%s(): 5E9 EEPROM AWB section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AWB",
+ EEPROM_AWB_CRC_SEC, EEPROM_AWB_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_ERROR;
+
+ } else {
+ info("5E9 EEPROM AWB section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_NO_ERROR;
+
+ ret = fimc_is_sensor_eeprom_check_awb_ratio(&eeprom->data[EEPROM_AWB_UNIT_OFFSET],
+ &eeprom->data[EEPROM_AWB_GOLDEN_OFFSET],&eeprom->data[EEPROM_AWB_LIMIT_OFFSET]);
+ if (ret) {
+ err("%s(): 5E9 EEPROM AWB ratio out of limit(%d)", __func__, ret);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = LIMIT_FAILURE;
+ }
+ }
+
+ /* Check CRC to LSC cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_lsc, subdev);
+ if (ret) {
+ err("%s(): 5E9 EEPROM LSC section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "LSC",
+ EEPROM_LSC_CRC_SEC, EEPROM_LSC_CAL_SIZE, 0xff);
+
+ } else
+ info("5E9 EEPROM LSC section CRC check success\n");
+
+ /* Check CRC to AE Sync cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_ae, subdev);
+ if (ret) {
+ err("%s(): 5E9 EEPROM AE section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AE",
+ EEPROM_AE_CRC_SEC, EEPROM_AE_CAL_SIZE, 0xff);
+
+ } else
+ info("5E9 EEPROM AE section CRC check success\n");
+
+ /* Check CRC to SFR cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_sfr, subdev);
+ if (ret) {
+ err("%s(): EEPROM SFR section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "SFR",
+ EEPROM_SFR_CRC_SEC, EEPROM_SFR_CAL_SIZE, 0xff);
+
+ } else
+ info("5E9 EEPROM SFR section CRC check success\n");
+
+ /* Write file to serial number of Information calibration data */
+ ret = fimc_is_eeprom_file_write(EEPROM_SERIAL_NUM_DATA_PATH,
+ (void *)&eeprom->data[EEPROM_INFO_SERIAL_NUM_START], EEPROM_INFO_SERIAL_NUM_SIZE);
+ if (ret < 0)
+ err("%s(), DUAL cal file write fail(%d)", __func__, ret);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_5e9_check_address(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_ADD_CRC_FST] << 8) | (eeprom->data[EEPROM_ADD_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_ADD_CRC_CHK_START], EEPROM_ADD_CRC_CHK_SIZE);
+ if (crc_value != crc16) {
+ err("Error to ADD CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+
+ ret = -EINVAL;
+ } else
+ info("ADD CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_5e9_check_info(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_INFO_CRC_FST] << 8) | (eeprom->data[EEPROM_INFO_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_INFO_CRC_CHK_START], EEPROM_INFO_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to INFO CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("INFO CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_5e9_check_awb(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AWB_CRC_FST] << 8) | (eeprom->data[EEPROM_AWB_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AWB_CRC_CHK_START], EEPROM_AWB_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AWB CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AWB CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_5e9_check_ae(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AE_CRC_FST] << 8) | (eeprom->data[EEPROM_AE_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AE_CRC_CHK_START], EEPROM_AE_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AE CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AE CRC16: %x, cal_buffer CRC: %x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_5e9_check_lsc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_LSC_CRC_FST] << 8) | (eeprom->data[EEPROM_LSC_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_LSC_CRC_CHK_START], EEPROM_LSC_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to LSC CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("LSC CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_5e9_check_sfr(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_SFR_CRC_FST] << 8) | (eeprom->data[EEPROM_SFR_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_SFR_CRC_CHK_START], EEPROM_SFR_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to SFR CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("SFR CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+int fimc_is_eeprom_5e9_get_cal_data(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_eeprom *eeprom;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ client = eeprom->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ /*
+ * If already read at EEPROM data in module
+ * don't again read at EEPROM but there isn't file or
+ * data is NULL read EEPROM data
+ */
+ ret = fimc_is_eeprom_file_read(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret) {
+ /* I2C read to Sensor EEPROM cal data */
+ ret = fimc_is_eeprom_module_read(client, EEPROM_ADD_CRC_FST, eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(): eeprom i2c read failed(%d)\n", __func__, ret);
+ return ret;
+ }
+
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+
+ /* Write file to Cal data */
+ ret = fimc_is_eeprom_file_write(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(), eeprom file write fail(%d)\n", __func__, ret);
+ return ret;
+ }
+ } else {
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+ }
+
+ return ret;
+}
+
+static struct fimc_is_eeprom_ops sensor_eeprom_ops = {
+ .eeprom_read = fimc_is_eeprom_5e9_get_cal_data,
+ .eeprom_check_all_crc = fimc_is_eeprom_5e9_check_all_crc,
+ .eeprom_check_address = fimc_is_eeprom_5e9_check_address,
+ .eeprom_check_info = fimc_is_eeprom_5e9_check_info,
+ .eeprom_check_awb = fimc_is_eeprom_5e9_check_awb,
+ .eeprom_check_ae = fimc_is_eeprom_5e9_check_ae,
+ .eeprom_check_lsc = fimc_is_eeprom_5e9_check_lsc,
+ .eeprom_check_sfr = fimc_is_eeprom_5e9_check_sfr,
+};
+
+static int sensor_eeprom_5e9_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0, i;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_eeprom = NULL;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *device;
+ struct device *dev;
+ struct device_node *dnode;
+ u32 sensor_id = 0;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ device = &core->sensor[sensor_id];
+ if (!device) {
+ err("sensor device is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom = kzalloc(sizeof(struct fimc_is_eeprom), GFP_KERNEL);
+ if (!eeprom) {
+ err("eeprom is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_eeprom = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_eeprom) {
+ probe_err("subdev_cis NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->data = kzalloc(EEPROM_DATA_SIZE, GFP_KERNEL);
+ if (!eeprom->data) {
+ err("data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->id = EEPROM_NAME_5E9;
+ eeprom->subdev = subdev_eeprom;
+ eeprom->device = sensor_id;
+ eeprom->client = client;
+ eeprom->i2c_lock = NULL;
+ eeprom->total_size = EEPROM_DATA_SIZE;
+ eeprom->eeprom_ops = &sensor_eeprom_ops;
+
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ device->cal_status[i] = CRC_NO_ERROR;
+
+ device->subdev_eeprom = subdev_eeprom;
+ device->eeprom = eeprom;
+
+ v4l2_set_subdevdata(subdev_eeprom, eeprom);
+ v4l2_set_subdev_hostdata(subdev_eeprom, device);
+
+ snprintf(subdev_eeprom->name, V4L2_SUBDEV_NAME_SIZE, "eeprom-subdev.%d", eeprom->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_eeprom_5e9_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-sensor-eeprom-5e9",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_eeprom_5e9_match);
+
+static const struct i2c_device_id sensor_eeprom_5e9_idt[] = {
+ { SENSOR_EEPROM_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_eeprom_5e9_driver = {
+ .probe = sensor_eeprom_5e9_probe,
+ .driver = {
+ .name = SENSOR_EEPROM_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_eeprom_5e9_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_eeprom_5e9_idt
+};
+
+static int __init sensor_eeprom_5e9_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_eeprom_5e9_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_eeprom_5e9_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_eeprom_5e9_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series EEPROM driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_EEPROM_5E9_H
+#define FIMC_IS_EEPROM_5E9_H
+
+#define EEPROM_DATA_PATH "/data/vendor/camera/5e9_eeprom_data.bin"
+#define EEPROM_SERIAL_NUM_DATA_PATH "/data/vendor/camera/serial_number_5e.bin"
+
+/* Total Cal data size */
+#define EEPROM_DATA_SIZE SZ_8K
+
+/* Address */
+#define EEPROM_ADD_CRC_FST 0x00
+#define EEPROM_ADD_CRC_SEC 0x01
+#define EEPROM_ADD_CRC_CHK_START 0x04
+#define EEPROM_ADD_CRC_CHK_SIZE 0x48
+#define EEPROM_ADD_CAL_SIZE 0x4C
+
+/* Information Cal */
+#define EEPROM_INFO_CRC_FST 0x50
+#define EEPROM_INFO_CRC_SEC 0x51
+#define EEPROM_INFO_CRC_CHK_START 0x54
+#define EEPROM_INFO_CRC_CHK_SIZE 0x2E
+#define EEPROM_INFO_SERIAL_NUM_START 0x79
+#define EEPROM_INFO_SERIAL_NUM_SIZE 0x8
+#define EEPROM_INFO_CAL_SIZE 0x32
+
+/* AWB Cal */
+#define EEPROM_AWB_CRC_FST 0x90
+#define EEPROM_AWB_CRC_SEC 0x91
+#define EEPROM_AWB_CRC_CHK_START 0x94
+#define EEPROM_AWB_CRC_CHK_SIZE 0x32
+#define EEPROM_AWB_CAL_SIZE 0x36
+#define EEPROM_AWB_LIMIT_OFFSET 0xB4
+#define EEPROM_AWB_GOLDEN_OFFSET 0xB8
+#define EEPROM_AWB_UNIT_OFFSET 0xBE
+
+/* LSC Cal */
+#define EEPROM_LSC_CRC_FST 0x100
+#define EEPROM_LSC_CRC_SEC 0x101
+#define EEPROM_LSC_CRC_CHK_START 0x104
+#define EEPROM_LSC_CRC_CHK_SIZE 0x1374
+#define EEPROM_LSC_CAL_SIZE 0x1378
+
+/* AE Sync Cal */
+#define EEPROM_AE_CRC_FST 0x1480
+#define EEPROM_AE_CRC_SEC 0x1481
+#define EEPROM_AE_CRC_CHK_START 0x1484
+#define EEPROM_AE_CRC_CHK_SIZE 0x10
+#define EEPROM_AE_CAL_SIZE 0x14
+
+/* SFR Cal */
+#define EEPROM_SFR_CRC_FST 0x1520
+#define EEPROM_SFR_CRC_SEC 0x1521
+#define EEPROM_SFR_CRC_CHK_START 0x14A0
+#define EEPROM_SFR_CRC_CHK_SIZE 0x80
+#define EEPROM_SFR_CAL_SIZE 0x82
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/time.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-sensor-eeprom-gm1.h"
+#include "fimc-is-sensor-eeprom.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+
+#define SENSOR_EEPROM_NAME "GM1SP"
+
+int fimc_is_eeprom_gm1_check_all_crc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *sensor = NULL;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+ FIMC_BUG(!module);
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(module->subdev);
+ if (!sensor) {
+ err("device sensor is NULL");
+ ret = -ENODEV;
+ return ret;
+ }
+
+ /* Check CRC to Address cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_address, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM Address section CRC check fail(%d)", __func__, ret);
+
+ /* All calibration data is zero set only Address section is invalid CRC */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "all",
+ EEPROM_ADD_CRC_SEC, EEPROM_DATA_SIZE, 0xff);
+
+ /*Set all cal_status to ERROR if Address cal data invalid*/
+ for (int i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ sensor->cal_status[i] = CRC_ERROR;
+ return ret;
+ } else
+ info("GM1 EEPROM Address section CRC check success\n");
+
+ /* Check CRC to Information cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_info, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM Information CRC section check fail(%d)", __func__, ret);
+
+ /* All calibration data is 0xff set but exception Address section */
+ fimc_is_eeprom_cal_data_set(eeprom->data, "Information - End",
+ EEPROM_INFO_CRC_SEC, EEPROM_ADD_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_ERROR;
+ } else {
+ info("GM1 EEPROM Informaion section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_MNF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to AWB cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_awb, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM AWB section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AWB",
+ EEPROM_AWB_CRC_SEC, EEPROM_AWB_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_ERROR;
+ } else {
+ info("GM1 EEPROM AWB section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = CRC_NO_ERROR;
+
+ ret = fimc_is_sensor_eeprom_check_awb_ratio(&eeprom->data[EEPROM_AWB_UNIT_OFFSET],
+ &eeprom->data[EEPROM_AWB_GOLDEN_OFFSET],&eeprom->data[EEPROM_AWB_LIMIT_OFFSET]);
+ if (ret) {
+ err("%s(): GM1 EEPROM AWB ratio out of limit(%d)", __func__, ret);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AWB] = LIMIT_FAILURE;
+ }
+ }
+
+ /* Check CRC to AF cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_af, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM AF section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AF",
+ EEPROM_AF_CRC_SEC, EEPROM_AF_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AF] = CRC_ERROR;
+ } else {
+ info("GM1 EEPROM AF section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_AF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to LSC cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_lsc, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM LSC section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "LSC",
+ EEPROM_LSC_CRC_SEC, EEPROM_LSC_CAL_SIZE, 0xff);
+ } else
+ info("GM1 EEPROM LSC section CRC check success\n");
+
+ /* Check CRC to PDAF cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_pdaf, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM PDAF section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "PDAF",
+ EEPROM_PDAF_CRC_SEC, EEPROM_PDAF_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_PDAF] = CRC_ERROR;
+ } else {
+ info("GM1 EEPROM PDAF section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_PDAF] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to OIS cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_ois, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM OIS section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "OIS",
+ EEPROM_OIS_CRC_SEC, EEPROM_OIS_CAL_SIZE, 0xff);
+ } else
+ info("GM1 EEPROM OIS section CRC check success\n");
+
+ /* Check CRC to AE Sync cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_ae, subdev);
+ if (ret) {
+ err("%s(): GM1 EEPROM AE section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "AE",
+ EEPROM_AE_CRC_SEC, EEPROM_AE_CAL_SIZE, 0xff);
+ } else
+ info("GM1 EEPROM AE section CRC check success\n");
+
+ /* Check CRC to Dual cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_dual, subdev);
+ if (ret) {
+ err("%s(): EEPROM Dual section check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "DUAL",
+ EEPROM_DUAL_CRC_SEC, EEPROM_DUAL_CAL_SIZE, 0xff);
+
+ sensor->cal_status[CAMERA_CRC_INDEX_DUAL] = CRC_ERROR;
+ } else {
+ info("GM1 EEPROM Dual section CRC check success\n");
+
+ sensor->cal_status[CAMERA_CRC_INDEX_DUAL] = CRC_NO_ERROR;
+ }
+
+ /* Check CRC to SFR cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_sfr, subdev);
+ if (ret) {
+ err("%s(): EEPROM SFR section CRC check fail(%d)", __func__, ret);
+
+ fimc_is_eeprom_cal_data_set(eeprom->data, "SFR",
+ EEPROM_SFR_CRC_SEC, EEPROM_SFR_CAL_SIZE, 0xff);
+ } else
+ info("GM1 EEPROM SFR section CRC check success\n");
+
+ /*
+ * Write files to serial number and Dual cal data when success of
+ * Address, Info, Dual calibration data
+ */
+ if (!sensor->cal_status[CAMERA_CRC_INDEX_DUAL]) {
+ ret = fimc_is_eeprom_file_write(EEPROM_SERIAL_NUM_DATA_PATH,
+ (void *)&eeprom->data[EEPROM_INFO_SERIAL_NUM_START], EEPROM_INFO_SERIAL_NUM_SIZE);
+ if (ret < 0)
+ err("%s(), Serial number file write fail(%d)", __func__, ret);
+
+ /* Write file to Dual calibration data */
+ ret = fimc_is_eeprom_file_write(EEPROM_DUAL_DATA_PATH,
+ (void *)&eeprom->data[EEPROM_DUAL_CRC_CHK_START], EEPROM_DUAL_CAL_SIZE);
+ if (ret < 0)
+ err("%s(), DUAL cal file write fail(%d)", __func__, ret);
+ }
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_address(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_ADD_CRC_FST] << 8) | (eeprom->data[EEPROM_ADD_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_ADD_CRC_CHK_START], EEPROM_ADD_CRC_CHK_SIZE);
+ if (crc_value != crc16) {
+ err("Error to ADD CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+
+ ret = -EINVAL;
+ } else
+ info("ADD CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_info(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_INFO_CRC_FST] << 8) | (eeprom->data[EEPROM_INFO_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_INFO_CRC_CHK_START], EEPROM_INFO_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to INFO CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("INFO CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_awb(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AWB_CRC_FST] << 8) | (eeprom->data[EEPROM_AWB_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AWB_CRC_CHK_START], EEPROM_AWB_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AWB CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AWB CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_af(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AF_CRC_FST] << 8) | (eeprom->data[EEPROM_AF_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AF_CRC_CHK_START], EEPROM_AF_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AF CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AF CRC16: %x, cal_buffer CRC: %x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_ae(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_AE_CRC_FST] << 8) | (eeprom->data[EEPROM_AE_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_AE_CRC_CHK_START], EEPROM_AE_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to AE CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("AE CRC16: %x, cal_buffer CRC: %x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_lsc(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_LSC_CRC_FST] << 8) | (eeprom->data[EEPROM_LSC_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_LSC_CRC_CHK_START], EEPROM_LSC_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to LSC CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("LSC CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_ois(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_OIS_CRC_FST] << 8) | (eeprom->data[EEPROM_OIS_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_OIS_CRC_CHK_START], EEPROM_OIS_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to OIS CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("OIS CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_pdaf(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_PDAF_CRC_FST] << 8) | (eeprom->data[EEPROM_PDAF_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_PDAF_CRC_CHK_START], EEPROM_PDAF_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to PDAF CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("PDAF CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_dual(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_DUAL_CRC_FST] << 8) | (eeprom->data[EEPROM_DUAL_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_DUAL_CRC_CHK_START], EEPROM_DUAL_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to DUAL CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("DUAL CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+static int fimc_is_eeprom_gm1_check_sfr(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+ struct fimc_is_eeprom *eeprom = NULL;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ crc_value = ((eeprom->data[EEPROM_SFR_CRC_FST] << 8) | (eeprom->data[EEPROM_SFR_CRC_SEC]));
+
+ crc16 = fimc_is_sensor_eeprom_check_crc(&eeprom->data[EEPROM_SFR_CRC_CHK_START], EEPROM_SFR_CRC_CHK_SIZE);
+ if (crc_value != crc16)
+ err("Error to SFR CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ else
+ info("SFR CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+
+ return ret;
+}
+
+int fimc_is_eeprom_gm1_get_cal_data(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_eeprom *eeprom;
+ struct i2c_client *client;
+
+ FIMC_BUG(!subdev);
+
+ eeprom = (struct fimc_is_eeprom *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!eeprom);
+
+ client = eeprom->client;
+ if (unlikely(!client)) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ /*
+ * If already read at EEPROM data in module
+ * don't again read at EEPROM but there isn't file or
+ * data is NULL read EEPROM data
+ */
+ ret = fimc_is_eeprom_file_read(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret) {
+ I2C_MUTEX_LOCK(eeprom->i2c_lock);
+ /* I2C read to Sensor EEPROM cal data */
+ ret = fimc_is_eeprom_module_read(client, EEPROM_ADD_CRC_FST, eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(): eeprom i2c read failed(%d)\n", __func__, ret);
+ I2C_MUTEX_UNLOCK(eeprom->i2c_lock);
+ return ret;
+ }
+ I2C_MUTEX_UNLOCK(eeprom->i2c_lock);
+
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+
+ /* Write file to Cal data */
+ ret = fimc_is_eeprom_file_write(EEPROM_DATA_PATH, (void *)eeprom->data, EEPROM_DATA_SIZE);
+ if (ret < 0) {
+ err("%s(), eeprom file write fail(%d)\n", __func__, ret);
+ return ret;
+ }
+ } else {
+ /* CRC check to each section cal data */
+ ret = CALL_EEPROMOPS(eeprom, eeprom_check_all_crc, subdev);
+ if (ret < 0)
+ err("%s(): eeprom data invalid(%d)\n", __func__, ret);
+ }
+
+ return ret;
+}
+
+static struct fimc_is_eeprom_ops sensor_eeprom_ops = {
+ .eeprom_read = fimc_is_eeprom_gm1_get_cal_data,
+ .eeprom_check_all_crc = fimc_is_eeprom_gm1_check_all_crc,
+ .eeprom_check_address = fimc_is_eeprom_gm1_check_address,
+ .eeprom_check_info = fimc_is_eeprom_gm1_check_info,
+ .eeprom_check_awb = fimc_is_eeprom_gm1_check_awb,
+ .eeprom_check_af = fimc_is_eeprom_gm1_check_af,
+ .eeprom_check_ae = fimc_is_eeprom_gm1_check_ae,
+ .eeprom_check_lsc = fimc_is_eeprom_gm1_check_lsc,
+ .eeprom_check_ois = fimc_is_eeprom_gm1_check_ois,
+ .eeprom_check_pdaf = fimc_is_eeprom_gm1_check_pdaf,
+ .eeprom_check_dual = fimc_is_eeprom_gm1_check_dual,
+ .eeprom_check_sfr = fimc_is_eeprom_gm1_check_sfr,
+};
+
+static int sensor_eeprom_gm1_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0, i;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_eeprom = NULL;
+ struct fimc_is_eeprom *eeprom = NULL;
+ struct fimc_is_device_sensor *device;
+ struct device *dev;
+ struct device_node *dnode;
+ u32 sensor_id = 0;
+
+ FIMC_BUG(!client);
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ device = &core->sensor[sensor_id];
+ if (!device) {
+ err("sensor device is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom = kzalloc(sizeof(struct fimc_is_eeprom), GFP_KERNEL);
+ if (!eeprom) {
+ err("eeprom is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_eeprom = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_eeprom) {
+ err("subdev_eeprom NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->data = kzalloc(EEPROM_DATA_SIZE, GFP_KERNEL);
+ if (!eeprom->data) {
+ err("data is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ eeprom->id = EEPROM_NAME_GM1;
+ eeprom->subdev = subdev_eeprom;
+ eeprom->device = sensor_id;
+ eeprom->client = client;
+ eeprom->i2c_lock = NULL;
+ eeprom->total_size = EEPROM_DATA_SIZE;
+ eeprom->eeprom_ops = &sensor_eeprom_ops;
+
+ device->subdev_eeprom = subdev_eeprom;
+ device->eeprom = eeprom;
+
+ for (i = 0; i < CAMERA_CRC_INDEX_MAX; i++)
+ device->cal_status[i] = CRC_NO_ERROR;
+
+ v4l2_set_subdevdata(subdev_eeprom, eeprom);
+ v4l2_set_subdev_hostdata(subdev_eeprom, device);
+
+ snprintf(subdev_eeprom->name, V4L2_SUBDEV_NAME_SIZE, "eeprom-subdev.%d", eeprom->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id sensor_eeprom_gm1sp_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-sensor-eeprom-gm1",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_eeprom_gm1sp_match);
+
+static const struct i2c_device_id sensor_eeprom_gm1sp_idt[] = {
+ { SENSOR_EEPROM_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_eeprom_gm1sp_driver = {
+ .probe = sensor_eeprom_gm1_probe,
+ .driver = {
+ .name = SENSOR_EEPROM_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_eeprom_gm1sp_match,
+ .suppress_bind_attrs = true,
+ },
+ .id_table = sensor_eeprom_gm1sp_idt
+};
+
+static int __init sensor_eeprom_gm1sp_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_eeprom_gm1sp_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_eeprom_gm1sp_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_eeprom_gm1sp_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series EEPROM driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_EEPROM_GM1_H
+#define FIMC_IS_EEPROM_GM1_H
+
+#define EEPROM_DATA_PATH "/data/vendor/camera/gm1_eeprom_data.bin"
+#define EEPROM_DUAL_DATA_PATH "/data/vendor/camera/dual_cal_dump.bin"
+#define EEPROM_SERIAL_NUM_DATA_PATH "/data/vendor/camera/serial_number.bin"
+
+/* Total Cal data size */
+#define EEPROM_DATA_SIZE SZ_16K
+
+/* Big endian Checksum */
+/* Address */
+#define EEPROM_ADD_CRC_FST 0x00
+#define EEPROM_ADD_CRC_SEC 0x01
+#define EEPROM_ADD_CRC_CHK_START 0x04
+#define EEPROM_ADD_CRC_CHK_SIZE 0x48
+#define EEPROM_ADD_CAL_SIZE 0x4C
+
+/* Information Cal */
+#define EEPROM_INFO_CRC_FST 0x50
+#define EEPROM_INFO_CRC_SEC 0x51
+#define EEPROM_INFO_CRC_CHK_START 0x54
+#define EEPROM_INFO_CRC_CHK_SIZE 0x2E
+#define EEPROM_INFO_SERIAL_NUM_START 0x79
+#define EEPROM_INFO_SERIAL_NUM_SIZE 0x8
+#define EEPROM_INFO_CAL_SIZE 0x32
+
+/* AWB Cal */
+#define EEPROM_AWB_CRC_FST 0x90
+#define EEPROM_AWB_CRC_SEC 0x91
+#define EEPROM_AWB_CRC_CHK_START 0x94
+#define EEPROM_AWB_CRC_CHK_SIZE 0x32
+#define EEPROM_AWB_CAL_SIZE 0x36
+#define EEPROM_AWB_LIMIT_OFFSET 0xB4
+#define EEPROM_AWB_GOLDEN_OFFSET 0xB8
+#define EEPROM_AWB_UNIT_OFFSET 0xBE
+
+/* AF Cal */
+#define EEPROM_AF_CRC_FST 0xD0
+#define EEPROM_AF_CRC_SEC 0xD1
+#define EEPROM_AF_CRC_CHK_START 0xD4
+#define EEPROM_AF_CRC_CHK_SIZE 0x1C
+#define EEPROM_AF_CAL_SIZE 0x20
+
+/* LSC Cal */
+#define EEPROM_LSC_CRC_FST 0x100
+#define EEPROM_LSC_CRC_SEC 0x101
+#define EEPROM_LSC_CRC_CHK_START 0x104
+#define EEPROM_LSC_CRC_CHK_SIZE 0x16D0
+#define EEPROM_LSC_CAL_SIZE 0x16D4
+
+/* PDAF Cal */
+#define EEPROM_PDAF_CRC_FST 0x1800
+#define EEPROM_PDAF_CRC_SEC 0x1801
+#define EEPROM_PDAF_CRC_CHK_START 0x1804
+#define EEPROM_PDAF_CRC_CHK_SIZE 0x5A0
+#define EEPROM_PDAF_CAL_SIZE 0x5A4
+
+/* OIS Cal */
+#define EEPROM_OIS_CRC_FST 0x1DB0
+#define EEPROM_OIS_CRC_SEC 0x1DB1
+#define EEPROM_OIS_CRC_CHK_START 0x1DB4
+#define EEPROM_OIS_CRC_CHK_SIZE 0x4C
+#define EEPROM_OIS_CAL_SIZE 0x50
+
+/* AE Sync Cal */
+#define EEPROM_AE_CRC_FST 0x2000
+#define EEPROM_AE_CRC_SEC 0x2001
+#define EEPROM_AE_CRC_CHK_START 0x2004
+#define EEPROM_AE_CRC_CHK_SIZE 0x10
+#define EEPROM_AE_CAL_SIZE 0x14
+
+/* Dual camera Cal */
+#define EEPROM_DUAL_CRC_FST 0x2100
+#define EEPROM_DUAL_CRC_SEC 0x2101
+#define EEPROM_DUAL_CRC_CHK_START 0x2104
+#define EEPROM_DUAL_CRC_CHK_SIZE 0x800
+#define EEPROM_DUAL_CAL_SIZE SZ_2K
+
+/* SFR Cal */
+#define EEPROM_SFR_CRC_FST 0x31E8
+#define EEPROM_SFR_CRC_SEC 0x31E9
+#define EEPROM_SFR_CRC_CHK_START 0x3000
+#define EEPROM_SFR_CRC_CHK_SIZE 0x1E8
+#define EEPROM_SFR_CAL_SIZE 0x1EA
+
+#endif
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+
+#include "fimc-is-sensor-eeprom.h"
+#include "fimc-is-helper-i2c.h"
+#include "fimc-is-core.h"
+
+void fimc_is_eeprom_cal_data_set(char *data, char *name,
+ u32 addr, u32 size, u32 value)
+{
+ int i;
+
+ /* value setting to (name) cal data section */
+ for (i = addr; i < size; i++)
+ data[i] = value;
+
+ info("%s() Done: %s calibration data is %d set\n", __func__, name, value);
+}
+
+int fimc_is_eeprom_file_write(const char *file_name, const void *data,
+ unsigned long size)
+{
+ int ret = 0;
+ struct file *fp;
+ mm_segment_t old_fs;
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ fp = filp_open(file_name, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, 0666);
+ if (IS_ERR_OR_NULL(fp)) {
+ ret = PTR_ERR(fp);
+ err("%s(): open file error(%s), error(%d)\n", __func__, file_name, ret);
+ goto p_err;
+ }
+
+ ret = vfs_write(fp, (const char *)data, size, &fp->f_pos);
+ if (ret < 0) {
+ err("%s(): file write fail(%s) to EEPROM data(%d)", __func__,
+ file_name, ret);
+ goto p_err;
+ }
+
+ info("%s(): wirte to file(%s)\n", __func__, file_name);
+p_err:
+ if (!IS_ERR_OR_NULL(fp))
+ filp_close(fp, NULL);
+
+ set_fs(old_fs);
+
+ return 0;
+}
+
+int fimc_is_eeprom_file_read(const char *file_name, const void *data,
+ unsigned long size)
+{
+ int ret = 0;
+ long fsize, nread;
+ mm_segment_t old_fs;
+ struct file *fp;
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ fp = filp_open(file_name, O_RDONLY, 0);
+ if (IS_ERR_OR_NULL(fp)) {
+ ret = PTR_ERR(fp);
+ err("filp_open(%s) fail(%d)!!\n", file_name, ret);
+ goto p_err;
+ }
+
+ fsize = fp->f_path.dentry->d_inode->i_size;
+
+ nread = vfs_read(fp, (char __user *)data, size, &fp->f_pos);
+ if (nread != size) {
+ err("failed to read eeprom file, (%ld) Bytes", nread);
+ ret = nread;
+ goto p_err;
+ }
+
+ info("%s(): read to file(%s)\n", __func__, file_name);
+p_err:
+ if (!IS_ERR_OR_NULL(fp))
+ filp_close(fp, NULL);
+
+ set_fs(old_fs);
+
+ return ret;
+}
+
+int fimc_is_sensor_eeprom_check_crc(char *data, size_t size)
+{
+ char *tmp = data;
+ u32 crc[16];
+ int i, j;
+ u16 crc16 = 0;
+
+ memset(crc, 0, sizeof(crc));
+ for (i = 0; i < size; i++) {
+ for (j = 7; j >= 0; j--) {
+ /* isolate the bit in the byte */
+ u32 doInvert = *tmp & (1 << j);
+
+ // shift the bit to LSB in the byte
+ doInvert = doInvert >> j;
+
+ // XOR required?
+ doInvert = doInvert ^ crc[15];
+
+ crc[15] = crc[14] ^ doInvert;
+ crc[14] = crc[13];
+ crc[13] = crc[12];
+ crc[12] = crc[11];
+ crc[11] = crc[10];
+ crc[10] = crc[9];
+ crc[9] = crc[8];
+ crc[8] = crc[7];
+ crc[7] = crc[6];
+ crc[6] = crc[5];
+ crc[5] = crc[4];
+ crc[4] = crc[3];
+ crc[3] = crc[2];
+ crc[2] = crc[1] ^ doInvert;
+ crc[1] = crc[0];
+ crc[0] = doInvert;
+ }
+ tmp++;
+ }
+
+ /* convert bits to CRC word */
+ for (i = 0; i < 16; i++)
+ crc16 = crc16 + (crc[i] << i);
+
+ return crc16;
+}
+
+int fimc_is_sensor_eeprom_check_awb_ratio(char *unit, char *golden, char *limit)
+{
+ int ret = 0;
+
+ float r_g_min = (float)(limit[0]) / 1000;
+ float r_g_max = (float)(limit[1]) / 1000;
+ float b_g_min = (float)(limit[2]) / 1000;
+ float b_g_max = (float)(limit[3]) / 1000;
+
+ float rg = (float) ((unit[1] << 8) | (unit[0])) / 16384;
+ float bg = (float) ((unit[3] << 8) | (unit[2])) / 16384;
+
+ float golden_rg = (float) ((golden[1] << 8) | (golden[0])) / 16384;
+ float golden_bg = (float) ((golden[3] << 8) | (golden[2])) / 16384;
+
+ if (rg < (golden_rg - r_g_min) || rg > (golden_rg + r_g_max)) {
+ err("%s(): Final RG calibration factors out of range! rg=0x%x golden_rg=0x%x",
+ __func__, (unit[1] << 8 | unit[0]), (golden[1] << 8 | golden[0]));
+ ret = 1;
+ }
+
+ if (bg < (golden_bg - b_g_min) || bg > (golden_bg + b_g_max)) {
+ err("%s(): Final BG calibration factors out of range! bg=0x%x, golden_bg=0x%x",
+ __func__, (unit[3] << 8 | unit[2]), (golden[3] << 8 | golden[2]));
+ ret = 1;
+ }
+
+ return ret;
+}
+
+int fimc_is_eeprom_module_read(struct i2c_client *client, u32 addr,
+ char *data, unsigned long size)
+{
+ int ret = 0;
+
+ /* Read EEPROM cal data in module */
+ ret = fimc_is_sensor_read8_size(client, &data[0], addr, size);
+ if (ret < 0) {
+ err("%s(), i2c read failed(%d)\n", __func__, ret);
+ return ret;
+ }
+
+ info("EEPROM module read done!!\n");
+
+ return ret;
+}
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_EEPROM_H
+#define FIMC_IS_EEPROM_H
+
+void fimc_is_eeprom_cal_data_set(char *data, char *name,
+ u32 addr, u32 size, u32 value);
+int fimc_is_eeprom_file_write(const char *file_name, const void *data,
+ unsigned long size);
+int fimc_is_eeprom_file_read(const char *file_name, const void *data,
+ unsigned long size);
+int fimc_is_eeprom_module_read(struct i2c_client *client, u32 addr,
+ char *data, unsigned long size);
+int fimc_is_sensor_eeprom_check_crc(char *data, size_t size);
+int fimc_is_sensor_eeprom_check_awb_ratio(char *unit, char *golden, char *limit);
+
+#endif
+
return (u32)usec;
}
+u32 fimc_is_sensor_calculate_tgain(u32 dgain, u32 again)
+{
+ u32 tgain;
+
+ if (dgain > 1000)
+ tgain = dgain * (again / 1000);
+ else
+ tgain = again;
+
+ return tgain;
+}
u32 fimc_is_sensor_ctl_get_csi_vsync_cnt(struct fimc_is_device_sensor *device)
{
return atomic_read(&csi->fcount);
}
+void fimc_is_sensor_ctl_update_exposure_to_uctl(camera2_sensor_uctl_t *sensor_uctl,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure)
+{
+ FIMC_BUG_VOID(!sensor_uctl);
+ FIMC_BUG_VOID(!exposure);
+
+ switch (num_data) {
+ case EXPOSURE_GAIN_COUNT_1:
+ sensor_uctl->exposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_LONG]);
+ sensor_uctl->longExposureTime = 0;
+ sensor_uctl->shortExposureTime = 0;
+ sensor_uctl->middleExposureTime = 0;
+ break;
+ case EXPOSURE_GAIN_COUNT_2:
+ sensor_uctl->exposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_SHORT]);
+ sensor_uctl->longExposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_LONG]);
+ sensor_uctl->shortExposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_SHORT]);
+ sensor_uctl->middleExposureTime = 0;
+ break;
+ case EXPOSURE_GAIN_COUNT_3:
+ sensor_uctl->exposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_SHORT]);
+ sensor_uctl->longExposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_LONG]);
+ sensor_uctl->shortExposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_SHORT]);
+ sensor_uctl->middleExposureTime =
+ fimc_is_sensor_convert_us_to_ns(exposure[EXPOSURE_GAIN_MIDDLE]);
+ break;
+ default:
+ err("invalid exp_gain num_data(%d)", num_data);
+ break;
+ }
+}
+
+void fimc_is_sensor_ctl_update_gain_to_uctl(camera2_sensor_uctl_t *sensor_uctl,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain, u32 *digital_gain)
+{
+ FIMC_BUG_VOID(!sensor_uctl);
+ FIMC_BUG_VOID(!analog_gain);
+ FIMC_BUG_VOID(!digital_gain);
+
+ switch (num_data) {
+ case EXPOSURE_GAIN_COUNT_1:
+ sensor_uctl->analogGain = analog_gain[EXPOSURE_GAIN_LONG];
+ sensor_uctl->digitalGain = digital_gain[EXPOSURE_GAIN_LONG];
+ sensor_uctl->longAnalogGain = 0;
+ sensor_uctl->longDigitalGain = 0;
+ sensor_uctl->shortAnalogGain = 0;
+ sensor_uctl->shortDigitalGain = 0;
+ sensor_uctl->middleAnalogGain = 0;
+ sensor_uctl->middleDigitalGain = 0;
+ break;
+ case EXPOSURE_GAIN_COUNT_2:
+ sensor_uctl->analogGain = analog_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->digitalGain = digital_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->longAnalogGain = analog_gain[EXPOSURE_GAIN_LONG];
+ sensor_uctl->longDigitalGain = digital_gain[EXPOSURE_GAIN_LONG];
+ sensor_uctl->shortAnalogGain = analog_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->shortDigitalGain = digital_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->middleAnalogGain = 0;
+ sensor_uctl->middleDigitalGain = 0;
+ break;
+ case EXPOSURE_GAIN_COUNT_3:
+ sensor_uctl->analogGain = analog_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->digitalGain = digital_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->longAnalogGain = analog_gain[EXPOSURE_GAIN_LONG];
+ sensor_uctl->longDigitalGain = digital_gain[EXPOSURE_GAIN_LONG];
+ sensor_uctl->shortAnalogGain = analog_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->shortDigitalGain = digital_gain[EXPOSURE_GAIN_SHORT];
+ sensor_uctl->middleAnalogGain = analog_gain[EXPOSURE_GAIN_MIDDLE];
+ sensor_uctl->middleDigitalGain = digital_gain[EXPOSURE_GAIN_MIDDLE];
+ break;
+ default:
+ err("invalid exp_gain num_data(%d)", num_data);
+ break;
+ }
+}
+
void fimc_is_sensor_ctl_update_cis_data(cis_shared_data *cis_data, camera2_sensor_uctl_t *sensor_uctrl)
{
FIMC_BUG_VOID(!sensor_uctrl);
fimc_is_sensor_convert_ns_to_us(sensor_uctrl->shortExposureTime);
cis_data->auto_exposure[NEXT_FRAME].short_analog_gain = sensor_uctrl->shortAnalogGain;
cis_data->auto_exposure[NEXT_FRAME].short_digital_gain = sensor_uctrl->shortDigitalGain;
-
+ cis_data->auto_exposure[NEXT_FRAME].middle_exposure =
+ fimc_is_sensor_convert_ns_to_us(sensor_uctrl->middleExposureTime);
+ cis_data->auto_exposure[NEXT_FRAME].middle_analog_gain = sensor_uctrl->middleAnalogGain;
+ cis_data->auto_exposure[NEXT_FRAME].middle_digital_gain = sensor_uctrl->middleDigitalGain;
}
void fimc_is_sensor_ctl_get_ae_index(struct fimc_is_device_sensor *device,
void fimc_is_sensor_ctl_adjust_ae_setting(struct fimc_is_device_sensor *device,
ae_setting *setting, cis_shared_data *cis_data)
{
+ struct fimc_is_module_enum *module = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
u32 exposure_index = 0;
u32 again_index = 0;
u32 dgain_index = 0;
FIMC_BUG_VOID(!setting);
FIMC_BUG_VOID(!cis_data);
+ module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(device->subdev_module);
+ FIMC_BUG_VOID(!module);
+
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+
fimc_is_sensor_ctl_get_ae_index(device, &exposure_index, &again_index, &dgain_index);
- if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ if (sensor_peri->sensor_interface.cis_mode == ITF_CIS_SMIA_WDR) {
setting->long_exposure = cis_data->auto_exposure[exposure_index].long_exposure;
setting->long_analog_gain = cis_data->auto_exposure[again_index].long_analog_gain;
setting->long_digital_gain = cis_data->auto_exposure[dgain_index].long_digital_gain;
setting->short_exposure = cis_data->auto_exposure[exposure_index].short_exposure;
setting->short_analog_gain = cis_data->auto_exposure[again_index].short_analog_gain;
setting->short_digital_gain = cis_data->auto_exposure[dgain_index].short_digital_gain;
+ setting->middle_exposure = cis_data->auto_exposure[exposure_index].middle_exposure;
+ setting->middle_analog_gain = cis_data->auto_exposure[again_index].middle_analog_gain;
+ setting->middle_digital_gain = cis_data->auto_exposure[dgain_index].middle_digital_gain;
} else {
setting->exposure = cis_data->auto_exposure[exposure_index].exposure;
setting->analog_gain = cis_data->auto_exposure[again_index].analog_gain;
}
void fimc_is_sensor_ctl_compensate_expo_gain(struct fimc_is_device_sensor *device,
- struct gain_setting *adj_gain_setting,
ae_setting *setting,
- cis_shared_data *cis_data)
+ struct ae_param *adj_again,
+ struct ae_param *adj_dgain)
{
+ struct fimc_is_module_enum *module = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
FIMC_BUG_VOID(!device);
- FIMC_BUG_VOID(!adj_gain_setting);
FIMC_BUG_VOID(!setting);
- FIMC_BUG_VOID(!cis_data);
+ FIMC_BUG_VOID(!adj_again);
+ FIMC_BUG_VOID(!adj_dgain);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(device->subdev_module);
+ FIMC_BUG_VOID(!module);
+
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
/* Compensate gain under extremely brightly Illumination */
- if (fimc_is_vender_wdr_mode_on(cis_data)) {
+ if (sensor_peri->sensor_interface.cis_mode == ITF_CIS_SMIA_WDR) {
fimc_is_sensor_peri_compensate_gain_for_ext_br(device, setting->long_exposure,
- &adj_gain_setting->long_again,
- &adj_gain_setting->long_dgain);
+ &adj_again->long_val,
+ &adj_dgain->long_val);
fimc_is_sensor_peri_compensate_gain_for_ext_br(device, setting->short_exposure,
- &adj_gain_setting->short_again,
- &adj_gain_setting->short_dgain);
+ &adj_again->short_val,
+ &adj_dgain->short_val);
+ fimc_is_sensor_peri_compensate_gain_for_ext_br(device, setting->middle_exposure,
+ &adj_again->middle_val,
+ &adj_dgain->middle_val);
} else {
fimc_is_sensor_peri_compensate_gain_for_ext_br(device, setting->exposure,
- &adj_gain_setting->long_again,
- &adj_gain_setting->long_dgain);
+ &adj_again->val,
+ &adj_dgain->val);
}
}
return ret;
}
-int fimc_is_sensor_ctl_adjust_gains(struct fimc_is_device_sensor *device,
- struct fimc_is_sensor_ctl *module_ctl,
+static int fimc_is_sensor_ctl_adjust_gains(struct fimc_is_device_sensor *device,
ae_setting *applied_ae_setting,
- struct gain_setting *adj_gain_setting)
+ struct ae_param *adj_again,
+ struct ae_param *adj_dgain)
{
int ret = 0;
struct fimc_is_module_enum *module = NULL;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- cis_shared_data *cis_data = NULL;
- camera2_sensor_ctl_t *sensor_ctrl = NULL;
- camera2_sensor_uctl_t *sensor_uctrl = NULL;
-
- u32 sensitivity = 0;
- u32 long_again = 0;
- u32 short_again = 0;
- u32 long_dgain = 0;
- u32 short_dgain = 0;
FIMC_BUG(!device);
- FIMC_BUG(!module_ctl);
FIMC_BUG(!applied_ae_setting);
- FIMC_BUG(!adj_gain_setting);
+ FIMC_BUG(!adj_again);
+ FIMC_BUG(!adj_dgain);
module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(device->subdev_module);
if (unlikely(!module)) {
FIMC_BUG(!module);
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- sensor_ctrl = &module_ctl->cur_cam20_sensor_ctrl;
- sensor_uctrl = &module_ctl->cur_cam20_sensor_udctrl;
- cis_data = sensor_peri->cis.cis_data;
- FIMC_BUG(!cis_data);
-
- /* detect manual sensor control or Auto mode
- * if use manual control, apply sensitivity to ctl meta
- * else, apply to uctl meta
- */
- if (sensor_ctrl->sensitivity != 0 && module_ctl->valid_sensor_ctrl == true) {
- sensitivity = sensor_ctrl->sensitivity;
+ if (sensor_peri->sensor_interface.cis_mode == ITF_CIS_SMIA_WDR) {
+ adj_again->long_val = applied_ae_setting->long_analog_gain;
+ adj_dgain->long_val = applied_ae_setting->long_digital_gain;
+ adj_again->short_val = applied_ae_setting->short_analog_gain;
+ adj_dgain->short_val = applied_ae_setting->short_digital_gain;
+ adj_again->middle_val = applied_ae_setting->middle_analog_gain;
+ adj_dgain->middle_val = applied_ae_setting->middle_digital_gain;
} else {
- if (sensor_uctrl->sensitivity != 0) {
- sensitivity = sensor_uctrl->sensitivity;
- } else {
- err("[SSDRV] Invalid sensitivity\n");
- ret = -1;
- goto p_err;
- }
+ adj_again->val = adj_again->short_val = applied_ae_setting->analog_gain;
+ adj_dgain->val = adj_dgain->short_val = applied_ae_setting->digital_gain;
+ adj_again->middle_val = 0;
+ adj_dgain->middle_val = 0;
}
- if (fimc_is_vender_wdr_mode_on(cis_data)) {
- long_again = applied_ae_setting->long_analog_gain;
- long_dgain = applied_ae_setting->long_digital_gain;
- short_again = applied_ae_setting->short_analog_gain;
- short_dgain = applied_ae_setting->short_digital_gain;
- } else {
- long_again = applied_ae_setting->analog_gain;
- long_dgain = applied_ae_setting->digital_gain;
- short_again = applied_ae_setting->analog_gain;
- short_dgain = applied_ae_setting->digital_gain;
- }
-
- adj_gain_setting->sensitivity = sensitivity;
- adj_gain_setting->long_again = long_again;
- adj_gain_setting->short_again = short_again;
- adj_gain_setting->long_dgain = long_dgain;
- adj_gain_setting->short_dgain = short_dgain;
+ fimc_is_sensor_ctl_compensate_expo_gain(device, applied_ae_setting, adj_again, adj_dgain);
p_err:
return ret;
}
-int fimc_is_sensor_ctl_set_gains(struct fimc_is_device_sensor *device,
- struct gain_setting *adj_gain_setting)
+static int fimc_is_sensor_ctl_set_gains(struct fimc_is_device_sensor *device,
+ struct ae_param adj_again,
+ struct ae_param adj_dgain)
{
int ret = 0;
FIMC_BUG(!device);
- FIMC_BUG(!adj_gain_setting);
+
+ if (adj_again.val == 0 || adj_dgain.val == 0) {
+ dbg_sensor(1, "[%s] Skip set gain (%d,%d)\n",
+ __func__, adj_again.val, adj_dgain.val);
+ return ret;
+ }
/* Set gain */
- ret = fimc_is_sensor_peri_s_analog_gain(device, adj_gain_setting->long_again, adj_gain_setting->short_again);
+ ret = fimc_is_sensor_peri_s_analog_gain(device, adj_again);
if (ret < 0) {
dbg_sensor(1, "[%s] SET analog gain fail\n", __func__);
goto p_err;
}
- ret = fimc_is_sensor_peri_s_digital_gain(device, adj_gain_setting->long_dgain, adj_gain_setting->short_dgain);
- if (ret < 0) {
+ ret = fimc_is_sensor_peri_s_digital_gain(device, adj_dgain);
+ if (ret < 0)
dbg_sensor(1, "[%s] SET digital gain fail\n", __func__);
- goto p_err;
- }
p_err:
return ret;
}
-int fimc_is_sensor_ctl_update_gains(struct fimc_is_device_sensor *device,
+static int fimc_is_sensor_ctl_update_gains(struct fimc_is_device_sensor *device,
+ struct fimc_is_sensor_ctl *module_ctl,
u32 *dm_index,
- struct gain_setting *adj_gain_setting)
+ struct ae_param adj_again,
+ struct ae_param adj_dgain)
{
int ret = 0;
struct fimc_is_module_enum *module = NULL;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- cis_shared_data *cis_data = NULL;
+ u32 sensitivity = 0;
+ camera2_sensor_ctl_t *sensor_ctrl = NULL;
+ camera2_sensor_uctl_t *sensor_uctrl = NULL;
FIMC_BUG(!device);
- FIMC_BUG(!dm_index);
- FIMC_BUG(!adj_gain_setting);
+ FIMC_BUG(!module_ctl);
module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(device->subdev_module);
if (unlikely(!module)) {
module = NULL;
goto p_err;
}
+
FIMC_BUG(!module);
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- cis_data = sensor_peri->cis.cis_data;
- FIMC_BUG(!cis_data);
+ sensor_ctrl = &module_ctl->cur_cam20_sensor_ctrl;
+ sensor_uctrl = &module_ctl->cur_cam20_sensor_udctrl;
+
+ /* detect manual sensor control or Auto mode
+ * if use manual control, apply sensitivity to ctl meta
+ * else, apply to uctl meta
+ */
+ if (sensor_ctrl->sensitivity != 0 && module_ctl->valid_sensor_ctrl == true) {
+ sensitivity = sensor_ctrl->sensitivity;
+ } else {
+ if (sensor_uctrl->sensitivity != 0)
+ sensitivity = sensor_uctrl->sensitivity;
+ else
+ err("[SSDRV] Invalid sensitivity\n");
+ }
+
+ if (adj_again.val != 0 && adj_dgain.val != 0 && sensitivity != 0) {
+ sensor_peri->cis.cur_sensor_uctrl.sensitivity = sensitivity;
+ sensor_peri->cis.expecting_sensor_dm[dm_index[0]].sensitivity = sensitivity;
+
+ sensor_peri->cis.cur_sensor_uctrl.analogGain = adj_again.short_val;
+ sensor_peri->cis.cur_sensor_uctrl.digitalGain = adj_dgain.short_val;
+ sensor_peri->cis.cur_sensor_uctrl.longAnalogGain = adj_again.long_val;
+ sensor_peri->cis.cur_sensor_uctrl.longDigitalGain = adj_dgain.long_val;
+ sensor_peri->cis.cur_sensor_uctrl.shortAnalogGain = adj_again.short_val;
+ sensor_peri->cis.cur_sensor_uctrl.shortDigitalGain = adj_dgain.short_val;
+ sensor_peri->cis.cur_sensor_uctrl.middleAnalogGain = adj_again.middle_val;
+ sensor_peri->cis.cur_sensor_uctrl.middleDigitalGain = adj_dgain.middle_val;
+
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].analogGain
+ = adj_again.short_val;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].digitalGain
+ = adj_dgain.short_val;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].longAnalogGain
+ = adj_again.long_val;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].longDigitalGain
+ = adj_dgain.long_val;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].shortAnalogGain
+ = adj_again.short_val;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].shortDigitalGain
+ = adj_dgain.short_val;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].middleAnalogGain
+ = adj_again.middle_val;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].middleDigitalGain
+ = adj_dgain.middle_val;
+ } else {
+ sensor_peri->cis.expecting_sensor_dm[dm_index[0]].sensitivity =
+ sensor_peri->cis.expecting_sensor_dm[dm_index[1]].sensitivity;
+
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].analogGain =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].analogGain;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].digitalGain =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].digitalGain;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].longAnalogGain =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].longAnalogGain;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].longDigitalGain =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].longDigitalGain;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].shortAnalogGain =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].shortAnalogGain;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].shortDigitalGain =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].shortDigitalGain;
+ }
+p_err:
+ return ret;
+}
+
+static int fimc_is_sensor_ctl_adjust_exposure(struct fimc_is_device_sensor *device,
+ struct fimc_is_sensor_ctl *module_ctl,
+ ae_setting *applied_ae_setting,
+ struct ae_param *expo)
+{
+ int ret = 0;
+ struct fimc_is_module_enum *module = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+ FIMC_BUG(!device);
+ FIMC_BUG(!module_ctl);
+ FIMC_BUG(!applied_ae_setting);
+ FIMC_BUG(!expo);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(device->subdev_module);
+ if (unlikely(!module)) {
+ err("%s, module in is NULL", __func__);
+ module = NULL;
+ goto p_err;
+ }
+ FIMC_BUG(!module);
- sensor_peri->cis.cur_sensor_uctrl.sensitivity = adj_gain_setting->sensitivity;
-
- if (adj_gain_setting->sensitivity != 0) {
- sensor_peri->cis.cur_sensor_uctrl.analogGain = adj_gain_setting->long_again;
- sensor_peri->cis.cur_sensor_uctrl.digitalGain = adj_gain_setting->long_dgain;
- sensor_peri->cis.cur_sensor_uctrl.longAnalogGain = adj_gain_setting->long_again;
- sensor_peri->cis.cur_sensor_uctrl.longDigitalGain = adj_gain_setting->long_dgain;
- sensor_peri->cis.cur_sensor_uctrl.shortAnalogGain = adj_gain_setting->short_again;
- sensor_peri->cis.cur_sensor_uctrl.shortDigitalGain = adj_gain_setting->short_dgain;
-
- /* HACK
- * as analogGain, digitalGain dm moved to udm
- * It sentents is commented temporary
- */
- sensor_peri->cis.expecting_sensor_dm[dm_index[0]].sensitivity = adj_gain_setting->sensitivity;
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+
+ if (sensor_peri->sensor_interface.cis_mode == ITF_CIS_SMIA_WDR) {
+ expo->long_val = applied_ae_setting->long_exposure;
+ expo->short_val = applied_ae_setting->short_exposure;
+ expo->middle_val = applied_ae_setting->middle_exposure;
} else {
- sensor_peri->cis.expecting_sensor_dm[dm_index[0]].sensitivity = sensor_peri->cis.expecting_sensor_dm[dm_index[1]].sensitivity;
+ expo->val = expo->short_val = applied_ae_setting->exposure;
+ expo->middle_val = 0;
}
p_err:
return ret;
}
-int fimc_is_sensor_ctl_set_exposure(struct fimc_is_device_sensor *device,
+static int fimc_is_sensor_ctl_set_exposure(struct fimc_is_device_sensor *device,
+ struct ae_param expo)
+{
+ int ret = 0;
+
+ FIMC_BUG(!device);
+
+ if (expo.val == 0) {
+ dbg_sensor(1, "[%s] Skip set expo (%d)\n",
+ __func__, expo);
+ return ret;
+ }
+
+ ret = fimc_is_sensor_peri_s_exposure_time(device, expo);
+ if (ret < 0)
+ err("[%s] SET exposure time fail\n", __func__);
+
+ return ret;
+}
+
+static int fimc_is_sensor_ctl_update_exposure(struct fimc_is_device_sensor *device,
u32 *dm_index,
- u32 long_exposure, u32 short_exposure)
+ struct ae_param expo)
{
int ret = 0;
struct fimc_is_module_enum *module = NULL;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- cis_shared_data *cis_data = NULL;
FIMC_BUG(!device);
FIMC_BUG(!dm_index);
FIMC_BUG(!module);
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- cis_data = sensor_peri->cis.cis_data;
- FIMC_BUG(!cis_data);
-
- if (long_exposure != 0 && short_exposure != 0) {
- ret = fimc_is_sensor_peri_s_exposure_time(device, long_exposure, short_exposure);
- if (ret < 0) {
- err("[%s] SET exposure time fail\n", __func__);
- }
-
- if (fimc_is_vender_wdr_mode_on(cis_data)) {
- sensor_peri->cis.cur_sensor_uctrl.exposureTime = 0;
- sensor_peri->cis.cur_sensor_uctrl.longExposureTime = fimc_is_sensor_convert_us_to_ns(long_exposure);
- sensor_peri->cis.cur_sensor_uctrl.shortExposureTime = fimc_is_sensor_convert_us_to_ns(short_exposure);
- } else {
- sensor_peri->cis.cur_sensor_uctrl.exposureTime = fimc_is_sensor_convert_us_to_ns(short_exposure);
- sensor_peri->cis.cur_sensor_uctrl.longExposureTime = 0;
- sensor_peri->cis.cur_sensor_uctrl.shortExposureTime = 0;
- }
- sensor_peri->cis.expecting_sensor_dm[dm_index[0]].exposureTime = fimc_is_sensor_convert_us_to_ns(short_exposure);
+ if (expo.long_val != 0 && expo.short_val != 0) {
+ sensor_peri->cis.cur_sensor_uctrl.exposureTime = fimc_is_sensor_convert_us_to_ns(expo.short_val);
+ sensor_peri->cis.cur_sensor_uctrl.longExposureTime = fimc_is_sensor_convert_us_to_ns(expo.long_val);
+ sensor_peri->cis.cur_sensor_uctrl.shortExposureTime = fimc_is_sensor_convert_us_to_ns(expo.short_val);
+ sensor_peri->cis.cur_sensor_uctrl.middleExposureTime = fimc_is_sensor_convert_us_to_ns(expo.middle_val);
+
+ sensor_peri->cis.expecting_sensor_dm[dm_index[0]].exposureTime =
+ sensor_peri->cis.cur_sensor_uctrl.exposureTime;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].longExposureTime =
+ sensor_peri->cis.cur_sensor_uctrl.longExposureTime;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].shortExposureTime =
+ sensor_peri->cis.cur_sensor_uctrl.shortExposureTime;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].middleExposureTime =
+ sensor_peri->cis.cur_sensor_uctrl.middleExposureTime;
} else {
sensor_peri->cis.expecting_sensor_dm[dm_index[0]].exposureTime = sensor_peri->cis.expecting_sensor_dm[dm_index[1]].exposureTime;
+
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].longExposureTime =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].longExposureTime;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].shortExposureTime =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].shortExposureTime;
+ sensor_peri->cis.expecting_sensor_udm[dm_index[0]].middleExposureTime =
+ sensor_peri->cis.expecting_sensor_udm[dm_index[1]].middleExposureTime;
}
p_err:
u32 dm_index[2];
ae_setting applied_ae_setting;
u32 frame_duration = 0;
- struct gain_setting adj_gain_setting;
- u32 long_exposure = 0, short_exposure = 0;
-
+ struct ae_param expo, adj_again, adj_dgain;
struct fimc_is_module_enum *module = NULL;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
struct fimc_is_sensor_ctl *module_ctl = NULL;
cis_data = sensor_peri->cis.cis_data;
FIMC_BUG_VOID(!cis_data);
- if (sensor_peri->subdev_aperture && sensor_peri->aperture->step == APERTURE_STEP_PREPARE) {
- sensor_peri->aperture->step = APERTURE_STEP_MOVING;
- schedule_work(&sensor_peri->aperture->aperture_set_work);
+ if (sensor_peri->mcu && sensor_peri->mcu->aperture) {
+ if (sensor_peri->mcu->aperture->step == APERTURE_STEP_PREPARE) {
+ sensor_peri->mcu->aperture->step = APERTURE_STEP_MOVING;
+ schedule_work(&sensor_peri->mcu->aperture->aperture_set_work);
+ }
}
if ((module_ctl->valid_sensor_ctrl == true) ||
+ (module_ctl->force_update) ||
(module_ctl->sensor_frame_number == applied_frame_number && module_ctl->alg_reset_flag == true)) {
sensor_ctrl = &module_ctl->cur_cam20_sensor_ctrl;
sensor_uctrl = &module_ctl->cur_cam20_sensor_udctrl;
memset(&applied_ae_setting, 0, sizeof(ae_setting));
fimc_is_sensor_ctl_adjust_ae_setting(device, &applied_ae_setting, cis_data);
- /* set frame rate : Limit of max frame duration */
+ /* 1. set frame rate : Limit of max frame duration */
if (sensor_ctrl->frameDuration != 0 && module_ctl->valid_sensor_ctrl == true)
frame_duration = fimc_is_sensor_convert_ns_to_us(sensor_ctrl->frameDuration);
else
err("[%s] frame number(%d) set frame duration fail\n", __func__, applied_frame_number);
}
- /* Set exposureTime */
- /* TODO: WDR mode */
- if (sensor_ctrl->exposureTime != 0 && module_ctl->valid_sensor_ctrl == true) {
- long_exposure = fimc_is_sensor_convert_ns_to_us(sensor_ctrl->exposureTime);
- short_exposure = fimc_is_sensor_convert_ns_to_us(sensor_ctrl->exposureTime);
- } else {
- if (fimc_is_vender_wdr_mode_on(cis_data)) {
- long_exposure = applied_ae_setting.long_exposure;
- short_exposure = applied_ae_setting.short_exposure;
- } else {
- long_exposure = applied_ae_setting.exposure;
- short_exposure = applied_ae_setting.exposure;
- }
- }
+ /* 2. set exposureTime */
+ ret = fimc_is_sensor_ctl_adjust_exposure(device, module_ctl, &applied_ae_setting, &expo);
+ if (ret < 0)
+ err("[%s] frame number(%d) adjust exposure fail\n", __func__, applied_frame_number);
- /* set dynamic duration */
+ /* 3. set dynamic duration */
ctrl.id = V4L2_CID_SENSOR_ADJUST_FRAME_DURATION;
ctrl.value = 0;
- ret = fimc_is_sensor_peri_adj_ctrl(device, MAX(long_exposure, short_exposure), &ctrl);
- if (ret < 0) {
+ ret = fimc_is_sensor_peri_adj_ctrl(device, expo.long_val, &ctrl);
+ if (ret < 0)
err("err!!! ret(%d)", ret);
- }
sensor_uctrl->dynamicFrameDuration = fimc_is_sensor_convert_us_to_ns(ctrl.value);
err("[%s] frame number(%d) set frame duration fail\n", __func__, applied_frame_number);
}
- ret = fimc_is_sensor_ctl_set_exposure(device, dm_index, long_exposure, short_exposure);
- if (ret < 0) {
+ /* 4. update exposureTime */
+ ret = fimc_is_sensor_ctl_set_exposure(device, expo);
+ if (ret < 0)
err("[%s] frame number(%d) set exposure fail\n", __func__, applied_frame_number);
- }
+ ret = fimc_is_sensor_ctl_update_exposure(device, dm_index, expo);
+ if (ret < 0)
+ err("[%s] frame number(%d) update exposure fail\n", __func__, applied_frame_number);
- ret = fimc_is_sensor_ctl_adjust_gains(device, module_ctl, &applied_ae_setting, &adj_gain_setting);
+ /* 5. set analog & digital gains */
+ ret = fimc_is_sensor_ctl_adjust_gains(device, &applied_ae_setting, &adj_again, &adj_dgain);
if (ret < 0) {
err("[%s] frame number(%d) adjust gains fail\n", __func__, applied_frame_number);
goto p_err;
}
- fimc_is_sensor_ctl_compensate_expo_gain(device, &adj_gain_setting, &applied_ae_setting, cis_data);
+ ret = fimc_is_sensor_ctl_set_gains(device, adj_again, adj_dgain);
+ if (ret < 0)
+ err("[%s] frame number(%d) set gains fail\n", __func__, applied_frame_number);
- /* Set analog and digital gains */
- if (adj_gain_setting.long_again != 0 && adj_gain_setting.long_dgain != 0) {
- ret = fimc_is_sensor_ctl_set_gains(device, &adj_gain_setting);
- } else {
- dbg_sensor(1, "[%s] Skip to set gain (%d,%d)\n",
- __func__, adj_gain_setting.long_again, adj_gain_setting.long_dgain);
- }
+ ret = fimc_is_sensor_ctl_update_gains(device, module_ctl, dm_index, adj_again, adj_dgain);
+ if (ret < 0)
+ err("[%s] frame number(%d) update gains fail\n", __func__, applied_frame_number);
- if (ret < 0) {
- err("[%s] frame number(%d) set gains fail\n", __func__, applied_frame_number);
+ if (module_ctl->update_wb_gains) {
+ ret = fimc_is_sensor_peri_s_wb_gains(device, module_ctl->wb_gains);
+ if (ret < 0)
+ err("[%s] frame number(%d) set exposure fail\n", __func__, applied_frame_number);
+
+ module_ctl->update_wb_gains = false;
}
- ret = fimc_is_sensor_ctl_update_gains(device, dm_index, &adj_gain_setting);
- if (ret < 0) {
- err("[%s] frame number(%d) update gains fail\n", __func__, applied_frame_number);
+ if (module_ctl->update_3hdr_stat || module_ctl->update_roi) {
+ ret = fimc_is_sensor_peri_s_sensor_stats(device, true, module_ctl, NULL);
+ if (ret < 0)
+ err("[%s] frame number(%d) set exposure fail\n", __func__, applied_frame_number);
+
+ module_ctl->update_roi = false;
+ module_ctl->update_3hdr_stat = false;
}
+
+ module_ctl->force_update = false;
} else {
if (module_ctl->alg_reset_flag == false) {
dbg_sensor(1, "[%s] frame number(%d) alg_reset_flag (%d)\n", __func__,
}
}
- if (sensor_peri->subdev_flash != NULL) {
+ if (sensor_peri->subdev_flash != NULL && module_ctl->valid_flash_udctrl) {
/* Pre-Flash on, Torch on/off */
- ret = fimc_is_sensor_peri_pre_flash_fire(device->subdev_module, &vsync_count);
+ ret = fimc_is_sensor_peri_pre_flash_fire(device->subdev_module, &applied_frame_number);
+ }
+
+ if (sensor_peri->ois) {
+ ret = CALL_OISOPS(sensor_peri->ois, ois_set_mode, sensor_peri->subdev_ois, sensor_peri->ois->ois_mode);
+ if (ret < 0) {
+ err("[SEN:%d] v4l2_subdev_call(ois_mode_change, mode:%d) is fail(%d)",
+ module->sensor_id, sensor_peri->ois->ois_mode, ret);
+ goto p_err;
+ }
}
/* Warning! Aperture mode should be set before setting ois mode */
- if (!sensor_peri->subdev_aperture || (sensor_peri->aperture->step == APERTURE_STEP_STATIONARY)) {
- if (sensor_peri->subdev_ois) {
- ret = CALL_OISOPS(sensor_peri->ois, ois_set_mode, sensor_peri->subdev_ois, sensor_peri->ois->ois_mode);
- if (ret < 0) {
- err("[SEN:%d] v4l2_subdev_call(ois_mode_change, mode:%d) is fail(%d)",
- module->sensor_id, sensor_peri->ois->ois_mode, ret);
- goto p_err;
- }
-
- ret = CALL_OISOPS(sensor_peri->ois, ois_set_coef, sensor_peri->subdev_ois, sensor_peri->ois->coef);
- if (ret < 0) {
- err("[SEN:%d] v4l2_subdev_call(ois_set_coef, coef:%d) is fail(%d)",
- module->sensor_id, sensor_peri->ois->coef, ret);
- goto p_err;
- }
+ if (sensor_peri->mcu && sensor_peri->mcu->ois) {
+ ret = CALL_OISOPS(sensor_peri->mcu->ois, ois_set_mode, sensor_peri->subdev_mcu, sensor_peri->mcu->ois->ois_mode);
+ if (ret < 0) {
+ err("[SEN:%d] v4l2_subdev_call(ois_mode_change, mode:%d) is fail(%d)",
+ module->sensor_id, sensor_peri->mcu->ois->ois_mode, ret);
+ goto p_err;
+ }
+
+ ret = CALL_OISOPS(sensor_peri->mcu->ois, ois_set_coef, sensor_peri->subdev_mcu, sensor_peri->mcu->ois->coef);
+ if (ret < 0) {
+ err("[SEN:%d] v4l2_subdev_call(ois_set_coef, coef:%d) is fail(%d)",
+ module->sensor_id, sensor_peri->mcu->ois->coef, ret);
+ goto p_err;
}
}
#include <linux/workqueue.h>
+#include "fimc-is-interface-sensor.h"
+
#define NUM_OF_FRAME_30FPS (1)
#define NUM_OF_FRAME_60FPS (2)
#define NUM_OF_FRAME_120FPS (4)
#define CAM2P0_UCTL_LIST_SIZE (NUM_OF_FRAME_480FPS + 1) /* This value must be larger than NUM_OF_FRAME */
#define EXPECT_DM_NUM (CAM2P0_UCTL_LIST_SIZE)
-struct gain_setting {
- u32 sensitivity;
- u32 long_again;
- u32 short_again;
- u32 long_dgain;
- u32 short_dgain;
-};
-
/* Helper function */
u64 fimc_is_sensor_convert_us_to_ns(u32 usec);
u32 fimc_is_sensor_convert_ns_to_us(u64 nsec);
+u32 fimc_is_sensor_calculate_tgain(u32 dgain, u32 again);
struct fimc_is_device_sensor;
void fimc_is_sensor_ctl_frame_evt(struct fimc_is_device_sensor *device);
int fimc_is_sensor_ctl_adjust_sync(struct fimc_is_device_sensor *device, u32 adjust_sync);
int fimc_is_sensor_ctl_low_noise_mode(struct fimc_is_device_sensor *device, u32 mode);
+void fimc_is_sensor_ctl_update_exposure_to_uctl(camera2_sensor_uctl_t *sensor_uctl,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure);
+void fimc_is_sensor_ctl_update_gain_to_uctl(camera2_sensor_uctl_t *sensor_uctl,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain, u32 *digital_gain);
+
/* Actuator funtion */
int fimc_is_actuator_ctl_set_position(struct fimc_is_device_sensor *device, u32 position);
int fimc_is_actuator_ctl_convert_position(u32 *pos,
return sensor_peri;
}
+struct fimc_is_device_sensor_peri *find_peri_by_eeprom_id(struct fimc_is_device_sensor *device,
+ u32 eeprom)
+{
+ u32 mindex = 0, mmax = 0;
+ struct fimc_is_module_enum *module_enum = NULL;
+ struct fimc_is_resourcemgr *resourcemgr = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+ FIMC_BUG_NULL(!device);
+ resourcemgr = device->resourcemgr;
+ module_enum = device->module_enum;
+ FIMC_BUG_NULL(!module_enum);
+
+ if (unlikely(resourcemgr == NULL))
+ return NULL;
+
+ mmax = atomic_read(&device->module_count);
+ for (mindex = 0; mindex < mmax; mindex++) {
+ if (module_enum[mindex].ext.eeprom_con.product_name == eeprom) {
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module_enum[mindex].private_data;
+ break;
+ }
+ }
+
+ if (mindex >= mmax) {
+ merr("eeprom(%d) is not found", device, eeprom);
+ }
+
+ return sensor_peri;
+}
+
static void fimc_is_sensor_init_expecting_dm(struct fimc_is_device_sensor *device,
struct fimc_is_cis *cis)
{
int i = 0;
u32 m_fcount;
u32 sensitivity;
- u64 exposureTime;
+ u64 exposureTime, long_exposure, short_exposure;
+ u32 long_dgain, long_again, short_dgain, short_again;
struct fimc_is_sensor_ctl *module_ctl;
camera2_sensor_ctl_t *sensor_ctrl = NULL;
camera2_sensor_uctl_t *sensor_uctrl = NULL;
sensitivity = sensor_uctrl->sensitivity;
exposureTime = sensor_uctrl->exposureTime;
+ long_exposure = sensor_uctrl->longExposureTime;
+ short_exposure = sensor_uctrl->shortExposureTime;
+ long_dgain = sensor_uctrl->longDigitalGain;
+ long_again = sensor_uctrl->longAnalogGain;
+ short_dgain = sensor_uctrl->shortDigitalGain;
+ short_again = sensor_uctrl->shortAnalogGain;
if (module_ctl->valid_sensor_ctrl == true) {
if (sensor_ctrl->sensitivity)
for (i = m_fcount + 2; i < m_fcount + EXPECT_DM_NUM; i++) {
cis->expecting_sensor_dm[i % EXPECT_DM_NUM].sensitivity = sensitivity;
cis->expecting_sensor_dm[i % EXPECT_DM_NUM].exposureTime = exposureTime;
+
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].longExposureTime = long_exposure;
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].shortExposureTime = short_exposure;
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].digitalGain = long_dgain;
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].analogGain = long_dgain;
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].longDigitalGain = long_dgain;
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].longAnalogGain = long_dgain;
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].shortDigitalGain = short_dgain;
+ cis->expecting_sensor_udm[i % EXPECT_DM_NUM].shortAnalogGain = short_again;
}
p_err:
}
void fimc_is_sensor_set_cis_uctrl_list(struct fimc_is_device_sensor_peri *sensor_peri,
- u32 long_exp, u32 short_exp,
- u32 long_total_gain, u32 short_total_gain,
- u32 long_analog_gain, u32 short_analog_gain,
- u32 long_digital_gain, u32 short_digital_gain)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
+ u32 *total_gain,
+ u32 *analog_gain,
+ u32 *digital_gain)
{
int i = 0;
camera2_sensor_uctl_t *sensor_uctl;
FIMC_BUG_VOID(!sensor_peri);
+ FIMC_BUG_VOID(!exposure);
+ FIMC_BUG_VOID(!total_gain);
+ FIMC_BUG_VOID(!analog_gain);
+ FIMC_BUG_VOID(!digital_gain);
for (i = 0; i < CAM2P0_UCTL_LIST_SIZE; i++) {
- sensor_uctl = &sensor_peri->cis.sensor_ctls[i].cur_cam20_sensor_udctrl;
-
- if (fimc_is_vender_wdr_mode_on(sensor_peri->cis.cis_data)) {
- sensor_uctl->exposureTime = 0;
- sensor_uctl->longExposureTime = fimc_is_sensor_convert_us_to_ns(long_exp);
- sensor_uctl->shortExposureTime = fimc_is_sensor_convert_us_to_ns(short_exp);
+ if (sensor_peri->cis.sensor_ctls[i].force_update) {
+ dbg_sensor(1, "skip uctl_list set, sensor_ctl[%d]->force_update\n", i);
+ continue;
+ }
- sensor_uctl->sensitivity = long_total_gain;
- sensor_uctl->analogGain = 0;
- sensor_uctl->digitalGain = 0;
+ sensor_uctl = &sensor_peri->cis.sensor_ctls[i].cur_cam20_sensor_udctrl;
- sensor_uctl->longAnalogGain = long_analog_gain;
- sensor_uctl->shortAnalogGain = short_analog_gain;
- sensor_uctl->longDigitalGain = long_digital_gain;
- sensor_uctl->shortDigitalGain = short_digital_gain;
- } else {
- sensor_uctl->exposureTime = fimc_is_sensor_convert_us_to_ns(long_exp);
- sensor_uctl->longExposureTime = 0;
- sensor_uctl->shortExposureTime = 0;
-
- sensor_uctl->sensitivity = long_total_gain;
- sensor_uctl->analogGain = long_analog_gain;
- sensor_uctl->digitalGain = long_digital_gain;
-
- sensor_uctl->longAnalogGain = 0;
- sensor_uctl->shortAnalogGain = 0;
- sensor_uctl->longDigitalGain = 0;
- sensor_uctl->shortDigitalGain = 0;
- }
+ fimc_is_sensor_ctl_update_exposure_to_uctl(sensor_uctl, num_data, exposure);
+ fimc_is_sensor_ctl_update_gain_to_uctl(sensor_uctl, num_data, analog_gain, digital_gain);
}
}
return ret;
}
- sensor_peri->sensor_work_index = 0;
+ kthread_init_work(&sensor_peri->sensor_work, fimc_is_sensor_sensor_work_fn);
}
return ret;
err("kthread_stop fail");
sensor_peri->sensor_task = NULL;
+ sensor_peri->use_sensor_work = false;
info("%s:\n", __func__);
}
}
/* Always first applyed to mode change when camera on */
sensor_peri->mode_change_first = true;
+ kthread_init_work(&sensor_peri->cis_global_work, fimc_is_sensor_global_setting_work_fn);
+ kthread_init_worker(&sensor_peri->cis_global_worker);
+ sensor_peri->cis_global_task = kthread_run(kthread_worker_fn,
+ &sensor_peri->cis_global_worker,
+ "fimc_is_sensor_global_setting");
+ if (IS_ERR(sensor_peri->cis_global_task)) {
+ err("failed to create kthread for global setting, err(%ld)",
+ PTR_ERR(sensor_peri->cis_global_task));
+ ret = PTR_ERR(sensor_peri->cis_global_task);
+ sensor_peri->cis_global_task = NULL;
+ return ret;
+ }
+
kthread_init_work(&sensor_peri->mode_change_work, fimc_is_sensor_mode_change_work_fn);
kthread_init_worker(&sensor_peri->mode_change_worker);
sensor_peri->mode_change_task = kthread_run(kthread_worker_fn,
PTR_ERR(sensor_peri->mode_change_task));
ret = PTR_ERR(sensor_peri->mode_change_task);
sensor_peri->mode_change_task = NULL;
+
+ if (kthread_stop(sensor_peri->cis_global_task))
+ err("kthread_stop fail");
+
+ sensor_peri->cis_global_task = NULL;
+
return ret;
}
sensor_peri->mode_change_task = NULL;
info("%s:\n", __func__);
}
+
+ if (sensor_peri->cis_global_task != NULL) {
+ if (kthread_stop(sensor_peri->cis_global_task))
+ err("kthread_stop fail");
+
+ sensor_peri->cis_global_task = NULL;
+ info("%s:\n", __func__);
+ }
}
int fimc_is_sensor_initial_setting_low_exposure(struct fimc_is_device_sensor_peri *sensor_peri)
{
int ret = 0;
struct fimc_is_device_sensor *device;
-
+ struct ae_param expo, again, dgain;
+ u32 tgain[EXPOSURE_GAIN_MAX] = {1000, 1000, 1000};
FIMC_BUG(!sensor_peri);
device = v4l2_get_subdev_hostdata(sensor_peri->subdev_cis);
dbg_sensor(1, "[%s] expo(%d), again(%d), dgain(%d)\n", __func__,
sensor_peri->cis.cis_data->low_expo_start, 100, 100);
- fimc_is_sensor_peri_s_analog_gain(device, 1000, 1000);
- fimc_is_sensor_peri_s_digital_gain(device, 1000, 1000);
- fimc_is_sensor_peri_s_exposure_time(device,
- sensor_peri->cis.cis_data->low_expo_start,
- sensor_peri->cis.cis_data->low_expo_start);
+ again.long_val = again.short_val = again.middle_val = 1000;
+ dgain.long_val = dgain.short_val = dgain.middle_val = 1000;
+ expo.long_val = expo.short_val = expo.middle_val =
+ sensor_peri->cis.cis_data->low_expo_start;
+
+ fimc_is_sensor_peri_s_analog_gain(device, again);
+ fimc_is_sensor_peri_s_digital_gain(device, dgain);
+ fimc_is_sensor_peri_s_exposure_time(device, expo);
#if !defined(DISABLE_LIB)
sensor_peri->sensor_interface.cis_itf_ops.request_reset_expo_gain(&sensor_peri->sensor_interface,
- sensor_peri->cis.cis_data->low_expo_start,
- 1000,
- 1000,
- 1000,
- sensor_peri->cis.cis_data->low_expo_start,
- 1000,
- 1000,
- 1000);
+ EXPOSURE_GAIN_COUNT_3,
+ &expo.long_val,
+ tgain,
+ &again.long_val,
+ &dgain.long_val);
#endif
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- sensor_peri->cis.cis_data->low_expo_start,
- sensor_peri->cis.cis_data->low_expo_start,
- 1000, 1000,
- 1000, 1000,
- 1000, 1000);
return ret;
}
-void fimc_is_sensor_mode_change_work_fn(struct kthread_work *work)
+void fimc_is_sensor_global_setting_work_fn(struct kthread_work *work)
{
struct fimc_is_device_sensor_peri *sensor_peri;
struct fimc_is_cis *cis;
TIME_LAUNCH_STR(LAUNCH_SENSOR_INIT);
+ sensor_peri = container_of(work, struct fimc_is_device_sensor_peri, cis_global_work);
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(sensor_peri->subdev_cis);
+
+ CALL_CISOPS(cis, cis_set_global_setting, cis->subdev);
+}
+
+void fimc_is_sensor_mode_change_work_fn(struct kthread_work *work)
+{
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ struct fimc_is_cis *cis;
+
sensor_peri = container_of(work, struct fimc_is_device_sensor_peri, mode_change_work);
cis = (struct fimc_is_cis *)v4l2_get_subdevdata(sensor_peri->subdev_cis);
- /* cis global setting is only set to first mode change time */
- if (sensor_peri->mode_change_first == true) {
- CALL_CISOPS(cis, cis_set_global_setting, cis->subdev);
- }
+ /* wait global setting thread end */
+ kthread_flush_work(&sensor_peri->cis_global_work);
CALL_CISOPS(cis, cis_mode_change, cis->subdev, cis->cis_data->sens_config_index_cur);
void fimc_is_sensor_setting_mode_change(struct fimc_is_device_sensor_peri *sensor_peri)
{
struct fimc_is_device_sensor *device;
- u32 expo = 0;
- u32 tgain = 0;
- u32 again = 0;
- u32 dgain = 0;
- u32 long_expo = 0;
- u32 long_tgain = 0;
- u32 long_again = 0;
- u32 long_dgain = 0;
+ struct ae_param expo;
+ struct ae_param again;
+ struct ae_param dgain;
+ u32 tgain[EXPOSURE_GAIN_MAX] = {0, 0, 0};
+ enum fimc_is_exposure_gain_count num_data;
u32 frame_duration = 0;
FIMC_BUG_VOID(!sensor_peri);
device = v4l2_get_subdev_hostdata(sensor_peri->subdev_cis);
FIMC_BUG_VOID(!device);
- expo = sensor_peri->cis.mode_chg_expo;
- again = sensor_peri->cis.mode_chg_again;
- dgain = sensor_peri->cis.mode_chg_dgain;
- long_expo = sensor_peri->cis.mode_chg_long_expo;
- long_again = sensor_peri->cis.mode_chg_long_again;
- long_dgain = sensor_peri->cis.mode_chg_long_dgain;
+ num_data = sensor_peri->cis.exp_gain_cnt;
+ switch (num_data) {
+ case EXPOSURE_GAIN_COUNT_1:
+ expo.val = expo.short_val = sensor_peri->cis.mode_chg.exposure;
+ again.val = again.short_val = sensor_peri->cis.mode_chg.analog_gain;
+ dgain.val = dgain.short_val = sensor_peri->cis.mode_chg.digital_gain;
+
+ if (expo.val == 0 || again.val < 1000 || dgain.val < 1000) {
+ err("[%s] invalid mode change settings exp(%d), again(%d), dgain(%d)\n",
+ __func__, expo.val, again.val, dgain.val);
+ expo.val = sensor_peri->cis.cis_data->low_expo_start;
+ again.val = 1000;
+ dgain.val = 1000;
+ }
- dbg_sensor(1, "[%s] expo(%d), again(%d), dgain(%d)\n", __func__,
- expo, again, dgain);
+ tgain[EXPOSURE_GAIN_LONG] = fimc_is_sensor_calculate_tgain(dgain.val, again.val);
+ break;
+ case EXPOSURE_GAIN_COUNT_2:
+ expo.long_val = sensor_peri->cis.mode_chg.long_exposure;
+ again.long_val = sensor_peri->cis.mode_chg.long_analog_gain;
+ dgain.long_val = sensor_peri->cis.mode_chg.long_digital_gain;
+ expo.short_val = sensor_peri->cis.mode_chg.short_exposure;
+ again.short_val = sensor_peri->cis.mode_chg.short_analog_gain;
+ dgain.short_val = sensor_peri->cis.mode_chg.short_digital_gain;
+
+ if (expo.long_val == 0 || again.long_val < 1000 || dgain.long_val < 1000
+ || expo.short_val == 0 || again.short_val < 1000 || dgain.short_val < 1000) {
+ err("[%s] invalid mode change settings exp(%d %d), again(%d %d), dgain(%d %d)\n",
+ __func__, expo.long_val, expo.short_val,
+ again.long_val, again.short_val, dgain.long_val, dgain.short_val);
+ expo.long_val = expo.short_val = sensor_peri->cis.cis_data->low_expo_start;
+ again.long_val = again.short_val = 1000;
+ dgain.long_val = dgain.short_val = 1000;
+ }
+ tgain[EXPOSURE_GAIN_LONG] = fimc_is_sensor_calculate_tgain(dgain.long_val, again.long_val);
+ tgain[EXPOSURE_GAIN_SHORT] = fimc_is_sensor_calculate_tgain(dgain.short_val, again.short_val);
+ break;
+ case EXPOSURE_GAIN_COUNT_3:
+ expo.long_val = sensor_peri->cis.mode_chg.long_exposure;
+ again.long_val = sensor_peri->cis.mode_chg.long_analog_gain;
+ dgain.long_val = sensor_peri->cis.mode_chg.long_digital_gain;
+ expo.short_val = sensor_peri->cis.mode_chg.short_exposure;
+ again.short_val = sensor_peri->cis.mode_chg.short_analog_gain;
+ dgain.short_val = sensor_peri->cis.mode_chg.short_digital_gain;
+ expo.middle_val = sensor_peri->cis.mode_chg.middle_exposure;
+ again.middle_val = sensor_peri->cis.mode_chg.middle_analog_gain;
+ dgain.middle_val = sensor_peri->cis.mode_chg.middle_digital_gain;
+
+ if (expo.long_val == 0 || again.long_val < 1000 || dgain.long_val < 1000
+ || expo.short_val == 0 || again.short_val < 1000 || dgain.short_val < 1000
+ || expo.middle_val == 0 || again.middle_val < 1000 || dgain.middle_val < 1000) {
+ err("[%s] invalid mode change settings exp(%d %d %d), again(%d %d %d), dgain(%d %d %d)\n",
+ __func__, expo.long_val, expo.short_val,
+ again.long_val, again.short_val, dgain.long_val, dgain.short_val);
+ expo.long_val = expo.short_val = expo.middle_val = sensor_peri->cis.cis_data->low_expo_start;
+ again.long_val = again.short_val = again.middle_val = 1000;
+ dgain.long_val = dgain.short_val = again.middle_val = 1000;
+ }
- if (expo == 0 || again < 1000 || dgain < 1000 || long_expo == 0 || long_again < 1000 || long_dgain < 1000) {
- err("[%s] invalid mode change sensor settings exp(%d), gain(%d, %d) long_exp(%d), long_gain(%d, %d)\n",
- __func__, expo, again, dgain, long_expo, long_again, long_dgain);
- expo = sensor_peri->cis.cis_data->low_expo_start;
- again = 1000;
- dgain = 1000;
- long_expo = sensor_peri->cis.cis_data->low_expo_start;
- long_again = 1000;
- long_dgain = 1000;
+ tgain[EXPOSURE_GAIN_LONG] = fimc_is_sensor_calculate_tgain(dgain.long_val, again.long_val);
+ tgain[EXPOSURE_GAIN_SHORT] = fimc_is_sensor_calculate_tgain(dgain.short_val, again.short_val);
+ tgain[EXPOSURE_GAIN_MIDDLE] = fimc_is_sensor_calculate_tgain(dgain.middle_val, again.middle_val);
+ break;
+ default:
+ err("[%s] invalid exp_gain_count(%d)\n", __func__, num_data);
}
- if (dgain > 1000)
- tgain = dgain * (again / 1000);
- else
- tgain = again;
-
- if (long_dgain > 1000)
- long_tgain = long_dgain * (long_again / 1000);
- else
- long_tgain = long_again;
-
- CALL_CISOPS(&sensor_peri->cis, cis_adjust_frame_duration, sensor_peri->subdev_cis, MAX(long_expo, expo),
- &frame_duration);
+ CALL_CISOPS(&sensor_peri->cis, cis_adjust_frame_duration, sensor_peri->subdev_cis,
+ expo.long_val, &frame_duration);
fimc_is_sensor_peri_s_frame_duration(device, frame_duration);
- fimc_is_sensor_peri_s_analog_gain(device, long_again, again);
- fimc_is_sensor_peri_s_digital_gain(device, long_dgain, dgain);
- fimc_is_sensor_peri_s_exposure_time(device, long_expo, expo);
+ fimc_is_sensor_peri_s_analog_gain(device, again);
+ fimc_is_sensor_peri_s_digital_gain(device, dgain);
+ fimc_is_sensor_peri_s_exposure_time(device, expo);
+
+ fimc_is_sensor_peri_s_wb_gains(device, sensor_peri->cis.mode_chg_wb_gains);
+ fimc_is_sensor_peri_s_sensor_stats(device, false, NULL, sensor_peri->cis.sensor_stats);
sensor_peri->sensor_interface.cis_itf_ops.request_reset_expo_gain(&sensor_peri->sensor_interface,
- long_expo,
- long_tgain,
- long_again,
- long_dgain,
- expo,
+ num_data,
+ &expo.long_val,
tgain,
- again,
- dgain);
-
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- long_expo, expo,
- long_tgain, tgain,
- long_again, again,
- long_dgain, dgain);
+ &again.long_val,
+ &dgain.long_val);
+}
+
+void fimc_is_sensor_pre_flash_fire_work(struct work_struct *data)
+{
+ int ret = 0;
+ struct fimc_is_flash *flash = NULL;
+ struct fimc_is_flash_data *flash_data;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+ FIMC_BUG_VOID(!data);
+
+ flash_data = container_of(data, struct fimc_is_flash_data, pre_flash_work);
+ FIMC_BUG_VOID(!flash_data);
+
+ flash = container_of(flash_data, struct fimc_is_flash, flash_data);
+ FIMC_BUG_VOID(!flash);
+
+ sensor_peri = flash->sensor_peri;
+ FIMC_BUG_VOID(!sensor_peri);
+
+ ret = fimc_is_sensor_flash_fire(sensor_peri, flash->flash_data.intensity);
}
void fimc_is_sensor_flash_fire_work(struct work_struct *data)
{
int ret = 0;
+ u32 frame_duration = 0;
struct fimc_is_flash *flash;
struct fimc_is_flash_data *flash_data;
struct fimc_is_device_sensor *device;
struct fimc_is_device_sensor_peri *sensor_peri;
struct v4l2_subdev *subdev_flash;
+ struct ae_param expo, dgain, again;
+ u32 tgain[EXPOSURE_GAIN_MAX];
u32 step = 0;
-
FIMC_BUG_VOID(!data);
flash_data = container_of(data, struct fimc_is_flash_data, flash_fire_work);
step = flash->flash_ae.main_fls_strm_on_off_step;
if (sensor_peri->sensor_interface.cis_mode == ITF_CIS_SMIA) {
- fimc_is_sensor_peri_s_analog_gain(device, flash->flash_ae.again[step], flash->flash_ae.again[step]);
- fimc_is_sensor_peri_s_digital_gain(device, flash->flash_ae.dgain[step], flash->flash_ae.dgain[step]);
- fimc_is_sensor_peri_s_exposure_time(device, flash->flash_ae.expo[step], flash->flash_ae.expo[step]);
+ expo.val = expo.short_val = expo.middle_val = flash->flash_ae.expo[step];
+ again.val = again.short_val = again.middle_val = flash->flash_ae.again[step];
+ dgain.val = dgain.short_val = dgain.middle_val = flash->flash_ae.dgain[step];
+ tgain[0] = tgain[1] = tgain[2] = flash->flash_ae.tgain[step];
+
+ CALL_CISOPS(&sensor_peri->cis, cis_adjust_frame_duration, sensor_peri->subdev_cis,
+ flash->flash_ae.expo[step], &frame_duration);
+ fimc_is_sensor_peri_s_frame_duration(device, frame_duration);
+
+ fimc_is_sensor_peri_s_analog_gain(device, again);
+ fimc_is_sensor_peri_s_digital_gain(device, dgain);
+ fimc_is_sensor_peri_s_exposure_time(device, expo);
sensor_peri->sensor_interface.cis_itf_ops.request_reset_expo_gain(&sensor_peri->sensor_interface,
- flash->flash_ae.expo[step],
- flash->flash_ae.tgain[step],
- flash->flash_ae.again[step],
- flash->flash_ae.dgain[step],
- flash->flash_ae.expo[step],
- flash->flash_ae.tgain[step],
- flash->flash_ae.again[step],
- flash->flash_ae.dgain[step]);
-
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- flash->flash_ae.expo[step], flash->flash_ae.expo[step],
- flash->flash_ae.tgain[step], flash->flash_ae.tgain[step],
- flash->flash_ae.again[step], flash->flash_ae.again[step],
- flash->flash_ae.dgain[step], flash->flash_ae.dgain[step]);
+ EXPOSURE_GAIN_COUNT_3,
+ &expo.val,
+ tgain,
+ &again.val,
+ &dgain.val);
} else {
- fimc_is_sensor_peri_s_analog_gain(device, flash->flash_ae.long_again[step], flash->flash_ae.short_again[step]);
- fimc_is_sensor_peri_s_digital_gain(device, flash->flash_ae.long_dgain[step], flash->flash_ae.short_dgain[step]);
- fimc_is_sensor_peri_s_exposure_time(device, flash->flash_ae.long_expo[step], flash->flash_ae.short_expo[step]);
+ expo.long_val = expo.middle_val = flash->flash_ae.long_expo[step]; /* TODO: divide middle */
+ expo.short_val = flash->flash_ae.short_expo[step];
+ again.long_val = again.middle_val = flash->flash_ae.long_again[step];
+ again.short_val = flash->flash_ae.short_again[step];
+ dgain.long_val = dgain.middle_val = flash->flash_ae.long_dgain[step];
+ dgain.short_val = flash->flash_ae.short_again[step];
+ tgain[0] = tgain[2] = flash->flash_ae.long_tgain[step];
+ tgain[1] = flash->flash_ae.short_tgain[step];
+
+ CALL_CISOPS(&sensor_peri->cis, cis_adjust_frame_duration, sensor_peri->subdev_cis,
+ MAX(flash->flash_ae.long_expo[step], flash->flash_ae.short_expo[step]), &frame_duration);
+ fimc_is_sensor_peri_s_frame_duration(device, frame_duration);
+
+ fimc_is_sensor_peri_s_analog_gain(device, again);
+ fimc_is_sensor_peri_s_digital_gain(device, dgain);
+ fimc_is_sensor_peri_s_exposure_time(device, expo);
sensor_peri->sensor_interface.cis_itf_ops.request_reset_expo_gain(&sensor_peri->sensor_interface,
- flash->flash_ae.long_expo[step],
- flash->flash_ae.long_tgain[step],
- flash->flash_ae.long_again[step],
- flash->flash_ae.long_dgain[step],
- flash->flash_ae.short_expo[step],
- flash->flash_ae.short_tgain[step],
- flash->flash_ae.short_again[step],
- flash->flash_ae.short_dgain[step]);
-
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- flash->flash_ae.long_expo[step], flash->flash_ae.short_expo[step],
- flash->flash_ae.long_tgain[step], flash->flash_ae.short_tgain[step],
- flash->flash_ae.long_again[step], flash->flash_ae.short_again[step],
- flash->flash_ae.long_dgain[step], flash->flash_ae.short_dgain[step]);
+ EXPOSURE_GAIN_COUNT_3,
+ &expo.val,
+ tgain,
+ &again.val,
+ &dgain.val);
}
dbg_flash("[%s][FLASH] mode %d, intensity %d, firing time %d us, step %d\n", __func__,
} else if (flash->flash_ae.main_fls_ae_reset == true) {
if (flash->flash_ae.main_fls_strm_on_off_step == 0) {
if (flash->flash_data.flash_fired == false) {
- flash->flash_data.mode = CAM2_FLASH_MODE_SINGLE;
- flash->flash_data.intensity = 10;
- flash->flash_data.firing_time_us = 500000;
-
info("[%s] main-flash ON(%d), pow(%d), time(%d)\n",
__func__,
flash->flash_data.mode,
}
}
-void fimc_is_sensor_aperture_set_start_work_step1(struct work_struct *data)
+void fimc_is_sensor_ois_set_init_work(struct work_struct *data)
{
int ret = 0;
- struct fimc_is_aperture *aperture;
+ struct fimc_is_ois *ois;
struct fimc_is_device_sensor_peri *sensor_peri;
WARN_ON(!data);
- aperture = container_of(data, struct fimc_is_aperture, aperture_set_start_work_step1);
- WARN_ON(!aperture);
+ ois = container_of(data, struct fimc_is_ois, ois_set_init_work);
+ WARN_ON(!ois);
- sensor_peri = aperture->sensor_peri;
+ sensor_peri = ois->sensor_peri;
+
+ ret = CALL_OISOPS(sensor_peri->ois, ois_set_mode, sensor_peri->subdev_ois,
+ OPTICAL_STABILIZATION_MODE_CENTERING);
+ if (ret < 0)
+ err("v4l2_subdev_call(ois_set_mode) is fail(%d)", ret);
+
+ msleep(40);
+
+ ois->initial_centering_mode = true;
+}
+
+#ifdef USE_OIS_INIT_WORK
+void fimc_is_sensor_ois_init_work(struct work_struct *data)
+{
+ int ret = 0;
+ struct fimc_is_ois *ois;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+
+ WARN_ON(!data);
+
+ ois = container_of(data, struct fimc_is_ois, init_work);
+ WARN_ON(!ois);
+
+ sensor_peri = ois->sensor_peri;
if (sensor_peri->subdev_ois) {
- ret = CALL_OISOPS(sensor_peri->ois, ois_set_mode, sensor_peri->subdev_ois,
- OPTICAL_STABILIZATION_MODE_CENTERING);
- if (ret < 0)
- err("v4l2_subdev_call(ois_set_mode) is fail(%d)", ret);
+#ifdef CONFIG_OIS_DIRECT_FW_CONTROL
+ ret = CALL_OISOPS(ois, ois_fw_update, sensor_peri->subdev_ois);
+ if (ret < 0)
+ err("v4l2_subdev_call(ois_init) is fail(%d)", ret);
+#endif
+
+ ret = CALL_OISOPS(ois, ois_init, sensor_peri->subdev_ois);
+ if (ret < 0)
+ err("v4l2_subdev_call(ois_init) is fail(%d)", ret);
}
- usleep_range(10000, 11000);
+}
+#endif
- ret = CALL_APERTUREOPS(sensor_peri->aperture, set_aperture_start_value_step1, sensor_peri->subdev_aperture,
- sensor_peri->aperture->start_value);
+void fimc_is_sensor_cis_throttling_work(struct work_struct *data)
+{
+ int ret = 0;
+ struct fimc_is_cis *cis;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+
+ WARN_ON(!data);
+
+ cis = container_of(data, struct fimc_is_cis, throttling_work);
+ WARN_ON(!cis);
+
+ cis->throttling_mode = cis->throttling_mode ? false : true;
+
+ sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
+ /* sensor stream off */
+ ret = CALL_CISOPS(cis, cis_stream_off, sensor_peri->subdev_cis);
+ if (ret < 0) {
+ err("[%s] stream off fail\n", __func__);
+ return;
+ }
+
+ ret = CALL_CISOPS(cis, cis_wait_streamoff, sensor_peri->subdev_cis);
+ if (ret < 0) {
+ err("[%s] wait stream off fail\n", __func__);
+ return;
+ }
+
+ /* TODO: setting change to normal -> throttling or throttling -> normal */
+ if (cis->throttling_mode) {
+ info("throttling!!");
+ CALL_CISOPS(cis, cis_mode_change_throttling, cis->subdev);
+ } else {
+ info("return!!");
+ CALL_CISOPS(cis, cis_mode_change, cis->subdev, cis->cis_data->sens_config_index_cur);
+ }
+
+
+ ret = CALL_CISOPS(cis, cis_stream_on, sensor_peri->subdev_cis);
+ if (ret < 0) {
+ err("[%s] stream on fail\n", __func__);
+ }
+
+ ret = CALL_CISOPS(cis, cis_wait_streamon, sensor_peri->subdev_cis);
if (ret < 0)
- err("[%s] aperture set fail\n", __func__);
- usleep_range(10000, 11000);
+ err("[%s] sensor wait stream on fail\n", __func__);
+
}
-void fimc_is_sensor_aperture_set_start_work_step2(struct work_struct *data)
+void fimc_is_sensor_aperture_set_start_work(struct work_struct *data)
{
int ret = 0;
struct fimc_is_aperture *aperture;
struct fimc_is_device_sensor_peri *sensor_peri;
+ struct fimc_is_device_sensor *device;
+ struct fimc_is_core *core;
WARN_ON(!data);
- aperture = container_of(data, struct fimc_is_aperture, aperture_set_start_work_step2);
+ aperture = container_of(data, struct fimc_is_aperture, aperture_set_start_work);
WARN_ON(!aperture);
sensor_peri = aperture->sensor_peri;
- ret = CALL_APERTUREOPS(sensor_peri->aperture, set_aperture_start_value_step2, sensor_peri->subdev_aperture,
- sensor_peri->aperture->start_value);
+ device = v4l2_get_subdev_hostdata(sensor_peri->subdev_mcu);
+ WARN_ON(!device);
+
+ core = (struct fimc_is_core *)device->private_data;
+
+ mutex_lock(&core->ois_mode_lock);
+
+ ret = CALL_APERTUREOPS(sensor_peri->mcu->aperture, set_aperture_value, sensor_peri->subdev_mcu,
+ sensor_peri->mcu->aperture->start_value);
if (ret < 0)
err("[%s] aperture set fail\n", __func__);
+
+ mutex_unlock(&core->ois_mode_lock);
}
void fimc_is_sensor_aperture_set_work(struct work_struct *data)
sensor_peri = aperture->sensor_peri;
WARN_ON(!sensor_peri->subdev_cis);
- device = v4l2_get_subdev_hostdata(sensor_peri->subdev_cis);
+ device = v4l2_get_subdev_hostdata(sensor_peri->subdev_mcu);
WARN_ON(!device);
- mutex_lock(&aperture->control_lock);
+ info("[%s] start\n", __func__);
+
+ //mutex_lock(&aperture->control_lock);
if (device->sstream)
need_stream_off = true;
+#if 0 // need to check
/* Sensor stream off */
if (need_stream_off) {
mutex_lock(&sensor_peri->cis.control_lock);
err("[%s] wait stream off fail\n", __func__);
mutex_unlock(&sensor_peri->cis.control_lock);
}
-
- if (sensor_peri->subdev_ois) {
- ret = CALL_OISOPS(sensor_peri->ois, ois_set_mode, sensor_peri->subdev_ois,
- OPTICAL_STABILIZATION_MODE_CENTERING);
- if (ret < 0)
- err("v4l2_subdev_call(ois_set_mode) is fail(%d)", ret);
- }
- usleep_range(10000, 11000);
-
- ret = CALL_APERTUREOPS(sensor_peri->aperture, set_aperture_value, sensor_peri->subdev_aperture,
- sensor_peri->aperture->new_value);
+#endif
+ ret = CALL_APERTUREOPS(sensor_peri->mcu->aperture, set_aperture_value, sensor_peri->subdev_mcu,
+ sensor_peri->mcu->aperture->new_value);
if (ret < 0)
err("[%s] aperture set fail\n", __func__);
- if (sensor_peri->subdev_ois) {
- ret = CALL_OISOPS(sensor_peri->ois, ois_set_mode, sensor_peri->subdev_ois, sensor_peri->ois->ois_mode);
- if (ret < 0)
- err("v4l2_subdev_call(ois_mode_change, mode:%d) is fail(%d)", sensor_peri->ois->ois_mode, ret);
- }
-
- msleep(30);
-
+#if 0 // need to check
/* Sensor stream on */
- if (need_stream_off) {
+ if (need_stream_off && device->sstream) {
mutex_lock(&sensor_peri->cis.control_lock);
ret = CALL_CISOPS(&sensor_peri->cis, cis_stream_on, sensor_peri->subdev_cis);
if (ret < 0)
- err("[%s] stream off fail\n", __func__);
+ err("[%s] stream on fail\n", __func__);
mutex_unlock(&sensor_peri->cis.control_lock);
}
+#endif
+ //mutex_unlock(&aperture->control_lock);
- mutex_unlock(&aperture->control_lock);
+ info("[%s] end\n", __func__);
}
int fimc_is_sensor_flash_fire(struct fimc_is_device_sensor_peri *device,
- u32 on)
+ u32 intensity)
{
int ret = 0;
struct v4l2_subdev *subdev_flash;
struct fimc_is_flash *flash;
struct v4l2_control ctrl;
+ bool is_on;
FIMC_BUG(!device);
goto p_err;
}
- if (flash->flash_data.mode == CAM2_FLASH_MODE_OFF && on == 1) {
+ if (flash->flash_data.mode == CAM2_FLASH_MODE_OFF && intensity > 0) {
err("Flash mode is off");
flash->flash_data.flash_fired = false;
goto p_err;
}
- if (flash->flash_data.flash_fired != (bool)on) {
+ is_on = flash->flash_data.mode == CAM2_FLASH_MODE_OFF ? false : true;
+ if (flash->flash_data.flash_fired != is_on) {
ctrl.id = V4L2_CID_FLASH_SET_FIRE;
- ctrl.value = on ? flash->flash_data.intensity : 0;
+ ctrl.value = intensity;
ret = v4l2_subdev_call(subdev_flash, core, s_ctrl, &ctrl);
if (ret < 0) {
err("err!!! ret(%d)", ret);
goto p_err;
}
- flash->flash_data.flash_fired = (bool)on;
+ flash->flash_data.flash_fired = is_on;
}
if (flash->flash_data.mode == CAM2_FLASH_MODE_SINGLE ||
actuator_itf = &sensor_peri->sensor_interface.actuator_itf;
/* Set expecting actuator position */
+ FIMC_BUG(!sensor_peri->actuator);
frame_index = (*(u32 *)arg + 1) % EXPECT_DM_NUM;
- sensor_peri->cis.expecting_lens_udm[frame_index].pos = actuator_itf->virtual_pos;
+ sensor_peri->actuator->expecting_lens_udm[frame_index].pos = actuator_itf->virtual_pos;
dbg_actuator("%s: expexting frame cnt(%d), algorithm position(%d)\n",
__func__, (*(u32 *)arg + 1), actuator_itf->virtual_pos);
struct fimc_is_cis *cis = NULL;
struct fimc_is_module_enum *module;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct fimc_is_device_sensor *device;
FIMC_BUG(!subdev);
FIMC_BUG(!arg);
cis->cis_data->sen_vsync_count = vsync_count;
- if (sensor_peri->sensor_task != NULL) {
+ device = v4l2_get_subdev_hostdata(sensor_peri->subdev_cis);
+ FIMC_BUG(!device);
+ if ((device->resourcemgr->limited_fps && !cis->throttling_mode)
+ || (device->resourcemgr->limited_fps == 0 && cis->throttling_mode))
+ schedule_work(&sensor_peri->cis.throttling_work);
+
+ if (sensor_peri->sensor_task != NULL
+ || sensor_peri->use_sensor_work) {
/* run sensor setting thread */
kthread_queue_work(&sensor_peri->sensor_worker, &sensor_peri->sensor_work);
}
err("err!!!(%s), sensor notify M2M actuator fail(%d)", __func__, ret);
}
}
-
/* Sensor Long Term Exposure mode(LTE mode) set */
if (cis->long_term_mode.sen_strm_off_on_enable) {
if ((cis->long_term_mode.frame_interval == cis->long_term_mode.frm_num_strm_off_on_interval) ||
return ret;
}
+int fimc_is_sensor_peri_update_actuator_dm(struct v4l2_subdev *subdev, void *arg)
+{
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+ FIMC_BUG(!subdev);
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(subdev);
+ if (!module) {
+ err("%s, module is NULL", __func__);
+ return -EINVAL;
+ }
+
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+
+ if (test_bit(FIMC_IS_SENSOR_ACTUATOR_AVAILABLE, &sensor_peri->peri_state)) {
+ struct fimc_is_frame *frame = (struct fimc_is_frame *)arg;
+ int index;
+
+ FIMC_BUG(!frame);
+ FIMC_BUG(!frame->shot);
+ FIMC_BUG(!frame->shot_ext);
+ FIMC_BUG(!sensor_peri->actuator);
+
+ index = frame->fcount % EXPECT_DM_NUM;
+
+ if (frame->shot->uctl.lensUd.posSize) {
+ dbg_sensor(1, "[%s] lens used for manual control. skip\n", __func__);
+ return 0;
+ }
+
+ frame->shot_ext->user.focus_target_pos = sensor_peri->actuator->position;
+
+ if (sensor_peri->actuator->actual_pos_support) {
+ frame->shot_ext->user.focus_actual_pos =
+ sensor_peri->actuator->expecting_actual_pos[index];
+ }
+
+ dbg_sensor(1, "[%s][F:%d]: target_pos(%d), actual_pos(%s: %d)\n",
+ __func__, frame->fcount,
+ frame->shot_ext->user.focus_target_pos,
+ sensor_peri->actuator->actual_pos_support ? "EN" : "NA",
+ frame->shot_ext->user.focus_actual_pos);
+ }
+
+ return 0;
+}
+
int fimc_is_sensor_peri_pre_flash_fire(struct v4l2_subdev *subdev, void *arg)
{
int ret = 0;
flash = sensor_peri->flash;
FIMC_BUG(!flash);
- if (sensor_ctl->valid_flash_udctrl == false)
- goto p_err;
-
flash_uctl = &sensor_ctl->cur_cam20_flash_udctrl;
+ if ((sensor_ctl->valid_flash_udctrl == false)
+ || (vsync_count != sensor_ctl->flash_frame_number))
+ goto p_err;
+
if ((flash_uctl->flashMode != flash->flash_data.mode) ||
(flash_uctl->flashMode != CAM2_FLASH_MODE_OFF && flash_uctl->firingPower == 0)) {
flash->flash_data.mode = flash_uctl->flashMode;
info("[%s](%d) pre-flash mode(%d), pow(%d), time(%d)\n", __func__,
vsync_count, flash->flash_data.mode,
flash->flash_data.intensity, flash->flash_data.firing_time_us);
+#if defined(USE_PRE_FLASH_FIRE_WORK)
+ schedule_work(&sensor_peri->flash->flash_data.pre_flash_work);
+#else
ret = fimc_is_sensor_flash_fire(sensor_peri, flash->flash_data.intensity);
+#endif
}
+p_err:
/* HACK: reset uctl */
flash_uctl->flashMode = 0;
flash_uctl->firingPower = 0;
sensor_ctl->flash_frame_number = 0;
sensor_ctl->valid_flash_udctrl = false;
-p_err:
return ret;
}
struct fimc_is_device_sensor_peri *sensor_peri;
struct v4l2_subdev *subdev_cis;
struct fimc_is_device_sensor *device;
+ struct ae_param expo, dgain, again;
+ u32 tgain[EXPOSURE_GAIN_MAX];
u32 step = 0;
u32 frame_duration = 0;
sensor_peri = container_of(cis, struct fimc_is_device_sensor_peri, cis);
FIMC_BUG_VOID(!sensor_peri);
- device = v4l2_get_subdev_hostdata(sensor_peri->subdev_flash);
- FIMC_BUG_VOID(!device);
-
subdev_cis = sensor_peri->subdev_cis;
if (!subdev_cis) {
err("[%s]: no subdev_cis", __func__);
return;
}
+ device = v4l2_get_subdev_hostdata(subdev_cis);
+ FIMC_BUG_VOID(!device);
+
info("[%s] start\n", __func__);
/* Sensor stream off */
ret = CALL_CISOPS(cis, cis_stream_off, subdev_cis);
}
}
+ expo.val = expo.short_val = expo.middle_val = cis->long_term_mode.expo[step];
+ again.val = again.short_val = again.middle_val = cis->long_term_mode.again[step];
+ dgain.val = dgain.short_val = dgain.middle_val = cis->long_term_mode.dgain[step];
+ tgain[0] = tgain[1] = tgain[2] = cis->long_term_mode.tgain[step];
+
CALL_CISOPS(&sensor_peri->cis, cis_adjust_frame_duration, sensor_peri->subdev_cis,
cis->long_term_mode.expo[step], &frame_duration);
fimc_is_sensor_peri_s_frame_duration(device, frame_duration);
- fimc_is_sensor_peri_s_analog_gain(device, cis->long_term_mode.again[step], cis->long_term_mode.again[step]);
- fimc_is_sensor_peri_s_digital_gain(device, cis->long_term_mode.dgain[step], cis->long_term_mode.dgain[step]);
- fimc_is_sensor_peri_s_exposure_time(device, cis->long_term_mode.expo[step], cis->long_term_mode.expo[step]);
+ fimc_is_sensor_peri_s_analog_gain(device, again);
+ fimc_is_sensor_peri_s_digital_gain(device, dgain);
+ fimc_is_sensor_peri_s_exposure_time(device, expo);
sensor_peri->sensor_interface.cis_itf_ops.request_reset_expo_gain(&sensor_peri->sensor_interface,
- cis->long_term_mode.expo[step],
- cis->long_term_mode.tgain[step],
- cis->long_term_mode.again[step],
- cis->long_term_mode.dgain[step],
- cis->long_term_mode.expo[step],
- cis->long_term_mode.tgain[step],
- cis->long_term_mode.again[step],
- cis->long_term_mode.dgain[step]);
-
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- cis->long_term_mode.expo[step], cis->long_term_mode.expo[step],
- cis->long_term_mode.tgain[step], cis->long_term_mode.tgain[step],
- cis->long_term_mode.again[step], cis->long_term_mode.again[step],
- cis->long_term_mode.dgain[step], cis->long_term_mode.dgain[step]);
+ EXPOSURE_GAIN_COUNT_3,
+ &expo.val,
+ tgain,
+ &again.val,
+ &dgain.val);
step = cis->long_term_mode.sen_strm_off_on_step++;
FIMC_BUG_VOID(!sensor_peri);
if (sensor_peri->flash) {
+ INIT_WORK(&sensor_peri->flash->flash_data.pre_flash_work, fimc_is_sensor_pre_flash_fire_work);
INIT_WORK(&sensor_peri->flash->flash_data.flash_fire_work, fimc_is_sensor_flash_fire_work);
INIT_WORK(&sensor_peri->flash->flash_data.flash_expire_work, fimc_is_sensor_flash_expire_work);
}
/* Init to LTE mode work */
INIT_WORK(&sensor_peri->cis.long_term_mode_work, fimc_is_sensor_long_term_mode_set_work);
- if (sensor_peri->aperture) {
- INIT_WORK(&sensor_peri->aperture->aperture_set_start_work_step1, fimc_is_sensor_aperture_set_start_work_step1);
- INIT_WORK(&sensor_peri->aperture->aperture_set_start_work_step2, fimc_is_sensor_aperture_set_start_work_step2);
- INIT_WORK(&sensor_peri->aperture->aperture_set_work, fimc_is_sensor_aperture_set_work);
+ if (sensor_peri->mcu && sensor_peri->mcu->aperture) {
+ INIT_WORK(&sensor_peri->mcu->aperture->aperture_set_start_work, fimc_is_sensor_aperture_set_start_work);
+ INIT_WORK(&sensor_peri->mcu->aperture->aperture_set_work, fimc_is_sensor_aperture_set_work);
}
+
+#ifdef USE_OIS_INIT_WORK
+ if (sensor_peri->ois)
+ INIT_WORK(&sensor_peri->ois->init_work, fimc_is_sensor_ois_init_work);
+#endif
+ INIT_WORK(&sensor_peri->cis.throttling_work, fimc_is_sensor_cis_throttling_work);
+ sensor_peri->cis.throttling_mode = false;
}
void fimc_is_sensor_peri_probe(struct fimc_is_device_sensor_peri *sensor_peri)
FIMC_BUG(!cis);
FIMC_BUG(!cis->cis_data);
- if (sensor_peri->aperture)
- mutex_lock(&sensor_peri->aperture->control_lock);
+ //if (sensor_peri->aperture)
+ //mutex_lock(&sensor_peri->aperture->control_lock);
subdev_preprocessor = sensor_peri->subdev_preprocessor;
if (subdev_preprocessor) {
fimc_is_sensor_ois_start((struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_module));
#endif
+ /* off flash when flash mode == off with fired */
+ if (sensor_peri->flash != NULL && dual_info->mode == FIMC_IS_DUAL_MODE_NOTHING) {
+ if ((sensor_peri->flash->flash_data.flash_fired == true)
+ && (device->group_sensor.aeflashMode == AA_FLASHMODE_OFF)) {
+ sensor_peri->flash->flash_data.mode = CAM2_FLASH_MODE_OFF;
+ ret = fimc_is_sensor_flash_fire(sensor_peri, 0);
+ if (ret)
+ err("failed to turn off flash at flash expired handler\n");
+ }
+ }
+
+ /* For dual camera project to reduce power consumption of ois */
+#ifndef CONFIG_CAMERA_USE_MCU
+#ifdef CAMERA_REAR2_OIS
+ if (sensor_peri->mcu && sensor_peri->mcu->ois) {
+ ret = CALL_OISOPS(sensor_peri->mcu->ois, ois_set_power_mode, sensor_peri->subdev_mcu);
+ if (ret < 0)
+ err("v4l2_subdev_call(ois_set_power_mode) is fail(%d)", ret);
+ }
+#endif
+#endif
/* set aperture as start value */
- if (sensor_peri->aperture && (sensor_peri->aperture->start_value != sensor_peri->aperture->cur_value)) {
- schedule_work(&sensor_peri->aperture->aperture_set_start_work_step1);
+ if (sensor_peri->mcu && sensor_peri->mcu->aperture
+ && (sensor_peri->mcu->aperture->start_value != sensor_peri->mcu->aperture->cur_value)) {
+#ifndef CONFIG_CAMERA_USE_MCU
+ flush_work(&sensor_peri->ois->ois_set_init_work);
+#endif
+ schedule_work(&sensor_peri->mcu->aperture->aperture_set_start_work);
} else {
- if (sensor_peri->subdev_ois) {
+ if (sensor_peri->ois) {
+ mutex_lock(&core->ois_mode_lock);
ret = CALL_OISOPS(sensor_peri->ois, ois_set_mode, sensor_peri->subdev_ois,
sensor_peri->ois->ois_mode);
if (ret < 0)
err("v4l2_subdev_call(ois_set_mode) is fail(%d)", ret);
+ mutex_unlock(&core->ois_mode_lock);
}
}
}
}
#endif
-
/* stream on sequence */
if (cis->need_mode_change == false && cis->use_initial_ae == false) {
/* only first time after camera on */
}
}
- if (sensor_peri->aperture && (sensor_peri->aperture->start_value != sensor_peri->aperture->cur_value)) {
- flush_work(&sensor_peri->aperture->aperture_set_start_work_step1);
- schedule_work(&sensor_peri->aperture->aperture_set_start_work_step2);
+ if (sensor_peri->mcu) {
+ if (sensor_peri->mcu->aperture
+ && (sensor_peri->mcu->aperture->start_value != sensor_peri->mcu->aperture->cur_value)) {
+ flush_work(&sensor_peri->mcu->aperture->aperture_set_start_work);
+ }
+ }
+
+ /* HACK: when sensor0/2 opened, hw_sync enable forcely */
+ if (test_bit(FIMC_IS_SENSOR_OPEN, &core->sensor[0].state)
+ && test_bit(FIMC_IS_SENSOR_OPEN, &core->sensor[2].state))
+ cis->cis_data->dual_sync_enable = true;
+
+ if (cis->cis_data->dual_sync_enable) {
+ ret = CALL_CISOPS(cis, cis_set_dual_setting, subdev_cis);
+ if (ret)
+ err("[%s]: cis_set_dual_setting fail\n", __func__);
}
ret = CALL_CISOPS(cis, cis_stream_on, subdev_cis);
ret = CALL_CISOPS(cis, cis_stream_off, subdev_cis);
if (ret == 0)
ret = CALL_CISOPS(cis, cis_wait_streamoff, subdev_cis);
- mutex_unlock(&cis->control_lock);
- /* just for auto dual camera mode to reduce power consumption */
- if (sensor_peri->aperture)
- flush_work(&sensor_peri->aperture->aperture_set_start_work_step2);
+ if (cis->long_term_mode.sen_strm_off_on_enable) {
+ cis->long_term_mode.sen_strm_off_on_enable = 0;
+ ret = CALL_CISOPS(cis, cis_set_long_term_exposure, subdev_cis);
+ info("[%s] cancelled long_exp_capture mode\n", __func__);
+ }
+ mutex_unlock(&cis->control_lock);
#ifdef USE_OIS_SLEEP_MODE
if (sensor_peri->ois)
#endif
#ifdef USE_AF_SLEEP_MODE
- if (sensor_peri->actuator && sensor_peri->actuator->actuator_ops) {
+ if (sensor_peri->actuator && sensor_peri->actuator->actuator_ops
+ && (dual_info->mode != FIMC_IS_DUAL_MODE_NOTHING)) {
ret = CALL_ACTUATOROPS(sensor_peri->actuator, set_active, sensor_peri->subdev_actuator, 0);
if (ret) {
err("[SEN:%d] actuator set sleep fail\n", module->sensor_id);
}
#endif
- if (sensor_peri->flash != NULL && dual_info->mode == FIMC_IS_DUAL_MODE_NOTHING) {
- sensor_peri->flash->flash_data.mode = CAM2_FLASH_MODE_OFF;
- if (sensor_peri->flash->flash_data.flash_fired == true) {
- ret = fimc_is_sensor_flash_fire(sensor_peri, 0);
- if (ret) {
- err("failed to turn off flash at flash expired handler\n");
- }
- }
- }
-
if (subdev_preprocessor){
ret = CALL_PREPROPOPS(preprocessor, preprocessor_stream_off, subdev_preprocessor);
if (ret) {
}
memset(&sensor_peri->cis.cur_sensor_uctrl, 0, sizeof(camera2_sensor_uctl_t));
memset(&sensor_peri->cis.expecting_sensor_dm[0], 0, sizeof(camera2_sensor_dm_t) * EXPECT_DM_NUM);
+ memset(&sensor_peri->cis.expecting_sensor_udm[0], 0, sizeof(camera2_sensor_udm_t) * EXPECT_DM_NUM);
for (i = 0; i < CAM2P0_UCTL_LIST_SIZE; i++) {
memset(&sensor_peri->cis.sensor_ctls[i].cur_cam20_sensor_udctrl, 0, sizeof(camera2_sensor_uctl_t));
sensor_peri->cis.sensor_ctls[i].valid_sensor_ctrl = 0;
+ sensor_peri->cis.sensor_ctls[i].force_update = false;
+ memset(&sensor_peri->cis.sensor_ctls[i].cur_cam20_flash_udctrl, 0, sizeof(camera2_flash_uctl_t));
+ sensor_peri->cis.sensor_ctls[i].valid_flash_udctrl = false;
+
+ memset(&sensor_peri->cis.sensor_ctls[i].roi_control, 0, sizeof(struct roi_setting_t));
+ memset(&sensor_peri->cis.sensor_ctls[i].stat_control, 0,
+ sizeof(struct sensor_lsi_3hdr_stat_control_per_frame));
}
+ sensor_peri->cis.sensor_stats = NULL;
+
+ sensor_peri->use_sensor_work = false;
}
if (ret < 0) {
err("[SEN:%d] v4l2_subdev_call(s_stream, on:%d) is fail(%d)",
#endif
p_err:
- if (sensor_peri->aperture)
- mutex_unlock(&sensor_peri->aperture->control_lock);
+ //if (sensor_peri->aperture)
+ //mutex_unlock(&sensor_peri->aperture->control_lock);
return ret;
}
}
int fimc_is_sensor_peri_s_exposure_time(struct fimc_is_device_sensor *device,
- u32 long_exposure_time, u32 short_exposure_time)
+ struct ae_param expo)
{
int ret = 0;
struct v4l2_subdev *subdev_module;
struct fimc_is_module_enum *module;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct ae_param exposure;
FIMC_BUG(!device);
}
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- if ((long_exposure_time <= 0) || (short_exposure_time <= 0)) {
- err("it is wrong exposure time (long:%d, short:%d)", long_exposure_time, short_exposure_time);
- ret = -EINVAL;
- goto p_err;
- }
-
#ifdef FIXED_SENSOR_DEBUG
if (unlikely(sysfs_sensor.is_en == true)) {
- long_exposure_time = sysfs_sensor.long_exposure_time;
- short_exposure_time = sysfs_sensor.short_exposure_time;
- dbg_sensor(1, "exposure = %d %d\n", long_exposure_time, short_exposure_time);
+ expo.long_val = sysfs_sensor.long_exposure_time;
+ expo.short_val = sysfs_sensor.short_exposure_time;
+ dbg_sensor(1, "exposure = %d %d\n", expo.long_val, expo.short_val);
}
#endif
- exposure.long_val = long_exposure_time;
- exposure.short_val = short_exposure_time;
- ret = CALL_CISOPS(&sensor_peri->cis, cis_set_exposure_time, sensor_peri->subdev_cis, &exposure);
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_set_exposure_time, sensor_peri->subdev_cis, &expo);
if (ret < 0) {
err("err!!! ret(%d)", ret);
goto p_err;
}
- device->exposure_time = long_exposure_time;
+
+ device->exposure_time = expo.long_val;
p_err:
return ret;
}
int fimc_is_sensor_peri_s_analog_gain(struct fimc_is_device_sensor *device,
- u32 long_analog_gain, u32 short_analog_gain)
+ struct ae_param again)
{
int ret = 0;
struct v4l2_subdev *subdev_module;
struct fimc_is_module_enum *module;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct ae_param again;
FIMC_BUG(!device);
}
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- if (long_analog_gain <= 0 ) {
- err("it is wrong analog gain(%d)", long_analog_gain);
- ret = -EINVAL;
- goto p_err;
- }
-
#ifdef FIXED_SENSOR_DEBUG
if (unlikely(sysfs_sensor.is_en == true)) {
- long_analog_gain = sysfs_sensor.long_analog_gain * 10;
- short_analog_gain = sysfs_sensor.short_analog_gain * 10;
+ again.long_val = sysfs_sensor.long_analog_gain * 10;
+ again.short_val = sysfs_sensor.short_analog_gain * 10;
dbg_sensor(1, "again = %d %d\n", sysfs_sensor.long_analog_gain, sysfs_sensor.short_analog_gain);
}
#endif
- again.long_val = long_analog_gain;
- again.short_val = short_analog_gain;
ret = CALL_CISOPS(&sensor_peri->cis, cis_set_analog_gain, sensor_peri->subdev_cis, &again);
if (ret < 0) {
err("err!!! ret(%d)", ret);
}
/* 0: Previous input, 1: Current input */
sensor_peri->cis.cis_data->analog_gain[0] = sensor_peri->cis.cis_data->analog_gain[1];
- sensor_peri->cis.cis_data->analog_gain[1] = long_analog_gain;
+ sensor_peri->cis.cis_data->analog_gain[1] = again.long_val;
p_err:
return ret;
}
int fimc_is_sensor_peri_s_digital_gain(struct fimc_is_device_sensor *device,
- u32 long_digital_gain, u32 short_digital_gain)
+ struct ae_param dgain)
{
int ret = 0;
struct v4l2_subdev *subdev_module;
struct fimc_is_module_enum *module;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct ae_param dgain;
FIMC_BUG(!device);
}
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- if (long_digital_gain <= 0 ) {
- err("it is wrong digital gain(%d)", long_digital_gain);
- ret = -EINVAL;
- goto p_err;
- }
-
#ifdef FIXED_SENSOR_DEBUG
if (unlikely(sysfs_sensor.is_en == true)) {
- long_digital_gain = sysfs_sensor.long_digital_gain * 10;
- short_digital_gain = sysfs_sensor.short_digital_gain * 10;
+ dgain.long_val = sysfs_sensor.long_digital_gain * 10;
+ dgain.short_val = sysfs_sensor.short_digital_gain * 10;
dbg_sensor(1, "dgain = %d %d\n", sysfs_sensor.long_digital_gain, sysfs_sensor.short_digital_gain);
}
#endif
- dgain.long_val = long_digital_gain;
- dgain.short_val = short_digital_gain;
ret = CALL_CISOPS(&sensor_peri->cis, cis_set_digital_gain, sensor_peri->subdev_cis, &dgain);
if (ret < 0) {
err("err!!! ret(%d)", ret);
}
/* 0: Previous input, 1: Current input */
sensor_peri->cis.cis_data->digital_gain[0] = sensor_peri->cis.cis_data->digital_gain[1];
- sensor_peri->cis.cis_data->digital_gain[1] = long_digital_gain;
+ sensor_peri->cis.cis_data->digital_gain[1] = dgain.long_val;
p_err:
return ret;
}
+int fimc_is_sensor_peri_s_wb_gains(struct fimc_is_device_sensor *device,
+ struct wb_gains wb_gains)
+{
+ int ret = 0;
+ struct v4l2_subdev *subdev_module;
+
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+ BUG_ON(!device);
+ BUG_ON(!device->subdev_module);
+
+ subdev_module = device->subdev_module;
+
+ module = v4l2_get_subdevdata(subdev_module);
+ if (!module) {
+ err("module is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_set_wb_gains, sensor_peri->subdev_cis, wb_gains);
+ if (ret < 0)
+ err("failed to set wb gains(%d)", ret);
+
+p_err:
+ return ret;
+}
+
+int fimc_is_sensor_peri_s_sensor_stats(struct fimc_is_device_sensor *device,
+ bool streaming,
+ struct fimc_is_sensor_ctl *module_ctl,
+ void *data)
+{
+ int ret = 0;
+ struct v4l2_subdev *subdev_module;
+
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+ BUG_ON(!device);
+ BUG_ON(!device->subdev_module);
+
+ subdev_module = device->subdev_module;
+
+ module = v4l2_get_subdevdata(subdev_module);
+ if (!module) {
+ err("module is NULL");
+ ret = -EINVAL;
+ goto p_err;
+ }
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+
+ if (streaming) {
+ FIMC_BUG(!module_ctl);
+
+ if (module_ctl->update_roi) {
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_set_roi_stat,
+ sensor_peri->subdev_cis, module_ctl->roi_control);
+ if (ret < 0)
+ err("failed to set roi stat(%d)", ret);
+ }
+
+ if (module_ctl->update_3hdr_stat) {
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_set_3hdr_stat,
+ sensor_peri->subdev_cis,
+ streaming,
+ (void *)&module_ctl->stat_control);
+ if (ret < 0)
+ err("failed to set 3hdr stat(%d)", ret);
+ }
+
+ } else {
+ if (data) {
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_set_3hdr_stat,
+ sensor_peri->subdev_cis,
+ streaming,
+ data);
+ if (ret < 0)
+ err("failed to set 3hdr stat(%d)", ret);
+ }
+ }
+p_err:
+ return ret;
+}
+
int fimc_is_sensor_peri_adj_ctrl(struct fimc_is_device_sensor *device,
u32 input,
struct v4l2_control *ctrl)
}
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+ if (*again == 0 || *dgain == 0) {
+ dbg_sensor(1, "%s: skip", __func__);
+ goto p_err;
+ }
+
ret = CALL_CISOPS(&sensor_peri->cis, cis_compensate_gain_for_extremely_br, sensor_peri->subdev_cis, expo, again, dgain);
if (ret < 0) {
err("err!!! ret(%d)", ret);
int fimc_is_sensor_peri_debug_fixed(struct fimc_is_device_sensor *device)
{
int ret = 0;
+ struct ae_param expo, dgain, again;
if (!device) {
err("device is null\n");
dbg_sensor(1, "exposure = %d %d\n",
sysfs_sensor.long_exposure_time, sysfs_sensor.short_exposure_time);
- if (fimc_is_sensor_peri_s_exposure_time(device,
- sysfs_sensor.long_exposure_time, sysfs_sensor.short_exposure_time)) {
+ expo.long_val = sysfs_sensor.long_exposure_time;
+ expo.short_val = sysfs_sensor.short_exposure_time;
+ if (fimc_is_sensor_peri_s_exposure_time(device, expo)) {
err("failed to set exposure time : %d %d\n - %d",
sysfs_sensor.long_exposure_time, sysfs_sensor.short_exposure_time, ret);
goto p_err;
}
dbg_sensor(1, "again = %d %d\n", sysfs_sensor.long_analog_gain, sysfs_sensor.short_analog_gain);
- ret = fimc_is_sensor_peri_s_analog_gain(device,
- sysfs_sensor.long_analog_gain * 10, sysfs_sensor.short_analog_gain * 10);
+ again.long_val = sysfs_sensor.long_analog_gain * 10;
+ again.short_val = sysfs_sensor.long_analog_gain * 10;
+ ret = fimc_is_sensor_peri_s_analog_gain(device, again);
if (ret < 0) {
err("failed to set analog gain : %d %d\n - %d",
sysfs_sensor.long_analog_gain,
}
dbg_sensor(1, "dgain = %d %d\n", sysfs_sensor.long_digital_gain, sysfs_sensor.short_digital_gain);
- ret = fimc_is_sensor_peri_s_digital_gain(device,
- sysfs_sensor.long_digital_gain * 10,
- sysfs_sensor.short_digital_gain * 10);
+ dgain.long_val = sysfs_sensor.long_digital_gain * 10;
+ dgain.short_val = sysfs_sensor.long_digital_gain * 10;
+ ret = fimc_is_sensor_peri_s_analog_gain(device, dgain);
if (ret < 0) {
err("failed to set digital gain : %d %d\n - %d",
sysfs_sensor.long_digital_gain,
u32 aperture_num;
bool use_dgain;
bool hdr_ctrl_by_again;
+ bool use_wb_gain;
+ bool use_3hdr;
struct fimc_is_sensor_ctl sensor_ctls[CAM2P0_UCTL_LIST_SIZE];
camera2_sensor_uctl_t cur_sensor_uctrl;
/* settings for mode change */
- bool need_mode_change;
- u32 mode_chg_expo;
- u32 mode_chg_again;
- u32 mode_chg_dgain;
- u32 mode_chg_long_expo;
- u32 mode_chg_long_again;
- u32 mode_chg_long_dgain;
+ bool need_mode_change;
+ enum fimc_is_exposure_gain_count exp_gain_cnt;
+ ae_setting mode_chg;
+ struct wb_gains mode_chg_wb_gains;
/* expected dms */
- camera2_lens_dm_t expecting_lens_dm[EXPECT_DM_NUM];
camera2_sensor_dm_t expecting_sensor_dm[EXPECT_DM_NUM];
camera2_flash_dm_t expecting_flash_dm[EXPECT_DM_NUM];
/* expected udm */
- camera2_lens_udm_t expecting_lens_udm[EXPECT_DM_NUM];
+ camera2_sensor_udm_t expecting_sensor_udm[EXPECT_DM_NUM];
/* For sensor status dump */
struct work_struct cis_status_dump_work;
bool use_initial_ae;
ae_setting init_ae_setting;
ae_setting last_ae_setting;
+
+ /* settings for sensor stat */
+ void *sensor_stats;
+
+ /* dual sync mode */
+ u32 dual_sync_mode;
+
+ struct work_struct throttling_work;
+ bool throttling_mode;
+
+ /* step1: get gyro stat data by VC3 */
+ /* step2: get gyro stat data by VC3 and x,y,z value by meta */
+ struct sensor_gyro_info gyro_test_val;
+ u32 gyro_self_test_step;
};
struct fimc_is_actuator_data {
u32 vendor_first_pos;
u32 vendor_first_delay;
bool vendor_use_sleep_mode;
+
+ bool init_cal_setting;
+ bool actual_pos_support;
+
+ void *priv_info;
+
+ /* expecting dm/udm for actuator */
+ camera2_lens_dm_t expecting_lens_dm[EXPECT_DM_NUM];
+ camera2_lens_udm_t expecting_lens_udm[EXPECT_DM_NUM];
+ u32 expecting_actual_pos[EXPECT_DM_NUM];
};
struct fimc_is_aperture {
int cur_value; /* need to mode when aperture value change */
int start_value;
enum fimc_is_aperture_control_step step;
- struct work_struct aperture_set_start_work_step1;
- struct work_struct aperture_set_start_work_step2;
+ struct work_struct aperture_set_start_work;
struct work_struct aperture_set_work;
};
+struct fimc_is_eeprom {
+ u32 id;
+ struct v4l2_subdev *subdev; /* connected module subdevice */
+ u32 device; /* connected sensor device */
+ struct i2c_client *client;
+ struct fimc_is_eeprom_ops *eeprom_ops;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ struct mutex *i2c_lock;
+
+ char *data;
+ u32 total_size;
+};
+
+#define FLASH_LED_CH_MAX (4)
struct fimc_is_flash_data {
enum flash_mode mode;
u32 intensity;
u32 firing_time_us;
+#ifdef FLASH_CAL_DATA_ENABLE
+ u32 inp_current[FLASH_LED_CH_MAX];
+ bool cal_en;
+#endif
bool flash_fired;
+ struct work_struct pre_flash_work;
struct work_struct flash_fire_work;
struct timer_list flash_expire_timer;
struct work_struct flash_expire_work;
int flash_gpio;
int torch_gpio;
+ /* for select led channel */
+ int led_ch[FLASH_LED_CH_MAX];
+
struct fimc_is_flash_data flash_data;
struct fimc_is_flash_expo_gain flash_ae;
u8 coef;
u8 pre_coef;
bool fadeupdown;
+ bool initial_centering_mode;
+#ifdef CAMERA_REAR2_OIS
+ int ois_power_mode;
+#endif
+ struct work_struct ois_set_init_work;
+#ifdef USE_OIS_INIT_WORK
+ struct work_struct init_work;
+#endif
+};
+
+struct fimc_is_mcu {
+ struct v4l2_subdev *subdev; /* connected module subdevice */
+ struct i2c_client *client;
+ u32 id;
+ u32 device; /* connected sensor device */
+ u32 ver;
+ int gpio_mcu_reset;
+ int gpio_mcu_boot0;
+ u8 vdrinfo_bin[4];
+ u8 hw_bin[4];
+ u8 vdrinfo_mcu[4];
+ u8 hw_mcu[4];
+ char load_fw_name[50];
+ struct fimc_is_ois *ois;
+ struct v4l2_subdev *subdev_ois;
+ struct fimc_is_device_ois *ois_device;
+ struct fimc_is_aperture *aperture;
+ struct v4l2_subdev *subdev_aperture;
+ struct fimc_is_aperture_ops *aperture_ops;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ struct mutex *i2c_lock;
+ void *private_data;
};
struct fimc_is_preprocessor {
struct mutex *i2c_lock;
};
+struct paf_action {
+ enum itf_vc_stat_type type;
+ vc_dma_notifier_t notifier;
+ void *data;
+ unsigned int flags;
+ const char *name;
+ struct list_head list;
+};
+
+struct fimc_is_pdp_ops {
+ /* common paf interface */
+ int (*set_param)(struct v4l2_subdev *subdev,
+ struct paf_setting_t *regs, u32 regs_size);
+ int (*get_ready)(struct v4l2_subdev *subdev, u32 *ready);
+ int (*register_notifier)(struct v4l2_subdev *subdev,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier, void *data);
+ int (*unregister_notifier)(struct v4l2_subdev *subdev,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier);
+ void (*notify)(struct v4l2_subdev *subdev,
+ unsigned int type,
+ void *data);
+};
+
struct fimc_is_pdp {
u32 id;
- u32 __iomem *base_reg;
+ void __iomem *base;
resource_size_t regs_start;
resource_size_t regs_end;
int irq;
size_t width;
size_t height;
struct mutex control_lock;
+
struct fimc_is_pdp_ops *pdp_ops;
struct v4l2_subdev *subdev; /* connected module subdevice */
+
+ spinlock_t slock_paf_action;
+ struct list_head list_of_paf_action;
+
+ struct tasklet_struct tasklet_stat0;
+ atomic_t frameptr_stat0;
+ struct workqueue_struct *wq_stat0;
+ struct work_struct work_stat0;
+};
+
+struct fimc_is_pafstat_ops {
+ /* common paf interface ops */
+ int (*set_param)(struct v4l2_subdev *subdev,
+ struct paf_setting_t *regs, u32 regs_size);
+ int (*get_ready)(struct v4l2_subdev *subdev, u32 *ready);
+ int (*register_notifier)(struct v4l2_subdev *subdev,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier, void *data);
+ int (*unregister_notifier)(struct v4l2_subdev *subdev,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier);
+ void (*notify)(struct v4l2_subdev *subdev,
+ unsigned int type,
+ void *data);
+
+ /* device specific ops */
+ int (*set_num_buffers)(struct v4l2_subdev *subdev,
+ u32 num_buffers, struct fimc_is_sensor_cfg *cfg);
};
-struct fimc_is_paf {
+struct fimc_is_pafstat {
u32 id; /* 0: context0, 1: context1 */
void __iomem *regs_com;
void __iomem *regs;
u32 fro_cnt;
u32 regs_max;
- struct pafstat_setting_t *regs_set;
- struct fimc_is_paf_ops *paf_ops;
+ struct paf_setting_t *regs_set;
+ struct fimc_is_pafstat_ops *pafstat_ops;
struct v4l2_subdev *subdev; /* connected module subdevice */
char name[FIMC_IS_STR_LEN];
+
+ spinlock_t slock_paf_action;
+ struct list_head list_of_paf_action;
+
+ struct tasklet_struct tasklet_fwin_stat;
+ atomic_t frameptr_fwin_stat;
+ struct workqueue_struct *wq_fwin_stat;
+ struct work_struct work_fwin_stat;
};
struct fimc_is_device_sensor_peri {
struct fimc_is_pdp *pdp;
struct v4l2_subdev *subdev_pdp;
- struct fimc_is_paf *paf;
- struct v4l2_subdev *subdev_paf;
+ struct fimc_is_pafstat *pafstat;
+ struct v4l2_subdev *subdev_pafstat;
struct fimc_is_aperture *aperture;
struct v4l2_subdev *subdev_aperture;
+ struct fimc_is_mcu *mcu;
+ struct v4l2_subdev *subdev_mcu;
+
+ struct fimc_is_eeprom *eeprom;
+ struct v4l2_subdev *subdev_eeprom;
+
unsigned long peri_state;
/* Thread for sensor and high spped recording setting */
- u32 sensor_work_index;
+ bool use_sensor_work;
spinlock_t sensor_work_lock;
struct task_struct *sensor_task;
struct kthread_worker sensor_worker;
struct kthread_work sensor_work;
/* Thread for sensor register setting */
+ struct task_struct *cis_global_task;
+ struct kthread_worker cis_global_worker;
+ struct kthread_work cis_global_work;
+
struct task_struct *mode_change_task;
struct kthread_worker mode_change_worker;
struct kthread_work mode_change_work;
};
void fimc_is_sensor_work_fn(struct kthread_work *work);
+void fimc_is_sensor_global_setting_work_fn(struct kthread_work *work);
void fimc_is_sensor_mode_change_work_fn(struct kthread_work *work);
int fimc_is_sensor_init_sensor_thread(struct fimc_is_device_sensor_peri *sensor_peri);
void fimc_is_sensor_deinit_sensor_thread(struct fimc_is_device_sensor_peri *sensor_peri);
u32 preprocessor);
struct fimc_is_device_sensor_peri *find_peri_by_ois_id(struct fimc_is_device_sensor *device,
u32 ois);
+struct fimc_is_device_sensor_peri *find_peri_by_eeprom_id(struct fimc_is_device_sensor *device,
+ u32 eeprom);
void fimc_is_sensor_set_cis_uctrl_list(struct fimc_is_device_sensor_peri *sensor_peri,
- u32 long_exp, u32 short_exp,
- u32 long_total_gain, u32 short_total_gain,
- u32 long_analog_gain, u32 short_analog_gain,
- u32 long_digital_gain, u32 short_digital_gain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
+ u32 *total_gain,
+ u32 *analog_gain,
+ u32 *digital_gain);
int fimc_is_sensor_peri_notify_vsync(struct v4l2_subdev *subdev, void *arg);
int fimc_is_sensor_peri_notify_vblank(struct v4l2_subdev *subdev, void *arg);
int fimc_is_sensor_peri_notify_actuator(struct v4l2_subdev *subdev, void *arg);
int fimc_is_sensor_peri_notify_m2m_actuator(void *arg);
int fimc_is_sensor_peri_notify_actuator_init(struct v4l2_subdev *subdev);
+int fimc_is_sensor_peri_update_actuator_dm(struct v4l2_subdev *subdev, void *arg);
int fimc_is_sensor_peri_call_m2m_actuator(struct fimc_is_device_sensor *device);
int fimc_is_sensor_initial_preprocessor_setting(struct fimc_is_device_sensor_peri *sensor_peri);
int fimc_is_sensor_peri_s_frame_duration(struct fimc_is_device_sensor *device,
u32 frame_duration);
int fimc_is_sensor_peri_s_exposure_time(struct fimc_is_device_sensor *device,
- u32 long_exposure_time, u32 short_exposure_time);
+ struct ae_param expo);
int fimc_is_sensor_peri_s_analog_gain(struct fimc_is_device_sensor *device,
- u32 long_analog_gain, u32 short_analog_gain);
+ struct ae_param again);
int fimc_is_sensor_peri_s_digital_gain(struct fimc_is_device_sensor *device,
- u32 long_digital_gain, u32 short_digital_gain);
+ struct ae_param dgain);
+int fimc_is_sensor_peri_s_wb_gains(struct fimc_is_device_sensor *device,
+ struct wb_gains wb_gains);
+int fimc_is_sensor_peri_s_sensor_stats(struct fimc_is_device_sensor *device,
+ bool streaming,
+ struct fimc_is_sensor_ctl *module_ctl,
+ void *data);
int fimc_is_sensor_peri_adj_ctrl(struct fimc_is_device_sensor *device,
u32 input, struct v4l2_control *ctrl);
#define CALL_ACTUATOROPS(s, op, args...) (((s)->actuator_ops->op) ? ((s)->actuator_ops->op(args)) : 0)
#define CALL_APERTUREOPS(s, op, args...) (((s)->aperture_ops->op) ? ((s)->aperture_ops->op(args)) : 0)
#define CALL_PDPOPS(s, op, args...) (((s)->pdp_ops->op) ? ((s)->pdp_ops->op(args)) : 0)
-#define CALL_PAFOPS(s, op, args...) (((s)->paf_ops->op) ? ((s)->paf_ops->op(args)) : 0)
+#define CALL_PAFSTATOPS(s, op, args...) (((s)->pafstat_ops->op) ? ((s)->pafstat_ops->op(args)) : 0)
+#define CALL_EEPROMOPS(s, op, args...) (((s)->eeprom_ops->op) ? ((s)->eeprom_ops->op(args)) : 0)
#endif
cur_frame_cnt = get_frame_count(itf);
index = cur_frame_cnt % EXPECT_DM_NUM;
- *position = sensor_peri->cis.expecting_lens_udm[index].pos;
+ FIMC_BUG(!sensor_peri->actuator);
+ *position = sensor_peri->actuator->expecting_lens_udm[index].pos;
dbg_actuator("%s: cur_frame(%d), position(%d)\n",
__func__, cur_frame_cnt, *position);
cur_frame_cnt = get_frame_count(itf);
prev_frame_cnt = cur_frame_cnt - frame_diff;
index = (cur_frame_cnt - frame_diff) % EXPECT_DM_NUM;
- *position = sensor_peri->cis.expecting_lens_udm[index].pos;
+ FIMC_BUG(!sensor_peri->actuator);
+ *position = sensor_peri->actuator->expecting_lens_udm[index].pos;
dbg_actuator("%s: cur_frame(%d), prev_frame(%d), prev_position(%d)\n",
__func__, cur_frame_cnt, prev_frame_cnt, *position);
ret = -EINVAL;
goto p_err;
}
+
+ FIMC_BUG(!sensor_peri->actuator);
+
+ if (sensor_peri->actuator->actual_pos_support) {
+ u32 act_pos, index;
+
+ ret = sensor_get_ctrl(itf, V4L2_CID_ACTUATOR_GET_ACTUAL_POSITION, &act_pos);
+ if (ret < 0) {
+ err("Actuator get status fail. ret(%d)", ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+ index = get_frame_count(itf) % EXPECT_DM_NUM;
+ sensor_peri->actuator->expecting_actual_pos[index] = act_pos;
+ }
+
p_err:
return ret;
}
#endif
#include "fimc-is-vender-specific.h"
+static u8 rta_static_data[STATIC_DATA_SIZE];
+static u8 ddk_static_data[STATIC_DATA_SIZE];
+
+u32 get_vc_dma_error_occur_count;
+u32 get_vc_dma_error_frame_count;
+
/* helper functions */
-struct fimc_is_module_enum *get_subdev_module_enum(struct fimc_is_sensor_interface *itf)
+static struct fimc_is_module_enum *get_subdev_module_enum(struct fimc_is_sensor_interface *itf)
{
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct fimc_is_module_enum *module = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri;
if (unlikely(!itf)) {
- err("%s, interface in is NULL", __func__);
- module = NULL;
- goto p_err;
+ err("invalid sensor interface");
+ return NULL;
}
FIMC_BUG_NULL(itf->magic != SENSOR_INTERFACE_MAGIC);
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- FIMC_BUG_NULL(!sensor_peri);
-
- module = sensor_peri->module;
- if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
- module = NULL;
- goto p_err;
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
+ sensor_interface);
+ if (!sensor_peri) {
+ err("failed to get sensor_peri");
+ return NULL;
}
-p_err:
- return module;
+ return sensor_peri->module;
}
static struct fimc_is_device_sensor *get_device_sensor(struct fimc_is_sensor_interface *itf)
{
- struct fimc_is_device_sensor_peri *sensor_peri;
struct fimc_is_module_enum *module;
struct v4l2_subdev *subdev_module;
- struct fimc_is_device_sensor *device;
-
- if (unlikely(!itf)) {
- err("%s, NULL sensor interface", __func__);
- return NULL;
- }
-
- FIMC_BUG_NULL(itf->magic != SENSOR_INTERFACE_MAGIC);
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- module = sensor_peri->module;
+ module = get_subdev_module_enum(itf);
if (unlikely(!module)) {
- err("%s, failed to get sensor_peri's module", __func__);
+ err("failed to get sensor_peri's module");
return NULL;
}
subdev_module = module->subdev;
if (!subdev_module) {
- err("%s, module's subdev was not probed", __func__);
+ err("module's subdev was not probed");
return NULL;
}
- device = v4l2_get_subdev_hostdata(subdev_module);
-
- return device;
+ return (struct fimc_is_device_sensor *)
+ v4l2_get_subdev_hostdata(subdev_module);
}
-struct fimc_is_device_csi *get_subdev_csi(struct fimc_is_sensor_interface *itf)
+static struct fimc_is_device_csi *get_subdev_csi(struct fimc_is_sensor_interface *itf)
{
- struct fimc_is_module_enum *module = NULL;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct v4l2_subdev *subdev_module;
- struct fimc_is_device_csi *csi = NULL;
struct fimc_is_device_sensor *device;
- if (unlikely(!itf)) {
- err("%s, interface in is NULL", __func__);
- csi = NULL;
- goto p_err;
- }
-
- FIMC_BUG_NULL(itf->magic != SENSOR_INTERFACE_MAGIC);
-
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- FIMC_BUG_NULL(!sensor_peri);
-
- module = sensor_peri->module;
- if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
- module = NULL;
- goto p_err;
- }
-
- subdev_module = module->subdev;
- if (!subdev_module) {
- err("module is not probed");
- subdev_module = NULL;
- goto p_err;
- }
-
- device = v4l2_get_subdev_hostdata(subdev_module);
-
- csi = (struct fimc_is_device_csi *)v4l2_get_subdevdata(device->subdev_csi);
- if (unlikely(!csi)) {
- err("%s, csi in is NULL", __func__);
- csi = NULL;
- goto p_err;
+ device = get_device_sensor(itf);
+ if (!device) {
+ err("failed to get sensor device");
+ return NULL;
}
-p_err:
- return csi;
+ return (struct fimc_is_device_csi *)
+ v4l2_get_subdevdata(device->subdev_csi);
}
struct fimc_is_actuator *get_subdev_actuator(struct fimc_is_sensor_interface *itf)
{
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct fimc_is_actuator *actuator = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri;
if (unlikely(!itf)) {
- err("%s, interface in is NULL", __func__);
- actuator = NULL;
- goto p_err;
+ err("invalid sensor interface");
+ return NULL;
}
FIMC_BUG_NULL(itf->magic != SENSOR_INTERFACE_MAGIC);
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- FIMC_BUG_NULL(!sensor_peri);
- if (unlikely(!sensor_peri->subdev_actuator)) {
- err("%s, subdev module in is NULL", __func__);
- actuator = NULL;
- goto p_err;
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
+ sensor_interface);
+ if (!sensor_peri) {
+ err("failed to get sensor_peri");
+ return NULL;
}
- actuator = (struct fimc_is_actuator *)v4l2_get_subdevdata(sensor_peri->subdev_actuator);
- if (unlikely(!actuator)) {
- err("%s, module in is NULL", __func__);
- actuator = NULL;
- goto p_err;
- }
+ return (struct fimc_is_actuator *)
+ v4l2_get_subdevdata(sensor_peri->subdev_actuator);
-p_err:
- return actuator;
}
int sensor_get_ctrl(struct fimc_is_sensor_interface *itf,
struct v4l2_control ctrl;
if (unlikely(!itf)) {
- err("%s, interface in is NULL", __func__);
+ err("interface in is NULL");
ret = -EINVAL;
goto p_err;
}
module = sensor_peri->module;
if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
+ err("module in is NULL");
module = NULL;
goto p_err;
}
device = v4l2_get_subdev_hostdata(subdev_module);
if (unlikely(!device)) {
- err("%s, device in is NULL", __func__);
+ err("device in is NULL");
ret = -EINVAL;
goto p_err;
}
enum itf_cis_interface mode,
enum itf_param_type target,
u32 index,
- u32 long_val,
- u32 short_val)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *val)
{
int ret = 0;
- u32 val[MAX_EXPOSURE_GAIN_PER_FRAME] = {0};
+ int exp_gain_type;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
- if (mode == ITF_CIS_SMIA) {
- val[EXPOSURE_GAIN_INDEX] = long_val;
- val[LONG_EXPOSURE_GAIN_INDEX] = 0;
- val[SHORT_EXPOSURE_GAIN_INDEX] = 0;
- } else if (mode == ITF_CIS_SMIA_WDR) {
- val[EXPOSURE_GAIN_INDEX] = 0;
- val[LONG_EXPOSURE_GAIN_INDEX] = long_val;;
- val[SHORT_EXPOSURE_GAIN_INDEX] = short_val;
- } else {
- pr_err("[%s] invalid mode (%d)\n", __func__, mode);
- ret = -EINVAL;
- goto p_err;
+ if (mode != ITF_CIS_SMIA && mode != ITF_CIS_SMIA_WDR) {
+ err("[%s] invalid mode (%d)\n", __func__, mode);
+ return -EINVAL;
}
if (index >= NUM_FRAMES) {
- pr_err("[%s] invalid frame index (%d)\n", __func__, index);
- ret = -EINVAL;
- goto p_err;
+ err("[%s] invalid frame index (%d)\n", __func__, index);
+ return -EINVAL;
}
- switch (target) {
- case ITF_CIS_PARAM_TOTAL_GAIN:
- itf->total_gain[EXPOSURE_GAIN_INDEX][index] = val[EXPOSURE_GAIN_INDEX];
- itf->total_gain[LONG_EXPOSURE_GAIN_INDEX][index] = val[LONG_EXPOSURE_GAIN_INDEX];
- itf->total_gain[SHORT_EXPOSURE_GAIN_INDEX][index] = val[SHORT_EXPOSURE_GAIN_INDEX];
- dbg_sensor(1, "%s: total gain[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- dbg_sensor(1, "%s: total gain [0]:%d [1]:%d [2]:%d\n", __func__,
- itf->total_gain[LONG_EXPOSURE_GAIN_INDEX][0],
- itf->total_gain[LONG_EXPOSURE_GAIN_INDEX][1],
- itf->total_gain[LONG_EXPOSURE_GAIN_INDEX][2]);
- break;
- case ITF_CIS_PARAM_ANALOG_GAIN:
- itf->analog_gain[EXPOSURE_GAIN_INDEX][index] = val[EXPOSURE_GAIN_INDEX];
- itf->analog_gain[LONG_EXPOSURE_GAIN_INDEX][index] = val[LONG_EXPOSURE_GAIN_INDEX];
- itf->analog_gain[SHORT_EXPOSURE_GAIN_INDEX][index] = val[SHORT_EXPOSURE_GAIN_INDEX];
- dbg_sensor(1, "%s: again[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- dbg_sensor(1, "%s: again [0]:%d [1]:%d [2]:%d\n", __func__,
- itf->analog_gain[LONG_EXPOSURE_GAIN_INDEX][0],
- itf->analog_gain[LONG_EXPOSURE_GAIN_INDEX][1],
- itf->analog_gain[LONG_EXPOSURE_GAIN_INDEX][2]);
- break;
- case ITF_CIS_PARAM_DIGITAL_GAIN:
- itf->digital_gain[EXPOSURE_GAIN_INDEX][index] = val[EXPOSURE_GAIN_INDEX];
- itf->digital_gain[LONG_EXPOSURE_GAIN_INDEX][index] = val[LONG_EXPOSURE_GAIN_INDEX];
- itf->digital_gain[SHORT_EXPOSURE_GAIN_INDEX][index] = val[SHORT_EXPOSURE_GAIN_INDEX];
- dbg_sensor(1, "%s: dgain[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- dbg_sensor(1, "%s: dgain [0]:%d [1]:%d [2]:%d\n", __func__,
- itf->digital_gain[LONG_EXPOSURE_GAIN_INDEX][0],
- itf->digital_gain[LONG_EXPOSURE_GAIN_INDEX][1],
- itf->digital_gain[LONG_EXPOSURE_GAIN_INDEX][2]);
- break;
- case ITF_CIS_PARAM_EXPOSURE:
- itf->exposure[EXPOSURE_GAIN_INDEX][index] = val[EXPOSURE_GAIN_INDEX];
- itf->exposure[LONG_EXPOSURE_GAIN_INDEX][index] = val[LONG_EXPOSURE_GAIN_INDEX];
- itf->exposure[SHORT_EXPOSURE_GAIN_INDEX][index] = val[SHORT_EXPOSURE_GAIN_INDEX];
- dbg_sensor(1, "%s: expo[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- dbg_sensor(1, "%s: expo [0]:%d [1]:%d [2]:%d\n", __func__,
- itf->exposure[LONG_EXPOSURE_GAIN_INDEX][0],
- itf->exposure[LONG_EXPOSURE_GAIN_INDEX][1],
- itf->exposure[LONG_EXPOSURE_GAIN_INDEX][2]);
- break;
- case ITF_CIS_PARAM_FLASH_INTENSITY:
- itf->flash_intensity[index] = long_val;
- break;
- default:
- pr_err("[%s] invalid CIS_SMIA mode (%d)\n", __func__, mode);
- ret = -EINVAL;
- goto p_err;
- break;
+ if (num_data <= EXPOSURE_GAIN_COUNT_INVALID || num_data >= EXPOSURE_GAIN_COUNT_END) {
+ err("[%s] invalid num_data(%d)\n", __func__, num_data);
+ return -EINVAL;
+ }
+
+ for (exp_gain_type = 0; exp_gain_type < num_data; exp_gain_type++) {
+ switch (target) {
+ case ITF_CIS_PARAM_TOTAL_GAIN:
+ itf->total_gain[exp_gain_type][index] = val[exp_gain_type];
+ dbg_sensor(1, "%s: total gain [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->total_gain[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_ANALOG_GAIN:
+ itf->analog_gain[exp_gain_type][index] = val[exp_gain_type];
+ dbg_sensor(1, "%s: again [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->analog_gain[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_DIGITAL_GAIN:
+ itf->digital_gain[exp_gain_type][index] = val[exp_gain_type];
+ dbg_sensor(1, "%s: dgain [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->digital_gain[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_EXPOSURE:
+ itf->exposure[exp_gain_type][index] = val[exp_gain_type];
+ dbg_sensor(1, "%s: exposure [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->exposure[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_FLASH_INTENSITY:
+ itf->flash_intensity[index] = val[exp_gain_type];
+ break;
+ default:
+ err("[%s] invalid target (%d)\n", __func__, target);
+ ret = -EINVAL;
+ goto p_err;
+ }
}
p_err:
enum itf_cis_interface mode,
enum itf_param_type target,
u32 index,
- u32 *long_val,
- u32 *short_val)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *val)
{
- int ret = 0;
- u32 val[MAX_EXPOSURE_GAIN_PER_FRAME] = {0};
+ int exp_gain_type;
FIMC_BUG(!itf);
- FIMC_BUG(!long_val);
- FIMC_BUG(!short_val);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
if (index >= NUM_FRAMES) {
pr_err("[%s] invalid frame index (%d)\n", __func__, index);
- ret = -EINVAL;
- goto p_err;
+ return -EINVAL;
}
- switch (target) {
- case ITF_CIS_PARAM_TOTAL_GAIN:
- val[EXPOSURE_GAIN_INDEX] = itf->total_gain[EXPOSURE_GAIN_INDEX][index];
- val[LONG_EXPOSURE_GAIN_INDEX] = itf->total_gain[LONG_EXPOSURE_GAIN_INDEX][index];
- val[SHORT_EXPOSURE_GAIN_INDEX] = itf->total_gain[SHORT_EXPOSURE_GAIN_INDEX][index];
- dbg_sensor(2, "%s: total gain[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- break;
- case ITF_CIS_PARAM_ANALOG_GAIN:
- val[EXPOSURE_GAIN_INDEX] = itf->analog_gain[EXPOSURE_GAIN_INDEX][index];
- val[LONG_EXPOSURE_GAIN_INDEX] = itf->analog_gain[LONG_EXPOSURE_GAIN_INDEX][index];
- val[SHORT_EXPOSURE_GAIN_INDEX] = itf->analog_gain[SHORT_EXPOSURE_GAIN_INDEX][index];
- dbg_sensor(2, "%s: again[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- break;
- case ITF_CIS_PARAM_DIGITAL_GAIN:
- val[EXPOSURE_GAIN_INDEX] = itf->digital_gain[EXPOSURE_GAIN_INDEX][index];
- val[LONG_EXPOSURE_GAIN_INDEX] = itf->digital_gain[LONG_EXPOSURE_GAIN_INDEX][index];
- val[SHORT_EXPOSURE_GAIN_INDEX] = itf->digital_gain[SHORT_EXPOSURE_GAIN_INDEX][index];
- dbg_sensor(2, "%s: dgain[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- break;
- case ITF_CIS_PARAM_EXPOSURE:
- val[EXPOSURE_GAIN_INDEX] = itf->exposure[EXPOSURE_GAIN_INDEX][index];
- val[LONG_EXPOSURE_GAIN_INDEX] = itf->exposure[LONG_EXPOSURE_GAIN_INDEX][index];
- val[SHORT_EXPOSURE_GAIN_INDEX] = itf->exposure[SHORT_EXPOSURE_GAIN_INDEX][index];
- dbg_sensor(2, "%s: exposure[%d] %d %d %d\n", __func__, index,
- val[EXPOSURE_GAIN_INDEX],
- val[LONG_EXPOSURE_GAIN_INDEX],
- val[SHORT_EXPOSURE_GAIN_INDEX]);
- break;
- case ITF_CIS_PARAM_FLASH_INTENSITY:
- val[EXPOSURE_GAIN_INDEX] = itf->flash_intensity[index];
- val[LONG_EXPOSURE_GAIN_INDEX] = itf->flash_intensity[index];
- break;
- default:
- pr_err("[%s] invalid CIS_SMIA mode (%d)\n", __func__, mode);
- ret = -EINVAL;
- goto p_err;
- break;
+ if (num_data <= EXPOSURE_GAIN_COUNT_INVALID || num_data >= EXPOSURE_GAIN_COUNT_END) {
+ err("[%s] invalid num_data(%d)\n", __func__, num_data);
+ return -EINVAL;
}
- if (mode == ITF_CIS_SMIA) {
- *long_val = val[EXPOSURE_GAIN_INDEX];
- } else if (mode == ITF_CIS_SMIA_WDR) {
- *long_val = val[LONG_EXPOSURE_GAIN_INDEX];
- *short_val = val[SHORT_EXPOSURE_GAIN_INDEX];
- } else {
- pr_err("[%s] invalid mode (%d)\n", __func__, mode);
- ret = -EINVAL;
- goto p_err;
+ for (exp_gain_type = 0; exp_gain_type < num_data; exp_gain_type++) {
+ switch (target) {
+ case ITF_CIS_PARAM_TOTAL_GAIN:
+ val[exp_gain_type] = itf->total_gain[exp_gain_type][index];
+ dbg_sensor(1, "%s: total gain [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->total_gain[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_ANALOG_GAIN:
+ val[exp_gain_type] = itf->analog_gain[exp_gain_type][index];
+ dbg_sensor(1, "%s: again [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->analog_gain[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_DIGITAL_GAIN:
+ val[exp_gain_type] = itf->digital_gain[exp_gain_type][index];
+ dbg_sensor(1, "%s: dgain [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->digital_gain[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_EXPOSURE:
+ val[exp_gain_type] = itf->exposure[exp_gain_type][index];
+ dbg_sensor(1, "%s: exposure [T:%d][I:%d]: %d\n",
+ __func__, exp_gain_type, index,
+ itf->exposure[exp_gain_type][index]);
+ break;
+ case ITF_CIS_PARAM_FLASH_INTENSITY:
+ val[exp_gain_type] = itf->flash_intensity[index];
+ break;
+ default:
+ err("[%s] invalid target (%d)\n", __func__, target);
+ return -EINVAL;
+ }
}
-p_err:
- return ret;
+ return 0;
}
u32 get_vsync_count(struct fimc_is_sensor_interface *itf);
module = sensor_peri->module;
if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
+ err("module in is NULL");
module = NULL;
return 0;
}
device = v4l2_get_subdev_hostdata(subdev_module);
if (unlikely(!device)) {
- err("%s, device in is NULL", __func__);
+ err("device in is NULL");
return 0;
}
u32 *num_of_frame);
int set_exposure(struct fimc_is_sensor_interface *itf,
enum itf_cis_interface mode,
- u32 long_exp,
- u32 short_exp)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure)
{
int ret = 0;
u32 frame_count = 0;
sensor_uctl = get_sensor_uctl_from_module(itf, frame_count + i);
FIMC_BUG(!sensor_uctl);
- /* set exposure */
- sensor_uctl->exposureTime = fimc_is_sensor_convert_us_to_ns(long_exp);
- if (mode == ITF_CIS_SMIA_WDR) {
- sensor_uctl->longExposureTime = fimc_is_sensor_convert_us_to_ns(long_exp);
- sensor_uctl->shortExposureTime = fimc_is_sensor_convert_us_to_ns(short_exp);
- }
+ fimc_is_sensor_ctl_update_exposure_to_uctl(sensor_uctl, num_data, exposure);
+
set_sensor_uctl_valid(itf, frame_count);
}
int set_gain_permile(struct fimc_is_sensor_interface *itf,
enum itf_cis_interface mode,
- u32 long_total_gain, u32 short_total_gain,
- u32 long_analog_gain, u32 short_analog_gain,
- u32 long_digital_gain, u32 short_digital_gain)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *total_gain,
+ u32 *analog_gain,
+ u32 *digital_gain)
{
int ret = 0;
u32 frame_count = 0;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+ FIMC_BUG(!total_gain);
+ FIMC_BUG(!analog_gain);
+ FIMC_BUG(!digital_gain);
frame_count = get_frame_count(itf);
sensor_uctl = get_sensor_uctl_from_module(itf, frame_count + i);
FIMC_BUG(!sensor_uctl);
- /* set exposure */
- if (mode == ITF_CIS_SMIA) {
- sensor_uctl->sensitivity = DIV_ROUND_UP(long_total_gain, 10);
-
- sensor_uctl->analogGain = long_analog_gain;
- sensor_uctl->digitalGain = long_digital_gain;
-
- set_sensor_uctl_valid(itf, frame_count);
- } else if (mode == ITF_CIS_SMIA_WDR) {
- sensor_uctl->sensitivity = DIV_ROUND_UP(long_total_gain, 10);
+ fimc_is_sensor_ctl_update_gain_to_uctl(sensor_uctl, num_data, analog_gain, digital_gain);
- /* Caution: short values are setted at analog/digital gain */
- sensor_uctl->analogGain = short_analog_gain;
- sensor_uctl->digitalGain = short_digital_gain;
- sensor_uctl->longAnalogGain = long_analog_gain;
- sensor_uctl->shortAnalogGain = short_analog_gain;
- sensor_uctl->longDigitalGain = long_digital_gain;
- sensor_uctl->shortDigitalGain = short_digital_gain;
-
- set_sensor_uctl_valid(itf, frame_count);
- } else {
- pr_err("invalid cis interface mode (%d)\n", mode);
- ret = -EINVAL;
- }
+ set_sensor_uctl_valid(itf, frame_count);
}
return ret;
u32 analog_gain,
u32 digital_gain)
{
- int ret = 0;
- u32 i = 0;
- u32 end_index = 0;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
-
- FIMC_BUG(!itf);
- FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
-
- dbg_sensor(1, "[%s] exposure(%d), total_gain(%d), a-gain(%d), d-gain(%d)\n", __func__,
- exposure, total_gain, analog_gain, digital_gain);
-
- itf->vsync_flag = false;
- end_index = itf->otf_flag_3aa == true ? NEXT_NEXT_FRAME_OTF : NEXT_NEXT_FRAME_DMA;
-
- for (i = 0; i <= end_index; i++) {
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_TOTAL_GAIN, i, total_gain, total_gain);
- if (ret < 0)
- pr_err("[%s] set_interface_param TOTAL_GAIN fail(%d)\n", __func__, ret);
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, i, analog_gain, analog_gain);
- if (ret < 0)
- pr_err("[%s] set_interface_param ANALOG_GAIN fail(%d)\n", __func__, ret);
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, i, digital_gain, digital_gain);
- if (ret < 0)
- pr_err("[%s] set_interface_param DIGITAL_GAIN fail(%d)\n", __func__, ret);
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, i, exposure, exposure);
- if (ret < 0)
- pr_err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_FLASH_INTENSITY, i, 0, 0);
- if (ret < 0)
- pr_err("[%s] set_interface_param FLASH_INTENSITY fail(%d)\n", __func__, ret);
- }
-
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- FIMC_BUG(!sensor_peri);
+ /* NOT USED */
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- exposure,
- exposure,
- total_gain, total_gain,
- analog_gain, analog_gain,
- digital_gain, digital_gain);
-
- memset(sensor_peri->cis.cis_data->auto_exposure, 0, sizeof(sensor_peri->cis.cis_data->auto_exposure));
-
- return ret;
+ return 0;
}
int get_calibrated_size(struct fimc_is_sensor_interface *itf,
}
int request_exposure(struct fimc_is_sensor_interface *itf,
- u32 long_exposure,
- u32 short_exposure)
+ enum fimc_is_exposure_gain_count num_data, u32 *exposure)
{
int ret = 0;
u32 i = 0;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
- dbg_sensor(1, "[%s](%d:%d) long_exposure(%d), short_exposure(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf), long_exposure, short_exposure);
+ if (num_data <= EXPOSURE_GAIN_COUNT_INVALID || num_data >= EXPOSURE_GAIN_COUNT_END) {
+ err("[%s] invalid num_data(%d)\n", __func__, num_data);
+ return -EINVAL;
+ }
+
+ dbg_sensor(1, "[%s](%d:%d) cnt(%d): exposure(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ exposure[EXPOSURE_GAIN_LONG],
+ exposure[EXPOSURE_GAIN_SHORT],
+ exposure[EXPOSURE_GAIN_MIDDLE]);
end_index = (itf->otf_flag_3aa == true ? NEXT_NEXT_FRAME_OTF : NEXT_NEXT_FRAME_DMA);
i = (itf->vsync_flag == false ? 0 : end_index);
for (; i <= end_index; i++) {
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, i, long_exposure, short_exposure);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, i, num_data, exposure);
if (ret < 0) {
pr_err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
goto p_err;
/* set exposure */
if (itf->otf_flag_3aa == true) {
- ret = set_exposure(itf, itf->cis_mode, long_exposure, short_exposure);
+ ret = set_exposure(itf, itf->cis_mode, num_data, exposure);
if (ret < 0) {
pr_err("[%s] set_exposure fail(%d)\n", __func__, ret);
goto p_err;
}
if (sensor_peri->cis.use_initial_ae) {
- sensor_peri->cis.last_ae_setting.long_exposure = long_exposure;
- sensor_peri->cis.last_ae_setting.exposure = short_exposure;
+ sensor_peri->cis.last_ae_setting.exposure = exposure[EXPOSURE_GAIN_LONG];
+ sensor_peri->cis.last_ae_setting.long_exposure = exposure[EXPOSURE_GAIN_LONG];
+ sensor_peri->cis.last_ae_setting.short_exposure = exposure[EXPOSURE_GAIN_SHORT];
+ sensor_peri->cis.last_ae_setting.middle_exposure = exposure[EXPOSURE_GAIN_MIDDLE];
}
p_err:
return ret;
}
int adjust_exposure(struct fimc_is_sensor_interface *itf,
- u32 long_exposure,
- u32 short_exposure,
- u32 *available_long_exposure,
- u32 *available_short_exposure,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
+ u32 *available_exposure,
fimc_is_sensor_adjust_direction adjust_direction)
{
/* NOT IMPLEMENTED YET */
}
int get_next_frame_timing(struct fimc_is_sensor_interface *itf,
- u32 *long_exposure,
- u32 *short_exposure,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
u32 *frame_period,
u64 *line_period)
{
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
FIMC_BUG(!itf);
- FIMC_BUG(!long_exposure);
- FIMC_BUG(!short_exposure);
+ FIMC_BUG(!exposure);
FIMC_BUG(!frame_period);
FIMC_BUG(!line_period);
- ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, NEXT_FRAME, long_exposure, short_exposure);
+ ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, NEXT_FRAME, num_data, exposure);
if (ret < 0)
pr_err("[%s] get_interface_param EXPOSURE fail(%d)\n", __func__, ret);
*frame_period = sensor_peri->cis.cis_data->frame_time;
*line_period = sensor_peri->cis.cis_data->line_readOut_time;
- dbg_sensor(2, "%s:(%d:%d) exp(%d, %d), frame_period %d, line_period %lld\n", __func__,
- get_vsync_count(itf), get_frame_count(itf),
- *long_exposure, *short_exposure, *frame_period, *line_period);
+ dbg_sensor(2, "[%s](%d:%d) cnt(%d): exp(L(%d), S(%d), M(%d)), frame_period %d, line_period %lld\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ exposure[EXPOSURE_GAIN_LONG],
+ exposure[EXPOSURE_GAIN_SHORT],
+ exposure[EXPOSURE_GAIN_MIDDLE],
+ *frame_period, *line_period);
return ret;
}
int get_frame_timing(struct fimc_is_sensor_interface *itf,
- u32 *long_exposure,
- u32 *short_exposure,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
u32 *frame_period,
u64 *line_period)
{
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
FIMC_BUG(!itf);
- FIMC_BUG(!long_exposure);
- FIMC_BUG(!short_exposure);
+ FIMC_BUG(!exposure);
FIMC_BUG(!frame_period);
FIMC_BUG(!line_period);
- ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, CURRENT_FRAME, long_exposure, short_exposure);
+ ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, CURRENT_FRAME, num_data, exposure);
if (ret < 0)
pr_err("[%s] get_interface_param EXPOSURE fail(%d)\n", __func__, ret);
*frame_period = sensor_peri->cis.cis_data->frame_time;
*line_period = sensor_peri->cis.cis_data->line_readOut_time;
- dbg_sensor(2, "%s:(%d:%d) exp(%d, %d), frame_period %d, line_period %lld\n", __func__,
- get_vsync_count(itf), get_frame_count(itf),
- *long_exposure, *short_exposure, *frame_period, *line_period);
+ dbg_sensor(2, "[%s](%d:%d) cnt(%d): exp(L(%d), S(%d), M(%d)), frame_period %d, line_period %lld\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ exposure[EXPOSURE_GAIN_LONG],
+ exposure[EXPOSURE_GAIN_SHORT],
+ exposure[EXPOSURE_GAIN_MIDDLE],
+ *frame_period, *line_period);
return ret;
}
int request_analog_gain(struct fimc_is_sensor_interface *itf,
- u32 long_analog_gain,
- u32 short_analog_gain)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain)
{
int ret = 0;
u32 i = 0;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+ FIMC_BUG(!analog_gain);
- dbg_sensor(1, "[%s](%d:%d) long_analog_gain(%d), short_analog_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf), long_analog_gain, short_analog_gain);
+ dbg_sensor(1, "[%s](%d:%d) cnt(%d): analog_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ analog_gain[EXPOSURE_GAIN_LONG],
+ analog_gain[EXPOSURE_GAIN_SHORT],
+ analog_gain[EXPOSURE_GAIN_MIDDLE]);
end_index = (itf->otf_flag_3aa == true ? NEXT_NEXT_FRAME_OTF : NEXT_NEXT_FRAME_DMA);
i = (itf->vsync_flag == false ? 0 : end_index);
for (; i <= end_index; i++) {
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, i, long_analog_gain, short_analog_gain);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, i, num_data, analog_gain);
if (ret < 0) {
pr_err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
goto p_err;
}
int request_gain(struct fimc_is_sensor_interface *itf,
- u32 long_total_gain,
- u32 long_analog_gain,
- u32 long_digital_gain,
- u32 short_total_gain,
- u32 short_analog_gain,
- u32 short_digital_gain)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *total_gain,
+ u32 *analog_gain,
+ u32 *digital_gain)
{
int ret = 0;
u32 i = 0;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
-
- dbg_sensor(1, "[%s](%d:%d) long_total_gain(%d), short_total_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf), long_total_gain, short_total_gain);
- dbg_sensor(1, "[%s](%d:%d) long_analog_gain(%d), short_analog_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf), long_analog_gain, short_analog_gain);
- dbg_sensor(1, "[%s](%d:%d) long_digital_gain(%d), short_digital_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf), long_digital_gain, short_digital_gain);
+ FIMC_BUG(!total_gain);
+ FIMC_BUG(!analog_gain);
+ FIMC_BUG(!digital_gain);
+
+ dbg_sensor(1, "[%s](%d:%d) cnt(%d): total_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ total_gain[EXPOSURE_GAIN_LONG],
+ total_gain[EXPOSURE_GAIN_SHORT],
+ total_gain[EXPOSURE_GAIN_MIDDLE]);
+ dbg_sensor(1, "[%s](%d:%d) cnt(%d): analog_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ analog_gain[EXPOSURE_GAIN_LONG],
+ analog_gain[EXPOSURE_GAIN_SHORT],
+ analog_gain[EXPOSURE_GAIN_MIDDLE]);
+ dbg_sensor(1, "[%s](%d:%d) cnt(%d): digital_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ digital_gain[EXPOSURE_GAIN_LONG],
+ digital_gain[EXPOSURE_GAIN_SHORT],
+ digital_gain[EXPOSURE_GAIN_MIDDLE]);
end_index = (itf->otf_flag_3aa == true ? NEXT_NEXT_FRAME_OTF : NEXT_NEXT_FRAME_DMA);
i = (itf->vsync_flag == false ? 0 : end_index);
for (; i <= end_index; i++) {
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_TOTAL_GAIN, i, long_total_gain, short_total_gain);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_TOTAL_GAIN, i, num_data, total_gain);
if (ret < 0) {
- pr_err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
+ pr_err("[%s] set_interface_param total gain fail(%d)\n", __func__, ret);
goto p_err;
}
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, i, long_analog_gain, short_analog_gain);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, i, num_data, analog_gain);
if (ret < 0) {
- pr_err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
+ pr_err("[%s] set_interface_param analog gain fail(%d)\n", __func__, ret);
goto p_err;
}
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, i, long_digital_gain, short_digital_gain);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, i, num_data, digital_gain);
if (ret < 0) {
- pr_err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
+ pr_err("[%s] set_interface_param digital gain fail(%d)\n", __func__, ret);
goto p_err;
}
}
/* set gain permile */
if (itf->otf_flag_3aa == true) {
- ret = set_gain_permile(itf, itf->cis_mode,
- long_total_gain, short_total_gain,
- long_analog_gain, short_analog_gain,
- long_digital_gain, short_digital_gain);
+ ret = set_gain_permile(itf, itf->cis_mode, num_data,
+ total_gain, analog_gain, digital_gain);
if (ret < 0) {
pr_err("[%s] set_gain_permile fail(%d)\n", __func__, ret);
goto p_err;
}
if (sensor_peri->cis.use_initial_ae) {
- sensor_peri->cis.last_ae_setting.long_analog_gain = long_analog_gain;
- sensor_peri->cis.last_ae_setting.long_digital_gain = long_digital_gain;
- sensor_peri->cis.last_ae_setting.analog_gain = short_analog_gain;
- sensor_peri->cis.last_ae_setting.digital_gain = short_digital_gain;
+ sensor_peri->cis.last_ae_setting.analog_gain = analog_gain[EXPOSURE_GAIN_LONG];
+ sensor_peri->cis.last_ae_setting.digital_gain = digital_gain[EXPOSURE_GAIN_LONG];
+ sensor_peri->cis.last_ae_setting.long_analog_gain = analog_gain[EXPOSURE_GAIN_LONG];
+ sensor_peri->cis.last_ae_setting.long_digital_gain = digital_gain[EXPOSURE_GAIN_LONG];
+ sensor_peri->cis.last_ae_setting.short_analog_gain = analog_gain[EXPOSURE_GAIN_SHORT];
+ sensor_peri->cis.last_ae_setting.short_digital_gain = digital_gain[EXPOSURE_GAIN_SHORT];
+ sensor_peri->cis.last_ae_setting.middle_analog_gain = analog_gain[EXPOSURE_GAIN_MIDDLE];
+ sensor_peri->cis.last_ae_setting.middle_digital_gain = digital_gain[EXPOSURE_GAIN_MIDDLE];
}
p_err:
return ret;
return ret;
}
-
-int adjust_analog_gain(struct fimc_is_sensor_interface *itf,
- u32 desired_long_analog_gain,
- u32 desired_short_analog_gain,
- u32 *actual_long_gain,
- u32 *actual_short_gain,
- fimc_is_sensor_adjust_direction adjust_direction)
+int get_sensor_flag(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control *stat_control_type,
+ u32 *exposure_count)
{
- /* NOT IMPLEMENTED YET */
- int ret = -1;
+ int ret = 0;
+ struct fimc_is_device_sensor *sensor = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ enum fimc_is_ex_mode ex_mode;
- dbg_sensor(1, "[%s] NOT IMPLEMENTED YET\n", __func__);
+ FIMC_BUG(!itf);
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+ FIMC_BUG(!stat_control_type);
+ FIMC_BUG(!exposure_count);
+
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
+ FIMC_BUG(!sensor_peri);
+ FIMC_BUG(!sensor_peri->cis.cis_data);
+
+ sensor = get_device_sensor(itf);
+ if (!sensor) {
+ err("failed to get sensor device");
+ return -ENODEV;
+ }
+
+ if (sensor_peri->cis.cis_data->is_data.wdr_enable) {
+ ex_mode = fimc_is_sensor_g_ex_mode(sensor);
+
+ if (ex_mode == EX_3DHDR) {
+ *stat_control_type = SENSOR_STAT_LSI_3DHDR;
+ *exposure_count = EXPOSURE_GAIN_COUNT_3;
+ } else {
+ *stat_control_type = SENSOR_STAT_NOTHING;
+ *exposure_count = EXPOSURE_GAIN_COUNT_2;
+ }
+ } else {
+ *stat_control_type = SENSOR_STAT_NOTHING;
+ *exposure_count = EXPOSURE_GAIN_COUNT_1;
+ }
+
+ dbg_sensor(1, "[%s] stat_control_type: %d, exposure_count: %d\n", __func__,
+ *stat_control_type, *exposure_count);
return ret;
}
-int get_next_analog_gain(struct fimc_is_sensor_interface *itf,
- u32 *long_analog_gain,
- u32 *short_analog_gain)
+int set_sensor_stat_control_mode_change(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control stat_control_type,
+ void *stat_control)
{
int ret = 0;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
FIMC_BUG(!itf);
- FIMC_BUG(!long_analog_gain);
- FIMC_BUG(!short_analog_gain);
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+ FIMC_BUG(!stat_control);
- ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, NEXT_FRAME, long_analog_gain, short_analog_gain);
- if (ret < 0)
- pr_err("[%s] get_interface_param ANALOG_GAIN fail(%d)\n", __func__, ret);
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
+
+ if (stat_control_type == SENSOR_STAT_LSI_3DHDR)
+ sensor_peri->cis.sensor_stats = stat_control;
+ else
+ sensor_peri->cis.sensor_stats = NULL;
- dbg_sensor(2, "[%s](%d:%d) long_analog_gain(%d), short_analog_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf),
- *long_analog_gain, *short_analog_gain);
+ dbg_sensor(1, "[%s] sensor stat control mode change %s\n", __func__,
+ sensor_peri->cis.sensor_stats ? "Enabled" : "Disabled");
return ret;
}
-int get_analog_gain(struct fimc_is_sensor_interface *itf,
- u32 *long_analog_gain,
- u32 *short_analog_gain)
+int set_sensor_roi_control(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control stat_control_type,
+ void *roi_control)
{
- int ret = 0;
+ u32 frame_count = 0;
+ struct fimc_is_sensor_ctl *sensor_ctl = NULL;
+ u32 num_of_frame = 1;
+ u32 i = 0;
FIMC_BUG(!itf);
- FIMC_BUG(!long_analog_gain);
- FIMC_BUG(!short_analog_gain);
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+ FIMC_BUG(!roi_control);
- ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, CURRENT_FRAME, long_analog_gain, short_analog_gain);
- if (ret < 0)
- pr_err("[%s] get_interface_param ANALOG_GAIN fail(%d)\n", __func__, ret);
+ frame_count = get_frame_count(itf);
+ get_num_of_frame_per_one_3aa(itf, &num_of_frame);
- dbg_sensor(2, "[%s](%d:%d) long_analog_gain(%d), short_analog_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf),
- *long_analog_gain, *short_analog_gain);
+ for (i = 0; i < num_of_frame; i++) {
+ sensor_ctl = get_sensor_ctl_from_module(itf, frame_count + i);
+ BUG_ON(!sensor_ctl);
- return ret;
+ if (stat_control_type == SENSOR_STAT_LSI_3DHDR) {
+ sensor_ctl->roi_control = *(struct roi_setting_t *)roi_control;
+ sensor_ctl->update_roi = true;
+ } else {
+ sensor_ctl->update_roi = false;
+ }
+ }
+
+ dbg_sensor(1, "[%s][F:%d]: %d\n", __func__, frame_count, sensor_ctl->update_3hdr_stat);
+
+ return 0;
}
-int get_next_digital_gain(struct fimc_is_sensor_interface *itf,
- u32 *long_digital_gain,
- u32 *short_digital_gain)
+int set_sensor_stat_control_per_frame(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control stat_control_type,
+ void *stat_control)
{
- int ret = 0;
+ u32 frame_count = 0;
+ struct fimc_is_sensor_ctl *sensor_ctl = NULL;
+ u32 num_of_frame = 1;
+ u32 i = 0;
FIMC_BUG(!itf);
- FIMC_BUG(!long_digital_gain);
- FIMC_BUG(!short_digital_gain);
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+ FIMC_BUG(!stat_control);
- ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, NEXT_FRAME, long_digital_gain, short_digital_gain);
- if (ret < 0)
- pr_err("[%s] get_interface_param DIGITAL_GAIN fail(%d)\n", __func__, ret);
+ frame_count = get_frame_count(itf);
+ get_num_of_frame_per_one_3aa(itf, &num_of_frame);
+
+ for (i = 0; i < num_of_frame; i++) {
+ sensor_ctl = get_sensor_ctl_from_module(itf, frame_count + i);
+ BUG_ON(!sensor_ctl);
+
+ if (stat_control_type == SENSOR_STAT_LSI_3DHDR) {
+ sensor_ctl->stat_control
+ = *(struct sensor_lsi_3hdr_stat_control_per_frame *)stat_control;
+ sensor_ctl->update_3hdr_stat = true;
+ } else {
+ sensor_ctl->update_3hdr_stat = false;
+ }
+ }
+
+ dbg_sensor(1, "[%s][F:%d]: %d\n", __func__, frame_count, sensor_ctl->update_3hdr_stat);
+
+ return 0;
+}
+
+int adjust_analog_gain(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *desired_analog_gain,
+ u32 *actual_gain,
+ fimc_is_sensor_adjust_direction adjust_direction)
+{
+ /* NOT IMPLEMENTED YET */
+ int ret = -1;
- dbg_sensor(2, "[%s](%d:%d) long_digital_gain(%d), short_digital_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf),
- *long_digital_gain, *short_digital_gain);
+ dbg_sensor(1, "[%s] NOT IMPLEMENTED YET\n", __func__);
return ret;
}
-int get_digital_gain(struct fimc_is_sensor_interface *itf,
- u32 *long_digital_gain,
- u32 *short_digital_gain)
+int get_next_analog_gain(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain)
{
int ret = 0;
FIMC_BUG(!itf);
- FIMC_BUG(!long_digital_gain);
- FIMC_BUG(!short_digital_gain);
+ FIMC_BUG(!analog_gain);
- ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, CURRENT_FRAME, long_digital_gain, short_digital_gain);
+ ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, NEXT_FRAME, num_data, analog_gain);
if (ret < 0)
- pr_err("[%s] get_interface_param DIGITAL_GAIN fail(%d)\n", __func__, ret);
+ err("[%s] get_interface_param ANALOG_GAIN fail(%d)\n", __func__, ret);
- dbg_sensor(2, "[%s](%d:%d) long_digital_gain(%d), short_digital_gain(%d)\n", __func__,
- get_vsync_count(itf), get_frame_count(itf),
- *long_digital_gain, *short_digital_gain);
+ dbg_sensor(2, "[%s](%d:%d) cnt(%d): analog_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ analog_gain[EXPOSURE_GAIN_LONG],
+ analog_gain[EXPOSURE_GAIN_SHORT],
+ analog_gain[EXPOSURE_GAIN_MIDDLE]);
return ret;
}
-bool is_actuator_available(struct fimc_is_sensor_interface *itf)
+int get_analog_gain(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain)
+{
+ int ret = 0;
+
+ FIMC_BUG(!itf);
+ FIMC_BUG(!analog_gain);
+
+ ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, CURRENT_FRAME, num_data, analog_gain);
+ if (ret < 0)
+ err("[%s] get_interface_param ANALOG_GAIN fail(%d)\n", __func__, ret);
+
+ dbg_sensor(2, "[%s](%d:%d) cnt(%d): analog_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ analog_gain[EXPOSURE_GAIN_LONG],
+ analog_gain[EXPOSURE_GAIN_SHORT],
+ analog_gain[EXPOSURE_GAIN_MIDDLE]);
+
+ return ret;
+}
+
+int get_next_digital_gain(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *digital_gain)
+{
+ int ret = 0;
+
+ FIMC_BUG(!itf);
+ FIMC_BUG(!digital_gain);
+
+ ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, NEXT_FRAME, num_data, digital_gain);
+ if (ret < 0)
+ err("[%s] get_interface_param DIGITAL_GAIN fail(%d)\n", __func__, ret);
+
+ dbg_sensor(2, "[%s](%d:%d) cnt(%d): digital_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ digital_gain[EXPOSURE_GAIN_LONG],
+ digital_gain[EXPOSURE_GAIN_SHORT],
+ digital_gain[EXPOSURE_GAIN_MIDDLE]);
+
+ return ret;
+}
+
+int get_digital_gain(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *digital_gain)
+{
+ int ret = 0;
+
+ FIMC_BUG(!itf);
+ FIMC_BUG(!digital_gain);
+
+ ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN,
+ CURRENT_FRAME, num_data, digital_gain);
+ if (ret < 0)
+ err("[%s] get_interface_param DIGITAL_GAIN fail(%d)\n", __func__, ret);
+
+ dbg_sensor(2, "[%s](%d:%d) cnt(%d): digital_gain(L(%d), S(%d), M(%d))\n", __func__,
+ get_vsync_count(itf), get_frame_count(itf), num_data,
+ digital_gain[EXPOSURE_GAIN_LONG],
+ digital_gain[EXPOSURE_GAIN_SHORT],
+ digital_gain[EXPOSURE_GAIN_MIDDLE]);
+
+ return ret;
+}
+
+bool is_actuator_available(struct fimc_is_sensor_interface *itf)
{
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
sensor_ctl = get_sensor_ctl_from_module(itf, get_frame_count(itf));
if (sensor_ctl == NULL) {
- err("[%s]: get_sensor_ctl_from_module fail!!\n", __func__);
+ err("get_sensor_ctl_from_module fail!!\n");
return -1;
}
int set_cur_uctl_list(struct fimc_is_sensor_interface *itf)
{
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
-
- FIMC_BUG(!itf);
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- FIMC_BUG(!sensor_peri);
-
- if (fimc_is_vender_wdr_mode_on(sensor_peri->cis.cis_data)) {
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- sensor_peri->cis.cur_sensor_uctrl.longExposureTime,
- sensor_peri->cis.cur_sensor_uctrl.shortExposureTime,
- sensor_peri->cis.cur_sensor_uctrl.sensitivity,
- 0,
- sensor_peri->cis.cur_sensor_uctrl.longAnalogGain,
- sensor_peri->cis.cur_sensor_uctrl.shortAnalogGain,
- sensor_peri->cis.cur_sensor_uctrl.longDigitalGain,
- sensor_peri->cis.cur_sensor_uctrl.shortDigitalGain);
- } else {
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- sensor_peri->cis.cur_sensor_uctrl.exposureTime,
- 0,
- sensor_peri->cis.cur_sensor_uctrl.sensitivity,
- 0,
- sensor_peri->cis.cur_sensor_uctrl.analogGain,
- 0,
- sensor_peri->cis.cur_sensor_uctrl.digitalGain,
- 0);
- }
+ /* NOT USED */
return 0;
}
module = sensor_peri->module;
if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
+ err("module in is NULL");
module = NULL;
goto p_err;
}
}
int request_reset_expo_gain(struct fimc_is_sensor_interface *itf,
- u32 long_expo,
- u32 long_tgain,
- u32 long_again,
- u32 long_dgain,
- u32 short_expo,
- u32 short_tgain,
- u32 short_again,
- u32 short_dgain)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *expo,
+ u32 *tgain,
+ u32 *again,
+ u32 *dgain)
{
int ret = 0;
u32 i = 0;
u32 end_index = 0;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ ae_setting *auto_exposure;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
-
- dbg_sensor(1, "[%s] long exposure(%d), total_gain(%d), a-gain(%d), d-gain(%d)\n", __func__,
- long_expo, long_tgain, long_again, long_dgain);
- dbg_sensor(1, "[%s] short exposure(%d), total_gain(%d), a-gain(%d), d-gain(%d)\n", __func__,
- short_expo, short_tgain, short_again, short_dgain);
+ FIMC_BUG(!expo);
+ FIMC_BUG(!tgain);
+ FIMC_BUG(!again);
+ FIMC_BUG(!dgain);
+
+ dbg_sensor(1, "[%s] cnt(%d): exposure(L(%d), S(%d), M(%d))\n", __func__, num_data,
+ expo[EXPOSURE_GAIN_LONG], expo[EXPOSURE_GAIN_SHORT], expo[EXPOSURE_GAIN_MIDDLE]);
+ dbg_sensor(1, "[%s] cnt(%d): total_gain(L(%d), S(%d), M(%d))\n", __func__, num_data,
+ tgain[EXPOSURE_GAIN_LONG], tgain[EXPOSURE_GAIN_SHORT], tgain[EXPOSURE_GAIN_MIDDLE]);
+ dbg_sensor(1, "[%s] cnt(%d): analog_gain(L(%d), S(%d), M(%d))\n", __func__, num_data,
+ again[EXPOSURE_GAIN_LONG], again[EXPOSURE_GAIN_SHORT], again[EXPOSURE_GAIN_MIDDLE]);
+ dbg_sensor(1, "[%s] cnt(%d): digital_gain(L(%d), S(%d), M(%d))\n", __func__, num_data,
+ dgain[EXPOSURE_GAIN_LONG], dgain[EXPOSURE_GAIN_SHORT], dgain[EXPOSURE_GAIN_MIDDLE]);
end_index = itf->otf_flag_3aa == true ? NEXT_NEXT_FRAME_OTF : NEXT_NEXT_FRAME_DMA;
for (i = 0; i <= end_index; i++) {
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_TOTAL_GAIN, i, long_tgain, short_tgain);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_TOTAL_GAIN, i, num_data, tgain);
if (ret < 0)
- pr_err("[%s] set_interface_param TOTAL_GAIN fail(%d)\n", __func__, ret);
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, i, long_again, short_again);
+ err("[%s] set_interface_param TOTAL_GAIN fail(%d)\n", __func__, ret);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN, i, num_data, again);
if (ret < 0)
- pr_err("[%s] set_interface_param ANALOG_GAIN fail(%d)\n", __func__, ret);
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, i, long_dgain, short_dgain);
+ err("[%s] set_interface_param ANALOG_GAIN fail(%d)\n", __func__, ret);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN, i, num_data, dgain);
if (ret < 0)
- pr_err("[%s] set_interface_param DIGITAL_GAIN fail(%d)\n", __func__, ret);
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, i, long_expo, short_expo);
+ err("[%s] set_interface_param DIGITAL_GAIN fail(%d)\n", __func__, ret);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE, i, num_data, expo);
if (ret < 0)
- pr_err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
+ err("[%s] set_interface_param EXPOSURE fail(%d)\n", __func__, ret);
}
itf->vsync_flag = true;
sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
FIMC_BUG(!sensor_peri);
- fimc_is_sensor_set_cis_uctrl_list(sensor_peri,
- long_expo,
- short_expo,
- long_tgain, short_tgain,
- long_again, short_again,
- long_dgain, short_dgain);
-
- memset(sensor_peri->cis.cis_data->auto_exposure, 0, sizeof(sensor_peri->cis.cis_data->auto_exposure));
-
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].exposure = long_expo;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].analog_gain = long_again;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].digital_gain = long_dgain;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].long_exposure = long_expo;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].long_analog_gain = long_again;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].long_digital_gain = long_dgain;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].short_exposure = short_expo;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].short_analog_gain = short_again;
- sensor_peri->cis.cis_data->auto_exposure[CURRENT_FRAME].short_digital_gain = short_dgain;
-
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].exposure = long_expo;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].analog_gain = long_again;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].digital_gain = long_dgain;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].long_exposure = long_expo;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].long_analog_gain = long_again;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].long_digital_gain = long_dgain;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].short_exposure = short_expo;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].short_analog_gain = short_again;
- sensor_peri->cis.cis_data->auto_exposure[NEXT_FRAME].short_digital_gain = short_dgain;
+ fimc_is_sensor_set_cis_uctrl_list(sensor_peri, num_data, expo, tgain, again, dgain);
+
+ auto_exposure = sensor_peri->cis.cis_data->auto_exposure;
+ memset(auto_exposure, 0, sizeof(sensor_peri->cis.cis_data->auto_exposure));
+
+ switch (num_data) {
+ case EXPOSURE_GAIN_COUNT_1:
+ auto_exposure[CURRENT_FRAME].exposure = expo[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].analog_gain = again[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].digital_gain = dgain[EXPOSURE_GAIN_LONG];
+ break;
+ case EXPOSURE_GAIN_COUNT_2:
+ auto_exposure[CURRENT_FRAME].long_exposure = expo[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].long_analog_gain = again[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].long_digital_gain = dgain[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].short_exposure = expo[EXPOSURE_GAIN_SHORT];
+ auto_exposure[CURRENT_FRAME].short_analog_gain = again[EXPOSURE_GAIN_SHORT];
+ auto_exposure[CURRENT_FRAME].short_digital_gain = dgain[EXPOSURE_GAIN_SHORT];
+ break;
+ case EXPOSURE_GAIN_COUNT_3:
+ auto_exposure[CURRENT_FRAME].long_exposure = expo[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].long_analog_gain = again[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].long_digital_gain = dgain[EXPOSURE_GAIN_LONG];
+ auto_exposure[CURRENT_FRAME].short_exposure = expo[EXPOSURE_GAIN_SHORT];
+ auto_exposure[CURRENT_FRAME].short_analog_gain = again[EXPOSURE_GAIN_SHORT];
+ auto_exposure[CURRENT_FRAME].short_digital_gain = dgain[EXPOSURE_GAIN_SHORT];
+ auto_exposure[CURRENT_FRAME].middle_exposure = expo[EXPOSURE_GAIN_MIDDLE];
+ auto_exposure[CURRENT_FRAME].middle_analog_gain = again[EXPOSURE_GAIN_MIDDLE];
+ auto_exposure[CURRENT_FRAME].middle_digital_gain = dgain[EXPOSURE_GAIN_MIDDLE];
+ break;
+ default:
+ err("[%s] invalid exp_gain_count(%d)\n", __func__, num_data);
+ }
+
+ memcpy(&auto_exposure[NEXT_FRAME], &auto_exposure[CURRENT_FRAME], sizeof(auto_exposure[NEXT_FRAME]));
return ret;
}
int set_sensor_info_mode_change(struct fimc_is_sensor_interface *itf,
- u32 long_expo,
- u32 long_again,
- u32 long_dgain,
- u32 expo,
- u32 again,
- u32 dgain)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *expo,
+ u32 *again,
+ u32 *dgain)
{
int ret = 0;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ ae_setting *mode_chg;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
+ mode_chg = &sensor_peri->cis.mode_chg;
- sensor_peri->cis.mode_chg_expo = expo;
- sensor_peri->cis.mode_chg_again = again;
- sensor_peri->cis.mode_chg_dgain = dgain;
- sensor_peri->cis.mode_chg_long_expo = long_expo;
- sensor_peri->cis.mode_chg_long_again = long_again;
- sensor_peri->cis.mode_chg_long_dgain = long_dgain;
-
- dbg_sensor(1, "[%s] mode_chg_expo(%d), again(%d), dgain(%d)\n", __func__,
- sensor_peri->cis.mode_chg_expo,
- sensor_peri->cis.mode_chg_again,
- sensor_peri->cis.mode_chg_dgain);
- dbg_sensor(1, "[%s] mode_chg_long_expo(%d), long_again(%d), long_dgain(%d)\n", __func__,
- sensor_peri->cis.mode_chg_long_expo,
- sensor_peri->cis.mode_chg_long_again,
- sensor_peri->cis.mode_chg_long_dgain);
+ memset(mode_chg, 0, sizeof(ae_setting));
+
+ sensor_peri->cis.exp_gain_cnt = num_data;
+
+ switch (num_data) {
+ case EXPOSURE_GAIN_COUNT_1:
+ mode_chg->exposure = expo[EXPOSURE_GAIN_LONG];
+ mode_chg->analog_gain = again[EXPOSURE_GAIN_LONG];
+ mode_chg->digital_gain = dgain[EXPOSURE_GAIN_LONG];
+ break;
+ case EXPOSURE_GAIN_COUNT_2:
+ mode_chg->long_exposure = expo[EXPOSURE_GAIN_LONG];
+ mode_chg->long_analog_gain = again[EXPOSURE_GAIN_LONG];
+ mode_chg->long_digital_gain = dgain[EXPOSURE_GAIN_LONG];
+ mode_chg->short_exposure = expo[EXPOSURE_GAIN_SHORT];
+ mode_chg->short_analog_gain = again[EXPOSURE_GAIN_SHORT];
+ mode_chg->short_digital_gain = dgain[EXPOSURE_GAIN_SHORT];
+ break;
+ case EXPOSURE_GAIN_COUNT_3:
+ mode_chg->long_exposure = expo[EXPOSURE_GAIN_LONG];
+ mode_chg->long_analog_gain = again[EXPOSURE_GAIN_LONG];
+ mode_chg->long_digital_gain = dgain[EXPOSURE_GAIN_LONG];
+ mode_chg->short_exposure = expo[EXPOSURE_GAIN_SHORT];
+ mode_chg->short_analog_gain = again[EXPOSURE_GAIN_SHORT];
+ mode_chg->short_digital_gain = dgain[EXPOSURE_GAIN_SHORT];
+ mode_chg->middle_exposure = expo[EXPOSURE_GAIN_MIDDLE];
+ mode_chg->middle_analog_gain = again[EXPOSURE_GAIN_MIDDLE];
+ mode_chg->middle_digital_gain = dgain[EXPOSURE_GAIN_MIDDLE];
+ break;
+ default:
+ err("[%s] invalid exp_gain_count(%d)\n", __func__, num_data);
+ }
+
+ dbg_sensor(1, "[%s] cnt(%d): exposure(L(%d), S(%d), M(%d))\n", __func__, num_data,
+ expo[EXPOSURE_GAIN_LONG], expo[EXPOSURE_GAIN_SHORT], expo[EXPOSURE_GAIN_MIDDLE]);
+ dbg_sensor(1, "[%s] cnt(%d): analog_gain(L(%d), S(%d), M(%d))\n", __func__, num_data,
+ again[EXPOSURE_GAIN_LONG], again[EXPOSURE_GAIN_SHORT], again[EXPOSURE_GAIN_MIDDLE]);
+ dbg_sensor(1, "[%s] cnt(%d): digital_gain(L(%d), S(%d), M(%d))\n", __func__, num_data,
+ dgain[EXPOSURE_GAIN_LONG], dgain[EXPOSURE_GAIN_SHORT], dgain[EXPOSURE_GAIN_MIDDLE]);
return ret;
}
else
dm->sensor.rollingShutterSkew = sensor_peri->cis.cis_data->rolling_shutter_skew;
- dbg_sensor(1, "[%s]: expo(%lld), duration(%lld), sensitivity(%d), rollingShutterSkew(%lld)\n",
- __func__, dm->sensor.exposureTime,
- dm->sensor.frameDuration,
- dm->sensor.sensitivity,
- dm->sensor.rollingShutterSkew);
+ udm->sensor.analogGain = sensor_peri->cis.expecting_sensor_udm[index].analogGain;
+ udm->sensor.digitalGain = sensor_peri->cis.expecting_sensor_udm[index].digitalGain;
+ udm->sensor.longExposureTime = sensor_peri->cis.expecting_sensor_udm[index].longExposureTime;
+ udm->sensor.shortExposureTime = sensor_peri->cis.expecting_sensor_udm[index].shortExposureTime;
+ udm->sensor.middleExposureTime = sensor_peri->cis.expecting_sensor_udm[index].middleExposureTime;
+ udm->sensor.longAnalogGain = sensor_peri->cis.expecting_sensor_udm[index].longAnalogGain;
+ udm->sensor.shortAnalogGain = sensor_peri->cis.expecting_sensor_udm[index].shortAnalogGain;
+ udm->sensor.middleAnalogGain = sensor_peri->cis.expecting_sensor_udm[index].middleAnalogGain;
+ udm->sensor.longDigitalGain = sensor_peri->cis.expecting_sensor_udm[index].longDigitalGain;
+ udm->sensor.shortDigitalGain = sensor_peri->cis.expecting_sensor_udm[index].shortDigitalGain;
+ udm->sensor.middleDigitalGain = sensor_peri->cis.expecting_sensor_udm[index].middleDigitalGain;
+
+ dbg_sensor(1, "[%s] (F:%d): expo(%lld), duration(%lld), sensitivity(%d), rollingShutterSkew(%lld)\n",
+ __func__, frame_count,
+ dm->sensor.exposureTime,
+ dm->sensor.frameDuration,
+ dm->sensor.sensitivity,
+ dm->sensor.rollingShutterSkew);
+ dbg_sensor(1, "[%s] (F:%d): udm_expo(L(%lld), S(%lld), M(%lld))\n",
+ __func__, frame_count,
+ udm->sensor.longExposureTime,
+ udm->sensor.shortExposureTime,
+ udm->sensor.middleExposureTime);
+ dbg_sensor(1, "[%s] (F:%d): udm_dgain(L(%lld), S(%lld), M(%lld))\n",
+ __func__, frame_count,
+ udm->sensor.longDigitalGain,
+ udm->sensor.shortDigitalGain,
+ udm->sensor.middleDigitalGain);
+ dbg_sensor(1, "[%s] (F:%d): udm_again(L(%lld), S(%lld), M(%lld))\n",
+ __func__, frame_count,
+ udm->sensor.longAnalogGain,
+ udm->sensor.shortAnalogGain,
+ udm->sensor.middleAnalogGain);
return ret;
}
sensor_ctl->is_sensor_request = false;
if (shot != NULL) {
-#if defined(CONFIG_CAMERA_PDP)
cis_data->is_data.paf_mode = shot->uctl.isModeUd.paf_mode;
cis_data->is_data.wdr_mode = shot->uctl.isModeUd.wdr_mode;
cis_data->is_data.disparity_mode = shot->uctl.isModeUd.disparity_mode;
-#endif
+
sensor_ctl->ctl_frame_number = shot->dm.request.frameCount;
sensor_ctl->cur_cam20_sensor_ctrl = shot->ctl.sensor;
if (sensor_peri->subdev_ois) {
else
itf->cis_mode = ITF_CIS_SMIA;
+ if (shot->uctl.cameraMode == AA_CAMERAMODE_DUAL_SYNC
+ || shot->uctl.cameraMode == AA_CAMERAMODE_DUAL_SYNC_SAME_TIME_CONTROL)
+ cis_data->dual_sync_enable = true;
+ else
+ cis_data->dual_sync_enable = false;
+
/* set frame rate : Limit of max frame duration
* Frame duration is set by
* 1. Manual sensor control
module = sensor_peri->module;
if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
+ err("module in is NULL");
module = NULL;
goto p_err;
}
module = sensor_peri->module;
if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
+ err("module in is NULL");
module = NULL;
goto p_err;
}
FIMC_BUG(!sensor_peri);
if (mode > 1) {
- err("ERR[%s] invalid mode(%d)\n", __func__, mode);
+ err("invalid mode(%d)\n", mode);
return -1;
}
}
int get_initial_exposure_gain_of_sensor(struct fimc_is_sensor_interface *itf,
- u32 *long_expo,
- u32 *long_again,
- u32 *long_dgain,
- u32 *short_expo,
- u32 *short_again,
- u32 *short_dgain)
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *expo,
+ u32 *again,
+ u32 *dgain)
{
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ int i;
if (!itf) {
err("[%s] fimc_is_sensor_interface is NULL", __func__);
}
if (sensor_peri->cis.use_initial_ae) {
- *long_expo = sensor_peri->cis.init_ae_setting.long_exposure;
- *long_again = sensor_peri->cis.init_ae_setting.long_analog_gain;
- *long_dgain = sensor_peri->cis.init_ae_setting.long_digital_gain;
- *short_expo = sensor_peri->cis.init_ae_setting.exposure;
- *short_again = sensor_peri->cis.init_ae_setting.analog_gain;
- *short_dgain = sensor_peri->cis.init_ae_setting.digital_gain;
+ switch (num_data) {
+ case EXPOSURE_GAIN_COUNT_1:
+ expo[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.exposure;
+ again[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.analog_gain;
+ dgain[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.digital_gain;
+ break;
+ case EXPOSURE_GAIN_COUNT_2:
+ expo[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.long_exposure;
+ again[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.long_analog_gain;
+ dgain[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.long_digital_gain;
+ expo[EXPOSURE_GAIN_SHORT] = sensor_peri->cis.init_ae_setting.short_exposure;
+ again[EXPOSURE_GAIN_SHORT] = sensor_peri->cis.init_ae_setting.short_analog_gain;
+ dgain[EXPOSURE_GAIN_SHORT] = sensor_peri->cis.init_ae_setting.short_digital_gain;
+ expo[EXPOSURE_GAIN_MIDDLE] = sensor_peri->cis.init_ae_setting.middle_exposure;
+ again[EXPOSURE_GAIN_MIDDLE] = sensor_peri->cis.init_ae_setting.middle_analog_gain;
+ dgain[EXPOSURE_GAIN_MIDDLE] = sensor_peri->cis.init_ae_setting.middle_digital_gain;
+ break;
+ case EXPOSURE_GAIN_COUNT_3:
+ expo[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.long_exposure;
+ again[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.long_analog_gain;
+ dgain[EXPOSURE_GAIN_LONG] = sensor_peri->cis.init_ae_setting.long_digital_gain;
+ expo[EXPOSURE_GAIN_SHORT] = sensor_peri->cis.init_ae_setting.short_exposure;
+ again[EXPOSURE_GAIN_SHORT] = sensor_peri->cis.init_ae_setting.short_analog_gain;
+ dgain[EXPOSURE_GAIN_SHORT] = sensor_peri->cis.init_ae_setting.short_digital_gain;
+ break;
+ default:
+ err("[%s] wrong exp_gain_count(%d)\n", __func__, num_data);
+ }
} else {
- *long_expo = sensor_peri->cis.cis_data->low_expo_start;
- *long_again = 1000;
- *long_dgain = 1000;
- *short_expo = sensor_peri->cis.cis_data->low_expo_start;
- *short_again = 1000;
- *short_dgain = 1000;
- dbg_sensor(1, "%s: called at not enabled last_ae, use default low exposure setting", __func__);
+ for (i = 0; i < num_data; i++)
+ expo[i] = again[i] = dgain[i] = 0;
+ dbg_sensor(1, "%s: called at not enabled last_ae, set to 0", __func__);
}
- dbg_sensor(1, "%s: sensorid(%d),long(%d-%d-%d), shot(%d-%d-%d)\n", __func__,
+ dbg_sensor(1, "%s: sensorid(%d),long(%d-%d-%d), shot(%d-%d-%d), middle(%d-%d-%d)\n", __func__,
sensor_peri->module->sensor_id,
- *long_expo, *long_again, *long_dgain, *short_expo, *short_again, *short_dgain);
+ expo[EXPOSURE_GAIN_LONG], again[EXPOSURE_GAIN_LONG], dgain[EXPOSURE_GAIN_LONG],
+ (num_data >= 2) ? expo[EXPOSURE_GAIN_SHORT] : 0,
+ (num_data >= 2) ? again[EXPOSURE_GAIN_SHORT] : 0,
+ (num_data >= 2) ? dgain[EXPOSURE_GAIN_SHORT] : 0,
+ (num_data == 3) ? expo[EXPOSURE_GAIN_MIDDLE] : 0,
+ (num_data == 3) ? again[EXPOSURE_GAIN_MIDDLE] : 0,
+ (num_data == 3) ? dgain[EXPOSURE_GAIN_MIDDLE] : 0);
return 0;
}
for (i = 0; i < end_index; i++) {
if (itf->cis_mode == ITF_CIS_SMIA) {
- itf->total_gain[EXPOSURE_GAIN_INDEX][i] = itf->total_gain[EXPOSURE_GAIN_INDEX][i + 1];
- itf->analog_gain[EXPOSURE_GAIN_INDEX][i] = itf->analog_gain[EXPOSURE_GAIN_INDEX][i + 1];
- itf->digital_gain[EXPOSURE_GAIN_INDEX][i] = itf->digital_gain[EXPOSURE_GAIN_INDEX][i + 1];
- itf->exposure[EXPOSURE_GAIN_INDEX][i] = itf->exposure[EXPOSURE_GAIN_INDEX][i + 1];
+ itf->total_gain[EXPOSURE_GAIN_LONG][i] = itf->total_gain[EXPOSURE_GAIN_LONG][i + 1];
+ itf->analog_gain[EXPOSURE_GAIN_LONG][i] = itf->analog_gain[EXPOSURE_GAIN_LONG][i + 1];
+ itf->digital_gain[EXPOSURE_GAIN_LONG][i] = itf->digital_gain[EXPOSURE_GAIN_LONG][i + 1];
+ itf->exposure[EXPOSURE_GAIN_LONG][i] = itf->exposure[EXPOSURE_GAIN_LONG][i + 1];
} else if (itf->cis_mode == ITF_CIS_SMIA_WDR){
- itf->total_gain[LONG_EXPOSURE_GAIN_INDEX][i] = itf->total_gain[LONG_EXPOSURE_GAIN_INDEX][i + 1];
- itf->total_gain[SHORT_EXPOSURE_GAIN_INDEX][i] = itf->total_gain[SHORT_EXPOSURE_GAIN_INDEX][i + 1];
- itf->analog_gain[LONG_EXPOSURE_GAIN_INDEX][i] = itf->analog_gain[LONG_EXPOSURE_GAIN_INDEX][i + 1];
- itf->analog_gain[SHORT_EXPOSURE_GAIN_INDEX][i] = itf->analog_gain[SHORT_EXPOSURE_GAIN_INDEX][i + 1];
- itf->digital_gain[LONG_EXPOSURE_GAIN_INDEX][i] = itf->digital_gain[LONG_EXPOSURE_GAIN_INDEX][i + 1];
- itf->digital_gain[SHORT_EXPOSURE_GAIN_INDEX][i] = itf->digital_gain[SHORT_EXPOSURE_GAIN_INDEX][i + 1];
- itf->exposure[LONG_EXPOSURE_GAIN_INDEX][i] = itf->exposure[LONG_EXPOSURE_GAIN_INDEX][i + 1];
- itf->exposure[SHORT_EXPOSURE_GAIN_INDEX][i] = itf->exposure[SHORT_EXPOSURE_GAIN_INDEX][i + 1];
+ itf->total_gain[EXPOSURE_GAIN_LONG][i] = itf->total_gain[EXPOSURE_GAIN_LONG][i + 1];
+ itf->total_gain[EXPOSURE_GAIN_SHORT][i] = itf->total_gain[EXPOSURE_GAIN_SHORT][i + 1];
+ itf->total_gain[EXPOSURE_GAIN_MIDDLE][i] = itf->total_gain[EXPOSURE_GAIN_MIDDLE][i + 1];
+ itf->analog_gain[EXPOSURE_GAIN_LONG][i] = itf->analog_gain[EXPOSURE_GAIN_LONG][i + 1];
+ itf->analog_gain[EXPOSURE_GAIN_SHORT][i] = itf->analog_gain[EXPOSURE_GAIN_SHORT][i + 1];
+ itf->analog_gain[EXPOSURE_GAIN_MIDDLE][i] = itf->analog_gain[EXPOSURE_GAIN_MIDDLE][i + 1];
+ itf->digital_gain[EXPOSURE_GAIN_LONG][i] = itf->digital_gain[EXPOSURE_GAIN_LONG][i + 1];
+ itf->digital_gain[EXPOSURE_GAIN_SHORT][i] = itf->digital_gain[EXPOSURE_GAIN_SHORT][i + 1];
+ itf->digital_gain[EXPOSURE_GAIN_MIDDLE][i] = itf->digital_gain[EXPOSURE_GAIN_MIDDLE][i + 1];
+ itf->exposure[EXPOSURE_GAIN_LONG][i] = itf->exposure[EXPOSURE_GAIN_LONG][i + 1];
+ itf->exposure[EXPOSURE_GAIN_SHORT][i] = itf->exposure[EXPOSURE_GAIN_SHORT][i + 1];
+ itf->exposure[EXPOSURE_GAIN_MIDDLE][i] = itf->exposure[EXPOSURE_GAIN_MIDDLE][i + 1];
} else {
pr_err("[%s] in valid cis_mode (%d)\n", __func__, itf->cis_mode);
ret = -EINVAL;
itf->flash_firing_duration[i] = 0;
/* Flash setting */
- ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_FLASH_INTENSITY, end_index, 0, 0);
+ ret = set_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_FLASH_INTENSITY,
+ end_index, 1, &itf->flash_intensity[end_index]);
if (ret < 0)
pr_err("[%s] set_interface_param FLASH_INTENSITY fail(%d)\n", __func__, ret);
/* TODO */
{
int ret = 0;
u32 end_index = 0;
- u32 long_total_gain = 0;
- u32 short_total_gain = 0;
- u32 long_analog_gain = 0;
- u32 short_analog_gain = 0;
- u32 long_digital_gain = 0;
- u32 short_digital_gain = 0;
- u32 long_exposure = 0;
- u32 short_exposure = 0;
+ u32 total_gain[EXPOSURE_GAIN_MAX];
+ u32 analog_gain[EXPOSURE_GAIN_MAX];
+ u32 digital_gain[EXPOSURE_GAIN_MAX];
+ u32 exposure[EXPOSURE_GAIN_MAX];
+ enum fimc_is_exposure_gain_count num_data;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
/* TODO: sensor timing test */
if (itf->otf_flag_3aa == false) {
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
+ FIMC_BUG(!sensor_peri);
+
+ num_data = sensor_peri->cis.exp_gain_cnt;
+
/* set gain */
ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_TOTAL_GAIN,
- end_index, &long_total_gain, &short_total_gain);
+ end_index, num_data, total_gain);
if (ret < 0)
pr_err("[%s] get TOTAL_GAIN fail(%d)\n", __func__, ret);
ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_ANALOG_GAIN,
- end_index, &long_analog_gain, &short_analog_gain);
+ end_index, num_data, analog_gain);
if (ret < 0)
pr_err("[%s] get ANALOG_GAIN fail(%d)\n", __func__, ret);
ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_DIGITAL_GAIN,
- end_index, &long_digital_gain, &short_digital_gain);
+ end_index, num_data, digital_gain);
if (ret < 0)
pr_err("[%s] get DIGITAL_GAIN fail(%d)\n", __func__, ret);
- ret = set_gain_permile(itf, itf->cis_mode,
- long_total_gain, short_total_gain,
- long_analog_gain, short_analog_gain,
- long_digital_gain, short_digital_gain);
+ ret = set_gain_permile(itf, itf->cis_mode, num_data,
+ total_gain, analog_gain, digital_gain);
if (ret < 0) {
pr_err("[%s] set_gain_permile fail(%d)\n", __func__, ret);
goto p_err;
/* set exposure */
ret = get_interface_param(itf, itf->cis_mode, ITF_CIS_PARAM_EXPOSURE,
- end_index, &long_exposure, &short_exposure);
+ end_index, num_data, exposure);
if (ret < 0)
pr_err("[%s] get EXPOSURE fail(%d)\n", __func__, ret);
- ret = set_exposure(itf, itf->cis_mode, long_exposure, short_exposure);
+ ret = set_exposure(itf, itf->cis_mode, num_data, exposure);
if (ret < 0) {
pr_err("[%s] set_exposure fail(%d)\n", __func__, ret);
goto p_err;
/* NOT IMPLEMENTED YET */
int ret = -1;
- err("[%s] NOT IMPLEMENTED YET\n", __func__);
+ err("NOT IMPLEMENTED YET\n");
return ret;
}
dbg_aperture("[%s] aperture value(%d)\n", __func__, value);
- sensor_peri->aperture->start_value = value;
-
- if (value != sensor_peri->aperture->cur_value) {
- sensor_peri->aperture->new_value = value;
- sensor_peri->aperture->step = APERTURE_STEP_PREPARE;
+ if (sensor_peri->mcu && sensor_peri->mcu->aperture) {
+ if (value != sensor_peri->mcu->aperture->cur_value) {
+ sensor_peri->mcu->aperture->new_value = value;
+ sensor_peri->mcu->aperture->step = APERTURE_STEP_PREPARE;
+ }
}
return ret;
int get_aperture_value(struct fimc_is_sensor_interface *itf, struct fimc_is_apature_info_t *param)
{
int ret = 0;
+ int aperture_value = 0;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
struct fimc_is_module_enum *module = NULL;
struct v4l2_subdev *subdev_module = NULL;
specific = core->vender.private_data;
WARN_ON(!specific);
- param->cur_value = sensor_peri->aperture->cur_value;
+ if (sensor_peri->mcu && sensor_peri->mcu->aperture)
+ aperture_value = sensor_peri->mcu->aperture->cur_value;
+ else
+ aperture_value = 0;
+
+ param->cur_value = aperture_value;
param->zoom_running = specific->zoom_running;
dbg_aperture("[%s] aperture value(%d), zoom_running(%d)\n",
- __func__, sensor_peri->aperture->cur_value, specific->zoom_running);
+ __func__, aperture_value, specific->zoom_running);
return ret;
}
flash_uctl = &sensor_ctl->cur_cam20_flash_udctrl;
sensor_ctl->flash_frame_number = frame_count;
-
+#ifdef FLASH_CAL_DATA_ENABLE
+ /* when use dual flash control, intensity value is ratio between warm and cool LED */
+ {
+#else
+ /* when use single flash, intensity value zero means flash off */
if (intensity == 0) {
mode = CAM2_FLASH_MODE_OFF;
} else {
+#endif
switch (flash_mode) {
case CAM2_FLASH_MODE_OFF:
case CAM2_FLASH_MODE_SINGLE:
int get_vc_dma_buf(struct fimc_is_sensor_interface *itf,
enum itf_vc_buf_data_type request_data_type,
+ u32 frame_count,
u32 *buf_index,
- u64 *buf_addr,
- u32 *frame_count)
+ u64 *buf_addr)
{
struct fimc_is_device_sensor *sensor;
struct fimc_is_device_csi *csi;
struct fimc_is_framemgr *framemgr;
struct fimc_is_frame *frame;
struct fimc_is_subdev *subdev;
- struct v4l2_control ctrl;
unsigned long flags;
- int ret = -1;
- int ch = 0;
- u32 cur_frameptr, frameptr;
+ int ret;
+ int ch;
- WARN_ON(!itf);
- WARN_ON(!frame_count);
WARN_ON(!buf_addr);
WARN_ON(!buf_index);
- *frame_count = 0;
*buf_addr = 0;
*buf_index = 0;
sensor = get_device_sensor(itf);
if (!sensor) {
- err("%s, failed to get sensor device", __func__);
+ err("failed to get sensor device");
return -ENODEV;
}
switch (request_data_type) {
case VC_BUF_DATA_TYPE_SENSOR_STAT1:
- for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
if (sensor->cfg->output[ch].type == VC_TAILPDAF)
break;
}
break;
+ case VC_BUF_DATA_TYPE_SENSOR_STAT2:
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_EMBEDDED)
+ break;
+ }
+ break;
case VC_BUF_DATA_TYPE_GENERAL_STAT1:
- for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_PRIVATE)
+ break;
+ }
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
if (sensor->cfg->output[ch].type == VC_MIPISTAT)
break;
}
break;
default:
- err("%s, invalid data type(%d)", __func__, request_data_type);
+ err("invalid data type(%d)", request_data_type);
return -EINVAL;
}
- if (ch == CSI_VIRTUAL_CH_0 || ch == CSI_VIRTUAL_CH_MAX) {
- err("mipi stat vc not exist");
+ if (ch == CSI_VIRTUAL_CH_MAX) {
+ err("requested stat. type(%d) is not supported with current config",
+ request_data_type);
return -EINVAL;
}
framemgr = get_csi_vc_framemgr(csi, ch);
-
if (!framemgr) {
err("failed to get framemgr");
return -ENXIO;
}
subdev = csi->dma_subdev[ch];
- FIMC_BUG(!subdev);
framemgr_e_barrier_irqs(framemgr, FMGR_IDX_30, flags);
if (!framemgr->frames) {
- framemgr_x_barrier_irqr(framemgr, FMGR_IDX_30, flags);
merr("framemgr was already closed", sensor);
- return -EINVAL;
+ ret = -EINVAL;
+ goto err_get_framemgr;
}
- /* get frame current frameptr - 1 */
- ctrl.id = V4L2_CID_IS_G_VC1_FRAMEPTR + (ch - 1);
- ret = v4l2_subdev_call(sensor->subdev_csi, core, g_ctrl, &ctrl);
- if (ret) {
- err("csi_g_ctrl fail");
- framemgr_x_barrier_irqr(framemgr, FMGR_IDX_30, flags);
- return -EINVAL;
+ if (frame_count < get_vc_dma_error_frame_count) {
+ get_vc_dma_error_frame_count = 0;
+ get_vc_dma_error_occur_count = 0;
}
- cur_frameptr = ctrl.value;
- /* set return buffer offset */
- if (subdev->vc_buffer_offset)
- frameptr = CSI_GET_PREV_FRAMEPTR(cur_frameptr, framemgr->num_frames, subdev->vc_buffer_offset);
- else
- frameptr = ctrl.value;
- frame = &framemgr->frames[frameptr];
+ frame = find_frame(framemgr, FS_FREE, frame_fcount, (void *)(ulong)frame_count);
if (frame) {
/* cache invalidate */
- CALL_BUFOP(subdev->pb_subdev[frame->index], sync_for_cpu,
- subdev->pb_subdev[frame->index],
- 0,
- subdev->output.width * subdev->output.height * 2,
- DMA_FROM_DEVICE);
- if (frame->state == FS_FREE) {
- *frame_count = frame->fcount;
- *buf_addr = frame->kvaddr_buffer[0];
- *buf_index = frame->index;
-
- trans_frame(framemgr, frame, FS_PROCESS);
-
- ret = 0;
+ CALL_BUFOP(subdev->pb_subdev[frame->index],
+ sync_for_cpu,
+ subdev->pb_subdev[frame->index],
+ 0,
+ subdev->pb_subdev[frame->index]->size,
+ DMA_FROM_DEVICE);
+
+ *buf_addr = frame->kvaddr_buffer[0];
+ *buf_index = frame->index;
+
+ trans_frame(framemgr, frame, FS_PROCESS);
+ } else {
+ if (frame_count != get_vc_dma_error_frame_count) {
+ err("failed to get a frame: fcount: %d", frame_count);
+ err("%d time occured previous frame: fcount: %d\n",
+ get_vc_dma_error_occur_count, get_vc_dma_error_frame_count);
+ get_vc_dma_error_frame_count = frame_count;
+ get_vc_dma_error_occur_count = 0;
}
+ get_vc_dma_error_occur_count++;
+ ret = -EINVAL;
+ goto err_invalid_frame;
}
framemgr_x_barrier_irqr(framemgr, FMGR_IDX_30, flags);
dbg_sensor(2, "[%s]: ch: %d, index: %d, framecount: %d, addr: 0x%llx\n",
- __func__, ch, *buf_index, *frame_count, *buf_addr);
+ __func__, ch, *buf_index, frame_count, *buf_addr);
+
+ return 0;
+
+err_invalid_frame:
+err_get_framemgr:
+ framemgr_x_barrier_irqr(framemgr, FMGR_IDX_30, flags);
return ret;
}
struct fimc_is_device_csi *csi;
struct fimc_is_framemgr *framemgr;
struct fimc_is_frame *frame;
- struct fimc_is_subdev *subdev;
unsigned long flags;
- int ret = 0;
- int ch = 0;
+ int ch;
sensor = get_device_sensor(itf);
if (!sensor) {
- err("%s, failed to get sensor device", __func__);
+ err("failed to get sensor device");
return -ENODEV;
}
csi = (struct fimc_is_device_csi *)v4l2_get_subdevdata(sensor->subdev_csi);
+
switch (request_data_type) {
case VC_BUF_DATA_TYPE_SENSOR_STAT1:
- for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
if (sensor->cfg->output[ch].type == VC_TAILPDAF)
break;
}
break;
+ case VC_BUF_DATA_TYPE_SENSOR_STAT2:
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_EMBEDDED)
+ break;
+ }
+ break;
case VC_BUF_DATA_TYPE_GENERAL_STAT1:
- for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_PRIVATE)
+ break;
+ }
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
if (sensor->cfg->output[ch].type == VC_MIPISTAT)
break;
}
break;
default:
- err("%s, invalid data type(%d)", __func__, request_data_type);
+ err("invalid data type(%d)", request_data_type);
return -EINVAL;
}
- if (ch == CSI_VIRTUAL_CH_0 || ch == CSI_VIRTUAL_CH_MAX) {
- err("tail mode vc not exist");
+ if (ch == CSI_VIRTUAL_CH_MAX) {
+ err("requested stat. type(%d) is not supported with current config",
+ request_data_type);
return -EINVAL;
}
framemgr = get_csi_vc_framemgr(csi, ch);
-
if (!framemgr) {
err("failed to get framemgr");
return -ENXIO;
return -ENOENT;
}
- subdev = csi->dma_subdev[ch];
- FIMC_BUG(!subdev);
-
framemgr_e_barrier_irqs(framemgr, FMGR_IDX_31, flags);
if (!framemgr->frames) {
framemgr_x_barrier_irqr(framemgr, FMGR_IDX_31, flags);
dbg_sensor(1, "[%s]: ch: %d, index: %d\n", __func__, ch, index);
- return ret;
+ return 0;
}
int get_vc_dma_buf_info(struct fimc_is_sensor_interface *itf,
enum itf_vc_buf_data_type request_data_type,
- struct vc_buf_info_t *buf_info,
- u32 *sensor_shifted_num)
+ struct vc_buf_info_t *buf_info)
{
- int ret = 0;
- int ch = 0;
+ struct fimc_is_module_enum *module;
+ struct v4l2_subdev *subdev_module;
struct fimc_is_device_sensor *sensor;
struct fimc_is_device_csi *csi;
+ int ch;
struct fimc_is_subdev *subdev;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct fimc_is_module_enum *module = NULL;
- WARN_ON(!itf);
- WARN_ON(!sensor_shifted_num);
+ memset(buf_info, 0, sizeof(struct vc_buf_info_t));
+ buf_info->stat_type = VC_STAT_TYPE_INVALID;
+ buf_info->sensor_mode = VC_SENSOR_MODE_INVALID;
- sensor = get_device_sensor(itf);
- if (!sensor) {
- err("failed to get sensor device");
- ret = -ENODEV;
- goto p_err;
+ module = get_subdev_module_enum(itf);
+ if (!module) {
+ err("failed to get sensor_peri's module");
+ return -ENODEV;
}
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- BUG_ON(!sensor_peri);
+ subdev_module = module->subdev;
+ if (!subdev_module) {
+ err("module's subdev was not probed");
+ return -ENODEV;
+ }
- module = sensor_peri->module;
- if (unlikely(!module)) {
- err("%s, module in is NULL", __func__);
- module = NULL;
- goto p_err;
+ sensor = v4l2_get_subdev_hostdata(subdev_module);
+ if (!sensor) {
+ err("failed to get sensor device");
+ return -ENODEV;
}
csi = (struct fimc_is_device_csi *)v4l2_get_subdevdata(sensor->subdev_csi);
if (!csi) {
err("failed to get csi device");
- ret = -ENODEV;
- goto p_err;
+ return -ENODEV;
}
switch (request_data_type) {
case VC_BUF_DATA_TYPE_SENSOR_STAT1:
- case VC_BUF_DATA_TYPE_SENSOR_STAT2:
- for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
if (sensor->cfg->output[ch].type == VC_TAILPDAF)
break;
}
break;
+ case VC_BUF_DATA_TYPE_SENSOR_STAT2:
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_EMBEDDED)
+ break;
+ }
+ break;
case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_PRIVATE)
+ break;
+ }
+ break;
case VC_BUF_DATA_TYPE_GENERAL_STAT2:
- for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
if (sensor->cfg->output[ch].type == VC_MIPISTAT)
break;
}
break;
default:
err("invalid data type(%d)", request_data_type);
- ret = -EINVAL;
- goto p_err;
+ return -EINVAL;
}
- if (ch == CSI_VIRTUAL_CH_0 || ch == CSI_VIRTUAL_CH_MAX) {
- err("tail mode vc not exist");
- ret = -EINVAL;
- goto p_err;
+ if (ch == CSI_VIRTUAL_CH_MAX) {
+ err("requested stat. type(%d) is not supported with current config",
+ request_data_type);
+ return -EINVAL;
}
subdev = csi->dma_subdev[ch];
if (!subdev) {
err("failed to get subdev device");
- ret = -ENODEV;
- goto p_err;
+ return -ENODEV;
}
+ buf_info->stat_type = module->vc_extra_info[request_data_type].stat_type;
+ buf_info->sensor_mode = module->vc_extra_info[request_data_type].sensor_mode;
buf_info->width = subdev->output.width;
buf_info->height = subdev->output.height;
- buf_info->stat_type = module->vc_max_size[request_data_type].stat_type;
- buf_info->element_size = module->vc_max_size[request_data_type].element_size;
-
-#ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
- *sensor_shifted_num = sensor_peri->cis.cis_data->sensor_shifted_num;
-#else
- *sensor_shifted_num = 0; /* not support */
-#endif
-
- switch (subdev->pixelformat) {
- case V4L2_PIX_FMT_SBGGR16:
- buf_info->element_size = 2; /* byte */
- break;
- default:
- err("unknown pixelformat(%c%c%c%c)\n",
- (char)((subdev->pixelformat >> 0) & 0xFF),
- (char)((subdev->pixelformat >> 8) & 0xFF),
- (char)((subdev->pixelformat >> 16) & 0xFF),
- (char)((subdev->pixelformat >> 24) & 0xFF));
- ret = -EINVAL;
- goto p_err;
- }
-
- switch (buf_info->stat_type) {
- case VC_STAT_TYPE_PAFSTAT_FLOATING:
-#if defined(CONFIG_CAMERA_PAFSTAT)
- pafstat_hw_g_floating_size(&buf_info->width, &buf_info->height, &buf_info->element_size);
-#endif
- break;
- case VC_STAT_TYPE_PAFSTAT_STATIC:
-#if defined(CONFIG_CAMERA_PAFSTAT)
- pafstat_hw_g_static_size(&buf_info->width, &buf_info->height, &buf_info->element_size);
-#endif
- break;
- default:
- break;
- }
+ buf_info->element_size = module->vc_extra_info[request_data_type].max_element;
info("VC buf (req_type(%d), stat_type(%d), width(%d), height(%d), element(%d byte))\n",
request_data_type, buf_info->stat_type, buf_info->width, buf_info->height, buf_info->element_size);
-p_err:
- return ret;
+ return 0;
}
int get_vc_dma_buf_max_size(struct fimc_is_sensor_interface *itf,
u32 *height,
u32 *element_size)
{
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
- struct fimc_is_sensor_vc_max_size *vc_max_size;
+ struct fimc_is_sensor_vc_extra_info *vc_extra_info;
struct fimc_is_module_enum *module;
- int buf_max_size;
- int ret = 0;
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- module = sensor_peri->module;
+ module = get_subdev_module_enum(itf);
if (unlikely(!module)) {
- err("%s, failed to get sensor_peri's module", __func__);
- ret = -EINVAL;
- goto p_err;
+ err("failed to get sensor_peri's module");
+ return -ENODEV;
}
- vc_max_size = &module->vc_max_size[request_data_type];
+ if ((request_data_type <= VC_BUF_DATA_TYPE_INVALID) ||
+ (request_data_type >= VC_BUF_DATA_TYPE_MAX)) {
+ err("invalid data type(%d)", request_data_type);
+ return -EINVAL;
+ }
- *width = vc_max_size->width;
- *height = vc_max_size->height;
- *element_size = vc_max_size->element_size;
+ if (module->vc_extra_info[request_data_type].stat_type == VC_BUF_DATA_TYPE_INVALID) {
+ err("module dosen't support this stat. type(%d)", request_data_type);
+ return -EINVAL;
+ }
+
+ vc_extra_info = &module->vc_extra_info[request_data_type];
- buf_max_size = vc_max_size->width * vc_max_size->height * vc_max_size->element_size;
+ *width = vc_extra_info->max_width;
+ *height = vc_extra_info->max_height;
+ *element_size = vc_extra_info->max_element;
info("VC max buf (type(%d), width(%d), height(%d),element(%d byte))\n",
request_data_type, *width, *height, *element_size);
- return buf_max_size;
-p_err:
- return ret;
+ return (*width) * (*height) * (*element_size);
}
-int csi_reserved_0(struct fimc_is_sensor_interface *itf)
+#ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
+int get_sensor_shifted_num(struct fimc_is_sensor_interface *itf,
+ u32 *sensor_shifted_num)
{
+ struct fimc_is_device_sensor_peri *sensor_peri;
+
+ if (!itf) {
+ err("invalid sensor interface");
+ return -EINVAL;
+ }
+
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
+ sensor_interface);
+ if (!sensor_peri) {
+ err("failed to get sensor_peri");
+ return -EINVAL;
+ }
+
+ *sensor_shifted_num = sensor_peri->cis.cis_data->sensor_shifted_num;
+
return 0;
}
+#endif
-int csi_reserved_1(struct fimc_is_sensor_interface *itf)
+int register_vc_dma_notifier(struct fimc_is_sensor_interface *itf,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier, void *data)
{
- return 0;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ int ret;
+
+ if (!itf) {
+ err("invalid sensor interface");
+ return -EINVAL;
+ }
+
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
+ sensor_interface);
+ if (!sensor_peri) {
+ err("failed to get sensor_peri");
+ return -ENODEV;
+ }
+
+ /* PDP */
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ if (!sensor_peri->pdp || !sensor_peri->subdev_pdp) {
+ err("invalid PDP state");
+ return -EINVAL;
+ }
+
+ ret = CALL_PDPOPS(sensor_peri->pdp, register_notifier,
+ sensor_peri->subdev_pdp,
+ type, notifier, data);
+ /* PAFSTAT */
+ } else if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ if (!sensor_peri->pafstat || !sensor_peri->subdev_pafstat) {
+ err("invalid PAFSTAT state");
+ return -EINVAL;
+ }
+
+ ret = CALL_PAFSTATOPS(sensor_peri->pafstat, register_notifier,
+ sensor_peri->subdev_pafstat,
+ type, notifier, data);
+ } else {
+ err("no PAF HW");
+ return -ENODEV;
+ }
+
+ return ret;
}
-int csi_reserved_2(struct fimc_is_sensor_interface *itf)
+int unregister_vc_dma_notifier(struct fimc_is_sensor_interface *itf,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier)
{
- return 0;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ int ret;
+
+ if (!itf) {
+ err("invalid sensor interface");
+ return -EINVAL;
+ }
+
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
+ sensor_interface);
+ if (!sensor_peri) {
+ err("failed to get sensor_peri");
+ return -ENODEV;
+ }
+
+ /* PDP */
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ if (!sensor_peri->pdp || !sensor_peri->subdev_pdp) {
+ err("invalid PDP state");
+ return -EINVAL;
+ }
+
+ ret = CALL_PDPOPS(sensor_peri->pdp, unregister_notifier,
+ sensor_peri->subdev_pdp,
+ type, notifier);
+ /* PAFSTAT */
+ } else if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ if (!sensor_peri->pafstat || !sensor_peri->subdev_pafstat) {
+ err("invalid PAFSTAT state");
+ return -EINVAL;
+ }
+
+ ret = CALL_PAFSTATOPS(sensor_peri->pafstat, unregister_notifier,
+ sensor_peri->subdev_pafstat,
+ type, notifier);
+ } else {
+ err("no PAF HW");
+ return -ENODEV;
+ }
+
+ return ret;
}
-int csi_reserved_3(struct fimc_is_sensor_interface *itf)
+int csi_reserved(struct fimc_is_sensor_interface *itf)
{
return 0;
}
sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
FIMC_BUG(!sensor_peri);
- sensor_peri->cis.long_term_mode.sen_strm_off_on_enable = long_term_expo_mode->sen_strm_off_on_enable;
+ /* as this function called, always set true for operate */
+ sensor_peri->cis.long_term_mode.sen_strm_off_on_enable = true;
sensor_peri->cis.long_term_mode.frm_num_strm_off_on_interval = long_term_expo_mode->frm_num_strm_off_on_interval;
+ sensor_peri->cis.long_term_mode.sen_strm_off_on_step = 0;
if (sensor_peri->cis.long_term_mode.sen_strm_off_on_enable) {
for (i = 0; i < 2; i++) {
return 0;
}
+int get_sensor_max_dynamic_fps(struct fimc_is_sensor_interface *itf,
+ u32 *max_dynamic_fps)
+{
+ int ret = 0;
+ struct fimc_is_device_sensor *sensor = NULL;
+ enum fimc_is_ex_mode ex_mode;
+
+ FIMC_BUG(!itf);
+ FIMC_BUG(!max_dynamic_fps);
+
+ sensor = get_device_sensor(itf);
+ if (!sensor) {
+ err("failed to get sensor device");
+ return -ENODEV;
+ }
+
+ ex_mode = fimc_is_sensor_g_ex_mode(sensor);
+ if (ex_mode == EX_DUALFPS_960)
+ *max_dynamic_fps = 960;
+ else if (ex_mode == EX_DUALFPS_480)
+ *max_dynamic_fps = 480;
+ else
+ *max_dynamic_fps = 0;
+
+ return ret;
+}
+
+int get_static_mem(int ctrl_id, void **mem, int *size) {
+ int err = 0;
+
+ switch(ctrl_id) {
+ case ITF_CTRL_ID_DDK:
+ *mem = (void *)rta_static_data;
+ *size = sizeof(rta_static_data);
+ break;
+ case ITF_CTRL_ID_RTA:
+ *mem = (void *)ddk_static_data;
+ *size = sizeof(ddk_static_data);
+ break;
+ default:
+ err("invalid itf ctrl id %d", ctrl_id);
+ *mem = NULL;
+ *size = 0;
+ err = -EINVAL;
+ }
+
+ return err;
+}
+
int get_sensor_state(struct fimc_is_sensor_interface *itf)
{
struct fimc_is_device_sensor *sensor;
sensor = get_device_sensor(itf);
if (!sensor) {
- err("%s, failed to get sensor device", __func__);
+ err("failed to get sensor device");
return -1;
}
return 0;
}
-int read_paf_sfr_stat(struct fimc_is_sensor_interface *itf,
- u32 *buf)
+int set_paf_param(struct fimc_is_sensor_interface *itf,
+ struct paf_setting_t *regs, u32 regs_size)
{
- int ret = 0;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ int ret;
- WARN_ON(!itf);
- WARN_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
+ if (!itf) {
+ err("invalid sensor interface");
+ return -EINVAL;
+ }
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- WARN_ON(!sensor_peri);
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
- if (sensor_peri->pdp == NULL || sensor_peri->subdev_pdp == NULL) {
- info("%s: invalid pdp state.\n", __func__);
- } else {
- CALL_PDPOPS(sensor_peri->pdp,
- read_paf_sfr_stat,
- sensor_peri->subdev_pdp,
- buf);
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
+ sensor_interface);
+ if (!sensor_peri) {
+ err("failed to get sensor_peri");
+ return -ENODEV;
}
- return ret;
-}
-
-int get_irq_state(struct fimc_is_sensor_interface *itf,
- int *irq_state)
-{
- int state = 0;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ /* PDP */
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ if (!sensor_peri->pdp || !sensor_peri->subdev_pdp) {
+ err("invalid PDP state");
+ return -EINVAL;
+ }
- WARN_ON(!itf);
- WARN_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- WARN_ON(!sensor_peri);
+ ret = CALL_PDPOPS(sensor_peri->pdp, set_param,
+ sensor_peri->subdev_pdp,
+ regs, regs_size);
+ /* PAFSTAT */
+ } else if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ if (!sensor_peri->pafstat || !sensor_peri->subdev_pafstat) {
+ err("invalid PAFSTAT state");
+ return -EINVAL;
+ }
- if (sensor_peri->pdp == NULL || sensor_peri->subdev_pdp == NULL) {
- info("%s: invalid pdp state.\n", __func__);
- *irq_state = -EINVAL;
+ ret = CALL_PAFSTATOPS(sensor_peri->pafstat, set_param,
+ sensor_peri->subdev_pafstat,
+ regs, regs_size);
} else {
- CALL_PDPOPS(sensor_peri->pdp,
- get_irq_state,
- sensor_peri->subdev_pdp,
- &state);
- *irq_state = state;
+ err("no PAF HW");
+ return -ENODEV;
}
- return 0;
+ return ret;
}
-int clear_irq_state(struct fimc_is_sensor_interface *itf,
- int irq_state)
+int get_paf_ready(struct fimc_is_sensor_interface *itf, u32 *ready)
{
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ int ret;
- WARN_ON(!itf);
- WARN_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
+ if (!itf) {
+ err("invalid sensor interface");
+ return -EINVAL;
+ }
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- WARN_ON(!sensor_peri);
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
- if (sensor_peri->pdp == NULL || sensor_peri->subdev_pdp == NULL) {
- info("%s: invalid pdp state.\n", __func__);
- } else {
- CALL_PDPOPS(sensor_peri->pdp,
- clear_irq_state,
- sensor_peri->subdev_pdp,
- irq_state);
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
+ sensor_interface);
+ if (!sensor_peri) {
+ err("failed to get sensor_peri");
+ return -ENODEV;
}
- return 0;
-}
-
-int set_pdp_param(struct fimc_is_sensor_interface *itf,
- struct pdp_total_setting_t *pdp_param)
-{
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ /* PDP */
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ if (!sensor_peri->pdp || !sensor_peri->subdev_pdp) {
+ err("invalid PDP state");
+ return -EINVAL;
+ }
- WARN_ON(!itf);
- WARN_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
+ ret = CALL_PDPOPS(sensor_peri->pdp, get_ready,
+ sensor_peri->subdev_pdp, ready);
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- WARN_ON(!sensor_peri);
+ /* PAFSTAT */
+ } else if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ if (!sensor_peri->pafstat || !sensor_peri->subdev_pafstat) {
+ err("invalid PAFSTAT state");
+ return -EINVAL;
+ }
- if (sensor_peri->pdp == NULL || sensor_peri->subdev_pdp == NULL) {
- info("%s: invalid pdp state.\n", __func__);
+ ret = CALL_PAFSTATOPS(sensor_peri->pafstat, get_ready,
+ sensor_peri->subdev_pafstat, ready);
} else {
- CALL_PDPOPS(sensor_peri->pdp,
- set_pdp_param,
- sensor_peri->subdev_pdp,
- pdp_param);
+ err("no PAF HW");
+ return -ENODEV;
}
- return 0;
+ return ret;
+}
+
+int paf_reserved(struct fimc_is_sensor_interface *itf)
+{
+ return -EINVAL;
}
-int read_pdp_reg(struct fimc_is_sensor_interface *itf,
- struct pdp_read_reg_setting_t *reg_param)
+int request_wb_gain(struct fimc_is_sensor_interface *itf,
+ u32 gr_gain, u32 r_gain, u32 b_gain, u32 gb_gain)
{
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct fimc_is_device_sensor *sensor;
+ struct fimc_is_sensor_ctl *sensor_ctl = NULL;
+ int i;
+ u32 frame_count = 0, num_of_frame = 1;
- WARN_ON(!itf);
- WARN_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
+ BUG_ON(!itf);
+ BUG_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
- WARN_ON(!sensor_peri);
- if (sensor_peri->pdp == NULL || sensor_peri->subdev_pdp == NULL) {
- info("%s: invalid pdp state.\n", __func__);
- } else{
- CALL_PDPOPS(sensor_peri->pdp,
- read_pdp_reg,
- sensor_peri->subdev_pdp,
- reg_param);
+ sensor = get_device_sensor(itf);
+ if (!sensor) {
+ err("%s, failed to get sensor device", __func__);
+ return -1;
}
- return 0;
-}
-
-/* pafstat_interface */
-int pafstat_reserved(struct fimc_is_sensor_interface *itf)
-{
- return 0;
-}
-
-int set_pafstat_param(struct fimc_is_sensor_interface *itf,
- struct pafstat_setting_t *regs, u32 regs_size)
-{
- struct v4l2_subdev *subdev;
- struct fimc_is_device_sensor *sensor;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ if (!test_bit(FIMC_IS_SENSOR_FRONT_START, &sensor->state)) {
+ sensor_peri->cis.mode_chg_wb_gains.gr = gr_gain;
+ sensor_peri->cis.mode_chg_wb_gains.r = r_gain;
+ sensor_peri->cis.mode_chg_wb_gains.b = b_gain;
+ sensor_peri->cis.mode_chg_wb_gains.gb = gb_gain;
+ }
- WARN_ON(!itf);
- WARN_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
+ frame_count = get_frame_count(itf);
+ get_num_of_frame_per_one_3aa(itf, &num_of_frame);
- sensor = get_device_sensor(itf);
- WARN_ON(!sensor);
+ for (i = 0; i < num_of_frame; i++) {
+ sensor_ctl = get_sensor_ctl_from_module(itf, frame_count + i);
+ BUG_ON(!sensor_ctl);
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
- sensor_interface);
- WARN_ON(!sensor_peri);
+ sensor_ctl->wb_gains.gr = gr_gain;
+ sensor_ctl->wb_gains.r = r_gain;
+ sensor_ctl->wb_gains.b = b_gain;
+ sensor_ctl->wb_gains.gb = gb_gain;
- subdev = sensor_peri->subdev_paf;
- WARN_ON(!subdev);
+ if (i == 0)
+ sensor_ctl->update_wb_gains = true;
+ }
- CALL_PAFOPS(sensor_peri->paf, set_param, subdev, regs, regs_size);
- dbg_sensor(1, "%s: regs_size(%d)\n", __func__, regs_size);
+ dbg_sensor(1, "[%s] stream %s, wb gains(gr:%d, r:%d, b:%d, gb:%d)\n",
+ __func__,
+ test_bit(FIMC_IS_SENSOR_FRONT_START, &sensor->state) ? "on" : "off",
+ gr_gain, r_gain, b_gain, gb_gain);
return 0;
}
-int get_pafstat_ready(struct fimc_is_sensor_interface *itf, u32 *ready)
+int set_sensor_info_mfhdr_mode_change(struct fimc_is_sensor_interface *itf,
+ u32 count, u32 *long_expo, u32 *long_again, u32 *long_dgain,
+ u32 *expo, u32 *again, u32 *dgain)
{
- struct v4l2_subdev *subdev;
+ struct fimc_is_device_sensor_peri *sensor_peri;
struct fimc_is_device_sensor *sensor;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ camera2_sensor_uctl_t *sensor_uctl;
+ struct fimc_is_sensor_ctl *sensor_ctl;
+ int idx;
- WARN_ON(!itf);
- WARN_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
+ BUG_ON(!itf);
+ BUG_ON(itf->magic != SENSOR_INTERFACE_MAGIC);
+
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
sensor = get_device_sensor(itf);
- WARN_ON(!sensor);
+ if (!sensor) {
+ err("%s, failed to get sensor device", __func__);
+ return -1;
+ }
- sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri,
- sensor_interface);
- WARN_ON(!sensor_peri);
+ if (test_bit(FIMC_IS_SENSOR_FRONT_START, &sensor->state))
+ warn("[%s] called during stream on", __func__);
- subdev = sensor_peri->subdev_paf;
- WARN_ON(!subdev);
+ if (count < 1) {
+ err("[%s] wrong request count(%d)", __func__, count);
+ return -1;
+ }
- *ready = CALL_PAFOPS(sensor_peri->paf, get_ready, subdev);
- dbg_sensor(1, "%s: ready(%d)\n", __func__, *ready);
+ /* set index 0 values to mode_chg_xxx variables
+ * for applying values before stream on
+ */
+ sensor_peri->cis.mode_chg.exposure = expo[0];
+ sensor_peri->cis.mode_chg.analog_gain = again[0];
+ sensor_peri->cis.mode_chg.digital_gain = dgain[0];
+ sensor_peri->cis.mode_chg.long_exposure = long_expo[0];
+ sensor_peri->cis.mode_chg.long_analog_gain = long_again[0];
+ sensor_peri->cis.mode_chg.long_digital_gain = long_dgain[0];
+
+ /* set index 0 ~ cnt-1 values to sensor uctl variables
+ * for applying values during streaming.
+ * (index 0 is set for code clean(not updated during streaming)
+ * set "use_sensor_work" to true for call sensor_work_thread
+ * to apply sensor settings
+ */
+ sensor_peri->use_sensor_work = true;
+ for (idx = 0; idx < count; idx++) {
+ sensor_ctl = get_sensor_ctl_from_module(itf, get_frame_count(itf) + idx);
+ sensor_ctl->force_update = true;
+
+ sensor_uctl = get_sensor_uctl_from_module(itf, get_frame_count(itf) + idx);
+ BUG_ON(!sensor_uctl);
+
+ sensor_uctl->exposureTime = fimc_is_sensor_convert_us_to_ns(long_expo[idx]);
+ sensor_uctl->longExposureTime = fimc_is_sensor_convert_us_to_ns(long_expo[idx]);
+ sensor_uctl->shortExposureTime = fimc_is_sensor_convert_us_to_ns(expo[idx]);
+
+ sensor_uctl->sensitivity = DIV_ROUND_UP((long_again[idx] + long_dgain[idx]), 10);
+ sensor_uctl->analogGain = again[idx];
+ sensor_uctl->digitalGain = dgain[idx];
+ sensor_uctl->longAnalogGain = long_again[idx];
+ sensor_uctl->shortAnalogGain = again[idx];
+ sensor_uctl->longDigitalGain = long_dgain[idx];
+ sensor_uctl->shortDigitalGain = dgain[idx];
+
+ set_sensor_uctl_valid(itf, idx);
+
+ dbg_sensor(1, "[%s][I:%d,F:%d]: exp(%d), again(%d), dgain(%d), "
+ KERN_CONT "long_exp(%d), long_again(%d), long_dgain(%d)\n",
+ __func__, idx, get_frame_count(itf) + idx,
+ expo[idx], again[idx], dgain[idx],
+ long_expo[idx], long_again[idx], long_dgain[idx]);
+ }
return 0;
}
itf->aperture_itf_ops.set_aperture_value = set_aperture_value;
itf->aperture_itf_ops.get_aperture_value = get_aperture_value;
-#if defined(CONFIG_CAMERA_PDP)
- /* PDP interface */
- itf->pdp_itf_ops.read_pdp_reg = read_pdp_reg;
- itf->pdp_itf_ops.read_paf_sfr_stat = read_paf_sfr_stat;
- itf->pdp_itf_ops.get_irq_state = get_irq_state;
- itf->pdp_itf_ops.clear_irq_state = clear_irq_state;
- itf->pdp_itf_ops.set_pdp_param = set_pdp_param;
-#endif
+ itf->paf_itf_ops.set_paf_param = set_paf_param;
+ itf->paf_itf_ops.get_paf_ready = get_paf_ready;
+ itf->paf_itf_ops.reserved[0] = paf_reserved;
+ itf->paf_itf_ops.reserved[1] = paf_reserved;
+ itf->paf_itf_ops.reserved[2] = paf_reserved;
+ itf->paf_itf_ops.reserved[3] = paf_reserved;
/* MIPI-CSI interface */
itf->csi_itf_ops.get_vc_dma_buf = get_vc_dma_buf;
itf->csi_itf_ops.put_vc_dma_buf = put_vc_dma_buf;
itf->csi_itf_ops.get_vc_dma_buf_info = get_vc_dma_buf_info;
itf->csi_itf_ops.get_vc_dma_buf_max_size = get_vc_dma_buf_max_size;
- itf->csi_itf_ops.reserved[0] = csi_reserved_0;
- itf->csi_itf_ops.reserved[1] = csi_reserved_1;
- itf->csi_itf_ops.reserved[2] = csi_reserved_2;
- itf->csi_itf_ops.reserved[3] = csi_reserved_3;
+#ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
+ itf->csi_itf_ops.get_sensor_shifted_num = get_sensor_shifted_num;
+#endif
+ itf->csi_itf_ops.register_vc_dma_notifier = register_vc_dma_notifier;
+ itf->csi_itf_ops.unregister_vc_dma_notifier = unregister_vc_dma_notifier;
+ itf->csi_itf_ops.reserved[0] = csi_reserved;
+#ifndef CAMERA_REAR2_SENSOR_SHIFT_CROP
+ itf->csi_itf_ops.reserved[1] = csi_reserved;
+#endif
/* CIS ext2 interface */
/* Long Term Exposure mode(LTE mode) interface */
itf->cis_ext2_itf_ops.set_long_term_expo_mode = set_long_term_expo_mode;
itf->cis_ext2_itf_ops.set_low_noise_mode = set_low_noise_mode;
+ itf->cis_ext2_itf_ops.get_sensor_max_dynamic_fps = get_sensor_max_dynamic_fps;
+ itf->cis_ext2_itf_ops.get_static_mem = get_static_mem;
itf->cis_ext_itf_ops.set_adjust_sync = set_adjust_sync;
itf->cis_ext_itf_ops.request_frame_length_line = request_frame_length_line;
itf->cis_ext_itf_ops.request_sensitivity = request_sensitivity;
+ itf->cis_ext_itf_ops.get_sensor_flag = get_sensor_flag;
+ itf->cis_ext_itf_ops.set_sensor_stat_control_mode_change = set_sensor_stat_control_mode_change;
+ itf->cis_ext_itf_ops.set_sensor_roi_control = set_sensor_roi_control;
+ itf->cis_ext_itf_ops.set_sensor_stat_control_per_frame = set_sensor_stat_control_per_frame;
/* Sensor dual sceanrio interface */
itf->dual_itf_ops.get_sensor_state = get_sensor_state;
itf->dual_itf_ops.set_reuse_ae_exposure = set_reuse_ae_exposure;
itf->dual_itf_ops.reserved[0] = dual_reserved_0;
itf->dual_itf_ops.reserved[1] = dual_reserved_1;
-#if defined(CONFIG_CAMERA_PAFSTAT)
- itf->paf_itf_ops.set_pafstat_param = set_pafstat_param;
- itf->paf_itf_ops.get_pafstat_ready = get_pafstat_ready;
- itf->paf_itf_ops.reserved[0] = pafstat_reserved;
- itf->paf_itf_ops.reserved[1] = pafstat_reserved;
- itf->paf_itf_ops.reserved[2] = pafstat_reserved;
- itf->paf_itf_ops.reserved[3] = pafstat_reserved;
- itf->paf_itf_ops.reserved[5] = pafstat_reserved;
- itf->paf_itf_ops.reserved[6] = pafstat_reserved;
- itf->paf_itf_ops.reserved[7] = pafstat_reserved;
-#endif
+
+ itf->cis_ext2_itf_ops.request_wb_gain = request_wb_gain;
+ itf->cis_ext2_itf_ops.set_sensor_info_mfhdr_mode_change = set_sensor_info_mfhdr_mode_change;
return ret;
}
#define FPS_TO_DURATION_US(x) ((x == 0) ? (0) : ((1000 * 1000) / x))
#define DURATION_US_TO_FPS(x) ((x == 0) ? (0) : ((1000 * 1000) / x))
+/* static memory size for DDK/RTA backup data */
+#define STATIC_DATA_SIZE 100
+
enum DIFF_BET_SEN_ISP { /* Set to 0: 3AA 3frame delay, 1: 3AA 4frame delay, 3: M2M */
DIFF_OTF_DELAY = 0,
DIFF_M2M_DELAY = 3
N_PLUS_ONE_FRAME = 1,
};
+enum {
+ ITF_CTRL_ID_DDK = 0,
+ ITF_CTRL_ID_RTA = 1,
+};
+
/* DEVICE SENSOR INTERFACE */
#define SENSOR_REGISTER_FUNC_ADDR (DDK_LIB_ADDR + 0x40)
#define SENSOR_REGISTER_FUNC_ADDR_RTA (RTA_LIB_ADDR + 0x40)
u32 long_val;
};
u32 short_val;
+ u32 middle_val;
};
typedef struct {
enum itf_vc_stat_type {
VC_STAT_TYPE_INVALID = -1,
- /* Types for flagship */
- VC_STAT_TYPE_TAIL_MSPD = 0,
- VC_STAT_TYPE_COMP_MIPI_STAT,
- VC_STAT_TYPE_PDP_PDAF,
- VC_STAT_TYPE_PDP_PDAF_PADDED,
-
/* Types for SW PDAF(tail mode buffer type) */
- VC_STAT_TYPE_TAIL_MSPD_GLOBAL = 100,
- VC_STAT_TYPE_TAIL_2PD,
- VC_STAT_TYPE_TAIL_2PD_HDR,
- VC_STAT_TYPE_TAIL_ULTRA_PD,
- VC_STAT_TYPE_TAIL_ULTRA_PD_DIVIDE2,
- VC_STAT_TYPE_TAIL_SUPER_PD,
- VC_STAT_TYPE_TAIL_SUPER_PD_DIVIDE2,
-
- /*Types for IMX PDAF sensors */
- VC_STAT_TYPE_TAIL_IMX_FLEXIBLE = 200,
- VC_STAT_TYPE_TAIL_IMX_STATIC,
+ VC_STAT_TYPE_TAIL_FOR_SW_PDAF = 100,
+
+ /* Types for IMX PDAF sensors */
+ VC_STAT_TYPE_IMX_FLEXIBLE = 200,
+ VC_STAT_TYPE_IMX_STATIC,
/* Types for PAF_STAT */
VC_STAT_TYPE_PAFSTAT_FLOATING = 300,
VC_STAT_TYPE_PAFSTAT_STATIC,
- VC_STAT_TYPE_PAFSTAT_MAX
+
+ /* Types for PDP 1.0 in Lhotse/Makalu EVT0 */
+ VC_STAT_TYPE_PDP_1_0_PDAF_STAT0 = 400,
+ VC_STAT_TYPE_PDP_1_0_PDAF_STAT1,
+
+ /* Types for PDP 1.1 in Makalu EVT1 */
+ VC_STAT_TYPE_PDP_1_1_PDAF_STAT0 = 500,
+ VC_STAT_TYPE_PDP_1_1_PDAF_STAT1,
+
+ /* Types for 3HDR */
+ VC_STAT_TYPE_TAIL_FOR_3HDR_LSI = 600,
+ VC_STAT_TYPE_TAIL_FOR_3HDR_IMX,
+};
+
+enum itf_vc_sensor_mode {
+ VC_SENSOR_MODE_INVALID = -1,
+
+ /* 2PD */
+ VC_SENSOR_MODE_2PD_MODE1 = 100,
+ VC_SENSOR_MODE_2PD_MODE2,
+ VC_SENSOR_MODE_2PD_MODE3,
+ VC_SENSOR_MODE_2PD_MODE4,
+ VC_SENSOR_MODE_2PD_MODE1_HDR,
+ VC_SENSOR_MODE_2PD_MODE2_HDR,
+ VC_SENSOR_MODE_2PD_MODE3_HDR,
+ VC_SENSOR_MODE_2PD_MODE4_HDR,
+
+ /* MSPD */
+ VC_SENSOR_MODE_MSPD_NORMAL = 200,
+ VC_SENSOR_MODE_MSPD_TAIL,
+ VC_SENSOR_MODE_MSPD_GLOBAL_NORMAL,
+ VC_SENSOR_MODE_MSPD_GLOBAL_TAIL,
+
+ /* Ultra PD */
+ VC_SENSOR_MODE_ULTRA_PD_NORMAL = 300,
+ VC_SENSOR_MODE_ULTRA_PD_TAIL,
+
+ /* Super PD */
+ VC_SENSOR_MODE_SUPER_PD_NORMAL = 400,
+ VC_SENSOR_MODE_SUPER_PD_TAIL,
+
+ /* IMX PDAF */
+ VC_SENSOR_MODE_IMX_PDAF = 500,
+
+ /* 3HDR */
+ VC_SENSOR_MODE_3HDR_LSI = 600,
+ VC_SENSOR_MODE_3HDR_IMX,
};
struct vc_buf_info_t {
enum itf_vc_stat_type stat_type;
+ enum itf_vc_sensor_mode sensor_mode;
u32 width;
u32 height;
u32 element_size;
};
typedef struct {
- unsigned long long exposure;
+ unsigned int exposure;
unsigned int analog_gain;
unsigned int digital_gain;
- unsigned long long long_exposure;
+ unsigned int long_exposure;
unsigned int long_analog_gain;
unsigned int long_digital_gain;
- unsigned long long short_exposure;
+ unsigned int short_exposure;
unsigned int short_analog_gain;
unsigned int short_digital_gain;
+ unsigned int middle_exposure;
+ unsigned int middle_analog_gain;
+ unsigned int middle_digital_gain;
} ae_setting;
typedef struct {
unsigned int factory_step;
} ois_shared_data;
+struct wb_gains {
+ u32 gr;
+ u32 r;
+ u32 b;
+ u32 gb;
+};
+
+struct roi_setting_t {
+ bool update;
+ u16 roi_start_x;
+ u16 roi_start_y;
+ u16 roi_end_x;
+ u16 roi_end_y;
+};
+
+struct sensor_lsi_3hdr_stat_control_mode_change {
+ int r_weight;
+ int b_weight;
+ int g_weight;
+ int low_gate_thr;
+ int high_gate_thr;
+ struct roi_setting_t y_sum_roi;
+};
+
+struct sensor_lsi_3hdr_stat_control_per_frame {
+ int r_weight;
+ int b_weight;
+ int g_weight;
+
+ /* stat for 3dhdr motion */
+ u32 motion_indication;
+ u32 motion_high_end_ty2ty1;
+ u32 motion_high_start_ty2ty1;
+ u32 motion_low_end_ty2ty1;
+ u32 motion_low_start_ty2ty1;
+ u32 motion_high_end_ty3ty2;
+ u32 motion_high_start_ty3ty2;
+ u32 motion_low_end_ty3ty2;
+ u32 motion_low_start_ty3ty2;
+ u32 decision_thresh_override;
+ u32 motion_abs_high_ty3ty2;
+ u32 motion_abs_low_ty3ty2;
+ u32 motion_abs_high_ty2ty1;
+ u32 motion_abs_low_ty2ty1;
+};
+
typedef struct {
/** The length of a frame is specified as a number of lines, frame_length_lines.
@remarks
#ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
u32 sensor_shifted_num;
#endif
+ bool dual_sync_enable;
} cis_shared_data;
struct v4l2_subdev;
int (*cis_update_pdaf_tail_size)(struct v4l2_subdev *subdev, struct fimc_is_sensor_cfg *select);
#endif
int (*cis_set_initial_exposure)(struct v4l2_subdev *subdev);
+ int (*cis_check_rev)(struct v4l2_subdev *subdev);
+ int (*cis_set_super_slow_motion_threshold)(struct v4l2_subdev *subdev, u32 threshold);
+ int (*cis_get_super_slow_motion_threshold)(struct v4l2_subdev *subdev, u32 *threshold);
+ int (*cis_factory_test)(struct v4l2_subdev *subdev);
+ int (*cis_set_wb_gains)(struct v4l2_subdev *subdev, struct wb_gains wb_gains);
+ int (*cis_set_roi_stat)(struct v4l2_subdev *subdev, struct roi_setting_t roi_control);
+ int (*cis_set_3hdr_stat)(struct v4l2_subdev *subdev, bool streaming, void *data);
+ void (*cis_check_wdr_mode)(struct v4l2_subdev *subdev, u32 mode_idx);
+ int (*cis_set_dual_setting)(struct v4l2_subdev *subdev);
+ int (*cis_mode_change_throttling)(struct v4l2_subdev *subdev);
};
struct fimc_is_sensor_ctl
// Frame number that indicating shot. Currntly, it is not used.
/* (14) */ bool shot_frame_number;
+
+ /* For WB(White Balance) gain update */
+ struct wb_gains wb_gains;
+ bool update_wb_gains;
+
+ /* force_update set when need to update w/o DDK or RTA */
+ bool force_update;
+
+ /* for update 3DHDR sensor stats */
+ struct roi_setting_t roi_control;
+ bool update_roi;
+ struct sensor_lsi_3hdr_stat_control_per_frame stat_control;
+ bool update_3hdr_stat;
};
typedef enum fimc_is_sensor_adjust_direction_ {
FIMC_IS_SENSOR_PDP_AVAILABLE,
FIMC_IS_SENSOR_APERTURE_AVAILABLE,
FIMC_IS_SENSOR_PAFSTAT_AVAILABLE,
+ FIMC_IS_SENSOR_EEPROM_AVAILABLE,
};
enum fimc_is_actuator_pos_size_bit {
FIMC_IS_CIS_LNOFF = 0, /* Low Noise Off */
FIMC_IS_CIS_LN2, /* Low Noise 2 */
FIMC_IS_CIS_LN4, /* Low Noise 4 */
+ FIMC_IS_CIS_LN2_PEDESTAL128, /* Low Noise 2 + pedestal 128 */
+ FIMC_IS_CIS_LN4_PEDESTAL128, /* Low Noise 4 + pedestal 128 */
FIMC_IS_CIS_LOWNOISE_MODE_MAX,
};
+enum fimc_is_exposure_gain_count {
+ EXPOSURE_GAIN_COUNT_INVALID = 0,
+ EXPOSURE_GAIN_COUNT_1,
+ EXPOSURE_GAIN_COUNT_2,
+ EXPOSURE_GAIN_COUNT_3,
+ EXPOSURE_GAIN_COUNT_END
+};
+
+enum fimc_is_exposure_gain_type {
+ EXPOSURE_GAIN_LONG = 0,
+ EXPOSURE_GAIN_SHORT,
+ EXPOSURE_GAIN_MIDDLE,
+ EXPOSURE_GAIN_MAX
+};
+
+enum fimc_is_sensor_stat_control {
+ SENSOR_STAT_NOTHING = 0, /* Default */
+ SENSOR_STAT_LSI_3DHDR, /* LSI 3DHDR stat control */
+ SENSOR_STAT_CONTROL_MAX,
+};
+
enum fimc_is_aperture_control_step {
APERTURE_STEP_STATIONARY = 0,
APERTURE_STEP_PREPARE,
struct fimc_is_aperture_ops {
int (*set_aperture_value)(struct v4l2_subdev *subdev, int value);
+#ifndef CONFIG_CAMERA_USE_MCU
int (*set_aperture_start_value_step1)(struct v4l2_subdev *subdev, int value);
int (*set_aperture_start_value_step2)(struct v4l2_subdev *subdev, int value);
int (*prepare_ois_autotest)(struct v4l2_subdev *subdev);
+#endif
int (*aperture_deinit)(struct v4l2_subdev *subdev, int value);
};
/* OIS */
struct fimc_is_ois_ops {
int (*ois_init)(struct v4l2_subdev *subdev);
-#ifdef CONFIG_OIS_USE_RUMBA_S6
+#if defined (CONFIG_OIS_USE_RUMBA_S6) || defined (CONFIG_CAMERA_USE_MCU)
int (*ois_deinit)(struct v4l2_subdev *subdev);
#endif
#ifdef USE_OIS_SLEEP_MODE
void (*ois_fw_update)(struct fimc_is_core *core);
#endif
int (*ois_self_test)(struct fimc_is_core *core);
+#ifndef CONFIG_CAMERA_USE_MCU
bool (*ois_diff_test)(struct fimc_is_core *core, int *x_diff, int *y_diff);
+#endif
bool (*ois_auto_test)(struct fimc_is_core *core,
int threshold, bool *x_result, bool *y_result, int *sin_x, int *sin_y);
#ifdef CAMERA_REAR2_OIS
bool (*ois_auto_test_rear2)(struct fimc_is_core *core,
int threshold, bool *x_result, bool *y_result, int *sin_x, int *sin_y,
bool *x_result_2nd, bool *y_result_2nd, int *sin_x_2nd, int *sin_y_2nd);
+ int (*ois_set_power_mode)(struct v4l2_subdev *subdev);
#endif
bool (*ois_check_fw)(struct fimc_is_core *core);
void (*ois_enable)(struct fimc_is_core *core);
u8 (*ois_read_cal_checksum)(struct fimc_is_core *core);
int (*ois_set_coef)(struct v4l2_subdev *subdev, u8 coef);
int (*ois_read_fw_ver)(char *name, char *ver);
+ int (*ois_center_shift)(struct v4l2_subdev *subdev);
+ int (*ois_set_center)(struct v4l2_subdev *subdev);
+ u8 (*ois_read_mode)(struct v4l2_subdev *subdev);
};
struct fimc_is_sensor_interface;
bool (*is_vvalid_period)(struct fimc_is_sensor_interface *itf);
int (*request_exposure)(struct fimc_is_sensor_interface *itf,
- u32 long_exposure,
- u32 short_exposure);
+ enum fimc_is_exposure_gain_count num_data, u32 *exposure);
int (*adjust_exposure)(struct fimc_is_sensor_interface *itf,
- u32 long_exposure,
- u32 short_exposure,
- u32 *available_long_exposure,
- u32 *available_short_exposure,
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
+ u32 *available_exposure,
fimc_is_sensor_adjust_direction adjust_direction);
int (*get_next_frame_timing)(struct fimc_is_sensor_interface *itf,
- u32 *long_exposure,
- u32 *short_exposure,
- u32 *frame_period,
- u64 *line_period);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
+ u32 *frame_period,
+ u64 *line_period);
int (*get_frame_timing)(struct fimc_is_sensor_interface *itf,
- u32 *long_exposure,
- u32 *short_exposure,
- u32 *frame_period,
- u64 *line_period);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *exposure,
+ u32 *frame_period,
+ u64 *line_period);
int (*request_analog_gain)(struct fimc_is_sensor_interface *itf,
- u32 long_analog_gain,
- u32 short_analog_gain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain);
int (*request_gain)(struct fimc_is_sensor_interface *itf,
- u32 long_total_gain,
- u32 long_analog_gain,
- u32 long_digital_gain,
- u32 short_total_gain,
- u32 short_analog_gain,
- u32 short_digital_gain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *total_gain,
+ u32 *analog_gain,
+ u32 *digital_gain);
int (*adjust_analog_gain)(struct fimc_is_sensor_interface *itf,
- u32 desired_long_analog_gain,
- u32 desired_short_analog_gain,
- u32 *actual_long_gain,
- u32 *actual_short_gain,
- fimc_is_sensor_adjust_direction adjust_direction);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *desired_analog_gain,
+ u32 *actual_gain,
+ fimc_is_sensor_adjust_direction adjust_direction);
int (*get_next_analog_gain)(struct fimc_is_sensor_interface *itf,
- u32 *long_analog_gain,
- u32 *short_analog_gain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain);
int (*get_analog_gain)(struct fimc_is_sensor_interface *itf,
- u32 *long_analog_gain,
- u32 *short_analog_gain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *analog_gain);
int (*get_next_digital_gain)(struct fimc_is_sensor_interface *itf,
- u32 *long_digital_gain,
- u32 *short_digital_gain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *digital_gain);
int (*get_digital_gain)(struct fimc_is_sensor_interface *itf,
- u32 *long_digital_gain,
- u32 *short_digital_gain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *digital_gain);
bool (*is_actuator_available)(struct fimc_is_sensor_interface *itf);
bool (*is_flash_available)(struct fimc_is_sensor_interface *itf);
/* reset exposure and gain for Flash */
int (*request_reset_expo_gain)(struct fimc_is_sensor_interface *itf,
- u32 long_expo,
- u32 long_tgain,
- u32 long_again,
- u32 long_dgain,
- u32 short_expo,
- u32 short_tgain,
- u32 short_again,
- u32 short_dgain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *expo,
+ u32 *tgain,
+ u32 *again,
+ u32 *dgain);
int (*set_sensor_info_mode_change)(struct fimc_is_sensor_interface *itf,
- u32 long_expo,
- u32 long_again,
- u32 long_dgain,
- u32 expo,
- u32 again,
- u32 dgain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *expo,
+ u32 *again,
+ u32 *dgain);
int (*update_sensor_dynamic_meta)(struct fimc_is_sensor_interface *itf,
u32 frame_count,
camera2_ctl_t *ctrl,
int (*set_sensor_3a_mode)(struct fimc_is_sensor_interface *itf,
u32 mode);
int (*get_initial_exposure_gain_of_sensor)(struct fimc_is_sensor_interface *itf,
- u32 *long_expo,
- u32 *long_again,
- u32 *long_dgain,
- u32 *short_expo,
- u32 *short_again,
- u32 *short_dgain);
+ enum fimc_is_exposure_gain_count num_data,
+ u32 *expo,
+ u32 *again,
+ u32 *dgain);
};
struct fimc_is_cis_ext_interface_ops {
u32(*request_frame_length_line)(struct fimc_is_sensor_interface *itf, u32 framelengthline);
int (*request_sensitivity)(struct fimc_is_sensor_interface *itf,
u32 sensitivity);
+ int (*get_sensor_flag)(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control *stat_control_type,
+ u32 *exposure_count);
+ int (*set_sensor_stat_control_mode_change)(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control stat_control_type,
+ void *stat_control);
+ int (*set_sensor_roi_control)(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control stat_control_type,
+ void *roi_control);
+ int (*set_sensor_stat_control_per_frame)(struct fimc_is_sensor_interface *itf,
+ enum fimc_is_sensor_stat_control stat_control_type,
+ void *stat_control);
};
struct fimc_is_cis_ext2_interface_ops {
int (*set_long_term_expo_mode)(struct fimc_is_sensor_interface *itf,
struct fimc_is_long_term_expo_mode *long_term_expo_mode);
int (*set_low_noise_mode)(struct fimc_is_sensor_interface *itf, u32 mode);
- void *reserved[19];
+ int (*get_sensor_max_dynamic_fps)(struct fimc_is_sensor_interface *itf, u32 *max_dynamic_fps);
+ /* Get static memory address for DDK/RTA backup data */
+ int (*get_static_mem)(int ctrl_id, void **mem, int *size);
+ int (*request_wb_gain)(struct fimc_is_sensor_interface *itf,
+ u32 gr_gain, u32 r_gain, u32 b_gain, u32 gb_gain);
+ int (*set_sensor_info_mfhdr_mode_change)(struct fimc_is_sensor_interface *itf,
+ u32 count, u32 *long_expo, u32 *long_again, u32 *long_dgain,
+ u32 *expo, u32 *again, u32 *dgain);
+ void *reserved[15];
};
struct fimc_is_cis_event_ops {
u32 main_fls_strm_on_off_step; /* 0: main/pre-flash exposure and gains, 1: ambient exposure and gains */
};
-/* PDP structure & PDP Interface */
-enum {
- FILTER_BAND_0,
- FILTER_BAND_1,
- FILTER_BAND_2,
- FILTER_BAND_L,
- MAX_FILTER_BAND
-};
-
-struct pdp_main_wininfo {
- bool update;
- u16 center_x;
- u16 center_y;
- u16 start_x;
- u16 start_y;
- u16 end_x;
- u16 end_y;
-};
-
-struct pdp_multi_wininfo {
- bool update;
- u8 mode_on;
- u16 start_x;
- u16 start_y;
- u16 size_x;
- u16 size_y;
- u16 gap_x;
- u16 gap_y;
- u16 no_x;
- u16 no_y;
-};
-
-struct pdp_single_wininfo {
- bool update;
- u16 sroi;
- struct pdp_main_wininfo single_win[4];
-};
-
-struct pdp_knee_setting_t {
- bool update;
- u16 knee_on;
- u16 kn_inc_0;
- u16 kn_inc_1;
- u16 kn_inc_2;
- u16 kn_inc_3;
- u16 kn_inc_4;
- u16 kn_inc_5;
- u16 kn_inc_6;
- u16 kn_inc_7;
- u16 kn_offset_1;
- u16 kn_offset_2;
- u16 kn_offset_3;
- u16 kn_offset_4;
- u16 kn_offset_5;
- u16 kn_offset_6;
- u16 kn_offset_7;
-};
-
-struct pdp_filterBand_setting_t {
- bool update;
- u16 gain0;
- u16 k01;
- u16 k02;
- u16 type0;
- u16 gain1;
- u16 k11;
- u16 k12;
- u16 c11;
- u16 c12;
- u16 gain2;
- u16 k21;
- u16 k22;
- u16 c21;
- u16 c22;
- u16 bypass0;
- u16 bypass1;
- u16 bypass2;
- u16 cor_type_b;
- u16 coring_ty_b;
- u16 coring_th_b;
- u16 coring_b;
- u16 bin_first_b;
- u16 binning_num_b;
- u16 bin_skip_b;
-};
-
-struct pdp_filterCor_setting_t {
- bool update;
- u16 coring_ty;
- u16 coring_th;
-};
-
-struct pdp_filterBin_setting_t {
- bool update;
- u16 bin_first;
- u16 binning_num_lmv_h;
- u16 binning_num_lmv_v;
-};
-
-struct pdp_wdr_setting_t {
- bool update;
- u16 wdr_on;
- u16 wdr_coef_long;
- u16 wdr_coef_short;
- u16 wdr_shft_long;
- u16 wdr_shft_short;
-};
-
-struct pdp_depth_setting_t {
- bool update;
- u16 depth_dmode;
- u16 depth_dshift;
- u16 depth_dsize1;
- u16 depth_dsize2;
- u16 depth_dsmoothe_on;
- u16 depth_dscan_on;
- u16 depth_dmedian_on;
- u16 depth_dslope_on;
- u16 depth_darm_edge_h;
- u16 depth_dmedian_size;
- u16 depth_dscan_edge;
- u16 depth_dscan_penalty;
- u16 depth_dbin_up;
- u16 depth_dscale_up;
- u16 depth_dout_stat_mode;
- u16 depth_dinverse_snr;
- u16 depth_dcoef_snr;
- u16 depth_dcoef_edgeh;
- u16 depth_dcoef_edgev;
- u16 depth_dshift_filter;
- u16 depth_dadd_filter;
- u16 depth_dmask_filter_1;
- u16 depth_dmask_filter_2;
- u16 depth_dmask_filter_3;
- u16 depth_dmask_filter_4;
- u16 depth_dmask_filter_5;
-};
-
-struct pdp_YextParam_setting_t {
- bool update;
- u16 max_no_skippxg;
- u16 skip_levelth;
- u16 px_sat_g;
- u16 px_sat_r;
- u16 px_sat_b;
- u16 sat_no_g;
- u16 sat_no_r;
- u16 sat_no_b;
- u16 sat_g;
- u16 sat_r;
- u16 sat_b;
- u16 clip_val_left;
- u16 clip_val_right;
- u16 coef_r_short;
- u16 coef_g_short;
- u16 coef_b_short;
- u16 y_shift;
- u16 coef_r_long;
- u16 coef_g_long;
- u16 coef_b_long;
-};
-
-struct pdp_paf_roi_setting_t {
- bool update;
- u16 roi_start_x;
- u16 roi_start_y;
- u16 roi_end_x;
- u16 roi_end_y;
-};
-
-struct pdp_paf_setting_t {
- bool update;
- u16 xcor_on;
- u16 af_cross;
- u16 mpd_on;
- u16 mpd_hbin;
- u16 mpd_vbin;
- u16 mpd_vsft;
- u16 mpd_dp;
- u16 mpd_dp_th;
- u16 phase_range;
- u16 dpc_on;
- u16 lmv_on;
- u16 lmv_shift;
- u16 alc_on;
- u16 alc_gap;
- u16 alc_clip_on;
- u16 alc_fit_on;
- u16 b2_en;
- u16 crop_on;
- u16 af_debug_mode;
- u16 lf_shift;
- u16 pafsat_on;
- u16 sat_lv;
- u16 sat_lv1;
- u16 sat_lv2;
- u16 sat_lv3;
- u16 sat_src;
- u16 cor_type;
- u16 g_ssd;
- u16 ob_value;
- u16 af_layout;
- u16 af_pattern;
- u16 roi_zg1;
- u16 roi_zg2;
- u16 roi_zg3;
- u16 roi_zg4;
-};
-
-struct pdp_total_setting_t {
- struct pdp_paf_setting_t *paf_setting;
- struct pdp_paf_roi_setting_t *paf_roi_setting;
- struct pdp_main_wininfo *paf_main_window;
- struct pdp_single_wininfo *paf_single_window;
- struct pdp_multi_wininfo *paf_multi_window;
- struct pdp_knee_setting_t *paf_knee_setting;
- struct pdp_filterCor_setting_t *paf_filter_cor;
- struct pdp_filterBin_setting_t *paf_filter_bin;
- struct pdp_filterBand_setting_t *paf_filter_band[MAX_FILTER_BAND];
-
- struct pdp_wdr_setting_t *wdr_setting;
- struct pdp_depth_setting_t *depth_setting;
- struct pdp_YextParam_setting_t *y_ext_param;
-};
-
-struct pdp_read_reg_setting_t {
- u32 read_addr_offset;
- u32 *addr_array;
- u32 *buf_array;
- u32 buf_size;
-};
-
-struct fimc_is_pdp_ops {
- int (*read_pdp_reg)(struct v4l2_subdev *subdev, struct pdp_read_reg_setting_t *reg_param);
- int (*read_paf_sfr_stat)(struct v4l2_subdev *subdev, u32 *buf);
- int (*get_irq_state)(struct v4l2_subdev *subdev, int *irq_state);
- int (*clear_irq_state)(struct v4l2_subdev *subdev, int irq_state);
- int (*set_pdp_param)(struct v4l2_subdev *subdev, struct pdp_total_setting_t *pdp_param);
-};
-
-struct fimc_is_pdp_interface_ops {
- int (*read_pdp_reg)(struct fimc_is_sensor_interface *itf, struct pdp_read_reg_setting_t *reg_param);
- int (*read_paf_sfr_stat)(struct fimc_is_sensor_interface *itf, u32 *buf);
- int (*get_irq_state)(struct fimc_is_sensor_interface *itf, int *irq_state);
- int (*clear_irq_state)(struct fimc_is_sensor_interface *itf, int irq_state);
- int (*set_pdp_param)(struct fimc_is_sensor_interface *itf, struct pdp_total_setting_t *pdp_param);
- int (*reserved[2])(struct fimc_is_sensor_interface *itf);
-};
-
struct fimc_is_flash_interface_ops {
int (*request_flash)(struct fimc_is_sensor_interface *itf,
u32 mode,
camera2_shot_t *shot);
};
+/* arguments: stat_type, frame_count, notifier_data */
+typedef int (*vc_dma_notifier_t)(int, unsigned int, void *);
+
struct fimc_is_csi_interface_ops {
int (*get_vc_dma_buf)(struct fimc_is_sensor_interface *itf,
enum itf_vc_buf_data_type request_data_type,
+ u32 frame_count,
u32 *buf_index,
- u64 *buf_addr,
- u32 *frame_count);
+ u64 *buf_addr);
int (*put_vc_dma_buf)(struct fimc_is_sensor_interface *itf,
enum itf_vc_buf_data_type request_data_type,
u32 index);
int (*get_vc_dma_buf_info)(struct fimc_is_sensor_interface *itf,
enum itf_vc_buf_data_type request_data_type,
- struct vc_buf_info_t *buf_info,
- u32 *sensor_shifted_num);
+ struct vc_buf_info_t *buf_info);
int (*get_vc_dma_buf_max_size)(struct fimc_is_sensor_interface *itf,
enum itf_vc_buf_data_type request_data_type,
u32 *width,
u32 *height,
u32 *element_size);
- int (*reserved[4])(struct fimc_is_sensor_interface *itf);
+#ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
+ int (*get_sensor_shifted_num)(struct fimc_is_sensor_interface *itf,
+ u32 *sensor_shifted_num);
+ int (*reserved[3])(struct fimc_is_sensor_interface *itf);
+#else
+ int (*register_vc_dma_notifier)(struct fimc_is_sensor_interface *itf,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier, void *data);
+ int (*unregister_vc_dma_notifier)(struct fimc_is_sensor_interface *itf,
+ enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier);
+ int (*reserved[2])(struct fimc_is_sensor_interface *itf);
+#endif
};
-struct pafstat_setting_t {
+struct paf_setting_t {
u32 reg_addr;
u32 reg_data;
};
-struct fimc_is_paf_ops {
- int (*set_param)(struct v4l2_subdev *subdev,
- struct pafstat_setting_t *regs, u32 regs_size);
- u32 (*get_ready)(struct v4l2_subdev *subdev);
- int (*set_num_buffers)(struct v4l2_subdev *subdev, u32 num_buffers, u32 mipi_speed);
-};
-
struct fimc_is_paf_interface_ops {
- int (*set_pafstat_param)(struct fimc_is_sensor_interface *itf,
- struct pafstat_setting_t *regs, u32 regs_size);
- int (*get_pafstat_ready)(struct fimc_is_sensor_interface *itf, u32 *ready);
- int (*reserved[8])(struct fimc_is_sensor_interface *itf);
+ int (*set_paf_param)(struct fimc_is_sensor_interface *itf,
+ struct paf_setting_t *regs, u32 regs_size);
+ int (*get_paf_ready)(struct fimc_is_sensor_interface *itf, u32 *ready);
+ int (*reserved[6])(struct fimc_is_sensor_interface *itf);
};
struct fimc_is_dual_interface_ops {
int (*reserved[2])(struct fimc_is_sensor_interface *itf);
};
+struct fimc_is_eeprom_ops {
+ int (*eeprom_read)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_all_crc)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_address)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_info)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_awb)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_af)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_ae)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_lsc)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_ois)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_pdaf)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_dual)(struct v4l2_subdev *subdev);
+ int (*eeprom_check_sfr)(struct v4l2_subdev *subdev);
+};
+
struct fimc_is_sensor_interface {
u32 magic;
struct fimc_is_cis_interface_ops cis_itf_ops;
struct fimc_is_actuator_interface_ops actuator_itf_ops;
struct fimc_is_flash_interface_ops flash_itf_ops;
struct fimc_is_aperture_interface_ops aperture_itf_ops;
- struct fimc_is_pdp_interface_ops pdp_itf_ops;
struct fimc_is_paf_interface_ops paf_itf_ops;
bool vsync_flag;
enum DIFF_BET_SEN_ISP diff_bet_sen_isp;
enum itf_cis_interface cis_mode;
- u32 total_gain[MAX_EXPOSURE_GAIN_PER_FRAME][NUM_FRAMES];
- u32 analog_gain[MAX_EXPOSURE_GAIN_PER_FRAME][NUM_FRAMES];
- u32 digital_gain[MAX_EXPOSURE_GAIN_PER_FRAME][NUM_FRAMES];
- u32 exposure[MAX_EXPOSURE_GAIN_PER_FRAME][NUM_FRAMES];
+ u32 total_gain[EXPOSURE_GAIN_MAX][NUM_FRAMES];
+ u32 analog_gain[EXPOSURE_GAIN_MAX][NUM_FRAMES];
+ u32 digital_gain[EXPOSURE_GAIN_MAX][NUM_FRAMES];
+ u32 exposure[EXPOSURE_GAIN_MAX][NUM_FRAMES];
u32 flash_mode[NUM_FRAMES];
u32 flash_intensity[NUM_FRAMES];
int init_sensor_interface(struct fimc_is_sensor_interface *itf);
/* Sensor interface helper function */
-struct fimc_is_module_enum *get_subdev_module_enum(struct fimc_is_sensor_interface *itf);
-struct fimc_is_device_csi *get_subdev_csi(struct fimc_is_sensor_interface *itf);
struct fimc_is_actuator *get_subdev_actuator(struct fimc_is_sensor_interface *itf);
u32 get_frame_count(struct fimc_is_sensor_interface *itf);
help
Use to build S2MPB02 driver.
+config CAMERA_FLASH_S2MU106_OBJ
+ bool "Use S2MU106"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_FLASH_SELECT
+ default n
+ help
+ Use to build S2MU106 driver.
+
config CAMERA_FLASH_GPIO_OBJ
bool "Use GPIO"
depends on USE_DIRECT_IS_CONTROL
obj-$(CONFIG_CAMERA_FLASH_LM3560_OBJ) += fimc-is-flash-lm3560.o
obj-$(CONFIG_CAMERA_FLASH_RT5033_OBJ) += fimc-is-flash-rt5033.o
obj-$(CONFIG_CAMERA_FLASH_S2MPB02_OBJ) += fimc-is-flash-s2mpb02.o
+obj-$(CONFIG_CAMERA_FLASH_S2MU106_OBJ) += fimc-is-flash-s2mu106.o
obj-$(CONFIG_CAMERA_FLASH_GPIO_OBJ) += fimc-is-flash-gpio.o
obj-$(CONFIG_CAMERA_FLASH_KTD2692_OBJ) += fimc-is-flash-ktd2692.o
obj-$(CONFIG_CAMERA_FLASH_I2C_OBJ) += fimc-is-helper-flash-i2c.o \
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Flash driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/gpio.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-core.h"
+
+#include <linux/leds-s2mu106.h>
+
+#define CAPTURE_MAX_TOTAL_CURRENT (1500)
+#define TORCH_MAX_TOTAL_CURRENT (250)
+#define MAX_FLASH_INTENSITY (256)
+
+static int flash_s2mu106_init(struct v4l2_subdev *subdev, u32 val)
+{
+ int ret = 0;
+ struct fimc_is_flash *flash;
+ int i;
+
+ FIMC_BUG(!subdev);
+
+ flash = (struct fimc_is_flash *)v4l2_get_subdevdata(subdev);
+
+ FIMC_BUG(!flash);
+
+ /* TODO: init flash driver */
+ flash->flash_data.mode = CAM2_FLASH_MODE_OFF;
+ flash->flash_data.intensity = 100; /* TODO: Need to figure out min/max range */
+ flash->flash_data.firing_time_us = 1 * 1000 * 1000; /* Max firing time is 1sec */
+ flash->flash_data.flash_fired = false;
+ flash->flash_data.cal_en = false;
+
+ for (i = 0; i < FLASH_LED_CH_MAX; i++) {
+ if (flash->led_ch[i] >= 0)
+ s2mu106_fled_set_mode_ctrl(flash->led_ch[i], CAM_FLASH_MODE_OFF);
+ }
+
+ return ret;
+}
+
+static int flash_s2mu106_adj_current(struct fimc_is_flash *flash, enum flash_mode mode, u32 intensity)
+{
+ int adj_current = 0;
+ int max_current = 0;
+ int led_num = 0;
+ int i;
+
+ for (i = 0; i < FLASH_LED_CH_MAX; i++) {
+ if (flash->led_ch[i] != -1)
+ led_num++;
+ }
+
+ if (led_num == 0) {
+ err("wrong flash led number, set to 0");
+ return 0;
+ }
+
+ if (mode == CAM2_FLASH_MODE_SINGLE)
+ max_current = CAPTURE_MAX_TOTAL_CURRENT;
+ else if (mode == CAM2_FLASH_MODE_TORCH)
+ max_current = TORCH_MAX_TOTAL_CURRENT;
+ else
+ return 0;
+
+#ifdef FLASH_CAL_DATA_ENABLE
+ if (led_num > 2)
+ warn("Num of LED is over 2: %d\n", led_num);
+
+ led_num = 0;
+
+ if (flash->flash_data.cal_en == false) {
+ /* flash or torch set by ddk */
+ adj_current = ((max_current * intensity) / MAX_FLASH_INTENSITY);
+
+ if (adj_current > max_current) {
+ warn("flash intensity(%d) > max(%d), set to max forcely",
+ adj_current, max_current);
+ adj_current = max_current;
+ }
+
+ for (i = 0; i < FLASH_LED_CH_MAX; i++) {
+ if (flash->led_ch[i] == -1)
+ continue;
+
+ led_num++;
+ if (led_num == 1) {
+ flash->flash_data.inp_current[i] = adj_current;
+ dbg_flash("[CH: %d] Flash set with adj_current: %d\n",
+ flash->led_ch[i], flash->flash_data.inp_current[i]);
+ } else if (led_num == 2) {
+ flash->flash_data.inp_current[i] = max_current - adj_current;
+ dbg_flash("[CH: %d] Flash set with adj_current: %d\n",
+ flash->led_ch[i], flash->flash_data.inp_current[i]);
+ } else {
+ warn("skip set current value\n");
+ }
+ }
+ } else {
+ /* flash or torch set by hal */
+ for (i = 0; i < FLASH_LED_CH_MAX; i++) {
+ if (flash->led_ch[i] != -1) {
+ led_num++;
+ adj_current = flash->flash_data.inp_current[i];
+ if (adj_current > max_current) {
+ warn("flash intensity(%d) > max(%d), set to max forcely",
+ adj_current, max_current);
+ flash->flash_data.inp_current[i] = max_current;
+ }
+ dbg_flash("[CH: %d] Flash set with adj_current: %d\n",
+ flash->led_ch[i], flash->flash_data.inp_current[i]);
+ }
+ }
+ }
+
+ dbg_flash("%s: mode: %s, led_numt: %d\n", __func__,
+ mode == CAM2_FLASH_MODE_OFF ? "OFF" :
+ mode == CAM2_FLASH_MODE_SINGLE ? "FLASH" : "TORCH",
+ led_num);
+
+ return 0;
+#else
+ if (intensity > MAX_FLASH_INTENSITY) {
+ warn("flash intensity(%d) > max(%d), set to max forcely",
+ intensity, MAX_FLASH_INTENSITY);
+ intensity = MAX_FLASH_INTENSITY;
+ }
+
+ adj_current = ((max_current * intensity) / MAX_FLASH_INTENSITY) / led_num;
+
+ dbg_flash("%s: mode: %s, adj_current: %d\n", __func__,
+ mode == CAM2_FLASH_MODE_OFF ? "OFF" :
+ mode == CAM2_FLASH_MODE_SINGLE ? "FLASH" : "TORCH",
+ adj_current);
+
+ return adj_current;
+#endif
+}
+
+static int flash_s2mu106_control(struct v4l2_subdev *subdev, enum flash_mode mode, u32 intensity)
+{
+ int ret = 0;
+ struct fimc_is_flash *flash = NULL;
+ int i;
+ int adj_current = 0;
+
+ FIMC_BUG(!subdev);
+
+ flash = (struct fimc_is_flash *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!flash);
+
+ dbg_flash("%s : mode = %s, intensity = %d\n", __func__,
+ mode == CAM2_FLASH_MODE_OFF ? "OFF" :
+ mode == CAM2_FLASH_MODE_SINGLE ? "FLASH" : "TORCH",
+ intensity);
+
+ adj_current = flash_s2mu106_adj_current(flash, mode, intensity);
+
+ for (i = 0; i < FLASH_LED_CH_MAX; i++) {
+ if (flash->led_ch[i] == -1)
+ continue;
+#ifdef FLASH_CAL_DATA_ENABLE
+ adj_current = flash->flash_data.inp_current[i];
+
+ /* If adj_current value is zero, it must be skipped to set */
+ /* Even if zero is set to flash, 50mA will flow, because 50mA is minimized value */
+ if (adj_current == 0 && mode != CAM2_FLASH_MODE_OFF) {
+ dbg_flash("[CH: %d] current value is 0, so current set need to skip\n", flash->led_ch[i]);
+ continue;
+ }
+
+ dbg_flash("[CH: %d] current is set with val: %d\n", flash->led_ch[i], adj_current);
+#endif
+ switch (mode) {
+ case CAM2_FLASH_MODE_OFF:
+ ret = s2mu106_fled_set_mode_ctrl(flash->led_ch[i], CAM_FLASH_MODE_OFF);
+ if (ret < 0) {
+ err("flash off fail(led_ch:%d)", flash->led_ch[i]);
+ ret = -EINVAL;
+ }
+ break;
+ case CAM2_FLASH_MODE_SINGLE:
+ ret = s2mu106_fled_set_curr(flash->led_ch[i], CAM_FLASH_MODE_SINGLE, adj_current);
+ if (ret < 0) {
+ err("capture flash set current fail(led_ch:%d)", flash->led_ch[i]);
+ ret = -EINVAL;
+ }
+
+ ret |= s2mu106_fled_set_mode_ctrl(flash->led_ch[i], CAM_FLASH_MODE_SINGLE);
+ if (ret < 0) {
+ err("capture flash on fail(led_ch:%d)", flash->led_ch[i]);
+ ret = -EINVAL;
+ }
+ break;
+ case CAM2_FLASH_MODE_TORCH:
+ ret = s2mu106_fled_set_curr(flash->led_ch[i], CAM_FLASH_MODE_TORCH, adj_current);
+ if (ret < 0) {
+ err("torch flash set current fail(led_ch:%d)", flash->led_ch[i]);
+ ret = -EINVAL;
+ }
+
+ ret |= s2mu106_fled_set_mode_ctrl(flash->led_ch[i], CAM_FLASH_MODE_TORCH);
+ if (ret < 0) {
+ err("torch flash on fail(led_ch:%d)", flash->led_ch[i]);
+ ret = -EINVAL;
+ }
+ break;
+ default:
+ err("Invalid flash mode");
+ ret = -EINVAL;
+ goto p_err;
+ }
+ }
+
+p_err:
+ return ret;
+}
+
+int flash_s2mu106_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
+{
+ int ret = 0;
+ struct fimc_is_flash *flash = NULL;
+
+ FIMC_BUG(!subdev);
+
+ flash = (struct fimc_is_flash *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!flash);
+
+ switch (ctrl->id) {
+#ifdef FLASH_CAL_DATA_ENABLE
+ case V4L2_CID_FLASH_SET_CAL_EN:
+ if (ctrl->value < 0) {
+ err("failed to flash set cal_en: %d\n", ctrl->value);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ flash->flash_data.cal_en = ctrl->value;
+ dbg_flash("cal_en ctrl set: %s\n", (flash->flash_data.cal_en ? "enable" : "disable"));
+ break;
+ case V4L2_CID_FLASH_SET_BY_CAL_CH0:
+ if (ctrl->value < 0) {
+ err("[ch0] failed to flash set current val by cal: %d\n", ctrl->value);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ flash->flash_data.inp_current[0] = ctrl->value;
+ break;
+ case V4L2_CID_FLASH_SET_BY_CAL_CH1:
+ if (ctrl->value < 0) {
+ err("[ch1] failed to flash set current val by cal: %d\n", ctrl->value);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ flash->flash_data.inp_current[1] = ctrl->value;
+ break;
+#else
+ case V4L2_CID_FLASH_SET_INTENSITY:
+ /* TODO : Check min/max intensity */
+ if (ctrl->value < 0) {
+ err("failed to flash set intensity: %d\n", ctrl->value);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ flash->flash_data.intensity = ctrl->value;
+ break;
+#endif
+ case V4L2_CID_FLASH_SET_FIRING_TIME:
+ /* TODO : Check min/max firing time */
+ if (ctrl->value < 0) {
+ err("failed to flash set firing time: %d\n", ctrl->value);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ flash->flash_data.firing_time_us = ctrl->value;
+ break;
+ case V4L2_CID_FLASH_SET_FIRE:
+ ret = flash_s2mu106_control(subdev, flash->flash_data.mode, ctrl->value);
+ if (ret) {
+ err("flash_s2mu106_control(mode:%d, val:%d) is fail(%d)",
+ (int)flash->flash_data.mode, ctrl->value, ret);
+ goto p_err;
+ }
+ break;
+ default:
+ err("err!!! Unknown CID(%#x)", ctrl->id);
+ ret = -EINVAL;
+ goto p_err;
+ }
+
+p_err:
+ return ret;
+}
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = flash_s2mu106_init,
+ .s_ctrl = flash_s2mu106_s_ctrl,
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+};
+
+static int __init flash_s2mu106_probe(struct device *dev, struct i2c_client *client)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_flash;
+ struct fimc_is_device_sensor *device;
+ struct fimc_is_flash *flash;
+ u32 sensor_id = 0;
+ struct device_node *dnode;
+ int i, elements;
+
+ FIMC_BUG(!fimc_is_dev);
+ FIMC_BUG(!dev);
+
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ ret = -EPROBE_DEFER;
+ goto p_err;
+ }
+
+ device = &core->sensor[sensor_id];
+
+ flash = kzalloc(sizeof(struct fimc_is_flash), GFP_KERNEL);
+ if (!flash) {
+ err("flash is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ subdev_flash = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_flash) {
+ err("subdev_flash is NULL");
+ ret = -ENOMEM;
+ kfree(flash);
+ goto p_err;
+ }
+
+ flash->id = FLADRV_NAME_S2MU106;
+ flash->subdev = subdev_flash;
+ flash->client = client;
+
+ flash->flash_data.mode = CAM2_FLASH_MODE_OFF;
+ flash->flash_data.intensity = 100; /* TODO: Need to figure out min/max range */
+ flash->flash_data.firing_time_us = 1 * 1000 * 1000; /* Max firing time is 1sec */
+
+ /* get flash_led ch by dt */
+ for (i = 0; i < FLASH_LED_CH_MAX; i++)
+ flash->led_ch[i] = -1;
+
+ elements = of_property_count_u32_elems(dnode, "led_ch");
+ if (elements < 0 || elements > FLASH_LED_CH_MAX) {
+ warn("flash led elements is too much or wrong(%d), set to max(%d)\n",
+ elements, FLASH_LED_CH_MAX);
+ elements = FLASH_LED_CH_MAX;
+ }
+
+ if (elements) {
+ if (of_property_read_u32_array(dnode, "led_ch", flash->led_ch, elements)) {
+ err("cannot get flash led_ch, set only ch1\n");
+ flash->led_ch[0] = 1;
+ }
+ } else {
+ probe_info("set flash_ch as default(only ch1)\n");
+ flash->led_ch[0] = 1;
+ }
+
+ device->subdev_flash = subdev_flash;
+ device->flash = flash;
+
+ v4l2_subdev_init(subdev_flash, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_flash, flash);
+ v4l2_set_subdev_hostdata(subdev_flash, device);
+ snprintf(subdev_flash->name, V4L2_SUBDEV_NAME_SIZE, "flash-subdev.%d", flash->id);
+
+p_err:
+ return ret;
+}
+
+static int __init flash_s2mu106_platform_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct device *dev;
+
+ FIMC_BUG(!pdev);
+
+ dev = &pdev->dev;
+
+ ret = flash_s2mu106_probe(dev, NULL);
+ if (ret < 0) {
+ probe_err("flash gpio probe fail(%d)\n", ret);
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_flash_s2mu106_match[] = {
+ {
+ .compatible = "samsung,sensor-flash-s2mu106",
+ },
+ {
+ .compatible = "samsung,sensor-front-flash-s2mu106",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_flash_s2mu106_match);
+
+/* register platform driver */
+static struct platform_driver sensor_flash_s2mu106_platform_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-FLASH-S2MU106-PLATFORM",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_flash_s2mu106_match,
+ }
+};
+
+static int __init fimc_is_sensor_flash_s2mu106_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_flash_s2mu106_platform_driver,
+ flash_s2mu106_platform_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_flash_s2mu106_platform_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(fimc_is_sensor_flash_s2mu106_init);
obj-$(CONFIG_CAMERA_CIS_6B2_OBJ) += fimc-is-device-module-6b2.o
obj-$(CONFIG_CAMERA_CIS_5E2_OBJ) += fimc-is-device-module-5e2.o
obj-$(CONFIG_CAMERA_CIS_5E3_OBJ) += fimc-is-device-module-5e3.o
+obj-$(CONFIG_CAMERA_CIS_5E9_OBJ) += fimc-is-device-module-5e9.o
obj-$(CONFIG_CAMERA_CIS_4H5YC_OBJ) += fimc-is-device-module-4h5yc.o
obj-$(CONFIG_CAMERA_CIS_4H5_OBJ) += fimc-is-device-module-4h5.o
+obj-$(CONFIG_CAMERA_CIS_4HA_OBJ) += fimc-is-device-module-4ha.o
obj-$(CONFIG_CAMERA_CIS_2P2_OBJ) += fimc-is-device-module-2p2.o
obj-$(CONFIG_CAMERA_CIS_2P6_OBJ) += fimc-is-device-module-2p6.o
obj-$(CONFIG_CAMERA_CIS_2P8_OBJ) += fimc-is-device-module-2p8.o
obj-$(CONFIG_CAMERA_CIS_3P3_OBJ) += fimc-is-device-module-3p3.o
obj-$(CONFIG_CAMERA_CIS_3L2_OBJ) += fimc-is-device-module-3l2.o
obj-$(CONFIG_CAMERA_CIS_3H1_OBJ) += fimc-is-device-module-3h1.o
+obj-$(CONFIG_CAMERA_CIS_3J1_OBJ) += fimc-is-device-module-3j1.o
obj-$(CONFIG_CAMERA_CIS_4E6_OBJ) += fimc-is-device-module-4e6.o
obj-$(CONFIG_CAMERA_CIS_3M2_OBJ) += fimc-is-device-module-3m2.o
obj-$(CONFIG_CAMERA_CIS_3M3_OBJ) += fimc-is-device-module-3m3.o
obj-$(CONFIG_CAMERA_CIS_2L1_OBJ) += fimc-is-device-module-2l1.o
obj-$(CONFIG_CAMERA_CIS_3P8_OBJ) += fimc-is-device-module-3p8.o
+obj-$(CONFIG_CAMERA_CIS_3P9_OBJ) += fimc-is-device-module-3p9.o
obj-$(CONFIG_CAMERA_CIS_3P8SP_OBJ) += fimc-is-device-module-3p8sp.o
obj-$(CONFIG_CAMERA_CIS_2P7SX_OBJ) += fimc-is-device-module-2p7sx.o
obj-$(CONFIG_CAMERA_CIS_RPB_OBJ) += fimc-is-device-module-rpb.o
obj-$(CONFIG_CAMERA_CIS_2T7SX_OBJ) += fimc-is-device-module-2t7sx.o
obj-$(CONFIG_CAMERA_CIS_2L2_OBJ) += fimc-is-device-module-2l2.o
obj-$(CONFIG_CAMERA_CIS_2L3_OBJ) += fimc-is-device-module-2l3.o
+obj-$(CONFIG_CAMERA_CIS_2L4_OBJ) += fimc-is-device-module-2l4.o
obj-$(CONFIG_CAMERA_CIS_IMX260_OBJ) += fimc-is-device-module-imx260.o
obj-$(CONFIG_CAMERA_CIS_2L7_OBJ) += fimc-is-device-module-2l7.o
obj-$(CONFIG_CAMERA_CIS_IMX320_OBJ) += fimc-is-device-module-imx320.o
obj-$(CONFIG_CAMERA_CIS_IMX258_OBJ) += fimc-is-device-module-imx258.o
obj-$(CONFIG_CAMERA_CIS_SR259_OBJ) += fimc-is-device-module-sr259.o
obj-$(CONFIG_CAMERA_CIS_IMX241_OBJ) += fimc-is-device-module-imx241.o
+obj-$(CONFIG_CAMERA_CIS_IMX576_OBJ) += fimc-is-device-module-imx576.o
+obj-$(CONFIG_CAMERA_CIS_2X5SP_OBJ) += fimc-is-device-module-2x5sp.o
+obj-$(CONFIG_CAMERA_CIS_GM1SP_OBJ) += fimc-is-device-module-gm1sp.o
+obj-$(CONFIG_CAMERA_CIS_12A10_OBJ) += fimc-is-device-module-12a10.o
+obj-$(CONFIG_CAMERA_CIS_12A10FF_OBJ) += fimc-is-device-module-12a10ff.o
+obj-$(CONFIG_CAMERA_CIS_16885C_OBJ) += fimc-is-device-module-16885c.o
obj-$(CONFIG_CAMERA_CIS_VIRTUAL_OBJ) += fimc-is-device-module-virtual.o
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_12a10[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ FIMC_IS_SENSOR_CFG(4096, 3072, 30, 0, 0, CSI_DATA_LANES_4, 1144, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4096, 3072), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4096, 3072),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2048, 1536, 60, 0, 1, CSI_DATA_LANES_4, 1144, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2048, 1536), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2048, 1536),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /*FIMC_IS_SENSOR_CFG(2000, 1124, 60, 0, 2, CSI_DATA_LANES_4, 1144, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2000, 1124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2000, 1124),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1920, 1080, 60, 0, 3, CSI_DATA_LANES_4, 1144, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1920, 1080), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1920, 1080),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),*/
+ FIMC_IS_SENSOR_CFG(1280, 720, 120, 0, 2, CSI_DATA_LANES_4, 1144, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_12a10_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_mclk = 0;
+ int gpio_avdd_en = 0;
+ int gpio_dvdd_en = 0;
+ int gpio_iovdd_en = 0;
+ struct fimc_is_core *core;
+
+ BUG_ON(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ /* TODO */
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ } else {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ }
+
+ gpio_avdd_en = of_get_named_gpio(dnode, "gpio_avdd_en", 0);
+ if (gpio_is_valid(gpio_avdd_en)) {
+ if (gpio_request_one(gpio_avdd_en, GPIOF_OUT_INIT_LOW, "CAM_AVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request avdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_avdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get avdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_dvdd_en = of_get_named_gpio(dnode, "gpio_dvdd_en", 0);
+ if (gpio_is_valid(gpio_dvdd_en)) {
+ if (gpio_request_one(gpio_dvdd_en, GPIOF_OUT_INIT_LOW, "CAM_DVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request dvdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_dvdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get dvdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_iovdd_en = of_get_named_gpio(dnode, "gpio_iovdd_en", 0);
+ if (gpio_is_valid(gpio_iovdd_en)) {
+ if (gpio_request_one(gpio_iovdd_en, GPIOF_OUT_INIT_LOW, "CAM_IOVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request iovdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_iovdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get iovdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
+
+ /* BACK CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+ /* BACK CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* REAR VISION CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int __init sensor_module_12a10_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ BUG_ON(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+#ifdef CONFIG_OF
+ fimc_is_module_parse_dt(dev, sensor_module_12a10_power_setpin);
+#endif
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ probe_err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_OV12A10;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 4096;
+ module->active_height = 3072;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 120;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "OV";
+ module->sensor_name = "OV12A10";
+ module->setfile_name = "setfile_12a10.bin";
+ module->cfgs = ARRAY_SIZE(config_module_12a10);
+ module->cfg = config_module_12a10;
+ module->ops = NULL;
+
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_FLOATING;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 4032;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_STATIC;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 127680;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ }
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ probe_err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 1000000;
+
+ ext->actuator_con.product_name = ACTUATOR_NAME_NOTHING;
+ ext->flash_con.product_name = FLADRV_NAME_NOTHING;
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+ ext->preprocessor_con.product_name = PREPROCESSOR_NAME_NOTHING;
+ ext->ois_con.product_name = OIS_NAME_NOTHING;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 1000000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 1000000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ if (pdata->preprocessor_dma_channel == DMA_CH_NOT_DEFINED)
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ else
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = pdata->preprocessor_dma_channel;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 1000000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ if (pdata->eeprom_product_name != EEPROM_NAME_NOTHING) {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_I2C;
+ ext->eeprom_con.peri_setting.i2c.channel = pdata->eeprom_i2c_ch;
+ ext->eeprom_con.peri_setting.i2c.slave_address = pdata->eeprom_i2c_addr;
+ ext->eeprom_con.peri_setting.i2c.speed = 1000000;
+ } else {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_12a10_match[] = {
+ {
+ .compatible = "samsung,sensor-module-12a10",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_12a10_match);
+
+static struct platform_driver sensor_module_12a10_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-12A10",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_12a10_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_12a10_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_12a10_driver,
+ sensor_module_12a10_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_12a10_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_12a10_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_12a10ff[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ FIMC_IS_SENSOR_CFG(4096, 3072, 30, 0, 0, CSI_DATA_LANES_4, 1144, CSI_MODE_CH0_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4096, 3072), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4096, 3072),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2048, 1536, 60, 0, 1, CSI_DATA_LANES_4, 1144, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2048, 1536), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2048, 1536),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /*FIMC_IS_SENSOR_CFG(2000, 1124, 60, 0, 2, CSI_DATA_LANES_4, 1144, CSI_MODE_CH0_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2000, 1124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2000, 1124),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1920, 1080, 60, 0, 3, CSI_DATA_LANES_4, 1144, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1920, 1080), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1920, 1080),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),*/
+ FIMC_IS_SENSOR_CFG(1280, 720, 120, 0, 2, CSI_DATA_LANES_4, 1144, CSI_MODE_CH0_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_12a10ff_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_mclk = 0;
+ int gpio_avdd_en = 0;
+ int gpio_dvdd_en = 0;
+ int gpio_iovdd_en = 0;
+ struct fimc_is_core *core;
+
+ BUG_ON(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ /* TODO */
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ } else {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ }
+
+ gpio_avdd_en = of_get_named_gpio(dnode, "gpio_avdd_en", 0);
+ if (gpio_is_valid(gpio_avdd_en)) {
+ if (gpio_request_one(gpio_avdd_en, GPIOF_OUT_INIT_LOW, "CAM_AVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request avdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_avdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get avdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_dvdd_en = of_get_named_gpio(dnode, "gpio_dvdd_en", 0);
+ if (gpio_is_valid(gpio_dvdd_en)) {
+ if (gpio_request_one(gpio_dvdd_en, GPIOF_OUT_INIT_LOW, "CAM_DVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request dvdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_dvdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get dvdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_iovdd_en = of_get_named_gpio(dnode, "gpio_iovdd_en", 0);
+ if (gpio_is_valid(gpio_iovdd_en)) {
+ if (gpio_request_one(gpio_iovdd_en, GPIOF_OUT_INIT_LOW, "CAM_IOVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request iovdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_iovdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get iovdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
+
+ /* BACK CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+ /* BACK CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* REAR VISION CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int __init sensor_module_12a10ff_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ BUG_ON(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+#ifdef CONFIG_OF
+ fimc_is_module_parse_dt(dev, sensor_module_12a10ff_power_setpin);
+#endif
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ probe_err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_OV12A10FF;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 4096;
+ module->active_height = 3072;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 120;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "OV";
+ module->sensor_name = "OV12A10FF";
+ module->setfile_name = "setfile_12a10ff.bin";
+ module->cfgs = ARRAY_SIZE(config_module_12a10ff);
+ module->cfg = config_module_12a10ff;
+ module->ops = NULL;
+
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_FLOATING;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 4032;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_STATIC;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 127680;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ }
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ probe_err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 400000;
+
+ ext->actuator_con.product_name = ACTUATOR_NAME_NOTHING;
+ ext->flash_con.product_name = FLADRV_NAME_NOTHING;
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+ ext->preprocessor_con.product_name = PREPROCESSOR_NAME_NOTHING;
+ ext->ois_con.product_name = OIS_NAME_NOTHING;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ if (pdata->preprocessor_dma_channel == DMA_CH_NOT_DEFINED)
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ else
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = pdata->preprocessor_dma_channel;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ if (pdata->eeprom_product_name != EEPROM_NAME_NOTHING) {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_I2C;
+ ext->eeprom_con.peri_setting.i2c.channel = pdata->eeprom_i2c_ch;
+ ext->eeprom_con.peri_setting.i2c.slave_address = pdata->eeprom_i2c_addr;
+ ext->eeprom_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_12a10ff_match[] = {
+ {
+ .compatible = "samsung,sensor-module-12a10ff",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_12a10ff_match);
+
+static struct platform_driver sensor_module_12a10ff_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-12A10FF",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_12a10ff_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_12a10ff_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_12a10ff_driver,
+ sensor_module_12a10ff_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_12a10ff_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_12a10ff_init);
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_16885c[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ FIMC_IS_SENSOR_CFG(2336, 1752, 30, 0, 0, CSI_DATA_LANES_4, 769, CSI_MODE_CH0_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2336, 1752), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2336, 1752),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2336, 1752, 60, 0, 1, CSI_DATA_LANES_4, 769, CSI_MODE_CH0_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2336, 1752), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2336, 1752),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /*FIMC_IS_SENSOR_CFG(1920, 1080, 60, 0, 2, CSI_DATA_LANES_4, 1456, CSI_MODE_CH0_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1920, 1080), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1920, 1080),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),*/
+ FIMC_IS_SENSOR_CFG(1920, 1080, 120, 0, 2, CSI_DATA_LANES_4, 1456, CSI_MODE_CH0_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1920, 1080), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1920, 1080),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_16885c_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_mclk = 0;
+ int gpio_avdd_en = 0;
+ int gpio_dvdd_en = 0;
+ int gpio_iovdd_en = 0;
+ struct fimc_is_core *core;
+
+ BUG_ON(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ /* TODO */
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ } else {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ }
+
+ gpio_avdd_en = of_get_named_gpio(dnode, "gpio_avdd_en", 0);
+ if (gpio_is_valid(gpio_avdd_en)) {
+ if (gpio_request_one(gpio_avdd_en, GPIOF_OUT_INIT_LOW, "CAM_AVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request avdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_avdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get avdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_dvdd_en = of_get_named_gpio(dnode, "gpio_dvdd_en", 0);
+ if (gpio_is_valid(gpio_dvdd_en)) {
+ if (gpio_request_one(gpio_dvdd_en, GPIOF_OUT_INIT_LOW, "CAM_DVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request dvdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_dvdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get dvdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_iovdd_en = of_get_named_gpio(dnode, "gpio_iovdd_en", 0);
+ if (gpio_is_valid(gpio_iovdd_en)) {
+ if (gpio_request_one(gpio_iovdd_en, GPIOF_OUT_INIT_LOW, "CAM_IOVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request iovdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_iovdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get iovdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
+
+ /* BACK CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+ /* BACK CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* REAR VISION CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int __init sensor_module_16885c_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ BUG_ON(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+#ifdef CONFIG_OF
+ fimc_is_module_parse_dt(dev, sensor_module_16885c_power_setpin);
+#endif
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ probe_err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_OV16885C;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 2336;
+ module->active_height = 1752;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 120;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "OV";
+ module->sensor_name = "OV16885C";
+ module->setfile_name = "setfile_16885c.bin";
+ module->cfgs = ARRAY_SIZE(config_module_16885c);
+ module->cfg = config_module_16885c;
+ module->ops = NULL;
+
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_FLOATING;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 4032;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_STATIC;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 127680;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ }
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ probe_err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 400000;
+
+ ext->actuator_con.product_name = ACTUATOR_NAME_NOTHING;
+ ext->flash_con.product_name = FLADRV_NAME_NOTHING;
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+ ext->preprocessor_con.product_name = PREPROCESSOR_NAME_NOTHING;
+ ext->ois_con.product_name = OIS_NAME_NOTHING;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ if (pdata->preprocessor_dma_channel == DMA_CH_NOT_DEFINED)
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ else
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = pdata->preprocessor_dma_channel;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 1000000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ if (pdata->eeprom_product_name != EEPROM_NAME_NOTHING) {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_I2C;
+ ext->eeprom_con.peri_setting.i2c.channel = pdata->eeprom_i2c_ch;
+ ext->eeprom_con.peri_setting.i2c.slave_address = pdata->eeprom_i2c_addr;
+ ext->eeprom_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_16885c_match[] = {
+ {
+ .compatible = "samsung,sensor-module-16885c",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_16885c_match);
+
+static struct platform_driver sensor_module_16885c_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-16885C",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_16885c_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_16885c_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_16885c_driver,
+ sensor_module_16885c_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_16885c_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_16885c_init);
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
#include "fimc-is-device-module-base.h"
-#define SAK2L3_PDAF_MAXWIDTH 0 /* MAX witdh size */
-#define SAK2L3_PDAF_MAXHEIGHT 0 /* MAX height size */
-#define SAK2L3_PDAF_ELEMENT 0 /* V4L2_PIX_FMT_SBGGR16 */
-#define SAK2L3_PDAF_STAT_TYPE VC_STAT_TYPE_INVALID
-
-#define SAK2L3_MIPI_MAXWIDTH 4032 /* MAX width size */
-#define SAK2L3_MIPI_MAXHEIGHT 10 /* MAX height size */
-#define SAK2L3_MIPI_ELEMENT 1 /* V4L2_PIX_FMT_SBGGR16 */
-#define SAK2L3_MIPI_STAT_TYPE VC_STAT_TYPE_PDP_PDAF
-
static struct fimc_is_sensor_cfg config_module_2l3[] = {
/* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
/* MODE 3 */
FIMC_IS_SENSOR_CFG(4032, 3024, 30, 0, 0, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 4032, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 3024),
VC_IN(1, HW_FORMAT_RAW10, 4032, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG(4032, 2268, 60, 0, 1, CSI_DATA_LANES_4, 2177, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
VC_IN(1, HW_FORMAT_RAW10, 4032, 566), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG(4032, 2268, 30, 0, 2, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
VC_IN(1, HW_FORMAT_RAW10, 4032, 566), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG(4032, 1960, 30, 0, 3, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 4032, 1960), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 1960),
VC_IN(1, HW_FORMAT_RAW10, 4032, 490), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG(3024, 3024, 30, 0, 4, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 3024, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 3024, 3024),
VC_IN(1, HW_FORMAT_RAW10, 3024, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG(2016, 1512, 30, 0, 5, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 2016, 1512), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1512),
VC_IN(1, HW_FORMAT_RAW10, 2016, 378), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG(2016, 1134, 30, 0, 6, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
VC_IN(1, HW_FORMAT_RAW10, 2016, 282), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG(1504, 1504, 30, 0, 7, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_MOD3,
VC_IN(0, HW_FORMAT_RAW10, 1504, 1504), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1504, 1504),
VC_IN(1, HW_FORMAT_RAW10, 1504, 376), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
/* MODE 3 - 24fps LIVE FOCUS */
FIMC_IS_SENSOR_CFG_EX(4032, 3024, 24, 0, 8, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
VC_IN(0, HW_FORMAT_RAW10, 4032, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 3024),
VC_IN(1, HW_FORMAT_RAW10, 4032, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG_EX(4032, 2268, 24, 0, 9, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
VC_IN(1, HW_FORMAT_RAW10, 4032, 566), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG_EX(4032, 1960, 24, 0, 10, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
VC_IN(0, HW_FORMAT_RAW10, 4032, 1960), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 1960),
VC_IN(1, HW_FORMAT_RAW10, 4032, 490), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
FIMC_IS_SENSOR_CFG_EX(3024, 3024, 24, 0, 11, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
VC_IN(0, HW_FORMAT_RAW10, 3024, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 3024, 3024),
VC_IN(1, HW_FORMAT_RAW10, 3024, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
- VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
- VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
/* MODE 2 */
FIMC_IS_SENSOR_CFG(4032, 2268, 60, 0, 12, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
/* MODE 2 - SSM */
- FIMC_IS_SENSOR_CFG_EX(2016, 1134, 60, 0, 21, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS,
+ FIMC_IS_SENSOR_CFG_EX(2016, 1134, 60, 0, 21, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS_960,
VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 2016, 4), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_EMBEDDED, 2016, 4)),
- FIMC_IS_SENSOR_CFG_EX(1280, 720, 60, 0, 22, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS,
+ FIMC_IS_SENSOR_CFG_EX(1280, 720, 60, 0, 22, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS_960,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 1280, 4), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_EMBEDDED, 1280, 4)),
+ FIMC_IS_SENSOR_CFG_EX(1280, 720, 60, 0, 23, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS_480,
VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 1280, 4), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_EMBEDDED, 1280, 4)),
/* MODE 2 - FACTORY AEB */
- FIMC_IS_SENSOR_CFG_EX(4032, 3024, 30, 0, 23, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE, EX_DRAMTEST,
+ FIMC_IS_SENSOR_CFG_EX(4032, 3024, 30, 0, 24, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE, EX_DRAMTEST,
VC_IN(0, HW_FORMAT_RAW10, 4032, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 3024),
VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 0, 0);
#endif
-
dev_info(dev, "%s X v4\n", __func__);
return 0;
struct sensor_open_extended *ext;
struct exynos_platform_fimc_is_module *pdata;
struct device *dev;
- int ch, vc_idx;
+ int ch, t;
struct pinctrl_state *s;
WARN_ON(!fimc_is_dev);
for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
- for (vc_idx = 0; vc_idx < 2; vc_idx++) {
- switch (vc_idx) {
- case VC_BUF_DATA_TYPE_SENSOR_STAT1:
- module->vc_max_size[vc_idx].width = SAK2L3_PDAF_MAXWIDTH;
- module->vc_max_size[vc_idx].height = SAK2L3_PDAF_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = SAK2L3_PDAF_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = SAK2L3_PDAF_STAT_TYPE;
- break;
- case VC_BUF_DATA_TYPE_GENERAL_STAT1:
- module->vc_max_size[vc_idx].width = SAK2L3_MIPI_MAXWIDTH;
- module->vc_max_size[vc_idx].height = SAK2L3_MIPI_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = SAK2L3_MIPI_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = SAK2L3_MIPI_STAT_TYPE;
- break;
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ /* PDP STAT0: SFR, Size: 1756(1756)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_0_PDAF_STAT0;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_2PD_MODE3;
+ module->vc_extra_info[t].max_width = 1756;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ /* PDP STAT1/2: DMA, Size: 17920+21504(17556+21168)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_0_PDAF_STAT1;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_2PD_MODE3;
+ module->vc_extra_info[t].max_width = 39424;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
}
}
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#ifdef CONFIG_OF
+#include <linux/of_gpio.h>
+#endif
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_2l4[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ /* MODE 3 */
+ FIMC_IS_SENSOR_CFG(4032, 3024, 30, 0, 0, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 3024),
+ VC_IN(1, HW_FORMAT_RAW10, 4032, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG(4032, 2268, 60, 0, 1, CSI_DATA_LANES_4, 2177, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
+ VC_IN(1, HW_FORMAT_RAW10, 4032, 566), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG(4032, 2268, 30, 0, 2, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
+ VC_IN(1, HW_FORMAT_RAW10, 4032, 566), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG(4032, 1908, 30, 0, 3, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 1908), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 1908),
+ VC_IN(1, HW_FORMAT_RAW10, 4032, 476), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG(3024, 3024, 30, 0, 4, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 3024, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 3024, 3024),
+ VC_IN(1, HW_FORMAT_RAW10, 3024, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG(2016, 1512, 30, 0, 5, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1512), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1512),
+ VC_IN(1, HW_FORMAT_RAW10, 2016, 378), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG(2016, 1134, 30, 0, 6, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
+ VC_IN(1, HW_FORMAT_RAW10, 2016, 282), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG(1504, 1504, 30, 0, 7, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_MOD3,
+ VC_IN(0, HW_FORMAT_RAW10, 1504, 1504), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1504, 1504),
+ VC_IN(1, HW_FORMAT_RAW10, 1504, 376), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ /* MODE 3 - 24fps LIVE FOCUS */
+ FIMC_IS_SENSOR_CFG_EX(4032, 3024, 24, 0, 0, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 3024),
+ VC_IN(1, HW_FORMAT_RAW10, 4032, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG_EX(4032, 2268, 24, 0, 2, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
+ VC_IN(1, HW_FORMAT_RAW10, 4032, 566), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG_EX(4032, 1908, 24, 0, 3, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 1908), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 1908),
+ VC_IN(1, HW_FORMAT_RAW10, 4032, 476), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ FIMC_IS_SENSOR_CFG_EX(3024, 3024, 24, 0, 4, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_MOD3, EX_LIVEFOCUS,
+ VC_IN(0, HW_FORMAT_RAW10, 3024, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 3024, 3024),
+ VC_IN(1, HW_FORMAT_RAW10, 3024, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 39424, 1),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 1756, 1)),
+ /* MODE 2 */
+ FIMC_IS_SENSOR_CFG(4032, 2268, 60, 0, 12, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 2268), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 2268),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2016, 1512, 120, 0, 13, CSI_DATA_LANES_4, 1404, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1512), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1512),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2016, 1512, 30, 0, 14, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1512), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1512),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2016, 1134, 240, 0, 15, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2016, 1134, 120, 0, 16, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2016, 1134, 30, 0, 17, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1504, 1504, 120, 0, 18, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1504, 1504), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1504, 1504),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1504, 1504, 30, 0, 19, CSI_DATA_LANES_4, 1352, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1504, 1504), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1504, 1504),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1008, 756, 120, 0, 20, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1008, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1008, 756),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* MODE 2 - SSM */
+ FIMC_IS_SENSOR_CFG_EX(2016, 1134, 60, 0, 21, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS_960,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 2016, 4), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_EMBEDDED, 2016, 4)),
+ FIMC_IS_SENSOR_CFG_EX(2016, 1134, 60, 0, 22, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS_480,
+ VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2016, 1134),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 2016, 4), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_EMBEDDED, 2016, 4)),
+ FIMC_IS_SENSOR_CFG_EX(1280, 720, 60, 0, 23, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS_960,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 1280, 4), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_EMBEDDED, 1280, 4)),
+ FIMC_IS_SENSOR_CFG_EX(1280, 720, 60, 0, 24, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_DT, PD_NONE, EX_DUALFPS_480,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 1280, 4), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_EMBEDDED, 1280, 4)),
+ /* MODE 2 - FACTORY AEB */
+ FIMC_IS_SENSOR_CFG_EX(4032, 3024, 30, 0, 25, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE, EX_DRAMTEST,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4032, 3024),
+ VC_IN(0, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+#ifdef CONFIG_OF
+static int sensor_2l4_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct fimc_is_core *core;
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_mclk = 0;
+ int gpio_none = 0;
+// int gpio_camio_1p8_en = 0;
+ int gpio_ois_reset = 0;
+ u32 power_seq_id = 0;
+ int ret;
+
+ WARN_ON(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (gpio_is_valid(gpio_reset)) {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ } else {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ }
+
+ /* Check for support Rumba-S6 */
+ ret = of_property_read_u32(dnode, "power_seq_id", &power_seq_id);
+ if (ret) {
+ dev_err(dev, "power_seq_id read is fail(%d)", ret);
+ power_seq_id = 0;
+ }
+
+ if (power_seq_id == 1) {
+ gpio_ois_reset = of_get_named_gpio(dnode, "gpio_ois_reset", 0);
+ if (gpio_is_valid(gpio_ois_reset)) {
+ gpio_request_one(gpio_ois_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_ois_reset);
+ }
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+#if 0
+ /* F-Rom LDO */
+ gpio_camio_1p8_en = of_get_named_gpio(dnode, "gpio_camio_1p8_en", 0);
+ if (!gpio_is_valid(gpio_camio_1p8_en)) {
+ dev_info(dev, "failed to get gpio_camio_1p8_en\n");
+ } else {
+ gpio_request_one(gpio_camio_1p8_en, GPIOF_OUT_INIT_LOW, "SUBCAM_CAMIO_1P8_EN");
+ gpio_free(gpio_camio_1p8_en);
+ }
+#endif
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON);
+#endif
+#ifdef CONFIG_OIS_USE
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF);
+#endif
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF);
+
+ /******************** NORMAL ON ********************/
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN_VOLTAGE(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_RET_1.0V_CAM", PIN_REGULATOR, 1, 1, 1025000);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_CAM", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.4V_CAM", PIN_REGULATOR, 1, 1);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.0V_CAM", PIN_REGULATOR, 1, 1 );
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDAF_COMMON_CAM", PIN_REGULATOR, 1, 1);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 1, 1);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDQ_1.1V_CAM", PIN_REGULATOR, 1, 1000);
+#ifdef CONFIG_OIS_USE
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 1, 100);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN2], &core->shared_rsc_count[SHARED_PIN2], 1);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN3], &core->shared_rsc_count[SHARED_PIN3], 1);
+#else
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 1, 0);
+#endif
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 1500);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ if (power_seq_id == 1) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2500);
+
+ if (gpio_is_valid(gpio_ois_reset)) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_ois_reset, "ois_rst high", PIN_OUTPUT, 1, 10000);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN1], &core->shared_rsc_count[SHARED_PIN1], 1);
+ }
+ } else { /* star1 : use cam_reset and ois_reset in common, need to 10ms delay for ois reset in power seq guide */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 10000);
+ }
+
+ /******************** NORMAL OFF ********************/
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDAF_COMMON_CAM", PIN_REGULATOR, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDQ_1.1V_CAM", PIN_REGULATOR, 0, 1);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.0V_CAM", PIN_REGULATOR, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.8V_CAM", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.4V_CAM", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 10);
+ if (power_seq_id == 1) {
+ if (gpio_is_valid(gpio_ois_reset)) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_ois_reset, "ois_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN1], &core->shared_rsc_count[SHARED_PIN1], 0);
+ }
+ }
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+#ifdef CONFIG_OIS_USE
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN3], &core->shared_rsc_count[SHARED_PIN3], 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN2], &core->shared_rsc_count[SHARED_PIN2], 0);
+#endif
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_RET_1.0V_CAM", PIN_REGULATOR, 0, 100);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 0, 10);
+
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ /******************** RETENTION ON (STAND BY ON) ********************/
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_reset, "(retention) sen_rst low", PIN_OUTPUT, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDAF_COMMON_CAM", PIN_REGULATOR, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDQ_1.1V_CAM", PIN_REGULATOR, 0, 1);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDD_1.0V_CAM", PIN_REGULATOR, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDA_2.8V_CAM", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDA_2.4V_CAM", PIN_REGULATOR, 0, 0);
+
+ if (power_seq_id == 1) {
+ if (gpio_is_valid(gpio_ois_reset)) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_ois_reset, "ois_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN1], &core->shared_rsc_count[SHARED_PIN1], 0);
+ }
+ }
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+#ifdef CONFIG_OIS_USE
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN3], &core->shared_rsc_count[SHARED_PIN3], 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN2], &core->shared_rsc_count[SHARED_PIN2], 0);
+#endif
+ SET_PIN_VOLTAGE(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDD_RET_1.0V_CAM", PIN_REGULATOR, 1, 100, 700000);
+ /*SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_SENSOR_RETENTION_ON, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 0, 10);*/
+#endif
+
+#ifdef CONFIG_OIS_USE
+ /* OIS_FACTORY - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDAF_COMMON_CAM", PIN_REGULATOR, 1, 0);
+#ifdef CAMERA_REAR2_AF
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDAF_2.8V_SUB", PIN_REGULATOR, 1, 20000);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_SUB", PIN_REGULATOR, 1, 0);
+#endif
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 10);
+#ifdef CONFIG_OIS_USE_RUMBA_S4
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 3, 1);
+#endif
+
+ if (power_seq_id == 1) {
+ if (gpio_is_valid(gpio_ois_reset))
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_ois_reset, "ois_rst high", PIN_OUTPUT, 1, 10000);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 10000);
+ }
+
+ /* OIS_FACTORY - POWER OFF */
+ if (power_seq_id == 1) {
+ if (gpio_is_valid(gpio_ois_reset))
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_ois_reset, "ois_rst low", PIN_OUTPUT, 0, 0);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_OUTPUT, 0, 0);
+ }
+
+#ifdef CONFIG_OIS_USE_RUMBA_S4
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+#endif
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDAF_COMMON_CAM", PIN_REGULATOR, 0, 0);
+#ifdef CAMERA_REAR2_AF
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDAF_2.8V_SUB", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_SUB", PIN_REGULATOR, 0, 0);
+#endif
+#endif
+
+#ifdef CAMERA_REAR2
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_SUB", PIN_REGULATOR, 1, 1000);
+#else
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 1, 0);
+#endif
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 1, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 0);
+
+#ifdef CAMERA_REAR2
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_SUB", PIN_REGULATOR, 0, 1000);
+#else
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 0, 0);
+#endif
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 0, 10);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+#endif /* CONFIG_OF */
+
+static int __init sensor_module_2l4_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ WARN_ON(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_err("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+#ifdef CONFIG_OF
+ fimc_is_module_parse_dt(dev, sensor_2l4_power_setpin);
+#endif
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ probe_err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id,
+ atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_SAK2L4;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 4032;
+ module->active_height = 3024;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 480;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SLSI";
+ module->sensor_name = "SAK2L4";
+ module->setfile_name = "setfile_2l4.bin";
+ module->cfgs = ARRAY_SIZE(config_module_2l4);
+ module->cfg = config_module_2l4;
+ module->ops = NULL;
+
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ /* PDP STAT0: SFR, Size: 1756(1756)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_0_PDAF_STAT0;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_2PD_MODE3;
+ module->vc_extra_info[t].max_width = 1756;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ /* PDP STAT1/2: DMA, Size: 17920+21504(17556+21168)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_0_PDAF_STAT1;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_2PD_MODE3;
+ module->vc_extra_info[t].max_width = 39424;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ }
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ probe_err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ ext->use_retention_mode = SENSOR_RETENTION_INACTIVE;
+#endif
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 1000000;
+
+ ext->actuator_con.product_name = ACTUATOR_NAME_NOTHING;
+ ext->flash_con.product_name = FLADRV_NAME_NOTHING;
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+ ext->preprocessor_con.product_name = PREPROCESSOR_NAME_NOTHING;
+ ext->ois_con.product_name = OIS_NAME_NOTHING;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ /* ToDo: ???? */
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ if (pdata->preprocessor_dma_channel == DMA_CH_NOT_DEFINED)
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ else
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = pdata->preprocessor_dma_channel;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ if (pdata->mcu_product_name != MCU_NAME_NOTHING) {
+ ext->mcu_con.product_name = pdata->mcu_product_name;
+ ext->mcu_con.peri_type = SE_I2C;
+ ext->mcu_con.peri_setting.i2c.channel = pdata->mcu_i2c_ch;
+ ext->mcu_con.peri_setting.i2c.slave_address = pdata->mcu_i2c_addr;
+ ext->mcu_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->mcu_con.product_name = pdata->mcu_product_name;
+ ext->mcu_con.peri_type = SE_NULL;
+ }
+
+ if (pdata->aperture_product_name != APERTURE_NAME_NOTHING) {
+ ext->aperture_con.product_name = pdata->aperture_product_name;
+ ext->aperture_con.peri_type = SE_I2C;
+ ext->aperture_con.peri_setting.i2c.channel = pdata->aperture_i2c_ch;
+ ext->aperture_con.peri_setting.i2c.slave_address = pdata->aperture_i2c_addr;
+ ext->aperture_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->aperture_con.product_name = pdata->aperture_product_name;
+ ext->aperture_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+ probe_info("module->cfg=%p module->cfgs=%d\n", module->cfg, module->cfgs);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+p_err:
+ probe_info("%s(%d)\n", __func__, ret);
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_2l4_match[] = {
+ {
+ .compatible = "samsung,sensor-module-2l4",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_2l4_match);
+
+static struct platform_driver sensor_module_2l4_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-2L4",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_2l4_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_2l4_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_2l4_driver,
+ sensor_module_2l4_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_2l4_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_2l4_init);
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
/* BACK CAEMRA - POWER ON */
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDD_2.8V_OIS", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_CAM", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.0V_CAM", PIN_REGULATOR, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 3000);
+
+
+ /* SENSOR FACTORY TEST - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.0V_CAM", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDD_2.8V_OIS", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.8V_CAM", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
dev_info(dev, "%s X v4\n", __func__);
return 0;
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
/* BACK CAEMRA - POWER ON */
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_CAM_T", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDD_2.8V_OIS_T", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_CAM_T", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.0V_CAM_T", PIN_REGULATOR, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* SENSOR FACTORY TEST - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.0V_CAM_T", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDD_2.8V_OIS_T", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.8V_CAM_T", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_CAM_T", PIN_REGULATOR, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
dev_info(dev, "%s X v4\n", __func__);
return 0;
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_2x5sp[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ FIMC_IS_SENSOR_CFG(2880, 2160, 30, 0, 0, CSI_DATA_LANES_4, 2100, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2880, 2160), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2880, 2160),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_USER, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_USER, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG_EX(2880, 2160, 30, 0, 1, CSI_DATA_LANES_4, 1502, CSI_MODE_DT_ONLY, PD_NONE, EX_3DHDR,
+ VC_IN(0, HW_FORMAT_RAW10, 2880, 2160), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2880, 2160),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_USER, 2880, 34), VC_OUT(HW_FORMAT_USER, VC_EMBEDDED, 2880, 34)),
+ FIMC_IS_SENSOR_CFG(5760, 4320, 24, 0, 2, CSI_DATA_LANES_4, 2100, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 5760, 4320), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 5760, 4320),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_USER, 0, 0), VC_OUT(HW_FORMAT_USER, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1920, 1080, 120, 0, 3, CSI_DATA_LANES_4, 1800, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1920, 1080), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1920, 1080),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_USER, 0, 0), VC_OUT(HW_FORMAT_USER, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1280, 720, 240, 0, 4, CSI_DATA_LANES_4, 1800, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_USER, 0, 0), VC_OUT(HW_FORMAT_USER, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_2x5sp_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_mclk = 0;
+ int gpio_avdd_en = 0;
+ int gpio_dvdd_en = 0;
+ int gpio_iovdd_en = 0;
+ struct fimc_is_core *core;
+
+ BUG_ON(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ /* TODO */
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (gpio_is_valid(gpio_reset)) {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ } else {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ }
+
+ gpio_avdd_en = of_get_named_gpio(dnode, "gpio_avdd_en", 0);
+ if (gpio_is_valid(gpio_avdd_en)) {
+ if (gpio_request_one(gpio_avdd_en, GPIOF_OUT_INIT_LOW, "CAM_AVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request avdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_avdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get avdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_dvdd_en = of_get_named_gpio(dnode, "gpio_dvdd_en", 0);
+ if (gpio_is_valid(gpio_dvdd_en)) {
+ if (gpio_request_one(gpio_dvdd_en, GPIOF_OUT_INIT_LOW, "CAM_DVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request dvdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_dvdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get dvdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_iovdd_en = of_get_named_gpio(dnode, "gpio_iovdd_en", 0);
+ if (gpio_is_valid(gpio_iovdd_en)) {
+ if (gpio_request_one(gpio_iovdd_en, GPIOF_OUT_INIT_LOW, "CAM_IOVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request iovdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_iovdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get iovdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
+
+ /* BACK CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ /* TODO: need to check */
+ /* SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VLDO41_PMIC_FCAM_AVDD_2P8", PIN_REGULATOR, 1, 0); */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+ /* BACK CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ /* TODO: need to check */
+ /* SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VLDO41_PMIC_FCAM_AVDD_2P8", PIN_REGULATOR, 0, 0); */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* REAR VISION CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* REAR VISION CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int __init sensor_module_2x5sp_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ BUG_ON(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+#ifdef CONFIG_OF
+ fimc_is_module_parse_dt(dev, sensor_module_2x5sp_power_setpin);
+#endif
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_S5K2X5SP;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 5760;
+ module->active_height = 4320;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 240;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SLSI";
+ module->sensor_name = "S5K2X5SP";
+ module->setfile_name = "setfile_2x5sp.bin";
+ module->cfgs = ARRAY_SIZE(config_module_2x5sp);
+ module->cfg = config_module_2x5sp;
+ module->ops = NULL;
+
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ switch (t) {
+ case VC_BUF_DATA_TYPE_SENSOR_STAT2:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_TAIL_FOR_3HDR_LSI;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_3HDR_LSI;
+ module->vc_extra_info[t].max_width = 2880;
+ module->vc_extra_info[t].max_height = 34;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 400000;
+
+ ext->actuator_con.product_name = ACTUATOR_NAME_NOTHING;
+ ext->flash_con.product_name = FLADRV_NAME_NOTHING;
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+ ext->preprocessor_con.product_name = PREPROCESSOR_NAME_NOTHING;
+ ext->ois_con.product_name = OIS_NAME_NOTHING;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ if (pdata->preprocessor_dma_channel == DMA_CH_NOT_DEFINED)
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ else
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = pdata->preprocessor_dma_channel;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_2x5sp_match[] = {
+ {
+ .compatible = "samsung,sensor-module-2x5sp",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_2x5sp_match);
+
+static struct platform_driver sensor_module_2x5sp_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-2X5SP",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_2x5sp_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_2x5sp_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_2x5sp_driver,
+ sensor_module_2x5sp_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_2x5sp_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_2x5sp_init);
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
/********** FRONT CAMERA - POWER ON **********/
if (power_seq_id == 0) {
+#ifdef USE_BUCK2_REGULATOR_CONTROL
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDD_EXT_1P3_PB02", PIN_REGULATOR, 1, 0);
+#endif
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDAF_2.8V_VT", PIN_REGULATOR, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_VT", PIN_REGULATOR, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.05V_VT", PIN_REGULATOR, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.8V_VT", PIN_REGULATOR, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 0, 0);
+#ifdef USE_BUCK2_REGULATOR_CONTROL
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDD_EXT_1P3_PB02", PIN_REGULATOR, 0, 0);
+#endif
} else {
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_ldos_en, "gpio_ldos_en", PIN_OUTPUT, 0, 0);
}
--- /dev/null
+/*
+ * Samsung Exynos SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+/* 3J1 sensor setting version - S5K3J1S_EVT0_Ver_0.06_180625_forVendor */
+/* 0: 3648 x 2736 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 1: 2736 x 2736 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 2: 3968 x 2232 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 3: 3968 x 1880 @30.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 4: 1824 x 1368 @30fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 5: 1988 x 1120 @120.4fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 6: 1988 x 1120 @240.1fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+/* 7: 912 x 684 @120.4fps MIPI lane: 4, MIPI data rate(Mbps/lane): 1807, MIPI Mclk(Mhz): 26 */
+
+static struct fimc_is_sensor_cfg config_module_3j1[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ FIMC_IS_SENSOR_CFG(3648, 2736, 30, 0, 0, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 3648, 2736), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_RAW10, 3648, 684), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2736, 2736, 30, 0, 1, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2736, 2736), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_RAW10, 2736, 684), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(3968, 2232, 30, 0, 2, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 3968, 2232), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_RAW10, 3968, 558), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(3968, 1880, 30, 0, 3, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 3968, 1880), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_RAW10, 3968, 470), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1824, 1368, 30, 0, 4, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1824, 1368), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_RAW10, 1824, 342), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1988, 1120, 120, 0, 5, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1988, 1120), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_RAW10, 1984, 280), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 4032, 10),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1988, 1120, 240, 0, 6, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1988, 1120), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(912, 684, 120, 0, 7, CSI_DATA_LANES_4, 1807, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 912, 684), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_3j1_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_none = 0, gpio_reset = 0;
+ int gpio_mclk = 0;
+ int gpio_subcam_sel = 0;
+
+ FIMC_BUG(!dev);
+
+ dnode = dev->of_node;
+
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (gpio_is_valid(gpio_reset)) {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ } else {
+ dev_err(dev, "%s: failed to get PIN_RESET\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW");
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_subcam_sel = of_get_named_gpio(dnode, "gpio_subcam_sel", 0);
+ if (!gpio_is_valid(gpio_subcam_sel)) {
+ dev_err(dev, "failed to get gpio_subcam_sel\n");
+ } else {
+ gpio_request_one(gpio_subcam_sel, GPIOF_OUT_INIT_LOW, "SUBCAM_SEL");
+ gpio_free(gpio_subcam_sel);
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF);
+
+ /********** FRONT CAMERA - POWER ON **********/
+ if (gpio_is_valid(gpio_subcam_sel)) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_subcam_sel, "gpio_subcam_sel high", PIN_OUTPUT, 0, 2000);
+ }
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDAF_2.8V_VT", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.95V_VT", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.05V_VT", PIN_REGULATOR, 1, 1000);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "rst_high", PIN_OUTPUT, 1, 0);
+ /* Mclock enable */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 9000);
+
+ /*********** FRONT CAMERA - POWER OFF **********/
+ if (gpio_is_valid(gpio_subcam_sel)) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_subcam_sel, "gpio_subcam_sel low", PIN_OUTPUT, 0, 9);
+ }
+ /* Mclock disable */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 1);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "rst_low", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDAF_2.8V_VT", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.05V_VT", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.95V_VT", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 0, 0);
+ dev_info(dev, "%s X v4\n", __func__);
+
+ /******************** READ_ROM - POWER ON ********************/
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 10);
+
+ /******************** READ_ROM - POWER OFF ********************/
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 0, 0);
+
+ return 0;
+}
+
+static int __init sensor_module_3j1_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+ fimc_is_module_parse_dt(dev, sensor_module_3j1_power_setpin);
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ probe_err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d \n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_S5K3J1;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 3976;
+ module->active_height = 2736;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 240;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SLSI";
+ module->sensor_name = "S5K3J1";
+ module->setfile_name = "setfile_3j1.bin";
+ module->cfgs = ARRAY_SIZE(config_module_3j1);
+ module->cfg = config_module_3j1;
+ module->ops = NULL;
+
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ /* PDP STAT0: SFR, Size: 1756(1756)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_0_PDAF_STAT0;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_2PD_MODE3;
+ module->vc_extra_info[t].max_width = 1756;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ /* PDP STAT1/2: DMA, Size: 17920+21504(17556+21168)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_0_PDAF_STAT1;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_2PD_MODE3;
+ module->vc_extra_info[t].max_width = 39424;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ }
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ probe_err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri*)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ ext->use_retention_mode = SENSOR_RETENTION_UNSUPPORTED;
+#endif
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 1000000;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ } else {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_3j1_match[] = {
+ {
+ .compatible = "samsung,sensor-module-3j1",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_3j1_match);
+
+static struct platform_driver sensor_module_3j1_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-3J1",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_3j1_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_3j1_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_3j1_driver,
+ sensor_module_3j1_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_3j1_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_3j1_init);
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
#include "fimc-is-device-module-base.h"
-#define S5K3M3_PDAF_MAXWIDTH 128 /* MAX witdh size */
-#define S5K3M3_PDAF_MAXHEIGHT 736 /* MAX height size */
-#define S5K3M3_PDAF_ELEMENT 2 /* V4L2_PIX_FMT_SBGGR16 */
-#define S5K3M3_PDAF_STAT_TYPE VC_STAT_TYPE_TAIL_MSPD
-
-#define S5K3M3_MIPI_MAXWIDTH 0 /* MAX width size */
-#define S5K3M3_MIPI_MAXHEIGHT 0 /* MAX height size */
-#define S5K3M3_MIPI_ELEMENT 0 /* V4L2_PIX_FMT_SBGGR16 */
-#define S5K3M3_MIPI_STAT_TYPE VC_STAT_TYPE_INVALID
-
static struct fimc_is_sensor_cfg config_module_3m3[] = {
/* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
FIMC_IS_SENSOR_CFG(4032, 3024, 30, 0, 0, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(1, HW_FORMAT_RAW10, 128, 480), VC_OUT(HW_FORMAT_RAW10, VC_TAILPDAF, 128, 480),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
- FIMC_IS_SENSOR_CFG(3024, 3024, 30, 0, 3, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
+ FIMC_IS_SENSOR_CFG(4032, 1908, 30, 0, 3, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4032, 1908), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_RAW10, 128, 480), VC_OUT(HW_FORMAT_RAW10, VC_TAILPDAF, 128, 480),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(3024, 3024, 30, 0, 4, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(0, HW_FORMAT_RAW10, 3024, 3024), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
VC_IN(1, HW_FORMAT_RAW10, 96, 736), VC_OUT(HW_FORMAT_RAW10, VC_TAILPDAF, 96, 736),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
- FIMC_IS_SENSOR_CFG(2016, 1512, 30, 0, 4, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
+ FIMC_IS_SENSOR_CFG(2016, 1512, 30, 0, 5, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(0, HW_FORMAT_RAW10, 2016, 1512), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
VC_IN(1, HW_FORMAT_RAW10, 128, 736), VC_OUT(HW_FORMAT_RAW10, VC_TAILPDAF, 128, 736),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
- FIMC_IS_SENSOR_CFG(1504, 1504, 30, 0, 5, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
+ FIMC_IS_SENSOR_CFG(1504, 1504, 30, 0, 6, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(0, HW_FORMAT_RAW10, 1504, 1504), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
VC_IN(1, HW_FORMAT_RAW10, 96, 704), VC_OUT(HW_FORMAT_RAW10, VC_TAILPDAF, 96, 704),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
- FIMC_IS_SENSOR_CFG(1920, 1080, 60, 0, 6, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
+ FIMC_IS_SENSOR_CFG(1920, 1080, 60, 0, 7, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(0, HW_FORMAT_RAW10, 1920, 1080), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
VC_IN(1, HW_FORMAT_RAW10, 60, 256), VC_OUT(HW_FORMAT_RAW10, VC_TAILPDAF, 60, 256),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
- FIMC_IS_SENSOR_CFG(1344, 756, 120, 0, 7, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
+ FIMC_IS_SENSOR_CFG(1344, 756, 120, 0, 8, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(0, HW_FORMAT_RAW10, 1344, 756), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
- FIMC_IS_SENSOR_CFG(2016, 1134, 30, 0, 8, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
+ FIMC_IS_SENSOR_CFG(2016, 1134, 30, 0, 9, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_ONLY, PD_NONE,
VC_IN(0, HW_FORMAT_RAW10, 2016, 1134), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
VC_IN(1, HW_FORMAT_RAW10, 128, 544), VC_OUT(HW_FORMAT_RAW10, VC_TAILPDAF, 128, 544),
VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
int gpio_ois_reset = 0;
#endif
int gpio_none = 0;
-/* for SMDK9810 */
-#if 0
- int gpio_camio_1p8_en = 0;
- int gpio_cam_1p0_en = 0;
-#if defined(USE_3M3_AF_PIN)
- int gpio_cam_af_2p8_en = 0;
-#endif
- int gpio_cam_2p8_en = 0;
+ int gpio_subcam_sel = 0;
u32 power_seq_id = 0;
- int ret;
-#endif
+
FIMC_BUG(!dev);
dnode = dev->of_node;
}
#endif
-/* for SMDK9810 */
-#if 0
- gpio_camio_1p8_en = of_get_named_gpio(dnode, "gpio_camio_1p8_en", 0);
- if (!gpio_is_valid(gpio_camio_1p8_en)) {
- dev_err(dev, "failed to get gpio_camio_1p8_en\n");
- return -EINVAL;
- } else {
- gpio_request_one(gpio_camio_1p8_en, GPIOF_OUT_INIT_LOW, "SUBCAM_CAMIO_1P8_EN");
- gpio_free(gpio_camio_1p8_en);
- }
-
- gpio_cam_1p0_en = of_get_named_gpio(dnode, "gpio_cam_1p0_en", 0);
- if (!gpio_is_valid(gpio_cam_1p0_en)) {
- dev_err(dev, "failed to get gpio_cam_1p0_en\n");
- return -EINVAL;
+ gpio_subcam_sel = of_get_named_gpio(dnode, "gpio_subcam_sel", 0);
+ if (!gpio_is_valid(gpio_subcam_sel)) {
+ dev_err(dev, "failed to get gpio_subcam_sel\n");
} else {
- gpio_request_one(gpio_cam_1p0_en, GPIOF_OUT_INIT_LOW, "SUBCAM_CORE_1P0_EN");
- gpio_free(gpio_cam_1p0_en);
+ gpio_request_one(gpio_subcam_sel, GPIOF_OUT_INIT_LOW, "SUBCAM_SEL");
+ gpio_free(gpio_subcam_sel);
}
-#if defined(USE_3M3_AF_PIN)
- gpio_cam_af_2p8_en = of_get_named_gpio(dnode, "gpio_cam_af_2p8_en", 0);
- if (!gpio_is_valid(gpio_cam_af_2p8_en)) {
- dev_err(dev, "failed to get gpio_cam_af_2p8_en\n");
- return -EINVAL;
- } else {
- gpio_request_one(gpio_cam_af_2p8_en, GPIOF_OUT_INIT_LOW, "SUBCAM_AF_2P8_EN");
- gpio_free(gpio_cam_af_2p8_en);
- }
-#endif
-
- ret = of_property_read_u32(dnode, "power_seq_id", &power_seq_id);
- if (ret) {
- dev_err(dev, "power_seq_id read is fail(%d)", ret);
+ if (of_property_read_u32(dnode, "power_seq_id", &power_seq_id)) {
+ dev_err(dev, "power_seq_id read is fail");
power_seq_id = 0;
}
- /* Equal or after board Revision 0.2 */
- if (power_seq_id >= 1) {
- gpio_cam_2p8_en = of_get_named_gpio(dnode, "gpio_cam_2p8_en", 0);
- if (!gpio_is_valid(gpio_cam_2p8_en)) {
- dev_err(dev, "failed to get gpio_cam_2p8_en\n");
- return -EINVAL;
- } else {
- gpio_request_one(gpio_cam_2p8_en, GPIOF_OUT_INIT_LOW, "SUBCAM_2P8_EN");
- gpio_free(gpio_cam_2p8_en);
- }
- }
-#endif
-
SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
-/* for SMDK9810 */
-#if 0
- /* TELE CAEMRA - POWER ON */
- /* Before board Revision 0.2 */
- if (power_seq_id == 0) {
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDD_SUB_CAM_A2P8", PIN_REGULATOR, 1, 0);
- } else {
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_cam_2p8_en, "cam_2p8_en high", PIN_OUTPUT, 1, 0);
- }
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_cam_1p0_en, "cam_1p0_en high", PIN_OUTPUT, 1, 0);
-#if defined(USE_3M3_AF_PIN)
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_cam_af_2p8_en, "cam_af_2p8_en high", PIN_OUTPUT, 1, 2000);
-#else
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "CAM_VDD28_AF_SUB", PIN_REGULATOR, 1, 2000);
-#endif
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "OIS_VDD_1.8V", PIN_REGULATOR, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "OIS_VM_2.8V", PIN_REGULATOR, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "OIS_VDD_2.8V", PIN_REGULATOR, 1, 0);
-#endif
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_camio_1p8_en, "camio_1p8_en high", PIN_OUTPUT, 1, 100);
-
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
- /* 10ms delay is needed for I2C communication of the AK7371 actuator */
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 8000);
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_ois_reset, "ois_rst high", PIN_OUTPUT, 1, 10000);
-#endif
-
- /* TELE CAEMRA - POWER OFF */
-#if defined(USE_3M3_AF_PIN)
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_cam_af_2p8_en, "cam_af_2p8_en low", PIN_OUTPUT, 0, 9);
-#else
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "CAM_VDD28_AF_SUB", PIN_REGULATOR, 0, 9);
-#endif
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_camio_1p8_en, "camio_1p8_en low", PIN_OUTPUT, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
- /* Before board Revision 0.2 */
- if (power_seq_id == 0) {
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDD_SUB_CAM_A2P8", PIN_REGULATOR, 0, 0);
- } else {
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_cam_2p8_en, "cam_2p8_en low", PIN_OUTPUT, 0, 0);
- }
-
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_cam_1p0_en, "cam_1p0_en low", PIN_OUTPUT, 0, 0);
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_ois_reset, "ois_rst low", PIN_OUTPUT, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "OIS_VM_2.8V", PIN_REGULATOR, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "OIS_VDD_2.8V", PIN_REGULATOR, 0, 0);
-#endif
- /* Mclock disable */
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "OIS_VDD_1.8V", PIN_REGULATOR, 0, 0);
-#endif
-
-
- /* VISION - POWER ON */
- /* Before board Revision 0.2 */
- if (power_seq_id == 0) {
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDD_SUB_CAM_A2P8", PIN_REGULATOR, 1, 0);
- } else {
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_cam_2p8_en, "cam_2p8_en high", PIN_OUTPUT, 1, 0);
- }
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_cam_1p0_en, "cam_1p0_en high", PIN_OUTPUT, 1, 0);
-#if defined(USE_3M3_AF_PIN)
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_cam_af_2p8_en, "cam_af_2p8_en high", PIN_OUTPUT, 1, 2000);
-#else
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "CAM_VDD28_AF_SUB", PIN_REGULATOR, 1, 2000);
-#endif
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "OIS_VDD_1.8V", PIN_REGULATOR, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "OIS_VM_2.8V", PIN_REGULATOR, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "OIS_VDD_2.8V", PIN_REGULATOR, 1, 0);
-#endif
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_camio_1p8_en, "camio_1p8_en high", PIN_OUTPUT, 1, 100);
-
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
- /* 10ms delay is needed for I2C communication of the AK7371 actuator */
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 8000);
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_ois_reset, "ois_rst high", PIN_OUTPUT, 1, 10000);
-#endif
-
- /* TELE CAEMRA - POWER OFF */
-#if defined(USE_3M3_AF_PIN)
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_cam_af_2p8_en, "cam_af_2p8_en low", PIN_OUTPUT, 0, 9);
-#else
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "CAM_VDD28_AF_SUB", PIN_REGULATOR, 0, 9);
-#endif
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_camio_1p8_en, "camio_1p8_en low", PIN_OUTPUT, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
- /* Before board Revision 0.2 */
- if (power_seq_id == 0) {
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VDD_SUB_CAM_A2P8", PIN_REGULATOR, 0, 0);
- } else {
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_cam_2p8_en, "cam_2p8_en low", PIN_OUTPUT, 0, 0);
- }
-
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_cam_1p0_en, "cam_1p0_en low", PIN_OUTPUT, 0, 0);
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_ois_reset, "ois_rst low", PIN_OUTPUT, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "OIS_VM_2.8V", PIN_REGULATOR, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "OIS_VDD_2.8V", PIN_REGULATOR, 0, 0);
-#endif
- /* Mclock disable */
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
-#ifdef CONFIG_OIS_USE
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "OIS_VDD_1.8V", PIN_REGULATOR, 0, 0);
-#endif
-
-#else /* for STAR 9810 */
/* TELE CAMERA - POWER ON */
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_SUB", PIN_REGULATOR, 1, 0);
-#ifdef CONFIG_SEC_FACTORY
- SET_PIN_VOLTAGE(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.05V_SUB", PIN_REGULATOR, 1, 0, 1000000);
-#else
- SET_PIN_VOLTAGE(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.05V_SUB", PIN_REGULATOR, 1, 0, 1050000);
+#ifdef USE_BUCK2_REGULATOR_CONTROL
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDD_EXT_1P3_PB02", PIN_REGULATOR, 1, 0);
#endif
+ if (gpio_is_valid(gpio_subcam_sel))
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON,
+ gpio_subcam_sel, "gpio_subcam_sel high", PIN_OUTPUT, 1, 2000);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_SUB", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.05V_SUB", PIN_REGULATOR, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDAF_2.8V_SUB",
PIN_REGULATOR, 1, 2000);
#ifdef CONFIG_OIS_USE
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 1, 0);
SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
&core->shared_rsc_slock[SHARED_PIN3], &core->shared_rsc_count[SHARED_PIN3], 1);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_2.8V_OIS", PIN_REGULATOR, 1, 0);
- SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
- &core->shared_rsc_slock[SHARED_PIN4], &core->shared_rsc_count[SHARED_PIN4], 1);
#endif
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_SUB",
- PIN_REGULATOR, 1, 100);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 1, 100);
+ if (power_seq_id == 1) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 1, 100);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_FRONTSUB", PIN_REGULATOR, 1, 100);
+ }
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_SUB", PIN_REGULATOR, 1, 100);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 10);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
#endif
/* TELE CAMERA - POWER OFF */
+ if (gpio_is_valid(gpio_subcam_sel))
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF,
+ gpio_subcam_sel, "gpio_subcam_sel low", PIN_OUTPUT, 0, 9);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDAF_2.8V_SUB",
PIN_REGULATOR, 0, 9);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_SUB",
- PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_CAM", PIN_REGULATOR, 0, 0);
+ if (power_seq_id == 1) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 0, 0);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_FRONTSUB", PIN_REGULATOR, 0, 0);
+ }
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_SUB", PIN_REGULATOR, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.8V_SUB", PIN_REGULATOR, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.05V_SUB",
PIN_REGULATOR, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 0, 0);
SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
&core->shared_rsc_slock[SHARED_PIN3], &core->shared_rsc_count[SHARED_PIN3], 0);
- SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_2.8V_OIS", PIN_REGULATOR, 0, 0);
- SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
- &core->shared_rsc_slock[SHARED_PIN4], &core->shared_rsc_count[SHARED_PIN4], 0);
#endif
/* Mclock disable */
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 0, 0);
SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
&core->shared_rsc_slock[SHARED_PIN2], &core->shared_rsc_count[SHARED_PIN2], 0);
-
+#endif
+#ifdef USE_BUCK2_REGULATOR_CONTROL
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDD_EXT_1P3_PB02", PIN_REGULATOR, 0, 0);
#endif
/* VISION - POWER ON */
+#ifdef USE_BUCK2_REGULATOR_CONTROL
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDD_EXT_1P3_PB02", PIN_REGULATOR, 1, 0);
+#endif
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_SUB", PIN_REGULATOR, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.05V_SUB", PIN_REGULATOR, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDDAF_2.8V_SUB",
#ifdef CONFIG_OIS_USE
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 1, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 1, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDDD_2.8V_OIS", PIN_REGULATOR, 1, 0);
#endif
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_SUB",
PIN_REGULATOR, 1, 100);
#ifdef CONFIG_OIS_USE
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_ois_reset, "ois_rst low", PIN_OUTPUT, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VDD_VM_2.8V_OIS", PIN_REGULATOR, 0, 0);
- SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VDDD_2.8V_OIS", PIN_REGULATOR, 0, 0);
#endif
/* Mclock disable */
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
#ifdef CONFIG_OIS_USE
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.8V_OIS", PIN_REGULATOR, 0, 0);
#endif
+#ifdef USE_BUCK2_REGULATOR_CONTROL
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VDD_EXT_1P3_PB02", PIN_REGULATOR, 0, 0);
#endif
dev_info(dev, "%s X v4\n", __func__);
struct sensor_open_extended *ext;
struct exynos_platform_fimc_is_module *pdata;
struct device *dev;
- int ch, vc_idx;
+ int ch, t;
struct pinctrl_state *s;
FIMC_BUG(!fimc_is_dev);
module->cfgs = ARRAY_SIZE(config_module_3m3);
module->cfg = config_module_3m3;
module->ops = NULL;
+
for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
- for (vc_idx = 0; vc_idx < 2; vc_idx++) {
- switch (vc_idx) {
- case VC_BUF_DATA_TYPE_SENSOR_STAT1:
- module->vc_max_size[vc_idx].width = S5K3M3_PDAF_MAXWIDTH;
- module->vc_max_size[vc_idx].height = S5K3M3_PDAF_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = S5K3M3_PDAF_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = S5K3M3_PDAF_STAT_TYPE;
- break;
- case VC_BUF_DATA_TYPE_GENERAL_STAT1:
- module->vc_max_size[vc_idx].width = S5K3M3_MIPI_MAXWIDTH;
- module->vc_max_size[vc_idx].height = S5K3M3_MIPI_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = S5K3M3_MIPI_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = S5K3M3_MIPI_STAT_TYPE;
- break;
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PDP)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_SENSOR_STAT1:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_TAIL_FOR_SW_PDAF;
+ module->vc_extra_info[t].sensor_mode
+ = VC_SENSOR_MODE_MSPD_GLOBAL_TAIL;
+ module->vc_extra_info[t].max_width = 128;
+ module->vc_extra_info[t].max_height = 736;
+ module->vc_extra_info[t].max_element = 2;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ /* PDP STAT0: SFR, Size: 1756(1756)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_1_PDAF_STAT0;
+ module->vc_extra_info[t].sensor_mode
+ = VC_SENSOR_MODE_MSPD_GLOBAL_TAIL;
+ module->vc_extra_info[t].max_width = 1756;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ /* PDP STAT1/2: DMA, Size: 17920+21504(17556+21168)Bytes */
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PDP_1_1_PDAF_STAT1;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_MSPD_GLOBAL_TAIL;
+ module->vc_extra_info[t].max_width = 39424;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ } else {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_SENSOR_STAT1:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_TAIL_FOR_SW_PDAF;
+ module->vc_extra_info[t].sensor_mode
+ = VC_SENSOR_MODE_MSPD_GLOBAL_TAIL;
+ module->vc_extra_info[t].max_width = 128;
+ module->vc_extra_info[t].max_height = 736;
+ module->vc_extra_info[t].max_element = 2;
+ break;
+ }
}
}
ext->ois_con.peri_type = SE_NULL;
}
+ if (pdata->mcu_product_name != MCU_NAME_NOTHING) {
+ ext->mcu_con.product_name = pdata->mcu_product_name;
+ ext->mcu_con.peri_type = SE_I2C;
+ ext->mcu_con.peri_setting.i2c.channel = pdata->mcu_i2c_ch;
+ ext->mcu_con.peri_setting.i2c.slave_address = pdata->mcu_i2c_addr;
+ ext->mcu_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->mcu_con.product_name = pdata->mcu_product_name;
+ ext->mcu_con.peri_type = SE_NULL;
+ }
+
v4l2_subdev_init(subdev_module, &subdev_ops);
v4l2_set_subdevdata(subdev_module, module);
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_mbus_fmt = sensor_module_s_format,
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param,
};
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_3p9[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ FIMC_IS_SENSOR_CFG(4608, 3456, 30, 0, 0, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4608, 3456), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(4608, 2592, 30, 0, 1, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4608, 2592), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(4608, 2240, 30, 0, 2, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4608, 2240), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(4608, 2184, 30, 0, 3, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4608, 2240), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(3456, 3456, 30, 0, 4, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 3456, 3456), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2304, 1728, 60, 0, 5, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2304, 1728), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(2304, 1296, 60, 0, 6, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2304, 1296), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1728, 1728, 60, 0, 7, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1728, 1728), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1152, 864, 112, 0, 8, CSI_DATA_LANES_4, 2054, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1152, 864), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_3p9_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct fimc_is_core *core;
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_subcam_sel = 0;
+ u32 power_seq_id = 0;
+ int gpio_mclk = 0;
+
+ FIMC_BUG(!dev);
+
+ dnode = dev->of_node;
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get gpio_reset\n");
+ return -EINVAL;
+ } else {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ }
+
+ gpio_subcam_sel = of_get_named_gpio(dnode, "gpio_subcam_sel", 0);
+ if (!gpio_is_valid(gpio_subcam_sel)) {
+ dev_err(dev, "failed to get gpio_subcam_sel\n");
+ } else {
+ gpio_request_one(gpio_subcam_sel, GPIOF_OUT_INIT_LOW, "SUBCAM_SEL");
+ gpio_free(gpio_subcam_sel);
+ }
+
+ if (of_property_read_u32(dnode, "power_seq_id", &power_seq_id)) {
+ dev_err(dev, "power_seq_id read is fail");
+ power_seq_id = 0;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF);
+
+ /* ULTRA WIDE CAMERA - POWER ON */
+ if (gpio_is_valid(gpio_subcam_sel)) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_subcam_sel, "gpio_subcam_sel high", PIN_OUTPUT, 0, 2000);
+ }
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDA_2.8V_WIDESUB", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDD_1.05V_WIDESUB", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_WIDESUB", PIN_REGULATOR, 1, 0);
+ if (power_seq_id == 1) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_FRONTSUB", PIN_REGULATOR, 1, 0);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 1, 0);
+ }
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+
+ /* ULTRA WIDE CAMERA - POWER OFF */
+ if (gpio_is_valid(gpio_subcam_sel)) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_subcam_sel, "gpio_subcam_sel low", PIN_OUTPUT, 0, 9);
+ }
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+ if (power_seq_id == 1) {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_FRONTSUB", PIN_REGULATOR, 0, 0);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 0, 0);
+ }
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_WIDESUB", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDD_1.05V_WIDESUB", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VDDA_2.8V_WIDESUB", PIN_REGULATOR, 0, 0);
+
+ /* Mclock disable */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_WIDESUB", PIN_REGULATOR, 1, 0);
+ if (power_seq_id == 1) {
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_FRONTSUB", PIN_REGULATOR, 1, 0);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 1, 0);
+ }
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "on_i2c", PIN_I2C, 1, 10);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "off_i2c", PIN_I2C, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_WIDESUB", PIN_REGULATOR, 0, 0);
+ if (power_seq_id == 1) {
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_FRONTSUB", PIN_REGULATOR, 0, 0);
+ } else {
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "VDDIO_1.8V_VT", PIN_REGULATOR, 0, 0);
+ }
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int __init sensor_module_3p9_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+ fimc_is_module_parse_dt(dev, sensor_module_3p9_power_setpin);
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ probe_err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d \n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_S5K3P9;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 4608;
+ module->active_height = 3456;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 120;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SLSI";
+ module->sensor_name = "S5K3P9";
+ module->setfile_name = "setfile_3p9.bin";
+ module->cfgs = ARRAY_SIZE(config_module_3p9);
+ module->cfg = config_module_3p9;
+ module->ops = NULL;
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ probe_err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri*)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+#ifdef CONFIG_SENSOR_RETENTION_USE
+ ext->use_retention_mode = SENSOR_RETENTION_UNSUPPORTED;
+#endif
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 1000000;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ } else {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_3p9_match[] = {
+ {
+ .compatible = "samsung,sensor-module-3p9",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_3p9_match);
+
+static struct platform_driver sensor_module_3p9_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-3P9",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_3p9_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_3p9_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_3p9_driver,
+ sensor_module_3p9_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_3p9_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_3p9_init);
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_4ha[] = {
+ /* 3264x2448@30fps */
+ FIMC_IS_SENSOR_CFG(3264, 2448, 30, 0, 0, CSI_DATA_LANES_3, 910, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 3264, 2448), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 3264x1836@30fps */
+ FIMC_IS_SENSOR_CFG(3264, 1836, 30, 0, 1, CSI_DATA_LANES_3, 910, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 3264, 1836), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 3264x1588_30fps */
+ FIMC_IS_SENSOR_CFG(3264, 1588, 30, 0, 2, CSI_DATA_LANES_3, 910, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 3264, 1588), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2448x2448_30fps */
+ FIMC_IS_SENSOR_CFG(2448, 2448, 30, 0, 3, CSI_DATA_LANES_3, 910, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2448, 2448), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 1632x1224_30fps */
+ FIMC_IS_SENSOR_CFG(1632, 1224, 30, 0, 4, CSI_DATA_LANES_3, 910, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1632, 1224), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 1632x1224_60fps */
+ FIMC_IS_SENSOR_CFG(1632, 1224, 60, 0, 5, CSI_DATA_LANES_3, 910, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1632, 1224), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 800x600_120fps */
+ FIMC_IS_SENSOR_CFG(800, 600, 120, 0, 6, CSI_DATA_LANES_3, 910, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 800, 600), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_4ha_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_cam_ldo_en = 0;
+ int gpio_none = 0;
+
+ FIMC_BUG(!dev);
+
+ dnode = dev->of_node;
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ }
+
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+
+ gpio_cam_ldo_en = of_get_named_gpio(dnode, "gpio_cam_ldo_en", 0);
+ if (!gpio_is_valid(gpio_cam_ldo_en)) {
+ dev_err(dev, "failed to get gpio_cam_ldo_en\n");
+ } else {
+ gpio_request_one(gpio_cam_ldo_en, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_cam_ldo_en);
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+
+ /* SENSOR_SCENARIO_NORMAL on */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_cam_ldo_en, "gpio_cam_ldo_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 1000);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 1500);
+
+ /* SENSOR_SCENARIO_NORMAL off */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 1000);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 1500);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_cam_ldo_en, "gpio_cam_ldo_en", PIN_OUTPUT, 0, 0);
+ /*SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_cam_2p8_en, "cam_2p8_en", PIN_OUTPUT, 0, 0);*/
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+int sensor_module_4ha_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+ fimc_is_module_parse_dt(dev, sensor_module_4ha_power_setpin);
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_S5K4HA;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 3264;
+ module->active_height = 2448;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 120;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SLSI";
+ module->sensor_name = "S5K4HA";
+ module->setfile_name = "setfile_4ha.bin";
+ module->cfgs = ARRAY_SIZE(config_module_4ha);
+ module->cfg = config_module_4ha;
+ module->ops = NULL;
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 400000;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ } else {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_4ha_match[] = {
+ {
+ .compatible = "samsung,sensor-module-4ha",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_4ha_match);
+
+static struct platform_driver sensor_module_4ha_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-4HA",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_4ha_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_4ha_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_4ha_driver,
+ sensor_module_4ha_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_4ha_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_4ha_init);
+
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
.log_status = sensor_module_log_status,
};
+static int sensor_5e6_s_routing(struct v4l2_subdev *sd,
+ u32 input, u32 output, u32 config) {
+
+ return 0;
+}
+
#define VSYNC_TIMEOUT_IN_NSEC (300 * NSEC_PER_MSEC) /* msec */
static int sensor_5e6_s_stream(struct v4l2_subdev *subdev, int enable)
{
}
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_5e6_s_routing,
.s_stream = sensor_5e6_s_stream,
.s_parm = sensor_5e6_s_param
};
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+#define MAX_5E9_SETPIN_CNT 2
+
+static struct fimc_is_sensor_cfg config_module_5e9[] = {
+ /* 2592x1944@30fps */
+ FIMC_IS_SENSOR_CFG(2592, 1944, 30, 0, 0, CSI_DATA_LANES_2, 871, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2592, 1944), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2592x1460@30fps */
+ FIMC_IS_SENSOR_CFG(2592, 1460, 30, 0, 1, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2592, 1460), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2592x1458@30fps */
+ FIMC_IS_SENSOR_CFG(2592, 1458, 30, 0, 2, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2592, 1458), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2592x1260@30fps */
+ FIMC_IS_SENSOR_CFG(2592, 1260, 30, 0, 3, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2592, 1260), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 1936x1936@30fps */
+ FIMC_IS_SENSOR_CFG(1936, 1936, 30, 0, 4, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1936, 1936), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2592x1460@24fps */
+ FIMC_IS_SENSOR_CFG(2592, 1460, 24, 0, 5, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2592, 1460), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2592x1458@24fps */
+ FIMC_IS_SENSOR_CFG(2592, 1458, 24, 0, 6, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2592, 1458), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2592x1260@24fps */
+ FIMC_IS_SENSOR_CFG(2592, 1260, 24, 0, 7, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2592, 1260), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 1936x1936@24fps */
+ FIMC_IS_SENSOR_CFG(1936, 1936, 24, 0, 8, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1936, 1936), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 1296x972@58fps */
+ FIMC_IS_SENSOR_CFG(1296, 972, 58, 0, 9, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1296, 972), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 640x480@120fps */
+ FIMC_IS_SENSOR_CFG(640, 480, 120, 0, 10, CSI_DATA_LANES_2, 874, CSI_MODE_VC_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 640, 480), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_5e9_power_setpin_0(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_cam_ldo_en = 0;
+ struct fimc_is_core *core;
+
+ FIMC_BUG(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get gpio_reset\n");
+ } else {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ }
+
+ gpio_cam_ldo_en = of_get_named_gpio(dnode, "gpio_cam_ldo_en", 0);
+ if (!gpio_is_valid(gpio_cam_ldo_en)) {
+ dev_err(dev, "failed to get PIN_POWER_EN\n");
+ return -EINVAL;
+ }
+
+ gpio_request_one(gpio_cam_ldo_en, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_cam_ldo_en);
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+
+ /* Normal On */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_cam_ldo_en, "sensor_ldos_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 1000);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ /* Normal Off */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_cam_ldo_en, "sensor_ldos_en", PIN_INPUT, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int sensor_module_5e9_power_setpin_1(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_avdd_en = 0;
+ int gpio_iovdd_en = 0;
+ int gpio_mclk = 0;
+ struct fimc_is_core *core;
+
+ FIMC_BUG(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get gpio_reset\n");
+ } else {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ }
+
+ gpio_avdd_en = of_get_named_gpio(dnode, "gpio_avdd_en", 0);
+ if (gpio_is_valid(gpio_avdd_en)) {
+ if (gpio_request_one(gpio_avdd_en, GPIOF_OUT_INIT_LOW, "CAM_AVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request avdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_avdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get avdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_iovdd_en = of_get_named_gpio(dnode, "gpio_iovdd_en", 0);
+ if (gpio_is_valid(gpio_iovdd_en)) {
+ if (gpio_request_one(gpio_iovdd_en, GPIOF_OUT_INIT_LOW, "CAM_IOVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request iovdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_iovdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get iovdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
+
+ /* Normal On */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VLDO44_PMIC_DCAM_DVDD_1P2", PIN_REGULATOR, 1, 0);
+ /* TODO: need to check */
+ /* SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VLDO41_PMIC_FCAM_AVDD_2P8", PIN_REGULATOR, 1, 0); */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 1000);
+
+ /* Normal Off */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VLDO44_PMIC_DCAM_DVDD_1P2", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ /* TODO: need to check */
+ /* SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VLDO41_PMIC_FCAM_AVDD_2P8", PIN_REGULATOR, 0, 0); */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VLDO44_PMIC_DCAM_DVDD_1P2", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 1000);
+
+ /* Normal Off */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VLDO44_PMIC_DCAM_DVDD_1P2", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int (*sensor_module_5e9_power_setpin[MAX_5E9_SETPIN_CNT])(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata) = {
+ sensor_module_5e9_power_setpin_0,
+ sensor_module_5e9_power_setpin_1
+};
+
+static int __init sensor_module_5e9_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ struct pinctrl_state *s;
+ int power_seq_idx = 0;
+
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+ if (of_property_read_bool(dev->of_node, "power_seq_idx")) {
+ ret = of_property_read_u32(dev->of_node, "power_seq_idx", &power_seq_idx);
+ if (ret) {
+ warn("power_seq_idx read is fail(%d)", ret);
+ } else {
+ if (power_seq_idx >= MAX_5E9_SETPIN_CNT) {
+ warn("wrong power_seq_idx(%d >= %d) set as default\n",
+ power_seq_idx, MAX_5E9_SETPIN_CNT);
+ power_seq_idx = 0;
+ }
+ }
+ } else {
+ power_seq_idx = 0;
+ }
+ probe_info("%s power_seq_idx(%d)\n", __func__, power_seq_idx);
+
+ fimc_is_module_parse_dt(dev, sensor_module_5e9_power_setpin[power_seq_idx]);
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_S5K5E9;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 2592;
+ module->active_height = 1944;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 120;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SLSI";
+ module->sensor_name = "S5K5E9";
+ module->setfile_name = "setfile_5e9.bin";
+ module->cfgs = ARRAY_SIZE(config_module_5e9);
+ module->cfg = config_module_5e9;
+ module->ops = NULL;
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 400000;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ } else {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ if (pdata->eeprom_product_name != EEPROM_NAME_NOTHING) {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_I2C;
+ ext->eeprom_con.peri_setting.i2c.channel = pdata->eeprom_i2c_ch;
+ ext->eeprom_con.peri_setting.i2c.slave_address = pdata->eeprom_i2c_addr;
+ ext->eeprom_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_5e9_match[] = {
+ {
+ .compatible = "samsung,sensor-module-5e9",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_5e9_match);
+
+static struct platform_driver sensor_module_5e9_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-5E9",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_5e9_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_5e9_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_5e9_driver,
+ sensor_module_5e9_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_5e9_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_5e9_init);
.log_status = sensor_module_log_status,
};
+static int sensor_5f1_s_routing(struct v4l2_subdev *sd,
+ u32 input, u32 output, u32 config) {
+
+ return 0;
+}
+
#define VSYNC_TIMEOUT_IN_NSEC (300 * NSEC_PER_MSEC) /* msec */
static int sensor_5f1_s_stream(struct v4l2_subdev *subdev, int enable)
{
}
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_5f1_s_routing,
.s_stream = sensor_5f1_s_stream,
.s_parm = sensor_5f1_s_param
};
goto p_err;
}
+ /* add 1 frame delay for stream off */
+ usleep_range(40000, 40000);
+
p_err:
return ret;
}
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
SET_PIN_INIT(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_ON);
SET_PIN_INIT(pdata, SENSOR_SCENARIO_OIS_FACTORY, GPIO_SCENARIO_OFF);
#endif
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
/* FRONT CAMERA - POWER ON */
SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VDD_VT_CAM_2V8", PIN_REGULATOR, 0, 0);
SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+ SET_PIN_VOLTAGE(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "DOVDD_VT_CAM_1V8", PIN_REGULATOR, 1, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VDD_VT_CAM_2V8", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
+
+ /* SENSOR FACTORY TEST - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "DOVDD_VT_CAM_1V8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VDD_VT_CAM_2V8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+
dev_info(dev, "%s X v4\n", __func__);
return 0;
struct sensor_open_extended *ext;
struct exynos_platform_fimc_is_module *pdata;
struct device *dev;
- int ch, vc_idx;
+ int ch, t;
FIMC_BUG(!fimc_is_dev);
for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
- for (vc_idx = 0; vc_idx < VC_BUF_DATA_TYPE_MAX; vc_idx++) {
- switch (vc_idx) {
- case VC_BUF_DATA_TYPE_SENSOR_STAT1:
- module->vc_max_size[vc_idx].width = S5K6B2_SENSOR_STAT1_MAXWIDTH;
- module->vc_max_size[vc_idx].height = S5K6B2_SENSOR_STAT1_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = S5K6B2_SENSOR_STAT1_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = S5K6B2_SENSOR_STAT1_STAT_TYPE;
- break;
- case VC_BUF_DATA_TYPE_GENERAL_STAT1:
- module->vc_max_size[vc_idx].width = S5K6B2_GENERAL_STAT1_MAXWIDTH;
- module->vc_max_size[vc_idx].height = S5K6B2_GENERAL_STAT1_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = S5K6B2_GENERAL_STAT1_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = S5K6B2_GENERAL_STAT1_STAT_TYPE;
- break;
- case VC_BUF_DATA_TYPE_SENSOR_STAT2:
- module->vc_max_size[vc_idx].width = S5K6B2_SENSOR_STAT2_MAXWIDTH;
- module->vc_max_size[vc_idx].height = S5K6B2_SENSOR_STAT2_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = S5K6B2_SENSOR_STAT2_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = S5K6B2_SENSOR_STAT2_STAT_TYPE;
- break;
- case VC_BUF_DATA_TYPE_GENERAL_STAT2:
- module->vc_max_size[vc_idx].width = S5K6B2_GENERAL_STAT2_MAXWIDTH;
- module->vc_max_size[vc_idx].height = S5K6B2_GENERAL_STAT2_MAXHEIGHT;
- module->vc_max_size[vc_idx].element_size = S5K6B2_GENERAL_STAT2_ELEMENT;
- module->vc_max_size[vc_idx].stat_type = S5K6B2_GENERAL_STAT2_STAT_TYPE;
- break;
- }
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
}
/* Sensor peri */
#elif defined(CONFIG_CAMERA_PAFSTAT)
ret = pafstat_register(module, ch);
#endif
- if (ret < 0 && ret != -ENOTSUPP) {
+ if (ret) {
err("[MOD:%s] PAF register is fail(%d)", module->sensor_name, ret);
return ret;
}
return ret;
}
-
int sensor_module_unregister_paf(struct fimc_is_module_enum *module)
{
int ret = 0;
return ret;
}
- return 0;
+ return ret;
}
int sensor_module_s_stream_paf(struct fimc_is_module_enum *module,
struct fimc_is_device_sensor_peri *sensor_peri,
- struct fimc_is_sensor_cfg *cfg)
+ struct fimc_is_sensor_cfg *cfg, int enable)
{
int ret = 0;
struct v4l2_subdev_format fmt;
struct v4l2_subdev *subdev;
+ int stream_en = PD_NONE;
#if defined(CONFIG_CAMERA_PDP)
subdev = sensor_peri->subdev_pdp;
+ stream_en = enable ? cfg->pd_mode : PD_NONE;
#elif defined(CONFIG_CAMERA_PAFSTAT)
- subdev = sensor_peri->subdev_paf;
+ subdev = sensor_peri->subdev_pafstat;
+ stream_en = enable;
#endif
if (subdev) {
fmt.format.width = cfg->width;
return ret;
}
- ret = v4l2_subdev_call(subdev, video, s_stream, cfg->pd_mode);
+ ret = v4l2_subdev_call(subdev, video, s_stream, stream_en);
if (ret) {
err("[MOD:%s] PAF s_stream is fail(%d)", module->sensor_name, ret);
return ret;
return ret;
}
+int sensor_module_power_reset(struct v4l2_subdev *subdev, struct fimc_is_device_sensor *device)
+{
+ int ret = 0;
+ struct fimc_is_module_enum *module;
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(subdev);
+ FIMC_BUG(!module);
+
+ ret = fimc_is_sensor_gpio_off(device);
+ if (ret)
+ err("gpio off is fail(%d)", ret);
+
+ ret = fimc_is_sensor_mclk_off(device, device->pdata->scenario, module->pdata->mclk_ch);
+ if (ret)
+ err("fimc_is_sensor_mclk_off is fail(%d)", ret);
+
+ usleep_range(10000, 10000);
+
+ ret = fimc_is_sensor_mclk_on(device, device->pdata->scenario, module->pdata->mclk_ch);
+ if (ret)
+ err("fimc_is_sensor_mclk_on is fail(%d)", ret);
+
+ ret = fimc_is_sensor_gpio_on(device);
+ if (ret)
+ err("gpio on is fail(%d)", ret);
+
+ usleep_range(10000, 10000);
+
+ return ret;
+}
+
int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
{
int ret = 0;
struct v4l2_subdev *subdev_flash = NULL;
struct v4l2_subdev *subdev_aperture = NULL;
struct v4l2_subdev *subdev_ois = NULL;
+ struct v4l2_subdev *subdev_eeprom = NULL;
struct fimc_is_preprocessor *preprocessor = NULL;
struct v4l2_subdev *subdev_preprocessor = NULL;
+ struct fimc_is_device_sensor *device = NULL;
FIMC_BUG(!subdev);
}
}
+ device = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_cis);
+ FIMC_BUG(!device);
+
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_check_rev, subdev_cis);
+ if (ret < 0) {
+ if (ret == -EAGAIN) {
+ err("Checking sensor revision is fail. So retry camera power sequence.");
+ sensor_module_power_reset(subdev, device);
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_check_rev, subdev_cis);
+ if (ret < 0) {
+ goto p_err;
+ }
+ }
+ }
+
/* init kthread for sensor register setting when s_format */
ret = fimc_is_sensor_init_mode_change_thread(sensor_peri);
if (ret) {
}
subdev_ois = sensor_peri->subdev_ois;
+#ifdef USE_OIS_INIT_WORK
+ if (subdev_ois)
+ schedule_work(&sensor_peri->ois->init_work);
+#else
#if defined(CONFIG_OIS_DIRECT_FW_CONTROL)
if (subdev_ois != NULL) {
ret = CALL_OISOPS(sensor_peri->ois, ois_fw_update, subdev_ois);
}
}
+ if (sensor_peri->mcu && sensor_peri->mcu->ois != NULL) {
+ ret = CALL_OISOPS(sensor_peri->mcu->ois, ois_init, sensor_peri->subdev_mcu);
+ if (ret < 0) {
+ err("v4l2_subdev_call(ois_init) is fail(%d)", ret);
+ return ret;
+ }
+ }
+#endif
+#ifndef CONFIG_CAMERA_USE_MCU
subdev_aperture = sensor_peri->subdev_aperture;
if (subdev_aperture != NULL) {
ret = v4l2_subdev_call(subdev_aperture, core, init, 0);
if (ret)
err("[%s] aperture init fail\n", __func__);
}
+#endif
+
+ subdev_eeprom = sensor_peri->subdev_eeprom;
+ if (subdev_eeprom != NULL) {
+ ret = CALL_EEPROMOPS(sensor_peri->eeprom, eeprom_read, subdev_eeprom);
+ if (ret) {
+ err("[%s] sensor eeprom read fail\n", __func__);
+ ret = 0;
+ }
+ }
if (test_bit(FIMC_IS_SENSOR_ACTUATOR_AVAILABLE, &sensor_peri->peri_state) &&
pdata->af_product_name != ACTUATOR_NAME_NOTHING && sensor_peri->actuator != NULL) {
}
}
+ if (device->pdata->scenario == SENSOR_SCENARIO_FACTORY) {
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_factory_test, subdev_cis);
+ if (ret) {
+ err("cis_factory_test is fail(%d)", ret);
+ goto p_err;
+ }
+ } else {
+ /* except factory scenario, cis global setting need to start
+ * after other peri initialize finished
+ */
+ kthread_queue_work(&sensor_peri->cis_global_worker, &sensor_peri->cis_global_work);
+ }
+
pr_info("[MOD:%s] %s(%d)\n", module->sensor_name, __func__, val);
p_err:
/* kthread stop to sensor setting when s_format */
fimc_is_sensor_deinit_mode_change_thread(sensor_peri);
+ if (sensor_peri->mcu && sensor_peri->mcu->aperture) {
+ /* wait until aperture operation end */
+ flush_work(&sensor_peri->mcu->aperture->aperture_set_start_work);
+ flush_work(&sensor_peri->mcu->aperture->aperture_set_work);
+
#ifdef APERTURE_CLOSE_VALUE
- if (sensor_peri->aperture) {
- if (sensor_peri->aperture->cur_value != APERTURE_CLOSE_VALUE
- && sensor_peri->aperture->step == APERTURE_STEP_STATIONARY) {
- ret = CALL_APERTUREOPS(sensor_peri->aperture, aperture_deinit,
- sensor_peri->subdev_aperture, APERTURE_CLOSE_VALUE);
- if (ret < 0)
- err("[%s] aperture_deinit failed\n", __func__);
+ if (sensor_peri->mcu && sensor_peri->mcu->aperture) {
+ if (sensor_peri->mcu->aperture->cur_value != APERTURE_CLOSE_VALUE
+ && sensor_peri->mcu->aperture->step == APERTURE_STEP_STATIONARY) {
+ ret = CALL_APERTUREOPS(sensor_peri->mcu->aperture, aperture_deinit,
+ sensor_peri->subdev_mcu, APERTURE_CLOSE_VALUE);
+ if (ret < 0)
+ err("[%s] aperture_deinit failed\n", __func__);
+ }
}
+#endif
}
+
+#ifdef USE_OIS_INIT_WORK
+ if (sensor_peri->subdev_ois)
+ flush_work(&sensor_peri->ois->init_work);
#endif
#ifdef CONFIG_OIS_USE_RUMBA_S6
goto p_err;
}
break;
-
+ case V4L2_CID_ACTUATOR_UPDATE_DYNAMIC_META:
+ ret = fimc_is_sensor_peri_update_actuator_dm(subdev, arg);
+ if (ret) {
+ err("err!!! ret(%d), update actuator dm fail\n", ret);
+ goto p_err;
+ }
+ break;
default:
err("err!!! Unknown CID(%#x)", cmd);
ret = -EINVAL;
}
break;
case V4L2_CID_ACTUATOR_GET_STATUS:
+ case V4L2_CID_ACTUATOR_GET_ACTUAL_POSITION:
ret = v4l2_subdev_call(sensor_peri->subdev_actuator, core, g_ctrl, ctrl);
if (ret) {
err("[MOD:%s] v4l2_subdev_call(g_ctrl, id:%d) is fail(%d)",
goto p_err;
}
break;
+ case V4L2_CID_SENSOR_GET_SSM_THRESHOLD:
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_get_super_slow_motion_threshold,
+ sensor_peri->subdev_cis, &ctrl->value);
+ if (ret < 0) {
+ err("err!!! ret(%d)", ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ break;
default:
err("err!!! Unknown CID(%#x)", ctrl->id);
ret = -EINVAL;
struct fimc_is_device_sensor *device = NULL;
struct fimc_is_module_enum *module = NULL;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct ae_param ae_val;
FIMC_BUG(!subdev);
switch(ctrl->id) {
case V4L2_CID_SENSOR_SET_AE_TARGET:
+ ae_val.val = ae_val.short_val = ctrl->value;
/* long_exposure_time and short_exposure_time is same value */
- ret = fimc_is_sensor_peri_s_exposure_time(device, ctrl->value, ctrl->value);
+ ret = fimc_is_sensor_peri_s_exposure_time(device, ae_val);
if (ret < 0) {
err("failed to set exposure time : %d\n - %d",
ctrl->value, ret);
case V4L2_CID_SENSOR_SET_ANALOG_GAIN:
if (sensor_peri->cis.cis_data->analog_gain[1] != ctrl->value) {
/* long_analog_gain and short_analog_gain is same value */
- ret = fimc_is_sensor_peri_s_analog_gain(device, ctrl->value, ctrl->value);
+ ae_val.val = ae_val.short_val = ctrl->value;
+ ret = fimc_is_sensor_peri_s_analog_gain(device, ae_val);
if (ret < 0) {
err("failed to set analog gain : %d\n - %d",
ctrl->value, ret);
}
case V4L2_CID_SENSOR_SET_DIGITAL_GAIN:
/* long_digital_gain and short_digital_gain is same value */
- ret = fimc_is_sensor_peri_s_digital_gain(device, ctrl->value, ctrl->value);
+ ae_val.val = ae_val.short_val = ctrl->value;
+ ret = fimc_is_sensor_peri_s_digital_gain(device, ae_val);
if (ret < 0) {
err("failed to set digital gain : %d\n - %d",
ctrl->value, ret);
}
break;
case V4L2_CID_ACTUATOR_SET_POSITION:
+#ifndef CONFIG_CAMERA_USE_MCU
if (sensor_peri->subdev_ois != NULL) {
ret = CALL_OISOPS(sensor_peri->ois, ois_shift_compensation, sensor_peri->subdev_ois, ctrl->value,
sensor_peri->actuator->pos_size_bit);
goto p_err;
}
}
+#endif
ret = v4l2_subdev_call(sensor_peri->subdev_actuator, core, s_ctrl, ctrl);
if (ret < 0) {
err("[MOD:%d] v4l2_subdev_call(s_ctrl, id:%d) is fail(%d)",
goto p_err;
}
break;
+#ifdef FLASH_CAL_DATA_ENABLE
+ case V4L2_CID_FLASH_SET_CAL_EN:
+ case V4L2_CID_FLASH_SET_BY_CAL_CH0:
+ case V4L2_CID_FLASH_SET_BY_CAL_CH1:
+#else
case V4L2_CID_FLASH_SET_INTENSITY:
+#endif
case V4L2_CID_FLASH_SET_FIRING_TIME:
ret = v4l2_subdev_call(sensor_peri->subdev_flash, core, s_ctrl, ctrl);
if (ret) {
goto p_err;
}
break;
+ case V4L2_CID_SENSOR_SET_SSM_THRESHOLD:
+ ret = CALL_CISOPS(&sensor_peri->cis, cis_set_super_slow_motion_threshold,
+ sensor_peri->subdev_cis, ctrl->value);
+ if (ret < 0) {
+ err("failed to control super slow motion: %d\n", ctrl->value);
+ goto p_err;
+ }
+ break;
+ case V4L2_CID_GYRO_SELF_TEST:
+ if (ctrl->value > 2) {
+ err("Gyro self test step(%d) is over 2\n", ctrl->value);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ sensor_peri->cis.gyro_self_test_step = ctrl->value;
+ info("Gyro self test step(%d) is enabled\n", sensor_peri->cis.gyro_self_test_step);
+ break;
default:
err("err!!! Unknown CID(%#x)", ctrl->id);
ret = -EINVAL;
struct v4l2_control ctrl;
struct fimc_is_device_sensor_peri *sensor_peri = NULL;
struct v4l2_rect ssm_roi;
+ struct fimc_is_device_sensor *device;
+ struct fimc_is_core *core;
FIMC_BUG(!subdev);
FIMC_BUG(!ctrls);
sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
WARN_ON(!sensor_peri);
+ device = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev);
+ WARN_ON(!device);
+
+ core = device->private_data;
+ WARN_ON(!core);
+
for (i = 0; i < ctrls->count; i++) {
ext_ctrl = (ctrls->controls + i);
#ifdef CAMERA_MODULE_DUAL_CAL_AVAILABLE_VERSION
char *dual_cal = NULL;
struct fimc_is_from_info *finfo = NULL;
+ bool ver_valid = false;
int cal_size = 0;
- fimc_is_sec_get_sysfs_finfo(&finfo);
- if (finfo->header_ver[10] < CAMERA_MODULE_DUAL_CAL_AVAILABLE_VERSION) {
+ fimc_is_sec_get_sysfs_finfo(&finfo, ROM_ID_REAR);
+ ver_valid = fimc_is_sec_check_rom_ver(core, ROM_ID_REAR);
+ if (ver_valid == false || finfo->header_ver[10] < CAMERA_MODULE_DUAL_CAL_AVAILABLE_VERSION) {
err("FROM version is low. Not apply dual cal.");
ret = -EINVAL;
goto p_err;
} else {
- fimc_is_get_rear_dual_cal_buf(&dual_cal, &cal_size);
- ret = copy_to_user(ext_ctrl->ptr, dual_cal, cal_size);
- if (ret) {
- err("failed copying %d bytes of data\n", ret);
+ char *cal_buf;
+ u8 dummy_flag = 0;
+
+ fimc_is_sec_get_cal_buf(&cal_buf, ROM_ID_REAR);
+ dummy_flag = cal_buf[ROM_REAR2_FLAG_DUMMY_ADDR];
+
+ if (dummy_flag == 7) {
+ fimc_is_get_rear_dual_cal_buf(&dual_cal, &cal_size);
+ ret = copy_to_user(ext_ctrl->ptr, dual_cal, cal_size);
+ if (ret) {
+ err("failed copying %d bytes of data\n", ret);
+ ret = -EINVAL;
+ goto p_err;
+ }
+ } else {
+ err("invalid dummy_flag in dual cal.(%d)", dummy_flag);
+ ret = -EINVAL;
goto p_err;
}
}
return ret;
}
-int sensor_module_s_stream(struct v4l2_subdev *subdev, int enable)
+int sensor_module_s_routing(struct v4l2_subdev *sd, u32 input, u32 output, u32 config)
{
int ret = 0;
- struct fimc_is_device_sensor *device = NULL;
- struct fimc_is_module_enum *module = NULL;
- struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct fimc_is_device_sensor *sensor;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ int paf_ch;
- FIMC_BUG(!subdev);
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(sd);
+ module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(sd);
+ paf_ch = (sensor->ischain->group_3aa.id == GROUP_ID_3AA1) ? 1 : 0;
- module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(subdev);
- FIMC_BUG(!module);
+ if (config) {
+ ret = sensor_module_register_paf(module, paf_ch);
+ if (ret) {
+ err("[MOD:%s] PAF(%d) failed to register(%d)",
+ module->sensor_name, paf_ch, ret);
+ }
+ } else {
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
- FIMC_BUG(!sensor_peri);
+ if (test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state)
+ || test_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE,
+ &sensor_peri->peri_state)) {
+ ret = sensor_module_unregister_paf(module);
+ if (ret) {
+ err("[MOD:%s] PAF(%d) failed to unregister(%d)",
+ module->sensor_name, paf_ch, ret);
+ }
+ }
+ }
- device = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev);
- FIMC_BUG(!device);
+ return ret;
+}
- if (enable) {
- int paf_ch = (device->ischain->group_3aa.id == GROUP_ID_3AA1) ? 1 : 0;
- struct fimc_is_sensor_cfg *cfg = device->cfg;
+int sensor_module_s_stream(struct v4l2_subdev *sd, int enable)
+{
+ int ret, paf_ch;
+ struct fimc_is_device_sensor *sensor;
+ struct fimc_is_sensor_cfg *cfg;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri;
- ret = sensor_module_register_paf(module, paf_ch);
- if (ret == 0) {
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(sd);
+ module = (struct fimc_is_module_enum *)v4l2_get_subdevdata(sd);
+ sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
+ paf_ch = (sensor->ischain->group_3aa.id == GROUP_ID_3AA1) ? 1 : 0;
+ cfg = sensor->cfg;
+
+ if (enable) {
#if defined(CONFIG_CAMERA_PAFSTAT)
- CALL_PAFOPS(sensor_peri->paf, set_num_buffers, sensor_peri->subdev_paf,
- device->num_buffers, cfg->mipi_speed);
+ if (test_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE, &sensor_peri->peri_state))
+ CALL_PAFSTATOPS(sensor_peri->pafstat, set_num_buffers,
+ sensor_peri->subdev_pafstat,
+ sensor->num_buffers,
+ cfg);
#endif
- ret = sensor_module_s_stream_paf(module, sensor_peri, cfg);
+
+ if (test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state)
+ || test_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE,
+ &sensor_peri->peri_state)) {
+ ret = sensor_module_s_stream_paf(module, sensor_peri, cfg, enable);
if (ret) {
err("[MOD:%s] PAF(%d) s_stream is fail(%d)", module->sensor_name, paf_ch, ret);
- goto err_s_stream_paf;
+ goto err_paf_s_stream;
}
- } else if (ret == -ENOTSUPP) {
- ret = 0; /* Override possible ret == -ENOTSUPP */
- } else {
- err("[MOD:%s] PAF(%d) register is fail(%d)", module->sensor_name, paf_ch, ret);
- return ret;
}
/*
* Camera first mode set high speed recording and maintain 120fps
* not setting exposure so need to this check
*/
- if (sensor_peri->cis.cis_data->video_mode == true && device->cfg->framerate >= 60) {
+ if ((sensor_peri->use_sensor_work)
+ || (sensor_peri->cis.cis_data->video_mode == true && cfg->framerate >= 60)) {
+ ret = fimc_is_sensor_init_sensor_thread(sensor_peri);
+ if (ret) {
+ err("fimc_is_sensor_init_sensor_thread is fail");
+ return ret;
+ }
+ }
+
+ if (sensor_peri->cis.cis_data->video_mode == true && cfg->framerate >= 60) {
sensor_peri->sensor_interface.diff_bet_sen_isp
= sensor_peri->sensor_interface.otf_flag_3aa ? DIFF_OTF_DELAY + 1 : DIFF_M2M_DELAY;
- if (fimc_is_sensor_init_sensor_thread(sensor_peri))
- err("fimc_is_sensor_init_sensor_thread is fail");
} else {
sensor_peri->sensor_interface.diff_bet_sen_isp
= sensor_peri->sensor_interface.otf_flag_3aa ? DIFF_OTF_DELAY : DIFF_M2M_DELAY;
}
} else {
- sensor_module_unregister_paf(module);
+ if (test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state)
+ || test_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE,
+ &sensor_peri->peri_state)) {
+ ret = sensor_module_s_stream_paf(module, sensor_peri, cfg, enable);
+ if (ret) {
+ err("[MOD:%s] PAF(%d) s_stream is fail(%d)", module->sensor_name, paf_ch, ret);
+ goto err_paf_s_stream;
+ }
+ }
+
fimc_is_sensor_deinit_sensor_thread(sensor_peri);
}
- ret = fimc_is_sensor_peri_s_stream(device, enable);
+ ret = fimc_is_sensor_peri_s_stream(sensor, enable);
if (ret) {
err("[MOD] fimc_is_sensor_peri_s_stream is fail(%d)", ret);
goto err_peri_s_stream;
return 0;
err_peri_s_stream:
-err_s_stream_paf:
- sensor_module_unregister_paf(module);
+err_paf_s_stream:
+ if (test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state)
+ || test_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE,
+ &sensor_peri->peri_state)) {
+ ret = sensor_module_unregister_paf(module);
+ if (ret) {
+ err("[MOD:%s] PAF(%d) failed to unregister(%d)",
+ module->sensor_name, paf_ch, ret);
+ }
+ }
return ret;
}
}
if (cis->cis_data->sens_config_index_cur != device->cfg->mode
- || sensor_peri->mode_change_first == true) {
+ || sensor_peri->mode_change_first == true || cis->gyro_self_test_step != 0) {
dbg_sensor(1, "[%s] mode changed(%d->%d)\n", __func__,
cis->cis_data->sens_config_index_cur, device->cfg->mode);
cis->cis_data->cur_width = fmt->format.width;
cis->cis_data->cur_height = fmt->format.height;
+ /* check wdr sensor mode */
+ CALL_CISOPS(cis, cis_check_wdr_mode, sensor_peri->subdev_cis, device->cfg->mode);
+
ret = fimc_is_sensor_mode_change(cis, device->cfg->mode);
if (ret) {
err("[MOD:%s] sensor_mode_change(cis_mode_change) is fail(%d)",
int sensor_module_log_status(struct v4l2_subdev *subdev);
/* Video ops */
-int sensor_module_s_stream(struct v4l2_subdev *subdev, int enable);
+int sensor_module_s_routing(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
+int sensor_module_s_stream(struct v4l2_subdev *sd, int enable);
int sensor_module_s_param(struct v4l2_subdev *subdev, struct v4l2_streamparm *param);
int sensor_module_s_format(struct v4l2_subdev *subdev,
struct v4l2_subdev_pad_config *cfg,
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/of_gpio.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+
+static struct fimc_is_sensor_cfg config_module_gm1sp[] = {
+ /* width, height, fps, settle, mode, lane, speed, interleave, pd_mode */
+ FIMC_IS_SENSOR_CFG(4000, 3000, 30, 0, 0, CSI_DATA_LANES_4, 1152, CSI_MODE_VC_DT, PD_MSPD_TAIL,
+ VC_IN(0, HW_FORMAT_RAW10, 4000, 3000), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 4000, 3000),
+ VC_IN(1, HW_FORMAT_RAW10, 496, 736), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 4032, 1),
+ VC_IN(2, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 127680, 1),
+ VC_IN(0, HW_FORMAT_USER, 4000, 4), VC_OUT(HW_FORMAT_USER, VC_EMBEDDED, 4000, 4)),
+ FIMC_IS_SENSOR_CFG(2000, 1124, 60, 0, 1, CSI_DATA_LANES_4, 1152, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2000, 1124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2000, 1124),
+ VC_IN(1, HW_FORMAT_RAW10, 248, 280), VC_OUT(HW_FORMAT_USER, VC_PRIVATE, 4032, 1),
+ VC_IN(2, HW_FORMAT_USER, 0, 0), VC_OUT(HW_FORMAT_USER, VC_MIPISTAT, 127680, 1),
+ VC_IN(0, HW_FORMAT_USER, 2000, 4), VC_OUT(HW_FORMAT_USER, VC_EMBEDDED, 2000, 4)),
+ FIMC_IS_SENSOR_CFG(2000, 1124, 120, 0, 2, CSI_DATA_LANES_4, 1196, CSI_MODE_VC_DT, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2000, 1124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 2000, 1124),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_USER, 0, 0), VC_OUT(HW_FORMAT_USER, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ FIMC_IS_SENSOR_CFG(1280, 720, 240, 0, 3, CSI_DATA_LANES_4, 763, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 1280, 720),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_USER, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(0, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_EMBEDDED_8BIT, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_module_gm1sp_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_mclk = 0;
+ int gpio_avdd_en = 0;
+ int gpio_dvdd_en = 0;
+ int gpio_iovdd_en = 0;
+ struct fimc_is_core *core;
+
+ BUG_ON(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ /* TODO */
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (gpio_is_valid(gpio_reset)) {
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+ } else {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ }
+
+ gpio_avdd_en = of_get_named_gpio(dnode, "gpio_avdd_en", 0);
+ if (gpio_is_valid(gpio_avdd_en)) {
+ if (gpio_request_one(gpio_avdd_en, GPIOF_OUT_INIT_LOW, "CAM_AVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request avdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_avdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get avdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_dvdd_en = of_get_named_gpio(dnode, "gpio_dvdd_en", 0);
+ if (gpio_is_valid(gpio_dvdd_en)) {
+ if (gpio_request_one(gpio_dvdd_en, GPIOF_OUT_INIT_LOW, "CAM_DVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request dvdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_dvdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get dvdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_iovdd_en = of_get_named_gpio(dnode, "gpio_iovdd_en", 0);
+ if (gpio_is_valid(gpio_iovdd_en)) {
+ if (gpio_request_one(gpio_iovdd_en, GPIOF_OUT_INIT_LOW, "CAM_IOVDD_EN_LOW")) {
+ dev_err(dev, "%s: failed to gpio request iovdd_en\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_iovdd_en);
+ } else {
+ dev_err(dev, "%s: failed to get iovdd_en\n", __func__);
+ return -EINVAL;
+ }
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (gpio_is_valid(gpio_mclk)) {
+ if (gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW")) {
+ dev_err(dev, "%s: failed to gpio request mclk\n", __func__);
+ return -ENODEV;
+ }
+ gpio_free(gpio_mclk);
+ } else {
+ dev_err(dev, "%s: failed to get mclk\n", __func__);
+ return -EINVAL;
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF);
+
+ /* BACK CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+ /* BACK CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* REAR VISION CAEMRA - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_VISION, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ /* SENSOR FACTORY TEST - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst low", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 1, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 2000);
+
+
+ /* REAR VISION CAEMRA - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_RESET, 0, 10);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst input", PIN_INPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "VLDO38_PMIC_RCAM_AFVCC_2P8", PIN_REGULATOR, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_avdd_en, "avdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_dvdd_en, "dvdd_en", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_iovdd_en, "iovdd_en", PIN_OUTPUT, 0, 0);
+
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_FACTORY, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int __init sensor_module_gm1sp_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, t;
+ struct pinctrl_state *s;
+
+ BUG_ON(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+#ifdef CONFIG_OF
+ fimc_is_module_parse_dt(dev, sensor_module_gm1sp_power_setpin);
+#endif
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ err("subdev_module is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ probe_info("%s pdta->id(%d), module_enum id = %d\n", __func__, pdata->id, atomic_read(&device->module_count));
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_S5KGM1SP;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 4000;
+ module->active_height = 3000;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width;
+ module->pixel_height = module->active_height;
+ module->max_framerate = 240;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SLSI";
+ module->sensor_name = "S5KGM1SP";
+ module->setfile_name = "setfile_gm1sp.bin";
+ module->cfgs = ARRAY_SIZE(config_module_gm1sp);
+ module->cfg = config_module_gm1sp;
+ module->ops = NULL;
+
+ for (ch = 1; ch < CSI_VIRTUAL_CH_MAX; ch++)
+ module->vc_buffer_offset[ch] = pdata->vc_buffer_offset[ch];
+
+ for (t = VC_BUF_DATA_TYPE_SENSOR_STAT1; t < VC_BUF_DATA_TYPE_MAX; t++) {
+ module->vc_extra_info[t].stat_type = VC_STAT_TYPE_INVALID;
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_INVALID;
+ module->vc_extra_info[t].max_width = 0;
+ module->vc_extra_info[t].max_height = 0;
+ module->vc_extra_info[t].max_element = 0;
+
+ if (IS_ENABLED(CONFIG_CAMERA_PAFSTAT)) {
+ switch (t) {
+ case VC_BUF_DATA_TYPE_GENERAL_STAT1:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_FLOATING;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 4032;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ case VC_BUF_DATA_TYPE_GENERAL_STAT2:
+ module->vc_extra_info[t].stat_type
+ = VC_STAT_TYPE_PAFSTAT_STATIC;
+
+ module->vc_extra_info[t].sensor_mode = VC_SENSOR_MODE_ULTRA_PD_TAIL;
+ module->vc_extra_info[t].max_width = 127680;
+ module->vc_extra_info[t].max_height = 1;
+ module->vc_extra_info[t].max_element = 1;
+ break;
+ }
+ }
+ }
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ err("fimc_is_device_sensor_peri is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+
+ ext->sensor_con.product_name = module->sensor_id;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 400000;
+
+ ext->actuator_con.product_name = ACTUATOR_NAME_NOTHING;
+ ext->flash_con.product_name = FLADRV_NAME_NOTHING;
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+ ext->preprocessor_con.product_name = PREPROCESSOR_NAME_NOTHING;
+ ext->ois_con.product_name = OIS_NAME_NOTHING;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ if (pdata->preprocessor_dma_channel == DMA_CH_NOT_DEFINED)
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ else
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = pdata->preprocessor_dma_channel;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ if (pdata->eeprom_product_name != EEPROM_NAME_NOTHING) {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_I2C;
+ ext->eeprom_con.peri_setting.i2c.channel = pdata->eeprom_i2c_ch;
+ ext->eeprom_con.peri_setting.i2c.slave_address = pdata->eeprom_i2c_addr;
+ ext->eeprom_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->eeprom_con.product_name = pdata->eeprom_product_name;
+ ext->eeprom_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_gm1sp_match[] = {
+ {
+ .compatible = "samsung,sensor-module-gm1sp",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_gm1sp_match);
+
+static struct platform_driver sensor_module_gm1sp_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-GM1SP",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_gm1sp_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_gm1sp_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_gm1sp_driver,
+ sensor_module_gm1sp_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_gm1sp_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_gm1sp_init);
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_mbus_fmt = sensor_module_s_format,
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_mbus_fmt = sensor_module_s_format,
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_mbus_fmt = sensor_module_s_format,
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
//.s_mbus_fmt = sensor_module_s_format,
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
//.s_mbus_fmt = sensor_module_s_format,
};
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
+#include <linux/videodev2_exynos_camera.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#ifdef CONFIG_OF
+#include <linux/of_gpio.h>
+#endif
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+
+#include <exynos-fimc-is-sensor.h>
+#include "fimc-is-hw.h"
+#include "fimc-is-core.h"
+#include "fimc-is-device-sensor.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-resourcemgr.h"
+#include "fimc-is-dt.h"
+
+#include "fimc-is-device-module-base.h"
+#include "fimc-is-device-module-imx576.h"
+
+// Reference Version : 'IMX576-AAKH5_SAM-Set-26MHz-DPHY_RegisterSetting_ver2.00-9.00_MP_180712.xlsx'
+// Reference Version : 'IMX576-AAKH5_SAM-Set-26MHz-DPHY_RegisterSetting_ver2.00-8.00_MP0_180712.xlsx'
+
+/*
+ * [Mode Information]
+ * - Global Setting -
+ *
+ * - 2X2 BINNING -
+ * [0] REG_A: Single Still Preview (4:3) : 2832x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [1] REG_B: Single Still Preview (16:9) : 2832x1592@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [2] REG_C: Single Still Preview (18.5:9): 2832x1376@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [3] REG_D: Single Still Preview (1:1) : 2124x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - QBC_HDR -
+ * [4] REG_E: Single Still 3HDR (4:3) : 2832x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [5] REG_F: Single Still 3HDR (16:9) : 2832x1592@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [6] REG_G: Single Still 3HDR (18.5:9) : 2832x1376@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [7] REG_H: Single Still 3HDR (1:1) : 2124x2124@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - QBC_REMOSAIC -
+ * [8] REG_I: Single Still Capture (4:3) : 5664X4248@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [9] REG_J: Single Still Capture (16:9) : 5664X3184@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [10]REG_K: Single Still Capture (18.5:9): 5664X2752@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [11]REG_L: Single Still Capture (1:1) : 4248X4248@30, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - Super Slow Motion (SSM) -
+ * [12]REG_M: Super Slow Motion (16:9) : 1872x1052@240, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [13]REG_N: Super Slow Motion (16:9) : 1920x1080@120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [14]REG_O: Super Slow Motion (16:9) : 1280x720 @240, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [15]REG_U: Super Slow Motion (16:9) : 1280x720 @120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ *
+ * - FAST AE -
+ * [16]REG_R: Single Preview Fast(4:3) : 2832x2124@117, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [17]REG_S: Single Preview Fast(4:3) : 2832x2124@ 60, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ * [18]REG_T: Single Preview Fast(16:9) : 2832x1592@120, MIPI lane: 4, MIPI data rate(Mbps/lane) Sensor: 2054
+ */
+
+static struct fimc_is_sensor_cfg config_imx576[] = {
+ /* 0 : 2832x2124@30fps 2X2BIN */
+ FIMC_IS_SENSOR_CFG(2832, 2124, 30, 0, 0, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 2124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 1 : 2832x1592@30fps 2X2BIN */
+ FIMC_IS_SENSOR_CFG(2832, 1592, 30, 0, 1, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 1592), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 2 : 2832x1376@30fps 2X2BIN */
+ FIMC_IS_SENSOR_CFG(2832, 1376, 30, 0, 2, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 1376), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 3 : 2124x2124@30fps 2X2BIN */
+ FIMC_IS_SENSOR_CFG(2124, 2124, 30, 0, 3, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2124, 2124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 4 : 2832x2124@30fps QBC_HDR */
+ FIMC_IS_SENSOR_CFG(2832, 2124, 30, 0, 4, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 2124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 5 : 2832x1592@30fps QBC_HDR */
+ FIMC_IS_SENSOR_CFG(2832, 1592, 30, 0, 5, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 1592), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 6 : 2832x1376@30fps QBC_HDR */
+ FIMC_IS_SENSOR_CFG(2832, 1376, 30, 0, 6, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 1376), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 7 : 2124x2124@30fps QBC_HDR */
+ FIMC_IS_SENSOR_CFG(2124, 2124, 30, 0, 7, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2124, 2124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 8 : 5664X4248@30fps QBC_REMOSAIC */
+ FIMC_IS_SENSOR_CFG(5664, 4248, 30, 0, 8, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 5664, 4248), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 9 : 5664X3184@30fps QBC_REMOSAIC */
+ FIMC_IS_SENSOR_CFG(5664, 3184, 30, 0, 9, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 5664, 3184), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 10 : 5664X2752@30fps QBC_REMOSAIC */
+ FIMC_IS_SENSOR_CFG(5664, 2752, 30, 0, 10, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 5664, 2752), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 11 : 4248X4248@30fps QBC_REMOSAIC */
+ FIMC_IS_SENSOR_CFG(4248, 4248, 30, 0, 11, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 4248, 4248), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 12 : 1872x1052@240fps Super Slow Motion (SSM) */
+ FIMC_IS_SENSOR_CFG(1872, 1052, 240, 0, 12, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1872, 1052), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 13 : 1920x1080@120fps Super Slow Motion (SSM) */
+ FIMC_IS_SENSOR_CFG(1920, 1080, 120, 0, 13, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1920, 1080), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 14 : 1280x720 @240fps Super Slow Motion (SSM) */
+ FIMC_IS_SENSOR_CFG(1280, 720, 240, 0, 14, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 15 : 1280x720 @120fps Super Slow Motion (SSM) */
+ FIMC_IS_SENSOR_CFG(1280, 720, 120, 0, 15, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 1280, 720), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 16 : 2832x2124@117fps FAST AE */
+ FIMC_IS_SENSOR_CFG(2832, 2124, 117, 0, 16, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 2124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 17 : 2832x2124@60fps FAST AE */
+ FIMC_IS_SENSOR_CFG(2832, 2124, 60, 0, 17, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 2124), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+ /* 18 : 2832x1592@120fps FAST AE */
+ FIMC_IS_SENSOR_CFG(2832, 1592, 120, 0, 18, CSI_DATA_LANES_4, 2054, CSI_MODE_DT_ONLY, PD_NONE,
+ VC_IN(0, HW_FORMAT_RAW10, 2832, 1592), VC_OUT(HW_FORMAT_RAW10, VC_NOTHING, 0, 0),
+ VC_IN(1, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(2, HW_FORMAT_EMBEDDED_8BIT, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0),
+ VC_IN(3, HW_FORMAT_UNKNOWN, 0, 0), VC_OUT(HW_FORMAT_UNKNOWN, VC_NOTHING, 0, 0)),
+};
+
+static const struct v4l2_subdev_core_ops core_ops = {
+ .init = sensor_module_init,
+ .g_ctrl = sensor_module_g_ctrl,
+ .s_ctrl = sensor_module_s_ctrl,
+ .g_ext_ctrls = sensor_module_g_ext_ctrls,
+ .s_ext_ctrls = sensor_module_s_ext_ctrls,
+ .ioctl = sensor_module_ioctl,
+ .log_status = sensor_module_log_status,
+};
+
+static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
+ .s_stream = sensor_module_s_stream,
+ .s_parm = sensor_module_s_param
+};
+
+static const struct v4l2_subdev_pad_ops pad_ops = {
+ .set_fmt = sensor_module_s_format
+};
+
+static const struct v4l2_subdev_ops subdev_ops = {
+ .core = &core_ops,
+ .video = &video_ops,
+ .pad = &pad_ops
+};
+
+static int sensor_imx576_power_setpin(struct device *dev,
+ struct exynos_platform_fimc_is_module *pdata)
+{
+ struct device_node *dnode;
+ int gpio_mclk = 0;
+ int gpio_reset = 0;
+ int gpio_none = 0;
+ int gpio_camcore_1p05_en = 0;
+ int ret;
+ struct fimc_is_core *core;
+
+ FIMC_BUG(!dev);
+
+ dnode = dev->of_node;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+
+ if (!core) {
+ err("core is NULL");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "%s E v4\n", __func__);
+
+ gpio_mclk = of_get_named_gpio(dnode, "gpio_mclk", 0);
+ if (!gpio_is_valid(gpio_mclk)) {
+ dev_err(dev, "failed to get gpio_mclk\n");
+ return -EINVAL;
+ }
+
+ gpio_request_one(gpio_mclk, GPIOF_OUT_INIT_LOW, "CAM_MCLK_OUTPUT_LOW");
+ gpio_free(gpio_mclk);
+
+ gpio_reset = of_get_named_gpio(dnode, "gpio_reset", 0);
+ if (!gpio_is_valid(gpio_reset)) {
+ dev_err(dev, "failed to get PIN_RESET\n");
+ return -EINVAL;
+ }
+
+ gpio_request_one(gpio_reset, GPIOF_OUT_INIT_LOW, "CAM_GPIO_OUTPUT_LOW");
+ gpio_free(gpio_reset);
+
+ gpio_camcore_1p05_en = of_get_named_gpio(dnode, "gpio_camcore_1p05_en", 0);
+ if (!gpio_is_valid(gpio_camcore_1p05_en)) {
+ dev_info(dev, "failed to get gpio_camcore_1p05_en\n");
+ } else {
+ gpio_request_one(gpio_camcore_1p05_en, GPIOF_OUT_INIT_LOW, "CAMCORE_1P05_EN");
+ gpio_free(gpio_camcore_1p05_en);
+ }
+
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON);
+ SET_PIN_INIT(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF);
+
+ /* Normal on */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "vdd_ldo41", PIN_REGULATOR, 1, 0); /* VDD_RCAM1_A2P8 */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_camcore_1p05_en, "cam_core high", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "vdd_ldo42", PIN_REGULATOR, 1, 0); /* VDD_RCAM1_IO_1P8 */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "vdd_ldo38", PIN_REGULATOR, 1, 0); /* VDD_RCAM1_AF_2P8 */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_reset, "sen_rst high", PIN_OUTPUT, 1, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, gpio_none, "pin", PIN_FUNCTION, 2, 1000);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_ON, SRT_ACQUIRE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 1);
+
+ /* Normal off */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 1, 0);
+ SET_PIN_SHARED(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, SRT_RELEASE,
+ &core->shared_rsc_slock[SHARED_PIN0], &core->shared_rsc_count[SHARED_PIN0], 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "pin", PIN_FUNCTION, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_reset, "sen_rst", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "vdd_ldo41", PIN_REGULATOR, 0, 0); /* VDD_RCAM1_A2P8 */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_camcore_1p05_en, "cam_core high", PIN_OUTPUT, 0, 0);
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "vdd_ldo42", PIN_REGULATOR, 0, 0); /* VDD_RCAM1_IO_1P8 */
+ SET_PIN(pdata, SENSOR_SCENARIO_NORMAL, GPIO_SCENARIO_OFF, gpio_none, "vdd_ldo38", PIN_REGULATOR, 0, 0); /* VDD_RCAM1_AF_2P8 */
+
+
+ /* READ_ROM - POWER ON */
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_ON, gpio_none, "vdd_ldo38", PIN_REGULATOR, 1, 0);
+ /* READ_ROM - POWER OFF */
+ SET_PIN(pdata, SENSOR_SCENARIO_READ_ROM, GPIO_SCENARIO_OFF, gpio_none, "vdd_ldo38", PIN_REGULATOR, 0, 0);
+
+ dev_info(dev, "%s X v4\n", __func__);
+
+ return 0;
+}
+
+static int __init sensor_module_imx576_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ struct fimc_is_core *core;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor *device;
+ struct sensor_open_extended *ext;
+ struct exynos_platform_fimc_is_module *pdata;
+ struct device *dev;
+ int ch, vc_idx;
+ struct pinctrl_state *s;
+
+ FIMC_BUG(!fimc_is_dev);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ probe_info("core device is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ dev = &pdev->dev;
+
+ fimc_is_module_parse_dt(dev, sensor_imx576_power_setpin);
+
+ pdata = dev_get_platdata(dev);
+ device = &core->sensor[pdata->id];
+
+ subdev_module = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_module) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ module = &device->module_enum[atomic_read(&device->module_count)];
+ atomic_inc(&device->module_count);
+ clear_bit(FIMC_IS_MODULE_GPIO_ON, &module->state);
+ module->pdata = pdata;
+ module->dev = dev;
+ module->sensor_id = SENSOR_NAME_IMX576;
+ module->subdev = subdev_module;
+ module->device = pdata->id;
+ module->client = NULL;
+ module->active_width = 5664;
+ module->active_height = 4248;
+ module->margin_left = 0;
+ module->margin_right = 0;
+ module->margin_top = 0;
+ module->margin_bottom = 0;
+ module->pixel_width = module->active_width + 0;
+ module->pixel_height = module->active_height + 0;
+ module->max_framerate = 300;
+ module->position = pdata->position;
+ module->bitwidth = 10;
+ module->sensor_maker = "SONY";
+ module->sensor_name = "IMX576";
+ module->setfile_name = "setfile_imx576.bin";
+ module->cfgs = ARRAY_SIZE(config_imx576);
+ module->cfg = config_imx576;
+ module->ops = NULL;
+
+ /* Sensor peri */
+ module->private_data = kzalloc(sizeof(struct fimc_is_device_sensor_peri), GFP_KERNEL);
+ if (!module->private_data) {
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ fimc_is_sensor_peri_probe((struct fimc_is_device_sensor_peri *)module->private_data);
+ PERI_SET_MODULE(module);
+
+ ext = &module->ext;
+ ext->sensor_con.product_name = module->sensor_id /*SENSOR_NAME_IMX576*/;
+ ext->sensor_con.peri_type = SE_I2C;
+ ext->sensor_con.peri_setting.i2c.channel = pdata->sensor_i2c_ch;
+ ext->sensor_con.peri_setting.i2c.slave_address = pdata->sensor_i2c_addr;
+ ext->sensor_con.peri_setting.i2c.speed = 1000000;
+
+ ext->actuator_con.product_name = ACTUATOR_NAME_NOTHING;
+ ext->flash_con.product_name = FLADRV_NAME_NOTHING;
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+ ext->preprocessor_con.product_name = PREPROCESSOR_NAME_NOTHING;
+ ext->ois_con.product_name = OIS_NAME_NOTHING;
+
+ if (pdata->af_product_name != ACTUATOR_NAME_NOTHING) {
+ ext->actuator_con.product_name = pdata->af_product_name;
+ ext->actuator_con.peri_type = SE_I2C;
+ ext->actuator_con.peri_setting.i2c.channel = pdata->af_i2c_ch;
+ ext->actuator_con.peri_setting.i2c.slave_address = pdata->af_i2c_addr;
+ ext->actuator_con.peri_setting.i2c.speed = 400000;
+ }
+
+ if (pdata->flash_product_name != FLADRV_NAME_NOTHING) {
+ ext->flash_con.product_name = pdata->flash_product_name;
+ ext->flash_con.peri_type = SE_GPIO;
+ ext->flash_con.peri_setting.gpio.first_gpio_port_no = pdata->flash_first_gpio;
+ ext->flash_con.peri_setting.gpio.second_gpio_port_no = pdata->flash_second_gpio;
+ }
+
+ /* ToDo: ???? */
+ ext->from_con.product_name = FROMDRV_NAME_NOTHING;
+
+ if (pdata->preprocessor_product_name != PREPROCESSOR_NAME_NOTHING) {
+ ext->preprocessor_con.product_name = pdata->preprocessor_product_name;
+ ext->preprocessor_con.peri_info0.valid = true;
+ ext->preprocessor_con.peri_info0.peri_type = SE_SPI;
+ ext->preprocessor_con.peri_info0.peri_setting.spi.channel = pdata->preprocessor_spi_channel;
+ ext->preprocessor_con.peri_info1.valid = true;
+ ext->preprocessor_con.peri_info1.peri_type = SE_I2C;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.channel = pdata->preprocessor_i2c_ch;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.slave_address = pdata->preprocessor_i2c_addr;
+ ext->preprocessor_con.peri_info1.peri_setting.i2c.speed = 400000;
+ ext->preprocessor_con.peri_info2.valid = true;
+ ext->preprocessor_con.peri_info2.peri_type = SE_DMA;
+ if (pdata->preprocessor_dma_channel == DMA_CH_NOT_DEFINED)
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = FLITE_ID_D;
+ else
+ ext->preprocessor_con.peri_info2.peri_setting.dma.channel = pdata->preprocessor_dma_channel;
+ }
+
+ if (pdata->ois_product_name != OIS_NAME_NOTHING) {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_I2C;
+ ext->ois_con.peri_setting.i2c.channel = pdata->ois_i2c_ch;
+ ext->ois_con.peri_setting.i2c.slave_address = pdata->ois_i2c_addr;
+ ext->ois_con.peri_setting.i2c.speed = 400000;
+ } else {
+ ext->ois_con.product_name = pdata->ois_product_name;
+ ext->ois_con.peri_type = SE_NULL;
+ }
+
+ v4l2_subdev_init(subdev_module, &subdev_ops);
+
+ v4l2_set_subdevdata(subdev_module, module);
+ v4l2_set_subdev_hostdata(subdev_module, device);
+ snprintf(subdev_module->name, V4L2_SUBDEV_NAME_SIZE, "sensor-subdev.%d", module->sensor_id);
+
+ s = pinctrl_lookup_state(pdata->pinctrl, "release");
+
+ if (pinctrl_select_state(pdata->pinctrl, s) < 0) {
+ probe_err("pinctrl_select_state is fail\n");
+ goto p_err;
+ }
+p_err:
+ probe_info("%s(%d)\n", __func__, ret);
+ return ret;
+}
+
+static const struct of_device_id exynos_fimc_is_sensor_module_imx576_match[] = {
+ {
+ .compatible = "samsung,sensor-module-imx576",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, exynos_fimc_is_sensor_module_imx576_match);
+
+static struct platform_driver sensor_module_imx576_driver = {
+ .driver = {
+ .name = "FIMC-IS-SENSOR-MODULE-IMX576",
+ .owner = THIS_MODULE,
+ .of_match_table = exynos_fimc_is_sensor_module_imx576_match,
+ }
+};
+
+static int __init fimc_is_sensor_module_imx576_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_module_imx576_driver,
+ sensor_module_imx576_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_module_imx576_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall(fimc_is_sensor_module_imx576_init);
+
--- /dev/null
+/*
+ * Samsung Exynos5 SoC series Sensor driver
+ *
+ *
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef FIMC_IS_DEVICE_IMX576_H
+#define FIMC_IS_DEVICE_IMX576_H
+
+#define SENSOR_IMX576_INSTANCE 0
+#define SENSOR_IMX576_NAME SENSOR_NAME_IMX576
+
+#endif
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_parm = sensor_module_s_param
};
};
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_module_s_routing,
.s_stream = sensor_module_s_stream,
.s_mbus_fmt = sensor_module_s_format,
};
.ioctl = sensor_virtual_module_ioctl,
};
+
+static int sensor_virtual_s_routing(struct v4l2_subdev *sd,
+ u32 input, u32 output, u32 config) {
+
+ return 0;
+}
+
static int sensor_virtual_s_stream(struct v4l2_subdev *subdev, int enable)
{
int ret = 0;
}
static const struct v4l2_subdev_video_ops video_ops = {
+ .s_routing = sensor_virtual_s_routing,
.s_stream = sensor_virtual_s_stream,
.s_parm = sensor_virtual_s_param
};
help
Say Y here to enable support for platform-specific V4L drivers.
+config CAMERA_OIS_BU24218GWL_OBJ
+ bool "Use BU24218GWL ois"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_OIS_SELECT
+ default n
+ help
+ Use to build BU24218GWL ois.
+
config CAMERA_OIS_IDG2030_OBJ
bool "Use IDG2030 ois"
depends on USE_DIRECT_IS_CONTROL
help
Use to build IDG2030 ois.
+config OIS_DIRECT_FW_CONTROL
+ bool "Use ois direct FW control"
+ depends on USE_DIRECT_IS_CONTROL
+ depends on CAMERA_OIS_SELECT
+ default n
+ help
+ Use to ois direct FW control.
+
fimc-is-ois.o
obj-$(CONFIG_CAMERA_OIS_IDG2030_OBJ) += fimc-is-ois-idg2030.o
+obj-$(CONFIG_CAMERA_OIS_BU24218GWL_OBJ) += fimc-is-ois-bu24218gwl.o
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2/sensor/module_framework
EXTRA_CFLAGS += -Idrivers/media/platform/exynos/fimc-is2/sensor
--- /dev/null
+/*
+ * Copyright (C) 2018 Motorola Mobility LLC.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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 "fimc-is-core.h"
+#include "fimc-is-device-sensor-peri.h"
+#include "fimc-is-helper-ois-i2c.h"
+#include "fimc-is-ois-bu24218gwl.h"
+#include "fimc-is-ois.h"
+
+#define OIS_NAME "OIS_ROHM_BU24218GWL"
+#define OIS_FW_1_NAME "bu24218_Rev1.0_S_data1.bin"
+#define OIS_FW_2_NAME "bu24218_Rev1.0_S_data2.bin"
+#define OIS_FW_NUM 2
+#define OIS_FW_ADDR_1 0x0000
+#define OIS_FW_ADDR_2 0x1C00
+#define OIS_FW_CHECK_SUM 0x02D409
+
+#define OIS_CAL_DATA_PATH "/data/camera/gm1_eeprom_data.bin"
+#define OIS_CAL_DATA_PATH_DEFAULT "/vendor/firmware/bu24218_cal_data_default.bin"
+#define OIS_CAL_DATA_CRC_OFFSET 0x1DB0
+#define OIS_CAL_DATA_CRC_SIZE 2
+#define OIS_CAL_DATA_OFFSET 0x1DB4
+#define OIS_CAL_DATA_SIZE 0x4C
+#define OIS_CAL_DATA_OFFSET_DEFAULT 0
+#define OIS_CAL_DATA_SIZE_DEFAULT 0x28
+#define OIS_CAL_ADDR 0x1DC0
+#define OIS_CAL_ACTUAL_DL_SIZE 0x28
+
+//#define OIS_DEBUG
+
+static u8 ois_fw_data[OIS_FW_NUM][OIS_FW_SIZE] = {{0},};
+static int ois_fw_data_size[OIS_FW_NUM] = {0,};
+static u8 ois_cal_data[OIS_CAL_DATA_SIZE] = {0,};
+static int ois_cal_data_size = 0;
+static int ois_previous_mode = 0;
+
+static const struct v4l2_subdev_ops subdev_ops;
+
+#ifdef CONFIG_OIS_DIRECT_FW_CONTROL
+int fimc_is_ois_fw_ver_copy(struct fimc_is_ois *ois, u8 *buf, long size)
+{
+ int ret = 0;
+ static int load_cnt = 0;
+
+ FIMC_BUG(!ois);
+
+ memcpy(ois_fw_data[load_cnt], (void *)buf, size);
+ ois_fw_data_size[load_cnt++] = size;
+ info("%s copy size:%d bytes", __func__, size);
+
+ return ret;
+}
+
+int fimc_is_ois_check_crc(char *data, size_t size)
+{
+ char *tmp = data;
+ u32 crc[16];
+ int i, j;
+ u16 crc16 = 0;
+
+ memset(crc, 0, sizeof(crc));
+ for (i = 0; i < size; i++) {
+ for (j = 7; j >= 0; j--) {
+ /* isolate the bit in the byte */
+ u32 doInvert = *tmp & (1 << j);
+
+ // shift the bit to LSB in the byte
+ doInvert = doInvert >> j;
+
+ // XOR required?
+ doInvert = doInvert ^ crc[15];
+
+ crc[15] = crc[14] ^ doInvert;
+ crc[14] = crc[13];
+ crc[13] = crc[12];
+ crc[12] = crc[11];
+ crc[11] = crc[10];
+ crc[10] = crc[9];
+ crc[9] = crc[8];
+ crc[8] = crc[7];
+ crc[7] = crc[6];
+ crc[6] = crc[5];
+ crc[5] = crc[4];
+ crc[4] = crc[3];
+ crc[3] = crc[2];
+ crc[2] = crc[1] ^ doInvert;
+ crc[1] = crc[0];
+ crc[0] = doInvert;
+ }
+ tmp++;
+ }
+
+ /* convert bits to CRC word */
+ for (i = 0; i < 16; i++)
+ crc16 = crc16 + (crc[i] << i);
+
+ return crc16;
+}
+
+int fimc_is_ois_cal_open(struct fimc_is_ois *ois, char *name, int offset,int size, int crc_enable)
+{
+ int ret = 0;
+ long fsize, nread;
+ mm_segment_t old_fs;
+ struct file *fp;
+ u8 *buf = NULL;
+ u16 crc_value = 0;
+ u16 crc16 = 0;
+
+ FIMC_BUG(!ois);
+
+ info("%s: E", __func__);
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ fp = filp_open(name, O_RDONLY, 0);
+ if (IS_ERR_OR_NULL(fp)) {
+ ret = PTR_ERR(fp);
+ err("filp_open(%s) fail(%d)!!\n", name, ret);
+ goto p_err;
+ }
+
+ buf = vmalloc(size);
+ if (!buf) {
+ err("failed to allocate memory");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ fsize = fp->f_path.dentry->d_inode->i_size;
+ if (fsize < offset + size) {
+ err("ois cal data not exist");
+ ret = -EIO;
+ goto p_err;
+ }
+
+ if (crc_enable) {
+ fp->f_pos = OIS_CAL_DATA_CRC_OFFSET;
+ err("ois f_pos set offset %x", fp->f_pos);
+ nread = vfs_read(fp, (char __user *)buf, OIS_CAL_DATA_CRC_SIZE , &fp->f_pos);
+ if (nread != OIS_CAL_DATA_CRC_SIZE) {
+ err("failed to read ois cal crc data from file, (%ld) Bytes", nread);
+ ret = -EIO;
+ goto p_err;
+ }
+ crc_value = ((buf[0] << 8) | (buf[1]));
+ }
+
+ fp->f_pos = offset;
+ err("ois f_pos set offset %x", fp->f_pos);
+ nread = vfs_read(fp, (char __user *)buf, size , &fp->f_pos);
+ if (nread != size) {
+ err("failed to read ois cal data from file, (%ld) Bytes", nread);
+ ret = -EIO;
+ goto p_err;
+ }
+ info("ois read cal data : 0x%x,%x,%x,%x", buf[0], buf[1], buf[2], buf[3]);
+
+ if (crc_enable) {
+ crc16 = fimc_is_ois_check_crc(buf, OIS_CAL_DATA_SIZE);
+ if (crc_value != crc16) {
+ err("Error to OIS CRC16: 0x%x, cal_buffer CRC: 0x%x", crc16, crc_value);
+ ret = -EIO;
+ goto p_err;
+ }
+ else {
+ info("OIS CRC16: 0x%x, cal_buffer CRC: 0x%x\n", crc16, crc_value);
+ }
+ }
+ /* Cal data save */
+ memcpy(ois_cal_data, (void *)buf, OIS_CAL_ACTUAL_DL_SIZE);
+ ois_cal_data_size = OIS_CAL_ACTUAL_DL_SIZE;
+ info("%s cal data copy size:%d bytes", __func__, OIS_CAL_ACTUAL_DL_SIZE);
+
+p_err:
+ if (buf)
+ vfree(buf);
+
+ if (!IS_ERR_OR_NULL(fp))
+ filp_close(fp, NULL);
+
+ set_fs(old_fs);
+
+ info("%s: X", __func__);
+ return ret;
+}
+
+int fimc_is_ois_fw_download(struct fimc_is_ois *ois)
+{
+ int ret = 0;
+ int retry = 3;
+ u8 check_sum[4] = {0};
+ int sum = 0;
+ u8 send_data[256];
+ int position = 0;
+ int i, quotienti, remainder;
+ u8 ois_status = 0;
+ int fw_num = 0;
+ int fw_download_start_addr[OIS_FW_NUM] = {OIS_FW_ADDR_1, OIS_FW_ADDR_2};
+
+ FIMC_BUG(!ois);
+
+ info("%s: E", __func__);
+
+ /* Step 1 Enable download*/
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ ret = fimc_is_ois_write(ois->client, 0xF010, 0x00);
+ if (ret < 0) {
+ err("ois start download write is fail");
+ ret = 0;
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ goto p_err;
+ }
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ /* wait over 200us */
+ usleep_range(200,200);
+ ret = fimc_is_ois_read(ois->client, 0x6024, &ois_status);
+ info("ois status:0x%x", ois_status);
+
+ /* Step 2 Download FW*/
+ for(fw_num = 0; fw_num < OIS_FW_NUM; fw_num++) {
+ quotienti = 0;
+ remainder = 0;
+ position = 0;
+ quotienti = ois_fw_data_size[fw_num]/FW_TRANS_SIZE;
+ remainder = ois_fw_data_size[fw_num]%FW_TRANS_SIZE;
+
+ for(i = 0; i < quotienti ; i++) {
+ memcpy(send_data, &ois_fw_data[fw_num][position], (size_t)FW_TRANS_SIZE);
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ ret = fimc_is_ois_write_multi(ois->client, fw_download_start_addr[fw_num]+position,
+ send_data, FW_TRANS_SIZE + 2);
+ if (ret < 0) {
+ err("ois fw download is fail");
+ ret = 0;
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ goto p_err;
+ }
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ position += FW_TRANS_SIZE;
+ }
+ if(remainder) {
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ memcpy(send_data, &ois_fw_data[fw_num][position], (size_t)remainder);
+ ret = fimc_is_ois_write_multi(ois->client, fw_download_start_addr[fw_num]+position,
+ send_data, remainder + 2);
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ }
+ if (ret < 0) {
+ err("ois fw download is fail");
+ ret = 0;
+ goto p_err;
+ }
+ info("ois fw %d download size:%d", fw_num, position + remainder);
+ }
+
+ /* Step 3 Sum Check*/
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ ret = fimc_is_ois_read_multi(ois->client, 0xF008, check_sum, 4);
+ if (ret < 0) {
+ err("ois read check sum fail");
+ ret = 0;
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ goto p_err;
+ }
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ sum = ((check_sum[0]<<24) | (check_sum[1]<<16) | (check_sum[2]<<8) | (check_sum[3]));
+ info("ois check sum value:0x%0x, expected value:0x%0x", sum, OIS_FW_CHECK_SUM);
+ if (OIS_FW_CHECK_SUM != sum) {
+ err("ois check sum fail, force return");
+ ret = 0;
+ goto p_err;
+ }
+
+ /* Step 4 Calibration data download */
+ info("ois download cal data");
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ ret = fimc_is_ois_write_multi(ois->client, OIS_CAL_ADDR, ois_cal_data, ois_cal_data_size + 2);
+ if (ret < 0) {
+ err("ois cal data download is fail");
+ ret = 0;
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ goto p_err;
+ }
+ info("ois cal data download size :%d", ois_cal_data_size);
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ /* Step 5 OIS download complete */
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ ret = fimc_is_ois_write(ois->client, 0xF006, 0x00);
+ if (ret < 0) {
+ err("ois write download complete is fail");
+ ret = 0;
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ goto p_err;
+ }
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ /* wait 18ms */
+ usleep_range(18000,18000);
+
+ /* OIS status */
+ ret = fimc_is_ois_read(ois->client, 0x6024, &ois_status);
+ info("ois status after D/L complete :0x%x", ois_status);
+
+ while ((ois_status == 0) && (retry-- > 0)) {
+ usleep_range(4000, 4000);
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ ret = fimc_is_ois_read(ois->client, 0x6024, &ois_status);
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ info("ois status :0x%x", ois_status);
+ }
+ if (ois_status != 1) {
+ err("ois_status is 0,force return error");
+ ret = 0;
+ goto p_err;
+ }
+
+ info("%s: ois fw download success\n", __func__);
+p_err:
+
+ return ret;
+}
+
+int fimc_is_ois_fw_update(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ struct fimc_is_ois *ois = NULL;
+ static int is_first_load = 1;
+
+ FIMC_BUG(!subdev);
+
+ info("%s: E", __func__);
+
+ ois = (struct fimc_is_ois *)v4l2_get_subdevdata(subdev);
+ if (!ois) {
+ err("ois is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ /* OIS Firmware load*/
+ if (1 == is_first_load) {
+ ret = fimc_is_ois_fw_open(ois, OIS_FW_1_NAME);
+ if (ret < 0) {
+ err("OIS %s load is fail\n", OIS_FW_1_NAME);
+ return 0;
+ }
+ ret = fimc_is_ois_fw_open(ois, OIS_FW_2_NAME);
+ if (ret < 0) {
+ err("OIS %s load is fail\n", OIS_FW_2_NAME);
+ return 0;
+ }
+ ret = fimc_is_ois_cal_open(ois, OIS_CAL_DATA_PATH, OIS_CAL_DATA_OFFSET, OIS_CAL_DATA_SIZE, 1);
+ if (ret < 0) {
+ info(" switch to load default OIS Cal Data %s \n", OIS_CAL_DATA_PATH_DEFAULT);
+ ret = fimc_is_ois_cal_open(ois, OIS_CAL_DATA_PATH_DEFAULT, OIS_CAL_DATA_OFFSET_DEFAULT,
+ OIS_CAL_DATA_SIZE_DEFAULT, 0);
+ if (ret < 0) {
+ err("OIS %s load is fail\n", OIS_CAL_DATA_PATH_DEFAULT);
+ return 0;
+ }
+ }
+ is_first_load = 0;
+ }
+
+ /* OIS Firmware download */
+ ret = fimc_is_ois_fw_download(ois);
+ if (ret < 0) {
+ err("OIS Firmware download fail");
+ return 0;
+ }
+
+ info("%s: X", __func__);
+ return ret;
+}
+
+#endif
+
+int fimc_is_set_ois_mode(struct v4l2_subdev *subdev, int mode)
+{
+ int ret = 0;
+ struct fimc_is_ois *ois;
+ struct i2c_client *client = NULL;
+#ifdef OIS_DEBUG
+ u8 ois_mode = 0;
+ u8 ois_gyro_data[2] = {0};
+#endif
+
+ FIMC_BUG(!subdev);
+
+ ois = (struct fimc_is_ois *)v4l2_get_subdevdata(subdev);
+ if (!ois) {
+ err("ois is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ client = ois->client;
+ if (!client) {
+ err("client is NULL");
+ ret = -EINVAL;
+ return ret;
+ }
+
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+
+#ifdef OIS_DEBUG
+ ret != fimc_is_ois_read(ois->client, 0x6021, &ois_mode);
+ info("last ois mode is 0x%x", ois_mode);
+#endif
+
+ if (ois_previous_mode == mode) {
+#ifdef OIS_DEBUG
+ info("skip set same ois mode:%d", mode);
+#endif
+ goto p_err;
+ } else {
+ info("set ois mode:%d", mode);
+ switch(mode) {
+ case OPTICAL_STABILIZATION_MODE_STILL:
+ fimc_is_ois_write(ois->client, 0x6020, 0x01);
+ usleep_range(100000, 100000);
+ fimc_is_ois_write(client, 0x6021, 0x7b); // ZSL
+ fimc_is_ois_write(client, 0x6020, 0x02);
+ break;
+ case OPTICAL_STABILIZATION_MODE_STILL_ZOOM:
+ fimc_is_ois_write(ois->client, 0x6020, 0x01);
+ usleep_range(100000, 100000);
+ fimc_is_ois_write(client, 0x6021, 0x03); // Exposure/Shake
+ fimc_is_ois_write(client, 0x6020, 0x02);
+ break;
+ case OPTICAL_STABILIZATION_MODE_VIDEO:
+ fimc_is_ois_write(ois->client, 0x6020, 0x01);
+ usleep_range(100000, 100000);
+ fimc_is_ois_write(client, 0x6021, 0x61);
+ fimc_is_ois_write(client, 0x6020, 0x02);
+ break;
+ case OPTICAL_STABILIZATION_MODE_CENTERING:
+ fimc_is_ois_write(ois->client, 0x6020, 0x01);
+ usleep_range(100000, 100000);
+ fimc_is_ois_write(client, 0x6021, 0x63);
+ fimc_is_ois_write(client, 0x6020, 0x02); // Servo ON
+ break;
+ default:
+ err("%s: invalid ois_mode value(%d)\n", __func__, mode);
+ break;
+ }
+ ois_previous_mode = mode;
+ }
+
+#ifdef OIS_DEBUG
+ ret != fimc_is_ois_read_multi(ois->client, 0x6040, ois_gyro_data, 2);
+ info("ois Gyro output1 is 0x%x%x", ois_gyro_data[0], ois_gyro_data[1]);
+ ret != fimc_is_ois_read_multi(ois->client, 0x6042, ois_gyro_data, 2);
+ info("ois Gyro output2 is 0x%x%x", ois_gyro_data[0], ois_gyro_data[1]);
+#endif
+p_err:
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ return ret;
+}
+
+int fimc_is_ois_init(struct v4l2_subdev *subdev)
+{
+ int ret = 0;
+ int retry = 3;
+ u8 ois_status = 0;
+ struct fimc_is_ois *ois = NULL;
+
+ FIMC_BUG(!subdev);
+
+ info("%s: E", __func__);
+
+ ois = (struct fimc_is_ois *)v4l2_get_subdevdata(subdev);
+ if(!ois) {
+ err("%s, ois subdev is NULL", __func__);
+ ret = -EINVAL;
+ return ret;
+ }
+
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+
+ /* Servo ON for OIS */
+ ret = fimc_is_ois_write(ois->client, 0x6020, 0x01);
+ if (ret < 0) {
+ err("ois servo on write is fail");
+ ret = 0;
+ goto p_err;
+ }
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ /* wait 100ms */
+ usleep_range(100000, 100000);
+
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ /* Gyro ON for OIS */
+ ret |= fimc_is_ois_write(ois->client, 0x6023, 0x02);
+ ret |= fimc_is_ois_write(ois->client, 0x602C, 0x76);
+ ret != fimc_is_ois_write(ois->client, 0x602D, 0x02);
+ ret != fimc_is_ois_write(ois->client, 0x602C, 0x44);
+ ret != fimc_is_ois_write(ois->client, 0x602D, 0x02);
+ ret != fimc_is_ois_write(ois->client, 0x602C, 0x45);
+ ret != fimc_is_ois_write(ois->client, 0x602D, 0x58);
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+ usleep_range(20000, 20000);
+ I2C_MUTEX_LOCK(ois->i2c_lock);
+ ret != fimc_is_ois_write(ois->client, 0x6023, 0x00);
+ ret != fimc_is_ois_write(ois->client, 0x614F, 0x01);
+ ret != fimc_is_ois_write(ois->client, 0x6021, 0x7B);
+ usleep_range(300, 300);
+ ret != fimc_is_ois_read(ois->client, 0x6024, &ois_status);
+ info("ois status is 0x%x", ois_status);
+ while ((ois_status == 0) && (retry-- > 0)) {
+ usleep_range(3000, 3000);
+ ret != fimc_is_ois_read(ois->client, 0x6024, &ois_status);
+ info("retry ois status is 0x%x", ois_status);
+ }
+ if (ois_status != 1) {
+ err("ois_status is 0, force return error");
+ ret = 0;
+ goto p_err;
+ }
+ ret != fimc_is_ois_write(ois->client, 0x6020, 0x02);
+ if (ret < 0) {
+ err("ois gyro on write is fail");
+ ret = 0;
+ goto p_err;
+ }
+
+ usleep_range(200, 200);
+ ret != fimc_is_ois_read(ois->client, 0x6024, &ois_status);
+ info("ois status after OIS ON is 0x%x", ois_status);
+ while ((ois_status == 0) && (retry-- > 0)) {
+ usleep_range(300, 300);
+ ret != fimc_is_ois_read(ois->client, 0x6024, &ois_status);
+ info("ois status after OIS ON is 0x%x", ois_status);
+ }
+ if (ois_status != 1) {
+ err("ois_status is 0, force return error");
+ ret = 0;
+ goto p_err;
+ }
+ ois_previous_mode = OPTICAL_STABILIZATION_MODE_STILL;
+
+#ifdef OIS_DEBUG
+ ret != fimc_is_ois_read(ois->client, 0x6021, &ois_status);
+ info("ois mode is 0x%x", ois_status);
+ ret != fimc_is_ois_read(ois->client, 0x6023, &ois_status);
+ info("ois Gyro mode is 0x%x", ois_status);
+#endif
+
+ info("%s: X", __func__);
+p_err:
+ I2C_MUTEX_UNLOCK(ois->i2c_lock);
+
+ return ret;
+}
+
+static struct fimc_is_ois_ops ois_ops = {
+ .ois_init = fimc_is_ois_init,
+ .ois_set_mode = fimc_is_set_ois_mode,
+#ifdef CONFIG_OIS_DIRECT_FW_CONTROL
+ .ois_fw_update = fimc_is_ois_fw_update,
+#endif
+};
+
+static int sensor_ois_bu24218gwl_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+{
+ int ret = 0;
+ struct fimc_is_core *core= NULL;
+ struct v4l2_subdev *subdev_ois = NULL;
+ struct fimc_is_device_sensor *device = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+ struct fimc_is_ois *ois;
+ struct device *dev;
+ struct device_node *dnode;
+ u32 sensor_id = 0;
+
+ FIMC_BUG(!fimc_is_dev);
+ FIMC_BUG(!client);
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ if (!core) {
+ err("core device is not yet probed");
+ ret = -EPROBE_DEFER;
+ goto p_err;
+ }
+
+ dev = &client->dev;
+ dnode = dev->of_node;
+
+ ret = of_property_read_u32(dnode, "id", &sensor_id);
+ if (ret) {
+ err("id read is fail(%d)", ret);
+ goto p_err;
+ }
+
+ probe_info("%s sensor_id %d\n", __func__, sensor_id);
+
+ device = &core->sensor[sensor_id];
+ if (!device) {
+ err("sensor device is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ sensor_peri = find_peri_by_ois_id(device, OIS_NAME_ROHM_BU24218GWL);
+ if (!sensor_peri) {
+ probe_info("sensor peri is not yet probed");
+ return -EPROBE_DEFER;
+ }
+
+ ois = kzalloc(sizeof(struct fimc_is_ois), GFP_KERNEL);
+ if (!ois) {
+ err("ois is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+
+ sensor_peri->ois = ois;
+
+ ois->ois_ops = &ois_ops;
+
+ subdev_ois = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
+ if (!subdev_ois) {
+ err("subdev_ois is NULL");
+ ret = -ENOMEM;
+ goto p_err;
+ }
+ sensor_peri->subdev_ois = subdev_ois;
+
+ ois->id = OIS_NAME_ROHM_BU24218GWL;
+ ois->subdev = subdev_ois;
+ ois->device = sensor_id;
+ ois->client = client;
+ device->subdev_ois = subdev_ois;
+ device->ois = ois;
+
+ v4l2_i2c_subdev_init(subdev_ois, client, &subdev_ops);
+ v4l2_set_subdevdata(subdev_ois, ois);
+ v4l2_set_subdev_hostdata(subdev_ois, device);
+
+ set_bit(FIMC_IS_SENSOR_OIS_AVAILABLE, &sensor_peri->peri_state);
+ snprintf(subdev_ois->name, V4L2_SUBDEV_NAME_SIZE, "ois->subdev.%d", ois->id);
+
+ probe_info("%s done\n", __func__);
+
+p_err:
+ return ret;
+}
+
+static int sensor_ois_bu24218gwl_remove(struct i2c_client *client)
+{
+ int ret = 0;
+ return ret;
+};
+
+static const struct of_device_id sensor_ois_bu24218gwl_match[] = {
+ {
+ .compatible = "samsung,exynos5-fimc-is-ois-bu24218gwl",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sensor_ois_bu24218gwl_match);
+
+static const struct i2c_device_id sensor_ois_bu24218gwl_idt[] = {
+ { OIS_NAME, 0 },
+ {},
+};
+
+static struct i2c_driver sensor_ois_bu24218gwl_driver = {
+ .probe = sensor_ois_bu24218gwl_probe,
+ .driver = {
+ .name = OIS_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sensor_ois_bu24218gwl_match
+ },
+ .id_table = sensor_ois_bu24218gwl_idt,
+ .remove = sensor_ois_bu24218gwl_remove,
+};
+
+static int __init sensor_ois_bu24218gwl_init(void)
+{
+ int ret;
+
+ ret = i2c_add_driver(&sensor_ois_bu24218gwl_driver);
+ if (ret)
+ err("failed to add %s driver: %d\n",
+ sensor_ois_bu24218gwl_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_ois_bu24218gwl_init);
--- /dev/null
+/*
+ * Copyright (C) 2018 Motorola Mobility LLC.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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 FIMC_IS_DEVICE_OIS_H
+#define FIMC_IS_DEVICE_OIS_H
+
+#define OIS_FW_SIZE 2132
+#define FW_TRANS_SIZE 256
+
+#endif
+
#ifndef FIMC_IS_OIS_FW_H
#define FIMC_IS_OIS_FW_H
-#define FIMC_IS_OIS_SDCARD_PATH "/data/media/0/"
+#define FIMC_IS_OIS_SDCARD_PATH "/vendor/firmware/"
#define FIMC_IS_OIS_FW_NAME_SEC "ois_fw_sec.bin"
#define FIMC_IS_OIS_FW_NAME_DOM "ois_fw_dom.bin"
#include "fimc-is-hw-pafstat.h"
#include "fimc-is-hw-pafstat-v1_0.h"
#include "fimc-is-device-sensor.h"
+#include "fimc-is-core.h"
+#include <linux/clk.h>
u32 pafstat_hw_g_reg_cnt(void)
{
break;
case PD_MSPD_TAIL:
sensor_mode = SENSOR_MODE_MSPD_TAIL;
- enable = 0;
+ enable = 1;
break;
default:
warn("PD MODE(%d) is invalid", pd_mode);
&pafstat_fields[PAFSTAT_F_COM_LIC_BYPASS], 0); /* TODO */
}
-void pafstat_hw_s_4ppc(void __iomem *base_reg, u32 mipi_speed)
+int pafstat_hw_s_4ppc(void __iomem *base_reg, u32 width, u32 height, u32 frame_rate,
+ u32 mipi_speed, u32 lanes, const char *conid)
{
- u32 pixel_mode = (mipi_speed > 2000 ? 1: 0); /* 0: 2PPC, 1: 4PPC */
+ struct clk *target;
+ u32 target_clk;
+ u32 need_clk_by_rate;
+ u32 need_clk_by_speed;
+ u32 pixel_mode;
+
+ target = clk_get(fimc_is_dev, conid);
+ if (IS_ERR_OR_NULL(target)) {
+ err("%s: can not get target: %s\n", __func__, conid);
+ return -ENODEV;
+ }
+
+ target_clk = clk_get_rate(target);
+ if (!target_clk) {
+ err("%s: clk value is zero: %s\n", __func__, conid);
+ return -ENODEV;
+ }
- info("[PAFSTAT] LIC_4PPC(%d)\n", pixel_mode);
+ need_clk_by_rate = width * height * frame_rate;
+ need_clk_by_speed = mipi_speed * lanes / 10; /* TODO: only RAW10 format case */
+ info("need_clk (rate: %d)(speed: %d)\n", need_clk_by_rate, need_clk_by_speed);
+
+ /* 2ppc boundary check */
+ if (target_clk * 2 > need_clk_by_rate && target_clk * 2 > need_clk_by_speed) {
+ info("pafstat pixel mode is set 2ppc\n");
+ pixel_mode = 0; /* 2ppc mode */
+ } else {
+ info("pafste pixel mode is set 4ppc\n");
+ pixel_mode = 1; /* 4ppc mode */
+ }
fimc_is_hw_set_field(base_reg, &pafstat_regs[PAFSTAT_R_CTX_LIC_4PPC],
&pafstat_fields[PAFSTAT_F_CTX_LIC_4PPC], pixel_mode);
+
+ return 0;
}
void pafstat_hw_com_s_fro(void __iomem *base_reg, u32 fro_cnt)
return 0;
}
+void pafstat_hw_s_lbctrl(void __iomem *base_reg, u32 width, u32 height)
+{
+ u32 val = 0;
+ u32 pd_mode;
+
+ val = fimc_is_hw_set_field_value(val,
+ &pafstat_fields[PAFSTAT_F_LBCTRL_IMG_HEIGHT], height);
+ val = fimc_is_hw_set_field_value(val,
+ &pafstat_fields[PAFSTAT_F_LBCTRL_IMG_WIDTH], width);
+ fimc_is_hw_set_reg(base_reg,
+ &pafstat_regs[PAFSTAT_R_PAFSTAT_LBCTRL_IMAGE_SIZE], val);
+
+ pd_mode = fimc_is_hw_get_field(base_reg, &pafstat_regs[PAFSTAT_R_CTX_SENSOR_MODE],
+ &pafstat_fields[PAFSTAT_F_CTX_SENSOR_MODE]);
+
+ if (pd_mode == SENSOR_MODE_MSPD || pd_mode == SENSOR_MODE_MSPD_TAIL)
+ val = 1;
+ else
+ val = 0;
+
+ fimc_is_hw_set_reg(base_reg,
+ &pafstat_regs[PAFSTAT_R_PAFSTAT_LBCTRL_BPC_MODE], val);
+}
+
+int pafstat_hw_g_fwin_stat(void __iomem *base_reg, void *buf, size_t len)
+{
+ size_t fwin_stat_len = 6 * 112 * sizeof(u32);
+ u32 fwin_stat[6][112];
+ int f_idx, t;
+ u32 reg_idx;
+
+ if (len < fwin_stat_len) {
+ warn("the size of STAT0 buffer is too small: %d < %d",
+ len, fwin_stat_len);
+ fwin_stat_len = len;
+ }
+
+ for (f_idx = 0; f_idx < 6; f_idx++) {
+ for (t = 0; t < 112; t++) {
+ reg_idx = PAFSTAT_R_PAFSTAT_STAT_RESULT_OUT_FW0_ACCESS + 2 * f_idx;
+ fwin_stat[f_idx][t] = fimc_is_hw_get_reg(base_reg, &pafstat_regs[reg_idx]);
+ }
+ }
+
+ memcpy((void *)buf, &fwin_stat[0][0], fwin_stat_len);
+
+ return fwin_stat_len;
+}
+
+int pafstat_hw_com_s_med_line(void __iomem *base_reg)
+{
+ int tmp, med_line = 0, max_pos_end_y = 0;
+ int i;
+ int margin = 100;
+
+ /* MED interrupt used instead of stat_out_end.
+ * Because, stat_out_end interrupt can't use because of H/W limitation.
+ *
+ * MED line = max STAT_FWIN_x_POS_END_Y + margin (x:0~5)
+ */
+
+ for (i = 0; i < 6; i++) {
+ tmp = fimc_is_hw_get_reg(base_reg,
+ &pafstat_regs[PAFSTAT_R_PAFSTAT_STAT_FWIN_0_POS_END_Y + 4 * i]);
+
+ if (tmp > max_pos_end_y)
+ max_pos_end_y = tmp;
+ }
+
+ /* TODO: modify other pd mode support, 8 is for only MSPD */
+ med_line = max_pos_end_y * 8 + margin;
+
+ fimc_is_hw_set_reg(base_reg,
+ &pafstat_regs[PAFSTAT_R_CTX_LINE_NUM_MED_INT], med_line);
+
+ return med_line;
+}
+
/* PAF RDMA */
-void fimc_is_hw_paf_oneshot_enable(void __iomem *base_reg, int enable)
+void fimc_is_hw_paf_oneshot_enable(void __iomem *base_reg)
{
pafstat_hw_s_ready(base_reg, 1);
fimc_is_hw_set_field(base_reg, &pafstat_regs[PAFSTAT_R_CTX_ONESHOT],
&pafstat_fields[PAFSTAT_F_CTX_ONESHOT], 1);
+ fimc_is_hw_set_field(base_reg, &pafstat_regs[PAFSTAT_R_CTX_GLOBAL_ENABLE],
+ &pafstat_fields[PAFSTAT_F_CTX_GLOBAL_ENABLE], 0);
+
}
void fimc_is_hw_paf_common_config(void __iomem *base_reg_com, void __iomem *base_reg, u32 paf_ch, u32 width, u32 height)
case DMA_OUTPUT_FORMAT_BAYER:
if (bitwidth == DMA_OUTPUT_BIT_WIDTH_8BIT)
dma_format = PAFSTAT_RDMA_FORMAT_8BIT_PACK;
+ else if (bitwidth == DMA_OUTPUT_BIT_WIDTH_16BIT)
+ dma_format = PAFSTAT_RDMA_FORMAT_16BIT_PACK_LSB_ALIGN;
break;
default:
dma_format = PAFSTAT_RDMA_FORMAT_12BIT_PACK_LSB_ALIGN;
info("PAFSTAT RDMA SFR DUMP : %p\n", base_reg);
fimc_is_hw_dump_regs(base_reg, pafstat_rdma_regs, PAFSTAT_RDMA_REG_CNT);
}
-
#include "fimc-is-device-sensor-peri.h"
enum pafstat_sfr_state {
- PAFSTAT_SFR_UNAPPLIED = 0,
+ PAFSTAT_SFR_INIT = -1,
+ PAFSTAT_SFR_READY = 0,
PAFSTAT_SFR_APPLIED,
PAFSTAT_SFR_STATE_MAX
};
/* INT_MASK 0: means enable interrupt, 1: means disable interrupt */
#define PAFSTAT_INT_MASK ((1 << PAFSTAT_INT_TIMEOUT) \
- | (1 << PAFSTAT_INT_FRAME_LINE) \
| (1 << PAFSTAT_INT_BAYER_FRAME_END) \
- | (1 << PAFSTAT_INT_STAT_FRAME_END))
+ | (1 << PAFSTAT_INT_STAT_FRAME_END) \
+ | (1 << PAFSTAT_INT_FRAME_FAIL))
u32 pafstat_hw_g_reg_cnt(void);
void pafstat_hw_g_floating_size(u32 *width, u32 *height, u32 *element);
void pafstat_hw_com_s_lic_mode(void __iomem *base_reg, u32 id,
enum pafstat_lic_mode lic_mode, enum pafstat_input_path input);
void pafstat_hw_com_s_fro(void __iomem *base_reg, u32 fro_cnt);
-void pafstat_hw_s_4ppc(void __iomem *base_reg, u32 mipi_speed);
+int pafstat_hw_s_4ppc(void __iomem *base_reg, u32 width, u32 height, u32 frame_rate,
+ u32 mipi_speed, u32 lanes, const char *conid);
void pafstat_hw_s_img_size(void __iomem *base_reg, u32 width, u32 height);
void pafstat_hw_s_pd_size(void __iomem *base_reg, u32 width, u32 height);
void pafstat_hw_s_input_path(void __iomem *base_reg, enum pafstat_input_path input);
void pafstat_hw_s_timeout_cnt_clear(void __iomem *base_reg);
void pafstat_hw_s_intr_mask_all_context(void);
int pafstat_hw_sw_reset(void __iomem *base_reg);
+void pafstat_hw_s_lbctrl(void __iomem *base_reg, u32 width, u32 height);
+int pafstat_hw_g_fwin_stat(void __iomem *base_reg, void *buf, size_t len);
+int pafstat_hw_com_s_med_line(void __iomem *base_reg);
/* PAF RDMA */
void fimc_is_hw_paf_common_config(void __iomem *base_reg_com, void __iomem *base_reg,
void fimc_is_hw_paf_rdma_set_addr(void __iomem *base_reg, u32 addr);
void fimc_is_hw_paf_rdma_enable(void __iomem *base_reg_com, void __iomem *base_reg, u32 enable);
void fimc_is_hw_paf_sfr_dump(void __iomem *base_reg_com, void __iomem *base_reg);
-void fimc_is_hw_paf_oneshot_enable(void __iomem *base_reg, int enable);
+void fimc_is_hw_paf_oneshot_enable(void __iomem *base_reg);
#endif
/*
- * Samsung Exynos5 SoC series Sensor driver
+ * Samsung Exynos SoC series PAFSTAT driver
*
*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
#include "fimc-is-hw-pafstat.h"
#include "fimc-is-interface-library.h"
-static struct fimc_is_paf pafstat_device[MAX_NUM_OF_PAFSTAT];
+static struct fimc_is_pafstat pafstat_devices[MAX_NUM_OF_PAFSTAT];
atomic_t g_pafstat_rsccount;
-static void prepare_pafstat_sfr_dump(struct fimc_is_paf *pafstat)
+static void prepare_pafstat_sfr_dump(struct fimc_is_pafstat *pafstat)
{
int reg_size = 0;
reg_size, pafstat->regs_b_start, pafstat->regs_b_end);
}
-void pafstat_sfr_dump(struct fimc_is_paf *pafstat)
+void pafstat_sfr_dump(struct fimc_is_pafstat *pafstat)
{
int reg_size = 0;
static irqreturn_t fimc_is_isr_pafstat(int irq, void *data)
{
- struct fimc_is_paf *pafstat;
+ struct fimc_is_pafstat *pafstat;
u32 irq_src, irq_mask, status;
bool err_intr_flag = false;
- u32 ret;
pafstat = data;
if (pafstat == NULL)
pafstat_hw_s_irq_src(pafstat->regs, status);
if (status & (1 << PAFSTAT_INT_FRAME_START)) {
- u32 __iomem *base_reg = pafstat->regs;
+ void __iomem *base_reg = pafstat->regs;
atomic_set(&pafstat->Vvalid, V_VALID);
#if 0 /* TODO */
#endif
pafstat_hw_s_img_size(base_reg, pafstat->in_width, pafstat->in_height);
- pafstat_hw_s_pd_size(base_reg, pafstat->pd_width, pafstat->pd_height);
- if (atomic_read(&pafstat->sfr_state)) { /* TODO */
- u32 reg_idx;
-
- for (reg_idx = 0; reg_idx < pafstat->regs_max; reg_idx++) {
- if (pafstat->regs_set[reg_idx].reg_addr)
- writel(pafstat->regs_set[reg_idx].reg_data,
- base_reg + pafstat->regs_set[reg_idx].reg_addr);
- }
- }
- ret = pafstat_hw_g_ready(base_reg);
- if (!ret)
+ if (atomic_read(&pafstat->sfr_state) == PAFSTAT_SFR_READY)
atomic_set(&pafstat->sfr_state, PAFSTAT_SFR_APPLIED);
+
pafstat_hw_s_ready(base_reg, 1);
atomic_inc(&pafstat->fs);
atomic_inc(&pafstat->cl);
dbg_sensor(5, "[PAFSTAT:%d] LINE interrupt (0x%x)", pafstat->id, status);
atomic_add(pafstat->fro_cnt, &pafstat->cl);
+
+ if (atomic_read(&pafstat->sfr_state) == PAFSTAT_SFR_APPLIED)
+ tasklet_schedule(&pafstat->tasklet_fwin_stat);
}
if (status & (1 << PAFSTAT_INT_FRAME_FAIL)) {
return IRQ_HANDLED;
}
-int pafstat_set_num_buffers(struct v4l2_subdev *subdev, u32 num_buffers, u32 mipi_speed)
+static void pafstat_tasklet_fwin_stat(unsigned long data)
+{
+ struct fimc_is_pafstat *pafstat;
+ struct fimc_is_module_enum *module;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_device_sensor *sensor;
+ struct fimc_is_device_csi *csi;
+ struct fimc_is_subdev *dma_subdev;
+ struct fimc_is_framemgr *framemgr;
+ struct fimc_is_frame *frame;
+ unsigned int frameptr;
+ int ch;
+
+ pafstat = (struct fimc_is_pafstat *)data;
+ if (!pafstat) {
+ err("failed to get PAFSTAT");
+ return;
+ }
+
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(pafstat->subdev);
+ if (!module) {
+ err("failed to get module");
+ return;
+ }
+
+ subdev_module = module->subdev;
+ if (!subdev_module) {
+ err("module's subdev was not probed");
+ return;
+ }
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_module);
+ csi = (struct fimc_is_device_csi *)v4l2_get_subdevdata(sensor->subdev_csi);
+
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_PRIVATE) {
+ dma_subdev = csi->dma_subdev[ch];
+ if (!dma_subdev ||
+ !test_bit(FIMC_IS_SUBDEV_START, &dma_subdev->state))
+ continue;
+
+ framemgr = GET_SUBDEV_FRAMEMGR(dma_subdev);
+ if (!framemgr) {
+ err("failed to get framemgr");
+ continue;
+ }
+
+ framemgr_e_barrier(framemgr, FMGR_IDX_29);
+
+ frameptr = atomic_read(&pafstat->frameptr_fwin_stat) % framemgr->num_frames;
+ frame = &framemgr->frames[frameptr];
+ frame->fcount = sensor->fcount;
+
+ pafstat_hw_g_fwin_stat(pafstat->regs, (void *)frame->kvaddr_buffer[0],
+ dma_subdev->output.width * dma_subdev->output.height);
+
+ atomic_inc(&pafstat->frameptr_fwin_stat);
+
+ framemgr_x_barrier(framemgr, FMGR_IDX_29);
+ }
+ }
+
+ if (pafstat->wq_fwin_stat)
+ queue_work(pafstat->wq_fwin_stat, &pafstat->work_fwin_stat);
+ else
+ schedule_work(&pafstat->work_fwin_stat);
+
+ dbg_pafstat(1, "%s, sensor fcount: %d\n", __func__, sensor->fcount);
+}
+
+static void __nocfi pafstat_worker_fwin_stat(struct work_struct *work)
+{
+ struct fimc_is_pafstat *pafstat;
+ struct fimc_is_module_enum *module;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_device_sensor *sensor;
+ struct paf_action *pa, *temp;
+ unsigned long flag;
+
+ pafstat = container_of(work, struct fimc_is_pafstat, work_fwin_stat);
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(pafstat->subdev);
+ if (!module) {
+ err("failed to get module");
+ return;
+ }
+
+ subdev_module = module->subdev;
+ if (!subdev_module) {
+ err("module's subdev was not probed");
+ return;
+ }
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_module);
+
+ spin_lock_irqsave(&pafstat->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp, &pafstat->list_of_paf_action, list) {
+ switch (pa->type) {
+ case VC_STAT_TYPE_PAFSTAT_FLOATING:
+#ifdef ENABLE_FPSIMD_FOR_USER
+ fpsimd_get();
+ pa->notifier(pa->type, *(unsigned int *)&sensor->fcount, pa->data);
+ fpsimd_put();
+#else
+ pa->notifier(pa->type, *(unsigned int *)&sensor->fcount, pa->data);
+#endif
+ break;
+ default:
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&pafstat->slock_paf_action, flag);
+
+ dbg_pafstat(1, "%s, sensor fcount: %d\n", __func__, sensor->fcount);
+}
+
+int pafstat_set_num_buffers(struct v4l2_subdev *subdev, u32 num_buffers, struct fimc_is_sensor_cfg *cfg)
{
- struct fimc_is_paf *pafstat;
+ struct fimc_is_pafstat *pafstat;
+ int ret = 0;
+
+ if (!cfg) {
+ err("sensor cfg is null\n");
+ return -EINVAL;
+ }
pafstat = v4l2_get_subdevdata(subdev);
if (!pafstat) {
pafstat->fro_cnt = (num_buffers > 8 ? 7 : num_buffers - 1);
pafstat_hw_com_s_fro(pafstat->regs_com, pafstat->fro_cnt);
- pafstat_hw_s_4ppc(pafstat->regs, mipi_speed);
+ ret = pafstat_hw_s_4ppc(pafstat->regs, cfg->width, cfg->height, cfg->framerate, cfg->mipi_speed,
+ cfg->lanes, "UMUX_CLKCMU_CAM_BUS");
+ if (ret) {
+ err("pafstat ppc setting fail\n");
+ return -EINVAL;
+ }
info("[PAFSTAT:%d] fro_cnt(%d,%d)\n", pafstat->id, pafstat->fro_cnt, num_buffers);
- return 0;
+ return ret;
}
int pafstat_hw_set_regs(struct v4l2_subdev *subdev,
- struct pafstat_setting_t *regs, u32 regs_cnt)
+ struct paf_setting_t *regs, u32 regs_cnt)
{
- struct fimc_is_paf *pafstat;
+ int i;
+ struct fimc_is_pafstat *pafstat;
+ int med_line;
pafstat = v4l2_get_subdevdata(subdev);
if (!pafstat) {
return -ENODEV;
}
- memcpy(pafstat->regs_set, regs, regs_cnt * sizeof(struct pafstat_setting_t));
- pafstat->regs_max = regs_cnt;
- atomic_set(&pafstat->sfr_state, PAFSTAT_SFR_UNAPPLIED);
+ dbg_pafstat(1, "PAFSTAT(%p) SFR setting\n", pafstat->regs);
+ for (i = 0; i < regs_cnt; i++) {
+ dbg_pafstat(2, "[%d] ofs: 0x%x, val: 0x%x\n",
+ i, regs[i].reg_addr, regs[i].reg_data);
+ writel(regs[i].reg_data, pafstat->regs + regs[i].reg_addr);
+ }
+
+ med_line = pafstat_hw_com_s_med_line(pafstat->regs);
+ dbg_pafstat(1, "MED LINE_NUM(%d)\n", med_line);
+
+ atomic_set(&pafstat->sfr_state, PAFSTAT_SFR_READY);
return 0;
}
-u32 pafstat_hw_get_ready(struct v4l2_subdev *subdev)
+int pafstat_hw_get_ready(struct v4l2_subdev *subdev, u32 *ready)
{
- struct fimc_is_paf *pafstat;
+ struct fimc_is_pafstat *pafstat;
pafstat = v4l2_get_subdevdata(subdev);
if (!pafstat) {
err("A subdev data of PAFSTAT is null");
- return 0;
+ return -ENODEV;
+ }
+
+ *ready = (u32)atomic_read(&pafstat->sfr_state);
+
+ return 0;
+}
+
+int pafstat_register_notifier(struct v4l2_subdev *subdev, enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier, void *data)
+{
+ struct fimc_is_pafstat *pafstat;
+ struct paf_action *pa;
+ unsigned long flag;
+
+ pafstat = (struct fimc_is_pafstat *)v4l2_get_subdevdata(subdev);
+ if (!pafstat) {
+ err("%s, failed to get PDP", __func__);
+ return -ENODEV;
}
- return (u32)atomic_read(&pafstat->sfr_state);
+ switch (type) {
+ case VC_STAT_TYPE_PAFSTAT_FLOATING:
+ case VC_STAT_TYPE_PAFSTAT_STATIC:
+ pa = kzalloc(sizeof(struct paf_action), GFP_ATOMIC);
+ if (!pa) {
+ err_lib("failed to allocate a PAF action");
+ return -ENOMEM;
+ }
+
+ pa->type = type;
+ pa->notifier = notifier;
+ pa->data = data;
+
+ spin_lock_irqsave(&pafstat->slock_paf_action, flag);
+ list_add(&pa->list, &pafstat->list_of_paf_action);
+ spin_unlock_irqrestore(&pafstat->slock_paf_action, flag);
+
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/* TODO: below version removes all notifiers have been registered with same stat. type */
+int pafstat_unregister_notifier(struct v4l2_subdev *subdev, enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier)
+{
+ struct fimc_is_pafstat *pafstat;
+ struct paf_action *pa, *temp;
+ unsigned long flag;
+
+ pafstat = (struct fimc_is_pafstat *)v4l2_get_subdevdata(subdev);
+ if (!pafstat) {
+ err("%s, failed to get PAFSTAT", __func__);
+ return -ENODEV;
+ }
+
+ switch (type) {
+ case VC_STAT_TYPE_PAFSTAT_FLOATING:
+ case VC_STAT_TYPE_PAFSTAT_STATIC:
+ spin_lock_irqsave(&pafstat->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp,
+ &pafstat->list_of_paf_action, list) {
+ if (pa->type == type) {
+ list_del(&pa->list);
+ kfree(pa);
+ }
+ }
+ spin_unlock_irqrestore(&pafstat->slock_paf_action, flag);
+
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+void __nocfi pafstat_notify(struct v4l2_subdev *subdev, unsigned int type, void *data)
+{
+ struct fimc_is_pafstat *pafstat;
+ struct paf_action *pa, *temp;
+ unsigned long flag;
+
+ pafstat = (struct fimc_is_pafstat *)v4l2_get_subdevdata(subdev);
+ if (!pafstat)
+ err("%s, failed to get PAFSTAT", __func__);
+
+ switch (type) {
+ case CSIS_NOTIFY_DMA_END_VC_MIPISTAT:
+ spin_lock_irqsave(&pafstat->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp, &pafstat->list_of_paf_action, list) {
+ switch (pa->type) {
+ case VC_STAT_TYPE_PAFSTAT_STATIC:
+#ifdef ENABLE_FPSIMD_FOR_USER
+ fpsimd_get();
+ pa->notifier(pa->type, *(unsigned int *)data, pa->data);
+ fpsimd_put();
+#else
+ pa->notifier(pa->type, *(unsigned int *)data, pa->data);
+#endif
+ break;
+ default:
+ break;
+ }
+ dbg_pafstat(1, "%s, sensor fcount: %d\n", __func__, *(unsigned int *)data);
+ }
+ spin_unlock_irqrestore(&pafstat->slock_paf_action, flag);
+
+ default:
+ break;
+ }
}
int pafstat_register(struct fimc_is_module_enum *module, int pafstat_ch)
{
int ret = 0;
- struct fimc_is_paf *pafstat;
+ struct fimc_is_pafstat *pafstat;
struct fimc_is_device_sensor_peri *sensor_peri = module->private_data;
u32 version = 0;
goto p_err;
}
- pafstat = &pafstat_device[pafstat_ch];
- sensor_peri->paf = pafstat;
- sensor_peri->subdev_paf = pafstat->subdev;
+ pafstat = &pafstat_devices[pafstat_ch];
+ sensor_peri->pafstat = pafstat;
+ sensor_peri->subdev_pafstat = pafstat->subdev;
v4l2_set_subdev_hostdata(pafstat->subdev, module);
+ spin_lock_init(&pafstat->slock_paf_action);
+ INIT_LIST_HEAD(&pafstat->list_of_paf_action);
- atomic_set(&pafstat->sfr_state, PAFSTAT_SFR_UNAPPLIED);
+ atomic_set(&pafstat->sfr_state, PAFSTAT_SFR_INIT);
atomic_set(&pafstat->fs, 0);
atomic_set(&pafstat->cl, 0);
atomic_set(&pafstat->fe, 0);
atomic_set(&pafstat->Vvalid, V_BLANK);
init_waitqueue_head(&pafstat->wait_queue);
- pafstat->regs_com = pafstat_device[0].regs;
+ pafstat->regs_com = pafstat_devices[0].regs;
if (!atomic_read(&g_pafstat_rsccount)) {
info("[PAFSTAT:%d] %s: hw_com_init()\n", pafstat->id, __func__);
pafstat_hw_com_init(pafstat->regs_com);
{
int ret = 0;
struct fimc_is_device_sensor_peri *sensor_peri = module->private_data;
- struct fimc_is_paf *pafstat;
- long timetowait;
+ struct fimc_is_pafstat *pafstat;
+ struct paf_action *pa, *temp;
+ unsigned long flag;
if (!test_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE, &sensor_peri->peri_state)) {
err("already unregistered");
goto p_err;
}
- pafstat = v4l2_get_subdevdata(sensor_peri->subdev_paf);
+ pafstat = v4l2_get_subdevdata(sensor_peri->subdev_pafstat);
if (!pafstat) {
err("A subdev data of PAFSTAT is null");
ret = -ENODEV;
goto p_err;
}
- sensor_peri->paf = NULL;
- sensor_peri->subdev_paf = NULL;
- pafstat_hw_s_enable(pafstat->regs, 0);
-
- timetowait = wait_event_timeout(pafstat->wait_queue,
- !atomic_read(&pafstat->Vvalid),
- FIMC_IS_HW_STOP_TIMEOUT);
-
- if (!timetowait) {
- err("[PAFSTAT:%d]wait FRAME_END timeout (%ld), fro_cnt(%d)",
- pafstat->id, timetowait, pafstat->fro_cnt);
- ret = -ETIME;
+ if (!list_empty(&pafstat->list_of_paf_action)) {
+ err("flush remaining notifiers...");
+ spin_lock_irqsave(&pafstat->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp,
+ &pafstat->list_of_paf_action, list) {
+ list_del(&pa->list);
+ kfree(pa);
+ }
+ spin_unlock_irqrestore(&pafstat->slock_paf_action, flag);
}
+ sensor_peri->pafstat = NULL;
+ sensor_peri->subdev_pafstat = NULL;
+ pafstat_hw_s_enable(pafstat->regs, 0);
+
clear_bit(FIMC_IS_SENSOR_PAFSTAT_AVAILABLE, &sensor_peri->peri_state);
atomic_dec(&g_pafstat_rsccount);
return 0;
}
-static int pafstat_s_stream(struct v4l2_subdev *subdev, int pd_mode)
+static int pafstat_s_stream(struct v4l2_subdev *subdev, int enable)
{
- int irq_state = 0;
- int enable = 0;
- struct fimc_is_paf *pafstat;
- struct fimc_is_device_sensor_peri *sensor_peri;
- struct fimc_is_module_enum *module;
+ struct fimc_is_pafstat *pafstat;
cis_shared_data *cis_data = NULL;
- u32 lic_mode;
- enum pafstat_input_path input = PAFSTAT_INPUT_OTF;
+ struct fimc_is_module_enum *module;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+
+ pafstat = v4l2_get_subdevdata(subdev);
+ if (!pafstat) {
+ err("A subdev data of PAFSTAT is null");
+ return -ENODEV;
+ }
module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
- WARN_ON(!module);
+ if (!module) {
+ err("[PAFSTAT:%d] A host data of PAFSTAT is null", pafstat->id);
+ return -ENODEV;
+ }
sensor_peri = module->private_data;
WARN_ON(!sensor_peri);
cis_data = sensor_peri->cis.cis_data;
WARN_ON(!cis_data);
- pafstat = v4l2_get_subdevdata(subdev);
- if (!pafstat) {
- err("A subdev data of PAFSTAT is null");
- return -ENODEV;
+ if (cis_data->is_data.paf_stat_enable && enable) {
+ tasklet_init(&pafstat->tasklet_fwin_stat, pafstat_tasklet_fwin_stat, (unsigned long)pafstat);
+ atomic_set(&pafstat->frameptr_fwin_stat, 0);
+ INIT_WORK(&pafstat->work_fwin_stat, pafstat_worker_fwin_stat);
+ } else {
+ tasklet_kill(&pafstat->tasklet_fwin_stat);
+ if (flush_work(&pafstat->work_fwin_stat))
+ info("flush pafstat wq for fwin stat\n");
}
- enable = pafstat_hw_s_sensor_mode(pafstat->regs, pd_mode);
- pafstat_hw_s_irq_mask(pafstat->regs, PAFSTAT_INT_MASK);
-
- cis_data->is_data.paf_stat_enable = enable;
- irq_state = pafstat_hw_g_irq_src(pafstat->regs);
-
- lic_mode = (pafstat->fro_cnt == 0 ? LIC_MODE_INTERLEAVING : LIC_MODE_SINGLE_BUFFER);
- pafstat_hw_com_s_lic_mode(pafstat->regs_com, pafstat->id, lic_mode, input);
- pafstat_hw_com_s_output_mask(pafstat->regs_com, 0);
- pafstat_hw_s_input_path(pafstat->regs, input);
- pafstat_hw_s_img_size(pafstat->regs, pafstat->in_width, pafstat->in_height);
-
- pafstat_hw_s_ready(pafstat->regs, 1);
- pafstat_hw_s_enable(pafstat->regs, 1);
+ pafstat_hw_s_enable(pafstat->regs, enable);
- info("[PAFSTAT:%d] PD_MODE:%d, HW_ENABLE:%d, IRQ:0x%x, IRQ_MASK:0x%x, LIC_MODE(%s)\n",
- pafstat->id, pd_mode, enable, irq_state, PAFSTAT_INT_MASK,
- lic_mode == LIC_MODE_INTERLEAVING ? "INTERLEAVING": "SINGLE_BUFFER");
+ info("[PAFSTAT:%d] CORE_EN:%d\n", pafstat->id, enable);
return 0;
}
{
int ret = 0;
size_t width, height;
- struct fimc_is_paf *pafstat;
+ int irq_state = 0;
+ int pd_enable = 0;
+ u32 lic_mode;
+ int pd_mode = PD_NONE;
+ enum pafstat_input_path input = PAFSTAT_INPUT_OTF;
+ struct fimc_is_pafstat *pafstat;
struct fimc_is_module_enum *module;
struct fimc_is_device_sensor *sensor = NULL;
+ struct fimc_is_device_sensor_peri *sensor_peri;
+ cis_shared_data *cis_data = NULL;
pafstat = v4l2_get_subdevdata(subdev);
if (!pafstat) {
pafstat->in_height = height;
pafstat_hw_s_img_size(pafstat->regs, pafstat->in_width, pafstat->in_height);
+ lic_mode = (pafstat->fro_cnt == 0 ? LIC_MODE_INTERLEAVING : LIC_MODE_SINGLE_BUFFER);
+ pafstat_hw_com_s_lic_mode(pafstat->regs_com, pafstat->id, lic_mode, input);
+ pafstat_hw_com_s_output_mask(pafstat->regs_com, 0);
+ pafstat_hw_s_input_path(pafstat->regs, input);
+
module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
if (!module) {
err("[PAFSTAT:%d] A host data of PAFSTAT is null", pafstat->id);
goto p_err;
}
+ sensor_peri = module->private_data;
+ WARN_ON(!sensor_peri);
+
+ cis_data = sensor_peri->cis.cis_data;
+ WARN_ON(!cis_data);
+
if (sensor->cfg) {
pafstat->pd_width = sensor->cfg->input[CSI_VIRTUAL_CH_1].width;
pafstat->pd_height = sensor->cfg->input[CSI_VIRTUAL_CH_1].height;
+ if (sensor->cfg->pd_mode == PD_MSPD_TAIL)
+ pafstat->pd_height /= 2;
+
pafstat_hw_s_pd_size(pafstat->regs, pafstat->pd_width, pafstat->pd_height);
+ pd_mode = sensor->cfg->pd_mode;
}
+ pafstat_hw_s_lbctrl(pafstat->regs,
+ pafstat->pd_width, pafstat->pd_height);
+
+ pd_enable = pafstat_hw_s_sensor_mode(pafstat->regs, pd_mode);
+ cis_data->is_data.paf_stat_enable = pd_enable;
+
+ pafstat_hw_s_irq_mask(pafstat->regs, PAFSTAT_INT_MASK);
+ irq_state = pafstat_hw_g_irq_src(pafstat->regs);
+
+ pafstat_hw_s_ready(pafstat->regs, 1);
+
+ info("[PAFSTAT:%d] PD_MODE:%d, PD_ENABLE:%d, IRQ:0x%x, IRQ_MASK:0x%x, LIC_MODE(%s)\n",
+ pafstat->id, pd_mode, pd_enable, irq_state, PAFSTAT_INT_MASK,
+ lic_mode == LIC_MODE_INTERLEAVING ? "INTERLEAVING" : "SINGLE_BUFFER");
+
info("[PAFSTAT:%d] %s: image_size(%lux%lu) pd_size(%lux%lu) ret(%d)\n", pafstat->id, __func__,
width, height, pafstat->pd_width, pafstat->pd_height, ret);
int fimc_is_pafstat_reset_recovery(struct v4l2_subdev *subdev, u32 reset_mode, int pd_mode)
{
int ret = 0;
- struct fimc_is_paf *pafstat;
+ struct fimc_is_pafstat *pafstat;
+ struct v4l2_subdev_pad_config *cfg = NULL;
+ struct v4l2_subdev_format *fmt = NULL;
pafstat = v4l2_get_subdevdata(subdev);
if (!pafstat) {
pafstat_hw_com_s_output_mask(pafstat->regs_com, 1);
pafstat_hw_sw_reset(pafstat->regs);
} else {
- pafstat_s_stream(subdev, pd_mode);
+ pafstat_s_format(subdev, cfg, fmt);
+ pafstat_s_stream(subdev, 1);
pafstat_hw_com_s_output_mask(pafstat->regs_com, 0);
}
.pad = &pad_ops
};
-struct fimc_is_paf_ops pafstat_ops = {
+struct fimc_is_pafstat_ops pafstat_ops = {
.set_param = pafstat_hw_set_regs,
.get_ready = pafstat_hw_get_ready,
+ .register_notifier = pafstat_register_notifier,
+ .unregister_notifier = pafstat_unregister_notifier,
+ .notify = pafstat_notify,
.set_num_buffers = pafstat_set_num_buffers,
};
{
int ret = 0;
int id = -1;
- struct resource *mem_res;
- struct fimc_is_paf *pafstat;
- struct device_node *dnode;
- struct device *dev;
+ struct resource *res, *res_b;
+ struct fimc_is_pafstat *pafstat;
+ struct device *dev = &pdev->dev;
u32 reg_cnt = 0;
- char irq_name[16];
WARN_ON(!fimc_is_dev);
WARN_ON(!pdev);
WARN_ON(!pdev->dev.of_node);
- dev = &pdev->dev;
- dnode = dev->of_node;
-
- ret = of_property_read_u32(dnode, "id", &pdev->id);
- if (ret) {
- dev_err(dev, "id read is fail(%d)\n", ret);
- goto err_get_id;
+ id = of_alias_get_id(dev->of_node, "pafstat");
+ if (id < 0 || id >= MAX_NUM_OF_PAFSTAT) {
+ dev_err(dev, "invalid id (out-of-range)\n");
+ return -EINVAL;
}
- id = pdev->id;
- pafstat = &pafstat_device[id];
+ pafstat = &pafstat_devices[id];
+ pafstat->id = id;
- /* Get SFR base register */
- mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!mem_res) {
- dev_err(dev, "Failed to get io memory region(%p)\n", mem_res);
- ret = -EBUSY;
- goto err_get_resource;
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(dev, "can't get memory resource\n");
+ return -ENODEV;
+ }
+
+ if (!devm_request_mem_region(dev, res->start, resource_size(res),
+ dev_name(dev))) {
+ dev_err(dev, "can't request region for resource %p\n", res);
+ return -EBUSY;
}
- pafstat->regs_start = mem_res->start;
- pafstat->regs_end = mem_res->end;
- pafstat->regs = devm_ioremap_nocache(&pdev->dev, mem_res->start, resource_size(mem_res));
+ pafstat->regs_start = res->start;
+ pafstat->regs_end = res->end;
+ pafstat->regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
if (!pafstat->regs) {
- dev_err(dev, "Failed to remap io region(%p)\n", pafstat->regs);
+ dev_err(dev, "ioremap failed\n");
ret = -ENOMEM;
goto err_ioremap;
}
- mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
- if (!mem_res) {
- dev_err(dev, "Failed to get io memory region(%p)\n", mem_res);
+ res_b = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ if (!res_b) {
+ dev_err(dev, "can't get memory resource\n");
+ ret = -ENODEV;
+ goto err_get_rsc_b;
+ }
+
+ if (!devm_request_mem_region(dev, res_b->start, resource_size(res_b),
+ dev_name(dev))) {
+ dev_err(dev, "can't request region for resource %p\n", res_b);
ret = -EBUSY;
- goto err_get_resource;
+ goto err_get_rsc_b;
}
- pafstat->regs_b_start = mem_res->start;
- pafstat->regs_b_end = mem_res->end;
- pafstat->regs_b = devm_ioremap_nocache(&pdev->dev, mem_res->start, resource_size(mem_res));
+ pafstat->regs_b_start = res_b->start;
+ pafstat->regs_b_end = res_b->end;
+ pafstat->regs_b = devm_ioremap_nocache(dev, res_b->start, resource_size(res_b));
if (!pafstat->regs_b) {
- dev_err(dev, "Failed to remap io region(%p)\n", pafstat->regs_b);
+ dev_err(dev, "ioremap failed(reg_b)\n");
ret = -ENOMEM;
- goto err_ioremap;
+ goto err_ioremap_b;
}
- /* Get CORE IRQ SPI number */
pafstat->irq = platform_get_irq(pdev, 0);
if (pafstat->irq < 0) {
- dev_err(dev, "Failed to get pafstat_irq(%d)\n", pafstat->irq);
- ret = -EBUSY;
- goto err_get_irq;
+ dev_err(dev, "failed to get IRQ resource: %d\n", pafstat->irq);
+ ret = pafstat->irq;
+ goto err_irq;
}
- snprintf(irq_name, sizeof(irq_name), "pafstat%d", id);
- ret = request_irq(pafstat->irq,
+ ret = devm_request_irq(dev, pafstat->irq,
fimc_is_isr_pafstat,
FIMC_IS_HW_IRQ_FLAG | IRQF_SHARED,
- irq_name,
+ dev_name(dev),
pafstat);
if (ret) {
- dev_err(dev, "request_irq(IRQ_PAFSTAT %d) is fail(%d)\n", pafstat->irq, ret);
- goto err_get_irq;
+ dev_err(dev, "failed to request IRQ(%d): %d\n", pafstat->irq, ret);
+ goto err_irq;
}
- pafstat->id = id;
- platform_set_drvdata(pdev, pafstat);
-
pafstat->subdev = devm_kzalloc(&pdev->dev, sizeof(struct v4l2_subdev), GFP_KERNEL);
if (!pafstat->subdev) {
+ probe_err("failed to alloc memory for pafstat-subdev\n");
ret = -ENOMEM;
- goto err_subdev_alloc;
+ goto err_alloc;
}
snprintf(pafstat->name, FIMC_IS_STR_LEN, "PAFSTAT%d", pafstat->id);
reg_cnt = pafstat_hw_g_reg_cnt();
- pafstat->regs_set = devm_kzalloc(&pdev->dev, reg_cnt * sizeof(struct pafstat_setting_t), GFP_KERNEL);
+ pafstat->regs_set = devm_kzalloc(&pdev->dev, reg_cnt * sizeof(struct paf_setting_t), GFP_KERNEL);
if (!pafstat->regs_set) {
probe_err("pafstat->reg_set NULL");
ret = -ENOMEM;
- goto err_reg_cnt_alloc;
+ goto err_alloc;
}
v4l2_subdev_init(pafstat->subdev, &subdev_ops);
v4l2_set_subdevdata(pafstat->subdev, pafstat);
snprintf(pafstat->subdev->name, V4L2_SUBDEV_NAME_SIZE, "pafstat-subdev.%d", pafstat->id);
- pafstat->paf_ops = &pafstat_ops;
+ pafstat->pafstat_ops = &pafstat_ops;
prepare_pafstat_sfr_dump(pafstat);
atomic_set(&g_pafstat_rsccount, 0);
+ platform_set_drvdata(pdev, pafstat);
probe_info("%s(%s)\n", __func__, dev_name(&pdev->dev));
return ret;
-err_reg_cnt_alloc:
-err_subdev_alloc:
-err_get_irq:
+err_alloc:
+ devm_free_irq(dev, pafstat->irq, pafstat);
+err_irq:
+ devm_iounmap(dev, pafstat->regs_b);
+err_ioremap_b:
+ devm_release_mem_region(dev, res_b->start, resource_size(res_b));
+err_get_rsc_b:
+ devm_iounmap(dev, pafstat->regs);
err_ioremap:
-err_get_resource:
-err_get_id:
+ devm_release_mem_region(dev, res->start, resource_size(res));
+
return ret;
}
-static const struct of_device_id exynos_fimc_is_pafstat_match[] = {
+static const struct of_device_id sensor_paf_pafstat_match[] = {
{
- .compatible = "samsung,exynos5-fimc-is-pafstat",
+ .compatible = "samsung,sensor-paf-pafstat",
},
{},
};
-MODULE_DEVICE_TABLE(of, exynos_fimc_is_pafstat_match);
+MODULE_DEVICE_TABLE(of, sensor_paf_pafstat_match);
-static struct platform_driver pafstat_driver = {
+static struct platform_driver sensor_paf_pafstat_platform_driver = {
.driver = {
- .name = "FIMC-IS-PAFSTAT",
+ .name = "Sensor-PAF-PAFSTAT",
.owner = THIS_MODULE,
- .of_match_table = exynos_fimc_is_pafstat_match,
+ .of_match_table = sensor_paf_pafstat_match,
}
};
-builtin_platform_driver_probe(pafstat_driver, pafstat_probe);
+
+static int __init sensor_paf_pafstat_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_paf_pafstat_platform_driver, pafstat_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_paf_pafstat_platform_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_paf_pafstat_init);
#include "fimc-is-device-sensor.h"
#include "fimc-is-interface-sensor.h"
+extern int debug_pafstat;
+
+#define dbg_pafstat(level, fmt, args...) \
+ dbg_common(((debug_pafstat) >= (level)), "[PAFSTAT]", fmt, ##args)
+
#define MAX_NUM_OF_PAFSTAT 2
int pafstat_register(struct fimc_is_module_enum *module, int pafstat_ch);
#include "fimc-is-hw-pdp.h"
#include "fimc-is-device-sensor.h"
-
-#ifdef DEBUG_DUMP_STAT0
-u32 *statBuf;
-#endif
-
-int pdp_hw_enable(u32 __iomem *base_reg, u32 pd_mode)
+static int pdp_hw_s_irq_msk(void __iomem *base, u32 msk)
{
- u32 sensor_type;
- u32 enable;
+ fimc_is_hw_set_reg(base, &pdp_regs[PDP_R_PDP_INT], 0);
+ fimc_is_hw_set_reg(base, &pdp_regs[PDP_R_PDP_INT_MASK], msk);
- switch (pd_mode) {
- case PD_MSPD:
- sensor_type = SENSOR_TYPE_MSPD;
- enable = 1;
- break;
- case PD_MOD1:
- sensor_type = SENSOR_TYPE_MOD1;
- enable = 1;
- break;
- case PD_MOD2:
- case PD_MSPD_TAIL:
- case PD_NONE:
- sensor_type = SENSOR_TYPE_MOD2;
- enable = 0;
- break;
- case PD_MOD3:
- sensor_type = SENSOR_TYPE_MOD3;
- enable = 1;
- break;
- default:
- warn("PD MODE(%d) is invalid", pd_mode);
- sensor_type = SENSOR_TYPE_MOD2;
- enable = 0;
- break;
- }
-
- fimc_is_hw_set_field(base_reg, &pdp_regs[PDP_R_SENSOR_TYPE],
- &pdp_fields[PDP_F_SENSOR_TYPE], sensor_type);
-
- if (enable)
- pdp_hw_s_irq_msk(base_reg, 0x1F & ~PDP_INT_FRAME_PAF_STAT0);
- else
- pdp_hw_s_irq_msk(base_reg, 0x1F);
-
- fimc_is_hw_set_field(base_reg, &pdp_regs[PDP_R_PDP_CORE_ENABLE],
- &pdp_fields[PDP_F_PDP_CORE_ENABLE], enable);
-
- return enable;
-}
-
-void pdp_hw_s_config(u32 __iomem *base_reg)
-{
- int i = 0;
- u32 index = 0;
- u32 value = 0;
- int count = sizeof(pdp_global_init_table)/sizeof(struct fimc_is_pdp_reg);
-#ifdef DEBUG_DUMP_STAT0
- u32 bufSize = pdp_regs[PDP_R_PAF_STAT0_END].sfr_offset - pdp_regs[PDP_R_PAF_STAT0_START].sfr_offset;
-
- if (!statBuf) {
- statBuf = kmalloc(bufSize, GFP_KERNEL);
- memset(statBuf, 0x0, bufSize);
- }
-#endif
-
- for (i = 0; i < count; i++) {
- index = pdp_global_init_table[i].index;
- value = pdp_global_init_table[i].init_value;
-
- //info("%s: Reg[%s] = %d\n", __func__, pdp_regs[index].reg_name, value);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[index], value);
- }
+ return 0;
}
-#ifdef DEBUG_DUMP_STAT0
-void pdp_hw_g_reg_data_for_dump(void __iomem *base_addr,
- const struct fimc_is_reg *start_reg, const struct fimc_is_reg *end_reg)
+void pdp_hw_s_sensor_type(void __iomem *base, u32 sensor_type)
{
- u32 reg_value;
- int i = 0;
- int buf_index = 0;
-
- for (i = 0; i < end_reg->sfr_offset - start_reg->sfr_offset; i += 4) {
- reg_value = readl(base_addr + start_reg->sfr_offset + i);
- *(statBuf+buf_index++) = reg_value;
- }
+ fimc_is_hw_set_field(base, &pdp_regs[PDP_R_SENSOR_TYPE],
+ &pdp_fields[PDP_F_SENSOR_TYPE], sensor_type);
}
-void pdp_hw_g_paf_single_window_stat(struct work_struct *data)
+void pdp_hw_s_core(void __iomem *base, bool enable)
{
- struct fimc_is_pdp *pdp;
- loff_t pos = 0;
- int ret = 0;
- u32 size = pdp_regs[PDP_R_PAF_STAT0_END].sfr_offset - pdp_regs[PDP_R_PAF_STAT0_START].sfr_offset;
-
- pdp = container_of(data, struct fimc_is_pdp, wq_pdp_stat0);
- WARN_ON(!pdp);
-
- info("=====================PAF STAT0==============================\n");
- memset(statBuf, 0xFF, size);
- pdp_hw_g_reg_data_for_dump(pdp->base_reg, &pdp_regs[PDP_R_PAF_STAT0_START], &pdp_regs[PDP_R_PAF_STAT0_END]);
-
- ret = write_data_to_file("/data/media/0/pdp_stat0.dump", (char *)statBuf, size, &pos);
- if (ret < 0)
- info("Fail to dump pdp stat0.\n");
+ if (enable)
+ pdp_hw_s_irq_msk(base, 0x1F & ~PDP_INT_FRAME_PAF_STAT0);
else
- info("Done.\n");
-}
-#endif
-
-void pdp_hw_g_reg_data(void __iomem *base_reg, u32 *buf,
- const struct fimc_is_reg *start_reg, const struct fimc_is_reg *end_reg)
-{
- u32 reg_value;
- int i = 0;
- int buf_index = 0;
-
- for (i = 0; i < end_reg->sfr_offset - start_reg->sfr_offset; i += 4) {
- reg_value = readl(base_reg + start_reg->sfr_offset + i);
- *(buf+buf_index++) = reg_value;
- }
-}
-
-void pdp_hw_g_pdp_reg(void __iomem *base_reg, struct pdp_read_reg_setting_t *reg_param)
-{
- int i = 0;
+ pdp_hw_s_irq_msk(base, 0x1F);
- WARN_ON(!reg_param->buf_array);
- WARN_ON(!reg_param->addr_array);
-
- for (i = 0; i < reg_param->buf_size; i++) {
- int addr = *(reg_param->addr_array + i);
-
- *(reg_param->buf_array + i) = readl(base_reg + addr);
- }
+ fimc_is_hw_set_field(base, &pdp_regs[PDP_R_PDP_CORE_ENABLE],
+ &pdp_fields[PDP_F_PDP_CORE_ENABLE], enable);
}
-void pdp_hw_g_paf_sfr_stats(void __iomem *base_reg, u32 *buf)
+unsigned int pdp_hw_g_irq_state(void __iomem *base, bool clear)
{
- pdp_hw_g_reg_data(base_reg, buf, &pdp_regs[PDP_R_PAF_STAT0_START], &pdp_regs[PDP_R_PAF_STAT0_END]);
-}
+ u32 src;
-void pdp_hw_s_paf_mpd_bin_shift(u32 __iomem *base_reg, u32 h, u32 v, u32 vsht)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_HBIN], h);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_VBIN], v);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_VSFT], vsht);
-}
+ src = fimc_is_hw_get_reg(base, &pdp_regs[PDP_R_PDP_INT]);
+ if (clear)
+ fimc_is_hw_set_reg(base, &pdp_regs[PDP_R_PDP_INT], src);
-void pdp_hw_s_paf_col(u32 __iomem *base_reg, u32 value)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_COL], value);
+ return src;
}
-void pdp_hw_s_paf_mode(u32 __iomem *base_reg, bool onoff)
+unsigned int pdp_hw_g_irq_mask(void __iomem *base)
{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_PAF_ON], onoff);
+ return fimc_is_hw_get_reg(base, &pdp_regs[PDP_R_PDP_INT_MASK]);
}
-void pdp_hw_s_paf_active_size(u32 __iomem *base_reg, u32 width, u32 height)
+int pdp_hw_g_stat0(void __iomem *base, void *buf, size_t len)
{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ACTIVE_X], width);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ACTIVE_Y], height);
-}
+ /* PDP_R_PAF_STAT0_END be excepted from STAT0 */
+ size_t stat0_len = pdp_regs[PDP_R_PAF_STAT0_END].sfr_offset
+ - pdp_regs[PDP_R_PAF_STAT0_START].sfr_offset;
-void pdp_hw_s_paf_af_size(u32 __iomem *base_reg, u32 width, u32 height)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_AF_SIZE_X], width);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_AF_SIZE_Y], height);
-}
+ if (len < stat0_len) {
+ stat0_len = len;
+ warn("the size of STAT0 buffer is too small: %zd < %zd",
+ len, stat0_len);
+ }
-void pdp_hw_s_paf_crop_size(u32 __iomem *base_reg, struct pdp_point_info *size)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CROP_ON], 0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CROP_SX], size->sx);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CROP_SY], size->sy);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CROP_EX], size->ex);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CROP_EY], size->ey);
-}
-void pdp_hw_s_paf_setting(u32 __iomem *base_reg,
- struct pdp_paf_setting_t *pafInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_XCOR_ON], pafInfo->xcor_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_AF_CROSS], pafInfo->af_cross);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_ON], pafInfo->mpd_on);
-#if 0 /* Move this code to pdp_set_sensor_info function.*/
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_HBIN], pafInfo->mpd_hbin);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_VBIN], pafInfo->mpd_vbin);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_VSFT], pafInfo->mpd_vsft);
-#endif
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_DP], pafInfo->mpd_dp);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MPD_DP_TH], pafInfo->mpd_dp_th);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_PHASE_RANGE], pafInfo->phase_range);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_DPC_ON], pafInfo->dpc_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_LMV_ON], pafInfo->lmv_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_LMV_SHIFT], pafInfo->lmv_shift);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ALC_ON], pafInfo->alc_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ALC_GAP], pafInfo->alc_gap);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ALC_CLIP_ON], pafInfo->alc_clip_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ALC_FIT_ON], pafInfo->alc_fit_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_B2_EN], pafInfo->b2_en);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CROP_ON], pafInfo->crop_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_AF_DEBUG_MODE], pafInfo->af_debug_mode);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_LF_SHIFT], pafInfo->lf_shift);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_PAFSAT_ON], pafInfo->pafsat_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_SAT_LV], pafInfo->sat_lv);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_SAT_LV1], pafInfo->sat_lv1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_SAT_LV2], pafInfo->sat_lv2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_SAT_LV3], pafInfo->sat_lv3);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_SAT_SRC], pafInfo->sat_src);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_COR_TYPE], pafInfo->cor_type);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_G_SSD], pafInfo->g_ssd);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_OB_VALUE], pafInfo->ob_value);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_AF_LAYOUT], pafInfo->af_layout);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_AF_PATTERN], pafInfo->af_pattern);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_ZG1], pafInfo->roi_zg1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_ZG2], pafInfo->roi_zg2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_ZG3], pafInfo->roi_zg3);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_ZG4], pafInfo->roi_zg4);
-}
+ memcpy((void *)buf, base + pdp_regs[PDP_R_PAF_STAT0_START].sfr_offset,
+ stat0_len);
-void pdp_hw_s_paf_roi(u32 __iomem *base_reg,
- struct pdp_paf_roi_setting_t *roiInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_SX], roiInfo->roi_start_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_SY], roiInfo->roi_start_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_EX], roiInfo->roi_end_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_ROI_EY], roiInfo->roi_end_y);
+ return stat0_len;
}
-void pdp_hw_s_paf_knee(u32 __iomem *base_reg,
- struct pdp_knee_setting_t *kneeInfo)
+void pdp_hw_s_config_default(void __iomem *base)
{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KNEE_ON], kneeInfo->knee_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC0], kneeInfo->kn_inc_0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC1], kneeInfo->kn_inc_1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC2], kneeInfo->kn_inc_2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC3], kneeInfo->kn_inc_3);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC4], kneeInfo->kn_inc_4);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC5], kneeInfo->kn_inc_5);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC6], kneeInfo->kn_inc_6);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_INC7], kneeInfo->kn_inc_7);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_OFFSET1], kneeInfo->kn_offset_1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_OFFSET2], kneeInfo->kn_offset_2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_OFFSET3], kneeInfo->kn_offset_3);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_OFFSET4], kneeInfo->kn_offset_4);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_OFFSET5], kneeInfo->kn_offset_5);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_OFFSET6], kneeInfo->kn_offset_6);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_KN_OFFSET7], kneeInfo->kn_offset_7);
-}
+ int i;
+ u32 index;
+ u32 value;
+ int count = ARRAY_SIZE(pdp_global_init_table);
-void pdp_hw_s_paf_filter_cor(u32 __iomem *base_reg,
- struct pdp_filterCor_setting_t *corInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TY], corInfo->coring_ty);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TH], corInfo->coring_th);
+ for (i = 0; i < count; i++) {
+ index = pdp_global_init_table[i].index;
+ value = pdp_global_init_table[i].init_value;
+ fimc_is_hw_set_reg(base, &pdp_regs[index], value);
+ }
}
-void pdp_hw_s_paf_filter_bin(u32 __iomem *base_reg,
- struct pdp_filterBin_setting_t *binInfo)
+bool pdp_hw_to_sensor_type(u32 pd_mode, u32 *sensor_type)
{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BIN_FIRST], binInfo->bin_first);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BINNING_NUM_LMV_H], binInfo->binning_num_lmv_h);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BINNING_NUM_LMV_V], binInfo->binning_num_lmv_v);
-}
+ bool enable;
-void pdp_hw_s_paf_filter_band(u32 __iomem *base_reg,
- struct pdp_filterBand_setting_t *iirInfo, int filter_no)
-{
- switch (filter_no) {
- case FILTER_BAND_0:
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_G0], iirInfo->gain0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_K01], iirInfo->k01);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_K02], iirInfo->k02);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_FTYPE0], iirInfo->type0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_G1], iirInfo->gain1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_K11], iirInfo->k11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_K12], iirInfo->k12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_C11], iirInfo->c11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_C12], iirInfo->c12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_G2], iirInfo->gain2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_K21], iirInfo->k21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_K22], iirInfo->k22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_C21], iirInfo->c21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_C22], iirInfo->c22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_BY0], iirInfo->bypass0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_BY1], iirInfo->bypass1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_BY2], iirInfo->bypass2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_COR_TYPE_B0], iirInfo->cor_type_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TY_B0], iirInfo->coring_ty_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TH_B0], iirInfo->coring_th_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I0_CORING], iirInfo->coring_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BIN_FIRST_B0], iirInfo->bin_first_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BINNING_NUM_B0], iirInfo->binning_num_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BIN0_SKIP], iirInfo->bin_skip_b);
+ switch (pd_mode) {
+ case PD_MSPD:
+ *sensor_type = SENSOR_TYPE_MSPD;
+ enable = true;
break;
- case FILTER_BAND_1:
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_G0], iirInfo->gain0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_K01], iirInfo->k01);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_K02], iirInfo->k02);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_FTYPE0], iirInfo->type0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_G1], iirInfo->gain1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_K11], iirInfo->k11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_K12], iirInfo->k12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_C11], iirInfo->c11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_C12], iirInfo->c12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_G2], iirInfo->gain2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_K21], iirInfo->k21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_K22], iirInfo->k22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_C21], iirInfo->c21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_C22], iirInfo->c22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_BY0], iirInfo->bypass0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_BY1], iirInfo->bypass1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_BY2], iirInfo->bypass2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_COR_TYPE_B1], iirInfo->cor_type_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TY_B1], iirInfo->coring_ty_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TH_B1], iirInfo->coring_th_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I1_CORING], iirInfo->coring_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BIN_FIRST_B1], iirInfo->bin_first_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BINNING_NUM_B1], iirInfo->binning_num_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BIN1_SKIP], iirInfo->bin_skip_b);
+ case PD_MOD1:
+ *sensor_type = SENSOR_TYPE_MOD1;
+ enable = true;
break;
- case FILTER_BAND_2:
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_G0], iirInfo->gain0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_K01], iirInfo->k01);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_K02], iirInfo->k02);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_FTYPE0], iirInfo->type0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_G1], iirInfo->gain1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_K11], iirInfo->k11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_K12], iirInfo->k12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_C11], iirInfo->c11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_C12], iirInfo->c12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_G2], iirInfo->gain2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_K21], iirInfo->k21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_K22], iirInfo->k22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_C21], iirInfo->c21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_C22], iirInfo->c22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_BY0], iirInfo->bypass0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_BY1], iirInfo->bypass1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_BY2], iirInfo->bypass2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_COR_TYPE_B2], iirInfo->cor_type_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TY_B2], iirInfo->coring_ty_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_CORING_TH_B2], iirInfo->coring_th_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_I2_CORING], iirInfo->coring_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BIN_FIRST_B2], iirInfo->bin_first_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BINNING_NUM_B2], iirInfo->binning_num_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BIN2_SKIP], iirInfo->bin_skip_b);
+ case PD_MOD2:
+ case PD_MSPD_TAIL:
+ case PD_NONE:
+ *sensor_type = SENSOR_TYPE_MOD2;
+ enable = false;
break;
- case FILTER_BAND_L:
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_G0], iirInfo->gain0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_K01], iirInfo->k01);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_K02], iirInfo->k02);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_FTYPE0], iirInfo->type0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_G1], iirInfo->gain1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_K11], iirInfo->k11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_K12], iirInfo->k12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_C11], iirInfo->c11);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_C12], iirInfo->c12);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_G2], iirInfo->gain2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_K21], iirInfo->k21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_K22], iirInfo->k22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_C21], iirInfo->c21);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_C22], iirInfo->c22);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_BY0], iirInfo->bypass0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_BY1], iirInfo->bypass1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_BY2], iirInfo->bypass2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_IL_CORING], iirInfo->coring_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BINNING_NUM_LMV], iirInfo->binning_num_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_BINL_SKIP], iirInfo->bin_skip_b);
+ case PD_MOD3:
+ *sensor_type = SENSOR_TYPE_MOD3;
+ enable = true;
break;
default:
- err("invalid IIR filter number(%d)\n", filter_no);
+ warn("PD MODE(%d) is invalid", pd_mode);
+ *sensor_type = SENSOR_TYPE_MOD2;
+ enable = false;
break;
}
-}
-
-void pdp_hw_s_paf_main_window(u32 __iomem *base_reg,
- struct pdp_main_wininfo *winInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWM_CX], winInfo->center_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWM_CY], winInfo->center_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWM_SX], winInfo->start_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWM_SY], winInfo->start_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWM_EX], winInfo->end_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWM_EY], winInfo->end_y);
-}
-
-void pdp_hw_s_paf_single_window(u32 __iomem *base_reg,
- struct pdp_single_wininfo *winInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_SROI], winInfo->sroi);
-
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S1SX], winInfo->single_win[0].start_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S1SY], winInfo->single_win[0].start_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S1EX], winInfo->single_win[0].end_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S1EY], winInfo->single_win[0].end_y);
-
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S2SX], winInfo->single_win[1].start_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S2SY], winInfo->single_win[1].start_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S2EX], winInfo->single_win[1].end_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S2EY], winInfo->single_win[1].end_y);
-
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S3SX], winInfo->single_win[2].start_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S3SY], winInfo->single_win[2].start_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S3EX], winInfo->single_win[2].end_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S3EY], winInfo->single_win[2].end_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S4SX], winInfo->single_win[3].start_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S4SY], winInfo->single_win[3].start_y);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S4EX], winInfo->single_win[3].end_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_S4EY], winInfo->single_win[3].end_y);
-}
-
-void pdp_hw_s_paf_multi_window(u32 __iomem *base_reg,
- struct pdp_multi_wininfo *winInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_ON], winInfo->mode_on);
-
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_SX], winInfo->start_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_SY], winInfo->start_y);
-
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_SIZE_X], winInfo->size_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_SIZE_Y], winInfo->size_y);
-
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_GAP_X], winInfo->gap_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_GAP_Y], winInfo->gap_y);
-
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_NO_X], winInfo->no_x);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_MWS_NO_Y], winInfo->no_y);
-}
-
-void pdp_hw_s_wdr_setting(u32 __iomem *base_reg,
- struct pdp_wdr_setting_t *wdrInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_WDR_ON], wdrInfo->wdr_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_WDR_COEF_LONG], wdrInfo->wdr_coef_long);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_WDR_COEF_SHORT], wdrInfo->wdr_coef_short);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_WDR_SHFT_LONG], wdrInfo->wdr_shft_long);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PAF_I_WDR_SHFT_SHORT], wdrInfo->wdr_shft_short);
-}
-
-void pdp_hw_s_depth_setting(u32 __iomem *base_reg,
- struct pdp_depth_setting_t *depthInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMODE], depthInfo->depth_dmode);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSHIFT], depthInfo->depth_dshift);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DKSIZE1], depthInfo->depth_dsize1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DKSIZE2], depthInfo->depth_dsize2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DBIN_UP], depthInfo->depth_dbin_up);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSCALE_UP], depthInfo->depth_dscale_up);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSMOOTHE_ON], depthInfo->depth_dsmoothe_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSCAN_ON], depthInfo->depth_dscan_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMEDIAN_ON], depthInfo->depth_dmedian_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSLOPE_ON], depthInfo->depth_dslope_on);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DARM_EDGE_H], depthInfo->depth_darm_edge_h);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMEDIAN_SIZE], depthInfo->depth_dmedian_size);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSCAN_EDGE], depthInfo->depth_dscan_edge);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSCAN_PENALTY], depthInfo->depth_dscan_penalty);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DOUT_STAT_MODE], depthInfo->depth_dout_stat_mode);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DINVERSE_SNR], depthInfo->depth_dinverse_snr);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DCOEF_SNR], depthInfo->depth_dcoef_snr);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DCOEF_EDGEH], depthInfo->depth_dcoef_edgeh);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DCOEF_EDGEV], depthInfo->depth_dcoef_edgev);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DSHIFT_FILTER], depthInfo->depth_dshift_filter);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DADD_FILTER], depthInfo->depth_dadd_filter);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMASK_FILTER1], depthInfo->depth_dmask_filter_1);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMASK_FILTER2], depthInfo->depth_dmask_filter_2);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMASK_FILTER3], depthInfo->depth_dmask_filter_3);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMASK_FILTER4], depthInfo->depth_dmask_filter_4);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_DEPTH_I_DMASK_FILTER5], depthInfo->depth_dmask_filter_5);
-}
-
-void pdp_hw_s_y_ext_setting(u32 __iomem *base_reg,
- struct pdp_YextParam_setting_t *yExtInfo)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_MAX_NO_SKIP_PXG], yExtInfo->max_no_skippxg);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_SKIP_LEVEL_TH], yExtInfo->skip_levelth);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_SAT_VALUE_G], yExtInfo->px_sat_g);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_SAT_VALUE_R], yExtInfo->px_sat_r);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_SAT_VALUE_B], yExtInfo->px_sat_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_NUM_OF_SAT_G], yExtInfo->sat_no_g);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_NUM_OF_SAT_R], yExtInfo->sat_no_r);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_NUM_OF_SAT_B], yExtInfo->sat_no_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_SAT_VAL_SUM_OF_G], yExtInfo->sat_g);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_SAT_VAL_SUM_OF_R], yExtInfo->sat_r);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_SAT_VAL_SUM_OF_B], yExtInfo->sat_b);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_CLIP_VAL_LEFT], yExtInfo->clip_val_left);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_CLIP_VAL_RIGHT], yExtInfo->clip_val_right);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_COEF_R], yExtInfo->coef_r_short);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_COEF_G], yExtInfo->coef_g_short);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_COEF_B], yExtInfo->coef_b_short);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_YSHIFT], yExtInfo->y_shift);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_COEF_G_SHORT], yExtInfo->coef_r_long);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_COEF_R_SHORT], yExtInfo->coef_g_long);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_YEXTR_I_COEF_B_SHORT], yExtInfo->coef_b_long);
-}
-
-int pdp_hw_s_irq_msk(u32 __iomem *base_reg, u32 msk)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PDP_INT], 0);
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PDP_INT_MASK], msk);
-
- return 0;
-}
-
-void pdp_hw_s_reset(u32 __iomem *base_reg, u32 val)
-{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PDP_SWRESET0], val);
-}
-
-int pdp_hw_g_irq_state(u32 __iomem *base_reg, bool clear)
-{
- u32 src = 0;
-
- src = fimc_is_hw_get_reg(base_reg, &pdp_regs[PDP_R_PDP_INT]);
- if (clear)
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PDP_INT], src);
-
- return src;
+ return enable;
}
-void pdp_hw_clr_irq_state(u32 __iomem *base_reg, int state)
+bool pdp_hw_is_occured(unsigned int state, enum pdp_event_type type)
{
- fimc_is_hw_set_reg(base_reg, &pdp_regs[PDP_R_PDP_INT], state);
+ return state & (1 << type);
}
-int pdp_hw_dump(u32 __iomem *base_reg)
+int pdp_hw_dump(void __iomem *base)
{
info("PDP SFR DUMP (v1.0)\n");
- fimc_is_hw_dump_regs(base_reg, pdp_regs, PDP_REG_CNT);
+ fimc_is_hw_dump_regs(base, pdp_regs, PDP_REG_CNT);
return 0;
}
#ifndef FIMC_IS_HW_PDP_H
#define FIMC_IS_HW_PDP_H
-#include "fimc-is-device-sensor-peri.h"
-
-#ifdef DEBUG_DUMP_STAT0
-#define ENABLE_PDP_IRQ
-#endif
-
-struct pdp_point_info {
- /* start point */
- u32 sx;
- u32 sy;
- /* end point */
- u32 ex;
- u32 ey;
+enum pdp_event_type {
+ PE_START,
+ PE_END,
+ PE_PAF_STAT0,
+ PE_PAF_STAT1,
+ PE_PAF_STAT2,
};
-#define MAX_SINGLE_WINDOW 4
-struct pdp_single_window {
- u32 sroi;
- struct pdp_point_info size[MAX_SINGLE_WINDOW];
-};
-
-int pdp_hw_enable(u32 __iomem *base_reg, u32 pd_mode);
-int pdp_hw_s_irq_msk(u32 __iomem *base_reg, u32 msk);
-int pdp_hw_g_irq_state(u32 __iomem *base_reg, bool clear);
-int pdp_hw_dump(u32 __iomem *base_reg);
-
-void pdp_hw_clr_irq_state(u32 __iomem *base_reg, int state);
-void pdp_hw_s_reset(u32 __iomem *base_reg, u32 val);
-void pdp_hw_s_config(u32 __iomem *base_reg);
-#ifdef DEBUG_DUMP_STAT0
-void pdp_hw_g_paf_single_window_stat(struct work_struct *data);
-#endif
-void pdp_hw_g_pdp_reg(void __iomem *base_reg, struct pdp_read_reg_setting_t *reg_param);
-void pdp_hw_g_paf_sfr_stats(void __iomem *base_reg, u32 *buf);
-void pdp_hw_s_paf_mode(u32 __iomem *base_reg, bool onoff);
-void pdp_hw_s_paf_active_size(u32 __iomem *base_reg, u32 width, u32 height);
-void pdp_hw_s_paf_af_size(u32 __iomem *base_reg, u32 width, u32 height);
-void pdp_hw_s_paf_crop_size(u32 __iomem *base_reg, struct pdp_point_info *size);
-void pdp_hw_s_paf_main_window(u32 __iomem *base_reg, struct pdp_main_wininfo *winInfo);
-void pdp_hw_s_paf_single_window(u32 __iomem *base_reg, struct pdp_single_wininfo *winInfo);
-void pdp_hw_s_paf_multi_window(u32 __iomem *base_reg, struct pdp_multi_wininfo *winInfo);
-void pdp_hw_s_paf_setting(u32 __iomem *base_reg, struct pdp_paf_setting_t *pafInfo);
-void pdp_hw_s_paf_roi(u32 __iomem *base_reg, struct pdp_paf_roi_setting_t *roiInfo);
-void pdp_hw_s_paf_knee(u32 __iomem *base_reg, struct pdp_knee_setting_t *kneeInfo);
-void pdp_hw_s_paf_filter_cor(u32 __iomem *base_reg, struct pdp_filterCor_setting_t *corInfo);
-void pdp_hw_s_paf_filter_bin(u32 __iomem *base_reg, struct pdp_filterBin_setting_t *binInfo);
-void pdp_hw_s_paf_filter_band(u32 __iomem *base_reg, struct pdp_filterBand_setting_t *iirInfo,
- int filter_no);
-void pdp_hw_s_wdr_setting(u32 __iomem *base_reg, struct pdp_wdr_setting_t *wdrInfo);
-void pdp_hw_s_depth_setting(u32 __iomem *base_reg, struct pdp_depth_setting_t *depthInfo);
-void pdp_hw_s_y_ext_setting(u32 __iomem *base_reg, struct pdp_YextParam_setting_t *yExtInfo);
-void pdp_hw_s_paf_mpd_bin_shift(u32 __iomem *base_reg, u32 h, u32 v, u32 vsht);
-void pdp_hw_s_paf_col(u32 __iomem *base_reg, u32 value);
+void pdp_hw_s_sensor_type(void __iomem *base, u32 sensor_type);
+void pdp_hw_s_core(void __iomem *base, bool enable);
+unsigned int pdp_hw_g_irq_state(void __iomem *base, bool clear);
+unsigned int pdp_hw_g_irq_mask(void __iomem *base);
+int pdp_hw_g_stat0(void __iomem *base, void *buf, size_t len);
+void pdp_hw_s_config_default(void __iomem *base);
+bool pdp_hw_to_sensor_type(u32 pd_mode, u32 *sensor_type);
+bool pdp_hw_is_occured(unsigned int state, enum pdp_event_type type);
+int pdp_hw_dump(void __iomem *base);
#endif
/*
- * Samsung Exynos5 SoC series Sensor driver
+ * Samsung Exynos SoC series PDP drvier
*
- *
- * Copyright (c) 2017 Samsung Electronics Co., Ltd
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
#include "fimc-is-config.h"
#include "fimc-is-pdp.h"
#include "fimc-is-hw-pdp.h"
-#include "fimc-is-interface-library.h"
-
-struct general_intr_handler info_handler;
-
-static int debug_pdp;
+#include "fimc-is-device-sensor-peri.h"
-module_param(debug_pdp, int, 0644);
+static struct fimc_is_pdp pdp_devices[MAX_NUM_OF_PDP];
-static struct fimc_is_pdp pdp_device[MAX_NUM_OF_PDP];
-
-extern struct fimc_is_lib_support gPtr_lib_support;
-
-#ifdef ENABLE_PDP_IRQ
static irqreturn_t fimc_is_isr_pdp(int irq, void *data)
{
+ struct fimc_is_module_enum *module;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_device_sensor *sensor;
struct fimc_is_pdp *pdp;
- int state;
+ unsigned int state;
- pdp = data;
- state = pdp_hw_g_irq_state(pdp->base_reg, true);
- printk("PDP IRQ: %d\n", state);
+ pdp = (struct fimc_is_pdp *)data;
-#ifdef DEBUG_DUMP_STAT0
- if (state == PDP_INT_FRAME_PAF_STAT0)
- schedule_work(&pdp->wq_pdp_stat0);
-#endif
+ state = pdp_hw_g_irq_state(pdp->base, true) & ~pdp_hw_g_irq_mask(pdp->base);
+ dbg_pdp(1, "IRQ: 0x%x\n", state);
- return IRQ_HANDLED;
-}
-#endif
+ if (!pdp_hw_is_occured(state, PE_PAF_STAT0))
+ return IRQ_NONE;
-int pdp_get_irq_state(struct v4l2_subdev *subdev, int *state)
-{
- struct fimc_is_pdp *pdp;
- struct fimc_is_device_sensor_peri *sensor_peri;
- struct fimc_is_module_enum *module;
+ if (debug_pdp >= 2) {
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(pdp->subdev);
+ if (!module) {
+ err("failed to get module");
+ return IRQ_NONE;
+ }
- WARN_ON(!subdev);
+ subdev_module = module->subdev;
+ if (!subdev_module) {
+ err("module's subdev was not probed");
+ return IRQ_NONE;
+ }
- pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
- WARN_ON(!pdp);
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_module);
- module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
- WARN_ON(!module);
+ dbg_pdp(2, "IRQ: 0x%x, sensor fcount: %d\n", state, sensor->fcount);
+ }
- sensor_peri = module->private_data;
- WARN_ON(!sensor_peri);
+ tasklet_schedule(&pdp->tasklet_stat0);
- if (!test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state))
- *state = -EPERM;
- else {
- mutex_lock(&pdp->control_lock);
- *state = pdp_hw_g_irq_state(pdp->base_reg, false);
- mutex_unlock(&pdp->control_lock);
- }
- return 0;
+ return IRQ_HANDLED;
}
-int pdp_clear_irq_state(struct v4l2_subdev *subdev, int state)
+static void pdp_tasklet_stat0(unsigned long data)
{
struct fimc_is_pdp *pdp;
- struct fimc_is_device_sensor_peri *sensor_peri;
struct fimc_is_module_enum *module;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_device_sensor *sensor;
+ struct fimc_is_device_csi *csi;
+ struct fimc_is_subdev *dma_subdev;
+ struct fimc_is_framemgr *framemgr;
+ struct fimc_is_frame *frame;
+ unsigned int frameptr;
+ int ch;
+
+ pdp = (struct fimc_is_pdp *)data;
+ if (!pdp) {
+ err("failed to get PDP");
+ return;
+ }
- WARN_ON(!subdev);
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(pdp->subdev);
+ if (!module) {
+ err("failed to get module");
+ return;
+ }
- pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
- WARN_ON(!pdp);
+ subdev_module = module->subdev;
+ if (!subdev_module) {
+ err("module's subdev was not probed");
+ return;
+ }
- module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
- WARN_ON(!module);
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_module);
+ csi = (struct fimc_is_device_csi *)v4l2_get_subdevdata(sensor->subdev_csi);
- sensor_peri = module->private_data;
- WARN_ON(!sensor_peri);
+ for (ch = CSI_VIRTUAL_CH_1; ch < CSI_VIRTUAL_CH_MAX; ch++) {
+ if (sensor->cfg->output[ch].type == VC_PRIVATE) {
+ dma_subdev = csi->dma_subdev[ch];
+ if (!dma_subdev ||
+ !test_bit(FIMC_IS_SUBDEV_START, &dma_subdev->state))
+ continue;
- mutex_lock(&pdp->control_lock);
- pdp_hw_clr_irq_state(pdp->base_reg, state);
- mutex_unlock(&pdp->control_lock);
+ framemgr = GET_SUBDEV_FRAMEMGR(dma_subdev);
+ if (!framemgr) {
+ err("failed to get framemgr");
+ continue;
+ }
- return 0;
-}
+ framemgr_e_barrier(framemgr, FMGR_IDX_29);
-int pdp_set_sensor_info(struct fimc_is_pdp *pdp, u32 sensor_info)
-{
- int width = 0, height = 0, active_height = 0;
- int af_size_x = 0, af_size_y = 0;
- int hbin = 0, vbin = 0, vsft = 0;
- struct pdp_point_info cropInfo;
- struct pdp_paf_roi_setting_t roiInfo;
-
- switch (sensor_info) {
- case (4032<<16|3024): /* 4032 x 3024 */
- /*1. Image Info */
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- active_height = 756;
- /* 2. AF */
- af_size_x = 504;
- af_size_y = 378;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 503;
- roiInfo.roi_end_y = 377;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 503;
- cropInfo.ey = 377;
- /* 5. HBIN / VBIN /VSFT */
- hbin = 1;
- vbin = 1;
- vsft = 1;
- break;
- case (4032<<16|2268): /* 4032 x 2268 */
- /*1. Image Info */
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- active_height = 566;
- /* 2. AF */
- af_size_x = 504;
- af_size_y = 282;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 503;
- roiInfo.roi_end_y = 281;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 503;
- cropInfo.ey = 281;
- /* 5. HBIN / VBIN /VSFT */
- hbin = 1;
- vbin = 1;
- vsft = 1;
- break;
- case (4032<<16|1960): /* 4032 x 1960 */
- /*1. Image Info */
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- active_height = 490;
- /* 2. AF */
- af_size_x = 504;
- af_size_y = 244;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 503;
- roiInfo.roi_end_y = 243;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 503;
- cropInfo.ey = 243;
- /* 5. HBIN / VBIN /VSFT */
- hbin = 1;
- vbin = 1;
- vsft = 1;
- break;
- case (3024<<16|3024): /* 3024 x 3024 */
- /*1. Image Info */
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- active_height = 756;
- /* 2. AF */
- af_size_x = 376;
- af_size_y = 376;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 375;
- roiInfo.roi_end_y = 375;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 375;
- cropInfo.ey = 375;
- /* 5. HBIN / VBIN /VSFT */
- hbin = 1;
- vbin = 1;
- vsft = 1;
- break;
- case (2016<<16|1512): /* 2016 x 1512 */
- /*1. Image Info */
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- active_height = 378;
- /* 2. AF */
- af_size_x = 504;
- af_size_y = 378;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 503;
- roiInfo.roi_end_y = 377;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 503;
- cropInfo.ey = 377;
- /* 5. HBIN / VBIN /VSFT */
- hbin = 0;
- vbin = 0;
- vsft = 0;
- break;
- case (2016<<16|1134): /* 2016 x 1134 */
- /*1. Image Info */
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- active_height = 282;
- /* 2. AF */
- af_size_x = 504;
- af_size_y = 282;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 503;
- roiInfo.roi_end_y = 281;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 503;
- cropInfo.ey = 281;
- /* 5. HBIN / VBIN /VSFT */
- hbin = 0;
- vbin = 0;
- vsft = 0;
- break;
- case (1504<<16|1504): /* 1504 x 1504 */
- /*1. Image Info */
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- active_height = 376;
- /* 2. AF */
- af_size_x = 376;
- af_size_y = 376;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 375;
- roiInfo.roi_end_y = 375;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 503;
- cropInfo.ey = 503;
- /* 5. HBIN / VBIN /VSFT */
- hbin = 0;
- vbin = 0;
- vsft = 0;
- break;
- default:
- width = (sensor_info & 0xFFFF0000)>>16;
- height = sensor_info & 0xFFFF;
- err("Invalid Sensor Size.(%dx%d) set default size(4:3)", width, height);
- /*1. Image Info */
- width = 4032;
- height = 3024;
- active_height = 756;
- /* 2. AF */
- af_size_x = 504;
- af_size_y = 378;
- /* 3. ROI Info */
- roiInfo.roi_start_x = 0;
- roiInfo.roi_start_y = 0;
- roiInfo.roi_end_x = 503;
- roiInfo.roi_end_y = 377;
- /* 4. Crop Info*/
- cropInfo.sx = 0;
- cropInfo.sy = 0;
- cropInfo.ex = 503;
- cropInfo.ey = 377;
- /* 5. HBIN / VBIN /VSFT*/
- hbin = 1;
- vbin = 1;
- vsft = 1;
- break;
- }
+ frameptr = atomic_read(&pdp->frameptr_stat0) % framemgr->num_frames;
+ frame = &framemgr->frames[frameptr];
+ frame->fcount = sensor->fcount;
- pdp_hw_s_paf_col(pdp->base_reg, width);
- pdp_hw_s_paf_active_size(pdp->base_reg, width, active_height);
- pdp_hw_s_paf_af_size(pdp->base_reg, af_size_x, af_size_y);
- pdp_hw_s_paf_roi(pdp->base_reg, &roiInfo);
- pdp_hw_s_paf_crop_size(pdp->base_reg, &cropInfo);
- pdp_hw_s_paf_mpd_bin_shift(pdp->base_reg, hbin, vbin, vsft);
+ pdp_hw_g_stat0(pdp->base, (void *)frame->kvaddr_buffer[0],
+ dma_subdev->output.width * dma_subdev->output.height);
- info("[PDP]I_COL(%d), ActiveSize(%dx%d), AfSize(%dx%d)\n",
- width, width, active_height, af_size_x, af_size_y);
- info("[PDP]roi(%dx%d~%dx%d), crop(%dx%d~%dx%d)\n",
- roiInfo.roi_start_x, roiInfo.roi_start_y, roiInfo.roi_end_x, roiInfo.roi_end_y,
- cropInfo.sx, cropInfo.sy, cropInfo.ex, cropInfo.ey);
+ atomic_inc(&pdp->frameptr_stat0);
- return 0;
+ framemgr_x_barrier(framemgr, FMGR_IDX_29);
+ }
+ }
+
+ if (pdp->wq_stat0)
+ queue_work(pdp->wq_stat0, &pdp->work_stat0);
+ else
+ schedule_work(&pdp->work_stat0);
+
+ dbg_pdp(3, "%s, sensor fcount: %d\n", __func__, sensor->fcount);
}
-int pdp_read_paf_sfr_stat(struct v4l2_subdev *subdev, u32 *buf)
+static void pdp_worker_stat0(struct work_struct *work)
{
struct fimc_is_pdp *pdp;
+ struct fimc_is_module_enum *module;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_device_sensor *sensor;
+ struct paf_action *pa, *temp;
+ unsigned long flag;
- WARN_ON(!subdev);
- WARN_ON(!buf);
+ pdp = container_of(work, struct fimc_is_pdp, work_stat0);
+ module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(pdp->subdev);
+ if (!module) {
+ err("failed to get module");
+ return;
+ }
- pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
- WARN_ON(!pdp);
+ subdev_module = module->subdev;
+ if (!subdev_module) {
+ err("module's subdev was not probed");
+ return;
+ }
- pdp_hw_g_paf_sfr_stats(pdp->base_reg, buf);
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_module);
+
+ spin_lock_irqsave(&pdp->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp, &pdp->list_of_paf_action, list) {
+ switch (pa->type) {
+ case VC_STAT_TYPE_PDP_1_0_PDAF_STAT0:
+ case VC_STAT_TYPE_PDP_1_1_PDAF_STAT0:
+#ifdef ENABLE_FPSIMD_FOR_USER
+ fpsimd_get();
+ pa->notifier(pa->type, *(unsigned int *)&sensor->fcount, pa->data);
+ fpsimd_put();
+#else
+ pa->notifier(pa->type, *(unsigned int *)&sensor->fcount, pa->data);
+#endif
+ break;
+ default:
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&pdp->slock_paf_action, flag);
- return 0;
+ dbg_pdp(3, "%s, sensor fcount: %d\n", __func__, sensor->fcount);
}
-int pdp_set_parameters(struct v4l2_subdev *subdev, struct pdp_total_setting_t *pdp_param)
+int pdp_set_param(struct v4l2_subdev *subdev, struct paf_setting_t *regs, u32 regs_size)
{
- int i = 0;
+ int i;
struct fimc_is_pdp *pdp;
- WARN_ON(!subdev);
- WARN_ON(!pdp_param);
-
pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
- WARN_ON(!pdp);
-
- dbg_pdp(1, "[%s] IN\n", __func__);
-
- /* PAF SETTING */
- WARN_ON(!pdp_param->paf_setting);
- if (pdp_param->paf_setting->update) {
- dbg_pdp(2, "[%s] update_paf_setting\n", __func__);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_setting(pdp->base_reg, pdp_param->paf_setting);
- mutex_unlock(&pdp->control_lock);
-
- pdp_param->paf_setting->update = false;
+ if (!pdp) {
+ err("failed to get PDP");
+ return -ENODEV;
}
- /* PAF ROI */
- WARN_ON(!pdp_param->paf_roi_setting);
- if (pdp_param->paf_roi_setting->update) {
- dbg_pdp(2, "[%s] update_paf_roi_setting\n", __func__);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_roi(pdp->base_reg, pdp_param->paf_roi_setting);
- mutex_unlock(&pdp->control_lock);
-
- pdp_param->paf_roi_setting->update = false;
+ dbg_pdp(1, "PDP(%p) SFR setting\n", pdp->base);
+ for (i = 0; i < regs_size; i++) {
+ dbg_pdp(1, "[%d] ofs: 0x%x, val: 0x%x\n",
+ i, regs[i].reg_addr, regs[i].reg_data);
+ writel(regs[i].reg_data, pdp->base + regs[i].reg_addr);
}
- /* SINGLE_WINDOW */
- WARN_ON(!pdp_param->paf_single_window);
- if (pdp_param->paf_single_window->update) {
- dbg_pdp(2, "[%s] update_single_win\n", __func__);
+ return 0;
+}
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_single_window(pdp->base_reg, pdp_param->paf_single_window);
- mutex_unlock(&pdp->control_lock);
+int pdp_get_ready(struct v4l2_subdev *subdev, u32 *ready)
+{
+ *ready = 1;
- pdp_param->paf_single_window->update = false;
- }
+ return 0;
+}
- /* MAIN WINDOW */
- WARN_ON(!pdp_param->paf_main_window);
- if (pdp_param->paf_main_window->update) {
- dbg_pdp(2, "[%s] update_main_win\n", __func__);
+int pdp_register_notifier(struct v4l2_subdev *subdev, enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier, void *data)
+{
+ struct fimc_is_pdp *pdp;
+ struct paf_action *pa;
+ unsigned long flag;
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_main_window(pdp->base_reg, pdp_param->paf_main_window);
- mutex_unlock(&pdp->control_lock);
- pdp_param->paf_main_window->update = false;
+ pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
+ if (!pdp) {
+ err("failed to get PDP");
+ return -ENODEV;
}
- /* MULTI WINDOW */
- WARN_ON(!pdp_param->paf_multi_window);
- if (pdp_param->paf_multi_window->update) {
- dbg_pdp(2, "[%s] update_multi_win\n", __func__);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_multi_window(pdp->base_reg, pdp_param->paf_multi_window);
- mutex_unlock(&pdp->control_lock);
-
- pdp_param->paf_multi_window->update = false;
- }
+ switch (type) {
+ case VC_STAT_TYPE_PDP_1_0_PDAF_STAT0:
+ case VC_STAT_TYPE_PDP_1_1_PDAF_STAT0:
+ case VC_STAT_TYPE_PDP_1_0_PDAF_STAT1:
+ case VC_STAT_TYPE_PDP_1_1_PDAF_STAT1:
+ pa = kzalloc(sizeof(struct paf_action), GFP_ATOMIC);
+ if (!pa) {
+ err_lib("failed to allocate a PAF action");
+ return -ENOMEM;
+ }
- /* KNEE */
- WARN_ON(!pdp_param->paf_knee_setting);
- if (pdp_param->paf_knee_setting->update) {
- dbg_pdp(2, "[%s] update_knee\n", __func__);
+ pa->type = type;
+ pa->notifier = notifier;
+ pa->data = data;
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_knee(pdp->base_reg, pdp_param->paf_knee_setting);
- mutex_unlock(&pdp->control_lock);
+ spin_lock_irqsave(&pdp->slock_paf_action, flag);
+ list_add(&pa->list, &pdp->list_of_paf_action);
+ spin_unlock_irqrestore(&pdp->slock_paf_action, flag);
- pdp_param->paf_knee_setting->update = false;
+ break;
+ default:
+ return -EINVAL;
}
- /* FILTER COR */
- WARN_ON(!pdp_param->paf_filter_cor);
- if (pdp_param->paf_filter_cor->update) {
- dbg_pdp(2, "[%s] update_filter_cor\n", __func__);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_filter_cor(pdp->base_reg, pdp_param->paf_filter_cor);
- mutex_unlock(&pdp->control_lock);
+ dbg_pdp(2, "%s, type: %d, notifier: %p\n", __func__, type, notifier);
- pdp_param->paf_filter_cor->update = false;
- }
-
- /* FILTER BIN */
- WARN_ON(!pdp_param->paf_filter_bin);
- if (pdp_param->paf_filter_bin->update) {
- dbg_pdp(2, "[%s] update_filter_bin\n", __func__);
+ return 0;
+}
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_filter_bin(pdp->base_reg, pdp_param->paf_filter_bin);
- mutex_unlock(&pdp->control_lock);
+int pdp_unregister_notifier(struct v4l2_subdev *subdev, enum itf_vc_stat_type type,
+ vc_dma_notifier_t notifier)
+{
+ struct fimc_is_pdp *pdp;
+ struct paf_action *pa, *temp;
+ unsigned long flag;
- pdp_param->paf_filter_bin->update = false;
+ pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
+ if (!pdp) {
+ err("failed to get PDP");
+ return -ENODEV;
}
- /* FILTER IIR0, 1, 2, L */
- for (i = 0; i < MAX_FILTER_BAND; i++) {
- WARN_ON(!pdp_param->paf_filter_band[i]);
- if (pdp_param->paf_filter_band[i]->update) {
- dbg_pdp(2, "[%s] paf_filter_band[%d]\n", __func__, i);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_paf_filter_band(pdp->base_reg, pdp_param->paf_filter_band[i], i);
- mutex_unlock(&pdp->control_lock);
-
- pdp_param->paf_filter_band[i]->update = false;
+ switch (type) {
+ case VC_STAT_TYPE_PDP_1_0_PDAF_STAT0:
+ case VC_STAT_TYPE_PDP_1_1_PDAF_STAT0:
+ case VC_STAT_TYPE_PDP_1_0_PDAF_STAT1:
+ case VC_STAT_TYPE_PDP_1_1_PDAF_STAT1:
+ spin_lock_irqsave(&pdp->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp,
+ &pdp->list_of_paf_action, list) {
+ if ((pa->notifier == notifier)
+ && (pa->type == type)) {
+ list_del(&pa->list);
+ kfree(pa);
+ }
}
- }
-
- /* WDR SETTING */
- WARN_ON(!pdp_param->wdr_setting);
- if (pdp_param->wdr_setting->update) {
- dbg_pdp(2, "[%s] update_wdr_setting\n", __func__);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_wdr_setting(pdp->base_reg, pdp_param->wdr_setting);
- mutex_unlock(&pdp->control_lock);
-
- pdp_param->wdr_setting->update = false;
- }
-
- /* DEPTH SETTING */
- WARN_ON(!pdp_param->depth_setting);
- if (pdp_param->depth_setting->update) {
- dbg_pdp(2, "[%s] update_depth_setting\n", __func__);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_depth_setting(pdp->base_reg, pdp_param->depth_setting);
- mutex_unlock(&pdp->control_lock);
+ spin_unlock_irqrestore(&pdp->slock_paf_action, flag);
- pdp_param->depth_setting->update = false;
+ break;
+ default:
+ return -EINVAL;
}
- /* Y EXT */
- WARN_ON(!pdp_param->y_ext_param);
- if (pdp_param->y_ext_param->update) {
- dbg_pdp(2, "[%s] update_depth_setting\n", __func__);
-
- mutex_lock(&pdp->control_lock);
- pdp_hw_s_y_ext_setting(pdp->base_reg, pdp_param->y_ext_param);
- mutex_unlock(&pdp->control_lock);
-
- pdp_param->y_ext_param->update = false;
- }
+ dbg_pdp(2, "%s, type: %d, notifier: %p\n", __func__, type, notifier);
return 0;
}
-int pdp_read_pdp_reg(struct v4l2_subdev *subdev, struct pdp_read_reg_setting_t *reg_param)
+void pdp_notify(struct v4l2_subdev *subdev, unsigned int type, void *data)
{
struct fimc_is_pdp *pdp;
-
- WARN_ON(!subdev);
- WARN_ON(!reg_param);
+ struct paf_action *pa, *temp;
+ unsigned long flag;
pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
- WARN_ON(!pdp);
+ if (!pdp) {
+ err("failed to get PDP");
+ return;
+ }
+
+ switch (type) {
+ case CSIS_NOTIFY_DMA_END_VC_MIPISTAT:
+ spin_lock_irqsave(&pdp->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp, &pdp->list_of_paf_action, list) {
+ switch (pa->type) {
+ case VC_STAT_TYPE_PDP_1_0_PDAF_STAT1:
+ case VC_STAT_TYPE_PDP_1_1_PDAF_STAT1:
+#ifdef ENABLE_FPSIMD_FOR_USER
+ fpsimd_get();
+ pa->notifier(pa->type, *(unsigned int *)data, pa->data);
+ fpsimd_put();
+#else
+ pa->notifier(pa->type, *(unsigned int *)data, pa->data);
+#endif
+ break;
+ default:
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&pdp->slock_paf_action, flag);
- mutex_lock(&pdp->control_lock);
- pdp_hw_g_pdp_reg(pdp->base_reg, reg_param);
- mutex_unlock(&pdp->control_lock);
+ default:
+ break;
+ }
- return 0;
+ dbg_pdp(2, "%s, sensor fcount: %d\n", __func__, *(unsigned int *)data);
}
int pdp_register(struct fimc_is_module_enum *module, int pdp_ch)
{
- int ret = 0;
- struct fimc_is_pdp *pdp = NULL;
- struct fimc_is_device_sensor *sensor_dev = NULL;
struct fimc_is_device_sensor_peri *sensor_peri = module->private_data;
+ struct v4l2_subdev *subdev_module;
+ struct fimc_is_device_sensor *sensor;
+ struct fimc_is_pdp *pdp;
+
+ if (!sensor_peri) {
+ err("could not refer to sensor's peri");
+ return -ENODEV;
+ }
if (test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state)) {
err("already registered");
- ret = -EINVAL;
- goto p_err;
+ return -EINVAL;
}
- WARN_ON(!sensor_peri);
- sensor_dev = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(sensor_peri->subdev_cis);
-
if (pdp_ch >= MAX_NUM_OF_PDP) {
- err("A pdp channel is invalide");
- ret = -EINVAL;
- goto p_err;
+ err("requested channel: %d is invalid", pdp_ch);
+ return -EINVAL;
}
- pdp = &pdp_device[pdp_ch];
+ subdev_module = module->subdev;
+ if (!subdev_module) {
+ err("module's subdev was not probed");
+ return -ENODEV;
+ }
+
+ sensor = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(subdev_module);
+ if (sensor->cfg->pd_mode != PD_MOD3)
+ return 0;
+
+ pdp = &pdp_devices[pdp_ch];
+
sensor_peri->pdp = pdp;
sensor_peri->subdev_pdp = pdp->subdev;
v4l2_set_subdev_hostdata(pdp->subdev, module);
- if (sensor_dev->cfg->pd_mode != PD_MOD3) {
- pdp_hw_enable(pdp->base_reg, PD_NONE);
- ret = -ENOTSUPP;
- } else {
- set_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state);
- pdp_hw_s_config(pdp->base_reg);
- }
+ spin_lock_init(&pdp->slock_paf_action);
+ INIT_LIST_HEAD(&pdp->list_of_paf_action);
- info("[PDP:%d] %s(ret:%d)\n", pdp->id, __func__, ret);
- return ret;
-p_err:
- return ret;
+ set_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state);
+
+ info("[PDP:%d] is registered\n", pdp->id);
+
+ return 0;
}
int pdp_unregister(struct fimc_is_module_enum *module)
{
- int ret = 0;
struct fimc_is_device_sensor_peri *sensor_peri = module->private_data;
- struct fimc_is_pdp *pdp = NULL;
- struct fimc_is_device_sensor *sensor_dev = NULL;
-
- WARN_ON(!sensor_peri);
- sensor_dev = (struct fimc_is_device_sensor *)v4l2_get_subdev_hostdata(sensor_peri->subdev_cis);
+ struct fimc_is_pdp *pdp;
+ struct paf_action *pa, *temp;
+ unsigned long flag;
- if (sensor_dev->cfg->pd_mode != PD_MOD3) {
- ret = -ENOTSUPP;
- goto p_err;
+ if (!sensor_peri) {
+ err("could not refer to sensor's peri");
+ return -ENODEV;
}
if (!test_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state)) {
err("already unregistered");
- ret = -EINVAL;
- goto p_err;
+ return -EINVAL;
}
pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(sensor_peri->subdev_pdp);
if (!pdp) {
- err("A subdev data of PDP is null");
- ret = -ENODEV;
- goto p_err;
+ err("failed to get PDP");
+ return -ENODEV;
+ }
+
+ if (!list_empty(&pdp->list_of_paf_action)) {
+ err("flush remaining notifiers...");
+ spin_lock_irqsave(&pdp->slock_paf_action, flag);
+ list_for_each_entry_safe(pa, temp,
+ &pdp->list_of_paf_action, list) {
+ list_del(&pa->list);
+ kfree(pa);
+ }
+ spin_unlock_irqrestore(&pdp->slock_paf_action, flag);
}
sensor_peri->pdp = NULL;
sensor_peri->subdev_pdp = NULL;
+ v4l2_set_subdev_hostdata(pdp->subdev, NULL);
+
clear_bit(FIMC_IS_SENSOR_PDP_AVAILABLE, &sensor_peri->peri_state);
- info("[PDP:%d] %s(ret:%d)\n", pdp->id, __func__, ret);
- return ret;
-p_err:
- return ret;
+ info("[PDP:%d] is unregistered\n", pdp->id);
+
+ return 0;
}
int pdp_init(struct v4l2_subdev *subdev, u32 val)
static int pdp_s_stream(struct v4l2_subdev *subdev, int pd_mode)
{
- int ret = 0;
- int irq_state = 0;
- int enable = 0;
+ bool enable;
+ unsigned int sensor_type;
struct fimc_is_pdp *pdp;
- struct fimc_is_device_sensor_peri *sensor_peri;
- struct fimc_is_module_enum *module;
- cis_shared_data *cis_data = NULL;
-
- module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
- WARN_ON(!module);
-
- sensor_peri = module->private_data;
- WARN_ON(!sensor_peri);
-
- cis_data = sensor_peri->cis.cis_data;
- WARN_ON(!cis_data);
pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
if (!pdp) {
- err("A subdev data of PDP is null");
- ret = -ENODEV;
- goto p_err;
+ err("failed to get PDP");
+ return -ENODEV;
}
-#ifdef DEBUG_DUMP_STAT0
- INIT_WORK(&pdp->wq_pdp_stat0, pdp_hw_g_pad_single_window_stat);
-#endif
+ enable = pdp_hw_to_sensor_type(pd_mode, &sensor_type);
+ if (enable) {
+ tasklet_init(&pdp->tasklet_stat0, pdp_tasklet_stat0, (unsigned long)pdp);
+ atomic_set(&pdp->frameptr_stat0, 0);
+ INIT_WORK(&pdp->work_stat0, pdp_worker_stat0);
- enable = pdp_hw_enable(pdp->base_reg, pd_mode);
+ if (debug_pdp >= 5) {
+ info("[PDP:%d] is configured as default values\n", pdp->id);
+ pdp_hw_s_config_default(pdp->base);
+ }
+
+ pdp_hw_s_sensor_type(pdp->base, sensor_type);
+ pdp_hw_s_core(pdp->base, true);
- irq_state = pdp_hw_g_irq_state(pdp->base_reg, true);
+ if (debug_pdp >= 2)
+ pdp_hw_dump(pdp->base);
+ } else {
+ pdp_hw_s_core(pdp->base, false);
- if (debug_pdp == 3)
- pdp_hw_dump(pdp->base_reg);
+ tasklet_kill(&pdp->tasklet_stat0);
+ if (flush_work(&pdp->work_stat0))
+ info("flush pdp wq for stat0\n");
+ }
- info("[PDP:%d] PD_MOD%d, HW_ENABLE(%d), IRQ(%d)\n",
- pdp->id, pd_mode, enable, irq_state);
+ info("[PDP:%d] %s as PD mode: %d, IRQ: 0x%x\n",
+ pdp->id, enable ? "enabled" : "disabled", pd_mode,
+ pdp_hw_g_irq_state(pdp->base, false) & ~pdp_hw_g_irq_mask(pdp->base));
- return ret;
-p_err:
- return ret;
+ return 0;
}
static int pdp_s_param(struct v4l2_subdev *subdev, struct v4l2_streamparm *param)
struct v4l2_subdev_format *fmt)
{
int ret = 0;
- u32 sensor_info = 0;
size_t width, height;
struct fimc_is_pdp *pdp;
- struct fimc_is_module_enum *module;
pdp = (struct fimc_is_pdp *)v4l2_get_subdevdata(subdev);
if (!pdp) {
err("A subdev data of PDP is null");
- ret = -ENODEV;
- goto p_err;
+ return -ENODEV;
}
width = fmt->format.width;
pdp->width = width;
pdp->height = height;
- module = (struct fimc_is_module_enum *)v4l2_get_subdev_hostdata(subdev);
- if (!module) {
- err("[PDP:%d] A host data of PDP is null", pdp->id);
- ret = -ENODEV;
- goto p_err;
- }
-
- sensor_info = (u32)((width<<16) | height);
- pdp_set_sensor_info(pdp, sensor_info);
-
- return ret;
-p_err:
return ret;
}
};
struct fimc_is_pdp_ops pdp_ops = {
- .read_pdp_reg = pdp_read_pdp_reg,
- .read_paf_sfr_stat = pdp_read_paf_sfr_stat,
- .get_irq_state = pdp_get_irq_state,
- .clear_irq_state = pdp_clear_irq_state,
- .set_pdp_param = pdp_set_parameters,
+ .set_param = pdp_set_param,
+ .get_ready = pdp_get_ready,
+ .register_notifier = pdp_register_notifier,
+ .unregister_notifier = pdp_unregister_notifier,
+ .notify = pdp_notify,
};
static int __init pdp_probe(struct platform_device *pdev)
{
- int ret = 0;
- int id = -1;
- struct fimc_is_core *core;
- struct resource *mem_res;
+ int ret;
+ int id;
+ struct resource *res;
struct fimc_is_pdp *pdp;
- struct device_node *dnode;
- struct device *dev;
-
- WARN_ON(!fimc_is_dev);
- WARN_ON(!pdev);
- WARN_ON(!pdev->dev.of_node);
+ struct device *dev = &pdev->dev;
- core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
- if (!core) {
- probe_err("core device is not yet probed");
- return -EPROBE_DEFER;
+ id = of_alias_get_id(dev->of_node, "pdp");
+ if (id < 0 || id >= MAX_NUM_OF_PDP) {
+ dev_err(dev, "invalid id (out-of-range)\n");
+ return -EINVAL;
}
- dev = &pdev->dev;
- dnode = dev->of_node;
+ pdp = &pdp_devices[id];
+ pdp->id = id;
- ret = of_property_read_u32(dnode, "id", &pdev->id);
- if (ret) {
- dev_err(dev, "id read is fail(%d)\n", ret);
- goto err_get_id;
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(dev, "can't get memory resource\n");
+ return -ENODEV;
}
- id = pdev->id;
- pdp = &pdp_device[id];
-
- /* Get SFR base register */
- mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!mem_res) {
- dev_err(dev, "Failed to get io memory region(%p)\n", mem_res);
- ret = -EBUSY;
- goto err_get_resource;
+ if (!devm_request_mem_region(dev, res->start, resource_size(res),
+ dev_name(dev))) {
+ dev_err(dev, "can't request region for resource %pR\n", res);
+ return -EBUSY;
}
- pdp->regs_start = mem_res->start;
- pdp->regs_end = mem_res->end;
- pdp->base_reg = devm_ioremap_nocache(&pdev->dev, mem_res->start, resource_size(mem_res));
- if (!pdp->base_reg) {
- dev_err(dev, "Failed to remap io region(%p)\n", pdp->base_reg);
+ pdp->regs_start = res->start;
+ pdp->regs_end = res->end;
+
+ pdp->base = devm_ioremap_nocache(dev, res->start, resource_size(res));
+ if (!pdp->base) {
+ dev_err(dev, "ioremap failed\n");
ret = -ENOMEM;
goto err_ioremap;
}
- /* Get CORE IRQ SPI number */
pdp->irq = platform_get_irq(pdev, 0);
if (pdp->irq < 0) {
- dev_err(dev, "Failed to get pdp_irq(%d)\n", pdp->irq);
- ret = -EBUSY;
+ dev_err(dev, "failed to get IRQ resource: %d\n", pdp->irq);
+ ret = pdp->irq;
goto err_get_irq;
}
-#ifdef ENABLE_PDP_IRQ
- ret = request_irq(pdp->irq,
- fimc_is_isr_pdp,
+ ret = devm_request_irq(dev, pdp->irq, fimc_is_isr_pdp,
IRQF_SHARED | FIMC_IS_HW_IRQ_FLAG,
- "pdp",
- pdp);
+ dev_name(dev), pdp);
if (ret) {
- dev_err(dev, "request_irq(IRQ_PDP %d) is fail(%d)\n", pdp->irq, ret);
- goto err_get_irq;
+ dev_err(dev, "failed to request IRQ(%d): %d\n", pdp->irq, ret);
+ goto err_req_irq;
}
-#endif
-
- pdp->id = id;
- platform_set_drvdata(pdev, pdp);
pdp->subdev = devm_kzalloc(&pdev->dev, sizeof(struct v4l2_subdev), GFP_KERNEL);
if (!pdp->subdev) {
+ dev_err(dev, "failed to alloc memory for pdp-subdev\n");
ret = -ENOMEM;
- goto err_subdev_alloc;
+ goto err_alloc_subdev;
}
v4l2_subdev_init(pdp->subdev, &subdev_ops);
-
v4l2_set_subdevdata(pdp->subdev, pdp);
snprintf(pdp->subdev->name, V4L2_SUBDEV_NAME_SIZE, "pdp-subdev.%d", pdp->id);
- if (id == 1)
- gPtr_lib_support.intr_handler[ID_GENERAL_INTR_PDP1_STAT].irq = pdp->irq;
- else
- gPtr_lib_support.intr_handler[ID_GENERAL_INTR_PDP0_STAT].irq = pdp->irq;
-
pdp->pdp_ops = &pdp_ops;
+
mutex_init(&pdp->control_lock);
-#ifdef DEBUG_DUMP_STAT0
- pdp->workqueue = alloc_workqueue("fimc-pdp/[H/U]", WQ_HIGHPRI | WQ_UNBOUND, 0);
- if (!pdp->workqueue)
+ pdp->wq_stat0 = alloc_workqueue("pdp-stat0/[H/U]", WQ_HIGHPRI | WQ_UNBOUND, 0);
+ if (!pdp->wq_stat0)
probe_warn("failed to alloc PDP own workqueue, will be use global one");
-#endif
- probe_info("%s(%s)\n", __func__, dev_name(&pdev->dev));
- return ret;
+ platform_set_drvdata(pdev, pdp);
+ probe_info("%s device probe success\n", dev_name(dev));
+
+ return 0;
-err_subdev_alloc:
+err_alloc_subdev:
+ devm_free_irq(dev, pdp->irq, pdp);
+err_req_irq:
err_get_irq:
+ devm_iounmap(dev, pdp->base);
err_ioremap:
-err_get_resource:
-err_get_id:
+ devm_release_mem_region(dev, res->start, resource_size(res));
+
return ret;
}
-static const struct of_device_id exynos_fimc_is_pdp_match[] = {
+static const struct of_device_id sensor_paf_pdp_match[] = {
{
- .compatible = "samsung,exynos5-fimc-is-pdp",
+ .compatible = "samsung,sensor-paf-pdp",
},
{},
};
-MODULE_DEVICE_TABLE(of, exynos_fimc_is_pdp_match);
+MODULE_DEVICE_TABLE(of, sensor_paf_pdp_match);
-static struct platform_driver pdp_driver = {
+static struct platform_driver sensor_paf_pdp_platform_driver = {
.driver = {
- .name = "FIMC-IS-PDP",
+ .name = "Sensor-PAF-PDP",
.owner = THIS_MODULE,
- .of_match_table = exynos_fimc_is_pdp_match,
+ .of_match_table = sensor_paf_pdp_match,
}
};
-builtin_platform_driver_probe(pdp_driver, pdp_probe);
+
+static int __init sensor_paf_pdp_init(void)
+{
+ int ret;
+
+ ret = platform_driver_probe(&sensor_paf_pdp_platform_driver, pdp_probe);
+ if (ret)
+ err("failed to probe %s driver: %d\n",
+ sensor_paf_pdp_platform_driver.driver.name, ret);
+
+ return ret;
+}
+late_initcall_sync(sensor_paf_pdp_init);
#include "fimc-is-device-sensor.h"
#include "fimc-is-interface-sensor.h"
+extern int debug_pdp;
+
#define dbg_pdp(level, fmt, args...) \
- dbg_common(((debug_pdp) >= (level)) && (debug_pdp < 3), "[PDP]", fmt, ##args)
+ dbg_common(((debug_pdp) >= (level)), "[PDP]", fmt, ##args)
#define MAX_NUM_OF_PDP 2
#include <linux/sched/rt.h>
struct fimc_is_vender_specific {
+ struct i2c_client *eeprom_client[ROM_ID_MAX];
+
u32 rear_sensor_id;
u32 front_sensor_id;
- u32 rear_second_sensor_id;
+ u32 rear2_sensor_id;
+ u32 front2_sensor_id;
+ u32 rear3_sensor_id;
#ifdef CONFIG_SECURE_CAMERA_USE
u32 secure_sensor_id;
#endif
- u32 front_second_sensor_id;
- u32 rear_third_sensor_id;
u32 ois_sensor_index;
u32 aperture_sensor_index;
+ u32 mcu_sensor_index;
bool zoom_running;
};
#include "fimc-is-vender-specific.h"
#include "fimc-is-core.h"
#include "fimc-is-interface-library.h"
+#ifndef ENABLE_IS_CORE
+#include "fimc-is-device-sensor-peri.h"
+#endif
static u32 rear_sensor_id;
static u32 front_sensor_id;
-static u32 rear_second_sensor_id;
+static u32 rear2_sensor_id;
#ifdef CONFIG_SECURE_CAMERA_USE
static u32 secure_sensor_id;
#endif
-static u32 front_second_sensor_id;
-static u32 rear_third_sensor_id;
+static u32 front2_sensor_id;
+static u32 rear3_sensor_id;
static u32 ois_sensor_index;
static u32 aperture_sensor_index;
priv->rear_sensor_id = rear_sensor_id;
priv->front_sensor_id = front_sensor_id;
- priv->rear_second_sensor_id = rear_second_sensor_id;
+ priv->rear2_sensor_id = rear2_sensor_id;
#ifdef CONFIG_SECURE_CAMERA_USE
priv->secure_sensor_id = secure_sensor_id;
#endif
- priv->front_second_sensor_id = front_second_sensor_id;
- priv->rear_third_sensor_id = rear_third_sensor_id;
+ priv->front2_sensor_id = front2_sensor_id;
+ priv->rear3_sensor_id = rear3_sensor_id;
priv->ois_sensor_index = ois_sensor_index;
priv->aperture_sensor_index = aperture_sensor_index;
if (ret)
probe_err("front_sensor_id read is fail(%d)", ret);
- ret = of_property_read_u32(np, "rear_second_sensor_id", &rear_second_sensor_id);
+ ret = of_property_read_u32(np, "rear2_sensor_id", &rear2_sensor_id);
if (ret)
- probe_err("rear_second_sensor_id read is fail(%d)", ret);
+ probe_err("rear2_sensor_id read is fail(%d)", ret);
#ifdef CONFIG_SECURE_CAMERA_USE
ret = of_property_read_u32(np, "secure_sensor_id", &secure_sensor_id);
if (ret)
probe_err("secure_sensor_id read is fail(%d)", ret);
#endif
- ret = of_property_read_u32(np, "front_second_sensor_id", &front_second_sensor_id);
+ ret = of_property_read_u32(np, "front2_sensor_id", &front2_sensor_id);
if (ret)
- probe_err("front_second_sensor_id read is fail(%d)", ret);
+ probe_err("front2_sensor_id read is fail(%d)", ret);
- ret = of_property_read_u32(np, "rear_third_sensor_id", &rear_third_sensor_id);
+ ret = of_property_read_u32(np, "rear3_sensor_id", &rear3_sensor_id);
if (ret)
- probe_err("rear_third_sensor_id read is fail(%d)", ret);
+ probe_err("rear3_sensor_id read is fail(%d)", ret);
ret = of_property_read_u32(np, "ois_sensor_index", &ois_sensor_index);
if (ret)
}
#if !defined(ENABLE_CAL_LOAD)
-int fimc_is_vender_cal_load(struct fimc_is_vender *vender,
+int fimc_is_vender_cal_load(struct fimc_is_device_sensor *sensor, struct fimc_is_vender *vender,
void *module_data)
{
int ret = 0;
return ret;
}
#else
-int fimc_is_vender_cal_load(struct fimc_is_vender *vender,
+static int fimc_is_led_cal_file_read(const char *file_name, const void *data, unsigned long size)
+{
+ int ret = 0;
+ long fsize, nread;
+ mm_segment_t old_fs;
+ struct file *fp;
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ fp = filp_open(file_name, O_RDONLY, 0);
+ if (IS_ERR_OR_NULL(fp)) {
+ ret = PTR_ERR(fp);
+ err("file_open(%s) fail(%d)!!\n", file_name, ret);
+ goto p_err;
+ }
+
+ fsize = fp->f_path.dentry->d_inode->i_size;
+
+ nread = vfs_read(fp, (char __user *)data, size, &fp->f_pos);
+
+ info("%s(): read to file(%s) size(%ld)\n", __func__, file_name, nread);
+p_err:
+ if (!IS_ERR_OR_NULL(fp))
+ filp_close(fp, NULL);
+
+ set_fs(old_fs);
+
+ return ret;
+}
+
+int fimc_is_vender_cal_load(struct fimc_is_device_sensor *sensor, struct fimc_is_vender *vender,
void *module_data)
{
struct fimc_is_core *core;
struct fimc_is_module_enum *module = module_data;
- struct fimc_is_binary cal_bin;
ulong cal_addr = 0;
int ret = 0;
core = container_of(vender, struct fimc_is_core, vender);
- setup_binary_loader(&cal_bin, 0, 0, NULL, NULL);
- if (module->position == SENSOR_POSITION_REAR) {
- /* Load calibration data from file system */
- ret = request_binary(&cal_bin, FIMC_IS_REAR_CAL_SDCARD_PATH,
- FIMC_IS_REAR_CAL, NULL);
- if (ret) {
- err("[Vendor]: request_binary filed: %s%s",
- FIMC_IS_REAR_CAL_SDCARD_PATH, FIMC_IS_REAR_CAL);
- goto exit;
- }
-#ifdef ENABLE_IS_CORE
- cal_addr = core->resourcemgr.minfo.kvaddr + CAL_OFFSET0;
-#else
- cal_addr = core->resourcemgr.minfo.kvaddr_rear_cal;
-#endif
- } else if (module->position == SENSOR_POSITION_FRONT) {
- /* Load calibration data from file system */
- ret = request_binary(&cal_bin, FIMC_IS_REAR_CAL_SDCARD_PATH,
- FIMC_IS_FRONT_CAL, NULL);
- if (ret) {
- err("[Vendor]: request_binary filed: %s%s",
- FIMC_IS_REAR_CAL_SDCARD_PATH, FIMC_IS_FRONT_CAL);
- goto exit;
- }
-#ifdef ENABLE_IS_CORE
- cal_addr = core->resourcemgr.minfo.kvaddr + CAL_OFFSET1;
-#else
- cal_addr = core->resourcemgr.minfo.kvaddr_front_cal;
-#endif
+ if (sensor->use_otp_cal || sensor->subdev_eeprom) {
+ cal_addr = core->resourcemgr.minfo.kvaddr_cal[module->position];
} else {
err("[Vendor]: Invalid sensor position: %d", module->position);
module->ext.sensor_con.cal_address = 0;
goto exit;
}
- memcpy((void *)(cal_addr), (void *)cal_bin.data, cal_bin.size);
+ /* When use EEPROM memcpy eeprom data */
+ if (sensor->subdev_eeprom)
+ memcpy((void *)(cal_addr), (void *)sensor->eeprom->data, sensor->eeprom->total_size);
+ else
+ memcpy((void *)(cal_addr), (void *)sensor->otp_cal_buf, sizeof(sensor->otp_cal_buf));
+
+ ret = fimc_is_led_cal_file_read(FIMC_IS_LED_CAL_DATA_PATH, (void *)(cal_addr + CAL_DATA_SIZE),
+ LED_CAL_DATA_SIZE);
- release_binary(&cal_bin);
+ /* if getting led_cal_data_file is failed, fill buf with 0xff */
+ if (ret) {
+ memset((void *)(cal_addr + CAL_DATA_SIZE), 0xff, LED_CAL_DATA_SIZE);
+ warn("get led_cal_data fail\n");
+ } else {
+ info("get led_cal_data success\n");
+ }
exit:
if (ret)
err("CAL data loading is fail: skip");
#define SENSOR_SCENARIO_READ_ROM 4
#define SENSOR_SCENARIO_STANDBY 5
#define SENSOR_SCENARIO_SECURE 6
+#define SENSOR_SCENARIO_FACTORY 7
#define SENSOR_SCENARIO_VIRTUAL 9
#define SENSOR_SCENARIO_MAX 10
#define VC_TAILPDAF 1
#define VC_MIPISTAT 2
#define VC_EMBEDDED 3
+#define VC_PRIVATE 4
#define SP_REAR 0
#define SP_FRONT 1
#define SP_REAR2 2
-#define SP_SECURE 3
-#define SP_FRONT2 5
-#define SP_REAR3 6
-#define SP_VIRTUAL 100
+#define SP_FRONT2 3
+#define SP_REAR3 4
+#define SP_FRONT3 5
+#define SP_REAR4 6
+#define SP_FRONT4 7
+#define SP_REAR_TOF 8
+#define SP_FRONT_TOF 9
+#define SP_SECURE 100
+#define SP_VIRTUAL 101
+
+#define DUAL_SYNC_NONE 0
+#define DUAL_SYNC_MASTER 1
+#define DUAL_SYNC_SLAVE 2
#endif
#define V4L2_CID_IS_G_VC2_FRAMEPTR (V4L2_CID_FIMC_IS_BASE + 71)
#define V4L2_CID_IS_G_VC3_FRAMEPTR (V4L2_CID_FIMC_IS_BASE + 72)
#define V4L2_CID_IS_FDAE (V4L2_CID_FIMC_IS_BASE + 73)
+#define V4L2_CID_IS_FACTORY_APERTURE_CONTROL (V4L2_CID_FIMC_IS_BASE + 74)
+#define V4L2_CID_IS_G_SENSOR_FACTORY_RESULT (V4L2_CID_FIMC_IS_BASE + 76)
enum is_fw_boot_mode {
IS_COLD_BOOT = 0, /* FrontCamera, 3rd-Party Camera */
};
#define V4L2_CID_IS_SCENE_MODE (V4L2_CID_FIMC_IS_BASE + 667)
+
+#define V4L2_CID_IS_SECURE_MODE (V4L2_CID_FIMC_IS_BASE + 700)
#define V4L2_CID_IS_DEBUG_DUMP (V4L2_CID_FIMC_IS_BASE + 900)
#define V4L2_CID_IS_DEBUG_SYNC_LOG (V4L2_CID_FIMC_IS_BASE + 901)
#define V4L2_CID_IS_HAL_VERSION (V4L2_CID_FIMC_IS_BASE + 902)
IS_HAL_VER_MAX,
};
+#define V4L2_CID_FLASH_SET_CAL_EN (V4L2_CID_FIMC_IS_TUNE_BASE + 5)
+#define V4L2_CID_FLASH_SET_BY_CAL_CH0 (V4L2_CID_FIMC_IS_TUNE_BASE + 6)
+#define V4L2_CID_FLASH_SET_BY_CAL_CH1 (V4L2_CID_FIMC_IS_TUNE_BASE + 7)
+#define V4L2_CID_GYRO_SELF_TEST (V4L2_CID_FIMC_IS_TUNE_BASE + 8)
#define V4L2_CID_SENSOR_SET_AE_TARGET (V4L2_CID_SENSOR_BASE + 1)
#define V4L2_CID_SENSOR_SET_AE_WEIGHT_1x1_2 (V4L2_CID_SENSOR_BASE + 2)
FRS_SSM_START = 0,
FRS_SSM_MANUAL_CUE_ENABLE,
FRS_SSM_STOP,
- FRS_SSM_MODE_AUTO_MANUAL_CUE,
+ FRS_SSM_MODE_AUTO_MANUAL_CUE_16,
+ FRS_SSM_MODE_AUTO_MANUAL_CUE_32,
+ FRS_SSM_MODE_AUTO_MANUAL_CUE_64,
FRS_SSM_MODE_ONLY_MANUAL_CUE,
+ FRS_SSM_MODE_FACTORY_TEST,
FRS_DRAM_TEST_SECTION2,
FRS_CMD_MAX,
};
#define V4L2_CID_SENSOR_SET_SSM_ROI (V4L2_CID_SENSOR_BASE + 121)
#define V4L2_CID_IS_GET_DUAL_CAL (V4L2_CID_SENSOR_BASE + 122)
+#define V4L2_CID_SENSOR_SET_SSM_THRESHOLD (V4L2_CID_SENSOR_BASE + 123)
+#define V4L2_CID_SENSOR_GET_SSM_THRESHOLD (V4L2_CID_SENSOR_BASE + 124)
+
#define V4L2_CID_ACTUATOR_GET_STATUS (V4L2_CID_SENSOR_BASE + 200)
#define V4L2_CID_ACTUATOR_SET_POSITION (V4L2_CID_SENSOR_BASE + 201)
+#define V4L2_CID_ACTUATOR_GET_ACTUAL_POSITION (V4L2_CID_SENSOR_BASE + 202)
+#define V4L2_CID_ACTUATOR_UPDATE_DYNAMIC_META (V4L2_CID_SENSOR_BASE + 203)
#define V4L2_CID_FLASH_SET_MODE (V4L2_CID_SENSOR_BASE + 300)
#define V4L2_CID_FLASH_SET_INTENSITY (V4L2_CID_SENSOR_BASE + 301)