[ERD][APR-125] Camera code sync to latest.
authorWooyeon Kim <wooy88.kim@samsung.com>
Tue, 7 Aug 2018 10:57:02 +0000 (19:57 +0900)
committerhskang <hs1218.kang@samsung.com>
Mon, 22 Apr 2019 04:33:38 +0000 (13:33 +0900)
Change-Id: Ia58c0082b2b7b882c6945c8fc6acda055e0c506e
Signed-off-by: Wooyeon Kim <wooy88.kim@samsung.com>
305 files changed:
arch/arm64/boot/dts/exynos/exynos9610-camera.dtsi
arch/arm64/boot/dts/exynos/exynos9610-erd9610-camera.dtsi
arch/arm64/boot/dts/exynos/exynos9610-pinctrl.dtsi
drivers/media/platform/exynos/fimc-is2/fimc-is-clk-gate.c
drivers/media/platform/exynos/fimc-is2/fimc-is-clk-gate.h
drivers/media/platform/exynos/fimc-is2/fimc-is-core.c
drivers/media/platform/exynos/fimc-is2/fimc-is-core.h
drivers/media/platform/exynos/fimc-is2/fimc-is-device-csi.h
drivers/media/platform/exynos/fimc-is2/fimc-is-device-csi_v3.c
drivers/media/platform/exynos/fimc-is2/fimc-is-device-csi_v4.c
drivers/media/platform/exynos/fimc-is2/fimc-is-device-flite.c
drivers/media/platform/exynos/fimc-is2/fimc-is-device-ischain.c
drivers/media/platform/exynos/fimc-is2/fimc-is-device-ischain.h
drivers/media/platform/exynos/fimc-is2/fimc-is-device-sensor.c
drivers/media/platform/exynos/fimc-is2/fimc-is-device-sensor.h
drivers/media/platform/exynos/fimc-is2/fimc-is-device-sensor_v2.c
drivers/media/platform/exynos/fimc-is2/fimc-is-devicemgr.c
drivers/media/platform/exynos/fimc-is2/fimc-is-dt.c
drivers/media/platform/exynos/fimc-is2/fimc-is-dt.h
drivers/media/platform/exynos/fimc-is2/fimc-is-framemgr.h
drivers/media/platform/exynos/fimc-is2/fimc-is-groupmgr.c
drivers/media/platform/exynos/fimc-is2/fimc-is-groupmgr.h
drivers/media/platform/exynos/fimc-is2/fimc-is-i2c-config.c
drivers/media/platform/exynos/fimc-is2/fimc-is-interface.h
drivers/media/platform/exynos/fimc-is2/fimc-is-mem.c
drivers/media/platform/exynos/fimc-is2/fimc-is-mem.h
drivers/media/platform/exynos/fimc-is2/fimc-is-resourcemgr.c
drivers/media/platform/exynos/fimc-is2/fimc-is-resourcemgr.h
drivers/media/platform/exynos/fimc-is2/fimc-is-subdev-ctrl.c
drivers/media/platform/exynos/fimc-is2/fimc-is-subdev-ctrl.h
drivers/media/platform/exynos/fimc-is2/fimc-is-video-3aa.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-3aac.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-3aaf.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-3aag.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-3aap.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-dcp.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-dcpc.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-dcps.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-dis.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-disc.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-isp.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-ispc.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-ispp.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-mcs.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-mcsp.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-mec.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-pafrdma.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-scc.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-scp.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-sensor.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-ssvc0.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-ssvc1.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-ssvc2.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-ssvc3.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video-vra.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video.c
drivers/media/platform/exynos/fimc-is2/fimc-is-video.h
drivers/media/platform/exynos/fimc-is2/hardware/api/fimc-is-hw-api-mcscaler-v2.h
drivers/media/platform/exynos/fimc-is2/hardware/api/fimc-is-hw-api-mcscaler-v410.c
drivers/media/platform/exynos/fimc-is2/hardware/api/fimc-is-hw-api-mcscaler-v4_0.c
drivers/media/platform/exynos/fimc-is2/hardware/api/fimc-is-hw-api-mcscaler-v5_0.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-3aa.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-3aa.h
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-control.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-control.h
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-dcp.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-dcp.h
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-djag.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-dm.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-isp.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-isp.h
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-mcscaler-v1.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-mcscaler-v2.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-mcscaler-v2.h
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-paf-rdma.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-paf-rdma.h
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-tdnr-v2.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-tpu.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-tpu.h
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-uvsp-cac.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-vra.c
drivers/media/platform/exynos/fimc-is2/hardware/fimc-is-hw-vra.h
drivers/media/platform/exynos/fimc-is2/include/exynos-fimc-is-module.h
drivers/media/platform/exynos/fimc-is2/include/exynos-fimc-is-sensor.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-binary.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-cmd.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-common-enum.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-helper-i2c.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-hw.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-metadata.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-vender.h
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-ddk.c
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-ddk.h
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-ischain.c
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-ischain.h
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-library.c
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-library.h
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-vra.c
drivers/media/platform/exynos/fimc-is2/interface/fimc-is-interface-vra.h
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v5_10_0/setup-fimc-is-sensor.c
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_0_0/fimc-is-config.h
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_0_0/fimc-is-hw-chain.h
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-config.h
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-hw-chain.c
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-hw-chain.h
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-hw-dvfs.c
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-hw-dvfs.h
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-param.h
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-subdev-3aa.c
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-subdev-isp.c
drivers/media/platform/exynos/fimc-is2/ischain/fimc-is-v6_10_0/fimc-is-subdev-mcsp.c
drivers/media/platform/exynos/fimc-is2/sensor/Kconfig
drivers/media/platform/exynos/fimc-is2/sensor/Makefile
drivers/media/platform/exynos/fimc-is2/sensor/csi2/fimc-is-hw-csi-v4_0.c
drivers/media/platform/exynos/fimc-is2/sensor/csi2/fimc-is-hw-csi-v5_0.c
drivers/media/platform/exynos/fimc-is2/sensor/csi2/fimc-is-hw-csi-v5_1.c
drivers/media/platform/exynos/fimc-is2/sensor/csi2/fimc-is-hw-csi-v5_2.c
drivers/media/platform/exynos/fimc-is2/sensor/fimc-is-helper-i2c.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/Kconfig
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/Makefile
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-ak7345.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-ak7348.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9780.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9804.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9807.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9823.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9823.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9839.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9839.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-lc898217.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc533.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc569.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc569.h [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/Kconfig
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/Makefile
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10-setA.h [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff-setA.h [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c-setA.h [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l1.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l3-setA.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l3-setB.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l3.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l7.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2p2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2p6.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2p7sq.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2p7sx.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2p8.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2t7sx.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3h1.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3l2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3m2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3m3-setA.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3m3-setB.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3m3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3m3.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p8.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p8sp.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4e6.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4h5.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4h5yc.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setC.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-6b2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx219.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx241.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx258.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx260.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx320.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx333.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576-setA.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576-setB.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-rpb.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-sr259.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/Kconfig [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/Makefile [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10ff.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10ff.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-16885c.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-16885c.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-5e9.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-5e9.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-gm1.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-gm1.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-control-sensor.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-control-sensor.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-interface-actuator.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-interface-sensor.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-interface-sensor.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/flash/Kconfig
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/flash/Makefile
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/flash/fimc-is-flash-s2mu106.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/Makefile
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-12a10.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-12a10ff.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-16885c.c [new file with mode: 0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2l1.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2l2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2l3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2l4.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2l7.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2p2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2p7sq.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2p7sx.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2p8.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2t7sx.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2x5sp.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3h1.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3j1.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3l2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3m2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3m3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3p3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3p8.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3p8sp.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3p9.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-4e6.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-4h5.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-4h5yc.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-4ha.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5e2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5e3.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5e6.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5e9.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5f1.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-6b2.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-base.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-base.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-gm1sp.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx219.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx241.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx258.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx260.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx320.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx333.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx576.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx576.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-rpb.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-sr259.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-virtual.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/Kconfig
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/Makefile
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/fimc-is-ois-bu24218gwl.c [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/fimc-is-ois-bu24218gwl.h [new file with mode: 0644]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/fimc-is-ois.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pafstat/fimc-is-hw-pafstat-v1_0.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pafstat/fimc-is-hw-pafstat.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pafstat/fimc-is-pafstat.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pafstat/fimc-is-pafstat.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pdp/fimc-is-hw-pdp-v1_0.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pdp/fimc-is-hw-pdp.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pdp/fimc-is-pdp.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/pdp/fimc-is-pdp.h
drivers/media/platform/exynos/fimc-is2/vendor/default/fimc-is-vender-specific.h
drivers/media/platform/exynos/fimc-is2/vendor/default/fimc-is-vender.c
include/dt-bindings/camera/fimc_is.h
include/uapi/linux/videodev2_exynos_camera.h

index db24c5087e44a65d38dffd688c7fe805791e1e1f..abd1aa56c5eee077cd0a91a1e16f32c13ef60a33 100644 (file)
                };
        };
 
-       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 {
index 662ab5aececbd21e1c97ba3ec10979dce128a4c9..38aea16c1e5c414a1080e225fb7ac43522c4de0e 100644 (file)
        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";
 };
index 3bce53f550e64810ffe635d81489bd9ade40e0c6..6892460fd0012bbdb4003691052dc1a975c84abc 100644 (file)
                        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>;
index 4e100ec2340304337784bfb5951fa0fbbc810815..840d499abc81cab4ec446ffddeeaf785ef4a0d88 100644 (file)
@@ -51,28 +51,6 @@ int fimc_is_clk_gate_lock_set(struct fimc_is_core *core, u32 instance, u32 is_st
        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)
 {
index bfc590ae1100c70fa36bd7579c84338e00957acb..46f65e33bab3f79a12506b783d4978a8047447a9 100644 (file)
@@ -21,9 +21,6 @@
 
 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);
index 31c8b9a8259be72ad960e031e2cfab5e312a6ef8..fb540397ef67dc9f641fba6c4c1b3f31ee0005ed 100644 (file)
@@ -107,6 +107,10 @@ int debug_time_queue;
 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)
 {
@@ -172,6 +176,121 @@ static int fimc_is_resume(struct device *dev)
        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)
 {
@@ -236,9 +355,9 @@ void fimc_is_print_frame_dva(struct fimc_is_subdev *subdev)
        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;
@@ -281,8 +400,8 @@ static void __fimc_is_fault_handler(struct device *dev)
 
                                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);
                                        }
                                }
@@ -619,7 +738,7 @@ static ssize_t store_pattern_en(struct device *dev,
                        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;
        }
 
@@ -1084,6 +1203,9 @@ static int __init fimc_is_probe(struct platform_device *pdev)
        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));
@@ -1289,6 +1411,16 @@ static int __init fimc_is_probe(struct platform_device *pdev)
        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);
@@ -1324,6 +1456,11 @@ static int __init fimc_is_probe(struct platform_device *pdev)
        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);
@@ -1444,17 +1581,48 @@ static int __init fimc_is_probe(struct platform_device *pdev)
 
        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)
@@ -1475,6 +1643,8 @@ static int __init fimc_is_probe(struct platform_device *pdev)
        }
 #endif
 
+       mutex_init(&core->ois_mode_lock);
+
        /* set sysfs for debuging */
        sysfs_debug.en_clk_gate = 0;
        sysfs_debug.en_dvfs = 1;
index 19284e8be5aea49eefa5cf8863ce667dc8e6b115..56f50ac213029ca78647395c3713d56c943469a9 100644 (file)
@@ -165,6 +165,11 @@ enum fimc_is_debug_target {
        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,
@@ -307,6 +312,8 @@ struct fimc_is_core {
        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;
@@ -314,6 +321,7 @@ struct fimc_is_core {
        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;
@@ -354,11 +362,17 @@ struct fimc_is_core {
        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);
index bb4ff1325da70fd7765801c52ef024706aacb06a..baa0bebe0ed17d76357bc580f882323529bc17ae 100644 (file)
@@ -103,10 +103,6 @@ struct fimc_is_device_csi {
        /* 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;
index f6f45f83e0f578b7943cba79c1b113dc817aa6bb..0c31cbe5dcdf963d3d3fa12e3b9080f6bffb5afa 100644 (file)
@@ -123,14 +123,16 @@ static inline void csi_s_buf_addr(struct fimc_is_device_csi *csi, struct fimc_is
 {
        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)
index 369af988f9438aecf395e132c6b20c48e6a2581f..0208acaf844726f936645f681fc776e029a0d3b7 100644 (file)
@@ -119,8 +119,12 @@ static inline void csi_s_config_dma(struct fimc_is_device_csi *csi, struct fimc_
                        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 {
@@ -135,7 +139,13 @@ static inline void csi_s_config_dma(struct fimc_is_device_csi *csi, struct fimc_
                }
 
                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);
        }
 }
 
@@ -143,14 +153,16 @@ static inline void csi_s_buf_addr(struct fimc_is_device_csi *csi, struct fimc_is
 {
        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)
@@ -221,7 +233,8 @@ static void csis_s_vc_dma_multibuf(struct fimc_is_device_csi *csi)
                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);
@@ -250,6 +263,7 @@ static void csis_disable_all_vc_dma_buf(struct fimc_is_device_csi *csi)
        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 */
@@ -271,6 +285,18 @@ static void csis_disable_all_vc_dma_buf(struct fimc_is_device_csi *csi)
                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.
@@ -361,7 +387,8 @@ static void csis_flush_vc_multibuf(struct fimc_is_device_csi *csi, u32 vc)
        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);
@@ -620,11 +647,25 @@ static void csi_dma_tag(struct v4l2_subdev *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;
                }
@@ -1082,8 +1123,15 @@ static irqreturn_t fimc_is_isr_csi_dma(int irq, void *data)
        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]) {
@@ -1222,35 +1270,16 @@ static int csi_s_power(struct v4l2_subdev *subdev,
                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;
@@ -1540,6 +1569,10 @@ static int csi_stream_on(struct v4l2_subdev *subdev,
 
        /* 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);
@@ -1552,7 +1585,7 @@ static int csi_stream_on(struct v4l2_subdev *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);
@@ -1846,6 +1879,9 @@ static int csi_s_buffer(struct v4l2_subdev *subdev, void *buf, unsigned int *siz
        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);
@@ -1977,12 +2013,6 @@ int fimc_is_csi_probe(void *parent, u32 instance)
                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;
@@ -2121,9 +2151,6 @@ err_get_vc_dma_res:
        __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:
index b5c3b1e98f38b1a856f621e9001f02813316f6b7..28c754628d2ebf9138af79a30b1dc4fc6f4341cc 100644 (file)
@@ -140,7 +140,8 @@ trigger_skip:
 
        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);
@@ -179,7 +180,8 @@ void tasklet_flite_str_m2m(unsigned long data)
 
        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);
@@ -242,7 +244,8 @@ static void tasklet_flite_end(unsigned long data)
                                                (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 {
@@ -620,7 +623,8 @@ static int flite_stream_on(struct v4l2_subdev *subdev,
        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 {
@@ -900,7 +904,8 @@ static int flite_s_buffer(struct v4l2_subdev *subdev, void *buf, unsigned int *s
                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);
                        }
                }
index 045eba6961195d34509b6a1d51dd65d9375ba60b..93aedba6ad419b5370fc64eba754c7e28862a33e 100644 (file)
@@ -1502,8 +1502,6 @@ int fimc_is_itf_set_fwboot(struct fimc_is_device_ischain *device, u32 val)
 
 static void fimc_is_itf_param_init(struct is_region *region)
 {
-       memset(&region->parameter, 0x0, sizeof(struct is_param_region));
-
        memcpy(&region->parameter.sensor, &init_sensor_param,
                sizeof(struct sensor_param));
        memcpy(&region->parameter.taa, &init_taa_param,
@@ -1524,10 +1522,6 @@ static void fimc_is_itf_param_init(struct is_region *region)
 #ifdef SOC_SCP
        memcpy(&region->parameter.scalerp, &init_scp_param,
                sizeof(struct scp_param));
-#endif
-#ifdef SOC_MCS
-       memcpy(&region->parameter.mcs, &init_mcs_param,
-               sizeof(struct mcs_param));
 #endif
        memcpy(&region->parameter.vra, &init_vra_param,
                sizeof(struct vra_param));
@@ -1670,8 +1664,9 @@ p_err:
        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;
 
@@ -1679,7 +1674,8 @@ int fimc_is_itf_map(struct fimc_is_device_ischain *device,
 
        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;
 }
@@ -1695,6 +1691,7 @@ static int fimc_is_itf_unmap(struct fimc_is_device_ischain *device,
 
        return ret;
 }
+#endif
 
 int fimc_is_itf_stream_on(struct fimc_is_device_ischain *device)
 {
@@ -2121,6 +2118,7 @@ int fimc_is_itf_grp_shot(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);
@@ -2152,8 +2150,15 @@ int fimc_is_itf_grp_shot(struct fimc_is_device_ischain *device,
        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);
@@ -2657,7 +2662,7 @@ static int fimc_is_ischain_s_sensor_size(struct fimc_is_device_ischain *device,
                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;
@@ -2775,21 +2780,21 @@ int fimc_is_ischain_buf_tag(struct fimc_is_device_ischain *device,
                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);
                        }
@@ -2797,7 +2802,7 @@ int fimc_is_ischain_buf_tag(struct fimc_is_device_ischain *device,
                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);
                        }
@@ -2805,7 +2810,7 @@ int fimc_is_ischain_buf_tag(struct fimc_is_device_ischain *device,
                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);
                        }
@@ -2814,25 +2819,27 @@ int fimc_is_ischain_buf_tag(struct fimc_is_device_ischain *device,
                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;
                }
 
@@ -2925,7 +2932,7 @@ int fimc_is_ischain_buf_tag_64bit(struct fimc_is_device_ischain *device,
                        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;
                }
 
@@ -3412,9 +3419,12 @@ static int fimc_is_ischain_open(struct fimc_is_device_ischain *device)
        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
@@ -3667,7 +3677,7 @@ static int fimc_is_ischain_init(struct fimc_is_device_ischain *device,
                 * 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;
@@ -3846,15 +3856,15 @@ static int fimc_is_ischain_init_wrap(struct fimc_is_device_ischain *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;
@@ -4303,6 +4313,7 @@ p_err:
 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;
@@ -4318,6 +4329,9 @@ static int fimc_is_ischain_paf_reqbufs(void *qdevice,
        }
 
        return ret;
+#else
+       return 0;
+#endif
 }
 
 static int fimc_is_ischain_paf_s_format(void *qdevice,
@@ -4589,6 +4603,7 @@ p_err:
 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;
@@ -4604,6 +4619,9 @@ static int fimc_is_ischain_3aa_reqbufs(void *qdevice,
        }
 
        return ret;
+#else
+       return 0;
+#endif
 }
 
 static int fimc_is_ischain_3aa_s_format(void *qdevice,
@@ -4874,6 +4892,7 @@ p_err:
 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;
@@ -4889,6 +4908,9 @@ static int fimc_is_ischain_isp_reqbufs(void *qdevice,
        }
 
        return ret;
+#else
+       return 0;
+#endif
 }
 
 static int fimc_is_ischain_isp_s_format(void *qdevice,
@@ -5162,6 +5184,7 @@ p_err:
 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;
@@ -5177,6 +5200,9 @@ static int fimc_is_ischain_dis_reqbufs(void *qdevice,
        }
 
        return ret;
+#else
+       return 0;
+#endif
 }
 
 static int fimc_is_ischain_dis_s_format(void *qdevice,
@@ -5450,6 +5476,7 @@ p_err:
 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;
@@ -5465,6 +5492,9 @@ static int fimc_is_ischain_dcp_reqbufs(void *qdevice,
        }
 
        return ret;
+#else
+       return 0;
+#endif
 }
 
 static int fimc_is_ischain_dcp_s_format(void *qdevice,
@@ -5739,6 +5769,7 @@ p_err:
 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;
@@ -5754,6 +5785,9 @@ static int fimc_is_ischain_mcs_reqbufs(void *qdevice,
        }
 
        return ret;
+#else
+       return 0;
+#endif
 }
 
 static int fimc_is_ischain_mcs_s_format(void *qdevice,
@@ -6020,6 +6054,7 @@ p_err:
 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;
@@ -6035,6 +6070,9 @@ static int fimc_is_ischain_vra_reqbufs(void *qdevice,
        }
 
        return ret;
+#else
+       return 0;
+#endif
 }
 
 static int fimc_is_ischain_vra_s_format(void *qdevice,
@@ -6205,6 +6243,7 @@ static int fimc_is_ischain_3aa_group_tag(struct fimc_is_device_ischain *device,
                        }
                        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);
@@ -6319,6 +6358,7 @@ static int fimc_is_ischain_isp_group_tag(struct fimc_is_device_ischain *device,
                        }
                        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);
@@ -6600,23 +6640,23 @@ static int fimc_is_ischain_mcs_group_tag(struct fimc_is_device_ischain *device,
        }
 #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);
@@ -6821,10 +6861,12 @@ static int fimc_is_ischain_paf_shot(struct fimc_is_device_ischain *device,
                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;
@@ -6869,6 +6911,11 @@ static int fimc_is_ischain_paf_shot(struct fimc_is_device_ischain *device,
                                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 */
@@ -7038,10 +7085,12 @@ static int fimc_is_ischain_3aa_shot(struct fimc_is_device_ischain *device,
                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;
@@ -7263,10 +7312,12 @@ static int fimc_is_ischain_isp_shot(struct fimc_is_device_ischain *device,
                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;
@@ -7426,10 +7477,12 @@ static int fimc_is_ischain_dis_shot(struct fimc_is_device_ischain *device,
                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;
@@ -7552,10 +7605,12 @@ static int fimc_is_ischain_dcp_shot(struct fimc_is_device_ischain *device,
                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;
@@ -7665,10 +7720,13 @@ static int fimc_is_ischain_mcs_shot(struct fimc_is_device_ischain *device,
                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;
@@ -7799,10 +7857,12 @@ static int fimc_is_ischain_vra_shot(struct fimc_is_device_ischain *device,
                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;
@@ -7873,100 +7933,6 @@ p_err:
        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)
index 1bb288b78de7086b22d0e03196f7c7558f10422c..0ecccef6f66d0cefefbf0968ced390c782bef380 100644 (file)
 #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 {
@@ -258,11 +266,6 @@ int fimc_is_ischain_isp_buffer_queue(struct fimc_is_device_ischain *device,
 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);
@@ -331,13 +334,6 @@ int fimc_is_ischain_vra_buffer_queue(struct fimc_is_device_ischain *device,
 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,
@@ -346,8 +342,10 @@ int fimc_is_itf_process_stop(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);
index d4c227330229fd990101cc75007366f0fa68aa80..8a25fea52a1968a199f6522ad97522dcbd651a95 100644 (file)
@@ -2487,6 +2487,13 @@ static int fimc_is_sensor_back_start(void *qdevice,
                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);
index 5b3909ccd5ddeb262188d273984963ae5412c7e7..c62096d9cf074526146bbd7a88fe69b1d607f5d7 100644 (file)
@@ -37,7 +37,8 @@ struct fimc_is_device_ischain;
 #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
@@ -77,6 +78,9 @@ struct fimc_is_device_ischain;
 #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
@@ -168,13 +172,7 @@ enum fimc_is_sensor_subdev_ioctl {
        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,
@@ -213,7 +211,11 @@ enum fimc_is_ex_mode {
        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 {
@@ -232,11 +234,12 @@ 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 {
@@ -282,8 +285,7 @@ struct fimc_is_module_enum {
        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;
@@ -315,7 +317,8 @@ enum fimc_is_sensor_state {
        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 {
@@ -325,6 +328,20 @@ 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;
@@ -362,7 +379,7 @@ struct fimc_is_device_sensor {
        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
 
@@ -397,7 +414,6 @@ struct fimc_is_device_sensor {
        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;
@@ -411,7 +427,11 @@ struct fimc_is_device_sensor {
        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;
@@ -434,6 +454,15 @@ struct fimc_is_device_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,
index e91a5710cbd591b02c1cbf64a8fbb566d6984de8..0f074b97f26114489e6c9ab1fc05516694b950b5 100644 (file)
@@ -103,24 +103,22 @@ int fimc_is_search_sensor_module_with_position(struct fimc_is_device_sensor *dev
                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;
@@ -142,7 +140,7 @@ int fimc_is_search_sensor_module_with_position(struct fimc_is_device_sensor *dev
 
        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;
        }
 
@@ -804,18 +802,19 @@ static void fimc_is_sensor_dtp(unsigned long data)
 
        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);
 
@@ -872,6 +871,7 @@ static int fimc_is_sensor_start(struct fimc_is_device_sensor *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);
@@ -969,6 +969,7 @@ int fimc_is_sensor_buf_tag(struct fimc_is_device_sensor *device,
                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) {
@@ -993,10 +994,36 @@ int fimc_is_sensor_dm_tag(struct fimc_is_device_sensor *device,
 {
        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;
@@ -1007,11 +1034,31 @@ int fimc_is_sensor_dm_tag(struct fimc_is_device_sensor *device,
                 * 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;
 }
 
@@ -1088,9 +1135,12 @@ static int fimc_is_sensor_notify_by_fstr(struct fimc_is_device_sensor *device, v
                                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);
@@ -1113,8 +1163,12 @@ static int fimc_is_sensor_notify_by_fend(struct fimc_is_device_sensor *device, v
        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);
@@ -1178,12 +1232,36 @@ static int fimc_is_sensor_notify_by_dma_end(struct fimc_is_device_sensor *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;
                }
@@ -1202,9 +1280,6 @@ static int fimc_is_sensor_notify_by_line(struct fimc_is_device_sensor *device,
 
        FIMC_BUG(!device);
 
-       if (device->line_fcount == 0)
-               device->line_fcount = 1;
-
        device->line_fcount++;
 
        group = &device->group_sensor;
@@ -1272,6 +1347,7 @@ static void fimc_is_sensor_notify(struct v4l2_subdev *subdev,
        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);
@@ -1307,6 +1383,7 @@ static void fimc_is_sensor_instanton(struct work_struct *data)
 
        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);
@@ -1321,17 +1398,18 @@ static void fimc_is_sensor_instanton(struct work_struct *data)
                        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 */
@@ -1433,7 +1511,6 @@ static int __init fimc_is_sensor_probe(struct platform_device *pdev)
        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);
@@ -1447,22 +1524,8 @@ static int __init fimc_is_sensor_probe(struct platform_device *pdev)
        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);
 
@@ -1641,8 +1704,9 @@ int fimc_is_sensor_open(struct fimc_is_device_sensor *device,
        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
 
@@ -1834,7 +1898,7 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
        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);
@@ -1843,7 +1907,7 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
        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;
@@ -1882,19 +1946,23 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
        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;
@@ -1943,7 +2011,7 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
        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 */
        {
@@ -2015,6 +2083,42 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
                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;
@@ -2036,6 +2140,27 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
                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
 
@@ -2045,57 +2170,17 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
        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
@@ -2210,7 +2295,7 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
                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);
@@ -2222,39 +2307,10 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *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);
@@ -3057,6 +3113,9 @@ static int fimc_is_sensor_back_start(void *qdevice,
        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);
 
@@ -3076,6 +3135,13 @@ static int fimc_is_sensor_back_start(void *qdevice,
                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) {
@@ -3093,6 +3159,18 @@ static int fimc_is_sensor_back_start(void *qdevice,
                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);
@@ -3109,6 +3187,12 @@ static int fimc_is_sensor_back_start(void *qdevice,
        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;
@@ -3161,6 +3245,11 @@ static int fimc_is_sensor_back_stop(void *qdevice,
        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);
 
@@ -3178,8 +3267,12 @@ int fimc_is_sensor_standby_flush(struct fimc_is_device_sensor *device)
 
        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) {
@@ -3197,6 +3290,7 @@ int fimc_is_sensor_standby_flush(struct fimc_is_device_sensor *device)
 
        mginfo("%s() done", device, group, __func__);
 
+p_skip:
        return ret;
 }
 
@@ -3319,9 +3413,15 @@ int fimc_is_sensor_front_stop(struct fimc_is_device_sensor *device)
        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;
@@ -3337,6 +3437,7 @@ int fimc_is_sensor_front_stop(struct fimc_is_device_sensor *device)
        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);
 
@@ -3353,13 +3454,18 @@ int fimc_is_sensor_front_stop(struct fimc_is_device_sensor *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;
 }
 
@@ -3448,14 +3554,8 @@ int fimc_is_sensor_runtime_suspend(struct device *dev)
        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;
@@ -3467,7 +3567,7 @@ int fimc_is_sensor_runtime_suspend(struct device *dev)
                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);
@@ -3480,34 +3580,9 @@ int fimc_is_sensor_runtime_suspend(struct device *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) {
@@ -3531,39 +3606,9 @@ int fimc_is_sensor_runtime_suspend(struct device *dev)
        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)
@@ -3616,9 +3661,6 @@ int fimc_is_sensor_runtime_resume(struct device *dev)
        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;
 
@@ -3641,16 +3683,10 @@ int fimc_is_sensor_runtime_resume(struct device *dev)
                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 */
index 18c85b55864bc3cd44dac7f9a08abb6664c609b2..635ddb6e130cc3a339555bf62417e6eeffb122ee 100644 (file)
@@ -166,19 +166,10 @@ int fimc_is_devicemgr_open(struct fimc_is_devicemgr *devicemgr,
                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);
@@ -447,7 +438,10 @@ int fimc_is_devicemgr_shot_callback(struct fimc_is_group *group,
                               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 {
index 8d60113ce4c42f44bdb644eb6a62dddcb10a2a5d..17f33e678463e4d6a233ef911979a19bb096c829 100644 (file)
@@ -221,6 +221,7 @@ int fimc_is_parse_dt(struct platform_device *pdev)
        struct device_node *dvfs_np = NULL;
        struct device_node *vender_np = NULL;
        struct device_node *np;
+       u32 mem_info[2];
 
        FIMC_BUG(!pdev);
 
@@ -252,6 +253,28 @@ int fimc_is_parse_dt(struct platform_device *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);
@@ -326,6 +349,20 @@ int fimc_is_sensor_parse_dt(struct platform_device *pdev)
                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) {
@@ -530,6 +567,18 @@ static int parse_ois_data(struct exynos_platform_fimc_is_module *pdata, struct d
        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;
@@ -542,6 +591,18 @@ static int parse_aperture_data(struct exynos_platform_fimc_is_module *pdata, str
        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;
@@ -635,9 +696,8 @@ static int parse_internal_vc_data(struct exynos_platform_fimc_is_module *pdata,
        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;
@@ -646,18 +706,17 @@ int fimc_is_sensor_module_parse_dt(struct platform_device *pdev,
        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__);
@@ -680,12 +739,14 @@ int fimc_is_sensor_module_parse_dt(struct platform_device *pdev,
        }
 
        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) {
@@ -693,138 +754,22 @@ int fimc_is_sensor_module_parse_dt(struct platform_device *pdev,
                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");
@@ -855,6 +800,13 @@ int fimc_is_module_parse_dt(struct device *dev,
                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;
@@ -862,6 +814,12 @@ int fimc_is_module_parse_dt(struct device *dev,
                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");
index 7dcc337d592e267f16eae42679e858a30ad8ba36..145c5d58dcdc74b348ee21f0b0b75544a95ffe38 100644 (file)
@@ -60,5 +60,4 @@ int fimc_is_sensor_module_parse_dt(struct platform_device *pdev,
 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
index 463db356b57b49ced3059e0e13411ae4310b4ebd..d79f7ddcb64d126288f2055eda8d8e50ae39b86f 100644 (file)
@@ -194,10 +194,8 @@ struct fimc_is_frame {
        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 */
@@ -205,8 +203,8 @@ struct fimc_is_frame {
 
        /* 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
@@ -253,6 +251,9 @@ struct fimc_is_frame {
        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
index dcdecba916cecabb6403489c2c21c5e5764cc146..3fe65817bef55a8fd67019a855256ce837efc916 100644 (file)
@@ -28,6 +28,7 @@
 #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"
@@ -41,7 +42,7 @@
 #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
@@ -390,38 +391,6 @@ p_err:
        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)
 {
@@ -628,6 +597,9 @@ void fimc_is_group_subdev_cancel(struct fimc_is_group *group,
 #endif
                                }
                        } while (sub_frame && flush);
+
+                       if (sub_vctx->video->try_smp)
+                               up(&sub_vctx->video->smp_multi_input);
                }
 
                group = group->child;
@@ -778,19 +750,19 @@ static void fimc_is_group_debug_aa_done(struct fimc_is_group *group,
                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
 }
@@ -2014,7 +1986,7 @@ static void set_group_shots(struct fimc_is_group *group,
                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 {
@@ -2170,7 +2142,10 @@ void wait_subdev_flush_work(struct fimc_is_device_ischain *device,
                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;
@@ -2263,7 +2238,7 @@ int fimc_is_group_stop(struct fimc_is_groupmgr *groupmgr,
        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 */
@@ -2543,11 +2518,43 @@ int fimc_is_group_buffer_queue(struct fimc_is_groupmgr *groupmgr,
                }
 #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;
@@ -2572,9 +2579,36 @@ int fimc_is_group_buffer_queue(struct fimc_is_groupmgr *groupmgr,
                                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);
@@ -3293,6 +3327,7 @@ int fimc_is_group_done(struct fimc_is_groupmgr *groupmgr,
        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;
@@ -3303,6 +3338,7 @@ int fimc_is_group_done(struct fimc_is_groupmgr *groupmgr,
 #endif
        ulong flags;
        struct fimc_is_group_task *gtask_child;
+       struct fimc_is_resourcemgr *resourcemgr;
 
        FIMC_BUG(!groupmgr);
        FIMC_BUG(!group);
@@ -3335,6 +3371,7 @@ int fimc_is_group_done(struct fimc_is_groupmgr *groupmgr,
        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
@@ -3346,6 +3383,29 @@ int fimc_is_group_done(struct fimc_is_groupmgr *groupmgr,
                                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
index d610e29cf437274e7ac2693d624b5dcfd990dcba..f59f48b1c3a463054cd694d4893cf1017d1d7622 100644 (file)
 #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
@@ -186,6 +187,7 @@ struct fimc_is_group {
        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 */
@@ -292,9 +294,6 @@ int fimc_is_group_done(struct fimc_is_groupmgr *groupmgr,
        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);
index c0414a532d21f5eb093404af8ef206e434de82d9..c29bf051437d96ad4a3fbeecce135b57fe532955 100644 (file)
@@ -19,6 +19,7 @@
 #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)
@@ -63,6 +64,7 @@ int fimc_is_i2c_pin_control(struct fimc_is_module_enum *module, u32 scenario, u3
        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;
@@ -73,8 +75,13 @@ int fimc_is_i2c_pin_control(struct fimc_is_module_enum *module, u32 scenario, u3
        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);
@@ -82,12 +89,11 @@ int fimc_is_i2c_pin_control(struct fimc_is_module_enum *module, u32 scenario, u3
                }
                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",
@@ -105,6 +111,11 @@ int fimc_is_i2c_pin_control(struct fimc_is_module_enum *module, u32 scenario, u3
                                __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) {
@@ -112,12 +123,17 @@ int fimc_is_i2c_pin_control(struct fimc_is_module_enum *module, u32 scenario, u3
                                __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:
index 6a7f7f9ba704ea47cb42d5e74b128362b4d50ada..db7def84a8960fdcd40f39fd0ef1e4da8ea304fe 100644 (file)
@@ -52,7 +52,9 @@
 #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
@@ -102,11 +104,13 @@ enum work_map {
        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 */
index 353c2c227eb434a36776d106c0e0e160d7389c46..836ea667f1e2082097e5f0cd59b2faa2f3e0ea7e 100644 (file)
 #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 */
@@ -238,20 +538,30 @@ static void fimc_is_ion_deinit(void *ctx)
 }
 
 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;
@@ -369,6 +679,7 @@ static phys_addr_t fimc_is_km_phaddr(struct fimc_is_priv_buf *pbuf)
 
        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,
@@ -407,7 +718,7 @@ int fimc_is_mem_init(struct fimc_is_mem *mem, struct platform_device *pdev)
 #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
 
index d990cca68308bbda2990cb3a2aa28429865e2432..c9444b7bc564be958b6d714f9cb8b539e1f5f6aa 100644 (file)
 #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;
 };
 
@@ -66,8 +77,8 @@ struct fimc_is_priv_buf {
        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)                               \
@@ -95,7 +106,7 @@ struct fimc_is_mem_ops {
        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 {
@@ -135,8 +146,7 @@ struct fimc_is_mem {
 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;
@@ -145,6 +155,8 @@ struct fimc_is_minfo {
        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;
@@ -171,6 +183,8 @@ struct fimc_is_minfo {
 
        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 */
@@ -181,8 +195,7 @@ struct fimc_is_minfo {
        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);
index 47890528ffd3c83d1fd67411c31a7b6e8d6b4109..fe907eab8230f3b9d19570f1b8dfc5e05801126e 100644 (file)
@@ -35,6 +35,9 @@
 #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>
@@ -134,14 +137,14 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
        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;
@@ -240,38 +243,35 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
        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;
@@ -283,7 +283,7 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
        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;
@@ -292,7 +292,7 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
        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;
@@ -301,7 +301,7 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
 
        /* 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;
@@ -309,39 +309,51 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
        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;
@@ -350,7 +362,7 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
 #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;
@@ -358,15 +370,6 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
        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
@@ -377,7 +380,7 @@ static int fimc_is_resourcemgr_allocmem(struct fimc_is_resourcemgr *resourcemgr)
        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;
@@ -394,6 +397,7 @@ static int fimc_is_resourcemgr_initmem(struct fimc_is_resourcemgr *resourcemgr)
 {
        struct fimc_is_minfo *minfo = NULL;
        int ret = 0;
+       int i;
 
        probe_info("fimc_is_init_mem - ION\n");
 
@@ -409,9 +413,6 @@ static int fimc_is_resourcemgr_initmem(struct fimc_is_resourcemgr *resourcemgr)
        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);
@@ -429,6 +430,14 @@ static int fimc_is_resourcemgr_initmem(struct fimc_is_resourcemgr *resourcemgr)
 #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);
@@ -446,14 +455,6 @@ static int fimc_is_resourcemgr_initmem(struct fimc_is_resourcemgr *resourcemgr)
        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);
@@ -466,8 +467,10 @@ static int fimc_is_resourcemgr_initmem(struct fimc_is_resourcemgr *resourcemgr)
        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);
@@ -481,22 +484,44 @@ static int fimc_is_resourcemgr_alloc_dynamic_mem(struct fimc_is_resourcemgr *res
 {
        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;
 }
@@ -519,6 +544,18 @@ static int fimc_is_resourcemgr_init_dynamic_mem(struct fimc_is_resourcemgr *reso
 
        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:
@@ -528,16 +565,96 @@ 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)
@@ -625,7 +742,14 @@ static int __init fimc_is_lib_mem_alloc(char *str)
 
        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;
 }
@@ -662,25 +786,26 @@ static int __init fimc_is_lib_mem_map(void)
        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;
@@ -692,11 +817,11 @@ static int __init fimc_is_heap_mem_map(struct fimc_is_resourcemgr *resourcemgr)
                        *(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;
        }
 
@@ -1044,6 +1169,14 @@ static struct notifier_block notify_reboot_block = {
 };
 #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)
 {
@@ -1118,9 +1251,15 @@ int fimc_is_resourcemgr_probe(struct fimc_is_resourcemgr *resourcemgr,
                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;
        }
 
@@ -1164,6 +1303,10 @@ int fimc_is_resourcemgr_probe(struct fimc_is_resourcemgr *resourcemgr,
        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;
@@ -1286,8 +1429,10 @@ int fimc_is_resource_get(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
                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
@@ -1312,11 +1457,12 @@ int fimc_is_resource_get(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
 #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;
@@ -1331,6 +1477,8 @@ int fimc_is_resource_get(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
                        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);
@@ -1422,6 +1570,14 @@ int fimc_is_resource_get(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
                                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);
@@ -1447,9 +1603,13 @@ int fimc_is_resource_get(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
 
 #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__);
@@ -1542,6 +1702,13 @@ int fimc_is_resource_put(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
                        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)
@@ -1612,6 +1779,12 @@ int fimc_is_resource_put(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
                        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);
@@ -1621,6 +1794,9 @@ int fimc_is_resource_put(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
 #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
 
@@ -1651,7 +1827,6 @@ int fimc_is_resource_put(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type)
                        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) {
index aa04dd512bcbaf0fb44b93b66e714542a0de5326..b4150ee7d379a25b44126dfb7703814779f8c364 100644 (file)
@@ -151,6 +151,13 @@ struct fimc_is_resourcemgr {
        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);
index 9c6a69f0ba08fc51ec314f0b06e8ba69b16de903..23885ff509f6473272506f0733d990af413600e0 100644 (file)
@@ -97,6 +97,7 @@ struct fimc_is_subdev * video2subdev(enum fimc_is_subdev_device_type device_type
                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:
@@ -1219,9 +1220,9 @@ vra_pass:
 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);
@@ -1232,28 +1233,27 @@ static int fimc_is_subdev_internal_alloc_buffer(struct fimc_is_subdev *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++) {
@@ -1262,8 +1262,8 @@ static int fimc_is_subdev_internal_alloc_buffer(struct fimc_is_subdev *subdev,
 
                /* 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);
        }
@@ -1271,7 +1271,13 @@ static int fimc_is_subdev_internal_alloc_buffer(struct fimc_is_subdev *subdev,
        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;
 };
 
@@ -1389,8 +1395,6 @@ static int fimc_is_sensor_subdev_internal_free_buffer(struct fimc_is_device_sens
                        ret = -EINVAL;
                        goto p_err;
                }
-
-               //csi->dma_subdev[i] = NULL;
        }
 
 p_err:
@@ -1679,23 +1683,25 @@ static int fimc_is_sensor_subdev_internal_s_format(struct fimc_is_device_sensor
                /* 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;
@@ -1715,8 +1721,10 @@ static int fimc_is_sensor_subdev_internal_s_format(struct fimc_is_device_sensor
                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);
        }
index eee7734dd193347c58ac9ab23387aca1c5e7f98e..9250cc63d6f1427b663d01a9ed2aa251a5eeba18 100644 (file)
@@ -132,13 +132,11 @@ struct fimc_is_subdev {
        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;
@@ -175,7 +173,6 @@ int fimc_is_subdev_open(struct fimc_is_subdev *subdev,
        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);
 
index b3fe39e7f3436cc9a58c99fc5a01d56cda1bb0a5..4326ed6b21957f5f1fafaa92851614aa41aeeb91 100644 (file)
@@ -108,6 +108,39 @@ p_err:
        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
@@ -418,10 +451,12 @@ static int fimc_is_3aa_video_prepare(struct file *file, void *priv,
                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);
@@ -713,21 +748,6 @@ static int fimc_is_3aa_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -828,12 +848,13 @@ static void fimc_is_3aa_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 70e5593a456471c4c2b09ae5dd3073923d8d2bac..6e8d49d723bc2d68106e9b256bd779dffbd867ad 100644 (file)
@@ -609,21 +609,6 @@ static int fimc_is_3xc_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -728,12 +713,13 @@ static void fimc_is_3xc_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index d9b240f0e8d46a8fed218e9b6ff21e0ba0cc1d32..03164c022c5c5622a95134dc1e10897473b91732 100644 (file)
@@ -609,21 +609,6 @@ static int fimc_is_3xf_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -728,12 +713,13 @@ static void fimc_is_3xf_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 167930ca9b5406ffa06f14e4d4efeb6368bfa27a..5d2aa338c0a6a22c5115f0880009d06d9da17416 100644 (file)
@@ -609,21 +609,6 @@ static int fimc_is_3xg_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -728,12 +713,13 @@ static void fimc_is_3xg_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index baf4e21d9e37fdae818e58accc3679cbbfa17d4c..9deb6a6127581d5397b542cb31c1fdc0692d38e9 100644 (file)
@@ -101,6 +101,39 @@ p_err:
        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
@@ -609,21 +642,6 @@ static int fimc_is_3xp_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -728,12 +746,13 @@ static void fimc_is_3xp_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 10aacc8a3825f2a03087609e82ae01ecba05901c..872a87d260ce6c4bb8d49a3e415e417b8f99241a 100644 (file)
@@ -388,10 +388,12 @@ static int fimc_is_dcpxs_video_prepare(struct file *file, void *priv,
                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);
@@ -574,21 +576,6 @@ static int fimc_is_dcpxs_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -689,12 +676,13 @@ static void fimc_is_dcpxs_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 7f5fa6b073951bb0adbfe1a908f43159f7256d10..b4f65bade77474377cab4a2a96f3a46d878a564a 100644 (file)
@@ -709,21 +709,6 @@ static int fimc_is_dcpxc_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -828,12 +813,13 @@ static void fimc_is_dcpxc_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 6764c61fa4779f29895ae76378c06b5f8584a506..ff6502eceb60a6a4cdc83f8fd33668a747343b94 100644 (file)
@@ -554,21 +554,6 @@ static int fimc_is_dcp1s_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -673,12 +658,13 @@ static void fimc_is_dcp1s_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index ddc1c43c455f9605b789a838241504ccddb873f9..9a0615e4d49cfc05d30706f61de38fe75106b189 100644 (file)
@@ -422,10 +422,12 @@ static int fimc_is_dxs_video_prepare(struct file *file, void *priv,
                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);
@@ -608,21 +610,6 @@ static int fimc_is_dxs_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -723,12 +710,13 @@ static void fimc_is_dxs_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index feb91321abd48e94c03ce715fac5c860083369dd..e8544e8a08b6213f990ffa8b97b96e049c18438b 100644 (file)
@@ -609,21 +609,6 @@ static int fimc_is_dxc_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -728,12 +713,13 @@ static void fimc_is_dxc_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index b200a3726de8dcdf080f4f8832050675cb7c858a..f9917d11bd2d6b67b74d5cbcbfcc9d66ade3e935 100644 (file)
@@ -456,10 +456,12 @@ static int fimc_is_ixs_video_prepare(struct file *file, void *priv,
                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);
@@ -685,21 +687,6 @@ static int fimc_is_ixs_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -800,12 +787,13 @@ static void fimc_is_ixs_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 46fb86ad21b86a9e9bac5ba27bb9878be2e00815..7ee9b4fc47eebab1242d7843a9a2c065f1181b9d 100644 (file)
@@ -609,21 +609,6 @@ static int fimc_is_ixc_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -728,12 +713,13 @@ static void fimc_is_ixc_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index adeccaf4f2d355c4d85115be06c72289a1ef01b2..3fd119fe84dd14bd959af450cf538488699da622 100644 (file)
@@ -609,21 +609,6 @@ static int fimc_is_ixp_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -728,12 +713,13 @@ static void fimc_is_ixp_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index ed659962d055d8ce23a85212e0770746c9ca7166..830ca50c1b6097aae0f491ed5bace66965944a5a 100644 (file)
@@ -428,10 +428,12 @@ static int fimc_is_mcs_video_prepare(struct file *file, void *priv,
                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);
@@ -630,21 +632,6 @@ static int fimc_is_mcs_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -748,12 +735,13 @@ static void fimc_is_mcs_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index be385190ab66dbf04b47d9e84f17d52d40288bef..92110215e39af7ebff743ab8ac1c1f82fd7ecf5a 100644 (file)
@@ -712,21 +712,6 @@ static int fimc_is_mxp_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -834,12 +819,13 @@ static void fimc_is_mxp_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 412c838bbe25bfdf012e69c9fc9edfce223f3432..5b861278e9e4a838052fc07c394119db9a90807a 100644 (file)
@@ -68,6 +68,39 @@ p_err:
        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
@@ -565,6 +598,8 @@ static int fimc_is_mexc_queue_setup(struct vb2_queue *vbq,
        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,
@@ -576,21 +611,6 @@ static int fimc_is_mexc_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -695,12 +715,13 @@ static void fimc_is_mexc_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 7ca147589838bfaca7041d1e6a3440f076bc7549..670307c2d9c4d89614175f6c9ff6ab44ed534299 100644 (file)
@@ -418,10 +418,12 @@ static int fimc_is_paf_video_prepare(struct file *file, void *priv,
                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);
@@ -670,21 +672,6 @@ static int fimc_is_paf_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -785,12 +772,13 @@ static void fimc_is_paf_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 14686849136600d4c17d4700cf5a62e21affffc7..39c857d9941d19b83f60ec5ac81b3ddaf2bc046f 100644 (file)
@@ -550,20 +550,6 @@ static int fimc_is_scc_queue_setup(struct vb2_queue *vbq,
 
        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)
@@ -667,12 +653,13 @@ static void fimc_is_scc_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 9e6dc37a865bcbdb19b06341500b8c2bc2ced6e7..c08a107501cddd8529228057ff7a35858f9a86c0 100644 (file)
@@ -559,21 +559,6 @@ static int fimc_is_scp_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -676,12 +661,13 @@ static void fimc_is_scp_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 880f279c54caea1c36f7315f9c13ebaa4c54720a..e53d90c88d0d9748a617e2865fe23f432ef38b8e 100644 (file)
@@ -659,6 +659,7 @@ static int fimc_is_ssx_video_s_ctrl(struct file *file, void *priv,
        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);
@@ -803,7 +804,12 @@ static int fimc_is_ssx_video_g_ctrl(struct file *file, void *priv,
        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) {
@@ -922,21 +928,6 @@ static int fimc_is_ssx_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -1038,12 +1029,13 @@ static void fimc_is_ssx_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 3f04deff088748e7d79b0424ae5d3c78d91817d3..5a7eea90cb04a2c1d0a7678be2d5def443398003 100644 (file)
@@ -695,21 +695,6 @@ static int fimc_is_ssxvc0_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -822,12 +807,13 @@ static void fimc_is_ssxvc0_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index db89e30f731d82103d7cf3aa0eeba46303040375..868afc5ca70a2c9914b85d4cdcccbbe3b4666a2b 100644 (file)
@@ -618,21 +618,6 @@ static int fimc_is_ssxvc1_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -745,12 +730,13 @@ static void fimc_is_ssxvc1_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 0d0f676afb692a450432a02d8ed07e39ace7faec..5016c8e84bd5b6e9c585dc3aff0502777466a64d 100644 (file)
@@ -618,21 +618,6 @@ static int fimc_is_ssxvc2_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -745,12 +730,13 @@ static void fimc_is_ssxvc2_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index c12b5fea80f2adb841d4d72290837802f2b80d3b..101640f43728dd62b39fb50dec99ea823bc098dd 100644 (file)
@@ -618,21 +618,6 @@ static int fimc_is_ssxvc3_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -745,12 +730,13 @@ static void fimc_is_ssxvc3_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 5b42f40514330a5929e72d540f72218b4ccaea4a..e5ca75d2780c38c5905dafcb9ce6312a2cf0512f 100644 (file)
@@ -364,10 +364,12 @@ static int fimc_is_vra_video_prepare(struct file *file, void *priv,
               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);
@@ -604,6 +606,10 @@ static int fimc_is_vra_queue_setup(struct vb2_queue *vbq,
        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);
@@ -613,6 +619,11 @@ static int fimc_is_vra_queue_setup(struct vb2_queue *vbq,
        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,
@@ -624,21 +635,6 @@ static int fimc_is_vra_queue_setup(struct vb2_queue *vbq,
        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)
 {
@@ -739,12 +735,13 @@ static void fimc_is_vra_buffer_finish(struct vb2_buffer *vb)
 
 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,
 };
index 4ee022055ce24b966c3bff5471bfe0d86d19082c..fbb704eff59fed10d24e60243239d81a63698918 100644 (file)
@@ -29,7 +29,6 @@
 #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,
@@ -64,7 +63,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -74,7 +73,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -84,7 +83,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -94,7 +93,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -103,7 +102,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -112,7 +111,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -121,7 +120,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -130,7 +129,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -139,7 +138,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -148,7 +147,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -157,7 +156,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -166,7 +165,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -175,7 +174,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -184,7 +183,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -193,7 +192,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -202,7 +201,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -211,7 +210,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -220,7 +219,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -229,7 +228,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -238,7 +237,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -247,7 +246,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -256,7 +255,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -265,7 +264,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -274,7 +273,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -283,7 +282,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -292,7 +291,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -301,7 +300,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -310,7 +309,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -319,7 +318,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -328,7 +327,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -337,7 +336,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -346,7 +345,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -355,7 +354,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -365,7 +364,7 @@ struct fimc_is_fmt fimc_is_formats[] = {
        }, {
                .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,
@@ -421,13 +420,11 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
 {
        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]);
@@ -437,14 +434,14 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                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:
@@ -452,7 +449,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                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:
@@ -461,7 +458,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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);
@@ -470,7 +467,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                                + 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:
@@ -479,7 +476,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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:
@@ -488,7 +485,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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:
@@ -498,7 +495,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                                + 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:
@@ -508,19 +505,19 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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);
@@ -538,7 +535,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                                }
                        }
                }
-               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);
@@ -555,7 +552,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                                }
                        }
                }
-               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);
@@ -572,37 +569,37 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                                }
                        }
                }
-               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);
@@ -610,7 +607,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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);
@@ -618,7 +615,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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);
@@ -628,7 +625,7 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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);
@@ -638,19 +635,19 @@ static void fimc_is_set_plane_size(struct fimc_is_frame_cfg *frame,
                        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),
@@ -705,7 +702,7 @@ static int queue_init(void *priv, struct vb2_queue *vbq,
        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))
@@ -798,6 +795,8 @@ static int fimc_is_queue_open(struct fimc_is_queue *queue,
        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);
 
@@ -813,6 +812,8 @@ static int fimc_is_queue_close(struct fimc_is_queue *queue)
        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;
@@ -843,6 +844,9 @@ static int fimc_is_queue_set_format_mplane(struct fimc_is_queue *queue,
        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] =
@@ -900,134 +904,73 @@ int fimc_is_queue_setup(struct fimc_is_queue *queue,
 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 */
@@ -1038,41 +981,47 @@ int fimc_is_queue_buffer_queue(struct fimc_is_queue *queue,
        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
        }
 
@@ -1084,16 +1033,24 @@ set_info:
                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);
@@ -1104,17 +1061,58 @@ int fimc_is_buffer_init(struct vb2_buffer *vb)
        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++;
@@ -1122,6 +1120,22 @@ int fimc_is_queue_prepare(struct vb2_buffer *vb)
        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;
@@ -1215,22 +1229,6 @@ p_err:
        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,
@@ -1768,6 +1766,25 @@ int fimc_is_video_prepare(struct file *file,
                        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);
@@ -1997,6 +2014,12 @@ int fimc_is_video_s_ctrl(struct file *file,
                }
                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;
@@ -2004,10 +2027,16 @@ int fimc_is_video_s_ctrl(struct file *file,
                }
 
                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);
index 1b238fcfbe336dc83a9734e659ace04ee1cbebbf..ee899aab1a8544fed10c8a9aac009d3bee3370d9 100644 (file)
@@ -166,6 +166,7 @@ enum fimc_is_video_dev_num {
        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 */
@@ -216,6 +217,8 @@ enum fimc_is_video_dev_num {
        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
 };
 
@@ -237,7 +240,9 @@ enum fimc_is_video_state {
 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 {
@@ -247,6 +252,7 @@ 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];
 };
@@ -282,7 +288,7 @@ struct fimc_is_queue {
        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 */
@@ -355,8 +361,9 @@ int fimc_is_queue_setup(struct fimc_is_queue *queue,
        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,
@@ -432,6 +439,8 @@ extern int fimc_is_31c_video_probe(void *data);
 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);
@@ -439,6 +448,7 @@ extern int fimc_is_i1s_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);
index 7fa92731bbb892fba5318d1410c7bc243759bc8c..876a5b5d7e68c439b10af65e407096ece069d1be 100644 (file)
@@ -22,8 +22,6 @@
 #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,
@@ -142,6 +140,7 @@ void fimc_is_scaler_set_wdma_format(void __iomem *base_addr, u32 hw_id, u32 outp
 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);
@@ -226,7 +225,7 @@ void fimc_is_scaler_set_djag_scaling_ratio(void __iomem *base_addr, u32 hratio,
 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);
@@ -257,6 +256,10 @@ void fimc_is_scaler_set_ds_scaling_ratio(void __iomem *base_addr, u32 hratio, u3
 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);
index e8447eb1245ab7605743a3614cb73ff490da18d1..c2580ee5a589f8ae305910dac14eb584eebd0ee9 100644 (file)
@@ -1726,6 +1726,26 @@ void fimc_is_scaler_set_flip_mode(void __iomem *base_addr, u32 output_id, u32 fl
        }
 }
 
+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;
@@ -3793,7 +3813,7 @@ void fimc_is_scaler_set_djag_tunning_param(void __iomem *base_addr, const struct
        /* 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 */
 }
@@ -3952,7 +3972,7 @@ void fimc_is_scaler_set_ds_gamma_table_enable(void __iomem *base_addr, u32 ds_ga
 }
 
 /* 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;
 
@@ -3961,7 +3981,7 @@ void fimc_is_scaler_set_lfro_mode_enable(void __iomem *base_addr, u32 lfro_enabl
        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;
index eb841263e60a8758e5e7255be35a0091cce386fd..05574845acc85217726ff516f74f8c86ed899abc 100644 (file)
@@ -2480,6 +2480,34 @@ void fimc_is_scaler_set_flip_mode(void __iomem *base_addr, u32 output_id, u32 fl
        }
 }
 
+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;
@@ -3974,12 +4002,12 @@ void fimc_is_scaler_set_ds_gamma_table_enable(void __iomem *base_addr, u32 ds_ga
  */
 
 /* 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;
index e83e81ece8da532ba9778b5f5dcfbac64ce4bf53..c7f66fbec075632193703a886da6b9c15bc53d6c 100644 (file)
@@ -1292,7 +1292,7 @@ void fimc_is_scaler_set_poly_scaler_coef(void __iomem *base_addr, u32 output_id,
        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
@@ -1626,7 +1626,7 @@ void fimc_is_scaler_set_post_scaler_coef(void __iomem *base_addr, u32 output_id,
        /* 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
@@ -2444,6 +2444,34 @@ void fimc_is_scaler_set_flip_mode(void __iomem *base_addr, u32 output_id, u32 fl
        }
 }
 
+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;
@@ -2746,84 +2774,83 @@ void fimc_is_scaler_set_rdma_2bit_addr(void __iomem *base_addr,
        }
 }
 
-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;
 
@@ -2840,13 +2867,13 @@ void fimc_is_scaler_set_wdma_addr(void __iomem *base_addr, u32 output_id,
 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;
 
@@ -2857,9 +2884,9 @@ void fimc_is_scaler_set_wdma_2bit_addr(void __iomem *base_addr, u32 output_id,
 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;
 
@@ -2886,9 +2913,9 @@ void fimc_is_scaler_clear_rdma_addr(void __iomem *base_addr)
 
 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;
 
@@ -3492,13 +3519,17 @@ void fimc_is_scaler_set_djag_tunning_param(void __iomem *base_addr, const struct
        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);
@@ -3973,15 +4004,58 @@ void fimc_is_scaler_set_ds_gamma_table_enable(void __iomem *base_addr, u32 ds_ga
  */
 
 /* 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)
@@ -4165,7 +4239,7 @@ void fimc_is_scaler_dump(void __iomem *base_addr)
        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);
index 3712340afd3e353ff8c2c5604075fabbd32b4e1a..ae62a495d3522bd750468bc65f22d95d2b72af91 100644 (file)
@@ -72,6 +72,7 @@ static int __nocfi fimc_is_hw_3aa_open(struct fimc_is_hw_ip *hw_ip, u32 instance
 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);
@@ -141,6 +142,7 @@ static int fimc_is_hw_3aa_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
 
        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);
 
@@ -156,6 +158,9 @@ int fimc_is_hw_3aa_mode_change(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong
        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;
@@ -182,6 +187,15 @@ int fimc_is_hw_3aa_mode_change(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong
                } 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);
@@ -286,6 +300,7 @@ static int fimc_is_hw_3aa_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
        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);
@@ -303,7 +318,8 @@ static int fimc_is_hw_3aa_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_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);
@@ -314,6 +330,7 @@ static int fimc_is_hw_3aa_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
 
        param = &region->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;
@@ -351,11 +368,12 @@ static int fimc_is_hw_3aa_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
                        hindex |= HIGHBIT_OF(PARAM_3AA_VDMA2_OUTPUT);
                        hindex |= HIGHBIT_OF(PARAM_3AA_FDDMA_OUTPUT);
                        hindex |= HIGHBIT_OF(PARAM_3AA_MRGDMA_OUTPUT);
+                       param_region = &region->parameter;
                }
        }
 
        fimc_is_hw_3aa_update_param(hw_ip,
-               region, param_set,
+               param_region, param_set,
                lindex, hindex, frame->instance);
 
        /* DMA settings */
@@ -365,7 +383,8 @@ static int fimc_is_hw_3aa_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
        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);
@@ -495,7 +514,7 @@ config:
                        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);
 
@@ -528,7 +547,7 @@ static int fimc_is_hw_3aa_set_param(struct fimc_is_hw_ip *hw_ip, struct is_regio
        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, &region->parameter, param_set, lindex, hindex, instance);
 
        ret = fimc_is_lib_isp_set_param(hw_ip, &hw_3aa->lib[instance], param_set);
        if (ret)
@@ -537,19 +556,19 @@ static int fimc_is_hw_3aa_set_param(struct fimc_is_hw_ip *hw_ip, struct is_regio
        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 = &region->parameter.taa;
+       param = &param_region->taa;
        param_set->instance_id = instance;
 
        if (lindex & LOWBIT_OF(PARAM_SENSOR_CONFIG)) {
-               memcpy(&param_set->sensor_config, &region->parameter.sensor.config,
+               memcpy(&param_set->sensor_config, &param_region->sensor.config,
                        sizeof(struct param_sensor_config));
        }
 
@@ -610,13 +629,24 @@ static int fimc_is_hw_3aa_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_f
        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;
 
@@ -629,12 +659,21 @@ static int fimc_is_hw_3aa_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_i
                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);
@@ -668,7 +707,7 @@ static int fimc_is_hw_3aa_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_i
 
        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);
        }
 
@@ -692,12 +731,6 @@ static int fimc_is_hw_3aa_load_setfile(struct fimc_is_hw_ip *hw_ip, u32 instance
 
        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;
@@ -754,12 +787,6 @@ static int fimc_is_hw_3aa_apply_setfile(struct fimc_is_hw_ip *hw_ip, u32 scenari
 
        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;
@@ -790,21 +817,26 @@ static int fimc_is_hw_3aa_apply_setfile(struct fimc_is_hw_ip *hw_ip, u32 scenari
        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;
 }
@@ -819,12 +851,6 @@ static int fimc_is_hw_3aa_delete_setfile(struct fimc_is_hw_ip *hw_ip, u32 instan
 
        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;
index 2ca2bf154756e53c809dfe171561e9a791605a8b..0fc03cb71918bad7a584e409210ec440ff64c8b7 100644 (file)
@@ -24,8 +24,7 @@ struct fimc_is_hw_3aa {
 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
index c08fe1177ee7f3af77bcf4676c804bb5c52d057f..271711d91e3f46fc819a509b3d5021fedd54204d 100644 (file)
@@ -286,11 +286,9 @@ static void _fimc_is_hardware_sfr_dump(struct fimc_is_hw_ip *hw_ip, bool flag_pr
        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;
@@ -396,6 +394,7 @@ void fimc_is_hardware_flush_frame(struct fimc_is_hw_ip *hw_ip,
                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);
@@ -423,6 +422,9 @@ u32 get_group_id_from_hw_ip(u32 hw_id)
        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;
@@ -473,6 +475,9 @@ u32 get_hw_id_from_group(u32 group_id)
        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;
@@ -518,10 +523,8 @@ static inline void fimc_is_hardware_fill_frame_info(u32 instance,
 {
        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;
@@ -771,6 +774,20 @@ int fimc_is_hardware_probe(struct fimc_is_hardware *hardware,
        }
 #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);
@@ -919,7 +936,7 @@ int fimc_is_hardware_probe(struct fimc_is_hardware *hardware,
                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);
@@ -1002,6 +1019,10 @@ int fimc_is_hardware_shot(struct fimc_is_hardware *hardware, u32 instance,
 
        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--) {
@@ -1010,7 +1031,8 @@ int fimc_is_hardware_shot(struct fimc_is_hardware *hardware, u32 instance,
                        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];
@@ -1030,11 +1052,12 @@ int fimc_is_hardware_shot(struct fimc_is_hardware *hardware, u32 instance,
                        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;
@@ -1049,6 +1072,24 @@ int fimc_is_hardware_shot(struct fimc_is_hardware *hardware, u32 instance,
                        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;
 }
 
@@ -1085,6 +1126,9 @@ int fimc_is_hardware_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
                        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:
@@ -1180,13 +1224,17 @@ int fimc_is_hardware_grp_shot(struct fimc_is_hardware *hardware, u32 instance,
        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);
@@ -1215,10 +1263,10 @@ int fimc_is_hardware_grp_shot(struct fimc_is_hardware *hardware, u32 instance,
 #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);
@@ -1274,6 +1322,9 @@ int fimc_is_hardware_grp_shot(struct fimc_is_hardware *hardware, u32 instance,
        /* 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);
@@ -1292,7 +1343,7 @@ int fimc_is_hardware_grp_shot(struct fimc_is_hardware *hardware, u32 instance,
                        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;
                }
@@ -1333,7 +1384,7 @@ int fimc_is_hardware_grp_shot(struct fimc_is_hardware *hardware, u32 instance,
                        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);
@@ -1355,6 +1406,7 @@ int make_internal_shot(struct fimc_is_hw_ip *hw_ip, u32 instance, u32 fcount,
        int ret = 0;
        int i = 0;
        struct fimc_is_frame *frame;
+       u32 shot_timeout;
 
        FIMC_BUG(!hw_ip);
        FIMC_BUG(!framemgr);
@@ -1376,10 +1428,8 @@ int make_internal_shot(struct fimc_is_hw_ip *hw_ip, u32 instance, u32 fcount,
        }
        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;
@@ -1401,7 +1451,8 @@ int make_internal_shot(struct fimc_is_hw_ip *hw_ip, u32 instance, u32 fcount,
        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;
 }
@@ -1639,6 +1690,7 @@ int fimc_is_hardware_sensor_start(struct fimc_is_hardware *hardware, u32 instanc
        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);
 
@@ -1665,8 +1717,10 @@ int fimc_is_hardware_sensor_start(struct fimc_is_hardware *hardware, u32 instanc
                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);
@@ -2070,7 +2124,7 @@ int fimc_is_hardware_open(struct fimc_is_hardware *hardware, u32 hw_id,
                }
 
                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;
@@ -2430,15 +2484,17 @@ exit:
        /* 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);
@@ -2674,7 +2730,7 @@ int fimc_is_hardware_frame_ndone(struct fimc_is_hw_ip *ldr_hw_ip,
                        }
 
                        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;
        }
index 4390c236252c9f28cb46cd869c423eaa0e05c46e..150132ecc908411c98e45785fa3ce9ccdeae8f92 100644 (file)
@@ -73,19 +73,20 @@ enum v_enum {
 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,
@@ -124,6 +125,7 @@ enum fimc_is_hw_state {
        HW_MCS_YSUM_CFG,
        HW_MCS_DS_CFG,
        HW_OVERFLOW_RECOVERY,
+       HW_PAFSTAT_RDMA_CFG,
        HW_END
 };
 
@@ -295,7 +297,7 @@ struct fimc_is_hw_ip {
        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;
@@ -321,6 +323,9 @@ struct fimc_is_hw_ip {
        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...)   \
@@ -378,8 +383,8 @@ struct fimc_is_hardware {
        /* 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;
 
index 47d0ea3e928ba0c3ccffb0e6bd4762b5c94c94c9..6e2f47844b58fa33d79fd2da25ef5629f0a15e70 100644 (file)
@@ -75,6 +75,7 @@ static int fimc_is_hw_dcp_open(struct fimc_is_hw_ip *hw_ip, u32 instance,
 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);
@@ -128,7 +129,7 @@ static int fimc_is_hw_dcp_deinit(struct fimc_is_hw_ip *hw_ip, u32 instance)
        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;
@@ -143,6 +144,7 @@ int fimc_is_hw_dcp_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
 
        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);
 
@@ -151,7 +153,7 @@ int fimc_is_hw_dcp_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
        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;
 
@@ -170,7 +172,7 @@ int fimc_is_hw_dcp_enable(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong hw_ma
        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;
@@ -264,7 +266,67 @@ static void fimc_is_hw_dcp_check_param(struct dcp_param *param,
        }
 }
 
-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(&param_set->control, &param->control,
+                       sizeof(struct param_control));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_MASTER))
+               || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_MASTER))) {
+               memcpy(&param_set->dma_input_m, &param->dma_input_m,
+                       sizeof(struct param_dma_input));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_SLAVE))
+               || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_SLAVE))) {
+               memcpy(&param_set->dma_input_s, &param->dma_input_s,
+                       sizeof(struct param_dma_input));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_MASTER))
+               || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_MASTER))) {
+               memcpy(&param_set->dma_output_m, &param->dma_output_m,
+                       sizeof(struct param_dma_output));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_SLAVE))
+               || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_SLAVE))) {
+               memcpy(&param_set->dma_output_s, &param->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(&param_set->dma_output_m_ds, &param->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(&param_set->dma_output_s_ds, &param->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(&param_set->dma_input_disparity, &param->dma_input_disparity,
+                       sizeof(struct param_dma_output));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))
+               || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))) {
+               memcpy(&param_set->dma_output_disparity, &param->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;
@@ -328,7 +390,7 @@ int fimc_is_hw_dcp_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame
        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);
@@ -448,7 +510,7 @@ int fimc_is_hw_dcp_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *frame
        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;
@@ -483,67 +545,7 @@ int fimc_is_hw_dcp_set_param(struct fimc_is_hw_ip *hw_ip, struct is_region *regi
        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(&param_set->control, &param->control,
-                       sizeof(struct param_control));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_MASTER))
-               || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_MASTER))) {
-               memcpy(&param_set->dma_input_m, &param->dma_input_m,
-                       sizeof(struct param_dma_input));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_DCP_INPUT_SLAVE))
-               || (hindex & HIGHBIT_OF(PARAM_DCP_INPUT_SLAVE))) {
-               memcpy(&param_set->dma_input_s, &param->dma_input_s,
-                       sizeof(struct param_dma_input));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_MASTER))
-               || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_MASTER))) {
-               memcpy(&param_set->dma_output_m, &param->dma_output_m,
-                       sizeof(struct param_dma_output));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_SLAVE))
-               || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_SLAVE))) {
-               memcpy(&param_set->dma_output_s, &param->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(&param_set->dma_output_m_ds, &param->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(&param_set->dma_output_s_ds, &param->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(&param_set->dma_input_disparity, &param->dma_input_disparity,
-                       sizeof(struct param_dma_output));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))
-               || (hindex & HIGHBIT_OF(PARAM_DCP_OUTPUT_DISPARITY))) {
-               memcpy(&param_set->dma_output_disparity, &param->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;
@@ -565,7 +567,7 @@ int fimc_is_hw_dcp_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame *f
        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;
@@ -614,7 +616,7 @@ int fimc_is_hw_dcp_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
        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;
 
@@ -631,7 +633,7 @@ int fimc_is_hw_dcp_load_setfile(struct fimc_is_hw_ip *hw_ip, u32 instance, ulong
        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;
@@ -666,7 +668,7 @@ int fimc_is_hw_dcp_apply_setfile(struct fimc_is_hw_ip *hw_ip, u32 scenario,
        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;
@@ -687,7 +689,7 @@ int fimc_is_hw_dcp_delete_setfile(struct fimc_is_hw_ip *hw_ip, u32 instance,
        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;
 }
index 7b04c205255802bfd90fbcc8a4a5a6e01391b1a2..b23fc53e0fe2c7ca5dc9cc7ee90b701254515fb7 100644 (file)
@@ -23,6 +23,4 @@ struct fimc_is_hw_dcp {
 
 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
index eab7c77a2a96275c15b46533e541a8eee5fd97df..3e9e63b8c07f21b37f25a642b3798d201e612e14 100644 (file)
@@ -108,6 +108,11 @@ int fimc_is_hw_mcsc_update_djag_register(struct fimc_is_hw_ip *hw_ip,
        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);
@@ -120,9 +125,13 @@ int fimc_is_hw_mcsc_update_djag_register(struct fimc_is_hw_ip *hw_ip,
 
        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,
@@ -139,6 +148,12 @@ int fimc_is_hw_mcsc_update_djag_register(struct fimc_is_hw_ip *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;
 
@@ -152,6 +167,12 @@ int fimc_is_hw_mcsc_update_djag_register(struct fimc_is_hw_ip *hw_ip,
                                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
                }
        }
 
@@ -204,7 +225,16 @@ int fimc_is_hw_mcsc_update_djag_register(struct fimc_is_hw_ip *hw_ip,
 #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);
 
index f0bd0ba8a617f5fdad61e413ce14cb45dfb2d247..7320852965a4831437e9d3b60b478be8a8e6b513 100644 (file)
@@ -43,9 +43,6 @@ static inline void copy_lens_udm(camera2_uctl_t *uctl, camera2_udm_t *udm)
 {
        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)
index 0df67a39d2830c5aeaa7a4c7b47355362a546db2..b4f36b15fe6e707729ce43cfebade3511c3afcb0 100644 (file)
@@ -74,6 +74,7 @@ static int __nocfi fimc_is_hw_isp_open(struct fimc_is_hw_ip *hw_ip, u32 instance
 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);
@@ -143,6 +144,7 @@ static int fimc_is_hw_isp_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
 
        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);
 
@@ -227,6 +229,9 @@ int fimc_is_hw_isp_set_yuv_range(struct fimc_is_hw_ip *hw_ip,
        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))
@@ -276,6 +281,45 @@ int fimc_is_hw_isp_set_yuv_range(struct fimc_is_hw_ip *hw_ip,
        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 = &region->parameter.isp;
+       param_set->instance_id = instance;
+
+       /* check input */
+       if (lindex & LOWBIT_OF(PARAM_ISP_OTF_INPUT)) {
+               memcpy(&param_set->otf_input, &param->otf_input,
+                       sizeof(struct param_otf_input));
+       }
+
+       if (lindex & LOWBIT_OF(PARAM_ISP_VDMA1_INPUT)) {
+               memcpy(&param_set->dma_input, &param->vdma1_input,
+                       sizeof(struct param_dma_input));
+       }
+
+       /* check output*/
+       if (lindex & LOWBIT_OF(PARAM_ISP_OTF_OUTPUT)) {
+               memcpy(&param_set->otf_output, &param->otf_output,
+                       sizeof(struct param_otf_output));
+       }
+
+       if (lindex & LOWBIT_OF(PARAM_ISP_VDMA4_OUTPUT)) {
+               memcpy(&param_set->dma_output_chunk, &param->vdma4_output,
+                       sizeof(struct param_dma_output));
+       }
+
+       if (lindex & LOWBIT_OF(PARAM_ISP_VDMA5_OUTPUT)) {
+               memcpy(&param_set->dma_output_yuv, &param->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)
 {
@@ -347,7 +391,8 @@ static int fimc_is_hw_isp_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
        /* 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);
@@ -426,13 +471,13 @@ config:
                           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,
+                               &region->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);
 
@@ -469,45 +514,6 @@ static int __nocfi fimc_is_hw_isp_set_param(struct fimc_is_hw_ip *hw_ip, struct
        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 = &region->parameter.isp;
-       param_set->instance_id = instance;
-
-       /* check input */
-       if (lindex & LOWBIT_OF(PARAM_ISP_OTF_INPUT)) {
-               memcpy(&param_set->otf_input, &param->otf_input,
-                       sizeof(struct param_otf_input));
-       }
-
-       if (lindex & LOWBIT_OF(PARAM_ISP_VDMA1_INPUT)) {
-               memcpy(&param_set->dma_input, &param->vdma1_input,
-                       sizeof(struct param_dma_input));
-       }
-
-       /* check output*/
-       if (lindex & LOWBIT_OF(PARAM_ISP_OTF_OUTPUT)) {
-               memcpy(&param_set->otf_output, &param->otf_output,
-                       sizeof(struct param_otf_output));
-       }
-
-       if (lindex & LOWBIT_OF(PARAM_ISP_VDMA4_OUTPUT)) {
-               memcpy(&param_set->dma_output_chunk, &param->vdma4_output,
-                       sizeof(struct param_dma_output));
-       }
-
-       if (lindex & LOWBIT_OF(PARAM_ISP_VDMA5_OUTPUT)) {
-               memcpy(&param_set->dma_output_yuv, &param->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)
 {
@@ -527,6 +533,14 @@ static int fimc_is_hw_isp_get_meta(struct fimc_is_hw_ip *hw_ip, struct fimc_is_f
        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;
 }
 
@@ -534,7 +548,7 @@ static int fimc_is_hw_isp_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_i
        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);
@@ -543,10 +557,12 @@ static int fimc_is_hw_isp_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_i
        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);
@@ -568,7 +584,7 @@ static int fimc_is_hw_isp_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_i
 
        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);
        }
 
index 86d11d8cdb27506887a34e9faa0f27db3eae9487..ec9f4297ed53e65cc6a167005ddfba4118f3d7e5 100644 (file)
@@ -23,7 +23,4 @@ struct fimc_is_hw_isp {
 
 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
index 5013042ca731c5e070600b3397bf4b1444e0e5d1..d20d47193fc58a60267a403e3ec84c1d79b19545 100644 (file)
@@ -201,6 +201,7 @@ static int fimc_is_hw_mcsc_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
                return 0;
 
        vfree(hw_ip->priv_info);
+       hw_ip->priv_info = NULL;
 
        clear_bit(HW_OPEN, &hw_ip->state);
 
index 751f82fc4481bc63dbf0c82ffd8bbc56184e8782..80145323a1943147c97fea2b87e62afc16cadeed 100644 (file)
@@ -15,6 +15,9 @@
 #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)
@@ -304,15 +307,15 @@ static int fimc_is_hw_mcsc_open(struct fimc_is_hw_ip *hw_ip, u32 instance,
        /* 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;
@@ -328,6 +331,7 @@ static int fimc_is_hw_mcsc_open(struct fimc_is_hw_ip *hw_ip, u32 instance,
 
 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);
@@ -397,6 +401,7 @@ static int fimc_is_hw_mcsc_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
                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);
 
@@ -553,7 +558,8 @@ static int fimc_is_hw_mcsc_rdma_cfg(struct fimc_is_hw_ip *hw_ip, struct fimc_is_
 
        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",
@@ -607,8 +613,7 @@ static u32 *hw_mcsc_get_target_addr(u32 out_id, struct fimc_is_frame *frame)
                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;
        }
 
@@ -636,12 +641,38 @@ static void hw_mcsc_set_wdma_addr(struct fimc_is_hw_ip *hw_ip, u32 *wdma_addr,
                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;
 
@@ -651,84 +682,53 @@ static void fimc_is_hw_mcsc_wdma_cfg(struct fimc_is_hw_ip *hw_ip, struct fimc_is
        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);
                }
        }
 }
@@ -829,7 +829,7 @@ config:
 
        /* 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);
@@ -2688,11 +2688,148 @@ static void fimc_is_hw_mcsc_size_dump(struct fimc_is_hw_ip *hw_ip)
        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 = &region->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);
@@ -2708,10 +2845,20 @@ static int fimc_is_hw_mcsc_get_meta(struct fimc_is_hw_ip *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;
 }
 
@@ -2815,3 +2962,30 @@ int fimc_is_hw_mcsc_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface
 
        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;
+       }
+}
index a4484c104bd04ca67e08d0990f3cd2d2df581a52..4663eac738117d92dfc8de6a8026bfd6b2f91de2 100644 (file)
        (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,
@@ -142,6 +161,9 @@ struct hw_mcsc_setfile {
 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;
@@ -157,9 +179,13 @@ struct fimc_is_hw_mcsc_cap {
        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;
@@ -171,7 +197,8 @@ struct fimc_is_hw_mcsc {
        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;
@@ -198,6 +225,8 @@ struct fimc_is_hw_mcsc {
 
 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);
@@ -245,7 +274,10 @@ int fimc_is_hw_mcsc_update_tdnr_register(struct fimc_is_hw_ip *hw_ip,
 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,
@@ -262,8 +294,6 @@ int fimc_is_hw_mcsc_update_ysum_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) \
index dbe06713427097180da8c83f3d278fb1ef814bb2..fc81c3fc080e13f51a16275d115cd75afcd689df 100644 (file)
@@ -21,21 +21,27 @@ static int fimc_is_hw_paf_handle_interrupt(u32 id, void *context)
        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);
@@ -48,16 +54,20 @@ static int fimc_is_hw_paf_handle_interrupt(u32 id, void *context)
        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;
 }
@@ -87,6 +97,7 @@ static int fimc_is_hw_paf_open(struct fimc_is_hw_ip *hw_ip, u32 instance,
 
        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;
@@ -95,6 +106,7 @@ static int fimc_is_hw_paf_open(struct fimc_is_hw_ip *hw_ip, u32 instance,
        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,
@@ -141,7 +153,9 @@ static int fimc_is_hw_paf_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
 {
        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);
 
@@ -149,13 +163,16 @@ static int fimc_is_hw_paf_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
                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);
 
@@ -211,6 +228,7 @@ static int fimc_is_hw_paf_disable(struct fimc_is_hw_ip *hw_ip, u32 instance, ulo
 
        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;
 }
@@ -224,8 +242,10 @@ static int fimc_is_hw_paf_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
        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);
@@ -277,6 +297,7 @@ static int fimc_is_hw_paf_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_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;
 
@@ -284,8 +305,11 @@ static int fimc_is_hw_paf_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
                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);
@@ -335,9 +359,11 @@ int fimc_is_hw_paf_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *r
        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);
@@ -352,6 +378,7 @@ int fimc_is_hw_paf_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *r
        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;
@@ -364,6 +391,7 @@ int fimc_is_hw_paf_update_param(struct fimc_is_hw_ip *hw_ip, struct is_region *r
        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;
 }
@@ -381,6 +409,7 @@ static int fimc_is_hw_paf_frame_ndone(struct fimc_is_hw_ip *hw_ip, struct fimc_i
        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;
 }
@@ -435,6 +464,7 @@ int fimc_is_hw_paf_probe(struct fimc_is_hw_ip *hw_ip, struct fimc_is_interface *
        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);
 
index 36971c7f9f518e140ee716c9e71ad883e1489339..7d8880b777e72ed0f13d3faa340f41f9750d2b06 100644 (file)
@@ -12,6 +12,7 @@
 #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 {
index 218ca9dd4bee9920276039a3592562090be4433e..9ea4157f1d81cdc520406ac5586d8ba81dfb85de 100644 (file)
@@ -863,7 +863,7 @@ static int fimc_is_hw_mcsc_cfg_tdnr_tuning_param(struct fimc_is_hw_ip *hw_ip,
 #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
 
@@ -885,7 +885,7 @@ static int fimc_is_hw_mcsc_cfg_tdnr_tuning_param(struct fimc_is_hw_ip *hw_ip,
        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 */
@@ -949,7 +949,7 @@ config:
                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;
 }
@@ -985,10 +985,12 @@ int fimc_is_hw_mcsc_update_tdnr_register(struct fimc_is_hw_ip *hw_ip,
        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,
index 3f7eade70d491abe1d6b3da6d785ff0a5e862832..5e7038880592ac415864ecf1dd3dbbfe7565ae1f 100644 (file)
@@ -249,6 +249,46 @@ static void fimc_is_hw_tpu_check_param(struct tpu_param *param,
        }
 }
 
+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(&param_set->control, &param->control,
+                       sizeof(struct param_control));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_TPU_CONFIG))
+               || (hindex & HIGHBIT_OF(PARAM_TPU_CONFIG))) {
+               memcpy(&param_set->config, &param->config,
+                       sizeof(struct param_tpu_config));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_INPUT))
+               || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_INPUT))) {
+               memcpy(&param_set->otf_input, &param->otf_input,
+                       sizeof(struct param_otf_input));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_INPUT))
+               || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_INPUT))) {
+               memcpy(&param_set->dma_input, &param->dma_input,
+                       sizeof(struct param_dma_input));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_OUTPUT))
+               || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_OUTPUT))) {
+               memcpy(&param_set->otf_output, &param->otf_output,
+                       sizeof(struct param_otf_output));
+       }
+
+       if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_OUTPUT))
+               || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_OUTPUT))) {
+               memcpy(&param_set->dma_output, &param->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)
 {
@@ -316,7 +356,8 @@ static int fimc_is_hw_tpu_shot(struct fimc_is_hw_ip *hw_ip, struct fimc_is_frame
        /* 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);
@@ -406,46 +447,6 @@ static int fimc_is_hw_tpu_set_param(struct fimc_is_hw_ip *hw_ip, struct is_regio
        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(&param_set->control, &param->control,
-                       sizeof(struct param_control));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_TPU_CONFIG))
-               || (hindex & HIGHBIT_OF(PARAM_TPU_CONFIG))) {
-               memcpy(&param_set->config, &param->config,
-                       sizeof(struct param_tpu_config));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_INPUT))
-               || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_INPUT))) {
-               memcpy(&param_set->otf_input, &param->otf_input,
-                       sizeof(struct param_otf_input));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_INPUT))
-               || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_INPUT))) {
-               memcpy(&param_set->dma_input, &param->dma_input,
-                       sizeof(struct param_dma_input));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_TPU_OTF_OUTPUT))
-               || (hindex & HIGHBIT_OF(PARAM_TPU_OTF_OUTPUT))) {
-               memcpy(&param_set->otf_output, &param->otf_output,
-                       sizeof(struct param_otf_output));
-       }
-
-       if ((lindex & LOWBIT_OF(PARAM_TPU_DMA_OUTPUT))
-               || (hindex & HIGHBIT_OF(PARAM_TPU_DMA_OUTPUT))) {
-               memcpy(&param_set->dma_output, &param->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)
 {
index 7c405c2359f26a92efb287ef5aab656daf405e50..e2aea41c706e80702f503da9706ad41c20b34d32 100644 (file)
@@ -23,6 +23,4 @@ struct fimc_is_hw_tpu {
 
 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
index ac0f10bbac362b2960a0050624f5d4f8ced79da6..1f41426a027cfa5758927e46b4f6853ec3cfca03 100644 (file)
@@ -59,7 +59,7 @@ struct ref_ni hw_mcsc_find_ni_idx_for_cac(struct fimc_is_hw_ip *hw_ip,
                        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;
@@ -146,14 +146,14 @@ int fimc_is_hw_mcsc_update_cac_register(struct fimc_is_hw_ip *hw_ip,
        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);
@@ -161,15 +161,15 @@ int fimc_is_hw_mcsc_update_cac_register(struct fimc_is_hw_ip *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,
@@ -180,6 +180,12 @@ int fimc_is_hw_mcsc_update_cac_register(struct fimc_is_hw_ip *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];
 
@@ -187,20 +193,20 @@ int fimc_is_hw_mcsc_update_cac_register(struct fimc_is_hw_ip *hw_ip,
 #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;
 }
@@ -225,6 +231,9 @@ struct ref_ni hw_mcsc_find_ni_idx_for_uvsp(struct fimc_is_hw_ip *hw_ip,
                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;
@@ -241,7 +250,7 @@ struct ref_ni hw_mcsc_find_ni_idx_for_uvsp(struct fimc_is_hw_ip *hw_ip,
        }
 
        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;
@@ -470,19 +479,19 @@ void hw_mcsc_calc_uvsp_radial_ctrl(struct fimc_is_hw_ip *hw_ip,
        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);
@@ -497,8 +506,8 @@ void hw_mcsc_calc_uvsp_radial_ctrl(struct fimc_is_hw_ip *hw_ip,
        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);
 }
@@ -516,6 +525,9 @@ int fimc_is_hw_mcsc_update_uvsp_register(struct fimc_is_hw_ip *hw_ip,
        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);
@@ -530,28 +542,35 @@ int fimc_is_hw_mcsc_update_uvsp_register(struct fimc_is_hw_ip *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;
 }
index 9209ad4519de5ceaf8afb91b2521163fef5b09bb..88a244b1050b95f8bbc004518c13c169895b2f27 100644 (file)
@@ -198,7 +198,7 @@ static int fimc_is_hw_vra_ch1_handle_interrupt(u32 id, void *context)
                                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
@@ -211,10 +211,11 @@ static int fimc_is_hw_vra_ch1_handle_interrupt(u32 id, void *context)
                                        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)",
@@ -247,20 +248,20 @@ static int fimc_is_hw_vra_ch1_handle_interrupt(u32 id, void *context)
                        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,
@@ -279,6 +280,23 @@ static int fimc_is_hw_vra_ch1_handle_interrupt(u32 id, void *context)
        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)
 {
@@ -343,7 +361,7 @@ static int __nocfi fimc_is_hw_vra_open(struct fimc_is_hw_ip *hw_ip, u32 instance
                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
 
@@ -376,6 +394,7 @@ err_vra_frame_work_init:
                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);
@@ -457,6 +476,7 @@ static int fimc_is_hw_vra_close(struct fimc_is_hw_ip *hw_ip, u32 instance)
        }
 
        vfree(hw_ip->priv_info);
+       hw_ip->priv_info = NULL;
        frame_manager_close(hw_ip->framemgr);
        frame_manager_close(hw_ip->framemgr_late);
 
@@ -542,6 +562,57 @@ static int fimc_is_hw_vra_disable(struct fimc_is_hw_ip *hw_ip, u32 instance,
        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)
 {
@@ -650,11 +721,15 @@ new_frame:
        /* 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);
@@ -725,56 +800,6 @@ static int fimc_is_hw_vra_set_param(struct fimc_is_hw_ip *hw_ip,
        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)
 {
@@ -1056,23 +1081,6 @@ static int fimc_is_hw_vra_delete_setfile(struct fimc_is_hw_ip *hw_ip, u32 instan
        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)
 {
index b76241f5650fe815aaa70810084cc23f5731ce31..90dcb57a2871d17afa18a349c3b4d028245e2ae0 100644 (file)
@@ -46,7 +46,4 @@ struct fimc_is_hw_vra {
 
 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
index 25e081df517807bccd1083d66d16c1f9a99ab68f..cf178f78ee276866579690c5ad06c45b8e2e791c 100644 (file)
@@ -117,11 +117,20 @@ struct exynos_platform_fimc_is_module {
        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];
index 63206a1cd7ea0eafe3479b893ef6b0eb4a57d7d3..eff0551eec42e4c7e1f8455a7ae51ae1dd04669d 100644 (file)
@@ -49,16 +49,22 @@ enum exynos_sensor_channel {
 };
 
 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 {
@@ -100,6 +106,13 @@ 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,
@@ -123,6 +136,7 @@ enum exynos_sensor_id {
        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,
@@ -132,6 +146,9 @@ enum exynos_sensor_id {
        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,
@@ -167,6 +184,9 @@ enum actuator_name {
        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,
 };
@@ -185,6 +205,7 @@ enum flash_drv_name {
        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,
 };
@@ -207,16 +228,33 @@ enum preprocessor_name {
 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,
@@ -299,12 +337,14 @@ struct sensor_open_extended {
        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 {
@@ -324,6 +364,9 @@ 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,
index d4fed371dfb2d97b4c48cf22371da011dcdc0abd..65699d0af4ee7edaaa2c47895bff1472ce561f80 100644 (file)
 
 #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/"
@@ -47,7 +38,6 @@
 #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"
@@ -61,6 +51,8 @@
 #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 */
index 9249fb4993b1b76ce6004aeea29da236175296a7..5be0e191c53498cfae7a9b6b5c1247c6841ab674 100644 (file)
@@ -129,11 +129,14 @@ enum is_subscenario_id {
        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 */
@@ -163,6 +166,7 @@ enum is_scenario_is {
        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 {
index 24ac1a7bfb166f148386d6e84865999a6032ccd4..b15729d82de41be345994cf1d3b96668fa88cfe8 100644 (file)
@@ -17,6 +17,7 @@ enum camera_pixel_size {
        CAMERA_PIXEL_SIZE_10BIT,
        CAMERA_PIXEL_SIZE_PACKED_10BIT,
        CAMERA_PIXEL_SIZE_8_2BIT,
+       CAMERA_PIXEL_SIZE_12BIT_COMP
 };
 
 #endif
index 58672bc54c8c42acb0465716c2eb07ce9a7740b6..6021db6983b5f8ceaa433065e009f7b956ff0491 100644 (file)
@@ -42,6 +42,8 @@ int fimc_is_sensor_read8(struct i2c_client *client,
        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,
index 9603ce7d59164460dadbc952b13f00bfaea8f249..e35faf02837758df1e79f05df0fa35b2176c5552 100644 (file)
@@ -281,7 +281,7 @@ void csi_hw_s_dma_common_pattern_disable(u32 __iomem *base_reg);
 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,
index 8ebd8f442d07b44b35d713bc489a427b300c24cf..3ccc0fd0d61183270d85099964d34a35342d0f31 100644 (file)
@@ -728,7 +728,8 @@ enum aa_capture_intent {
        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,
 };
@@ -793,6 +794,9 @@ enum aa_scene_mode {
        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 {
@@ -1069,7 +1073,9 @@ struct camera2_aa_ctl {
        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 {
@@ -1113,13 +1119,16 @@ 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 {
@@ -1207,6 +1216,15 @@ struct camera2_reprocess_sm {
        uint32_t        maxCaptureStall;
 };
 
+struct camera2_faceBeauty_ctl
+{
+       int32_t         strength;
+};
+
+struct camera2_faceBeauty_dm
+{
+       int32_t         strength;
+};
 
 /* android.depth */
 
@@ -1285,6 +1303,7 @@ struct camera2_ctl {
        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;
@@ -1310,6 +1329,7 @@ struct camera2_dm {
        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;
@@ -1530,10 +1550,13 @@ struct camera2_sensor_uctl {
        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;
@@ -1547,10 +1570,13 @@ struct camera2_sensor_udm {
        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];
 };
@@ -1908,7 +1934,8 @@ struct camera2_udm {
        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 {
@@ -2001,6 +2028,82 @@ struct hfd_meta {
        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.
  */
@@ -2149,9 +2252,20 @@ struct camera2_shot_ext {
        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
@@ -2271,6 +2385,7 @@ typedef struct camera2_fd_uctl camera2_fd_uctl_t;
 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;
index 5161763736549c1a137fc7701abd30d20b4111ff..1b1a41e4681ca6b89edf92e56f6502b74d5987d3 100644 (file)
@@ -20,6 +20,7 @@
 
 #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
@@ -28,8 +29,8 @@
 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;
 };
@@ -40,6 +41,32 @@ enum {
        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);
@@ -48,11 +75,12 @@ void fimc_is_vender_csi_err_print_debug_log(struct fimc_is_device_sensor *device
 
 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);
@@ -85,4 +113,8 @@ int fimc_is_vender_request_binary(struct fimc_is_binary * bin, const char * path
 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
index 43722ed986db2d614801ade483d95a3dd92fd51e..272ad6466b404220a8acbde3b367e5eef8dc528d 100644 (file)
@@ -22,7 +22,6 @@ module_param(debug_time_hw, int, 0644);
 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;
@@ -70,38 +69,35 @@ flush_config_frame:
        }
 
        /*
-        * 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);
@@ -140,7 +136,8 @@ flush_wait_done_frame:
                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 */
@@ -155,6 +152,8 @@ flush_wait_done_frame:
                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;
@@ -731,16 +730,16 @@ int __nocfi fimc_is_lib_isp_set_ctrl(struct fimc_is_hw_ip *hw_ip,
        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:
@@ -779,6 +778,8 @@ void __nocfi fimc_is_lib_isp_shot(struct fimc_is_hw_ip *hw_ip,
                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,
index a0446efee2901025f4362d5c790380860640ffd9..3b024e9be97fc682b880f38aaf7329cb331d930e 100644 (file)
@@ -245,7 +245,7 @@ int fimc_is_lib_isp_set_param(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);
index 24d278e17d9ebf3ad9ce57945ca03dabbbf9adbe..85433d33a517f3c58080140f3e82de1949f86d85 100644 (file)
@@ -44,260 +44,55 @@ u32 __iomem *notify_fcount_sen3;
 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;
@@ -315,6 +110,9 @@ int fimc_is_interface_3aa_probe(struct fimc_is_interface_ischain *itfc,
        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;
@@ -342,13 +140,11 @@ int fimc_is_interface_3aa_probe(struct fimc_is_interface_ischain *itfc,
                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;
@@ -377,8 +173,10 @@ int fimc_is_interface_3aa_probe(struct fimc_is_interface_ischain *itfc,
 
        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;
@@ -423,13 +221,11 @@ int fimc_is_interface_isp_probe(struct fimc_is_interface_ischain *itfc,
                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;
@@ -459,8 +255,10 @@ int fimc_is_interface_isp_probe(struct fimc_is_interface_ischain *itfc,
 
        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;
@@ -505,13 +303,11 @@ int fimc_is_interface_tpu_probe(struct fimc_is_interface_ischain *itfc,
                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;
@@ -545,8 +341,10 @@ int fimc_is_interface_tpu_probe(struct fimc_is_interface_ischain *itfc,
 
        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;
@@ -578,13 +376,11 @@ int fimc_is_interface_scaler_probe(struct fimc_is_interface_ischain *itfc,
                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);
 
@@ -592,8 +388,10 @@ int fimc_is_interface_scaler_probe(struct fimc_is_interface_ischain *itfc,
 
        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;
@@ -625,13 +423,11 @@ int fimc_is_interface_vra_probe(struct fimc_is_interface_ischain *itfc,
                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) {
@@ -655,8 +451,10 @@ int fimc_is_interface_vra_probe(struct fimc_is_interface_ischain *itfc,
 
        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;
@@ -698,13 +496,11 @@ int fimc_is_interface_dcp_probe(struct fimc_is_interface_ischain *itfc,
                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;
@@ -738,95 +534,257 @@ int fimc_is_interface_dcp_probe(struct fimc_is_interface_ischain *itfc,
 
        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;
 }
@@ -1068,7 +1026,7 @@ static void wq_func_frame(struct fimc_is_subdev *leader,
        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;
@@ -1077,9 +1035,9 @@ static void wq_func_30c(struct work_struct *data)
        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;
@@ -1113,12 +1071,22 @@ static void wq_func_30c(struct work_struct *data)
                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;
@@ -1127,9 +1095,9 @@ static void wq_func_30p(struct work_struct *data)
        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;
@@ -1163,12 +1131,27 @@ static void wq_func_30p(struct work_struct *data)
                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;
@@ -1177,9 +1160,9 @@ static void wq_func_30f(struct work_struct *data)
        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;
@@ -1213,112 +1196,22 @@ static void wq_func_30f(struct work_struct *data)
                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;
@@ -1327,9 +1220,9 @@ static void wq_func_31p(struct work_struct *data)
        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;
@@ -1348,7 +1241,7 @@ static void wq_func_31p(struct work_struct *data)
                        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;
@@ -1363,62 +1256,22 @@ static void wq_func_31p(struct work_struct *data)
                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;
@@ -1427,9 +1280,9 @@ static void wq_func_31g(struct work_struct *data)
        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;
@@ -1448,7 +1301,7 @@ static void wq_func_31g(struct work_struct *data)
                        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;
@@ -1463,62 +1316,22 @@ static void wq_func_31g(struct work_struct *data)
                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;
@@ -1527,9 +1340,9 @@ static void wq_func_i0p(struct work_struct *data)
        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;
@@ -1563,62 +1376,22 @@ static void wq_func_i0p(struct work_struct *data)
                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;
@@ -1627,9 +1400,9 @@ static void wq_func_i1p(struct work_struct *data)
        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;
@@ -1648,7 +1421,7 @@ static void wq_func_i1p(struct work_struct *data)
                        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;
@@ -1663,62 +1436,22 @@ static void wq_func_i1p(struct work_struct *data)
                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;
@@ -1727,9 +1460,9 @@ static void wq_func_d0c(struct work_struct *data)
        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;
@@ -1763,59 +1496,19 @@ static void wq_func_d0c(struct work_struct *data)
                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)
@@ -2982,11 +2675,13 @@ int fimc_is_interface_probe(struct fimc_is_interface *this,
        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);
 
@@ -3022,11 +2717,13 @@ int fimc_is_interface_probe(struct fimc_is_interface *this,
        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);
index f47c871bfde899f7233bf6b865834c549795c758..29c56d918f2edd59bb9f318c27bee5ec13d94f64 100644 (file)
@@ -64,20 +64,4 @@ struct fimc_is_interface_ischain {
 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
index 734dd85a640d6554717dd1cdc3af6eb27c33ae48..332fab71576a8b8dd9e54a82c6a759276bc64c02 100644 (file)
@@ -442,32 +442,32 @@ static void free_to_mblk(struct lib_mem_block *mblk, void *kva)
        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)
@@ -509,7 +509,7 @@ static void __maybe_unused *fimc_is_alloc_dma_pb(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);
@@ -630,11 +630,18 @@ static int mblk_kva(struct lib_mem_block *mblk, u32 dva, ulong *kva)
        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)
@@ -644,11 +651,18 @@ 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)
@@ -675,11 +689,18 @@ static void mblk_clean(struct lib_mem_block *mblk, ulong kva, u32 size)
                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)
@@ -1052,6 +1073,7 @@ int fimc_is_timer_disable(void *timer)
 #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)
 
@@ -1084,6 +1106,9 @@ int fimc_is_register_interrupt(struct hwip_intr_handler info)
        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;
@@ -1145,6 +1170,9 @@ int fimc_is_unregister_interrupt(u32 intr_id, u32 chain_id)
        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;
@@ -1185,7 +1213,7 @@ static irqreturn_t  fimc_is_general_interrupt_isr (int irq, void *data)
        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;
@@ -1225,7 +1253,7 @@ int fimc_is_register_general_interrupt(struct general_intr_handler info)
        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;
 
@@ -1460,6 +1488,9 @@ ulong get_reg_addr(u32 id)
        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;
@@ -1898,8 +1929,8 @@ void set_os_system_funcs(os_system_func_t *funcs)
 {
        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;
 
@@ -1935,12 +1966,12 @@ void set_os_system_funcs(os_system_func_t *funcs)
        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;
@@ -1950,8 +1981,8 @@ void set_os_system_funcs(os_system_func_t *funcs)
        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;
@@ -1960,6 +1991,12 @@ void set_os_system_funcs(os_system_func_t *funcs)
        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;
 }
@@ -2004,8 +2041,8 @@ void set_os_system_funcs_for_rta(os_system_func_t *funcs)
 #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 */
 
@@ -2498,6 +2535,9 @@ int fimc_is_load_bin(void)
 {
        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");
 
@@ -2574,8 +2614,18 @@ int fimc_is_load_bin(void)
 
        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);
index 61ff33b20d76001d66507b03a3c2508e526cbcea..a3b2b6f04d6d678218fba7fea05864471d76730c 100644 (file)
@@ -72,7 +72,7 @@ enum task_index {
 #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)
 
@@ -130,7 +130,8 @@ enum memory_track_type {
 
        /* 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,
 
@@ -225,7 +226,8 @@ struct fimc_is_lib_support {
 
        /* 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;
@@ -331,6 +333,4 @@ void fimc_is_load_ctrl_unlock(void);
 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
index 5d06261484cb997fd7c94e85472ecfe5eb5a04b5..e711c4e60fd4b380579e7155fc6a162c00d28d46 100644 (file)
@@ -116,19 +116,19 @@ static void fimc_is_lib_vra_callback_final_output_ready(u32 instance,
        }
 #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
 }
@@ -572,8 +572,8 @@ int __nocfi fimc_is_lib_vra_init_frame_work(struct fimc_is_lib_vra *lib_vra,
        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]);
@@ -845,7 +845,7 @@ int __nocfi fimc_is_lib_vra_new_frame(struct fimc_is_lib_vra *lib_vra,
 {
        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");
@@ -857,7 +857,7 @@ int __nocfi fimc_is_lib_vra_new_frame(struct fimc_is_lib_vra *lib_vra,
        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,
@@ -1021,7 +1021,7 @@ int __nocfi fimc_is_lib_vra_frame_work_final(struct fimc_is_lib_vra *lib_vra)
 }
 
 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;
@@ -1086,6 +1086,32 @@ static int fimc_is_lib_vra_update_dm(struct fimc_is_lib_vra *lib_vra, u32 instan
                        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 */
@@ -1168,6 +1194,7 @@ int fimc_is_lib_vra_get_meta(struct fimc_is_lib_vra *lib_vra,
        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");
@@ -1179,8 +1206,14 @@ int fimc_is_lib_vra_get_meta(struct fimc_is_lib_vra *lib_vra,
                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;
@@ -1199,7 +1232,7 @@ int fimc_is_lib_vra_get_meta(struct fimc_is_lib_vra *lib_vra,
        }
 #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;
index 91e73d78bda039469b8a11d672af3b76fe326c2d..6205b22f40f18173b616b2cae88705c7fbeb9529 100644 (file)
@@ -210,12 +210,12 @@ struct fimc_is_lib_vra {
        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;
index bd144b836cb786ef2ad7287830db388a87e28d77..fc2405e072e4df4532d750f16e93c44e6a7f7c82 100644 (file)
@@ -98,19 +98,6 @@ int exynos7880_fimc_is_sensor_iclk_on(struct device *dev,
                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;
 }
@@ -124,19 +111,6 @@ int exynos7880_fimc_is_sensor_iclk_off(struct device *dev,
        /* 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;
 }
 
index 0bea7d77076ce5588663377351a8f6ed8c275025..af292b274269aaa9216fac5b1b1fbcfb2559a3fd 100644 (file)
@@ -60,6 +60,7 @@
 /* #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
index 1887bccc103ad1bce48728b825f8aa6af2bd5336..5d7e5365d3a207d23d1f69004b3f90f9cabb980f 100644 (file)
@@ -200,6 +200,11 @@ enum hwip_interrupt_map {
 #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,
index 4a2c0ea370c9ef265499280ade3f6c7e0f6025d7..f261e2b0ab3f1356826f2ba87dfdfd071519d9df 100644 (file)
 /* #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
index 2444c0e296d6a612822e4140888d8a60be970716..23d03108453a4e09d485583d35aa0703b33e055a 100644 (file)
@@ -105,7 +105,7 @@ static struct fimc_is_field sysreg_cam_fields[SYSREG_CAM_REG_FIELD_CNT] = {
  * [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 */
@@ -300,7 +300,7 @@ int fimc_is_hw_group_open(void *group_data)
        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:
@@ -318,26 +318,31 @@ int fimc_is_hw_group_open(void *group_data)
 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)
@@ -351,12 +356,38 @@ int fimc_is_hw_camif_cfg(void *sensor_data)
        }
 
        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 */
@@ -369,26 +400,12 @@ int fimc_is_hw_camif_cfg(void *sensor_data)
        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;
@@ -397,6 +414,15 @@ int fimc_is_hw_camif_cfg(void *sensor_data)
                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);
 
@@ -475,7 +501,19 @@ void fimc_is_hw_ischain_qe_cfg(void)
 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;
 }
@@ -1463,6 +1501,7 @@ exit:
 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;
@@ -1473,21 +1512,28 @@ unsigned int get_dma(struct fimc_is_device_sensor *device, u32 *dma_ch)
        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;
index 70234583bfe9467035486af10403c0c769e8bcf2..1c6d97bd691588da56ebf34e99d613ff6d8e2fa6 100644 (file)
@@ -27,7 +27,7 @@
 #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 */
 
@@ -36,6 +36,7 @@
 #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
@@ -64,6 +65,7 @@ enum taaisp_chain_id {
        ID_TPU_0 = 4,
        ID_TPU_1 = 5,
        ID_DCP   = 6,
+       ID_VPP   = 7,   /* ID_3AA_2 */
        ID_3AAISP_MAX
 };
 
@@ -80,7 +82,7 @@ enum hwip_interrupt_map {
 #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 */
@@ -92,8 +94,14 @@ enum hwip_interrupt_map {
 #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)
 
@@ -101,6 +109,11 @@ enum hwip_interrupt_map {
 #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,
index 2381d97788bdde0c2753e7f1099c588b5a64f00e..c661d63f91549b2a5ed36b62a5c728fa435d2db3 100644 (file)
@@ -17,8 +17,9 @@
 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},
@@ -26,10 +27,20 @@ DECLARE_DVFS_DT(FIMC_IS_SN_END,
                {"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},
@@ -41,6 +52,9 @@ DECLARE_DVFS_DT(FIMC_IS_SN_END,
                {"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},
@@ -58,8 +72,6 @@ DECLARE_DVFS_DT(FIMC_IS_SN_END,
                {"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},
@@ -71,6 +83,7 @@ DECLARE_DVFS_DT(FIMC_IS_SN_END,
 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);
@@ -79,12 +92,19 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_WIDE_SELFIE);
 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);
@@ -96,6 +116,9 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_CAMCORDING_UHD);
 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);
@@ -116,8 +139,6 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_PIP_PREVIEW);
 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);
 
@@ -142,15 +163,47 @@ struct fimc_is_dvfs_scenario static_scenarios[] = {
        }, {
                .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),
@@ -192,33 +245,13 @@ struct fimc_is_dvfs_scenario static_scenarios[] = {
                .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),
@@ -235,18 +268,34 @@ struct fimc_is_dvfs_scenario static_scenarios[] = {
                .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),
@@ -300,6 +349,21 @@ static struct fimc_is_dvfs_scenario dynamic_scenarios[] = {
                .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),
@@ -330,16 +394,6 @@ static struct fimc_is_dvfs_scenario dynamic_scenarios[] = {
                .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),
@@ -426,13 +480,13 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_SECURE_FRONT)
                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;
@@ -440,13 +494,56 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS)
                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)
@@ -455,13 +552,27 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_120FPS)
                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
@@ -823,17 +934,6 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_PIP_CAPTURE)
                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)
 {
@@ -895,6 +995,89 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR2_CAMCORDING_FHD_CAPTURE)
                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)
 {
@@ -944,10 +1127,19 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_PREVIEW_FULL)
                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;
@@ -1004,7 +1196,7 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_CAMCORDING_HD_CAPTURE)
 {
        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)
                )
@@ -1017,7 +1209,7 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_REAR_CAMCORDING_UHD_CAPTURE)
 {
        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)
                )
@@ -1032,7 +1224,7 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_VIDEO_HIGH_SPEED_60FPS_CAPTURE)
 
        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
@@ -1050,7 +1242,7 @@ DECLARE_DVFS_CHK_FUNC(FIMC_IS_SN_FRONT_WIDE_SELFIE)
 
 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;
index c94264c68837b0f8fd804c4b58c26b61f2ace5c0..fea9416bef270180331009ee3e6cdcd4c9d5cfb2 100644 (file)
 
 /* 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,
@@ -31,10 +32,18 @@ enum FIMC_IS_SCENARIO_ID {
        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,
@@ -46,6 +55,9 @@ enum FIMC_IS_SCENARIO_ID {
        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,
@@ -65,8 +77,6 @@ enum FIMC_IS_SCENARIO_ID {
        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,
index c1509ad96382730a7c45c2e3fe166514d7f1a2ed..a95197ad9e44563db6cb094dd4bd4926cce769f5 100644 (file)
@@ -232,6 +232,12 @@ enum dma_input_error {
        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,
@@ -791,7 +797,8 @@ struct param_dma_input {
        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;
 };
 
index ea4003f5a51d20f3555161fd60f0f6f18f86ca74..99a88abb41b76335b83c1d1ada3434d3233090e6 100644 (file)
@@ -147,6 +147,20 @@ static int fimc_is_ischain_3aa_cfg(struct fimc_is_subdev *leader,
 #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)++;
@@ -263,6 +277,7 @@ static int fimc_is_ischain_3aa_tag(struct fimc_is_subdev *subdev,
 
        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,
index 99191ffc4e220e410b9cca00fef0ffde10bd829e..f39ab1feaecbdb0b35f83ce79f03dd045342f21b 100644 (file)
@@ -123,6 +123,20 @@ static int fimc_is_ischain_isp_cfg(struct fimc_is_subdev *leader,
        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)++;
@@ -224,6 +238,7 @@ static int fimc_is_ischain_isp_tag(struct fimc_is_subdev *subdev,
                *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,
index 7d3fbbf6e770f65d2d4319fbf76ea576fbfbfde9..d288dd8a38fb43580850cb85f1cabff9a5f26916 100644 (file)
@@ -133,7 +133,7 @@ p_err:
        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,
@@ -307,7 +307,14 @@ static int fimc_is_ischain_mxp_start(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))
@@ -427,6 +434,7 @@ static int fimc_is_ischain_mxp_tag(struct fimc_is_subdev *subdev,
        u32 pixelformat = 0;
        u32 *target_addr;
        bool change_pixelformat = false;
+       bool change_flip = false;
 
        device = (struct fimc_is_device_ischain *)device_data;
 
@@ -499,6 +507,9 @@ static int fimc_is_ischain_mxp_tag(struct fimc_is_subdev *subdev,
                        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;
@@ -518,6 +529,7 @@ static int fimc_is_ischain_mxp_tag(struct fimc_is_subdev *subdev,
                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,
@@ -544,11 +556,12 @@ static int fimc_is_ischain_mxp_tag(struct fimc_is_subdev *subdev,
                                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) {
index 15574274ac5ffca557d4360e872db4dcba1ae0e4..e9e95a12d165658af209cdbf39e539abd195f90c 100644 (file)
@@ -66,5 +66,6 @@ source "drivers/media/platform/exynos/fimc-is2/sensor/module_framework/dphy/Kcon
 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
index 48ccf71748eae10431d116e592a30d87928ce180..ed43a1f65545707213bc8b5b2884535eb835147d 100644 (file)
@@ -18,6 +18,7 @@ obj-$(CONFIG_USE_DIRECT_IS_CONTROL) += module_framework/ \
 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
index 6771800998bc8c4eed063a00604cf2dfef072367..b3eac3a6b477f1c9978b12e9033090dbebdc3f78 100644 (file)
@@ -283,7 +283,8 @@ int csi_hw_s_config_dma(u32 __iomem *base_reg, u32 channel, struct fimc_is_image
        }
 
        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;
index 3025c57f406359813634ace144a383608fb20b27..aeda147f434c161df00771e60001cd4e9d314ac8 100644 (file)
@@ -365,10 +365,13 @@ int csi_hw_s_config_dma(u32 __iomem *base_reg, u32 channel, struct fimc_is_image
        }
 
        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
index 6d8953314f9ebbc8c10eb67834b11114de339cb7..43c71ad37026131f1a16383888fe008f55192a67 100644 (file)
 
 #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)
 {
@@ -35,6 +37,43 @@ 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;
@@ -250,7 +289,6 @@ int csi_hw_s_control(u32 __iomem *base_reg, u32 id, u32 value)
        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)
 {
@@ -284,9 +322,11 @@ int csi_hw_s_config(u32 __iomem *base_reg,
        }
 
 #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
 
@@ -341,10 +381,12 @@ int csi_hw_s_config_dma(u32 __iomem *base_reg, u32 vc, struct fimc_is_image *ima
        }
 
        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
@@ -425,12 +467,6 @@ int csi_hw_s_config_dma(u32 __iomem *base_reg, u32 vc, struct fimc_is_image *ima
 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)
 {
@@ -579,7 +615,6 @@ u32 csi_hw_g_frameptr(u32 __iomem *base_reg, u32 vc)
        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;
@@ -610,11 +645,6 @@ void csi_hw_s_output_dma(u32 __iomem *base_reg, u32 vc, bool enable)
        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)
 {
@@ -654,7 +684,6 @@ int csi_hw_dma_common_reset(void)
        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)
 {
@@ -662,20 +691,13 @@ int csi_hw_s_dma_common_dynamic(u32 __iomem *base_reg, size_t size, unsigned int
        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 */
@@ -683,14 +705,14 @@ int csi_hw_s_dma_common_dynamic(u32 __iomem *base_reg, size_t size, unsigned int
        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))
@@ -703,16 +725,65 @@ int csi_hw_s_dma_common_dynamic(u32 __iomem *base_reg, size_t size, unsigned int
 
        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 */
@@ -721,7 +792,7 @@ int csi_hw_s_dma_common_dynamic(u32 __iomem *base_reg, size_t size, unsigned int
        /* 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;
@@ -777,9 +848,6 @@ int csi_hw_s_dma_common(u32 __iomem *base_reg)
 
        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)
@@ -998,8 +1066,7 @@ int csi_hw_g_dma_irq_src_vc(u32 __iomem *base_reg, struct csis_irq_src *src, u32
        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;
@@ -1012,59 +1079,60 @@ int csi_hw_s_config_dma_cmn(u32 __iomem *base_reg, u32 vc, u32 hwformat)
                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)
index 96c621a5f1d3fa3eb3ba5e46373819d6f7c91e7d..92bfeba70963dcbf186529882550d9001e2cc053 100644 (file)
@@ -227,10 +227,12 @@ int csi_hw_s_config_dma(u32 __iomem *base_reg, u32 vc, struct fimc_is_image *ima
        }
 
        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
@@ -910,7 +912,7 @@ int csi_hw_g_dma_irq_src_vc(u32 __iomem *base_reg, struct csis_irq_src *src, u32
        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;
index 5bc9c630144080684b42753bff6cbd250b93ba4a..54fbfd35030cc1cb0f29040e1ce8ab564bde93fa 100644 (file)
@@ -200,6 +200,39 @@ p_err:
        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)
 {
index 4f18d087ecb5cba4d67d05a4ab0894346770d956..8afbdde577898926febdfde84272edd3616c6f5e 100644 (file)
@@ -60,6 +60,22 @@ config CAMERA_ACT_DW9807_OBJ
         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
@@ -91,3 +107,11 @@ config CAMERA_ACT_ZC533_OBJ
         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.
index f1dfe867ce4a4276852cf0fcac19ffe5aaad29cc..6b9d9300d124639a5501e98700f18670b74fe489 100644 (file)
@@ -8,8 +8,11 @@ obj-$(CONFIG_CAMERA_ACT_DW9714_OBJ) += fimc-is-actuator-dw9714.o
 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
index 1c1d14b6946b0374ae91538167d7109e71f7774c..4a92b1094e0982a3d7589f6aff37a72aa1419177 100644 (file)
@@ -113,7 +113,7 @@ int sensor_ak7345_actuator_init(struct v4l2_subdev *subdev, u32 val)
        /* 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)
index 66e21912e8315571e888c1c0d5d15cd9014148b5..68132e8e78c52f37b0544540e80a8c6e07335d8b 100644 (file)
@@ -187,7 +187,7 @@ int sensor_ak7348_actuator_init(struct v4l2_subdev *subdev, u32 val)
        /* 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)
index 08ce96dc007afefb914b1479b9529847d92706ef..a75fceeb0ff8224bbc44a3abc03edbdfe4bcda3c 100644 (file)
@@ -302,7 +302,7 @@ int sensor_dw9780_actuator_init(struct v4l2_subdev *subdev, u32 val)
        }
 
        /* 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 */
index 33673e65f8ac557eb74f6d80b6436fbbc26392c9..9a58dad337001077a34ec7e33f8d24c9d68cc40b 100644 (file)
@@ -274,7 +274,7 @@ int sensor_dw9804_actuator_init(struct v4l2_subdev *subdev, u32 val)
        }
 
        /* 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 */
index 30a01ecbf9d3298954cb5a467c5d3edadd806850..df20f65ec5c6dff6668f9e8dcb74f222f8a29860 100644 (file)
@@ -292,7 +292,7 @@ int sensor_dw9807_actuator_init(struct v4l2_subdev *subdev, u32 val)
        }
 
        /* 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 */
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9823.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9823.c
new file mode 100644 (file)
index 0000000..6ae516e
--- /dev/null
@@ -0,0 +1,596 @@
+/*
+ * 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);
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9823.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9823.h
new file mode 100644 (file)
index 0000000..46c37d8
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9839.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9839.c
new file mode 100644 (file)
index 0000000..735e170
--- /dev/null
@@ -0,0 +1,687 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9839.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-dw9839.h
new file mode 100644 (file)
index 0000000..150b355
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * 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
index 5ee00d41abbbf654631c568eb803488c4dedd087..2a4ce1326b8f5364e4bd3800988bc3fc7bcc44b4 100644 (file)
@@ -35,6 +35,9 @@
 #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;
@@ -44,7 +47,7 @@ static int sensor_lc898217_write_position(struct i2c_client *client, u32 val)
        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");
@@ -74,7 +77,6 @@ p_err:
 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
@@ -87,7 +89,7 @@ int sensor_lc898217_actuator_init(struct v4l2_subdev *subdev, u32 val)
 
        int first_position = DEF_LC898217_FIRST_POSITION;
 
-       BUG_ON(!subdev);
+       FIMC_BUG(!subdev);
 
        dbg_actuator("%s\n", __func__);
 
@@ -104,12 +106,21 @@ int sensor_lc898217_actuator_init(struct v4l2_subdev *subdev, u32 val)
                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;
@@ -119,7 +130,7 @@ int sensor_lc898217_actuator_init(struct v4l2_subdev *subdev, u32 val)
        /* 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)
@@ -167,11 +178,11 @@ int sensor_lc898217_actuator_get_status(struct v4l2_subdev *subdev, u32 *info)
 
        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)) {
@@ -207,11 +218,11 @@ int sensor_lc898217_actuator_set_position(struct v4l2_subdev *subdev, u32 *info)
        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)) {
@@ -250,6 +261,58 @@ p_err:
        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;
@@ -264,6 +327,14 @@ static int sensor_lc898217_actuator_g_ctrl(struct v4l2_subdev *subdev, struct v4
                        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;
@@ -317,13 +388,14 @@ static int sensor_lc898217_actuator_probe(struct i2c_client *client,
        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) {
@@ -355,6 +427,12 @@ static int sensor_lc898217_actuator_probe(struct i2c_client *client,
                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");
@@ -368,6 +446,7 @@ static int sensor_lc898217_actuator_probe(struct i2c_client *client,
                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;
@@ -381,26 +460,20 @@ static int sensor_lc898217_actuator_probe(struct i2c_client *client,
        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;
 }
 
index e7048c21e187bcfc044c06ec65775b6f99dbdc48..dd7dac695e64996c0c8e188c4be5b13badddecf4 100644 (file)
@@ -270,7 +270,7 @@ int sensor_zc533_actuator_init(struct v4l2_subdev *subdev, u32 val)
        }
 
        /* 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);
 
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc569.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc569.c
new file mode 100755 (executable)
index 0000000..ab41922
--- /dev/null
@@ -0,0 +1,581 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc569.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/actuator/fimc-is-actuator-zc569.h
new file mode 100755 (executable)
index 0000000..0de0ea3
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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
index 32f26ddd68889fa5d9406e578d9546fa98694f36..cab106620ac5ce526ca0a9d2e6d2c884f2c73672 100644 (file)
@@ -92,6 +92,14 @@ config CAMERA_CIS_3H1_OBJ
                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
@@ -148,6 +156,14 @@ config CAMERA_CIS_3P8_OBJ
                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
@@ -204,6 +220,14 @@ config CAMERA_CIS_2L3_OBJ
                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
@@ -268,6 +292,70 @@ config CAMERA_CIS_SR259_OBJ
                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
index c1dab9db4239c70e3d5c69b12209060485672e38..7c727c72da6ade678b2af5e0d27ffb3b1128553c 100644 (file)
@@ -1,8 +1,10 @@
 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
@@ -10,6 +12,7 @@ obj-$(CONFIG_CAMERA_CIS_2P8_OBJ) += fimc-is-cis-2p8.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
@@ -22,6 +25,7 @@ obj-$(CONFIG_CAMERA_CIS_2P7SQ_OBJ) += fimc-is-cis-2p7sq.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
@@ -29,7 +33,14 @@ obj-$(CONFIG_CAMERA_CIS_IMX333_OBJ) += fimc-is-cis-imx333.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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10-setA.h
new file mode 100755 (executable)
index 0000000..521e2ef
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10.c
new file mode 100755 (executable)
index 0000000..aa8315a
--- /dev/null
@@ -0,0 +1,1860 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10.h
new file mode 100644 (file)
index 0000000..bdf4c68
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff-setA.h
new file mode 100755 (executable)
index 0000000..a776a6d
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff.c
new file mode 100755 (executable)
index 0000000..17eaed5
--- /dev/null
@@ -0,0 +1,1789 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-12a10ff.h
new file mode 100644 (file)
index 0000000..8ec8a93
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c-setA.h
new file mode 100755 (executable)
index 0000000..741ded6
--- /dev/null
@@ -0,0 +1,615 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c.c
new file mode 100755 (executable)
index 0000000..681f91c
--- /dev/null
@@ -0,0 +1,1788 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-16885c.h
new file mode 100644 (file)
index 0000000..7db1c93
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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
+
index 4bcd4ab16f00ce23926c9b6a1967aaae519cfffa..ba53ccf4170305317ac68b5d3d1f88137642ce34 100644 (file)
@@ -2053,6 +2053,7 @@ static struct fimc_is_cis_ops cis_ops_2l1 = {
        .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,
@@ -2165,6 +2166,9 @@ 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);
index aab6a792006fc9cb9ea0fe5ce2f64851830ce78c..c9b553ee43aac322426717d3304c4ca53fe4a8ca 100644 (file)
@@ -2035,6 +2035,7 @@ static struct fimc_is_cis_ops cis_ops_2l2 = {
        .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,
@@ -2147,6 +2148,9 @@ 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);
index 8bbacd9cfd7fbe04d9ec46be329d45c87e55adea..0232b45dacc0e7b650d1e49a3467a0e576e8233e 100644 (file)
@@ -20715,7 +20715,7 @@ const u32 sensor_2l3_setfile_A_1008x756_120fps_mode2[] = {
 
 /* 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,
@@ -21042,7 +21042,7 @@ const u32 sensor_2l3_setfile_A_2016x1134_60fps_mode2_ssm[] = {
 
 /* 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,
@@ -25669,7 +25669,7 @@ const struct sensor_pll_info_compact sensor_2l3_pllinfo_A_1008x756_120fps_mode2
 };
 
 
-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) */
@@ -25677,7 +25677,7 @@ const struct sensor_pll_info_compact sensor_2l3_pllinfo_A_2016x1134_60fps_mode2_
        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) */
@@ -25723,8 +25723,9 @@ static const u32 *sensor_2l3_setfiles_A[] = {
        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,
 };
@@ -25751,8 +25752,9 @@ static const u32 sensor_2l3_setfile_A_sizes[] = {
        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),
 };
@@ -25814,8 +25816,9 @@ static const struct sensor_pll_info_compact *sensor_2l3_pllinfos_A[] = {
        &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,
 };
index 5db1b1173668b06e729e40376b9da671290b04b0..8c9e3476680d3c7540a5dc5024d5f651ff851950 100644 (file)
@@ -15,7 +15,7 @@
 #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[] = {
@@ -38,9 +38,9 @@ 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,
@@ -83,9 +83,11 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -94,12 +96,12 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -113,7 +115,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -122,7 +124,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -132,13 +134,13 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -149,13 +151,13 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -165,8 +167,8 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -179,7 +181,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -192,7 +194,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -201,15 +203,15 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -264,10 +266,10 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -281,7 +283,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -373,7 +375,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -395,7 +397,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -421,7 +423,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -460,14 +462,14 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -497,7 +499,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -522,45 +524,43 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -583,7 +583,18 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -591,38 +602,38 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -630,23 +641,23 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -661,7 +672,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -671,14 +682,14 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -687,7 +698,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -697,18 +708,18 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -716,11 +727,11 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -734,30 +745,30 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -766,7 +777,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -774,20 +785,20 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -823,7 +834,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -831,11 +842,11 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -863,11 +874,11 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -875,9 +886,9 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -885,7 +896,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -897,11 +908,11 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -910,32 +921,32 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -980,7 +991,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -993,7 +1004,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1002,7 +1013,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1010,8 +1021,8 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1019,7 +1030,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1037,7 +1048,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1046,7 +1057,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1056,8 +1067,8 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1072,7 +1083,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1080,21 +1091,18 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1127,7 +1135,11 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1151,7 +1163,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1170,14 +1182,14 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1246,7 +1258,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1256,7 +1268,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1299,7 +1311,7 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1331,21 +1343,21 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1363,47 +1375,47 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1440,13 +1452,13 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1599,6 +1611,10 @@ const u32 sensor_2l3_setfile_B_Reset_TnP[] = {
        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,
@@ -1802,8 +1818,8 @@ const u32 sensor_2l3_setfile_B_Global[] = {
        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,
 };
@@ -2147,6 +2163,10 @@ const u32 sensor_2l3_setfile_B_4032x3024_30fps[] = {
        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 */
@@ -2498,6 +2518,10 @@ const u32 sensor_2l3_setfile_B_4032x2268_60fps[] = {
        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 */
@@ -2839,6 +2863,10 @@ const u32 sensor_2l3_setfile_B_4032x2268_30fps[] = {
        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 */
@@ -3180,6 +3208,10 @@ const u32 sensor_2l3_setfile_B_4032x1960_30fps[] = {
        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 */
@@ -3521,6 +3553,10 @@ const u32 sensor_2l3_setfile_B_3024x3024_30fps[] = {
        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 */
@@ -3873,6 +3909,10 @@ const u32 sensor_2l3_setfile_B_2016x1512_30fps[] = {
        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 */
@@ -4225,6 +4265,10 @@ const u32 sensor_2l3_setfile_B_2016x1134_30fps[] = {
        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 */
@@ -4577,6 +4621,10 @@ const u32 sensor_2l3_setfile_B_1504x1504_30fps[] = {
        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 */
@@ -4918,6 +4966,10 @@ const u32 sensor_2l3_setfile_B_4032x3024_24fps[] = {
        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 */
@@ -5259,6 +5311,10 @@ const u32 sensor_2l3_setfile_B_4032x2268_24fps[] = {
        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 */
@@ -5600,6 +5656,10 @@ const u32 sensor_2l3_setfile_B_4032x1960_24fps[] = {
        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 */
@@ -5941,6 +6001,10 @@ const u32 sensor_2l3_setfile_B_3024x3024_24fps[] = {
        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 */
@@ -6271,6 +6335,10 @@ const u32 sensor_2l3_setfile_B_4032x2268_60fps_mode2[] = {
        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 */
@@ -6601,6 +6669,10 @@ const u32 sensor_2l3_setfile_B_2016x1512_120fps_mode2[] = {
        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 */
@@ -6931,6 +7003,10 @@ const u32 sensor_2l3_setfile_B_2016x1512_30fps_mode2[] = {
        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 */
@@ -7261,6 +7337,10 @@ const u32 sensor_2l3_setfile_B_2016x1134_240fps_mode2[] = {
        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 */
@@ -7591,6 +7671,10 @@ const u32 sensor_2l3_setfile_B_2016x1134_120fps_mode2[] = {
        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 */
@@ -7921,6 +8005,10 @@ const u32 sensor_2l3_setfile_B_2016x1134_30fps_mode2[] = {
        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 */
@@ -8251,6 +8339,10 @@ const u32 sensor_2l3_setfile_B_1504x1504_120fps_mode2[] = {
        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 */
@@ -8581,6 +8673,10 @@ const u32 sensor_2l3_setfile_B_1504x1504_30fps_mode2[] = {
        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 */
@@ -8912,11 +9008,15 @@ const u32 sensor_2l3_setfile_B_1008x756_120fps_mode2[] = {
        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,
@@ -9262,11 +9362,15 @@ const u32 sensor_2l3_setfile_B_2016x1134_60fps_mode2_ssm[] = {
        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,
@@ -9612,6 +9716,364 @@ const u32 sensor_2l3_setfile_B_1280x720_60fps_mode2_ssm[] = {
        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[] = {
@@ -15232,6 +15694,10 @@ const u32 sensor_2l3_setfile_B_4032x3024_30fps_load_sram[] = {
        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[] = {
@@ -15245,6 +15711,10 @@ 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[] = {
@@ -15258,6 +15728,10 @@ 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[] = {
@@ -15271,6 +15745,10 @@ 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[] = {
@@ -15281,6 +15759,10 @@ 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[] = {
@@ -15291,6 +15773,10 @@ 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
 
@@ -15462,7 +15948,7 @@ const struct sensor_pll_info_compact sensor_2l3_pllinfo_B_1008x756_120fps_mode2
        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) */
@@ -15470,7 +15956,15 @@ const struct sensor_pll_info_compact sensor_2l3_pllinfo_B_2016x1134_60fps_mode2_
        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) */
@@ -15516,8 +16010,9 @@ static const u32 *sensor_2l3_setfiles_B[] = {
        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,
 };
@@ -15544,8 +16039,9 @@ static const u32 sensor_2l3_setfile_B_sizes[] = {
        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),
 };
@@ -15606,8 +16102,9 @@ static const struct sensor_pll_info_compact *sensor_2l3_pllinfos_B[] = {
        &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,
 };
index bf87bed6d032e6c34d34026fd9b8ec1e2556d67e..e550a5826620beb32830194e0c5f66e70eece5f0 100644 (file)
@@ -126,8 +126,9 @@ static void sensor_2l3_set_integration_max_margin(u32 mode, cis_shared_data *cis
        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;
@@ -213,7 +214,6 @@ static void sensor_2l3_cis_data_calculation(const struct sensor_pll_info_compact
 
 void sensor_2l3_cis_data_calc(struct v4l2_subdev *subdev, u32 mode)
 {
-       int ret = 0;
        struct fimc_is_cis *cis = NULL;
 
        WARN_ON(!subdev);
@@ -227,6 +227,7 @@ void sensor_2l3_cis_data_calc(struct v4l2_subdev *subdev, u32 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;
@@ -236,6 +237,7 @@ void sensor_2l3_cis_data_calc(struct v4l2_subdev *subdev, u32 mode)
                        return;
                }
        }
+#endif
 
        if (cis->cis_data->stream_on) {
                info("[%s] call mode change in stream on state\n", __func__);
@@ -289,9 +291,6 @@ int sensor_2l3_cis_check_rev(struct v4l2_subdev *subdev)
        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);
 
@@ -306,20 +305,38 @@ int sensor_2l3_cis_check_rev(struct v4l2_subdev *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:
@@ -378,8 +395,6 @@ int sensor_2l3_cis_check_rev(struct v4l2_subdev *subdev)
                break;
        }
 
-p_err:
-       I2C_MUTEX_UNLOCK(cis->i2c_lock);
        return ret;
 }
 
@@ -392,7 +407,6 @@ int sensor_2l3_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;
 
@@ -406,22 +420,8 @@ int sensor_2l3_cis_init(struct v4l2_subdev *subdev)
        }
 
        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;
 
@@ -741,8 +741,9 @@ int sensor_2l3_cis_retention_crc_enable(struct v4l2_subdev *subdev, u32 mode)
        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 */
@@ -843,6 +844,7 @@ int sensor_2l3_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
        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;
@@ -852,6 +854,7 @@ int sensor_2l3_cis_mode_change(struct v4l2_subdev *subdev, u32 mode)
                        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);
@@ -985,6 +988,9 @@ int sensor_2l3_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);
 
@@ -992,6 +998,11 @@ int sensor_2l3_cis_set_lownoise_mode_change(struct v4l2_subdev *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)) {
@@ -1081,6 +1092,28 @@ int sensor_2l3_cis_set_lownoise_mode_change(struct v4l2_subdev *subdev)
                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);
@@ -2730,6 +2763,9 @@ int sensor_2l3_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);
 
@@ -2737,6 +2773,11 @@ int sensor_2l3_cis_set_frs_control(struct v4l2_subdev *subdev, u32 command)
        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__);
@@ -2775,6 +2816,17 @@ int sensor_2l3_cis_set_frs_control(struct v4l2_subdev *subdev, u32 command)
                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*/
@@ -2838,6 +2890,60 @@ int sensor_2l3_cis_set_super_slow_motion_roi(struct v4l2_subdev *subdev, struct
        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,
@@ -2869,6 +2975,10 @@ static struct fimc_is_cis_ops cis_ops_2l3 = {
        .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,
@@ -2979,6 +3089,9 @@ 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);
index 0834a2c859f4d68a81b9628b5bef11e2526cb6a8..e7e9782156e03fda7cd48e04ef0b8149dff59328 100644 (file)
@@ -52,11 +52,12 @@ enum sensor_2l3_mode_enum {
        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,
 };
 
@@ -86,11 +87,12 @@ static bool sensor_2l3_support_wdr[] = {
        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 {
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4-setA.h
new file mode 100644 (file)
index 0000000..2877454
--- /dev/null
@@ -0,0 +1,964 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4-setB.h
new file mode 100644 (file)
index 0000000..562f04a
--- /dev/null
@@ -0,0 +1,8829 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4.c
new file mode 100644 (file)
index 0000000..9055f45
--- /dev/null
@@ -0,0 +1,3388 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2l4.h
new file mode 100644 (file)
index 0000000..3eba0ec
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * 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
index 8cb43aec02abd64360384b14f7f589ac7bc2bb4a..b9ab9ff263fb59a790eb834503ceae15708f2f71 100644 (file)
@@ -1800,6 +1800,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1939,6 +1940,9 @@ 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);
index bc08529fc8735c1e2efe438d55796c0adb42964a..0472be16cc4954484d7d28fb79776fc58b9031e8 100644 (file)
@@ -1621,6 +1621,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1745,6 +1746,9 @@ 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);
index 0364464b79d9c24e649140a88db9c54d889f575e..f215868594a0f14169c31720ded04fe4144430c4 100644 (file)
@@ -1753,6 +1753,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1889,6 +1890,9 @@ 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);
index 2843c5eefa4fc291e657de08c195f2b61e0b96cb..cf1a58be4e214e223087eef3a9d4018bddcb53dd 100644 (file)
@@ -1654,6 +1654,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
index fd67474e0f703c3c8b2932dadc2e3813f014ee4a..05681486566dd2bb6895374bc0988e32d425320a 100644 (file)
@@ -1655,6 +1655,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1778,6 +1779,9 @@ 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);
index 721f9c307b7de5db51e93fca6c12521d7cf05111..bc0d263abac09f4bf6ffa9fe7e4b10c07ff87bda 100644 (file)
@@ -1615,6 +1615,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1733,6 +1734,9 @@ 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);
index 0faaf77163696375931a16f919558a3842818f1f..72d0a8c53c66b7dfb94bf470edfb0728e2803296 100644 (file)
@@ -1654,6 +1654,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp-setA.h
new file mode 100644 (file)
index 0000000..52a0255
--- /dev/null
@@ -0,0 +1,6781 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp-setB.h
new file mode 100644 (file)
index 0000000..9bc006c
--- /dev/null
@@ -0,0 +1,7473 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp.c
new file mode 100644 (file)
index 0000000..b036c2e
--- /dev/null
@@ -0,0 +1,2562 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-2x5sp.h
new file mode 100644 (file)
index 0000000..cc58288
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * 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
+
index 11de650a656afa8caf25e9c091be584e6f5566e4..7f1d57636e923c5b9e061b165ad65a9bff19c83e 100644 (file)
@@ -1706,6 +1706,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1814,6 +1815,9 @@ 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";
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1-setA.h
new file mode 100644 (file)
index 0000000..7da4a39
--- /dev/null
@@ -0,0 +1,2969 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1-setB.h
new file mode 100644 (file)
index 0000000..9313654
--- /dev/null
@@ -0,0 +1,767 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1.c
new file mode 100644 (file)
index 0000000..d467973
--- /dev/null
@@ -0,0 +1,1908 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3j1.h
new file mode 100644 (file)
index 0000000..2ccd773
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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
+
index e7e518a5d33e0664f31bba6e28612bc3f298bd4f..14986ddca17bb111890d803ab8bd48b3fd9c45d6 100644 (file)
@@ -1629,6 +1629,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1756,6 +1757,9 @@ 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);
index 9d0e58bdade5257bf13421fb0ec9231494e68e22..779e84e78e122c124d435469550e8182c53eeb1c 100644 (file)
@@ -1621,6 +1621,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1745,6 +1746,9 @@ 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);
index 0a1d0d4d4ca4fbf87efe65ae93e97fc030e003dd..dbbd5b354a46c195b6f606770346b267bacc8e7a 100644 (file)
 #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 */
@@ -527,12 +525,13 @@ const u32 sensor_3m3_setfile_A_4032x3024_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,
 };
 
 const u32 sensor_3m3_setfile_A_4032x2268_30fps[] = {
@@ -584,14 +583,16 @@ 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,
@@ -641,6 +642,8 @@ const u32 sensor_3m3_setfile_A_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,
@@ -649,6 +652,65 @@ const u32 sensor_3m3_setfile_A_4032x1960_30fps[] = {
        //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,
@@ -698,12 +760,13 @@ const u32 sensor_3m3_setfile_A_3024x3024_30fps[] = {
        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[] = {
@@ -755,12 +818,13 @@ 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[] = {
@@ -812,12 +876,13 @@ 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[] = {
@@ -869,12 +934,13 @@ 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[] = {
@@ -926,12 +992,13 @@ 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[] = {
@@ -983,12 +1050,13 @@ 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 = {
@@ -1015,6 +1083,14 @@ const struct sensor_pll_info_compact sensor_3m3_pllinfo_A_4032x1960_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 */
@@ -1067,6 +1143,7 @@ static const u32 *sensor_3m3_setfiles_A[] = {
        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,
@@ -1079,6 +1156,7 @@ static const u32 sensor_3m3_setfile_A_sizes[] = {
        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),
@@ -1091,6 +1169,7 @@ static const struct sensor_pll_info_compact *sensor_3m3_pllinfos_A[] = {
        &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,
index e8c14de2080b08af91f14d2014e02f65b3331182..d4802aa9db38ba7a789ca63d7723e164781486ad 100644 (file)
@@ -456,8 +456,6 @@ const u32 sensor_3m3_setfile_B_Global[] = {
        0x30D2, 0x0004, 0x02,
        0x30D6, 0x0100, 0x02,
        0x30D8, 0x0100, 0x02,
-       0x30DA, 0x0016, 0x02,
-       0x30DC, 0x0016, 0x02,
        0x3EF8, 0x0000, 0x02,
        0x3EFA, 0x0000, 0x02,
        0x1118, 0x43C8, 0x02,
@@ -479,117 +477,121 @@ const u32 sensor_3m3_setfile_B_Global[] = {
 
 /*  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[] = {
@@ -641,6 +643,8 @@ 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,
@@ -650,345 +654,357 @@ const u32 sensor_3m3_setfile_B_4032x1960_30fps[] = {
 };
 
 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 = {
index 49e2752627323d05bb07eec3e347d0d3d3add030..49337db5c10cce468817501ef0135f272eb59dd0 100644 (file)
@@ -191,6 +191,45 @@ static int sensor_3m3_wait_stream_off_status(cis_shared_data *cis_data)
        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)
 {
@@ -198,7 +237,6 @@ 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;
 
@@ -212,20 +250,6 @@ int sensor_3m3_cis_init(struct v4l2_subdev *subdev)
        }
 
        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;
@@ -447,17 +471,23 @@ int sensor_3m3_cis_update_crop_region(struct v4l2_subdev *subdev)
                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;
        }
 
@@ -1937,7 +1967,7 @@ static int sensor_3m3_cis_update_pdaf_tail_size(struct v4l2_subdev *subdev, stru
                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;
@@ -1954,10 +1984,16 @@ static int sensor_3m3_cis_update_pdaf_tail_size(struct v4l2_subdev *subdev, stru
 
        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;
        }
 
@@ -1986,6 +2022,12 @@ static int sensor_3m3_cis_update_pdaf_tail_size(struct v4l2_subdev *subdev, stru
                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;
@@ -2035,6 +2077,8 @@ static struct fimc_is_cis_ops cis_ops = {
 #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,
@@ -2166,6 +2210,9 @@ 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);
index 13b803e81db2b843d6d30dc346579261947cc59f..95df77ccfee329c7b3f29862510075b59c8a6eff 100644 (file)
@@ -31,6 +31,7 @@ enum sensor_3m3_mode_enum {
        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,
index a586b226b7bf7d94c1bbdeb7e24e14ccb85e6731..78100df00a61a4c882d9b329b1af8bf4b04788b5 100644 (file)
@@ -1609,6 +1609,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1727,6 +1728,9 @@ 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);
index 8b339a3db8ba3749aa3d3070e7800ff0406ce811..0c5addc46d0cb0af731a40ce5460b206bf211622 100644 (file)
@@ -1688,6 +1688,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1824,6 +1825,9 @@ 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);
index 5bc6e0084477f3c12b50f325ebd4b4ede09408ab..fef70329110832778dcc29bff678e4f30d6c9e14 100644 (file)
@@ -1641,6 +1641,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1765,6 +1766,9 @@ 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9-setA.h
new file mode 100644 (file)
index 0000000..838226f
--- /dev/null
@@ -0,0 +1,2172 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9-setB.h
new file mode 100644 (file)
index 0000000..8cc93fa
--- /dev/null
@@ -0,0 +1,1023 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9.c
new file mode 100644 (file)
index 0000000..bdcf458
--- /dev/null
@@ -0,0 +1,1889 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-3p9.h
new file mode 100644 (file)
index 0000000..3f8e911
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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
+
index 9a328a661689c3e0ceda43eda150212ca162201a..e6f6db15d0e6fa627b87099e7f31ae707844bdcb 100644 (file)
@@ -1668,6 +1668,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1779,6 +1780,9 @@ 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);
index 1b24638759fb9bff72ee1d727f35fc0a6350db5e..d1ab955fbc8ed231ae5cbac2140922f8080f7181 100644 (file)
@@ -1669,6 +1669,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1787,6 +1788,9 @@ 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);
index accf23da5d7ed4d9d13293c8cd6b4ac77bc6caa0..ed8ba8ec842272bc62831e3817f7eb5c6874402c 100644 (file)
@@ -1684,6 +1684,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1800,6 +1801,9 @@ 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha-setA.h
new file mode 100644 (file)
index 0000000..068211f
--- /dev/null
@@ -0,0 +1,531 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha-setB.h
new file mode 100644 (file)
index 0000000..1c5859d
--- /dev/null
@@ -0,0 +1,531 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha.c
new file mode 100644 (file)
index 0000000..d16f24b
--- /dev/null
@@ -0,0 +1,1901 @@
+/*
+ * 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);
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-4ha.h
new file mode 100644 (file)
index 0000000..1797daa
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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
+
index 2d23f92e1199f066553a7b737a61d538d9fd8065..0e28f5111fd30b4c746ed8daf87536ccfce2fa3e 100644 (file)
@@ -1588,6 +1588,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1700,6 +1701,9 @@ 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);
index 695235455f96f369e86e7b3e5db79b5a9fa63a7e..769467d6c62495fc4f4078e8a5b1ea5c54c0603b 100644 (file)
@@ -1768,6 +1768,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1899,6 +1900,9 @@ 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setA.h
new file mode 100644 (file)
index 0000000..079061a
--- /dev/null
@@ -0,0 +1,855 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setB.h
new file mode 100644 (file)
index 0000000..7879ac1
--- /dev/null
@@ -0,0 +1,855 @@
+/*
+ * 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
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setC.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9-setC.h
new file mode 100644 (file)
index 0000000..7e44bdb
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9.c
new file mode 100755 (executable)
index 0000000..9f4e414
--- /dev/null
@@ -0,0 +1,2422 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-5e9.h
new file mode 100644 (file)
index 0000000..295c2e6
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * 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
+
index 6adf6bc29d15148b340a50f75050bf7054877b7e..63c8dffd64d0177a843a716d2601f1c9eb00e8fd 100644 (file)
@@ -1747,6 +1747,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp-setA.h
new file mode 100644 (file)
index 0000000..23cf8c8
--- /dev/null
@@ -0,0 +1,654 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp-setB.h
new file mode 100644 (file)
index 0000000..acf3aa3
--- /dev/null
@@ -0,0 +1,3888 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp.c
new file mode 100644 (file)
index 0000000..a3571a0
--- /dev/null
@@ -0,0 +1,1916 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-gm1sp.h
new file mode 100644 (file)
index 0000000..76b6346
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * 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
+
index 950f2e857596e2c029c5a373836034a66622af5c..d869bfb55eb2bcc3b160701be0c7c2b221b54894 100644 (file)
@@ -1616,6 +1616,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1734,6 +1735,9 @@ 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);
index e61cffc48776025c73e86dd75599cb34cadbcf07..eaaba5bda2ffb24bd64c6686b71835770856e257 100644 (file)
@@ -1531,6 +1531,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1669,6 +1670,9 @@ 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);
index 82ca677c24208feb60f4bf9f96ec13e2bcd5d88f..e1b8f75318831586c49a5b8f4766c6045607e453 100644 (file)
@@ -1549,6 +1549,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1687,6 +1688,9 @@ 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);
index 6543aa2aad4bd3230f86e5c1e9b41204c78bf6bf..0a86705b5896fadea470363925c9e1c547c25e98 100644 (file)
@@ -2142,6 +2142,7 @@ static struct fimc_is_cis_ops cis_ops_imx260 = {
        .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,
@@ -2254,6 +2255,9 @@ 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);
index 7e7848b6245f00151245a118120b2c41fe70bde2..a4bd79bbb8d6f06139d98fda7d349d53140336f1 100644 (file)
@@ -1931,6 +1931,7 @@ static struct fimc_is_cis_ops cis_ops_imx320 = {
        .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,
@@ -2043,6 +2044,9 @@ 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);
index 588613e634a28b8a6cd1876612847ee235c703b6..17fa5d6ec438cee756b3d1ed878088f91c31960e 100644 (file)
@@ -2079,6 +2079,7 @@ static struct fimc_is_cis_ops cis_ops_imx333 = {
        .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,
@@ -2191,6 +2192,9 @@ 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576-setA.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576-setA.h
new file mode 100644 (file)
index 0000000..3891e40
--- /dev/null
@@ -0,0 +1,2367 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576-setB.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576-setB.h
new file mode 100644 (file)
index 0000000..54a2960
--- /dev/null
@@ -0,0 +1,2682 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576.c
new file mode 100644 (file)
index 0000000..b34bfe0
--- /dev/null
@@ -0,0 +1,2131 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis-imx576.h
new file mode 100644 (file)
index 0000000..c0250d0
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * 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
+
+
index 0f576c5dcc7eb539e4754afa0567c97572e9ead2..9a6ac8950404ffdf8f2a9d8ddc6f1f49e2b506ed 100644 (file)
@@ -1662,6 +1662,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1806,6 +1807,9 @@ 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);
index efb76bb83b6f2889868e1a9e204beed227b949aa..bd70bffcf2b4e3174798ae34edc750272692fef2 100644 (file)
@@ -1692,6 +1692,7 @@ static struct fimc_is_cis_ops cis_ops = {
        .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,
@@ -1823,6 +1824,9 @@ 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);
index 18daa8452edf5c8e32582681db952ee27d70a1a5..228d299c9560c9c3bf30f926bf75421148e9a0d2 100644 (file)
@@ -279,6 +279,7 @@ int sensor_cis_compensate_gain_for_extremely_br(struct v4l2_subdev *subdev, u32
        u32 min_fine_int = 0;
        u16 coarse_int = 0;
        u32 compensated_again = 0;
+       u32 coarse_int_standard;
 
        FIMC_BUG(!subdev);
        FIMC_BUG(!again);
@@ -308,7 +309,14 @@ int sensor_cis_compensate_gain_for_extremely_br(struct v4l2_subdev *subdev, u32
                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]) {
@@ -457,7 +465,7 @@ int sensor_cis_wait_streamon(struct v4l2_subdev *subdev)
        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);
@@ -539,3 +547,172 @@ int sensor_cis_set_initial_exposure(struct v4l2_subdev *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;
+}
index 105b383f3e1e1157a6431492f6fc61a2349de7a8..f5614a9dbeca975c1e51d10ae8825ab92c001b94 100644 (file)
 #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 */
 
@@ -76,5 +72,10 @@ int sensor_cis_wait_streamoff(struct v4l2_subdev *subdev);
 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/Kconfig b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/Kconfig
new file mode 100644 (file)
index 0000000..26e5876
--- /dev/null
@@ -0,0 +1,45 @@
+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.
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/Makefile b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/Makefile
new file mode 100644 (file)
index 0000000..7c8ab1b
--- /dev/null
@@ -0,0 +1,13 @@
+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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10.c
new file mode 100644 (file)
index 0000000..dacee13
--- /dev/null
@@ -0,0 +1,611 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10.h
new file mode 100644 (file)
index 0000000..e267749
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10ff.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10ff.c
new file mode 100644 (file)
index 0000000..3f66cf9
--- /dev/null
@@ -0,0 +1,447 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10ff.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-12a10ff.h
new file mode 100644 (file)
index 0000000..cc7b26d
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-16885c.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-16885c.c
new file mode 100644 (file)
index 0000000..d9314c3
--- /dev/null
@@ -0,0 +1,447 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-16885c.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-16885c.h
new file mode 100644 (file)
index 0000000..8a2d220
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-5e9.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-5e9.c
new file mode 100644 (file)
index 0000000..743373f
--- /dev/null
@@ -0,0 +1,483 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-5e9.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-5e9.h
new file mode 100644 (file)
index 0000000..e969427
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-gm1.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-gm1.c
new file mode 100755 (executable)
index 0000000..969f438
--- /dev/null
@@ -0,0 +1,646 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-gm1.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom-gm1.h
new file mode 100644 (file)
index 0000000..fbd1ec7
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * 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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom.c
new file mode 100644 (file)
index 0000000..278f03b
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * 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;
+}
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/eeprom/fimc-is-sensor-eeprom.h
new file mode 100644 (file)
index 0000000..f1b0edc
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * 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
+
index 75c897afb58811c8153bbc3f5719244736014539..f74ee60d769f8da7da1360f9010b35db1aae8a87 100644 (file)
@@ -37,6 +37,17 @@ u32 fimc_is_sensor_convert_ns_to_us(u64 nsec)
        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)
 {
@@ -53,6 +64,91 @@ 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);
@@ -71,7 +167,10 @@ void fimc_is_sensor_ctl_update_cis_data(cis_shared_data *cis_data, camera2_senso
                                        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,
@@ -109,6 +208,8 @@ 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;
@@ -117,15 +218,23 @@ void fimc_is_sensor_ctl_adjust_ae_setting(struct fimc_is_device_sensor *device,
        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;
@@ -134,27 +243,38 @@ void fimc_is_sensor_ctl_adjust_ae_setting(struct fimc_is_device_sensor *device,
 }
 
 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);
        }
 
 }
@@ -217,28 +337,19 @@ p_err:
        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)) {
@@ -249,86 +360,70 @@ int fimc_is_sensor_ctl_adjust_gains(struct fimc_is_device_sensor *device,
        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)) {
@@ -336,43 +431,140 @@ int fimc_is_sensor_ctl_update_gains(struct fimc_is_device_sensor *device,
                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);
@@ -386,27 +578,29 @@ int fimc_is_sensor_ctl_set_exposure(struct fimc_is_device_sensor *device,
        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:
@@ -422,9 +616,7 @@ void fimc_is_sensor_ctl_frame_evt(struct fimc_is_device_sensor *device)
        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;
@@ -465,12 +657,15 @@ void fimc_is_sensor_ctl_frame_evt(struct fimc_is_device_sensor *device)
        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;
@@ -487,7 +682,7 @@ void fimc_is_sensor_ctl_frame_evt(struct fimc_is_device_sensor *device)
                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
@@ -498,28 +693,17 @@ void fimc_is_sensor_ctl_frame_evt(struct fimc_is_device_sensor *device)
                        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);
 
@@ -529,35 +713,47 @@ void fimc_is_sensor_ctl_frame_evt(struct fimc_is_device_sensor *device)
                        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__,
@@ -571,27 +767,34 @@ void fimc_is_sensor_ctl_frame_evt(struct fimc_is_device_sensor *device)
                }
        }
 
-       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;
                }
        }
 
index 7297323db3c9245f281b659992585cf7640dd0bd..5c572dbc2ff0945bdec5ee87e412f7069bd6008d 100644 (file)
@@ -13,6 +13,8 @@
 
 #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);
@@ -44,6 +39,13 @@ void fimc_is_sensor_ois_stop(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,
index ca6d4c3b86e41bf3feef3ca10ff9f9a78633cf9a..ee15ba67db93819f9a764b73a1a0759c6e1c334e 100755 (executable)
@@ -182,13 +182,45 @@ struct fimc_is_device_sensor_peri *find_peri_by_ois_id(struct fimc_is_device_sen
        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;
@@ -206,6 +238,12 @@ static void fimc_is_sensor_init_expecting_dm(struct fimc_is_device_sensor *devic
 
        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)
@@ -218,6 +256,15 @@ static void fimc_is_sensor_init_expecting_dm(struct fimc_is_device_sensor *devic
        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:
@@ -246,46 +293,31 @@ void fimc_is_sensor_cis_status_dump_work(struct work_struct *data)
 }
 
 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);
        }
 }
 
@@ -327,7 +359,7 @@ int fimc_is_sensor_init_sensor_thread(struct fimc_is_device_sensor_peri *sensor_
                        return ret;
                }
 
-               sensor_peri->sensor_work_index = 0;
+               kthread_init_work(&sensor_peri->sensor_work, fimc_is_sensor_sensor_work_fn);
        }
 
        return ret;
@@ -340,6 +372,7 @@ void fimc_is_sensor_deinit_sensor_thread(struct fimc_is_device_sensor_peri *sens
                        err("kthread_stop fail");
 
                sensor_peri->sensor_task = NULL;
+               sensor_peri->use_sensor_work = false;
                info("%s:\n", __func__);
        }
 }
@@ -351,6 +384,19 @@ int fimc_is_sensor_init_mode_change_thread(struct fimc_is_device_sensor_peri *se
        /* 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,
@@ -361,6 +407,12 @@ int fimc_is_sensor_init_mode_change_thread(struct fimc_is_device_sensor_peri *se
                        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;
        }
 
@@ -376,13 +428,22 @@ void fimc_is_sensor_deinit_mode_change_thread(struct fimc_is_device_sensor_peri
                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);
@@ -391,47 +452,51 @@ int fimc_is_sensor_initial_setting_low_exposure(struct fimc_is_device_sensor_per
        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);
 
@@ -458,14 +523,11 @@ int fimc_is_sensor_mode_change(struct fimc_is_cis *cis, u32 mode)
 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);
@@ -473,73 +535,126 @@ void fimc_is_sensor_setting_mode_change(struct fimc_is_device_sensor_peri *senso
        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);
@@ -593,45 +708,49 @@ void fimc_is_sensor_flash_fire_work(struct work_struct *data)
        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__,
@@ -664,10 +783,6 @@ void fimc_is_sensor_flash_fire_work(struct work_struct *data)
        } 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,
@@ -773,51 +888,133 @@ void fimc_is_sensor_flash_expire_work(struct work_struct *data)
        }
 }
 
-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)
@@ -836,14 +1033,17 @@ 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);
@@ -856,47 +1056,35 @@ void fimc_is_sensor_aperture_set_work(struct work_struct *data)
                        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);
 
@@ -914,21 +1102,22 @@ int fimc_is_sensor_flash_fire(struct fimc_is_device_sensor_peri *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 ||
@@ -987,8 +1176,9 @@ int fimc_is_sensor_peri_notify_actuator(struct v4l2_subdev *subdev, void *arg)
        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);
@@ -1005,6 +1195,7 @@ int fimc_is_sensor_peri_notify_vsync(struct v4l2_subdev *subdev, void *arg)
        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);
@@ -1023,7 +1214,14 @@ int fimc_is_sensor_peri_notify_vsync(struct v4l2_subdev *subdev, void *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);
        }
@@ -1045,7 +1243,6 @@ int fimc_is_sensor_peri_notify_vsync(struct v4l2_subdev *subdev, void *arg)
                                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) ||
@@ -1182,6 +1379,54 @@ p_err:
        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;
@@ -1207,11 +1452,12 @@ int fimc_is_sensor_peri_pre_flash_fire(struct v4l2_subdev *subdev, void *arg)
        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;
@@ -1221,9 +1467,14 @@ int fimc_is_sensor_peri_pre_flash_fire(struct v4l2_subdev *subdev, void *arg)
                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;
@@ -1231,7 +1482,6 @@ int fimc_is_sensor_peri_pre_flash_fire(struct v4l2_subdev *subdev, void *arg)
        sensor_ctl->flash_frame_number = 0;
        sensor_ctl->valid_flash_udctrl = false;
 
-p_err:
        return ret;
 }
 
@@ -1306,6 +1556,8 @@ void fimc_is_sensor_long_term_mode_set_work(struct work_struct *data)
        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;
 
@@ -1318,9 +1570,6 @@ void fimc_is_sensor_long_term_mode_set_work(struct work_struct *data)
        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__);
@@ -1328,6 +1577,9 @@ void fimc_is_sensor_long_term_mode_set_work(struct work_struct *data)
                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);
@@ -1374,28 +1626,24 @@ void fimc_is_sensor_long_term_mode_set_work(struct work_struct *data)
                }
        }
 
+       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++;
 
@@ -1439,6 +1687,7 @@ void fimc_is_sensor_peri_init_work(struct fimc_is_device_sensor_peri *sensor_per
        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);
        }
@@ -1453,11 +1702,17 @@ void fimc_is_sensor_peri_init_work(struct fimc_is_device_sensor_peri *sensor_per
        /* 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)
@@ -1516,8 +1771,8 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
        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) {
@@ -1544,15 +1799,42 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
                        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);
                        }
                }
 
@@ -1565,7 +1847,6 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
                        }
                }
 #endif
-
                /* stream on sequence */
                if (cis->need_mode_change == false && cis->use_initial_ae == false) {
                        /* only first time after camera on */
@@ -1609,9 +1890,22 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
                        }
                }
 
-               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);
@@ -1629,11 +1923,13 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
                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)
@@ -1641,7 +1937,8 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
 #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);
@@ -1650,16 +1947,6 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
                }
 #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) {
@@ -1670,10 +1957,21 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
                }
                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)",
@@ -1687,8 +1985,8 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
 #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;
 }
@@ -1746,13 +2044,12 @@ p_err:
 }
 
 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);
 
@@ -1771,41 +2068,33 @@ int fimc_is_sensor_peri_s_exposure_time(struct fimc_is_device_sensor *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);
 
@@ -1824,22 +2113,14 @@ int fimc_is_sensor_peri_s_analog_gain(struct fimc_is_device_sensor *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);
@@ -1847,20 +2128,19 @@ int fimc_is_sensor_peri_s_analog_gain(struct fimc_is_device_sensor *device,
        }
        /* 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);
 
@@ -1879,22 +2159,14 @@ int fimc_is_sensor_peri_s_digital_gain(struct fimc_is_device_sensor *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);
@@ -1902,12 +2174,99 @@ int fimc_is_sensor_peri_s_digital_gain(struct fimc_is_device_sensor *device,
        }
        /* 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)
@@ -1978,6 +2337,11 @@ int fimc_is_sensor_peri_compensate_gain_for_ext_br(struct fimc_is_device_sensor
        }
        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);
@@ -1991,6 +2355,7 @@ p_err:
 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");
@@ -2008,16 +2373,18 @@ int fimc_is_sensor_peri_debug_fixed(struct fimc_is_device_sensor *device)
 
                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,
@@ -2026,9 +2393,9 @@ int fimc_is_sensor_peri_debug_fixed(struct fimc_is_device_sensor *device)
                }
 
                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,
index dbd7c4f45714d4d49b37032bc0ea0e8242364269..e9547b6a2b5b1204ecd0498e000ac516ace5b9f4 100644 (file)
@@ -46,6 +46,8 @@ struct fimc_is_cis {
        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];
 
@@ -53,21 +55,17 @@ struct fimc_is_cis {
        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;
@@ -95,6 +93,20 @@ struct fimc_is_cis {
        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 {
@@ -150,6 +162,16 @@ struct fimc_is_actuator {
        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 {
@@ -165,16 +187,34 @@ 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;
@@ -189,6 +229,9 @@ struct fimc_is_flash {
        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;
 
@@ -216,6 +259,38 @@ struct fimc_is_ois {
        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 {
@@ -233,20 +308,74 @@ 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;
@@ -281,10 +410,18 @@ struct fimc_is_paf {
        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 {
@@ -308,22 +445,32 @@ 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;
@@ -336,6 +483,7 @@ struct fimc_is_device_sensor_peri {
 };
 
 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);
@@ -352,12 +500,15 @@ struct fimc_is_device_sensor_peri *find_peri_by_preprocessor_id(struct fimc_is_d
                                                        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);
@@ -366,6 +517,7 @@ int fimc_is_sensor_peri_pre_flash_fire(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);
@@ -381,11 +533,17 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
 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);
 
@@ -415,5 +573,6 @@ void fimc_is_sensor_peri_init_work(struct fimc_is_device_sensor_peri *sensor_per
 #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
index 602e97b55cae610bdeabf1f9abc5c08e2d80c9ff..386714ae1f9cb54f349a88a476caa64cc21184e8 100644 (file)
@@ -300,7 +300,8 @@ int get_cur_frame_position(struct fimc_is_sensor_interface *itf, u32 *position)
 
        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);
@@ -371,7 +372,8 @@ int get_prev_frame_position(struct fimc_is_sensor_interface *itf,
        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);
@@ -429,6 +431,23 @@ int get_status(struct fimc_is_sensor_interface *itf, u32 *status)
                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;
 }
index b2425377c47f234c127a3b133fa8f3040efd26b7..459d64527d5b63af6b3bf52c4ae4a527e5b5a87f 100755 (executable)
 #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,
@@ -171,7 +119,7 @@ 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;
        }
@@ -184,7 +132,7 @@ int sensor_get_ctrl(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;
                goto p_err;
        }
@@ -198,7 +146,7 @@ int sensor_get_ctrl(struct fimc_is_sensor_interface *itf,
 
        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;
        }
@@ -223,96 +171,64 @@ int set_interface_param(struct fimc_is_sensor_interface *itf,
                        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:
@@ -323,84 +239,60 @@ int get_interface_param(struct fimc_is_sensor_interface *itf,
                        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);
@@ -428,7 +320,7 @@ u32 get_frame_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;
                }
@@ -442,7 +334,7 @@ u32 get_frame_count(struct fimc_is_sensor_interface *itf)
 
                device = v4l2_get_subdev_hostdata(subdev_module);
                if (unlikely(!device)) {
-                       err("%s, device in is NULL", __func__);
+                       err("device in is NULL");
                        return 0;
                }
 
@@ -509,8 +401,8 @@ int get_num_of_frame_per_one_3aa(struct fimc_is_sensor_interface *itf,
                                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;
@@ -528,12 +420,8 @@ int set_exposure(struct fimc_is_sensor_interface *itf,
                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);
        }
 
@@ -542,9 +430,10 @@ int set_exposure(struct fimc_is_sensor_interface *itf,
 
 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;
@@ -554,6 +443,9 @@ int set_gain_permile(struct fimc_is_sensor_interface *itf,
 
        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);
 
@@ -563,30 +455,9 @@ int set_gain_permile(struct fimc_is_sensor_interface *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;
@@ -599,51 +470,9 @@ int request_reset_interface(struct fimc_is_sensor_interface *itf,
                                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,
@@ -837,8 +666,7 @@ 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 ret = 0;
        u32 i = 0;
@@ -848,14 +676,22 @@ int request_exposure(struct fimc_is_sensor_interface *itf,
        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;
@@ -865,7 +701,7 @@ int request_exposure(struct fimc_is_sensor_interface *itf,
 
        /* 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;
@@ -880,18 +716,19 @@ int request_exposure(struct fimc_is_sensor_interface *itf,
        }
 
        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 */
@@ -903,8 +740,8 @@ int adjust_exposure(struct fimc_is_sensor_interface *itf,
 }
 
 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)
 {
@@ -912,12 +749,11 @@ int get_next_frame_timing(struct fimc_is_sensor_interface *itf,
        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);
 
@@ -928,16 +764,19 @@ int get_next_frame_timing(struct fimc_is_sensor_interface *itf,
        *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)
 {
@@ -945,12 +784,11 @@ int get_frame_timing(struct fimc_is_sensor_interface *itf,
        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);
 
@@ -961,16 +799,19 @@ int get_frame_timing(struct fimc_is_sensor_interface *itf,
        *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;
@@ -978,15 +819,19 @@ int request_analog_gain(struct fimc_is_sensor_interface *itf,
 
        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;
@@ -998,12 +843,10 @@ 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;
@@ -1012,41 +855,51 @@ int request_gain(struct fimc_is_sensor_interface *itf,
 
        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;
@@ -1061,10 +914,14 @@ int request_gain(struct fimc_is_sensor_interface *itf,
        }
 
        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;
@@ -1126,107 +983,246 @@ int request_sensitivity(struct fimc_is_sensor_interface *itf,
        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;
 
@@ -1431,7 +1427,7 @@ int set_alg_reset_flag(struct fimc_is_sensor_interface *itf,
        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;
        }
 
@@ -1641,34 +1637,8 @@ int get_offset_from_cur_result(struct fimc_is_sensor_interface *itf,
 
 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;
 }
@@ -1688,7 +1658,7 @@ int apply_sensor_setting(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;
                goto p_err;
        }
@@ -1711,43 +1681,49 @@ 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;
@@ -1755,69 +1731,100 @@ int request_reset_expo_gain(struct fimc_is_sensor_interface *itf,
        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;
 }
@@ -1849,11 +1856,39 @@ int update_sensor_dynamic_meta(struct fimc_is_sensor_interface *itf,
        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;
 }
@@ -1883,11 +1918,10 @@ int copy_sensor_ctl(struct fimc_is_sensor_interface *itf,
        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) {
@@ -1904,6 +1938,12 @@ int copy_sensor_ctl(struct fimc_is_sensor_interface *itf,
                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
@@ -1945,7 +1985,7 @@ int get_module_id(struct fimc_is_sensor_interface *itf, u32 *module_id)
 
        module = sensor_peri->module;
        if (unlikely(!module)) {
-               err("%s, module in is NULL", __func__);
+               err("module in is NULL");
                module = NULL;
                goto p_err;
        }
@@ -1972,7 +2012,7 @@ int get_module_position(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;
                goto p_err;
        }
@@ -1997,7 +2037,7 @@ int set_sensor_3a_mode(struct fimc_is_sensor_interface *itf,
        FIMC_BUG(!sensor_peri);
 
        if (mode > 1) {
-               err("ERR[%s] invalid mode(%d)\n", __func__, mode);
+               err("invalid mode(%d)\n", mode);
                return -1;
        }
 
@@ -2016,14 +2056,13 @@ int set_sensor_3a_mode(struct fimc_is_sensor_interface *itf,
 }
 
 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__);
@@ -2039,25 +2078,49 @@ int get_initial_exposure_gain_of_sensor(struct fimc_is_sensor_interface *itf,
        }
 
        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;
 }
@@ -2139,19 +2202,23 @@ int start_of_frame(struct fimc_is_sensor_interface *itf)
 
        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;
@@ -2168,7 +2235,8 @@ int start_of_frame(struct fimc_is_sensor_interface *itf)
        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 */
@@ -2187,14 +2255,12 @@ int end_of_frame(struct fimc_is_sensor_interface *itf)
 {
        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);
@@ -2206,24 +2272,27 @@ int end_of_frame(struct fimc_is_sensor_interface *itf)
                /* 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;
@@ -2231,11 +2300,11 @@ int end_of_frame(struct fimc_is_sensor_interface *itf)
 
                        /* 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;
@@ -2259,7 +2328,7 @@ int apply_frame_settings(struct fimc_is_sensor_interface *itf)
        /* NOT IMPLEMENTED YET */
        int ret = -1;
 
-       err("[%s] NOT IMPLEMENTED YET\n", __func__);
+       err("NOT IMPLEMENTED YET\n");
 
        return ret;
 }
@@ -2280,11 +2349,11 @@ int set_aperture_value(struct fimc_is_sensor_interface *itf, int value)
 
        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;
@@ -2293,6 +2362,7 @@ int set_aperture_value(struct fimc_is_sensor_interface *itf, int value)
 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;
@@ -2321,11 +2391,16 @@ int get_aperture_value(struct fimc_is_sensor_interface *itf, struct fimc_is_apat
        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;
 }
@@ -2346,10 +2421,15 @@ int set_flash(struct fimc_is_sensor_interface *itf,
        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:
@@ -2547,33 +2627,28 @@ static struct fimc_is_framemgr *get_csi_vc_framemgr(struct fimc_is_device_csi *c
 
 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;
        }
 
@@ -2581,82 +2656,97 @@ int get_vc_dma_buf(struct fimc_is_sensor_interface *itf,
 
        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;
 }
@@ -2669,43 +2759,54 @@ int put_vc_dma_buf(struct fimc_is_sensor_interface *itf,
        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;
@@ -2716,9 +2817,6 @@ int put_vc_dma_buf(struct fimc_is_sensor_interface *itf,
                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);
@@ -2733,128 +2831,100 @@ int put_vc_dma_buf(struct fimc_is_sensor_interface *itf,
 
        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,
@@ -2863,52 +2933,163 @@ 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;
 }
@@ -2926,8 +3107,10 @@ int set_long_term_expo_mode(struct fimc_is_sensor_interface *itf,
        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++) {
@@ -2977,13 +3160,62 @@ int set_low_noise_mode(struct fimc_is_sensor_interface *itf, u32 mode)
        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;
        }
 
@@ -3051,177 +3283,229 @@ int dual_reserved_1(struct fimc_is_sensor_interface *itf)
        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;
 }
@@ -3345,32 +3629,41 @@ int init_sensor_interface(struct fimc_is_sensor_interface *itf)
        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;
@@ -3378,17 +3671,9 @@ int init_sensor_interface(struct fimc_is_sensor_interface *itf)
        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;
 }
index 2c1761d023021a901eb4c42cb688e8bbd5e2e13a..dadc3741e2c66bd27f97fa422ad7a5ac82418915 100755 (executable)
@@ -53,6 +53,9 @@
 #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
@@ -63,6 +66,11 @@ enum SENSOR_CONTROL_DELAY {
        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)
@@ -75,6 +83,7 @@ struct ae_param {
                u32 long_val;
        };
        u32 short_val;
+       u32 middle_val;
 };
 
 typedef struct {
@@ -87,48 +96,86 @@ 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 {
@@ -170,6 +217,52 @@ 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
@@ -284,6 +377,7 @@ typedef struct {
 #ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
        u32                             sensor_shifted_num;
 #endif
+       bool dual_sync_enable;
 } cis_shared_data;
 
 struct v4l2_subdev;
@@ -337,6 +431,16 @@ struct fimc_is_cis_ops {
        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
@@ -384,6 +488,19 @@ 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_ {
@@ -421,6 +538,7 @@ enum fimc_is_sensor_peri_state {
        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 {
@@ -443,9 +561,32 @@ enum fimc_is_cis_lownoise_mode {
        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,
@@ -465,9 +606,11 @@ struct fimc_is_actuator_ops {
 
 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);
 };
 
@@ -513,7 +656,7 @@ struct fimc_is_long_term_expo_mode {
 /* 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
@@ -528,13 +671,16 @@ struct fimc_is_ois_ops {
        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);
@@ -546,6 +692,9 @@ struct fimc_is_ois_ops {
        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;
@@ -579,62 +728,57 @@ struct fimc_is_cis_interface_ops {
        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);
@@ -698,21 +842,16 @@ struct fimc_is_cis_interface_ops {
 
        /* 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,
@@ -734,12 +873,10 @@ struct fimc_is_cis_interface_ops {
        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 {
@@ -756,13 +893,33 @@ 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 {
@@ -859,255 +1016,6 @@ struct fimc_is_flash_expo_gain {
        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,
@@ -1126,44 +1034,51 @@ struct fimc_is_flash_interface_ops {
                                        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 {
@@ -1175,6 +1090,21 @@ 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;
@@ -1183,7 +1113,6 @@ struct fimc_is_sensor_interface {
        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;
@@ -1192,10 +1121,10 @@ struct fimc_is_sensor_interface {
        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];
@@ -1212,8 +1141,6 @@ struct fimc_is_sensor_interface {
 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);
 
index f2a6e68763d41aefbec6d8aa4dc3a8834319feb3..f9ab987842390ce9ddd3673a75f9c218f1e67fd6 100644 (file)
@@ -28,6 +28,14 @@ config CAMERA_FLASH_S2MPB02_OBJ
         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
index 20ebbd567c00a96758aff3cfd35593ede0408479..950c3ddae984ed9930b60dad8b22d322d6609399 100644 (file)
@@ -1,6 +1,7 @@
 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 \
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/flash/fimc-is-flash-s2mu106.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/flash/fimc-is-flash-s2mu106.c
new file mode 100644 (file)
index 0000000..9216bfe
--- /dev/null
@@ -0,0 +1,461 @@
+/*
+ * 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);
index cfc6dc7f60367a46913a0e9fd26e3cfc3db308af..eabeb5c0277991e50db8b03d24bc0f023517cb16 100644 (file)
@@ -3,19 +3,23 @@ obj-$(CONFIG_USE_DIRECT_IS_CONTROL) += fimc-is-device-module-base.o
 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
@@ -23,6 +27,7 @@ obj-$(CONFIG_CAMERA_CIS_2P7SQ_OBJ) += fimc-is-device-module-2p7sq.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
@@ -33,6 +38,12 @@ obj-$(CONFIG_CAMERA_CIS_IMX219_OBJ) += fimc-is-device-module-imx219.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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-12a10.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-12a10.c
new file mode 100755 (executable)
index 0000000..94b0cf0
--- /dev/null
@@ -0,0 +1,495 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-12a10ff.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-12a10ff.c
new file mode 100755 (executable)
index 0000000..ae9d255
--- /dev/null
@@ -0,0 +1,488 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-16885c.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-16885c.c
new file mode 100755 (executable)
index 0000000..03ec6fe
--- /dev/null
@@ -0,0 +1,484 @@
+/*
+ * 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);
index ef931421f25fa7a28759f25b8b32a1deba6a192d..ae6e8e7936c2ba6a96b1b74354fa0dba08a48d9c 100644 (file)
@@ -105,6 +105,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index e468580c42e3dc2524c725f436deac535aa8e0f7..efeff61fecaf536446032c78615434d944624000 100644 (file)
@@ -143,6 +143,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 3268c002c6ee1e913a2ca462369aeddd96886e38..b74c185eba9f69325ad61a24d0ec04a3d82b2a99 100644 (file)
 
 #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),
@@ -161,18 +151,23 @@ static struct fimc_is_sensor_cfg config_module_2l3[] = {
                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),
@@ -190,6 +185,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
@@ -464,7 +460,6 @@ static int sensor_2l3_power_setpin(struct device *dev,
        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;
@@ -481,7 +476,7 @@ static int __init sensor_module_2l3_probe(struct platform_device *pdev)
        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);
@@ -540,20 +535,36 @@ static int __init sensor_module_2l3_probe(struct platform_device *pdev)
        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;
+                       }
                }
        }
 
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2l4.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2l4.c
new file mode 100644 (file)
index 0000000..0f31ba1
--- /dev/null
@@ -0,0 +1,708 @@
+/*
+ * 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);
index bebbde61a7b55d46ab003cf62ca8831a22b36d77..001219ad4e17a8c5861075e8233bd9546926e371 100644 (file)
@@ -129,6 +129,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 90c35c1c7c033f9c1f27e4529518e64d7997229e..9b507b7211ed87f89a24486ea5550faeb0cfd1de 100644 (file)
@@ -82,6 +82,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 63af26fee2c3c9a80c5e3c380f4d710198973708..f179579eb31f96039c78e617f414ce6410da6a52 100644 (file)
@@ -90,6 +90,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
@@ -144,6 +145,8 @@ static int sensor_module_2p7sq_power_setpin(struct device *dev,
        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);
@@ -194,6 +197,31 @@ static int sensor_module_2p7sq_power_setpin(struct device *dev,
        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;
index 635597f6efb67fda6733e5c6fc4dddd0fe8495c0..41c3313d81a363e5100104d3be07dcbf26da07d4 100644 (file)
@@ -77,6 +77,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index b3a97446af16b775ec73fb89ecb8dcf22cbf43fc..6a82cb6ba61ac864fefe85129d625cceb7f17a91 100644 (file)
@@ -80,6 +80,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 1e116acba11a83ea4660e689b4b6d28ed56fe514..4f812d6a09c76218b4afeac2e03e383e147951fc 100644 (file)
@@ -85,6 +85,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
@@ -139,6 +140,8 @@ static int sensor_module_2t7sx_power_setpin(struct device *dev,
        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);
@@ -189,6 +192,31 @@ static int sensor_module_2t7sx_power_setpin(struct device *dev,
        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;
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2x5sp.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-2x5sp.c
new file mode 100644 (file)
index 0000000..808f09b
--- /dev/null
@@ -0,0 +1,471 @@
+/*
+ * 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);
index 0e4b146a0f391b0c2f5b873a875e1507078b3c8a..622acb3abfd24d03b1f5e19371c6d35186084d8d 100644 (file)
@@ -109,6 +109,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
@@ -180,6 +181,9 @@ static int sensor_module_3h1_power_setpin(struct device *dev,
 
        /********** 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);
@@ -209,6 +213,9 @@ static int sensor_module_3h1_power_setpin(struct device *dev,
                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);
        }
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3j1.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3j1.c
new file mode 100644 (file)
index 0000000..6e1c7d9
--- /dev/null
@@ -0,0 +1,417 @@
+/*
+ * 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);
index 0e42a858ba34743cebb2a5668e9d48e893f731ad..b0c7940df782e25b1b71802507d7b1a6d0d61914 100644 (file)
@@ -94,6 +94,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 8c815dc7f932e0e7be6e9568631e4d3c1502efe7..fe051a5ccca5caececb5502220c4e6738eac39ed 100644 (file)
@@ -77,6 +77,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 6a30fa909d18c6787f8da4f315e3eb5aa088ca21..ca22705527ab938adfc2238ded886fa3f549dd39 100644 (file)
 
 #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,
@@ -65,32 +55,37 @@ static struct fimc_is_sensor_cfg config_module_3m3[] = {
                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),
@@ -108,6 +103,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
@@ -132,17 +128,9 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
        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;
@@ -173,188 +161,33 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
        }
 #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
@@ -364,12 +197,14 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
        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,
@@ -384,12 +219,20 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
 #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);
@@ -400,9 +243,6 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
        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);
@@ -414,10 +254,15 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
        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",
@@ -425,7 +270,6 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
 #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);
@@ -450,7 +294,6 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
 #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);
@@ -459,6 +302,8 @@ static int sensor_module_3m3_power_setpin(struct device *dev,
 #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__);
@@ -476,7 +321,7 @@ static int __init sensor_module_3m3_probe(struct platform_device *pdev)
        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);
@@ -528,23 +373,60 @@ static int __init sensor_module_3m3_probe(struct platform_device *pdev)
        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;
+                       }
                }
        }
 
@@ -613,6 +495,17 @@ static int __init sensor_module_3m3_probe(struct platform_device *pdev)
                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);
index 06b4ee96b22b1ad5c8092de4afc367d0f6181b14..423476a7b1bd84ab77ed6af9997db3a854e9549e 100644 (file)
@@ -87,6 +87,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index f438d4aa3e3f92761d625b29195b02f4058750b1..258d7809b1eba40f7e0dbaeb33b39abd6033651f 100644 (file)
@@ -96,6 +96,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
 };
index a61f71543003a5b7ff4318642af411b5fb69751a..82467c96e3a9841a9d8364fce9cccc82b1c8730d 100644 (file)
@@ -69,6 +69,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
 };
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3p9.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-3p9.c
new file mode 100644 (file)
index 0000000..f6ad565
--- /dev/null
@@ -0,0 +1,423 @@
+/*
+ * 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);
index de6c0d4e7ad472ffa7808bb33879fe4717c25eaf..31ff3a3015dbed5edfeb5f598b11857f55470c93 100644 (file)
@@ -83,6 +83,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index f957710f637a4e769471823c4279adf808e3974c..9f51b7eeedc4f1b339be33da252a131dd84c33a5 100644 (file)
@@ -75,6 +75,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 5624f5ed26723fdf45a249a0fa4bc222eed534c1..550cdad3cd4992556364a77599a465597e1ff306 100644 (file)
@@ -76,6 +76,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-4ha.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-4ha.c
new file mode 100644 (file)
index 0000000..44a8194
--- /dev/null
@@ -0,0 +1,326 @@
+/*
+ * 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);
+
index c92ac0a1f2cd5afcef1ccfba0dededdd62a2ca6e..62561200a794e2bf178978b2b779de677af128b9 100644 (file)
@@ -87,6 +87,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index cfaae75402f66e590a44b3f4e6d6c5667f9fe133..87e65c0bbbbb1f2147c41b30e12df7fdffc78fbe 100644 (file)
@@ -73,6 +73,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index bea7a530a4f00d3f11e671e305037801146d3b0c..06884964f607b1527960205d433ba05e87223c02 100644 (file)
@@ -466,6 +466,12 @@ static const struct v4l2_subdev_core_ops core_ops = {
        .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)
 {
@@ -561,6 +567,7 @@ static int sensor_5e6_s_format(struct v4l2_subdev *subdev,  struct v4l2_subdev_pa
 }
 
 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
 };
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5e9.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-5e9.c
new file mode 100644 (file)
index 0000000..3663a24
--- /dev/null
@@ -0,0 +1,525 @@
+/*
+ * 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);
index 0c712d2247c7758dcfb6002c0bc9bedd20e0ba3b..a659236cc0ab1da2ceb143117a20a3f7e6769e7a 100644 (file)
@@ -413,6 +413,12 @@ static const struct v4l2_subdev_core_ops core_ops = {
        .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)
 {
@@ -508,6 +514,7 @@ static int sensor_5f1_s_format(struct v4l2_subdev *subdev,
 }
 
 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
 };
@@ -586,6 +593,9 @@ int sensor_5f1_stream_off(struct v4l2_subdev *subdev)
                goto p_err;
        }
 
+       /* add 1 frame delay for stream off */
+       usleep_range(40000, 40000);
+
 p_err:
        return ret;
 }
index b33ec11b00fbad614ad12ae3bd980b309abed751..550eb048d17b112f1593b8fe5562c081afb3f803 100644 (file)
@@ -78,6 +78,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
@@ -144,6 +145,8 @@ static int sensor_module_6b2_power_setpin(struct device *dev,
        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);
@@ -173,6 +176,20 @@ static int sensor_module_6b2_power_setpin(struct device *dev,
        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;
@@ -188,7 +205,7 @@ static int __init sensor_module_6b2_probe(struct platform_device *pdev)
        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);
 
@@ -242,33 +259,12 @@ static int __init sensor_module_6b2_probe(struct platform_device *pdev)
        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 */
index 3d13e2539280bdefff59b1098f1aea249974d4f4..78fa0839934dbcb651bfff9c98f455898da484bc 100644 (file)
@@ -56,7 +56,7 @@ int sensor_module_register_paf(struct fimc_is_module_enum *module, int ch)
 #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;
        }
@@ -64,7 +64,6 @@ int sensor_module_register_paf(struct fimc_is_module_enum *module, int ch)
        return ret;
 }
 
-
 int sensor_module_unregister_paf(struct fimc_is_module_enum *module)
 {
        int ret = 0;
@@ -79,21 +78,24 @@ int sensor_module_unregister_paf(struct fimc_is_module_enum *module)
                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;
@@ -105,7 +107,7 @@ int sensor_module_s_stream_paf(struct fimc_is_module_enum *module,
                        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;
@@ -115,6 +117,37 @@ int sensor_module_s_stream_paf(struct fimc_is_module_enum *module,
        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;
@@ -126,8 +159,10 @@ int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
        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);
 
@@ -170,6 +205,21 @@ int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
                }
        }
 
+       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) {
@@ -200,6 +250,10 @@ int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
        }
 
        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);
@@ -217,12 +271,31 @@ int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
                }
        }
 
+       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) {
@@ -262,6 +335,19 @@ int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
                }
        }
 
+       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:
@@ -294,16 +380,27 @@ int sensor_module_deinit(struct v4l2_subdev *subdev)
        /* 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
@@ -405,7 +502,13 @@ long sensor_module_ioctl(struct v4l2_subdev *subdev, unsigned int cmd, void *arg
                        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;
@@ -528,6 +631,7 @@ int sensor_module_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
                }
                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)",
@@ -535,6 +639,15 @@ int sensor_module_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
                        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;
@@ -551,6 +664,7 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
        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);
 
@@ -565,8 +679,9 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
 
        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);
@@ -592,7 +707,8 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
        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);
@@ -602,7 +718,8 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
        }
        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);
@@ -610,6 +727,7 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
                }
                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);
@@ -618,6 +736,7 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
                                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)",
@@ -625,7 +744,13 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
                        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) {
@@ -666,6 +791,23 @@ int sensor_module_s_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
                        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;
@@ -700,6 +842,8 @@ int sensor_module_s_ext_ctrls(struct v4l2_subdev *subdev, struct v4l2_ext_contro
        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);
@@ -708,6 +852,12 @@ int sensor_module_s_ext_ctrls(struct v4l2_subdev *subdev, struct v4l2_ext_contro
        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);
 
@@ -731,18 +881,33 @@ int sensor_module_s_ext_ctrls(struct v4l2_subdev *subdev, struct v4l2_ext_contro
 #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;
                                }
                        }
@@ -771,65 +936,109 @@ 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;
@@ -838,8 +1047,16 @@ int sensor_module_s_stream(struct v4l2_subdev *subdev, int enable)
        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;
 }
@@ -898,7 +1115,7 @@ int sensor_module_s_format(struct v4l2_subdev *subdev,
        }
 
        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);
 
@@ -906,6 +1123,9 @@ int sensor_module_s_format(struct v4l2_subdev *subdev,
                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)",
index 6e0bf187cd34ae17930d71562b091c313935f91d..b2c48e287111f47b34b04d83a3cafc21db7f62cc 100644 (file)
@@ -27,7 +27,8 @@ int sensor_module_s_ext_ctrls(struct v4l2_subdev *subdev, struct v4l2_ext_contro
 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,
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-gm1sp.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-gm1sp.c
new file mode 100644 (file)
index 0000000..5904e52
--- /dev/null
@@ -0,0 +1,490 @@
+/*
+ * 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);
index 0566108f31c00145334e57ab83f1204ad5d4a1ab..8fbef7acd6adca41434eec054c593767d3d6eefc 100644 (file)
@@ -77,6 +77,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
 };
index e7a0da6efc40bc12a2a2148c9c1b3f93b9f000f9..01f2323ecc3597580b8b14c9ecf436b7e5ed98a1 100644 (file)
@@ -73,6 +73,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
 };
index e9269d4a0e6c16502d7e1f5a297f707c2964bbf9..114678c393e061ec90fcd2c30c9f22015bcc9048 100644 (file)
@@ -79,6 +79,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
 };
index eabb3144a436e97e0d977fdda7e9a126edfe4322..ba698c111490a1e61f425dd4de1a03c77ca45d9a 100644 (file)
@@ -105,6 +105,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
index 97d3e86be7917299ed09b65bb5a746d436b92eea..32e86a69067d3bb8ae0b6b72a5f97b63db42df94 100644 (file)
@@ -94,6 +94,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 24e202c1589513df5dddf276f2d62f0c17e5c36d..d3fde6e22238581fb1e8f68c06096cb7408be9ed 100644 (file)
@@ -106,6 +106,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
 };
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx576.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx576.c
new file mode 100644 (file)
index 0000000..b16d5da
--- /dev/null
@@ -0,0 +1,488 @@
+/*
+ * 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);
+
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx576.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-imx576.h
new file mode 100644 (file)
index 0000000..7ba6743
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * 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
index a107970bdb9378cf7b9837224bdf371075356b73..0c75242496063462676672453839f6999b8259a0 100644 (file)
@@ -99,6 +99,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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
 };
index 59c2e87faa3eadfa79e0502efc292e8e85d60acd..184378c4e4072f31eca2f5bbeda500036f96626f 100644 (file)
@@ -67,6 +67,7 @@ static const struct v4l2_subdev_core_ops core_ops = {
 };
 
 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,
 };
index 68642e8be00c83b66aae43a8e09bad7db64acb5a..ddd8225b428efc071139b83dee6a246999161395 100644 (file)
@@ -111,6 +111,13 @@ static const struct v4l2_subdev_core_ops core_ops = {
        .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;
@@ -277,6 +284,7 @@ int sensor_virtual_g_max_dgain(struct v4l2_subdev *subdev)
 }
 
 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
 };
index 9be5e1fe7f05b26b5530a731efa34e22a45939bb..84cd5b24fc1f1d3ebb0f46b9293689ce27625c96 100644 (file)
@@ -4,6 +4,14 @@ menuconfig CAMERA_OIS_SELECT
        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
@@ -12,3 +20,11 @@ config CAMERA_OIS_IDG2030_OBJ
         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.
+
index 9f129e8ddc8495cb10dcad587509591e3c372954..ce289f2350c0804ab5e6ded59151ab3db0d731d9 100644 (file)
@@ -2,6 +2,7 @@ obj-$(CONFIG_CAMERA_OIS_SELECT) += fimc-is-helper-ois-i2c.o \
                                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
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/fimc-is-ois-bu24218gwl.c b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/fimc-is-ois-bu24218gwl.c
new file mode 100644 (file)
index 0000000..f02a7c5
--- /dev/null
@@ -0,0 +1,710 @@
+/*
+ * 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);
diff --git a/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/fimc-is-ois-bu24218gwl.h b/drivers/media/platform/exynos/fimc-is2/sensor/module_framework/ois/fimc-is-ois-bu24218gwl.h
new file mode 100644 (file)
index 0000000..d4fc765
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * 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
+
index 792ae5aabaa0db327cbadf1cc3f12b14a8559525..ae11fcec688d64f23a476e1e70b6ab3a15a7f360 100644 (file)
@@ -12,7 +12,7 @@
 #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"
 
index 2d47d32af0435259aa4c5143c5f05f0e3ac137a9..7113bd5c795e05a44ee09ab45a47b23e9a10f04c 100644 (file)
@@ -13,6 +13,8 @@
 #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)
 {
@@ -91,7 +93,7 @@ int pafstat_hw_s_sensor_mode(void __iomem *base_reg, u32 pd_mode)
                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);
@@ -144,13 +146,43 @@ void pafstat_hw_com_s_lic_mode(void __iomem *base_reg, u32 id,
                        &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)
@@ -261,13 +293,94 @@ int pafstat_hw_sw_reset(void __iomem *base_reg)
        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)
@@ -323,6 +436,8 @@ void fimc_is_hw_paf_rdma_config(void __iomem *base_reg, u32 hw_format, u32 bitwi
        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;
@@ -386,4 +501,3 @@ void fimc_is_hw_paf_sfr_dump(void __iomem *base_reg_com, void __iomem *base_reg)
        info("PAFSTAT RDMA SFR DUMP : %p\n", base_reg);
        fimc_is_hw_dump_regs(base_reg, pafstat_rdma_regs, PAFSTAT_RDMA_REG_CNT);
 }
-
index fa86f1391e1002a6c344e809ecf458404ac47aca..a05e2b5c800d33953d557d3ff5474887eb345e92 100644 (file)
@@ -14,7 +14,8 @@
 #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
 };
@@ -59,9 +60,9 @@ enum pafstat_interrupt_map {
 
 /* 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);
@@ -80,7 +81,8 @@ int pafstat_hw_s_sensor_mode(void __iomem *base_reg, u32 pd_mode);
 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);
@@ -88,6 +90,9 @@ void pafstat_hw_com_init(void __iomem *base_reg);
 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,
@@ -97,6 +102,6 @@ void fimc_is_hw_paf_rdma_config(void __iomem *base_reg, u32 hw_format, u32 bitwi
 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
index d8bb7d0471c7c5a25b819e0d58f556b256a92bf0..3f495dd30ddacd7c6c710702fcf70197ed3b0dfb 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * 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;
 
@@ -61,7 +61,7 @@ static void prepare_pafstat_sfr_dump(struct fimc_is_paf *pafstat)
                                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;
 
@@ -90,10 +90,9 @@ void pafstat_sfr_dump(struct fimc_is_paf *pafstat)
 
 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)
@@ -106,7 +105,7 @@ static irqreturn_t fimc_is_isr_pafstat(int irq, void *data)
        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 */
@@ -117,20 +116,10 @@ static irqreturn_t fimc_is_isr_pafstat(int irq, void *data)
 #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);
@@ -167,6 +156,9 @@ static irqreturn_t fimc_is_isr_pafstat(int irq, void *data)
                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)) {
@@ -192,9 +184,130 @@ static irqreturn_t fimc_is_isr_pafstat(int irq, void *data)
        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) {
@@ -204,17 +317,24 @@ int pafstat_set_num_buffers(struct v4l2_subdev *subdev, u32 num_buffers, u32 mip
 
        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) {
@@ -222,30 +342,149 @@ int pafstat_hw_set_regs(struct v4l2_subdev *subdev,
                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;
 
@@ -261,12 +500,14 @@ int pafstat_register(struct fimc_is_module_enum *module, int pafstat_ch)
                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);
@@ -275,7 +516,7 @@ int pafstat_register(struct fimc_is_module_enum *module, int pafstat_ch)
        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);
@@ -297,8 +538,9 @@ int pafstat_unregister(struct fimc_is_module_enum *module)
 {
        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");
@@ -306,27 +548,28 @@ int pafstat_unregister(struct fimc_is_module_enum *module)
                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);
 
@@ -341,19 +584,24 @@ int pafstat_init(struct v4l2_subdev *subdev, u32 val)
        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);
@@ -361,30 +609,19 @@ static int pafstat_s_stream(struct v4l2_subdev *subdev, int pd_mode)
        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;
 }
@@ -400,9 +637,16 @@ static int pafstat_s_format(struct v4l2_subdev *subdev,
 {
        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) {
@@ -417,6 +661,11 @@ static int pafstat_s_format(struct v4l2_subdev *subdev,
        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);
@@ -431,12 +680,37 @@ static int pafstat_s_format(struct v4l2_subdev *subdev,
                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);
 
@@ -447,7 +721,9 @@ p_err:
 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) {
@@ -459,7 +735,8 @@ int fimc_is_pafstat_reset_recovery(struct v4l2_subdev *subdev, u32 reset_mode, i
                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);
        }
 
@@ -485,9 +762,12 @@ static const struct v4l2_subdev_ops subdev_ops = {
        .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,
 };
 
@@ -495,97 +775,99 @@ static int __init pafstat_probe(struct platform_device *pdev)
 {
        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);
@@ -593,36 +875,54 @@ static int __init pafstat_probe(struct platform_device *pdev)
        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);
index bf947e57dff767135d0b81584670035797053dfb..b54907dae75c7ab71477a5073b94e9a8e078f27a 100644 (file)
 #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);
index ac771d815188c083f0639e3281b9c47932a564f7..cd2585f57764b5f4d86b13ed6ccca9c176e0e1d8 100644 (file)
 #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;
 }
index 522b0b5c89746d4d92d13a8532d193083c9a7d34..f1a521c24b33a449bdf5e6776dbd377f7c671bad 100644 (file)
 #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
index ea6b459a208d36250c9999987f291a2646cd8f9c..444d092201d9613fc1831b743a0a6066d690e441 100644 (file)
@@ -1,8 +1,7 @@
 /*
- * 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)
@@ -595,47 +427,45 @@ 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)
@@ -648,16 +478,13 @@ static int pdp_s_format(struct v4l2_subdev *subdev,
        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;
@@ -665,18 +492,6 @@ static int pdp_s_format(struct v4l2_subdev *subdev,
        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;
 }
 
@@ -700,134 +515,127 @@ static const struct v4l2_subdev_ops subdev_ops = {
 };
 
 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);
index cb61861bd8c7546176b53b5edb10e60faaf60c8f..349e12b58e6e4b34b39657025c59a775c5623be4 100644 (file)
 #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
 
index 2fd074d04b3f32bb78407ce5ed0be4710388da0f..d0953610c79b5fdcc287d723a2ea0c1e74c102f6 100644 (file)
 #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;
 };
 
index 7469049e60b3381df60707447fff70c30d2f658c..9b276ec32977c302d483c52e97374075a2875e47 100644 (file)
 #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;
 
@@ -59,12 +62,12 @@ int fimc_is_vender_probe(struct fimc_is_vender *vender)
 
        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;
 
@@ -85,22 +88,22 @@ int fimc_is_vender_dt(struct device_node *np)
        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)
@@ -143,7 +146,7 @@ void fimc_is_vender_resource_put(struct fimc_is_vender *vender)
 }
 
 #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;
@@ -151,46 +154,49 @@ int fimc_is_vender_cal_load(struct fimc_is_vender *vender,
        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;
@@ -198,9 +204,22 @@ int fimc_is_vender_cal_load(struct fimc_is_vender *vender,
                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");
index 81d9e8562eb68aa03c0ceb6ffd1c1cac380576bf..59b7f2e72fa050dc0ae61c97f4b0021798c8c225 100644 (file)
@@ -51,6 +51,7 @@
 #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
index 598882af0d85449d3394c35c0fcadfa53f614d08..5a09da671dca47ae860547934b00485b69d21272 100644 (file)
@@ -188,6 +188,8 @@ enum is_set_stream {
 #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 */
@@ -196,6 +198,8 @@ enum is_fw_boot_mode {
 };
 
 #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)
@@ -218,6 +222,10 @@ enum v4l2_is_hal_version {
        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)
@@ -264,16 +272,24 @@ enum v4l2_cis_frs_command {
        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)